1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _IPP_IPGPC_CLASSIFIER_OBJECTS_H
#define _IPP_IPGPC_CLASSIFIER_OBJECTS_H
#include <sys/time.h>
#include <ipp/ipp.h>
#include <ipp/ipgpc/ipgpc.h>
#ifdef __cplusplus
extern "C" {
#endif
/* common objects and defines used by the ipgpc code base */
/* default wildcard and unspecified value for selectors */
#define IPGPC_WILDCARD -1
#define IPGPC_UNSPECIFIED 0
/* trie id's */
#define IPGPC_TRIE_SPORTID 0
#define IPGPC_TRIE_DPORTID 1
#define IPGPC_TRIE_SADDRID 2
#define IPGPC_TRIE_DADDRID 3
/*
* IPv6 trie id's
* note: tries for SPORT, DPORT are shared between IPv4 and IPv6 filters
*/
#define IPGPC_TRIE_SADDRID6 4
#define IPGPC_TRIE_DADDRID6 5
/* ba table id's */
#define IPGPC_BA_DSID 6
/* table id's */
#define IPGPC_TABLE_PROTOID 7
#define IPGPC_TABLE_UID 8
#define IPGPC_TABLE_PROJID 9
#define IPGPC_TABLE_IF 10
#define IPGPC_TABLE_DIR 11
#define TABLE_ID_OFFSET IPGPC_TABLE_PROTOID
#define PROTOID_IDX (IPGPC_TABLE_PROTOID - TABLE_ID_OFFSET)
#define UID_IDX (IPGPC_TABLE_UID - TABLE_ID_OFFSET)
#define PROJID_IDX (IPGPC_TABLE_PROJID - TABLE_ID_OFFSET)
#define IF_IDX (IPGPC_TABLE_IF - TABLE_ID_OFFSET)
#define DIR_IDX (IPGPC_TABLE_DIR - TABLE_ID_OFFSET)
/* Match types for selector searching */
#define NORMAL_MATCH 0
#define NO_MATCHES 1
#define DONTCARE_ONLY_MATCH 2
/* match masks */
#define PROTO_MASK 0x01
#define DS_MASK 0x02
#define SPORT_MASK 0x04
#define DPORT_MASK 0x08
#define SADDR_MASK 0x10
#define DADDR_MASK 0x20
#define SADDR6_MASK SADDR_MASK
#define DADDR6_MASK DADDR_MASK
#define UID_MASK 0x40
#define PROJID_MASK 0x80
#define IF_MASK 0x100
#define DIR_MASK 0x200
#define ALL_MATCH_MASK (DS_MASK | PROTO_MASK | SADDR_MASK | DADDR_MASK | \
SPORT_MASK | DPORT_MASK | UID_MASK | PROJID_MASK | \
IF_MASK | DIR_MASK)
#define HASH_SIZE 11 /* default hash table size */
/* used when inserting values into selector structures */
#define NORMAL_VALUE 0 /* a valid value was insert */
#define DONTCARE_VALUE 1 /* a dontcare/wildcard value was inserted */
/* filter definition structure */
typedef struct ipgpc_filter_s {
char filter_name[MAXNAMELEN]; /* null terminated name of filter */
/* exact match selectors */
uid_t uid; /* uid key, value = exact or IPGPC_WILDCARD */
projid_t projid; /* project id, " " */
uint_t if_index; /* interface index, " " or 0 for wildcard */
/*
* packet direction
* value = IPP_LOCAL_IN | IPP_LOCAL_OUT |
* IPP_FWD_IN | IPP_FWD_OUT | 0 for wildcard
*/
uint32_t direction;
uint8_t proto; /* protocol key, exact or 0 for wildcard */
/* non-exact match selectors */
uint8_t dsfield; /* diffserv field key */
uint8_t dsfield_mask; /* mask for diffserv field key */
/* IP Addresses are represented as IPV6 address structures */
in6_addr_t saddr; /* source address key */
in6_addr_t saddr_mask; /* mask for saddr key */
char *saddr_hostname; /* hostname of source address, optional */
in6_addr_t daddr; /* destination address key */
in6_addr_t daddr_mask; /* mask for daddr key */
char *daddr_hostname; /* hostname of destination address, optional */
uint16_t sport; /* source port key */
uint16_t sport_mask; /* mask for sport key */
uint16_t dport; /* destination port key */
uint16_t dport_mask; /* mask for dport key */
/* filter ranking variables */
uint32_t precedence; /* precedence value for filter */
uint32_t priority; /* filter priority */
/*
* filter_type accepted values =
* IPGPC_GENERIC_FLTR | IPGPC_V4_FLTR |
* IPGPC_V6_FLTR
*/
uint8_t filter_type;
int32_t filter_instance; /* filter instance number, -1 if unused */
uint32_t originator; /* originator of this config item */
char *filter_comment; /* optional and unused by ipgpc */
} ipgpc_filter_t;
typedef struct ipgpc_class_stats_s {
ipp_action_id_t next_action; /* next action id */
hrtime_t last_match; /* hrtime value of last match to class */
uint64_t nbytes; /* number of matching bytes */
uint64_t npackets; /* number of matching packets */
} ipgpc_class_stats_t;
/* linked list Element node structure */
typedef struct element_node_s *linked_list;
typedef struct element_node_s *plink;
typedef struct element_node_s {
plink next;
void (*element_ref)(struct element_node_s *);
void (*element_unref)(struct element_node_s *);
int id;
uint32_t element_refcnt;
} element_node_t;
/* trie node structure */
typedef struct node_s *node_p;
typedef struct node_s {
linked_list elements; /* pointer to element list */
node_p zero; /* left link */
node_p one; /* right link */
uint32_t val; /* value of bits covered */
uint32_t mask; /* mask of bits covered */
uint8_t bits; /* number of bits covered by this node */
uint8_t pos; /* starting position of bits covered */
uint16_t isroot; /* 1 if is root node, 0 otherwise */
} node_t;
typedef node_p trie;
/* hashtable node structure */
typedef struct ht_node_s *hash_table;
typedef struct ht_node_s *ht_node_p;
typedef struct ht_node_s {
ht_node_p next; /* link to next node in chain */
linked_list elements; /* elements stored at this node */
int key; /* key stored at this node */
int info;
} ht_node_t;
/* behavior aggregate table element structure */
typedef struct ba_table_element_s {
linked_list filter_list; /* list of filters */
uint32_t info;
} ba_table_element_t;
/* behavior aggregate table structure */
typedef struct ba_table_s {
linked_list masks; /* list of loaded masks */
ba_table_element_t masked_values[256]; /* table of masked values */
} ba_table_t;
/* selector information structure */
typedef struct sel_info_s {
uint16_t mask; /* mask for marking */
boolean_t dontcareonly; /* true if only don't cares are loaded */
} sel_info_t;
/* selector statistics structure */
typedef struct sel_stats_s {
uint32_t num_inserted; /* number of nodes that are not dontcares */
uint32_t num_dontcare; /* number of nodes that are dontcares */
} sel_stats_t;
/* identification structure for a trie */
typedef struct trie_id_s {
trie trie; /* pointer to the trie structure */
krwlock_t rw_lock; /* lock protecting this trie */
size_t key_len; /* length (bits) of the key for a lookup */
sel_stats_t stats; /* selector statistics strucutre */
sel_info_t info; /* selector info structure */
} trie_id_t;
/* identification structure for a table */
typedef struct table_id_s {
hash_table table; /* pointer to the hash table structure */
int wildcard; /* wildcard value for this selector */
sel_stats_t stats; /* selector statistics strucutre */
sel_info_t info; /* selector info structure */
} table_id_t;
/* identification structure for a ba_table */
typedef struct ba_table_id_s {
ba_table_t table;
kmutex_t lock; /* ba table lock */
sel_info_t info; /* selector info structure */
sel_stats_t stats; /* selector statistics structure */
} ba_table_id_t;
/* class definition structure */
typedef struct ipgpc_class_s {
ipp_action_id_t next_action; /* id of action at head of list */
boolean_t gather_stats; /* are stats desired? B_TRUE or B_FALSE */
uint32_t originator; /* originator of this config item */
char class_name[MAXNAMELEN]; /* name of classification */
} ipgpc_class_t;
/* filter id association data structure */
typedef struct fid_s {
int info; /* 0 if unused, -1 if dirty, 1 if used */
int class_id; /* id of class associated with filter */
uint16_t insert_map; /* selectors w/ values inserted for this fid */
ipgpc_filter_t filter; /* filter structure that this fid describes */
} fid_t;
/* class_id structure */
typedef struct cid_s {
linked_list filter_list; /* list of filters associated with class */
int info; /* 0 if unused, -1 if dirty, 1 if used */
ipgpc_class_t aclass; /* the class structure this cid describes */
ipp_stat_t *cl_stats; /* kstats structure */
ipgpc_class_stats_t stats; /* statistics structure for class */
} cid_t;
/* ipp_stat global stats structure */
typedef struct globalstats_s {
ipp_named_t nfilters;
ipp_named_t nclasses;
ipp_named_t nbytes;
ipp_named_t npackets;
ipp_named_t epackets;
} globalstats_t;
/* ipp_stat class stats structure */
typedef struct classstats_s {
ipp_named_t nbytes;
ipp_named_t npackets;
ipp_named_t last_match;
} classstats_t;
/* matching hash table element */
typedef struct ht_match_s *ht_chain;
typedef struct ht_match_s {
ht_chain next; /* link to next node in chain */
int key; /* key stored at this node in the table */
uint16_t match_map; /* match map for this id */
} ht_match_t;
extern kmem_cache_t *ht_node_cache;
extern kmem_cache_t *element_node_cache;
extern kmem_cache_t *ht_match_cache;
extern kmem_cache_t *trie_node_cache;
#ifdef __cplusplus
}
#endif
#endif /* _IPP_IPGPC_CLASSIFIER_OBJECTS_H */
|