mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Tunnel reinit support + Fixed packets recv through tunnel
This commit is contained in:
parent
d287bafa15
commit
374e75932f
11 changed files with 177 additions and 80 deletions
|
@ -76,32 +76,43 @@ size_t AdnlNetworkManagerImpl::add_listening_udp_port(td::uint16 port) {
|
|||
return idx;
|
||||
}
|
||||
|
||||
size_t AdnlNetworkManagerImpl::add_tunnel_udp_port(td::uint16 port, td::Promise<td::IPAddress> on_ready) {
|
||||
auto it = port_2_socket_.find(port);
|
||||
#define TUNNEL_FAKE_PORT 1
|
||||
|
||||
size_t AdnlNetworkManagerImpl::add_tunnel_udp_port(std::string global_config, std::string tunnel_config, td::Promise<td::IPAddress> on_ready,
|
||||
td::actor::Scheduler *scheduler) {
|
||||
auto it = port_2_socket_.find(TUNNEL_FAKE_PORT);
|
||||
if (it != port_2_socket_.end()) {
|
||||
return it->second;
|
||||
}
|
||||
class Callback : public td::UdpServer::Callback {
|
||||
class Callback : public td::UdpServer::TunnelCallback {
|
||||
public:
|
||||
Callback(td::actor::ActorShared<AdnlNetworkManagerImpl> manager, size_t idx)
|
||||
: manager_(std::move(manager)), idx_(idx) {
|
||||
Callback(td::actor::ActorShared<AdnlNetworkManagerImpl> manager, size_t idx, td::actor::Scheduler *scheduler, TunnelEventsHandler* tunnel_events_handler)
|
||||
: manager_(std::move(manager)), idx_(idx), scheduler_(scheduler), tunnel_events_handler_(tunnel_events_handler) {
|
||||
}
|
||||
|
||||
private:
|
||||
TunnelEventsHandler* tunnel_events_handler_;
|
||||
td::actor::ActorShared<AdnlNetworkManagerImpl> manager_;
|
||||
size_t idx_;
|
||||
td::actor::Scheduler *scheduler_;
|
||||
void on_udp_message(td::UdpMessage udp_message) override {
|
||||
td::actor::send_closure_later(manager_, &AdnlNetworkManagerImpl::receive_udp_message, std::move(udp_message),
|
||||
idx_);
|
||||
scheduler_->run_in_context_external([&] {
|
||||
td::actor::send_closure_later(manager_, &AdnlNetworkManagerImpl::receive_udp_message, std::move(udp_message),
|
||||
idx_);
|
||||
});
|
||||
}
|
||||
void on_in_addr_update(const td::IPAddress ip) override {
|
||||
tunnel_events_handler_->on_in_addr_update(ip);
|
||||
}
|
||||
};
|
||||
|
||||
auto idx = udp_sockets_.size();
|
||||
auto X = td::UdpServer::create_via_tunnel("udp tunnel server", port,
|
||||
std::make_unique<Callback>(actor_shared(this), idx), std::move(on_ready));
|
||||
auto X = td::UdpServer::create_via_tunnel("udp tunnel server", global_config, tunnel_config,
|
||||
std::make_unique<Callback>(actor_shared(this), idx, scheduler, tunnel_events_handler_.get()),
|
||||
std::move(on_ready));
|
||||
X.ensure();
|
||||
port_2_socket_[port] = idx;
|
||||
udp_sockets_.push_back(UdpSocketDesc{port, X.move_as_ok()});
|
||||
port_2_socket_[TUNNEL_FAKE_PORT] = idx;
|
||||
udp_sockets_.push_back(UdpSocketDesc{TUNNEL_FAKE_PORT, X.move_as_ok()});
|
||||
return idx;
|
||||
}
|
||||
|
||||
|
@ -121,12 +132,12 @@ void AdnlNetworkManagerImpl::add_self_addr(td::IPAddress addr, AdnlCategoryMask
|
|||
out_desc_[priority].push_back(std::move(d));
|
||||
}
|
||||
|
||||
void AdnlNetworkManagerImpl::add_tunnel(td::uint16 port, AdnlCategoryMask cat_mask, td::uint32 priority,
|
||||
td::Promise<td::IPAddress> on_ready) {
|
||||
size_t idx = add_tunnel_udp_port(port, std::move(on_ready));
|
||||
void AdnlNetworkManagerImpl::add_tunnel(std::string global_config, std::string tunnel_config, AdnlCategoryMask cat_mask, td::uint32 priority,
|
||||
td::Promise<td::IPAddress> on_ready, td::actor::Scheduler *scheduler) {
|
||||
size_t idx = add_tunnel_udp_port(global_config, tunnel_config, std::move(on_ready), scheduler);
|
||||
|
||||
add_in_addr(InDesc{port, nullptr, cat_mask}, idx);
|
||||
auto d = OutDesc{port, td::IPAddress{}, nullptr, idx};
|
||||
add_in_addr(InDesc{TUNNEL_FAKE_PORT, nullptr, cat_mask}, idx);
|
||||
auto d = OutDesc{TUNNEL_FAKE_PORT, td::IPAddress{}, nullptr, idx};
|
||||
for (auto &it : out_desc_[priority]) {
|
||||
if (it == d) {
|
||||
it.cat_mask |= cat_mask;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue