gateway: reorder functions
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 18 Jul 2012 13:53:19 +0000 (15:53 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 25 Jul 2012 06:55:06 +0000 (08:55 +0200)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
src/gateway.c

index 2c23eea..a66dabf 100644 (file)
@@ -35,6 +35,10 @@ static struct olsr_gw_handler *gw_handler;
 static struct olsr_iptunnel_entry *v4gw_tunnel, *v6gw_tunnel;
 static bool v4gw_choosen_external, v6gw_choosen_external;
 
+/*
+ * Helper Functions
+ */
+
 /**
  * Reconstructs an uplink/downlink speed value from the encoded
  * 1 byte transport value (3 bit mantissa, 5 bit exponent)
@@ -116,6 +120,45 @@ static void refresh_smartgw_netmask(void) {
 }
 
 /**
+ * Triggers an instant gateway selection based on the current data
+ * @param ipv4 trigger a ipv4 gateway lookup
+ * @param ipv6 trigger a ipv6 gateway lookup
+ * @return 0 if successful, -1 otherwise
+ */
+static int
+olsr_trigger_inetgw_selection(bool ipv4, bool ipv6) {
+  gw_handler->select_gateway(ipv4, ipv6);
+  return ((ipv4 && current_ipv4_gw == NULL) || (ipv6 && current_ipv6_gw == NULL)) ? -1 : 0;
+}
+
+/**
+ * @param originator
+ * @return gateway_entry for corresponding router
+ */
+static struct gateway_entry *
+olsr_find_gateway_entry(union olsr_ip_addr *originator) {
+  struct avl_node *node = avl_find(&gateway_tree, originator);
+
+  return node == NULL ? NULL : node2gateway(node);
+}
+
+static void cleanup_gateway_handler(void *ptr) {
+  struct gateway_entry *gw = ptr;
+
+  if (gw->ipv4 || gw->ipv6) {
+    return;
+  }
+
+  /* remove gateway entry */
+  avl_delete(&gateway_tree, &gw->node);
+  olsr_cookie_free(gw_mem_cookie, gw);
+}
+
+/*
+ * Exported Functions
+ */
+
+/**
  * Initialize gateway system
  */
 int
@@ -171,18 +214,6 @@ olsr_trigger_inetgw_startup(void) {
 }
 
 /**
- * Triggers an instant gateway selection based on the current data
- * @param ipv4 trigger a ipv4 gateway lookup
- * @param ipv6 trigger a ipv6 gateway lookup
- * @return 0 if successful, -1 otherwise
- */
-static int
-olsr_trigger_inetgw_selection(bool ipv4, bool ipv6) {
-  gw_handler->select_gateway(ipv4, ipv6);
-  return ((ipv4 && current_ipv4_gw == NULL) || (ipv6 && current_ipv6_gw == NULL)) ? -1 : 0;
-}
-
-/**
  * Triggers a check if the one of the gateways have been lost
  * through ETX = infinity
  */
@@ -205,124 +236,6 @@ void olsr_trigger_gatewayloss_check(void) {
     olsr_trigger_inetgw_selection(ipv4, ipv6);
   }
 }
