Try to be more consistent in how various variables are setup and named.
Also remove a memset that is already happeing because we use PR_ZERO on
the allocation. Move to memmove to memcpy because the addrs can not
overlap. Make some simple helper functions static __inline and remove one
of the explicit rn_search inlines. Also remove another insane #ifdef dance
int route.h.

Works for me, OK?
-- 
:wq Claudio

Index: net/radix.c
===================================================================
RCS file: /cvs/src/sys/net/radix.c,v
retrieving revision 1.36
diff -u -p -r1.36 radix.c
--- net/radix.c 19 Jan 2014 09:52:25 -0000      1.36
+++ net/radix.c 20 Jan 2014 01:03:17 -0000
@@ -60,15 +60,16 @@ struct pool rtmask_pool;    /* pool for rad
 
 #define rn_masktop (mask_rnhead->rnh_treetop)
 
-static int rn_satisfies_leaf(char *, struct radix_node *, int);
-static int rn_lexobetter(void *, void *);
-static struct radix_mask *rn_new_radix_mask(struct radix_node *,
+static __inline int rn_satisfies_leaf(char *, struct radix_node *, int);
+static __inline int rn_lexobetter(void *, void *);
+static __inline struct radix_mask *rn_new_radix_mask(struct radix_node *,
     struct radix_mask *);
 
 struct radix_node *rn_insert(void *, struct radix_node_head *, int *,
     struct radix_node [2]);
 struct radix_node *rn_newpair(void *, int, struct radix_node[2]);
-struct radix_node *rn_search(void *, struct radix_node *);
+
+static __inline struct radix_node *rn_search(void *, struct radix_node *);
 struct radix_node *rn_search_m(void *, struct radix_node *, void *);
 
 /*
@@ -105,13 +106,13 @@ struct radix_node *rn_search_m(void *, s
  * that governs a subtree.
  */
 
