return false;
}
+ /* Check if we have the headers we need */
+ if(routing_mode != RMODE_ROUTER && !(type & PKT_MAC)) {
+ logger(DEBUG_TRAFFIC, LOG_ERR, "Received packet from %s (%s) without MAC header (maybe Mode is not set correctly)", from->name, from->hostname);
+ return false;
+ } else if(routing_mode == RMODE_ROUTER && (type & PKT_MAC)) {
+ logger(DEBUG_TRAFFIC, LOG_WARNING, "Received packet from %s (%s) with MAC header (maybe Mode is not set correctly)", from->name, from->hostname);
+ }
+
int offset = (type & PKT_MAC) ? 0 : 14;
if(type & PKT_COMPRESSED) {
len = uncompress_packet(inpkt.data + offset, (const uint8_t *)data, len, from->incompression);
inpkt.len = len + offset;
}
+ /* Generate the Ethernet packet type if necessary */
+ if(offset) {
+ switch(inpkt.data[14] >> 4) {
+ case 4:
+ inpkt.data[12] = 0x08;
+ inpkt.data[13] = 0x00;
+ break;
+ case 6:
+ inpkt.data[12] = 0x86;
+ inpkt.data[13] = 0xDD;
+ break;
+ default:
+ logger(DEBUG_TRAFFIC, LOG_ERR,
+ "Unknown IP version %d while reading packet from %s (%s)",
+ inpkt.data[14] >> 4, from->name, from->hostname);
+ return false;
+ }
+ }
+
receive_packet(from, &inpkt);
return true;
}
if(from != myself)
break;
- for(node = node_udp_tree->head; node; node = node->next) {
+ for(node = node_tree->head; node; node = node->next) {
n = node->data;
if(n->status.reachable && ((n->via == myself && n->nexthop == n) || n->via == n))
for(node = edge_weight_tree->head; node; node = node->next) {
e = node->data;
- if(e->to == myself)
+ if(!e->to->status.reachable || e->to == myself)
continue;
if(sockaddrcmp_noport(from, &e->address)) {
void handle_incoming_vpn_data(int sock, short events, void *data) {
vpn_packet_t pkt;
char *hostname;
- sockaddr_t from;
+ sockaddr_t from = {{0}};
socklen_t fromlen = sizeof from;
node_t *n;
int len;