-/**
- * Set a new gateway handler. Do only call this once during startup from
- * a plugin to overwrite the default handler.
- * @param h pointer to gateway handler struct
- */
-void
-olsr_set_inetgw_handler(struct olsr_gw_handler *h) {
-  gw_handler = h;
-}
-
-/**
- * @param originator
- * @return gateway_entry for corresponding router
- */
-static struct gateway_entry *
-olsr_find_gateway_entry(union olsr_ip_addr *originator) {
-  struct avl_node *node = avl_find(&gateway_tree, originator);
-
-  return node == NULL ? NULL : node2gateway(node);
-}
-
-/**
- * Sets a new internet gateway.
- * An external set command might trigger an internal one if
- * address is not a legal gateway.
- *
- * @param originator ip address of the node with the new gateway
- * @param ipv4 set ipv4 gateway
- * @param ipv6 set ipv6 gateway
- * @param external true if change was triggered directly by an user,
- *   false if triggered by automatic lookup.
- * @return true if an error happened, false otherwise
- */
-bool
-olsr_set_inet_gateway(union olsr_ip_addr *originator, bool ipv4, bool ipv6, bool external) {
-  struct gateway_entry *entry, *oldV4, *oldV6;
-  struct olsr_iptunnel_entry *tunnelV4, *tunnelV6;
-
-  oldV4 = current_ipv4_gw;
-  oldV6 = current_ipv6_gw;
-  tunnelV4 = v4gw_tunnel;
-  tunnelV6 = v6gw_tunnel;
-
-  ipv4 = ipv4 && (olsr_cnf->ip_version == AF_INET || olsr_cnf->use_niit);
-  ipv6 = ipv6 && (olsr_cnf->ip_version == AF_INET6);
-
-  if (ipv4) {
-    current_ipv4_gw = NULL;
-  }
-  if (ipv6) {
-    current_ipv6_gw = NULL;
-  }
-
-  entry = olsr_find_gateway_entry(originator);
-  if (entry != NULL) {
-    if (ipv4 && entry != current_ipv4_gw && entry->ipv4
-        && (!entry->ipv4nat || olsr_cnf->smart_gw_allow_nat)) {
-      /* valid ipv4 gateway */
-      current_ipv4_gw = entry;
-    }
-    if (ipv6 && entry != current_ipv6_gw && entry->ipv6) {
-      /* valid ipv6 gateway */
-      current_ipv6_gw = entry;
-    }
-  }
-
-  /* handle IPv4 */
-  if (oldV4 != current_ipv4_gw) {
-    if ((v4gw_tunnel = olsr_os_add_ipip_tunnel(&current_ipv4_gw->originator, true)) != NULL) {
-      olsr_os_inetgw_tunnel_route(v4gw_tunnel->if_index, true, true);
-      v4gw_choosen_external = external;
-    }
-    else {
-      // TODO: what to do now ? Choose another one ? Fire up a timer ?
-      current_ipv4_gw = NULL;
-    }
-    if (oldV4 != NULL) {
-      olsr_os_del_ipip_tunnel(tunnelV4);
-    }
-  }
-  /* handle IPv6 */
-  if (oldV6 != current_ipv6_gw) {
-    if ((v6gw_tunnel = olsr_os_add_ipip_tunnel(&current_ipv6_gw->originator, false)) != NULL) {
-      olsr_os_inetgw_tunnel_route(v6gw_tunnel->if_index, false, true);
-      v6gw_choosen_external = external;
-    }
-    else {
-      // TODO: what to do now ? Choose another one ? Fire up a timer ?
-      current_ipv6_gw = NULL;
-    }
-    if (oldV6 != NULL) {
-      olsr_os_del_ipip_tunnel(tunnelV6);
-    }
-  }
-  return (ipv4 && current_ipv4_gw == NULL) || (ipv6 && current_ipv6_gw == NULL);
-}
-
-/**
- * returns the gateway_entry of the current ipv4 internet gw.
- * @return pointer to gateway_entry or NULL if not set
- */
-struct gateway_entry *olsr_get_ipv4_inet_gateway(bool *ext) {
-  if (ext) {
-    *ext = v4gw_choosen_external;
-  }
-  return current_ipv4_gw;
-}
-
-/**
- * returns the gateway_entry of the current ipv6 internet gw.
- * @return pointer to gateway_entry or NULL if not set
- */
-struct gateway_entry *olsr_get_ipv6_inet_gateway(bool *ext) {
-  if (ext) {
-    *ext = v6gw_choosen_external;
-  }
-  return current_ipv6_gw;
-}
 
 /**
  * update a gateway_entry based on data received from a HNA
@@ -393,18 +306,6 @@ olsr_update_gateway_entry(union olsr_ip_addr *originator, union olsr_ip_addr *ma
   gw_handler->handle_update_gw(gw);
 }
 
-static void cleanup_gateway_handler(void *ptr) {
-  struct gateway_entry *gw = ptr;
-
-  if (gw->ipv4 || gw->ipv6) {
-    return;
-  }
-
-  /* remove gateway entry */
-  avl_delete(&gateway_tree, &gw->node);
-  olsr_cookie_free(gw_mem_cookie, gw);
-}
-
 /**
  * Delete a gateway based on the originator IP and the prefixlength of a HNA.
  * Should only be called if prefix is a smart_gw prefix or if node is removed
@@ -468,6 +369,142 @@ olsr_delete_gateway_entry(union olsr_ip_addr *originator, uint8_t prefixlen) {
 }
 
 /**
+ * Print debug information about gateway entries
+ */
+void
+olsr_print_gateway_entries(void) {
+#ifndef NODEBUG
+  struct ipaddr_str buf;
+  struct gateway_entry *gw;
+  const int addrsize = olsr_cnf->ip_version == AF_INET ? 15 : 39;
+
+  OLSR_PRINTF(0, "\n--- %s ---------------------------------------------------- GATEWAYS\n\n",
+      olsr_wallclock_string());
+  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 %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)
+#endif
+}
+
+/**
+ * Set a new gateway handler. Do only call this once during startup from
+ * a plugin to overwrite the default handler.
+ * @param h pointer to gateway handler struct
+ */
+void
+olsr_set_inetgw_handler(struct olsr_gw_handler *h) {
+  gw_handler = h;
+}
+
+/**
+ * Sets a new internet gateway.
+ * An external set command might trigger an internal one if
+ * address is not a legal gateway.
+ *
+ * @param originator ip address of the node with the new gateway
+ * @param ipv4 set ipv4 gateway
+ * @param ipv6 set ipv6 gateway
+ * @param external true if change was triggered directly by an user,
+ *   false if triggered by automatic lookup.
+ * @return true if an error happened, false otherwise
+ */
+bool
+olsr_set_inet_gateway(union olsr_ip_addr *originator, bool ipv4, bool ipv6, bool external) {
+  struct gateway_entry *entry, *oldV4, *oldV6;
+  struct olsr_iptunnel_entry *tunnelV4, *tunnelV6;
+
+  oldV4 = current_ipv4_gw;
+  oldV6 = current_ipv6_gw;
+  tunnelV4 = v4gw_tunnel;
+  tunnelV6 = v6gw_tunnel;
+
+  ipv4 = ipv4 && (olsr_cnf->ip_version == AF_INET || olsr_cnf->use_niit);
+  ipv6 = ipv6 && (olsr_cnf->ip_version == AF_INET6);
+
+  if (ipv4) {
+    current_ipv4_gw = NULL;
+  }
+  if (ipv6) {
+    current_ipv6_gw = NULL;
+  }
+
+  entry = olsr_find_gateway_entry(originator);
+  if (entry != NULL) {
+    if (ipv4 && entry != current_ipv4_gw && entry->ipv4
+        && (!entry->ipv4nat || olsr_cnf->smart_gw_allow_nat)) {
+      /* valid ipv4 gateway */
+      current_ipv4_gw = entry;
+    }
+    if (ipv6 && entry != current_ipv6_gw && entry->ipv6) {
+      /* valid ipv6 gateway */
+      current_ipv6_gw = entry;
+    }
+  }
+
+  /* handle IPv4 */
+  if (oldV4 != current_ipv4_gw) {
+    if ((v4gw_tunnel = olsr_os_add_ipip_tunnel(&current_ipv4_gw->originator, true)) != NULL) {
+      olsr_os_inetgw_tunnel_route(v4gw_tunnel->if_index, true, true);
+      v4gw_choosen_external = external;
+    }
+    else {
+      // TODO: what to do now ? Choose another one ? Fire up a timer ?
+      current_ipv4_gw = NULL;
+    }
+    if (oldV4 != NULL) {
+      olsr_os_del_ipip_tunnel(tunnelV4);
+    }
+  }
+  /* handle IPv6 */
+  if (oldV6 != current_ipv6_gw) {
+    if ((v6gw_tunnel = olsr_os_add_ipip_tunnel(&current_ipv6_gw->originator, false)) != NULL) {
+      olsr_os_inetgw_tunnel_route(v6gw_tunnel->if_index, false, true);
+      v6gw_choosen_external = external;
+    }
+    else {
+      // TODO: what to do now ? Choose another one ? Fire up a timer ?
+      current_ipv6_gw = NULL;
+    }
+    if (oldV6 != NULL) {
+      olsr_os_del_ipip_tunnel(tunnelV6);
+    }
+  }
+  return (ipv4 && current_ipv4_gw == NULL) || (ipv6 && current_ipv6_gw == NULL);
+}
+
+/**
+ * returns the gateway_entry of the current ipv4 internet gw.
+ * @return pointer to gateway_entry or NULL if not set
+ */
+struct gateway_entry *olsr_get_ipv4_inet_gateway(bool *ext) {
+  if (ext) {
+    *ext = v4gw_choosen_external;
+  }
+  return current_ipv4_gw;
+}
+
+/**
+ * returns the gateway_entry of the current ipv6 internet gw.
+ * @return pointer to gateway_entry or NULL if not set
+ */
+struct gateway_entry *olsr_get_ipv6_inet_gateway(bool *ext) {
+  if (ext) {
+    *ext = v6gw_choosen_external;
+  }
+  return current_ipv6_gw;
+}
+
+/**
  * Checks if a prefix/netmask combination is a smart gateway
  * @param prefix
  * @param mask
@@ -510,32 +547,4 @@ olsr_modifiy_inetgw_netmask(union olsr_ip_addr *mask, int prefixlen) {
   }
 }
 
-/**
- * Print debug information about gateway entries
- */
-void
-olsr_print_gateway_entries(void) {
-#ifndef NODEBUG
-  struct ipaddr_str buf;
-  struct gateway_entry *gw;
-  const int addrsize = olsr_cnf->ip_version == AF_INET ? 15 : 39;
-
-  OLSR_PRINTF(0, "\n--- %s ---------------------------------------------------- GATEWAYS\n\n",
-      olsr_wallclock_string());
-  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 %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)
-#endif
-}
-
 #endif /* linux */