Bugfixes for IPv6 smartgw tunnel
authorHenning Rogge <hrogge@googlemail.com>
Mon, 15 Feb 2010 09:47:52 +0000 (10:47 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Mon, 15 Feb 2010 09:47:52 +0000 (10:47 +0100)
src/gateway.c
src/gateway_default_handler.c
src/linux/kernel_tunnel.c
src/linux/net.c

index 86ece35..a04192a 100644 (file)
@@ -218,7 +218,7 @@ olsr_set_inet_gateway(union olsr_ip_addr *originator, bool ipv4, bool ipv6, bool
       olsr_if_set_state(v4gw_tunnel, true);
 
       v4gw_index = if_nametoindex(v4gw_tunnel);
-      fprintf(stderr, "add tunnel: %s %d\n", v4gw_tunnel, v4gw_index);
+fprintf(stderr, "add tunnel: %s %d\n", v4gw_tunnel, v4gw_index);
       olsr_os_inetgw_tunnel_route(v4gw_index, true, true);
     }
     else {
@@ -233,7 +233,8 @@ olsr_set_inet_gateway(union olsr_ip_addr *originator, bool ipv4, bool ipv6, bool
       olsr_if_set_state(v6gw_tunnel, true);
 
       v6gw_index = if_nametoindex(v6gw_tunnel);
-      olsr_os_inetgw_tunnel_route(v4gw_index, false, true);
+fprintf(stderr, "add tunnel6: %s %d\n", v6gw_tunnel, v6gw_index);
+      olsr_os_inetgw_tunnel_route(v6gw_index, false, true);
     }
     else {
       olsr_os_change_ipip_tunnel(v6gw_tunnel, &current_ipv6_gw->originator, false);
index 562f74b..8461222 100644 (file)
@@ -57,9 +57,11 @@ static void gw_default_choose_gateway(void) {
 
     if (!gw_def_finished_ipv4 && gw->ipv4 && gw->ipv4nat == olsr_cnf->smart_gw_allow_nat && tc->path_cost < cost_ipv4) {
       inet_ipv4 = gw;
+      cost_ipv4 = tc->path_cost;
     }
     if (!gw_def_finished_ipv6 && gw->ipv6 && tc->path_cost < cost_ipv6) {
       inet_ipv6 = gw;
+      cost_ipv6 = tc->path_cost;
     }
   } OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw)
 
@@ -112,6 +114,11 @@ static void gw_default_startup_handler(void) {
   /* get new ipv6 GW if we use OLSRv6 */
   gw_def_finished_ipv6 = olsr_cnf->ip_version == AF_INET;
 
+  /* keep in mind we might be a gateway ourself */
+  gw_def_finished_ipv4 |= olsr_cnf->has_ipv4_gateway;
+  gw_def_finished_ipv6 |= olsr_cnf->has_ipv6_gateway;
+
+  /* start gateway selection timer */
   olsr_set_timer(&gw_def_timer, GW_DEFAULT_TIMER_INTERVAL, 0, true, &gw_default_timer, NULL, 0);
 }
 
index 0a815c3..cf3ebec 100644 (file)
@@ -69,7 +69,6 @@ int olsr_os_init_iptunnel(void) {
   const char *dev = olsr_cnf->ip_version == AF_INET ? DEV_IPV4_TUNNEL : DEV_IPV6_TUNNEL;
 
   store_iptunnel_state = olsr_if_isup(dev);
-fprintf(stderr, "device %s was %s\n", dev, store_iptunnel_state ? "up" : "down");
   if (store_iptunnel_state) {
     return 0;
   }
@@ -78,7 +77,6 @@ fprintf(stderr, "device %s was %s\n", dev, store_iptunnel_state ? "up" : "down")
 
 void olsr_os_cleanup_iptunnel(void) {
   if (!store_iptunnel_state) {
-fprintf(stderr, "ifdown: %s\n", olsr_cnf->ip_version == AF_INET ? DEV_IPV4_TUNNEL : DEV_IPV6_TUNNEL);
     olsr_if_set_state(olsr_cnf->ip_version == AF_INET ? DEV_IPV4_TUNNEL : DEV_IPV6_TUNNEL, false);
   }
 }
@@ -106,7 +104,7 @@ static int os_ip4_tunnel(const char *name, in_addr_t *target, uint32_t cmd)
   int err;
   struct ip_tunnel_parm p;
 
-  /* no IPIP tunnel if OLSR runs with IPv6 */
+  /* only IPIP tunnel if OLSR runs with IPv6 */
   assert (olsr_cnf->ip_version == AF_INET);
   memset(&p, 0, sizeof(p));
   p.iph.version = 4;
@@ -134,10 +132,10 @@ static int os_ip6_tunnel(const char *name, struct in6_addr *target, uint32_t cmd
   int err;
   struct ip6_tnl_parm p;
 
-  /* no IPIP tunnel if OLSR runs with IPv6 */
+  /* only IP6 tunnel if OLSR runs with IPv6 */
   assert (olsr_cnf->ip_version == AF_INET6);
   memset(&p, 0, sizeof(p));
-  p.proto = proto; //  ? IPPROTO_IPV6 : IPPROTO_IPIP;
+  p.proto = proto;
   if (target) {
     p.raddr = *target;
   }
index e6c0c28..bc7447d 100644 (file)
@@ -765,7 +765,8 @@ bool olsr_if_isup(const char * dev)
   strscpy(ifr.ifr_name, dev, IFNAMSIZ);
 
   if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) {
-    perror("ioctl SIOCGIFFLAGS (get flags)");
+    OLSR_PRINTF(1, "ioctl SIOCGIFFLAGS (get flags) error on device %s: %s (%d)\n",
+        dev, strerror(errno), errno);
     return 1;
   }
   return (ifr.ifr_flags & IFF_UP) != 0;
@@ -779,7 +780,8 @@ int olsr_if_set_state(const char *dev, bool up) {
   strscpy(ifr.ifr_name, dev, IFNAMSIZ);
 
   if (ioctl(olsr_cnf->ioctl_s, SIOCGIFFLAGS, &ifr) < 0) {
-    perror("ioctl SIOCGIFFLAGS (get flags)");
+    OLSR_PRINTF(1, "ioctl SIOCGIFFLAGS (get flags) error on device %s: %s (%d)\n",
+        dev, strerror(errno), errno);
     return 1;
   }
 
@@ -797,7 +799,8 @@ int olsr_if_set_state(const char *dev, bool up) {
   }
 
   if (ioctl(olsr_cnf->ioctl_s, SIOCSIFFLAGS, &ifr) < 0) {
-    perror("ioctl SIOCSIFFLAGS (set flags)");
+    OLSR_PRINTF(1, "ioctl SIOCSIFFLAGS (set flags %s) error on device %s: %s (%d)\n",
+        up ? "up" : "down", dev, strerror(errno), errno);
     return 1;
   }
   return 0;
@@ -829,7 +832,9 @@ int olsr_if_setip(const char *dev, union olsr_ip_addr *ip, int ip_version) {
   }
 
   if (ioctl(olsr_cnf->ioctl_s, SIOCSIFADDR, &ifr) < 0) {
-    perror("ioctl SIOCSIFADDR (set addr)");
+    struct ipaddr_str buf;
+    OLSR_PRINTF(1, "ioctl SIOCSIFADDR (set addr %s) on device %s error: %s (%d)\n",
+        inet_ntop(ip_version, &ifr.ifr_addr, buf.buf, sizeof(buf)), dev, strerror(errno), errno);
     return 1;
   }
   return 0;