genericopenlibs/openenvcore/include/net/radix.h
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 /*-
       
     2  * Copyright (c) 1988, 1989, 1993
       
     3  *	The Regents of the University of California.  All rights reserved.
       
     4  * Redistribution and use in source and binary forms, with or without
       
     5  * modification, are permitted provided that the following conditions
       
     6  * are met:
       
     7  * 1. Redistributions of source code must retain the above copyright
       
     8  *    notice, this list of conditions and the following disclaimer.
       
     9  * 2. Redistributions in binary form must reproduce the above copyright
       
    10  *    notice, this list of conditions and the following disclaimer in the
       
    11  *    documentation and/or other materials provided with the distribution.
       
    12  * 4. Neither the name of the University nor the names of its contributors
       
    13  *    may be used to endorse or promote products derived from this software
       
    14  *    without specific prior written permission.
       
    15  *
       
    16  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
       
    17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
       
    19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
       
    20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
       
    21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
       
    22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
       
    23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
       
    24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
       
    25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
       
    26  * SUCH DAMAGE.
       
    27  *
       
    28  * Portions Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
       
    29  *	@(#)radix.h	8.2 (Berkeley) 10/31/94
       
    30  * $FreeBSD: src/sys/net/radix.h,v 1.26 2005/01/07 01:45:35 imp Exp $
       
    31  */
       
    32 
       
    33 #ifndef _RADIX_H_
       
    34 #define	_RADIX_H_
       
    35 
       
    36 #ifdef _KERNEL
       
    37 #include <sys/_lock.h>
       
    38 #include <sys/_mutex.h>
       
    39 #endif
       
    40 
       
    41 /*
       
    42  * Radix search tree node layout.
       
    43  */
       
    44 
       
    45 struct radix_node {
       
    46 	struct	radix_mask *rn_mklist;	/* list of masks contained in subtree */
       
    47 	struct	radix_node *rn_parent;	/* parent */
       
    48 	short	rn_bit;			/* bit offset; -1-index(netmask) */
       
    49 	char	rn_bmask;		/* node: mask for bit test*/
       
    50 	u_char	rn_flags;		/* enumerated next */
       
    51 #define RNF_NORMAL	1		/* leaf contains normal route */
       
    52 #define RNF_ROOT	2		/* leaf is root leaf for tree */
       
    53 #define RNF_ACTIVE	4		/* This node is alive (for rtfree) */
       
    54 	union {
       
    55 		struct {			/* leaf only data: */
       
    56 			caddr_t	rn_Key;		/* object of search */
       
    57 			caddr_t	rn_Mask;	/* netmask, if present */
       
    58 			struct	radix_node *rn_Dupedkey;
       
    59 		} rn_leaf;
       
    60 		struct {			/* node only data: */
       
    61 			int	rn_Off;		/* where to start compare */
       
    62 			struct	radix_node *rn_L;/* progeny */
       
    63 			struct	radix_node *rn_R;/* progeny */
       
    64 		} rn_node;
       
    65 	}		rn_u;
       
    66 #ifdef RN_DEBUG
       
    67 	int rn_info;
       
    68 	struct radix_node *rn_twin;
       
    69 	struct radix_node *rn_ybro;
       
    70 #endif
       
    71 };
       
    72 
       
    73 #define	rn_dupedkey	rn_u.rn_leaf.rn_Dupedkey
       
    74 #define	rn_key		rn_u.rn_leaf.rn_Key
       
    75 #define	rn_mask		rn_u.rn_leaf.rn_Mask
       
    76 #define	rn_offset	rn_u.rn_node.rn_Off
       
    77 #define	rn_left		rn_u.rn_node.rn_L
       
    78 #define	rn_right	rn_u.rn_node.rn_R
       
    79 
       
    80 /*
       
    81  * Annotations to tree concerning potential routes applying to subtrees.
       
    82  */
       
    83 
       
    84 struct radix_mask {
       
    85 	short	rm_bit;			/* bit offset; -1-index(netmask) */
       
    86 	char	rm_unused;		/* cf. rn_bmask */
       
    87 	u_char	rm_flags;		/* cf. rn_flags */
       
    88 	struct	radix_mask *rm_mklist;	/* more masks to try */
       
    89 	union	{
       
    90 		caddr_t	rmu_mask;		/* the mask */
       
    91 		struct	radix_node *rmu_leaf;	/* for normal routes */
       
    92 	}	rm_rmu;
       
    93 	int	rm_refs;		/* # of references to this struct */
       
    94 };
       
    95 
       
    96 #define	rm_mask rm_rmu.rmu_mask
       
    97 #define	rm_leaf rm_rmu.rmu_leaf		/* extra field would make 32 bytes */
       
    98 
       
    99 #ifndef __SYMBIAN32__
       
   100 typedef int walktree_f_t(struct radix_node *, void *);
       
   101 
       
   102 struct radix_node_head {
       
   103 	struct	radix_node *rnh_treetop;
       
   104 	int	rnh_addrsize;		/* permit, but not require fixed keys */
       
   105 	int	rnh_pktsize;		/* permit, but not require fixed keys */
       
   106 	struct	radix_node *(*rnh_addaddr)	/* add based on sockaddr */
       
   107 		(void *v, void *mask,
       
   108 		     struct radix_node_head *head, struct radix_node nodes[]);
       
   109 	struct	radix_node *(*rnh_addpkt)	/* add based on packet hdr */
       
   110 		(void *v, void *mask,
       
   111 		     struct radix_node_head *head, struct radix_node nodes[]);
       
   112 	struct	radix_node *(*rnh_deladdr)	/* remove based on sockaddr */
       
   113 		(void *v, void *mask, struct radix_node_head *head);
       
   114 	struct	radix_node *(*rnh_delpkt)	/* remove based on packet hdr */
       
   115 		(void *v, void *mask, struct radix_node_head *head);
       
   116 	struct	radix_node *(*rnh_matchaddr)	/* locate based on sockaddr */
       
   117 		(void *v, struct radix_node_head *head);
       
   118 	struct	radix_node *(*rnh_lookup)	/* locate based on sockaddr */
       
   119 		(void *v, void *mask, struct radix_node_head *head);
       
   120 	struct	radix_node *(*rnh_matchpkt)	/* locate based on packet hdr */
       
   121 		(void *v, struct radix_node_head *head);
       
   122 	int	(*rnh_walktree)			/* traverse tree */
       
   123 		(struct radix_node_head *head, walktree_f_t *f, void *w);
       
   124 	int	(*rnh_walktree_from)		/* traverse tree below a */
       
   125 		(struct radix_node_head *head, void *a, void *m,
       
   126 		     walktree_f_t *f, void *w);
       
   127 	void	(*rnh_close)	/* do something when the last ref drops */
       
   128 		(struct radix_node *rn, struct radix_node_head *head);
       
   129 	struct	radix_node rnh_nodes[3];	/* empty tree for common case */
       
   130 #ifdef _KERNEL
       
   131 	struct	mtx rnh_mtx;			/* locks entire radix tree */
       
   132 #endif
       
   133 };
       
   134 
       
   135 #ifndef _KERNEL
       
   136 #define R_Malloc(p, t, n) (p = (t) malloc((unsigned int)(n)))
       
   137 #define R_Zalloc(p, t, n) (p = (t) calloc(1,(unsigned int)(n)))
       
   138 #ifndef __SYMBIAN32__
       
   139 #define Free(p) free((char *)p);
       
   140 #endif
       
   141 #else
       
   142 #define R_Malloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_NOWAIT))
       
   143 #define R_Zalloc(p, t, n) (p = (t) malloc((unsigned long)(n), M_RTABLE, M_NOWAIT | M_ZERO))
       
   144 #ifndef __SYMBIAN32__
       
   145 #define Free(p) free((caddr_t)p, M_RTABLE);
       
   146 #endif
       
   147 #define	RADIX_NODE_HEAD_LOCK_INIT(rnh)	\
       
   148     mtx_init(&(rnh)->rnh_mtx, "radix node head", NULL, MTX_DEF | MTX_RECURSE)
       
   149 #define	RADIX_NODE_HEAD_LOCK(rnh)	mtx_lock(&(rnh)->rnh_mtx)
       
   150 #define	RADIX_NODE_HEAD_UNLOCK(rnh)	mtx_unlock(&(rnh)->rnh_mtx)
       
   151 #define	RADIX_NODE_HEAD_DESTROY(rnh)	mtx_destroy(&(rnh)->rnh_mtx)
       
   152 #define	RADIX_NODE_HEAD_LOCK_ASSERT(rnh) mtx_assert(&(rnh)->rnh_mtx, MA_OWNED)
       
   153 #endif /* _KERNEL */
       
   154 
       
   155 struct radix_node
       
   156 	 *rn_addmask(void *, int, int),
       
   157 	 *rn_addroute (void *, void *, struct radix_node_head *,
       
   158 			struct radix_node [2]),
       
   159 	 *rn_delete(void *, void *, struct radix_node_head *),
       
   160 	 *rn_lookup (void *v_arg, void *m_arg,
       
   161 		        struct radix_node_head *head),
       
   162 	 *rn_match(void *, struct radix_node_head *);
       
   163 #endif //__SYMBIAN32__
       
   164 #endif /* _RADIX_H_ */