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);
inpkt = outpkt;
}
+ inpkt->priority = 0;
+
if(n->connection)
n->connection->last_ping_time = now;
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);
vpn_packet_t *outpkt;
int origlen;
int outlen, outpad;
- vpn_packet_t *copy;
static int priority = 0;
int origpriority;
int sock;
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;
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
}
}
-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;
if(!checklength(source, packet, ether_size + ip_size))
return;
- if(((packet->data[30] & 0xf0) == 0xe0) ||
+ if(((packet->data[30] & 0xf0) == 0xe0) || (
packet->data[30] == 255 &&
packet->data[31] == 255 &&
packet->data[32] == 255 &&
- packet->data[33] == 255)
+ packet->data[33] == 255))
broadcast_packet(source, packet);
else
route_ipv4_unicast(source, packet);