gateway: let the gateway code determine the tunnel name
authorFerry Huberts <ferry.huberts@pelagic.nl>
Tue, 4 Dec 2012 09:50:35 +0000 (10:50 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 13 Dec 2012 12:22:55 +0000 (13:22 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
Reviewed-by: Henning Rogge <hrogge@googlemail.com>
src/bsd/dummy.c
src/gateway.c
src/kernel_tunnel.h
src/linux/kernel_tunnel.c
src/win32/dummy.c

index e619362..3ce9e80 100644 (file)
@@ -23,7 +23,7 @@ void olsr_os_cleanup_iptunnel(const char * name __attribute__((unused))) {
 }
 
 struct olsr_iptunnel_entry *olsr_os_add_ipip_tunnel(union olsr_ip_addr *target __attribute__ ((unused)),
-    bool transportV4 __attribute__ ((unused))) {
+    bool transportV4 __attribute__ ((unused)), char *name) {
   return NULL;
 }
 
index cf099df..5138cbe 100644 (file)
@@ -118,6 +118,18 @@ static uint8_t serialize_gw_speed(uint32_t speed) {
   return ((speed - 1) << 3) | exp;
 }
 
+/**
+ * Dummy for generating an interface name for an olsr ipip tunnel
+ * @param target IP destination of the tunnel
+ * @param name pointer to output buffer (length IFNAMSIZ)
+ */
+static void generate_iptunnel_name(union olsr_ip_addr *target, char * name) {
+  static uint32_t counter = 0;
+
+  memset(name, 0, IFNAMSIZ);
+  snprintf(name, IFNAMSIZ, "tnl_%08x", olsr_cnf->ip_version == AF_INET ? target->v4.s_addr : ++counter);
+}
+
 /*
  * Callback Functions
  */
@@ -612,7 +624,11 @@ bool olsr_set_inet_gateway(union olsr_ip_addr *originator, uint64_t path_cost, b
       current_ipv4_gw = olsr_gw_list_update(&gw_list_ipv4, new_gw_in_list, path_cost);
     } else {
       /* new gw is not yet in the gw list */
-      struct olsr_iptunnel_entry *new_v4gw_tunnel = olsr_os_add_ipip_tunnel(&new_gw->originator, true);
+      char name[IFNAMSIZ];
+      struct olsr_iptunnel_entry *new_v4gw_tunnel;
+
+      generate_iptunnel_name(&new_gw->originator, name);
+      new_v4gw_tunnel = olsr_os_add_ipip_tunnel(&new_gw->originator, true, name);
       if (new_v4gw_tunnel) {
         olsr_os_inetgw_tunnel_route(new_v4gw_tunnel->if_index, true, true, NULL);
 
@@ -653,7 +669,11 @@ bool olsr_set_inet_gateway(union olsr_ip_addr *originator, uint64_t path_cost, b
       current_ipv6_gw = olsr_gw_list_update(&gw_list_ipv6, new_gw_in_list, path_cost);
     } else {
       /* new gw is not yet in the gw list */
-         struct olsr_iptunnel_entry *new_v6gw_tunnel = olsr_os_add_ipip_tunnel(&new_gw->originator, false);
+      char name[IFNAMSIZ];
+      struct olsr_iptunnel_entry *new_v6gw_tunnel;
+
+      generate_iptunnel_name(&new_gw->originator, name);
+      new_v6gw_tunnel = olsr_os_add_ipip_tunnel(&new_gw->originator, false, name);
       if (new_v6gw_tunnel) {
         olsr_os_inetgw_tunnel_route(new_v6gw_tunnel->if_index, false, true, NULL);
 
index 691191f..5603a76 100644 (file)
@@ -35,7 +35,7 @@ struct olsr_iptunnel_entry {
 int olsr_os_init_iptunnel(const char * name);
 void olsr_os_cleanup_iptunnel(const char * name);
 
-struct olsr_iptunnel_entry *olsr_os_add_ipip_tunnel(union olsr_ip_addr *target, bool transportV4);
+struct olsr_iptunnel_entry *olsr_os_add_ipip_tunnel(union olsr_ip_addr *target, bool transportV4, char *name);
 void olsr_os_del_ipip_tunnel(struct olsr_iptunnel_entry *);
 
 #endif /* KERNEL_TUNNEL_H_ */
index 4c63372..f860cc3 100644 (file)
@@ -183,38 +183,22 @@ static int os_ip_tunnel(const char *name, void *target) {
 }
 
 /**
- * Dummy for generating an interface name for an olsr ipip tunnel
- * @param target IP destination of the tunnel
- * @param name pointer to output buffer (length IFNAMSIZ)
- */
-static void generate_iptunnel_name(union olsr_ip_addr *target, char *name) {
-  static char PREFIX[] = "tnl_";
-  static uint32_t counter = 0;
-
-  snprintf(name, IFNAMSIZ, "%s%08x", PREFIX,
-      olsr_cnf->ip_version == AF_INET ? target->v4.s_addr : ++counter);
-}
-
-/**
  * demands an ipip tunnel to a certain target. If no tunnel exists it will be created
  * @param target ip address of the target
  * @param transportV4 true if IPv4 traffic is used, false for IPv6 traffic
+ * @param name pointer to name string buffer (length IFNAMSIZ)
  * @return NULL if an error happened, pointer to olsr_iptunnel_entry otherwise
  */
-struct olsr_iptunnel_entry *olsr_os_add_ipip_tunnel(union olsr_ip_addr *target, bool transportV4 __attribute__ ((unused))) {
+struct olsr_iptunnel_entry *olsr_os_add_ipip_tunnel(union olsr_ip_addr *target, bool transportV4 __attribute__ ((unused)), char *name) {
   struct olsr_iptunnel_entry *t;
 
   assert(olsr_cnf->ip_version == AF_INET6 || transportV4);
 
   t = (struct olsr_iptunnel_entry *)avl_find(&tunnel_tree, target);
   if (t == NULL) {
-    char name[IFNAMSIZ];
     int if_idx;
     struct ipaddr_str buf;
 
-    memset(name, 0, sizeof(name));
-    generate_iptunnel_name(target, name);
-
     if_idx = os_ip_tunnel(name, (olsr_cnf->ip_version == AF_INET) ? (void *) &target->v4.s_addr : (void *) &target->v6);
     if (if_idx == 0) {
       // cannot create tunnel
index 3b655a6..bbf3ed9 100644 (file)
@@ -20,7 +20,7 @@ void olsr_os_cleanup_iptunnel(const char * name __attribute__((unused))) {
 }
 
 struct olsr_iptunnel_entry *olsr_os_add_ipip_tunnel(union olsr_ip_addr *target __attribute__ ((unused)),
-    bool transportV4 __attribute__ ((unused))) {
+    bool transportV4 __attribute__ ((unused)), char *name __attribute__ ((unused))) {
   return NULL;
 }