more inlining and a bug fix:
authorBernd Petrovitsch <bernd@firmix.at>
Mon, 5 May 2008 22:22:19 +0000 (00:22 +0200)
committerBernd Petrovitsch <bernd@firmix.at>
Mon, 5 May 2008 22:22:19 +0000 (00:22 +0200)
- inlined olsr_bump_routingtree_version()
  and made it a "void" function as no one uses the returned value
- inlined olsr_bool olsr_nh_change()
- inlined olsr_bool olsr_hopcount_change()
- commented out the unused olsr_fib_metric() function
- inlined olsr_get_nh()
- use ip6equal() in avl_comp_ipv6_prefix()
- commented in the - up to now unused - ipcmp() inline funtion
- use ipcmp() in olsr_cmp_rtp() instead of a memcmp()
  Actually I don't know if it buys that much from a performance
  point-of-viw.

The bug fix (at least IMHO):
- The ipcmp() result (which is equivalent to the memcmp() result)
  is compared "< 0" and not "== -1".
  Rationale: memcmp() (and others) return - according to the manual
  page - "== 0", "< 0" or "> 0". So the only 6 valid operations are
  the 6 combinations (and negations) thereof.
  Comparing the result to "== -1" is IMHO plain simply wrong as
  memcmp() may return validly "-2".

src/ipcalc.h
src/routing_table.c
src/routing_table.h

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 589be22..7f0aa23 100644 (file)
@@ -72,20 +72,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
  *
@@ -141,7 +127,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;
   } 
@@ -359,29 +345,7 @@ olsr_delete_rt_path(struct rt_path *rtp)
   free(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.
@@ -397,24 +361,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.
@@ -443,8 +390,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;
     }
 
@@ -460,7 +406,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 8440149..cb255a4 100644 (file)
@@ -206,22 +206,54 @@ extern unsigned int routingtree_version;
 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);