More cleanup of tunnel/gateway code
authorHenning Rogge <hrogge@googlemail.com>
Mon, 25 Jan 2010 20:36:08 +0000 (21:36 +0100)
committerHenning Rogge <hrogge@googlemail.com>
Mon, 25 Jan 2010 20:36:08 +0000 (21:36 +0100)
src/build_msg.c
src/cfgparser/olsrd_conf.c
src/gateway.c
src/gateway.h
src/hna_set.c
src/ipcalc.c
src/ipcalc.h

index b495b32..baa8db8 100644 (file)
@@ -1048,7 +1048,7 @@ serialize_hna4(struct interface *ifp)
 #endif
 
     olsr_prefix_to_netmask(&ip_addr, h->net.prefix_len);
-    if (olsr_cnf->smart_gw_active && ip_is_inetgw_prefix(&h->net.prefix, h->net.prefix_len)) {
+    if (olsr_cnf->smart_gw_active && ip_is_inetgw_prefix(&h->net)) {
       /* this is the default route, overwrite it with the smart gateway */
       olsr_modifiy_inetgw_netmask(&ip_addr, h->net.prefix_len);
     }
@@ -1140,7 +1140,7 @@ serialize_hna6(struct interface *ifp)
     OLSR_PRINTF(BMSG_DBGLVL, "\tNet: %s\n", olsr_ip_prefix_to_string(&h->net));
 #endif
     olsr_prefix_to_netmask(&tmp_netmask, h->net.prefix_len);
-    if (olsr_cnf->smart_gw_active && ip_is_inetgw_prefix(&h->net.prefix, h->net.prefix_len)) {
+    if (olsr_cnf->smart_gw_active && ip_is_inetgw_prefix(&h->net)) {
       /* this is the default gateway, so overwrite it with the smart one */
       olsr_modifiy_inetgw_netmask(&tmp_netmask, h->net.prefix_len);
     }
index 09509db..a2e097f 100644 (file)
@@ -815,14 +815,8 @@ static void update_has_gateway_fields(void) {
   olsr_cnf->has_ipv6_gateway = false;
 
   for (h = olsr_cnf->hna_entries; h != NULL; h = h->next) {
-    if (h->net.prefix_len == 0) {
-      olsr_cnf->has_ipv4_gateway = true;
-      olsr_cnf->has_ipv6_gateway = olsr_cnf->ip_version == AF_INET6;
-      return;
-    }
-    if (ip_prefix_is_mappedv4_gw(&h->net)) {
-      olsr_cnf->has_ipv4_gateway = true;
-    }
+    olsr_cnf->has_ipv4_gateway |= ip_prefix_is_v4_gw(&h->net) || ip_prefix_is_mappedv4_gw(&h->net);
+    olsr_cnf->has_ipv6_gateway |= ip_prefix_is_v6_gw(&h->net);
   }
 }
 
index 2a0197d..2576f1a 100644 (file)
@@ -145,14 +145,14 @@ olsr_delete_gateway(union olsr_ip_addr *originator) {
   }
 }
 
-bool olsr_is_smart_gateway(union olsr_ip_addr *net, union olsr_ip_addr *mask, int prefixlen) {
+bool olsr_is_smart_gateway(struct olsr_ip_prefix *prefix, union olsr_ip_addr *mask) {
   uint8_t *ptr;
 
-  if (!ip_is_inetgw_prefix(net, prefixlen)) {
+  if (!ip_is_inetgw_prefix(prefix)) {
     return false;
   }
 
-  ptr = ((uint8_t *)mask) + ((prefixlen+7)/8);
+  ptr = ((uint8_t *)mask) + ((prefix->prefix_len+7)/8);
   return ptr[GW_HNA_PAD] == 0 && ptr[GW_HNA_FLAGS] != 0;
 }
 
@@ -170,7 +170,7 @@ void olsr_modifiy_inetgw_netmask(union olsr_ip_addr *mask, int prefixlen) {
   if (olsr_cnf->has_ipv6_gateway) {
     ptr[GW_HNA_FLAGS] |= GW_HNA_FLAG_IPV6;
   }
-  if (!olsr_cnf->has_ipv6_gateway || prefixlen > 0){
+  if (!olsr_cnf->has_ipv6_gateway || prefixlen != ipv6_internet_route.prefix_len){
     ptr[GW_HNA_FLAGS] &= ~GW_HNA_FLAG_IPV6PREFIX;
   }
 }
@@ -184,12 +184,16 @@ olsr_print_gateway(void) {
 
   OLSR_PRINTF(0, "\n--- %s ---------------------------------------------------- GATEWAYS\n\n",
       olsr_wallclock_string());
-  OLSR_PRINTF(0, "%-*s %-5s %-9s %-9s %s\n", addrsize, "IP address", "IPv6", "Uplink", "Downlink",
+  OLSR_PRINTF(0, "%-*s %-6s %-9s %-9s %s\n", addrsize, "IP address", "Type", "Uplink", "Downlink",
       olsr_cnf->ip_version == AF_INET ? "" : "External Prefix");
 
   OLSR_FOR_ALL_GATEWAY_ENTRIES(gw) {
-    OLSR_PRINTF(0, "%-*s %-5s %-9u %-9u %s\n", addrsize, olsr_ip_to_string(&buf, &gw->originator),
-        gw->ipv6 ? "true" : "false",
+    OLSR_PRINTF(0, "%-*s %s%c%s%c%c %-9u %-9u %s\n", addrsize, olsr_ip_to_string(&buf, &gw->originator),
+        gw->ipv4nat ? "" : "   ",
+        gw->ipv4 ? '4' : ' ',
+        gw->ipv4nat ? "(N)" : "",
+        (gw->ipv4 && gw->ipv6) ? ',' : ' ',
+        gw->ipv6 ? '6' : ' ',
         gw->uplink, gw->downlink,
         gw->external_prefix.prefix_len == 0 ? "" : olsr_ip_prefix_to_string(&gw->external_prefix));
   } OLSR_FOR_ALL_GATEWAY_ENTRIES_END(gw)
index 7e56876..c39d3c0 100644 (file)
@@ -58,7 +58,7 @@ void olsr_init_gateways(void);
 struct gateway_entry *olsr_find_gateway(union olsr_ip_addr *originator);
 void olsr_set_gateway(union olsr_ip_addr *originator, union olsr_ip_addr *mask, int prefixlen);
 void olsr_delete_gateway(union olsr_ip_addr *originator);
-bool olsr_is_smart_gateway(union olsr_ip_addr *net, union olsr_ip_addr *mask, int prefixlen);
+bool olsr_is_smart_gateway(struct olsr_ip_prefix *prefix, union olsr_ip_addr *net);
 void olsr_print_gateway(void);
 void olsr_modifiy_inetgw_netmask(union olsr_ip_addr *mask, int prefixlen);
 #endif /* GATEWAY_H_ */
index 6f5d19b..7f5df3c 100644 (file)
@@ -436,29 +436,30 @@ olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((un
     return false;
   }
   while (curr < curr_end) {
-    union olsr_ip_addr net, mask;
-    uint8_t prefixlen;
+    struct olsr_ip_prefix prefix;
+    union olsr_ip_addr mask;
+
     struct ip_prefix_list *entry;
     struct interface *ifs;
     bool stop = false;
 
-    pkt_get_ipaddress(&curr, &net);
+    pkt_get_ipaddress(&curr, &prefix.prefix);
     pkt_get_ipaddress(&curr, &mask);
-    prefixlen = olsr_netmask_to_prefix(&mask);
+    prefix.prefix_len = olsr_netmask_to_prefix(&mask);
 
-    if (olsr_cnf->smart_gw_active && olsr_is_smart_gateway(&net, &mask, prefixlen)) {
-      olsr_set_gateway(&originator, &mask, prefixlen);
+    if (olsr_cnf->smart_gw_active && olsr_is_smart_gateway(&prefix, &mask)) {
+      olsr_set_gateway(&originator, &mask, prefix.prefix_len);
     }
 
-    if (olsr_cnf->smart_gw_active && prefixlen > 0 && prefixlen <= MAXIMUM_GATEWAY_PREFIX_LENGTH) {
+    if (olsr_cnf->smart_gw_active && prefix.prefix_len > 0 && prefix.prefix_len <= MAXIMUM_GATEWAY_PREFIX_LENGTH) {
       continue;
     }
 
 #ifndef NO_DUPLICATE_DETECTION_HANDLER
     for (ifs = ifnet; ifs != NULL; ifs = ifs->int_next) {
-      if (ipequal(&ifs->ip_addr, &net)) {
+      if (ipequal(&ifs->ip_addr, &prefix.prefix)) {
       /* ignore your own main IP as an incoming MID */
-        olsr_handle_hna_collision(&net, &originator);
+        olsr_handle_hna_collision(&prefix.prefix, &originator);
         stop = true;
         break;
       }
@@ -467,10 +468,10 @@ olsr_input_hna(union olsr_message *m, struct interface *in_if __attribute__ ((un
       continue;
     }
 #endif
-    entry = ip_prefix_list_find(olsr_cnf->hna_entries, &net, prefixlen);
+    entry = ip_prefix_list_find(olsr_cnf->hna_entries, &prefix.prefix, prefix.prefix_len);
     if (entry == NULL) {
       /* only update if it's not from us */
-      olsr_update_hna_entry(&originator, &net, prefixlen, vtime);
+      olsr_update_hna_entry(&originator, &prefix.prefix, prefix.prefix_len, vtime);
     }
   }
   /* Forward the message */
index df4d83b..b4d8445 100644 (file)
@@ -211,17 +211,14 @@ ip_in_net(const union olsr_ip_addr *ipaddr, const struct olsr_ip_prefix *net)
   return rv;
 }
 
-bool ip_is_inetgw_prefix(union olsr_ip_addr *net, int prefixlen) {
-  if (olsr_cnf->ip_version == AF_INET6 && prefixlen == ipv6_internet_route.prefix_len) {
-    return memcmp(&ipv6_internet_route.prefix, net, olsr_cnf->ipsize) == 0;
+bool ip_is_inetgw_prefix(struct olsr_ip_prefix *prefix) {
+  if (ip_prefix_is_v4_gw(prefix)) {
+    return true;
   }
-  if (olsr_cnf->ip_version == AF_INET6 && prefixlen == mapped_v4_gw.prefix_len) {
-    return memcmp(&mapped_v4_gw.prefix, net, olsr_cnf->ipsize) == 0;
+  if (ip_prefix_is_v6_gw(prefix)) {
+    return true;
   }
-  if (olsr_cnf->ip_version == AF_INET && prefixlen == 0) {
-    return memcmp(&in6addr_any, net, olsr_cnf->ipsize) == 0;
-  }
-  return false;
+  return ip_prefix_is_mappedv4_gw(prefix);
 }
 
 /*
index f7e347f..cf3faf2 100644 (file)
@@ -49,7 +49,7 @@
 #include <arpa/inet.h>
 #include <netinet/in.h>
 
-extern const struct olsr_ip_prefix  mapped_v4_gw;
+extern const struct olsr_ip_prefix mapped_v4_gw;
 extern const struct olsr_ip_prefix ipv6_internet_route;
 
 struct ipaddr_str {
@@ -186,7 +186,17 @@ ip_prefix_is_mappedv4_gw(struct olsr_ip_prefix *prefix) {
   return olsr_cnf->ip_version == AF_INET6 && memcmp(prefix, &mapped_v4_gw, sizeof(struct olsr_ip_prefix)) == 0;
 }
 
-extern bool ip_is_inetgw_prefix(union olsr_ip_addr *net, int prefixlen);
+static INLINE bool
+ip_prefix_is_v4_gw(struct olsr_ip_prefix *prefix) {
+  return olsr_cnf->ip_version == AF_INET && prefix->prefix_len == 0 && prefix->prefix.v4.s_addr == 0;
+}
+
+static INLINE bool
+ip_prefix_is_v6_gw(struct olsr_ip_prefix *prefix) {
+  return olsr_cnf->ip_version == AF_INET6 && memcmp(prefix, &ipv6_internet_route, sizeof(struct olsr_ip_prefix)) == 0;
+}
+
+extern bool ip_is_inetgw_prefix(struct olsr_ip_prefix *prefix);
 
 #endif