[BACK]Return to radix.h CVS log [TXT][DIR] Up to [local] / sys / net

Annotation of sys/net/radix.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: radix.h,v 1.13 2006/06/16 15:50:28 claudio Exp $      */
                      2: /*     $NetBSD: radix.h,v 1.8 1996/02/13 22:00:37 christos Exp $       */
                      3:
                      4: /*
                      5:  * Copyright (c) 1988, 1989, 1993
                      6:  *     The Regents of the University of California.  All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. Neither the name of the University nor the names of its contributors
                     17:  *    may be used to endorse or promote products derived from this software
                     18:  *    without specific prior written permission.
                     19:  *
                     20:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     21:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     22:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     23:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     24:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     25:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     26:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     27:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     28:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     29:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     30:  * SUCH DAMAGE.
                     31:  *
                     32:  *     @(#)radix.h     8.2 (Berkeley) 10/31/94
                     33:  */
                     34:
                     35: #ifndef _NET_RADIX_H_
                     36: #define        _NET_RADIX_H_
                     37:
                     38: /*
                     39:  * Radix search tree node layout.
                     40:  */
                     41:
                     42: struct radix_node {
                     43:        struct  radix_mask *rn_mklist;  /* list of masks contained in subtree */
                     44:        struct  radix_node *rn_p;       /* parent */
                     45:        short   rn_b;                   /* bit offset; -1-index(netmask) */
                     46:        char    rn_bmask;               /* node: mask for bit test*/
                     47:        u_char  rn_flags;               /* enumerated next */
                     48: #define RNF_NORMAL     1               /* leaf contains normal route */
                     49: #define RNF_ROOT       2               /* leaf is root leaf for tree */
                     50: #define RNF_ACTIVE     4               /* This node is alive (for rtfree) */
                     51:        union {
                     52:                struct {                        /* leaf only data: */
                     53:                        caddr_t rn_Key;         /* object of search */
                     54:                        caddr_t rn_Mask;        /* netmask, if present */
                     55:                        struct  radix_node *rn_Dupedkey;
                     56:                } rn_leaf;
                     57:                struct {                        /* node only data: */
                     58:                        int     rn_Off;         /* where to start compare */
                     59:                        struct  radix_node *rn_L;/* progeny */
                     60:                        struct  radix_node *rn_R;/* progeny */
                     61:                } rn_node;
                     62:        } rn_u;
                     63: #ifdef RN_DEBUG
                     64:        int rn_info;
                     65:        struct radix_node *rn_twin;
                     66:        struct radix_node *rn_ybro;
                     67: #endif
                     68: };
                     69:
                     70: #define rn_dupedkey rn_u.rn_leaf.rn_Dupedkey
                     71: #define rn_key rn_u.rn_leaf.rn_Key
                     72: #define rn_mask rn_u.rn_leaf.rn_Mask
                     73: #define rn_off rn_u.rn_node.rn_Off
                     74: #define rn_l rn_u.rn_node.rn_L
                     75: #define rn_r rn_u.rn_node.rn_R
                     76:
                     77: /*
                     78:  * Annotations to tree concerning potential routes applying to subtrees.
                     79:  */
                     80:
                     81: extern struct radix_mask {
                     82:        short   rm_b;                   /* bit offset; -1-index(netmask) */
                     83:        char    rm_unused;              /* cf. rn_bmask */
                     84:        u_char  rm_flags;               /* cf. rn_flags */
                     85:        struct  radix_mask *rm_mklist;  /* more masks to try */
                     86:        union   {
                     87:                caddr_t rmu_mask;               /* the mask */
                     88:                struct  radix_node *rmu_leaf;   /* for normal routes */
                     89:        }       rm_rmu;
                     90:        int     rm_refs;                /* # of references to this struct */
                     91: } *rn_mkfreelist;
                     92:
                     93: #define rm_mask rm_rmu.rmu_mask
                     94: #define rm_leaf rm_rmu.rmu_leaf                /* extra field would make 32 bytes */
                     95:
                     96: #define MKGet(m) {\
                     97:        if (rn_mkfreelist) {\
                     98:                m = rn_mkfreelist; \
                     99:                rn_mkfreelist = (m)->rm_mklist; \
                    100:        } else \
                    101:                R_Malloc(m, struct radix_mask *, sizeof (*(m))); }\
                    102:
                    103: #define MKFree(m) { (m)->rm_mklist = rn_mkfreelist; rn_mkfreelist = (m);}
                    104:
                    105: struct radix_node_head {
                    106:        struct  radix_node *rnh_treetop;
                    107:        int     rnh_addrsize;           /* permit, but not require fixed keys */
                    108:        int     rnh_pktsize;            /* permit, but not require fixed keys */
                    109:                                        /* add based on sockaddr */
                    110:        struct  radix_node *(*rnh_addaddr)(void *v, void *mask,
                    111:                     struct radix_node_head *head, struct radix_node nodes[]);
                    112:                                        /* remove based on sockaddr */
                    113:        struct  radix_node *(*rnh_deladdr)(void *v, void *mask,
                    114:                    struct radix_node_head *head, struct radix_node *rn);
                    115:                                        /* locate based on sockaddr */
                    116:        struct  radix_node *(*rnh_matchaddr)(void *v,
                    117:                    struct radix_node_head *head);
                    118:                                        /* locate based on sockaddr */
                    119:        struct  radix_node *(*rnh_lookup)(void *v, void *mask,
                    120:                    struct radix_node_head *head);
                    121:                                        /* traverse tree */
                    122:        int     (*rnh_walktree)(struct radix_node_head *,
                    123:                     int (*)(struct radix_node *, void *), void *);
                    124:        struct  radix_node rnh_nodes[3];/* empty tree for common case */
                    125:        int     rnh_multipath;          /* multipath? */
                    126: };
                    127:
                    128: #ifdef _KERNEL
                    129: #define Bcmp(a, b, n) bcmp(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n))
                    130: #define Bcopy(a, b, n) bcopy(((caddr_t)(a)), ((caddr_t)(b)), (unsigned)(n))
                    131: #define Bzero(p, n) bzero((caddr_t)(p), (unsigned)(n));
                    132: #define R_Malloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_DONTWAIT))
                    133: #define Free(p) free((caddr_t)p, M_RTABLE);
                    134:
                    135: void   rn_init(void);
                    136: int    rn_inithead(void **, int);
                    137: int    rn_inithead0(struct radix_node_head *, int);
                    138: int    rn_refines(void *, void *);
                    139: int    rn_walktree(struct radix_node_head *,
                    140:            int (*)(struct radix_node *, void *), void *);
                    141:
                    142: struct radix_node      *rn_addmask(void *, int, int);
                    143: struct radix_node      *rn_addroute(void *, void *, struct radix_node_head *,
                    144:                            struct radix_node [2]);
                    145: struct radix_node      *rn_delete(void *, void *, struct radix_node_head *,
                    146:                            struct radix_node *);
                    147: struct radix_node      *rn_insert(void *, struct radix_node_head *, int *,
                    148:                            struct radix_node [2]);
                    149: struct radix_node      *rn_lookup(void *, void *, struct radix_node_head *);
                    150: struct radix_node      *rn_match(void *, struct radix_node_head *);
                    151: struct radix_node      *rn_newpair(void *, int, struct radix_node[2]);
                    152: struct radix_node      *rn_search(void *, struct radix_node *);
                    153: struct radix_node      *rn_search_m(void *, struct radix_node *, void *);
                    154: #endif /* _KERNEL */
                    155: #endif /* _NET_RADIX_H_ */

CVSweb