aboutsummaryrefslogtreecommitdiffstats
path: root/Source/charon/config/traffic_selector.h
blob: f264064819f3229682448e3ccd4fcce82331c430 (plain)
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
/**
 * @file traffic_selector.h
 * 
 * @brief Interface of traffic_selector_t.
 *  
 */

/*
 * Copyright (C) 2005 Jan Hutter, Martin Willi
 * Hochschule fuer Technik Rapperswil
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

#ifndef _TRAFFIC_SELECTOR_H_
#define _TRAFFIC_SELECTOR_H_

#include <types.h>
#include <encoding/payloads/traffic_selector_substructure.h>


typedef struct traffic_selector_t traffic_selector_t;

/**
 * @brief Object representing a traffic selector entry.
 * 
 * A traffic selector defines an range of addresses
 * and a range of ports. 
 * 
 * @ingroup config
 */
struct traffic_selector_t {
	
	/**
	 * @brief Compare two traffic selectors, and create a new one
	 * which is the largest subset of bouth (subnet & port).
	 * 
	 * Resulting traffic_selector is newly created and must be destroyed.
	 * 
	 * @param this		first to compare
	 * @param other		second to compare
	 * @return
	 * 					- created subset of them
	 * 					- or NULL if no match between this and other
	 */
	traffic_selector_t *(*get_subset) (traffic_selector_t *this, traffic_selector_t *other);
	
	/**
	 * @brief Clone a traffic selector.
	 *  
	 * @param this		traffic selector to clone
	 * @return			clone of it
	 */
	traffic_selector_t *(*clone) (traffic_selector_t *this);
	
	/**
	 * @brief Get starting address of this ts as a chunk.
	 * 
	 * Data is in network order and represents the address.
	 * Size depends on protocol.
	 * 
	 * Resulting chunk data is allocated and must be freed!
	 *  
	 * @param this		calling object
	 * @return			chunk containing the address
	 */
	chunk_t (*get_from_address) (traffic_selector_t *this);
	
	/**
	 * @brief Get ending address of this ts as a chunk.
	 * 
	 * Data is in network order and represents the address.
	 * Size depends on protocol.
	 * 
	 * Resulting chunk data is allocated and must be freed!
	 *  
	 * @param this		calling object
	 * @return			chunk containing the address
	 */
	chunk_t (*get_to_address) (traffic_selector_t *this);
	
	/**
	 * @brief Get starting port of this ts.
	 * 
	 * Port is in host order, since the parser converts it.
	 * Size depends on protocol.
	 *  
	 * @param this		calling object
	 * @return			port
	 */
	u_int16_t (*get_from_port) (traffic_selector_t *this);
	
	/**
	 * @brief Get ending port of this ts.
	 * 
	 * Port is in host order, since the parser converts it.
	 * Size depends on protocol.
	 *  
	 * @param this		calling object
	 * @return			port
	 */
	u_int16_t (*get_to_port) (traffic_selector_t *this);
	
	/**
	 * @brief Destroys the ts object
	 * 
	 * 
	 * @param this				calling object
	 */
	void (*destroy) (traffic_selector_t *this);
};

/**
 * @brief Create a new traffic selector using human readable params.
 * 
 * @param protocol 		protocol for this ts, such as TCP or UDP
 * @param type			type of following addresses, such as TS_IPV4_ADDR_RANGE
 * @param from_addr		start of address range as string
 * @param from_port		port number in host order
 * @param to_addr		end of address range as string
 * @param to_port		port number in host order
 * @return
 * 						- created traffic_selector_t
 * 						- NULL if invalid address strings
 * 
 * @ingroup config
 */
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);

/**
 * @brief Create a new traffic selector using data read from the net.
 * 
 * There exists a mix of network and host order in the params.
 * But the parser gives us this data in this format, so we
 * don't have to convert twice.
 * 
 * @param protocol 		protocol for this ts, such as TCP or UDP
 * @param type			type of following addresses, such as TS_IPV4_ADDR_RANGE
 * @param from_addr		start of address range, network order
 * @param from_port		port number, host order
 * @param to_addr		end of address range as string, network
 * @param to_port		port number, host order
 * @return
 * 						- created traffic_selector_t
 * 						- NULL if invalid address strings
 * 
 * @ingroup config
 */
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);

#endif //_TRAFFIC_SELECTOR_H_