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))