/*
net_packet.c -- Handles in- and outgoing VPN packets
Copyright (C) 1998-2005 Ivo Timmermans,
- 2000-2013 Guus Sliepen <guus@tinc-vpn.org>
+ 2000-2014 Guus Sliepen <guus@tinc-vpn.org>
2010 Timothy Redaelli <timothy@redaelli.eu>
2010 Brandon Black <blblack@gmail.com>
}
return false;
}
- if(!sptps_receive_data(&n->sptps, ((sptps_packet_t *)&inpkt)->data, inpkt->len)) {
+ if(!sptps_receive_data(&n->sptps, ((sptps_packet_t *)inpkt)->data, inpkt->len)) {
logger(DEBUG_TRAFFIC, LOG_ERR, "Got bad packet from %s (%s)", n->name, n->hostname);
return false;
}
node_t *from, *to;
bool direct = false;
- int len = recvfrom(ls->udp.fd, &pkt.dstid, MAXSIZE, 0, &addr.sa, &addrlen);
+ int len = recvfrom(ls->udp.fd, &pkt.seqno, MAXSIZE, 0, &addr.sa, &addrlen);
if(len <= 0 || len > MAXSIZE) {
if(!sockwouldblock(sockerrno))
if(!n) {
// It might be from a 1.1 node, which might have a source ID in the packet.
- from = lookup_node_id(&pkt.srcid);
- if(from && !memcmp(&pkt.dstid, &nullid, sizeof nullid) && from->status.sptps) {
- if(sptps_verify_datagram(&n->sptps, pkt.data, pkt.len))
+ from = lookup_node_id(&spkt->srcid);
+ if(from && !memcmp(&spkt->dstid, &nullid, sizeof nullid) && from->status.sptps) {
+ if(sptps_verify_datagram(&from->sptps, spkt->data, spkt->len - sizeof(spkt->srcid) - sizeof(spkt->dstid)))
n = from;
else
goto skip_harder;
}
if(n->status.sptps) {
- if(memcmp(&pkt.dstid, &nullid, sizeof nullid)) {
+ if(!memcmp(&spkt->dstid, &nullid, sizeof nullid)) {
direct = true;
from = n;
to = myself;
} else {
- from = lookup_node_id(&pkt.srcid);
- to = lookup_node_id(&pkt.dstid);
+ from = lookup_node_id(&spkt->srcid);
+ to = lookup_node_id(&spkt->dstid);
}
if(!from || !to) {
logger(DEBUG_PROTOCOL, LOG_WARNING, "Received UDP packet from %s (%s) with unknown source and/or destination ID", n->name, n->hostname);
return;
}
+
+ spkt->len -= sizeof spkt->dstid + sizeof spkt->srcid;
if(to != myself) {
- send_sptps_data_priv(to, n, 0, pkt.data, pkt.len);
+ send_sptps_data_priv(to, n, 0, spkt->data, spkt->len);
return;
}
} else {