[quagga-dev 7495] [PATCH] move check_bit into prefix common code.

Stephen Hemminger shemminger at vyatta.com
Tue Dec 8 18:08:15 GMT 2009


Make one version of check prefix bit, and put it inline
with proper prototype. This gets rid of some macro's and also some
assert() that can never happen on a non-broken compiler.


--- a/bgpd/bgp_table.c	2009-12-08 08:27:35.479472476 -0800
+++ b/bgpd/bgp_table.c	2009-12-08 08:44:31.089471585 -0800
@@ -201,37 +201,10 @@ route_common (struct prefix *n, struct p
     }
 }
 
-/* Macro version of check_bit (). */
-#define CHECK_BIT(X,P) ((((u_char *)(X))[(P) / 8]) >> (7 - ((P) % 8)) & 1)
-
-/* Check bit of the prefix. */
-static int
-check_bit (u_char *prefix, u_char prefixlen)
-{
-  int offset;
-  int shift;
-  u_char *p = (u_char *)prefix;
-
-  assert (prefixlen <= 128);
-
-  offset = prefixlen / 8;
-  shift = 7 - (prefixlen % 8);
-  
-  return (p[offset] >> shift & 1);
-}
-
-/* Macro version of set_link (). */
-#define SET_LINK(X,Y) (X)->link[CHECK_BIT(&(Y)->prefix,(X)->prefixlen)] = (Y);\
-                      (Y)->parent = (X)
-
 static void
 set_link (struct bgp_node *node, struct bgp_node *new)
 {
-  int bit;
-    
-  bit = check_bit (&new->p.u.prefix, node->p.prefixlen);
-
-  assert (bit == 0 || bit == 1);
+  unsigned int bit = prefix_bit (&new->p.u.prefix, node->p.prefixlen);
 
   node->link[bit] = new;
   new->parent = node;
@@ -273,7 +246,7 @@ bgp_node_match (const struct bgp_table *
     {
       if (node->info)
 	matched = node;
-      node = node->link[check_bit(&p->u.prefix, node->p.prefixlen)];
+      node = node->link[prefix_bit(&p->u.prefix, node->p.prefixlen)];
     }
 
   /* If matched route found, return it. */
@@ -325,7 +298,7 @@ bgp_node_lookup (const struct bgp_table 
       if (node->p.prefixlen == p->prefixlen && node->info)
 	return bgp_lock_node (node);
 
-      node = node->link[check_bit(&p->u.prefix, node->p.prefixlen)];
+      node = node->link[prefix_bit(&p->u.prefix, node->p.prefixlen)];
     }
 
   return NULL;
@@ -350,7 +323,7 @@ bgp_node_get (struct bgp_table *const ta
 	  return node;
 	}
       match = node;
-      node = node->link[check_bit(&p->u.prefix, node->p.prefixlen)];
+      node = node->link[prefix_bit(&p->u.prefix, node->p.prefixlen)];
     }
 
   if (node == NULL)
--- a/lib/prefix.h	2009-12-08 08:32:27.109783926 -0800
+++ b/lib/prefix.h	2009-12-08 08:40:04.900724058 -0800
@@ -127,6 +127,16 @@ struct prefix_rd
 /* Prefix's family member. */
 #define PREFIX_FAMILY(p)  ((p)->family)
 
+/* Check bit of the prefix. */
+static inline unsigned int
+prefix_bit (const u_char *prefix, const u_char prefixlen)
+{
+  unsigned int offset = prefixlen / 8;
+  unsigned int shift  = 7 - (prefixlen % 8);
+
+  return (prefix[offset] >> shift) & 1;
+}
+
 /* Prototypes. */
 extern int afi2family (int);
 extern int family2afi (int);
--- a/lib/table.c	2009-12-08 08:26:10.590720298 -0800
+++ b/lib/table.c	2009-12-08 08:39:48.028062910 -0800
@@ -165,37 +165,10 @@ route_common (struct prefix *n, struct p
     }
 }
 
