Only send packets via UDP if UDP communication is possible.
When no session key is known for a node, or when it is doing PMTU discovery but no MTU probes have returned yet, packets are sent via TCP. Some logic is added to make sure intermediate nodes continue forwarding via TCP. The per-node packet queue is now no longer necessary and has been removed.
This commit is contained in:
parent
b069da90d6
commit
67df7fb7e1
8 changed files with 27 additions and 42 deletions
|
|
@ -90,6 +90,7 @@ void send_mtu_probe(node_t *n)
|
|||
memset(packet.data, 0, 14);
|
||||
RAND_pseudo_bytes(packet.data + 14, len - 14);
|
||||
packet.len = len;
|
||||
packet.priority = 0;
|
||||
|
||||
ifdebug(TRAFFIC) logger(LOG_INFO, _("Sending MTU probe length %d to %s (%s)"), len, n->name, n->hostname);
|
||||
|
||||
|
|
@ -264,6 +265,8 @@ static void receive_udppacket(node_t *n, vpn_packet_t *inpkt)
|
|||
inpkt = outpkt;
|
||||
}
|
||||
|
||||
inpkt->priority = 0;
|
||||
|
||||
if(n->connection)
|
||||
n->connection->last_ping_time = now;
|
||||
|
||||
|
|
@ -280,6 +283,10 @@ void receive_tcppacket(connection_t *c, char *buffer, int len)
|
|||
cp();
|
||||
|
||||
outpkt.len = len;
|
||||
if(c->options & OPTION_TCPONLY)
|
||||
outpkt.priority = 0;
|
||||
else
|
||||
outpkt.priority = -1;
|
||||
memcpy(outpkt.data, buffer, len);
|
||||
|
||||
receive_packet(c->node, &outpkt);
|
||||
|
|
@ -294,7 +301,6 @@ static void send_udppacket(node_t *n, vpn_packet_t *origpkt)
|
|||
vpn_packet_t *outpkt;
|
||||
int origlen;
|
||||
int outlen, outpad;
|
||||
vpn_packet_t *copy;
|
||||
static int priority = 0;
|
||||
int origpriority;
|
||||
int sock;
|
||||
|
|
@ -305,26 +311,27 @@ static void send_udppacket(node_t *n, vpn_packet_t *origpkt)
|
|||
|
||||
if(!n->status.validkey) {
|
||||
ifdebug(TRAFFIC) logger(LOG_INFO,
|
||||
_("No valid key known yet for %s (%s), queueing packet"),
|
||||
_("No valid key known yet for %s (%s), forwarding via TCP"),
|
||||
n->name, n->hostname);
|
||||
|
||||
/* Since packet is on the stack of handle_tap_input(), we have to make a copy of it first. */
|
||||
|
||||
*(copy = xmalloc(sizeof(*copy))) = *inpkt;
|
||||
|
||||
list_insert_tail(n->queue, copy);
|
||||
|
||||
if(n->queue->count > MAXQUEUELENGTH)
|
||||
list_delete_head(n->queue);
|
||||
|
||||
if(!n->status.waitingforkey)
|
||||
send_req_key(n->nexthop->connection, myself, n);
|
||||
|
||||
n->status.waitingforkey = true;
|
||||
|
||||
send_tcppacket(n->nexthop->connection, origpkt);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if(!n->minmtu && (inpkt->data[12] | inpkt->data[13])) {
|
||||
ifdebug(TRAFFIC) logger(LOG_INFO,
|
||||
_("No minimum MTU established yet for %s (%s), forwarding via TCP"),
|
||||
n->name, n->hostname);
|
||||
|
||||
send_tcppacket(n->nexthop->connection, origpkt);
|
||||
}
|
||||
|
||||
origlen = inpkt->len;
|
||||
origpriority = inpkt->priority;
|
||||
|
||||
|
|
@ -433,13 +440,13 @@ void send_packet(const node_t *n, vpn_packet_t *packet)
|
|||
return;
|
||||
}
|
||||
|
||||
via = (n->via == myself) ? n->nexthop : n->via;
|
||||
via = (packet->priority == -1 || n->via == myself) ? n->nexthop : n->via;
|
||||
|
||||
if(via != n)
|
||||
ifdebug(TRAFFIC) logger(LOG_ERR, _("Sending packet to %s via %s (%s)"),
|
||||
ifdebug(TRAFFIC) logger(LOG_INFO, _("Sending packet to %s via %s (%s)"),
|
||||
n->name, via->name, n->via->hostname);
|
||||
|
||||
if((myself->options | via->options) & OPTION_TCPONLY) {
|
||||
if(packet->priority == -1 || ((myself->options | via->options) & OPTION_TCPONLY)) {
|
||||
if(!send_tcppacket(via->connection, packet))
|
||||
terminate_connection(via->connection, true);
|
||||
} else
|
||||
|
|
@ -469,21 +476,6 @@ void broadcast_packet(const node_t *from, vpn_packet_t *packet)
|
|||
}
|
||||
}
|
||||
|
||||
void flush_queue(node_t *n)
|
||||
{
|
||||
list_node_t *node, *next;
|
||||
|
||||
cp();
|
||||
|
||||
ifdebug(TRAFFIC) logger(LOG_INFO, _("Flushing queue for %s (%s)"), n->name, n->hostname);
|
||||
|
||||
for(node = n->queue->head; node; node = next) {
|
||||
next = node->next;
|
||||
send_udppacket(n, node->data);
|
||||
list_delete_node(n->queue, node);
|
||||
}
|
||||
}
|
||||
|
||||
void handle_incoming_vpn_data(int sock)
|
||||
{
|
||||
vpn_packet_t pkt;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue