X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet_packet.c;h=f7d8640300a6bc5065b572e0828446e9b3cb7c0a;hb=3fba80174dbe29bcfe0d121a2a1d2e61be5ee57b;hp=7e617a613f5b8b6c1d09ceb71a3a533423f4c3a4;hpb=1fe8ba2f06c39d7c8b81f0e451bdbac94ae9375f;p=meshlink diff --git a/src/net_packet.c b/src/net_packet.c index 7e617a61..f7d86403 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -81,7 +81,6 @@ static void send_mtu_probe_handler(int fd, short events, void *data) { if(!n->status.reachable || !n->status.validkey) { ifdebug(TRAFFIC) logger(LOG_INFO, "Trying to send MTU probe to unreachable or rekeying node %s (%s)", n->name, n->hostname); n->mtuprobes = 0; - event_del(&n->mtuevent); return; } @@ -382,7 +381,6 @@ static void send_udppacket(node_t *n, vpn_packet_t *origpkt) { static int priority = 0; int origpriority = origpkt->priority; #endif - int sock; if(!n->status.reachable) { ifdebug(TRAFFIC) logger(LOG_INFO, "Trying to send UDP packet to unreachable node %s (%s)", n->name, n->hostname); @@ -464,26 +462,28 @@ static void send_udppacket(node_t *n, vpn_packet_t *origpkt) { /* Determine which socket we have to use */ - for(sock = 0; sock < listen_sockets; sock++) - if(n->address.sa.sa_family == listen_socket[sock].sa.sa.sa_family) - break; - - if(sock >= listen_sockets) - sock = 0; /* If none is available, just use the first and hope for the best. */ + if(n->address.sa.sa_family != listen_socket[n->sock].sa.sa.sa_family) { + for(int sock = 0; sock < listen_sockets; sock++) { + if(n->address.sa.sa_family == listen_socket[sock].sa.sa.sa_family) { + n->sock = sock; + break; + } + } + } /* Send the packet */ #if defined(SOL_IP) && defined(IP_TOS) if(priorityinheritance && origpriority != priority - && listen_socket[sock].sa.sa.sa_family == AF_INET) { + && listen_socket[n->sock].sa.sa.sa_family == AF_INET) { priority = origpriority; ifdebug(TRAFFIC) logger(LOG_DEBUG, "Setting outgoing packet priority to %d", priority); - if(setsockopt(listen_socket[sock].udp, SOL_IP, IP_TOS, &priority, sizeof priority)) /* SO_PRIORITY doesn't seem to work */ + if(setsockopt(listen_socket[n->sock].udp, SOL_IP, IP_TOS, &priority, sizeof(priority))) /* SO_PRIORITY doesn't seem to work */ logger(LOG_ERR, "System call `%s' failed: %s", "setsockopt", strerror(errno)); } #endif - if(sendto(listen_socket[sock].udp, (char *) &inpkt->seqno, inpkt->len, 0, &(n->address.sa), SALEN(n->address.sa)) < 0 && !sockwouldblock(sockerrno)) { + if(sendto(listen_socket[n->sock].udp, (char *) &inpkt->seqno, inpkt->len, 0, &(n->address.sa), SALEN(n->address.sa)) < 0 && !sockwouldblock(sockerrno)) { if(sockmsgsize(sockerrno)) { if(n->maxmtu >= origlen) n->maxmtu = origlen - 1; @@ -508,7 +508,7 @@ void send_packet(node_t *n, vpn_packet_t *packet) { memcpy(packet->data, mymac.x, ETH_ALEN); n->out_packets++; n->out_bytes += packet->len; - write_packet(packet); + devops.write(packet); return; } @@ -571,11 +571,6 @@ static node_t *try_harder(const sockaddr_t *from, const vpn_packet_t *pkt) { static time_t last_hard_try = 0; time_t now = time(NULL); - if(last_hard_try == now) - return NULL; - else - last_hard_try = now; - for(node = edge_weight_tree->head; node; node = node->next) { e = node->data; @@ -637,6 +632,8 @@ void handle_incoming_vpn_data(int sock, short events, void *data) { return; } + n->sock = (intptr_t)data; + receive_udppacket(n, &pkt); } @@ -645,7 +642,7 @@ void handle_device_data(int sock, short events, void *data) { packet.priority = 0; - if(read_packet(&packet)) { + if(devops.read(&packet)) { myself->in_packets++; myself->in_bytes += packet.len; route(myself, &packet);