Always add originator-ip to tunnel start/endpoint
authorHenning Rogge <hrogge@googlemail.com>
Tue, 27 Apr 2010 15:44:37 +0000 (17:44 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Tue, 27 Apr 2010 15:44:37 +0000 (17:44 +0200)
src/bsd/dummy.c
src/gateway.c
src/kernel_routes.h
src/linux/kernel_routes_nl.c
src/linux/kernel_tunnel.c
src/win32/dummy.c

index eb8222d..1d8f1ae 100644 (file)
@@ -64,3 +64,8 @@ int olsr_os_localhost_if(union olsr_ip_addr *ip __attribute__ ((unused)),
     bool create __attribute__ ((unused))) {
   return -1;
 }
+
+int olsr_os_ifip(int ifindex __attribute__ ((unused)),
+    union olsr_ip_addr *ip __attribute__ ((unused)), bool create __attribute__ ((unused))) {
+  return -1;
+}
index 49aaa85..eab8785 100644 (file)
@@ -85,10 +85,16 @@ static void smartgw_tunnel_monitor (int if_index,
   if (current_ipv4_gw != NULL && if_index == v4gw_tunnel->if_index && flag == IFCHG_IF_ADD) {
     /* v4 tunnel up again, set route */
     olsr_os_inetgw_tunnel_route(v4gw_tunnel->if_index, true, true);
+
+    /* and ip */
+    olsr_os_ifip(v4gw_tunnel->if_index, &olsr_cnf->main_addr, true);
   }
   if (current_ipv6_gw != NULL && if_index == v6gw_tunnel->if_index && flag == IFCHG_IF_ADD) {
     /* v6 status changed, set route */
     olsr_os_inetgw_tunnel_route(v6gw_tunnel->if_index, false, true);
+
+    /* and ip */
+    olsr_os_ifip(v6gw_tunnel->if_index, &olsr_cnf->main_addr, true);
   }
 }
 
index bd56cc2..ddf1314 100644 (file)
@@ -63,6 +63,7 @@ void olsr_os_inetgw_tunnel_route(uint32_t if_idx, bool ipv4, bool set);
 
 int olsr_os_policy_rule(int family, int rttable, uint32_t priority, const char *if_name, bool set);
 int olsr_os_localhost_if(union olsr_ip_addr *ip, bool create);
+int olsr_os_ifip(int ifindex, union olsr_ip_addr *ip, bool create);
 
 #endif
 
index 9ecc341..c71aa10 100644 (file)
@@ -303,11 +303,10 @@ int olsr_os_policy_rule(int family, int rttable, uint32_t priority, const char *
   return err;
 }
 
-int
-olsr_os_localhost_if(union olsr_ip_addr *ip, bool create)
+static int
+olsr_add_ip(int ifindex, union olsr_ip_addr *ip, const char *l, bool create)
 {
   struct olsr_ipadd_req req;
-  static char l[] = "lo:olsr";
 
   memset(&req, 0, sizeof(req));
 
@@ -321,16 +320,29 @@ olsr_os_localhost_if(union olsr_ip_addr *ip, bool create)
   }
   req.ifa.ifa_family = olsr_cnf->ip_version;
 
-  olsr_netlink_addreq(&req.n, sizeof(req), IFA_LABEL, l, strlen(l) + 1);
   olsr_netlink_addreq(&req.n, sizeof(req), IFA_LOCAL, ip, olsr_cnf->ipsize);
+  if (l) {
+    olsr_netlink_addreq(&req.n, sizeof(req), IFA_LABEL, l, strlen(l) + 1);
+  }
 
   req.ifa.ifa_prefixlen = olsr_cnf->ipsize * 8;
 
-  req.ifa.ifa_index = if_nametoindex("lo");
+  req.ifa.ifa_index = ifindex;
 
   return olsr_netlink_send(&req.n);
 }
 
+int
+olsr_os_localhost_if(union olsr_ip_addr *ip, bool create)
+{
+  static char l[] = "lo:olsr";
+  return olsr_add_ip(if_nametoindex("lo"), ip, l, create);
+}
+
+int olsr_os_ifip(int ifindex, union olsr_ip_addr *ip, bool create) {
+  return olsr_add_ip(ifindex, ip, NULL, create);
+}
+
 static int olsr_new_netlink_route(int family, int rttable, int if_index, int metric, int protocol,
     const union olsr_ip_addr *src, const union olsr_ip_addr *gw, const struct olsr_ip_prefix *dst,
     bool set, bool del_similar) {
index 4c5c9fc..cb5efbc 100644 (file)
@@ -40,6 +40,7 @@
  */
 
 #include "kernel_tunnel.h"
+#include "kernel_routes.h"
 #include "log.h"
 #include "olsr_types.h"
 #include "net_os.h"
@@ -84,7 +85,11 @@ int olsr_os_init_iptunnel(void) {
   if (store_iptunnel_state) {
     return 0;
   }
-  return olsr_if_set_state(dev, true);
+  if (olsr_if_set_state(dev, true)) {
+    return -1;
+  }
+
+  return olsr_os_ifip(if_nametoindex(dev), &olsr_cnf->main_addr, true);
 }
 
 void olsr_os_cleanup_iptunnel(void) {
@@ -246,6 +251,9 @@ fprintf(stderr, "Cannot create tunnel %s to %s\n", name, olsr_ip_to_string(&buf,
       return NULL;
     }
 
+    /* set originator IP for tunnel */
+    olsr_os_ifip(if_idx, &olsr_cnf->main_addr, true);
+
     t = olsr_cookie_malloc(tunnel_cookie);
     memcpy(&t->target, target, sizeof(*target));
     t->node.key = &t->target;
index 0ae43a6..d305565 100644 (file)
@@ -58,3 +58,8 @@ int olsr_os_localhost_if(union olsr_ip_addr *ip __attribute__ ((unused)),
     bool create __attribute__ ((unused))) {
   return -1;
 }
+
+int olsr_os_ifip(int ifindex __attribute__ ((unused)),
+    union olsr_ip_addr *ip __attribute__ ((unused)), bool create __attribute__ ((unused))) {
+  return -1;
+}