Annotation of embedaddon/strongswan/src/libstrongswan/selectors/traffic_selector.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2007-2017 Tobias Brunner
3: * Copyright (C) 2005-2006 Martin Willi
4: * Copyright (C) 2005 Jan Hutter
5: * HSR Hochschule fuer Technik Rapperswil
6: *
7: * This program is free software; you can redistribute it and/or modify it
8: * under the terms of the GNU General Public License as published by the
9: * Free Software Foundation; either version 2 of the License, or (at your
10: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
11: *
12: * This program is distributed in the hope that it will be useful, but
13: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15: * for more details.
16: */
17:
18: /**
19: * @defgroup traffic_selector traffic_selector
20: * @{ @ingroup selectors
21: */
22:
23: #ifndef TRAFFIC_SELECTOR_H_
24: #define TRAFFIC_SELECTOR_H_
25:
26: typedef enum ts_type_t ts_type_t;
27: typedef struct traffic_selector_t traffic_selector_t;
28:
29: #include <library.h>
30: #include <networking/host.h>
31:
32: /**
33: * Traffic selector types.
34: */
35: enum ts_type_t {
36:
37: /**
38: * A range of IPv4 addresses, represented by two four (4) octet
39: * values. The first value is the beginning IPv4 address
40: * (inclusive) and the second value is the ending IPv4 address
41: * (inclusive). All addresses falling between the two specified
42: * addresses are considered to be within the list.
43: */
44: TS_IPV4_ADDR_RANGE = 7,
45:
46: /**
47: * A range of IPv6 addresses, represented by two sixteen (16)
48: * octet values. The first value is the beginning IPv6 address
49: * (inclusive) and the second value is the ending IPv6 address
50: * (inclusive). All addresses falling between the two specified
51: * addresses are considered to be within the list.
52: */
53: TS_IPV6_ADDR_RANGE = 8
54: };
55:
56: /**
57: * enum names for ts_type_t
58: */
59: extern enum_name_t *ts_type_name;
60:
61: /**
62: * Object representing a traffic selector entry.
63: *
64: * A traffic selector defines an range of addresses
65: * and a range of ports.
66: *
67: * If the protocol is ICMP or ICMPv6 the ICMP type and code are stored in the
68: * port field as follows: The message type is placed in the most significant
69: * 8 bits and the code in the least significant 8 bits. Utility functions are
70: * provided to extract the individual values.
71: */
72: struct traffic_selector_t {
73:
74: /**
75: * Compare two traffic selectors, and create a new one
76: * which is the largest subset of both (subnet & port).
77: *
78: * Resulting traffic_selector is newly created and must be destroyed.
79: *
80: * @param other traffic selector to compare
81: * @return
82: * - created subset of them
83: * - or NULL if no match between this and other
84: */
85: traffic_selector_t *(*get_subset)(traffic_selector_t *this,
86: traffic_selector_t *other);
87:
88: /**
89: * Clone a traffic selector.
90: *
91: * @return clone of it
92: */
93: traffic_selector_t *(*clone)(traffic_selector_t *this);
94:
95: /**
96: * Get starting address of this ts as a chunk.
97: *
98: * Chunk is in network order and points to internal data.
99: *
100: * @return chunk containing the address
101: */
102: chunk_t (*get_from_address)(traffic_selector_t *this);
103:
104: /**
105: * Get ending address of this ts as a chunk.
106: *
107: * Chunk is in network order and points to internal data.
108: *
109: * @return chunk containing the address
110: */
111: chunk_t (*get_to_address)(traffic_selector_t *this);
112:
113: /**
114: * Get starting port of this ts.
115: *
116: * Port is in host order, since the parser converts it.
117: *
118: * If the protocol is ICMP/ICMPv6 the ICMP type and code are stored in this
119: * field as follows: The message type is placed in the most significant
120: * 8 bits and the code in the least significant 8 bits. Use the utility
121: * functions to extract them.
122: *
123: * @return port
124: */
125: uint16_t (*get_from_port)(traffic_selector_t *this);
126:
127: /**
128: * Get ending port of this ts.
129: *
130: * Port is in host order, since the parser converts it.
131: *
132: * If the protocol is ICMP/ICMPv6 the ICMP type and code are stored in this
133: * field as follows: The message type is placed in the most significant
134: * 8 bits and the code in the least significant 8 bits. Use the utility
135: * functions to extract them.
136: *
137: * @return port
138: */
139: uint16_t (*get_to_port)(traffic_selector_t *this);
140:
141: /**
142: * Get the type of the traffic selector.
143: *
144: * @return ts_type_t specifying the type
145: */
146: ts_type_t (*get_type)(traffic_selector_t *this);
147:
148: /**
149: * Get the protocol id of this ts.
150: *
151: * @return protocol id
152: */
153: uint8_t (*get_protocol)(traffic_selector_t *this);
154:
155: /**
156: * Check if the traffic selector is for a single host.
157: *
158: * Traffic selector may describe the end of *-to-host tunnel. In this
159: * case, the address range is a single address equal to the hosts
160: * peer address.
161: *
162: * If host is specified, the traffic selector must equal that specific
163: * IP address. If it is not specified, TRUE is also returned for dynamic
164: * traffic selectors.
165: *
166: * @param host IP address to check for, or NULL
167: * @return TRUE if TS is for a single host
168: */
169: bool (*is_host)(traffic_selector_t *this, host_t* host);
170:
171: /**
172: * Check if this traffic selector was created by
173: * traffic_selector_create_dynamic() but no address has yet been set with
174: * set_address().
175: *
176: * @return TRUE if TS is dynamic
177: */
178: bool (*is_dynamic)(traffic_selector_t *this);
179:
180: /**
181: * Set the traffic selector to the given IP address.
182: *
183: * If host is %any or %any6 the traffic selector gets set to 0.0.0.0/0 or
184: * ::/0, respectively.
185: *
186: * Checking is_host(), is_dynamic() or includes() might be appropriate
187: * before calling this.
188: *
189: * is_dynamic() will return FALSE after calling this.
190: *
191: * @param host target IP address
192: */
193: void (*set_address)(traffic_selector_t *this, host_t* host);
194:
195: /**
196: * Compare two traffic selectors for equality.
197: *
198: * @param other ts to compare with this
199: * @return TRUE if equal, FALSE otherwise
200: */
201: bool (*equals)(traffic_selector_t *this, traffic_selector_t *other);
202:
203: /**
204: * Check if a traffic selector is contained completely in another.
205: *
206: * contains() allows to check if multiple traffic selectors are redundant.
207: *
208: * @param other ts that contains this
209: * @return TRUE if other contains this completely, FALSE otherwise
210: */
211: bool (*is_contained_in)(traffic_selector_t *this, traffic_selector_t *other);
212:
213: /**
214: * Check if a specific host is included in the address range of
215: * this traffic selector.
216: *
217: * @param host the host to check
218: */
219: bool (*includes)(traffic_selector_t *this, host_t *host);
220:
221: /**
222: * Convert a traffic selector address range to a subnet
223: * and its net mask.
224: * If from and to ports of this traffic selector are equal,
225: * the port of the returned host_t is set to that port.
226: *
227: * @param net converted subnet (has to be freed)
228: * @param mask converted net mask
229: * @return TRUE if traffic selector matches exactly to the subnet
230: */
231: bool (*to_subnet)(traffic_selector_t *this, host_t **net, uint8_t *mask);
232:
233: /**
234: * Create a hash value for the traffic selector.
235: *
236: * @param inc optional value for incremental hashing
237: * @return calculated hash value for the traffic selector
238: */
239: u_int (*hash)(traffic_selector_t *this, u_int inc);
240:
241: /**
242: * Destroys the ts object
243: */
244: void (*destroy)(traffic_selector_t *this);
245: };
246:
247: /**
248: * Extract the ICMP/ICMPv6 message type from a port in host order
249: *
250: * @param port port number in host order
251: * @return ICMP/ICMPv6 message type
252: */
253: static inline uint8_t traffic_selector_icmp_type(uint16_t port)
254: {
255: return port >> 8;
256: }
257:
258: /**
259: * Extract the ICMP/ICMPv6 message code from a port in host order
260: *
261: * @param port port number in host order
262: * @return ICMP/ICMPv6 message code
263: */
264: static inline uint8_t traffic_selector_icmp_code(uint16_t port)
265: {
266: return port & 0xff;
267: }
268:
269: /**
270: * Compare two traffic selectors, usable as sort function
271: *
272: * @param a first selector to compare
273: * @param b second selector to compare
274: * @param opts optional sort options, currently unused
275: * @return > 0 if a > b, 0 if a == b, < 0 if a < b
276: */
277: int traffic_selector_cmp(traffic_selector_t *a, traffic_selector_t *b,
278: void *opts);
279:
280: /**
281: * Create a new traffic selector using human readable params.
282: *
283: * If protocol is ICMP or ICMPv6 the ports are interpreted as follows: If they
284: * are less than 256 the value is assumed to be a message type, if they are
285: * greater or equal to 256 they are assumed to be type and code as defined
286: * for traffic_selector_t.
287: *
288: * @param protocol protocol for this ts, such as TCP or UDP
289: * @param type type of following addresses, such as TS_IPV4_ADDR_RANGE
290: * @param from_addr start of address range as string
291: * @param from_port port number in host order
292: * @param to_addr end of address range as string
293: * @param to_port port number in host order
294: * @return
295: * - traffic_selector_t object
296: * - NULL if invalid address strings/protocol
297: */
298: traffic_selector_t *traffic_selector_create_from_string(
299: uint8_t protocol, ts_type_t type,
300: char *from_addr, uint16_t from_port,
301: char *to_addr, uint16_t to_port);
302:
303:
304:
305: /**
306: * Create a traffic selector from a CIDR string.
307: *
308: * If protocol is ICMP or ICMPv6 the ports are interpreted as follows: If they
309: * are less than 256 the value is assumed to be a message type, if they are
310: * greater or equal to 256 they are assumed to be type and code as defined
311: * for traffic_selector_t.
312: *
313: * @param string CIDR string, such as 10.1.0.0/16
314: * @param protocol protocol for this ts, such as TCP or UDP
315: * @param from_port start of allowed port range
316: * @param to_port end of port range
317: * @return traffic selector, NULL if string invalid
318: */
319: traffic_selector_t *traffic_selector_create_from_cidr(
320: char *string, uint8_t protocol,
321: uint16_t from_port, uint16_t to_port);
322:
323: /**
324: * Create a new traffic selector using data read from the net.
325: *
326: * There exists a mix of network and host order in the params.
327: * But the parser gives us this data in this format, so we
328: * don't have to convert twice.
329: *
330: * If protocol is ICMP or ICMPv6 the ports are interpreted as follows: If they
331: * are less than 256 the value is assumed to be a message type, if they are
332: * greater or equal to 256 they are assumed to be type and code as defined
333: * for traffic_selector_t.
334: *
335: * @param protocol protocol for this ts, such as TCP or UDP
336: * @param type type of following addresses, such as TS_IPV4_ADDR_RANGE
337: * @param from_address start of address range, network order
338: * @param from_port port number, host order
339: * @param to_address end of address range, network order
340: * @param to_port port number, host order
341: * @return traffic_selector_t object
342: */
343: traffic_selector_t *traffic_selector_create_from_bytes(
344: uint8_t protocol, ts_type_t type,
345: chunk_t from_address, uint16_t from_port,
346: chunk_t to_address, uint16_t to_port);
347:
348: /**
349: * Create a new traffic selector using the RFC 3779 ASN.1 min/max address format
350: *
351: * @param type type of following addresses, such as TS_IPV4_ADDR_RANGE
352: * @param from_addr start of address range in RFC 3779 ASN.1 BIT STRING format
353: * @param to_addr end of address range in RFC 3779 ASN.1 BIT STRING format
354: * @return traffic_selector_t object
355: */
356: traffic_selector_t *traffic_selector_create_from_rfc3779_format(ts_type_t type,
357: chunk_t from_addr, chunk_t to_addr);
358:
359: /**
360: * Create a new traffic selector defining a whole subnet.
361: *
362: * In most cases, definition of a traffic selector for full subnets
363: * is sufficient. This constructor creates a traffic selector for
364: * all protocols, all ports and the address range specified by the
365: * subnet.
366: * Additionally, a protocol and ports may be specified.
367: *
368: * If protocol is ICMP or ICMPv6 the ports are interpreted as follows: If they
369: * are less than 256 the value is assumed to be a message type, if they are
370: * greater or equal to 256 they are assumed to be type and code as defined
371: * for traffic_selector_t.
372: *
373: * @param net subnet to use
374: * @param netbits size of the subnet, as used in e.g. 192.168.0.0/24 notation
375: * @param protocol protocol for this ts, such as TCP or UDP
376: * @param from_port start of allowed port range
377: * @param to_port end of port range
378: * @return
379: * - traffic_selector_t object
380: * - NULL if address family of net not supported
381: */
382: traffic_selector_t *traffic_selector_create_from_subnet(
383: host_t *net, uint8_t netbits, uint8_t protocol,
384: uint16_t from_port, uint16_t to_port);
385:
386: /**
387: * Create a traffic selector for host-to-host cases.
388: *
389: * For host2host or virtual IP setups, the traffic selectors gets
390: * created at runtime using the external/virtual IP. Using this constructor,
391: * a call to set_address() sets this traffic selector to the supplied host.
392: *
393: * If protocol is ICMP or ICMPv6 the ports are interpreted as follows: If they
394: * are less than 256 the value is assumed to be a message type, if they are
395: * greater or equal to 256 they are assumed to be type and code as defined
396: * for traffic_selector_t.
397: *
398: * @param protocol upper layer protocol to allow
399: * @param from_port start of allowed port range
400: * @param to_port end of range
401: * @return
402: * - traffic_selector_t object
403: * - NULL if type not supported
404: */
405: traffic_selector_t *traffic_selector_create_dynamic(uint8_t protocol,
406: uint16_t from_port, uint16_t to_port);
407:
408: /**
409: * printf hook function for traffic_selector_t.
410: *
411: * Arguments are:
412: * traffic_selector_t *ts
413: * With the #-specifier, arguments are:
414: * linked_list_t *list containing traffic_selector_t*
415: */
416: int traffic_selector_printf_hook(printf_hook_data_t *data,
417: printf_hook_spec_t *spec, const void *const *args);
418:
419: #endif /** TRAFFIC_SELECTOR_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>