]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/ipfilter/radix_ipf.h
MFC r368207,368607:
[FreeBSD/stable/10.git] / contrib / ipfilter / radix_ipf.h
1 /*      $FreeBSD$       */
2
3 /*
4  * Copyright (C) 2012 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  */
8 #ifndef __RADIX_IPF_H__
9 #define __RADIX_IPF_H__
10
11 #ifndef U_32_T
12 typedef unsigned int u_32_t;
13 # define        U_32_T  1
14 #endif
15
16 typedef struct ipf_rdx_mask {
17         struct ipf_rdx_mask     *next;
18         struct ipf_rdx_node     *node;
19         u_32_t                  *mask;
20         int                     maskbitcount;
21 } ipf_rdx_mask_t;
22
23 typedef struct ipf_rdx_node {
24         struct ipf_rdx_node     *left;
25         struct ipf_rdx_node     *right;
26         struct ipf_rdx_node     *parent;
27         struct ipf_rdx_node     *dupkey;
28         struct ipf_rdx_mask     *masks;
29         struct ipf_rdx_mask     *mymask;
30         u_32_t                  *addrkey;
31         u_32_t                  *maskkey;
32         u_32_t                  *addroff;
33         u_32_t                  *maskoff;
34         u_32_t                  lastmask;
35         u_32_t                  bitmask;
36         int                     offset;
37         int                     index;
38         int                     maskbitcount;
39         int                     root;
40 #ifdef RDX_DEBUG
41         char                    name[40];
42 #endif
43 } ipf_rdx_node_t;
44
45 struct ipf_rdx_head;
46
47 typedef void            (* radix_walk_func_t)(ipf_rdx_node_t *, void *);
48 typedef ipf_rdx_node_t  *(* idx_hamn_func_t)(struct ipf_rdx_head *,
49                                              addrfamily_t *, addrfamily_t *,
50                                              ipf_rdx_node_t *);
51 typedef ipf_rdx_node_t  *(* idx_ham_func_t)(struct ipf_rdx_head *,
52                                             addrfamily_t *, addrfamily_t *);
53 typedef ipf_rdx_node_t  *(* idx_ha_func_t)(struct ipf_rdx_head *,
54                                            addrfamily_t *);
55 typedef void            (* idx_walk_func_t)(struct ipf_rdx_head *,
56                                             radix_walk_func_t, void *);
57
58 typedef struct ipf_rdx_head {
59         ipf_rdx_node_t  *root;
60         ipf_rdx_node_t  nodes[3];
61         ipfmutex_t      lock;
62         idx_hamn_func_t addaddr;        /* add addr/mask to tree */
63         idx_ham_func_t  deladdr;        /* delete addr/mask from tree */
64         idx_ham_func_t  lookup;         /* look for specific addr/mask */
65         idx_ha_func_t   matchaddr;      /* search tree for address match */
66         idx_walk_func_t walktree;       /* walk entire tree */
67 } ipf_rdx_head_t;
68
69 typedef struct radix_softc {
70         u_char                  *zeros;
71         u_char                  *ones;
72 } radix_softc_t;
73
74 #undef  RADIX_NODE_HEAD_LOCK
75 #undef  RADIX_NODE_HEAD_UNLOCK
76 #ifdef  _KERNEL
77 # define        RADIX_NODE_HEAD_LOCK(x)         MUTEX_ENTER(&(x)->lock)
78 # define        RADIX_NODE_HEAD_UNLOCK(x)       MUTEX_UNLOCK(&(x)->lock)
79 #else
80 # define        RADIX_NODE_HEAD_LOCK(x)
81 # define        RADIX_NODE_HEAD_UNLOCK(x)
82 #endif
83
84 extern  void    *ipf_rx_create __P((void));
85 extern  int     ipf_rx_init __P((void *));
86 extern  void    ipf_rx_destroy __P((void *));   
87 extern  int     ipf_rx_inithead __P((radix_softc_t *, ipf_rdx_head_t **));
88 extern  void    ipf_rx_freehead __P((ipf_rdx_head_t *));
89 extern  ipf_rdx_node_t *ipf_rx_addroute __P((ipf_rdx_head_t *,
90                                              addrfamily_t *, addrfamily_t *,
91                                              ipf_rdx_node_t *));
92 extern  ipf_rdx_node_t *ipf_rx_delete __P((ipf_rdx_head_t *, addrfamily_t *,
93                                            addrfamily_t *));
94 extern  void    ipf_rx_walktree __P((ipf_rdx_head_t *, radix_walk_func_t,
95                                      void *));
96
97 #endif /* __RADIX_IPF_H__ */