X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Froute.c;h=cffb7d25ab491cf6c31590e6570a826de75afc1c;hb=22f930e7c6352a1b43b1605799925e10fced254a;hp=fabb90ff54f9626ee1bd196a93b8edf3516f25ea;hpb=a86faaf34711d6b0f278b670d70a229a3cf0d479;p=meshlink diff --git a/src/route.c b/src/route.c index fabb90ff..cffb7d25 100644 --- a/src/route.c +++ b/src/route.c @@ -1,7 +1,6 @@ /* route.c -- routing - Copyright (C) 2000-2005 Ivo Timmermans, - 2000-2013 Guus Sliepen + Copyright (C) 2014 Guus Sliepen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,6 +23,7 @@ #include "net.h" #include "route.h" #include "utils.h" +#include "libmeshlink.h" rmode_t routing_mode = RMODE_ROUTER; fmode_t forwarding_mode = FMODE_INTERNAL; @@ -32,7 +32,6 @@ bool decrement_ttl = false; bool directonly = false; bool priorityinheritance = false; int macexpire = 600; -bool overwrite_mac = false; mac_t mymac = {{0xFE, 0xFD, 0, 0, 0, 0}}; bool pcap = false; @@ -60,6 +59,50 @@ static bool checklength(node_t *source, vpn_packet_t *packet, length_t length) { return true; } -void route(node_t *source, vpn_packet_t *packet) { - // TODO: route on name or key +void route(node_t *source,vpn_packet_t *packet) { + // TODO: route on name or key + + node_t* owner = NULL; + node_t* via = NULL; + tincpackethdr* hdr = (tincpackethdr*)packet->data; + owner = lookup_node(hdr->destination); + logger(DEBUG_TRAFFIC, LOG_WARNING, "Routing packet from: %s . To: %s \n",hdr->source,hdr->destination); + + //Check Lenght + if(!checklength(source, packet, (sizeof(tincpackethdr)))) + return; + + if (owner == NULL) { + //Lookup failed + logger(DEBUG_TRAFFIC, LOG_WARNING, "Cant lookup the owner of a packet in the route() function. This should never happen \n"); + logger(DEBUG_TRAFFIC, LOG_WARNING, "Destination was: %s \n",hdr->destination); + return; + } + + if (owner == myself ) { + //TODO: implement sending received data from meshlink library to the application + logger(DEBUG_TRAFFIC, LOG_WARNING, "I received a packet for me with payload: %s \n", packet->data + 46); + (recv_callback)(packet->data + 46); + return; + } + + if(!owner->status.reachable) { + //TODO: check what to do here, not just print a warning + logger(DEBUG_TRAFFIC, LOG_WARNING, "The owner of a packet in the route() function is unreachable. Dropping packet. \n"); + return; + } + + via = (owner->via == myself) ? owner->nexthop : owner->via; + if(via == source) { + logger(DEBUG_TRAFFIC, LOG_ERR, "Routing loop for packet from %s (%s)!", source->name, source->hostname); + return; + } + + if (directonly && owner!=via) { + logger(DEBUG_TRAFFIC, LOG_WARNING, "Direct Only is requested. Dropping packet because direct connection not available \n"); + return; + } + + send_packet(owner,packet); + return; }