inline small functions
authorBernd Petrovitsch <bernd@firmix.at>
Sun, 1 Jun 2008 22:35:41 +0000 (00:35 +0200)
committerBernd Petrovitsch <bernd@firmix.at>
Sun, 1 Jun 2008 22:35:41 +0000 (00:35 +0200)
lib/quagga/src/quagga.c
src/common/list.c
src/common/list.h
src/ipcalc.h
src/routing_table.c
src/routing_table.h

index 60375de..2774e36 100644 (file)
@@ -731,8 +731,8 @@ int zebra_add_olsr_v4_route (const struct rt_entry *r) {
   route.flags = zebra.flags;
   route.prefixlen = r->rt_dst.prefix_len;
   route.prefix = r->rt_dst.prefix.v4.s_addr;
-  if ((r->rt_best->rtp_nexthop.gateway.v4.s_addr == r->rt_dst.prefix.v4.s_addr && 
-       route.prefixlen == 32)) {
+  if (r->rt_best->rtp_nexthop.gateway.v4.s_addr == r->rt_dst.prefix.v4.s_addr && 
+      route.prefixlen == 32) {
     route.message |= ZAPI_MESSAGE_IFINDEX | ZAPI_MESSAGE_NEXTHOP;
     route.ind_num = 1;
     route.index = olsr_malloc (sizeof *route.index, 
@@ -746,6 +746,8 @@ int zebra_add_olsr_v4_route (const struct rt_entry *r) {
   }
   else {
     route.message |= ZAPI_MESSAGE_NEXTHOP;
+    route.ind_num = 0;
+    route.index = NULL;
     route.nh_count = 1;
     route.nexthops = olsr_malloc (route.nh_count * 
                                  (sizeof route.nexthops->type + 
@@ -761,6 +763,8 @@ int zebra_add_olsr_v4_route (const struct rt_entry *r) {
   if (zebra.distance) {
     route.message |= ZAPI_MESSAGE_DISTANCE;
     route.distance = zebra.distance;
+  } else {
+    route.distance = 0;
   }
 
   retval = zebra_add_v4_route(route);
@@ -771,14 +775,14 @@ int zebra_add_olsr_v4_route (const struct rt_entry *r) {
 int zebra_del_olsr_v4_route (const struct rt_entry *r) {
   
   struct ipv4_route route;
-  int retval;
+  int retval;  
   route.type = ZEBRA_ROUTE_OLSR; // OLSR
   route.message = ZAPI_MESSAGE_METRIC;
   route.flags = zebra.flags;
   route.prefixlen = r->rt_dst.prefix_len;
   route.prefix = r->rt_dst.prefix.v4.s_addr;
-  if ((r->rt_best->rtp_nexthop.gateway.v4.s_addr == r->rt_dst.prefix.v4.s_addr && 
-       route.prefixlen == 32)){
+  if (r->rt_best->rtp_nexthop.gateway.v4.s_addr == r->rt_dst.prefix.v4.s_addr && 
+      route.prefixlen == 32) {
     route.message |= ZAPI_MESSAGE_IFINDEX;
     route.ind_num = 1;
     route.index = olsr_malloc (sizeof *route.index, 
@@ -792,6 +796,8 @@ int zebra_del_olsr_v4_route (const struct rt_entry *r) {
   }
   else {
     route.message |= ZAPI_MESSAGE_NEXTHOP;
+    route.ind_num = 0;
+    route.index = NULL;
     route.nh_count = 1;
     route.nexthops = olsr_malloc (route.nh_count * 
                                  (sizeof route.nexthops->type +
@@ -806,6 +812,8 @@ int zebra_del_olsr_v4_route (const struct rt_entry *r) {
   if (zebra.distance) {
     route.message |= ZAPI_MESSAGE_DISTANCE;
     route.distance = zebra.distance;
+  } else {
+    route.distance = 0;
   }
 
   retval = zebra_delete_v4_route(route);
index e8f54a1..2d6fea7 100644 (file)
  *
  */
 
-#include <stdlib.h>
 #include "common/list.h"
 
-/* init a circular list  */
-void list_head_init(struct list_node *node)
-{
-  node->prev = node;
-  node->next = node;
-}
-
-void list_node_init(struct list_node *node)
-{
-  node->prev = NULL;
-  node->next = NULL;
-}
-
-int list_node_on_list(struct list_node *node)
-{
-  if (node->prev || node->next) {
-    return 1;
-  }
-
-  return 0;
-}
-
-int list_is_empty(struct list_node *node)
-{
-  if (node->prev == node && node->next == node) {
-    return 1;
-  }
-
-  return 0;
-}
-
 void list_add_after(struct list_node *pos_node, struct list_node *new_node)
 {
   new_node->next = pos_node->next;
index 429a49b..1572e9c 100644 (file)
 #ifndef _LIST_H
 #define _LIST_H
 
-#include "stddef.h"
+#include <stddef.h>
+#include <stdlib.h>
+
+#define INLINE inline __attribute__((always_inline))
 
 struct list_node
 {
@@ -50,10 +53,15 @@ struct list_node
   struct list_node *prev;
 };
 
-void list_head_init(struct list_node *);
-void list_node_init(struct list_node *);
-int list_node_on_list(struct list_node *);
-int list_is_empty(struct list_node *);
+/* init a circular list  */
+static INLINE void list_head_init(struct list_node *node) { node->prev = node->next = node; }
+/* clear a node  */
+static INLINE void list_node_init(struct list_node *node) { node->prev = node->next = NULL; }
+/* test if a node is on a list */
+static INLINE int list_node_on_list(const struct list_node *node) { return node->prev != NULL || node->next != NULL; }
+/* test if a list is empty */
+static INLINE int list_is_empty(const struct list_node *node) { return node->prev == node && node->next == node; }
+
 
 void list_add_before(struct list_node *, struct list_node *);
 void list_add_after(struct list_node *, struct list_node *);
@@ -65,7 +73,7 @@ void list_remove(struct list_node *);
  * base of the datastructure. That way you save an extra data pointer.
  */
 #define LISTNODE2STRUCT(funcname, structname, listnodename) \
-static inline structname * funcname (struct list_node *ptr)\
+static INLINE structname * funcname (struct list_node *ptr)\
 {\
   return( \
     ptr ? \
index 52378e3..b93b828 100644 (file)
@@ -60,9 +60,7 @@ static INLINE int ip4equal(const struct in_addr *a, const struct in_addr *b) { r
 static INLINE int ip6cmp(const struct in6_addr *a, const struct in6_addr *b) { return memcmp(a, b, sizeof(*a)); }
 static INLINE int ip6equal(const struct in6_addr *a, const struct in6_addr *b) { return ip6cmp(a, b) == 0; }
 
-#if 0
 static INLINE int ipcmp(const union olsr_ip_addr *a, const union olsr_ip_addr *b) { return olsr_cnf->ip_version == AF_INET ? ip4cmp(&a->v4, &b->v4) : ip6cmp(&a->v6, &b->v6); }
-#endif
 static INLINE int ipequal(const union olsr_ip_addr *a, const union olsr_ip_addr *b) { return olsr_cnf->ip_version == AF_INET ? ip4equal(&a->v4, &b->v4) : ip6equal(&a->v6, &b->v6); }
 
 /* Do not use this - this is as evil as the COPY_IP() macro was and only used in
index a111216..036a442 100644 (file)
@@ -76,20 +76,6 @@ struct avl_tree routingtree;
  */
 unsigned int routingtree_version;
 
-/**
- * Bump the version number of the routing tree.
- *
- * After route-insertion compare the version number of the routes
- * against the version number of the table.
- * This is a lightweight detection if a node or prefix went away,
- * rather than brute force old vs. new rt_entry comparision.
- */
-unsigned int
-olsr_bump_routingtree_version(void)
-{
-  return routingtree_version++;
-}
-
 /**
  * avl_comp_ipv4_prefix
  *
@@ -145,7 +131,7 @@ avl_comp_ipv6_prefix (const void *prefix1, const void *prefix2)
   const struct olsr_ip_prefix *pfx2 = prefix2;
 
   /* prefix */
-  res = memcmp(&pfx1->prefix.v6, &pfx2->prefix.v6, 16);
+  res = ip6equal(&pfx1->prefix.v6, &pfx2->prefix.v6);
   if (res != 0) {
     return res;
   } 
@@ -374,29 +360,7 @@ olsr_delete_rt_path(struct rt_path *rtp)
   olsr_cookie_free(rtp_mem_cookie, rtp);
 }
 
-
-/**
- * Check if there is an interface or gateway change.
- */
-olsr_bool
-olsr_nh_change(const struct rt_nexthop *nh1, const struct rt_nexthop *nh2)
-{
-  if (!ipequal(&nh1->gateway, &nh2->gateway) ||
-      (nh1->iif_index != nh2->iif_index)) {
-    return OLSR_TRUE;
-  }
-  return OLSR_FALSE;
-}
-
-/**
- * Check if there is a hopcount change.
- */
-olsr_bool
-olsr_hopcount_change(const struct rt_metric *met1, const struct rt_metric *met2)
-{
-  return (met1->hops != met2->hops);
-}
-
+#if 0
 /**
  * Depending if flat_metric is configured and the kernel fib operation
  * return the hopcount metric of a route.
@@ -412,24 +376,7 @@ olsr_fib_metric(const struct rt_metric *met)
   }
   return RT_METRIC_DEFAULT;
 }
-
-/**
- * depending on the operation (add/chg/del) the nexthop
- * field from the route entry or best route path shall be used.
- */
-const struct rt_nexthop *
-olsr_get_nh(const struct rt_entry *rt)
-{
-
-  if(rt->rt_best) {
-
-    /* this is a route add/chg - grab nexthop from the best route. */
-    return &rt->rt_best->rtp_nexthop;
-  } 
-  
-  /* this is a route deletion - all routes are gone. */
-  return &rt->rt_nexthop;
-}
+#endif
 
 /**
  * compare two route paths.
@@ -458,8 +405,7 @@ olsr_cmp_rtp(const struct rt_path *rtp1, const struct rt_path *rtp2, const struc
 
     /* originator (which is guaranteed to be unique) is final tie breaker */
     if ((rtp1->rtp_metric.hops == rtp2->rtp_metric.hops) &&
-        (memcmp(&rtp1->rtp_originator, &rtp2->rtp_originator,
-                olsr_cnf->ipsize) == -1)) {
+        (ipcmp(&rtp1->rtp_originator, &rtp2->rtp_originator) < 0)) {
       return OLSR_TRUE;
     }
 
@@ -475,7 +421,7 @@ olsr_cmp_rtp(const struct rt_path *rtp1, const struct rt_path *rtp2, const struc
 olsr_bool
 olsr_cmp_rt(const struct rt_entry *rt1, const struct rt_entry *rt2)
 {
-  return olsr_cmp_rtp(rt1->rt_best, rt2->rt_best, NULL);
+    return olsr_cmp_rtp(rt1->rt_best, rt2->rt_best, NULL);
 }
 
 /**
index 01d532e..626a3fd 100644 (file)
@@ -208,22 +208,54 @@ extern struct olsr_cookie_info *rt_mem_cookie;
 void
 olsr_init_routing_table(void);
 
-unsigned int olsr_bump_routingtree_version(void);
+/**
+ * Bump the version number of the routing tree.
+ *
+ * After route-insertion compare the version number of the routes
+ * against the version number of the table.
+ * This is a lightweight detection if a node or prefix went away,
+ * rather than brute force old vs. new rt_entry comparision.
+ */
+static INLINE void olsr_bump_routingtree_version(void) { routingtree_version++; }
+
 
 int avl_comp_ipv4_prefix (const void *, const void *);
 int avl_comp_ipv6_prefix (const void *, const void *);
 
 void olsr_rt_best(struct rt_entry *);
-olsr_bool olsr_nh_change(const struct rt_nexthop *, const struct rt_nexthop *);
-olsr_bool olsr_hopcount_change(const struct rt_metric *, const struct rt_metric *);
+/**
+ * Check if there is an interface or gateway change.
+ */
+static INLINE olsr_bool olsr_nh_change(const struct rt_nexthop *nh1, const struct rt_nexthop *nh2) {
+    return !ipequal(&nh1->gateway, &nh2->gateway) || nh1->iif_index != nh2->iif_index;
+}
+
+/**
+ * Check if there is a hopcount change.
+ */
+static INLINE olsr_bool olsr_hopcount_change(const struct rt_metric *met1, const struct rt_metric *met2) { return met1->hops != met2->hops; }
+
 olsr_bool olsr_cmp_rt(const struct rt_entry *, const struct rt_entry *);
+#if 0
 olsr_u8_t olsr_fib_metric(const struct rt_metric *);
+#endif
 
 char *olsr_rt_to_string(const struct rt_entry *);
 char *olsr_rtp_to_string(const struct rt_path *);
 void olsr_print_routing_table(struct avl_tree *);
 
-const struct rt_nexthop * olsr_get_nh(const struct rt_entry *);
+/**
+ * depending on the operation (add/chg/del) the nexthop
+ * field from the route entry or best route path shall be used.
+ */
+static INLINE const struct rt_nexthop *olsr_get_nh(const struct rt_entry *rt) {
+  return rt->rt_best != NULL
+    /* this is a route add/chg - grab nexthop from the best route. */
+    ? &rt->rt_best->rtp_nexthop
+    /* this is a route deletion - all routes are gone. */
+    : &rt->rt_nexthop;
+}
+
 
 /* rt_path manipulation */
 struct rt_path *olsr_insert_routing_table(union olsr_ip_addr *, int, union olsr_ip_addr *, int);