X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnet_packet.c;h=7e567e99c058c24dd01ae31bcca8eb93005ebeaa;hb=f5843e7d649f4a7f72cb3fd356bc935457aa492f;hp=7be466201eae816acca0d52ab3fd6ddcff545f92;hpb=886a6f61a1f4cc48a77b42d10f34f9126377d904;p=tinc diff --git a/src/net_packet.c b/src/net_packet.c index 7be46620..7e567e99 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -1,7 +1,7 @@ /* net_packet.c -- Handles in- and outgoing VPN packets Copyright (C) 1998-2005 Ivo Timmermans, - 2000-2010 Guus Sliepen + 2000-2011 Guus Sliepen 2010 Timothy Redaelli 2010 Brandon Black @@ -87,16 +87,21 @@ static void send_mtu_probe_handler(int fd, short events, void *data) { } if(n->mtuprobes > 32) { + if(!n->minmtu) { + n->mtuprobes = 31; + timeout = pinginterval; + goto end; + } + ifdebug(TRAFFIC) logger(LOG_INFO, "%s (%s) did not respond to UDP ping, restarting PMTU discovery", n->name, n->hostname); n->mtuprobes = 1; n->minmtu = 0; n->maxmtu = MTU; } - if(n->mtuprobes >= 10 && !n->minmtu) { + if(n->mtuprobes >= 10 && n->mtuprobes < 32 && !n->minmtu) { ifdebug(TRAFFIC) logger(LOG_INFO, "No response to MTU probes from %s (%s)", n->name, n->hostname); - n->mtuprobes = 0; - return; + n->mtuprobes = 31; } if(n->mtuprobes == 30 || (n->mtuprobes < 30 && n->minmtu >= n->maxmtu)) { @@ -152,12 +157,17 @@ void mtu_probe_h(node_t *n, vpn_packet_t *packet, length_t len) { packet->data[0] = 1; send_udppacket(n, packet); } else { + if(n->mtuprobes > 30) { + if(n->minmtu) + n->mtuprobes = 30; + else + n->mtuprobes = 1; + } + if(len > n->maxmtu) len = n->maxmtu; if(n->minmtu < len) n->minmtu = len; - if(n->mtuprobes > 30) - n->mtuprobes = 30; } } @@ -226,6 +236,9 @@ static void receive_packet(node_t *n, vpn_packet_t *packet) { ifdebug(TRAFFIC) logger(LOG_DEBUG, "Received packet of %d bytes from %s (%s)", packet->len, n->name, n->hostname); + n->in_packets++; + n->in_bytes += packet->len; + route(n, packet); } @@ -492,12 +505,14 @@ end: /* send a packet to the given vpn ip. */ -void send_packet(const node_t *n, vpn_packet_t *packet) { +void send_packet(node_t *n, vpn_packet_t *packet) { node_t *via; if(n == myself) { if(overwrite_mac) memcpy(packet->data, mymac.x, ETH_ALEN); + n->out_packets++; + n->out_bytes += packet->len; write_packet(packet); return; } @@ -511,6 +526,9 @@ void send_packet(const node_t *n, vpn_packet_t *packet) { return; } + n->out_packets++; + n->out_bytes += packet->len; + via = (packet->priority == -1 || n->via == myself) ? n->nexthop : n->via; if(via != n) @@ -552,7 +570,9 @@ void broadcast_packet(const node_t *from, vpn_packet_t *packet) { static node_t *try_harder(const sockaddr_t *from, const vpn_packet_t *pkt) { splay_node_t *node; - node_t *n, *found = NULL; + edge_t *e; + node_t *n = NULL; + bool hard = false; static time_t last_hard_try = 0; time_t now = time(NULL); @@ -561,19 +581,29 @@ static node_t *try_harder(const sockaddr_t *from, const vpn_packet_t *pkt) { else last_hard_try = now; - for(node = node_tree->head; node; node = node->next) { - n = node->data; + for(node = edge_weight_tree->head; node; node = node->next) { + e = node->data; - if(n == myself || !n->status.reachable || !digest_active(&n->indigest)) + if(e->to == myself) continue; - if(try_mac(n, pkt)) { - found = n; - break; + if(sockaddrcmp_noport(from, &e->address)) { + if(last_hard_try == now) + continue; + hard = true; } + + if(!try_mac(e->to, pkt)) + continue; + + n = e->to; + break; } - return found; + if(hard) + last_hard_try = now; + + return n; } void handle_incoming_vpn_data(int sock, short events, void *data) { @@ -618,6 +648,9 @@ void handle_incoming_vpn_data(int sock, short events, void *data) { void handle_device_data(int sock, short events, void *data) { vpn_packet_t packet; - if(read_packet(&packet)) + if(read_packet(&packet)) { + myself->in_packets++; + myself->in_bytes += packet.len; route(myself, &packet); + } }