- creation of ts payloads using ts
[strongswan.git] / Source / charon / config / traffic_selector.h
1 /**
2 * @file traffic_selector.h
3 *
4 * @brief Interface of traffic_selector_t.
5 *
6 */
7
8 /*
9 * Copyright (C) 2005 Jan Hutter, Martin Willi
10 * Hochschule fuer Technik Rapperswil
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 * for more details.
21 */
22
23 #ifndef _TRAFFIC_SELECTOR_H_
24 #define _TRAFFIC_SELECTOR_H_
25
26 #include <types.h>
27
28 typedef enum ts_type_t ts_type_t;
29
30 /**
31 * Traffic selector Types.
32 *
33 * @ingroup config
34 */
35 enum ts_type_t {
36 /*
37 * A range of IPv4 addresses, represented by two four (4) octet
38 * values. The first value is the beginning IPv4 address
39 * (inclusive) and the second value is the ending IPv4 address
40 * (inclusive). All addresses falling between the two specified
41 * addresses are considered to be within the list.
42 */
43 TS_IPV4_ADDR_RANGE = 7,
44 /*
45 * A range of IPv6 addresses, represented by two sixteen (16)
46 * octet values. The first value is the beginning IPv6 address
47 * (inclusive) and the second value is the ending IPv6 address
48 * (inclusive). All addresses falling between the two specified
49 * addresses are considered to be within the list.
50 */
51 TS_IPV6_ADDR_RANGE = 8
52 };
53
54 /**
55 * string mappings for ts_type_t
56 */
57 extern mapping_t ts_type_m[];
58
59
60 typedef struct traffic_selector_t traffic_selector_t;
61
62 /**
63 * @brief Object representing a traffic selector entry.
64 *
65 * A traffic selector defines an range of addresses
66 * and a range of ports.
67 *
68 * @ingroup config
69 */
70 struct traffic_selector_t {
71
72 /**
73 * @brief Compare two traffic selectors, and create a new one
74 * which is the largest subset of bouth (subnet & port).
75 *
76 * Resulting traffic_selector is newly created and must be destroyed.
77 *
78 * @param this first to compare
79 * @param other second to compare
80 * @return
81 * - created subset of them
82 * - or NULL if no match between this and other
83 */
84 traffic_selector_t *(*get_subset) (traffic_selector_t *this, traffic_selector_t *other);
85
86 /**
87 * @brief Clone a traffic selector.
88 *
89 * @param this traffic selector to clone
90 * @return clone of it
91 */
92 traffic_selector_t *(*clone) (traffic_selector_t *this);
93
94 /**
95 * @brief Get starting address of this ts as a chunk.
96 *
97 * Data is in network order and represents the address.
98 * Size depends on protocol.
99 *
100 * Resulting chunk data is allocated and must be freed!
101 *
102 * @param this calling object
103 * @return chunk containing the address
104 */
105 chunk_t (*get_from_address) (traffic_selector_t *this);
106
107 /**
108 * @brief Get ending address of this ts as a chunk.
109 *
110 * Data is in network order and represents the address.
111 * Size depends on protocol.
112 *
113 * Resulting chunk data is allocated and must be freed!
114 *
115 * @param this calling object
116 * @return chunk containing the address
117 */
118 chunk_t (*get_to_address) (traffic_selector_t *this);
119
120 /**
121 * @brief Get starting port of this ts.
122 *
123 * Port is in host order, since the parser converts it.
124 * Size depends on protocol.
125 *
126 * @param this calling object
127 * @return port
128 */
129 u_int16_t (*get_from_port) (traffic_selector_t *this);
130
131 /**
132 * @brief Get ending port of this ts.
133 *
134 * Port is in host order, since the parser converts it.
135 * Size depends on protocol.
136 *
137 * @param this calling object
138 * @return port
139 */
140 u_int16_t (*get_to_port) (traffic_selector_t *this);
141
142 /**
143 * @brief Get the type of the traffic selector.
144 *
145 * @param this calling obect
146 * @return ts_type_t specifying the type
147 */
148 ts_type_t (*get_type) (traffic_selector_t *this);
149
150 /**
151 * @brief Get the protocol id of this ts.
152 *
153 * @param this calling obect
154 * @return protocol id
155 */
156 u_int8_t (*get_protocol) (traffic_selector_t *this);
157
158 /**
159 * @brief Destroys the ts object
160 *
161 *
162 * @param this calling object
163 */
164 void (*destroy) (traffic_selector_t *this);
165 };
166
167 /**
168 * @brief Create a new traffic selector using human readable params.
169 *
170 * @param protocol protocol for this ts, such as TCP or UDP
171 * @param type type of following addresses, such as TS_IPV4_ADDR_RANGE
172 * @param from_addr start of address range as string
173 * @param from_port port number in host order
174 * @param to_addr end of address range as string
175 * @param to_port port number in host order
176 * @return
177 * - created traffic_selector_t
178 * - NULL if invalid address strings
179 *
180 * @ingroup config
181 */
182 traffic_selector_t *traffic_selector_create_from_string(u_int8_t protocol, ts_type_t type, char *from_addr, u_int16_t from_port, char *to_addr, u_int16_t to_port);
183
184 /**
185 * @brief Create a new traffic selector using data read from the net.
186 *
187 * There exists a mix of network and host order in the params.
188 * But the parser gives us this data in this format, so we
189 * don't have to convert twice.
190 *
191 * @param protocol protocol for this ts, such as TCP or UDP
192 * @param type type of following addresses, such as TS_IPV4_ADDR_RANGE
193 * @param from_addr start of address range, network order
194 * @param from_port port number, host order
195 * @param to_addr end of address range as string, network
196 * @param to_port port number, host order
197 * @return
198 * - created traffic_selector_t
199 * - NULL if invalid address strings
200 *
201 * @ingroup config
202 */
203 traffic_selector_t *traffic_selector_create_from_bytes(u_int8_t protocol, ts_type_t type, chunk_t from_address, int16_t from_port, chunk_t to_address, u_int16_t to_port);
204
205 #endif //_TRAFFIC_SELECTOR_H_