From: Felix Fietkau Date: Fri, 28 Feb 2025 15:10:04 +0000 (+0100) Subject: pex: create pex host from update responses X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=12e6cf7f63e1aae1bc746f929de4e4c6298d4279;p=project%2Funetd.git pex: create pex host from update responses When a host responds to a broadcast update request, responses might be overlapping. If the responses to the broadcast request can't be processed properly, ensure that a unicast request to each responder is also attempted. This increases the update reliability. Signed-off-by: Felix Fietkau --- diff --git a/pex.c b/pex.c index 8fb9c3c..cfd238f 100644 --- a/pex.c +++ b/pex.c @@ -1015,6 +1015,9 @@ global_pex_recv(void *msg, size_t msg_len, struct sockaddr_in6 *addr) void *data; int addr_len; int ep_idx = ENDPOINT_TYPE_ENDPOINT_NOTIFY; + union network_endpoint host_ep = { + .in6 = *addr + }; if (stun_msg_is_valid(msg, msg_len)) { avl_for_each_element(&networks, net, node) @@ -1055,6 +1058,9 @@ global_pex_recv(void *msg, size_t msg_len, struct sockaddr_in6 *addr) addr); break; case PEX_MSG_UPDATE_RESPONSE: + if (net->pex.num_hosts < NETWORK_PEX_HOSTS_LIMIT) + network_pex_create_host(net, &host_ep, 20); + fallthrough; case PEX_MSG_UPDATE_RESPONSE_DATA: case PEX_MSG_UPDATE_RESPONSE_NO_DATA: network_pex_recv_update_response(net, data, hdr->len, addr, hdr->opcode); @@ -1077,9 +1083,6 @@ global_pex_recv(void *msg, size_t msg_len, struct sockaddr_in6 *addr) memcpy(&peer->state.next_endpoint[ep_idx], addr, sizeof(*addr)); if (hdr->opcode == PEX_MSG_ENDPOINT_PORT_NOTIFY) { struct pex_endpoint_port_notify *port = data; - union network_endpoint host_ep = { - .in6 = *addr - }; peer->state.next_endpoint[ep_idx].in.sin_port = port->port; if (net->pex.num_hosts < NETWORK_PEX_HOSTS_LIMIT)