epoc32/include/stdapis/net/radix.h
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
child 4 837f303aceeb
permissions -rw-r--r--
Final list of Symbian^2 public API header files
     1 /*-
     2  * Copyright (c) 1988, 1989, 1993
     3  *	The Regents of the University of California.  All rights reserved.
     4 * © Portions copyright (c) 2007 Symbian Software Ltd. All rights reserved.
     5  * Redistribution and use in source and binary forms, with or without
     6  * modification, are permitted provided that the following conditions
     7  * are met:
     8  * 1. Redistributions of source code must retain the above copyright
     9  *    notice, this list of conditions and the following disclaimer.
    10  * 2. Redistributions in binary form must reproduce the above copyright
    11  *    notice, this list of conditions and the following disclaimer in the
    12  *    documentation and/or other materials provided with the distribution.
    13  * 4. Neither the name of the University nor the names of its contributors
    14  *    may be used to endorse or promote products derived from this software
    15  *    without specific prior written permission.
    16  *
    17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
    18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
    21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    27  * SUCH DAMAGE.
    28  *
    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_ */