/*
route.c -- routing
- Copyright (C) 2000,2001 Ivo Timmermans <itimmermans@bigfoot.com>,
- 2000,2001 Guus Sliepen <guus@sliepen.warande.net>
+ Copyright (C) 2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>,
+ 2000-2002 Guus Sliepen <guus@sliepen.warande.net>
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
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id: route.c,v 1.1.2.21 2001/11/16 17:40:50 zarq Exp $
+ $Id: route.c,v 1.1.2.24 2002/02/20 16:04:59 guus Exp $
*/
#include "config.h"
-#ifdef HAVE_FREEBSD
+#if defined(HAVE_FREEBSD) || defined(HAVE_OPENBSD)
#include <sys/param.h>
#endif
#include <sys/socket.h>
#include <netinet/in.h>
-#ifdef HAVE_SOLARIS
+#if defined(HAVE_SOLARIS) || defined(HAVE_OPENBSD)
#include <net/if.h>
#define ETHER_ADDR_LEN 6
#else
if(!subnet || subnet->owner!=myself)
{
if(debug_lvl >= DEBUG_TRAFFIC)
- syslog(LOG_INFO, _("Learned new MAC address %hhx:%hhx:%hhx:%hhx:%hhx:%hhx"),
+ syslog(LOG_INFO, _("Learned new MAC address %hx:%hx:%hx:%hx:%hx:%hx"),
address->x[0], address->x[1], address->x[2], address->x[3], address->x[4], address->x[5]);
subnet = new_subnet();
return NULL;
}
+node_t *route_ipv4(vpn_packet_t *packet)
+{
+ subnet_t *subnet;
+cp
+ subnet = lookup_subnet_ipv4((ipv4_t *)&packet->data[30]);
+cp
if(!subnet)
{
if(debug_lvl >= DEBUG_TRAFFIC)
{
+ syslog(LOG_WARNING, _("Cannot route packet: unknown IPv4 destination address %d.%d.%d.%d"),
+ packet->data[30], packet->data[31], packet->data[32], packet->data[33]);
}
return NULL;
return subnet->owner;
}
-node_t *route_ip(vpn_packet_t *packet)
+node_t *route_ipv6(vpn_packet_t *packet)
{
- struct addrinfo *dest;
subnet_t *subnet;
cp
-#warning FIXME
- memcpy(&dest, &packet->data[30], 0);
-
- subnet = lookup_subnet_ip(&dest);
+ subnet = lookup_subnet_ipv6((ipv6_t *)&packet->data[38]);
cp
if(!subnet)
{
if(debug_lvl >= DEBUG_TRAFFIC)
{
- syslog(LOG_WARNING, _("Cannot route packet: unknown IP destination address"));
+ syslog(LOG_WARNING, _("Cannot route packet: unknown IPv6 destination address %hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx"),
+ ntohs(*(short unsigned int *)&packet->data[38]),
+ ntohs(*(short unsigned int *)&packet->data[40]),
+ ntohs(*(short unsigned int *)&packet->data[42]),
+ ntohs(*(short unsigned int *)&packet->data[44]),
+ ntohs(*(short unsigned int *)&packet->data[46]),
+ ntohs(*(short unsigned int *)&packet->data[48]),
+ ntohs(*(short unsigned int *)&packet->data[50]),
+ ntohs(*(short unsigned int *)&packet->data[52]));
}
return NULL;
struct ether_arp *arp;
subnet_t *subnet;
unsigned char ipbuf[4];
- struct addrinfo *dest;
cp
/* First, snatch the source address from the ARP packet */
}
/* Check if the IP address exists on the VPN */
-#warning FIXME
- dest = ntohl(*((unsigned long*)(arp->arp_tpa)));
- subnet = lookup_subnet_ip(&dest);
+
+ subnet = lookup_subnet_ipv4((ipv4_t *)arp->arp_tpa);
if(!subnet)
{
switch(routing_mode)
{
case RMODE_ROUTER:
- memcpy(packet->data, mymac.net.mac.address.x, 6); /* Override destination address to make the kernel accept it */
- write_packet(packet);
+ {
+ node_t *n;
+
+ n = route_ipv4(packet);
+
+ if(n)
+ {
+ if(n == myself)
+ {
+ memcpy(packet->data, mymac.net.mac.address.x, 6);
+ write_packet(packet);
+ }
+ else
+ send_packet(n, packet);
+ }
+ }
break;
case RMODE_SWITCH:
{