-/* Macro version of check_bit (). */
-#define CHECK_BIT(X,P) ((((u_char *)(X))[(P) / 8]) >> (7 - ((P) % 8)) & 1)
-
-/* Check bit of the prefix. */
-static int
-check_bit (const u_char *prefix, u_char prefixlen)
-{
-  unsigned int offset;
-  unsigned int shift;
-  const u_char *p = prefix;
-
-  assert (prefixlen <= 128);
-
-  offset = prefixlen / 8;
-  shift = 7 - (prefixlen % 8);
-  
-  return (p[offset] >> shift & 1);
-}
-
-/* Macro version of set_link (). */
-#define SET_LINK(X,Y) do { (X)->link[CHECK_BIT(&(Y)->p.u.prefix,(X)->p.prefixlen)] = (Y);\
-                      (Y)->parent = (X); } while (0)
-
 static void
 set_link (struct route_node *node, struct route_node *new)
 {
-  int bit;
-    
-  bit = check_bit (&new->p.u.prefix, node->p.prefixlen);
-
-  assert (bit == 0 || bit == 1);
+  unsigned int bit = prefix_bit (&new->p.u.prefix, node->p.prefixlen);
 
   node->link[bit] = new;
   new->parent = node;
@@ -236,7 +209,7 @@ route_node_match (const struct route_tab
     {
       if (node->info)
 	matched = node;
-      node = node->link[check_bit(&p->u.prefix, node->p.prefixlen)];
+      node = node->link[prefix_bit(&p->u.prefix, node->p.prefixlen)];
     }
 
   /* If matched route found, return it. */
@@ -290,7 +263,7 @@ route_node_lookup (struct route_table *t
       if (node->p.prefixlen == p->prefixlen && node->info)
 	return route_lock_node (node);
 
-      node = node->link[check_bit(&p->u.prefix, node->p.prefixlen)];
+      node = node->link[prefix_bit(&p->u.prefix, node->p.prefixlen)];
     }
 
   return NULL;
@@ -315,7 +288,7 @@ route_node_get (struct route_table *tabl
 	  return node;
 	}
       match = node;
-      node = node->link[check_bit(&p->u.prefix, node->p.prefixlen)];
+      node = node->link[prefix_bit(&p->u.prefix, node->p.prefixlen)];
     }
 
   if (node == NULL)
--- a/ospf6d/ospf6_lsdb.c	2009-12-08 08:37:23.839487282 -0800
+++ b/ospf6d/ospf6_lsdb.c	2009-12-08 08:38:01.954401644 -0800
@@ -258,9 +258,6 @@ ospf6_lsdb_lookup (u_int16_t type, u_int
   return (struct ospf6_lsa *) node->info;
 }
 
-/* Macro version of check_bit (). */
-#define CHECK_BIT(X,P) ((((u_char *)(X))[(P) / 8]) >> (7 - ((P) % 8)) & 1)
-
 struct ospf6_lsa *
 ospf6_lsdb_lookup_next (u_int16_t type, u_int32_t id, u_int32_t adv_router,
                         struct ospf6_lsdb *lsdb)
@@ -291,7 +288,7 @@ ospf6_lsdb_lookup_next (u_int16_t type, 
          prefix_match (&node->p, p))
     {
       matched = node;
-      node = node->link[CHECK_BIT(&p->u.prefix, node->p.prefixlen)];
+      node = node->link[prefix_bit(&p->u.prefix, node->p.prefixlen)];
     }
 
   if (matched)
@@ -384,7 +381,7 @@ ospf6_lsdb_type_router_head (u_int16_t t
   /* Walk down tree. */
   while (node && node->p.prefixlen <= key.prefixlen &&
 	 prefix_match (&node->p, (struct prefix *) &key))
-    node = node->link[CHECK_BIT(&key.prefix, node->p.prefixlen)];
+    node = node->link[prefix_bit(&key.prefix, node->p.prefixlen)];
 
   if (node)
     route_lock_node (node);
@@ -438,7 +435,7 @@ ospf6_lsdb_type_head (u_int16_t type, st
   node = lsdb->table->top;
   while (node && node->p.prefixlen <= key.prefixlen &&
 	 prefix_match (&node->p, (struct prefix *) &key))
-    node = node->link[CHECK_BIT(&key.prefix, node->p.prefixlen)];
+    node = node->link[prefix_bit(&key.prefix, node->p.prefixlen)];
 
   if (node)
     route_lock_node (node);
--- a/ospf6d/ospf6_route.c	2009-12-08 08:38:14.219785194 -0800
+++ b/ospf6d/ospf6_route.c	2009-12-08 08:38:36.770095687 -0800
@@ -706,9 +706,6 @@ ospf6_route_best_next (struct ospf6_rout
   return next;
 }
 
-/* Macro version of check_bit (). */
-#define CHECK_BIT(X,P) ((((u_char *)(X))[(P) / 8]) >> (7 - ((P) % 8)) & 1)
-
 struct ospf6_route *
 ospf6_route_match_head (struct prefix *prefix,
                         struct ospf6_route_table *table)
@@ -720,7 +717,7 @@ ospf6_route_match_head (struct prefix *p
   node = table->table->top;
   while (node && node->p.prefixlen < prefix->prefixlen &&
 	 prefix_match (&node->p, prefix))
-    node = node->link[CHECK_BIT(&prefix->u.prefix, node->p.prefixlen)];
+    node = node->link[prefix_bit(&prefix->u.prefix, node->p.prefixlen)];
 
   if (node)
     route_lock_node (node);



More information about the Quagga-dev mailing list