From fef29d0193afc7e0a9dc766ef75b79cd4dc6fa37 Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Mon, 18 May 2015 20:48:45 +0100 Subject: [PATCH] Don't parse node IDs if the sending node doesn't support them. Currently, tinc tries to parse node IDs for all SPTPS packets, including ones sent from older, pre-node-IDs tinc-1.1 nodes, and therefore doesn't recognize packets from these nodes. This commit fixes that. It also makes code slightly clearer by reducing the amount of fiddling around packet offset/length. --- src/net_packet.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/net_packet.c b/src/net_packet.c index e169e2cd..4c060453 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -282,9 +282,8 @@ static bool receive_udppacket(node_t *n, vpn_packet_t *inpkt) { } return false; } - inpkt->offset += 2 * sizeof(node_id_t); n->status.udppacket = true; - bool result = sptps_receive_data(&n->sptps, DATA(inpkt), inpkt->len - 2 * sizeof(node_id_t)); + bool result = sptps_receive_data(&n->sptps, DATA(inpkt), inpkt->len); n->status.udppacket = false; if(!result) { @@ -1440,10 +1439,16 @@ skip_harder: return; } + pkt.offset = 0; + if(n->status.sptps) { - pkt.offset = 2 * sizeof(node_id_t); + bool relay_enabled = (n->options >> 24) >= 4; + if (relay_enabled) { + pkt.offset = 2 * sizeof(node_id_t); + pkt.len -= pkt.offset; + } - if(!memcmp(DSTID(&pkt), &nullid, sizeof nullid)) { + if(!memcmp(DSTID(&pkt), &nullid, sizeof nullid) || !relay_enabled) { direct = true; from = n; to = myself; @@ -1468,7 +1473,7 @@ skip_harder: /* If we're not the final recipient, relay the packet. */ if(to != myself) { - send_sptps_data(to, from, 0, DATA(&pkt), pkt.len - 2 * sizeof(node_id_t)); + send_sptps_data(to, from, 0, DATA(&pkt), pkt.len); try_tx_sptps(to, true); return; } @@ -1477,7 +1482,6 @@ skip_harder: from = n; } - pkt.offset = 0; if(!receive_udppacket(from, &pkt)) return; -- 2.20.1