-struct radix_node *
+static __inline struct radix_node *
 rn_search(void *v_arg, struct radix_node *head)
 {
        struct radix_node *x;
-       caddr_t v;
+       caddr_t v = v_arg;
 
-       for (x = head, v = v_arg; x->rn_b >= 0;) {
+       for (x = head; x->rn_b >= 0;) {
                if (x->rn_bmask & v[x->rn_off])
                        x = x->rn_r;
                else
@@ -124,7 +125,8 @@ struct radix_node *
 rn_search_m(void *v_arg, struct radix_node *head, void *m_arg)
 {
        struct radix_node *x;
-       caddr_t v = v_arg, m = m_arg;
+       caddr_t v = v_arg;
+       caddr_t m = m_arg;
 
        for (x = head; x->rn_b >= 0;) {
                if ((x->rn_bmask & m[x->rn_off]) &&
@@ -139,11 +141,14 @@ rn_search_m(void *v_arg, struct radix_no
 int
 rn_refines(void *m_arg, void *n_arg)
 {
-       caddr_t m = m_arg, n = n_arg;
-       caddr_t lim, lim2 = lim = n + *(u_char *)n;
-       int longer = (*(u_char *)n++) - (int)(*(u_char *)m++);
+       caddr_t m = m_arg;
+       caddr_t n = n_arg;
+       caddr_t lim, lim2;
+       int longer;
        int masks_are_equal = 1;
 
+       lim2 = lim = n + *(u_char *)n;
+       longer = (*(u_char *)n++) - (int)(*(u_char *)m++);
        if (longer > 0)
                lim -= longer;
        while (n < lim) {
@@ -182,13 +187,16 @@ rn_lookup(void *v_arg, void *m_arg, stru
        return x;
 }
 
-static int
+static __inline int
 rn_satisfies_leaf(char *trial, struct radix_node *leaf, int skip)
 {
-       char *cp = trial, *cp2 = leaf->rn_key, *cp3 = leaf->rn_mask;
+       char *cp = trial;
+       char *cp2 = leaf->rn_key;
+       char *cp3 = leaf->rn_mask;
        char *cplim;
-       int length = min(*(u_char *)cp, *(u_char *)cp2);
+       int length;
 
+       length = min(*(u_char *)cp, *(u_char *)cp2);
        if (cp3 == NULL)
                cp3 = rn_ones;
        else
@@ -204,23 +212,14 @@ struct radix_node *
 rn_match(void *v_arg, struct radix_node_head *head)
 {
        caddr_t v = v_arg;
-       struct radix_node *t = head->rnh_treetop, *x;
-       caddr_t cp = v, cp2;
-       caddr_t cplim;
-       struct radix_node *saved_t, *top = t;
-       int off = t->rn_off, vlen = *(u_char *)cp, matched_off;
+       caddr_t cp, cp2, cplim;
+       struct radix_node *top = head->rnh_treetop;
+       struct radix_node *saved_t, *t;
+       int off = top->rn_off;
+       int vlen, matched_off;
        int test, b, rn_b;
 
-       /*
-        * Open code rn_search(v, top) to avoid overhead of extra
-        * subroutine call.
-        */
-       for (; t->rn_b >= 0; ) {
-               if (t->rn_bmask & cp[t->rn_off])
-                       t = t->rn_r;
-               else
-                       t = t->rn_l;
-       }
+       t = rn_search(v, top);
        /*
         * See if we match exactly as a host destination
         * or at least learn how many bits match, for normal mask finesse.
@@ -234,7 +233,11 @@ rn_match(void *v_arg, struct radix_node_
         */
        if (t->rn_mask)
                vlen = *(u_char *)t->rn_mask;
-       cp += off; cp2 = t->rn_key + off; cplim = v + vlen;
+       else
+               vlen = *(u_char *)v;
+       cp = v + off;
+       cp2 = t->rn_key + off;
+       cplim = v + vlen;
        for (; cp < cplim; cp++, cp2++)
                if (*cp != *cp2)
                        goto on1;
@@ -287,6 +290,7 @@ on1:
                                        if (rn_b <= m->rm_b)
                                                return (m->rm_leaf);
                                } else {
+                                       struct radix_node *x;
                                        off = min(t->rn_off, matched_off);
                                        x = rn_search_m(v, t, m->rm_mask);
                                        while (x && x->rn_mask != m->rm_mask)
@@ -298,7 +302,7 @@ on1:
                        } while (m);
                }
        } while (t != top);
-       return 0;
+       return NULL;
 }
 
 #ifdef RN_DEBUG
@@ -311,13 +315,13 @@ int       rn_debug =  1;
 struct radix_node *
 rn_newpair(void *v, int b, struct radix_node nodes[2])
 {
-       struct radix_node *tt = nodes, *t = tt + 1;
+       struct radix_node *tt = nodes, *t = nodes + 1;
        t->rn_b = b;
        t->rn_bmask = 0x80 >> (b & 7);
        t->rn_l = tt;
        t->rn_off = b >> 3;
        tt->rn_b = -1;
-       tt->rn_key = (caddr_t)v;
+       tt->rn_key = v;
        tt->rn_p = t;
        tt->rn_flags = t->rn_flags = RNF_ACTIVE;
 #ifdef RN_DEBUG
@@ -332,22 +336,26 @@ rn_newpair(void *v, int b, struct radix_
 
 struct radix_node *
 rn_insert(void *v_arg, struct radix_node_head *head,
-         int *dupentry, struct radix_node nodes[2])
+    int *dupentry, struct radix_node nodes[2])
 {
        caddr_t v = v_arg;
        struct radix_node *top = head->rnh_treetop;
-       int head_off = top->rn_off, vlen = (int)*((u_char *)v);
-       struct radix_node *t = rn_search(v_arg, top);
-       caddr_t cp = v + head_off;
+       struct radix_node *t, *tt;
+       int off = top->rn_off;
        int b;
-       struct radix_node *tt;
+
+       t = rn_search(v_arg, top);
        /*
         * Find first bit at which v and t->rn_key differ
         */
     {
-       caddr_t cp2 = t->rn_key + head_off;
-       int cmp_res;
-       caddr_t cplim = v + vlen;
+       caddr_t cp, cp2, cplim;
+       int vlen, cmp_res;
+
+       vlen =  *(u_char *)v;
+       cp = v + off;
+       cp2 = t->rn_key + off;
+       cplim = v + vlen;
 
        while (cp < cplim)
                if (*cp2++ != *cp++)
@@ -362,14 +370,14 @@ on1:
     }
     {
        struct radix_node *p, *x = top;
-       cp = v;
+       caddr_t cp = v;
        do {
                p = x;
                if (cp[x->rn_off] & x->rn_bmask)
                        x = x->rn_r;
                else
                        x = x->rn_l;
-       } while (b > (unsigned) x->rn_b); /* x->rn_b < b && x->rn_b >= 0 */
+       } while (b > (unsigned int) x->rn_b); /* x->rn_b < b && x->rn_b >= 0 */
 #ifdef RN_DEBUG
        if (rn_debug)
                log(LOG_DEBUG, "rn_insert: Going In:\n"), traverse(p);
@@ -399,12 +407,11 @@ on1:
 struct radix_node *
 rn_addmask(void *n_arg, int search, int skip)
 {
-       caddr_t netmask = (caddr_t)n_arg;
-       struct radix_node *x;
+       caddr_t netmask = n_arg;
+       struct radix_node *x, *saved_x;
        caddr_t cp, cplim;
        int b = 0, mlen, j;
        int maskduplicated, m0, isnormal;
-       struct radix_node *saved_x;
        static int last_zeroed = 0;
 
        if ((mlen = *(u_char *)netmask) > max_keylen)
@@ -414,9 +421,9 @@ rn_addmask(void *n_arg, int search, int 
        if (mlen <= skip)
                return (mask_rnhead->rnh_nodes);
        if (skip > 1)
-               memmove(addmask_key + 1, rn_ones + 1, skip - 1);
+               memcpy(addmask_key + 1, rn_ones + 1, skip - 1);
        if ((m0 = mlen) > skip)
-               memmove(addmask_key + skip, netmask + skip, mlen - skip);
+               memcpy(addmask_key + skip, netmask + skip, mlen - skip);
        /*
         * Trim trailing zeroes.
         */
@@ -467,7 +474,8 @@ rn_addmask(void *n_arg, int search, int 
        return (x);
 }
 
-static int     /* XXX: arbitrary ordering for non-contiguous masks */
+/* rn_lexobetter: return a arbitrary ordering for non-contiguous masks */
+static __inline int
 rn_lexobetter(void *m_arg, void *n_arg)
 {
        u_char *mp = m_arg, *np = n_arg;
@@ -489,7 +497,7 @@ rn_lexobetter(void *m_arg, void *n_arg)
        return (memcmp(mp, np, *mp) > 0);
 }
 
-static struct radix_mask *
+static __inline struct radix_mask *
 rn_new_radix_mask(struct radix_node *tt, struct radix_mask *next)
 {
        struct radix_mask *m;
@@ -499,7 +507,6 @@ rn_new_radix_mask(struct radix_node *tt,
                log(LOG_ERR, "Mask for route not entered\n");
                return (0);
        }
-       memset(m, 0, sizeof *m);
        m->rm_b = tt->rn_b;
        m->rm_flags = tt->rn_flags;
        if (tt->rn_flags & RNF_NORMAL)
@@ -515,9 +522,11 @@ struct radix_node *
 rn_addroute(void *v_arg, void *n_arg, struct radix_node_head *head,
     struct radix_node treenodes[2], u_int8_t prio)
 {
-       caddr_t v = (caddr_t)v_arg, netmask = (caddr_t)n_arg;
+       caddr_t v = v_arg;
+       caddr_t netmask = n_arg;
+       struct radix_node *top = head->rnh_treetop;
        struct radix_node *t, *x = NULL, *tt;
-       struct radix_node *saved_tt, *top = head->rnh_treetop;
+       struct radix_node *saved_tt;
        short b = 0, b_leaf = 0;
        int keyduplicated, prioinv = -1;
        caddr_t mmask;
@@ -750,28 +759,26 @@ struct radix_node *
 rn_delete(void *v_arg, void *netmask_arg, struct radix_node_head *head,
     struct radix_node *rn)
 {
+       caddr_t v = v_arg;
+       caddr_t netmask = netmask_arg;
+       struct radix_node *top = head->rnh_treetop;
        struct radix_node *t, *p, *x, *tt;
        struct radix_mask *m, *saved_m, **mp;
-       struct radix_node *dupedkey, *saved_tt, *top;
-       caddr_t v, netmask;
-       int b, head_off, vlen;
-
-       v = v_arg;
-       netmask = netmask_arg;
-       x = head->rnh_treetop;
-       tt = rn_search(v, x);
-       head_off = x->rn_off;
+       struct radix_node *dupedkey, *saved_tt;
+       int off = top->rn_off;
+       int b, vlen;
+
        vlen =  *(u_char *)v;
+       tt = rn_search(v, top);
        saved_tt = tt;
-       top = x;
        if (tt == NULL ||
-           memcmp(v + head_off, tt->rn_key + head_off, vlen - head_off))
+           memcmp(v + off, tt->rn_key + off, vlen - off))
                return (0);
        /*
         * Delete our route from mask lists.
         */
        if (netmask) {
-               if ((x = rn_addmask(netmask, 1, head_off)) == NULL)
+               if ((x = rn_addmask(netmask, 1, off)) == NULL)
                        return (0);
                netmask = x->rn_key;
                while (tt->rn_mask != netmask)
Index: net/route.h
===================================================================
RCS file: /cvs/src/sys/net/route.h,v
retrieving revision 1.83
diff -u -p -r1.83 route.h
--- net/route.h 31 Oct 2013 18:10:21 -0000      1.83
+++ net/route.h 20 Jan 2014 00:56:06 -0000
@@ -92,10 +92,9 @@ struct rt_metrics {
  * gateways are marked so that the output routines know to address the
  * gateway rather than the ultimate destination.
  */
-#ifndef RNF_NORMAL
 #include <net/radix.h>
 #include <net/radix_mpath.h>
-#endif
+
 struct rtentry {
        struct  radix_node rt_nodes[2]; /* tree glue, and other values */
 #define        rt_key(r)       ((struct sockaddr *)((r)->rt_nodes->rn_key))

Reply via email to