20 #include <hicn/util/ip_address.h>
23 #ifndef ASIO_STANDALONE
24 #define ASIO_STANDALONE 1
27 #include <asio/steady_timer.hpp>
30 #include <unordered_map>
34 typedef std::function<void(uint32_t,
bool)> SetRouteCallback;
38 std::string remote_addr;
40 std::string route_addr;
44 using RouteInfoPtr = std::shared_ptr<route_info_t>;
49 : external_ioservice_(io_service),
50 work_(std::make_unique<asio::io_service::work>(internal_ioservice_)),
52 thread_(std::make_unique<std::thread>(
53 [
this]() { internal_ioservice_.run(); })),
54 check_routes_timer_(
nullptr),
55 pending_add_route_counter_(0),
61 int connectToForwarder();
63 void removeConnectedUserNow(uint32_t route_id);
68 void scheduleRemoveConnectedUser(uint32_t route_id);
70 template <
typename Callback>
71 void createFaceAndRoute(RouteInfoPtr &&route_info, Callback &&callback) {
72 internal_ioservice_.post([
this, _route_info = std::move(route_info),
73 _callback = std::forward<Callback>(callback)]() {
74 pending_add_route_counter_++;
76 auto timer =
new asio::steady_timer(internal_ioservice_);
77 internalCreateFaceAndRoute(std::move(_route_info), max_try, timer,
78 std::move(_callback));
82 int32_t getMainListenerPort();
87 void internalRemoveConnectedUser(uint32_t route_id);
89 void internalCreateFaceAndRoute(RouteInfoPtr route_info, uint8_t max_try,
90 asio::steady_timer *timer,
91 SetRouteCallback callback);
95 asio::io_service &external_ioservice_;
96 asio::io_service internal_ioservice_;
97 std::unique_ptr<asio::io_service::work> work_;
99 std::unique_ptr<std::thread> thread_;
100 std::unordered_map<uint32_t, RouteInfoPtr> route_status_;
101 std::unique_ptr<asio::steady_timer> check_routes_timer_;
102 uint32_t pending_add_route_counter_;