diff options
Diffstat (limited to 'src/transport/plugin_transport_udp.h')
-rw-r--r-- | src/transport/plugin_transport_udp.h | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/src/transport/plugin_transport_udp.h b/src/transport/plugin_transport_udp.h new file mode 100644 index 000000000..d3eb192a1 --- /dev/null +++ b/src/transport/plugin_transport_udp.h | |||
@@ -0,0 +1,272 @@ | |||
1 | /* | ||
2 | This file is part of GNUnet | ||
3 | (C) 2010, 2011 Christian Grothoff (and other contributing authors) | ||
4 | |||
5 | GNUnet is free software; you can redistribute it and/or modify | ||
6 | it under the terms of the GNU General Public License as published | ||
7 | by the Free Software Foundation; either version 3, or (at your | ||
8 | option) any later version. | ||
9 | |||
10 | GNUnet is distributed in the hope that it will be useful, but | ||
11 | WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU General Public License | ||
16 | along with GNUnet; see the file COPYING. If not, write to the | ||
17 | Free Software Foundation, Inc., 59 Temple Place - Suite 330, | ||
18 | Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | |||
21 | /** | ||
22 | * @file transport/plugin_transport_udp.h | ||
23 | * @brief Implementation of the UDP transport protocol | ||
24 | * @author Christian Grothoff | ||
25 | * @author Nathan Evans | ||
26 | * @author Matthias Wachs | ||
27 | */ | ||
28 | #include "platform.h" | ||
29 | #include "gnunet_hello_lib.h" | ||
30 | #include "gnunet_util_lib.h" | ||
31 | #include "gnunet_fragmentation_lib.h" | ||
32 | #include "gnunet_nat_lib.h" | ||
33 | #include "gnunet_protocols.h" | ||
34 | #include "gnunet_resolver_service.h" | ||
35 | #include "gnunet_signatures.h" | ||
36 | #include "gnunet_constants.h" | ||
37 | #include "gnunet_statistics_service.h" | ||
38 | #include "gnunet_transport_service.h" | ||
39 | #include "gnunet_transport_plugin.h" | ||
40 | #include "transport.h" | ||
41 | |||
42 | #define LOG(kind,...) GNUNET_log_from (kind, "transport-udp", __VA_ARGS__) | ||
43 | |||
44 | #define DEBUG_UDP GNUNET_NO | ||
45 | #define DEBUG_UDP_BROADCASTING GNUNET_NO | ||
46 | |||
47 | /** | ||
48 | * MTU for fragmentation subsystem. Should be conservative since | ||
49 | * all communicating peers MUST work with this MTU. | ||
50 | */ | ||
51 | #define UDP_MTU 1400 | ||
52 | |||
53 | |||
54 | GNUNET_NETWORK_STRUCT_BEGIN | ||
55 | /** | ||
56 | * Network format for IPv4 addresses. | ||
57 | */ | ||
58 | struct IPv4UdpAddress | ||
59 | { | ||
60 | /** | ||
61 | * IPv4 address, in network byte order. | ||
62 | */ | ||
63 | uint32_t ipv4_addr GNUNET_PACKED; | ||
64 | |||
65 | /** | ||
66 | * Port number, in network byte order. | ||
67 | */ | ||
68 | uint16_t u4_port GNUNET_PACKED; | ||
69 | }; | ||
70 | |||
71 | |||
72 | /** | ||
73 | * Network format for IPv6 addresses. | ||
74 | */ | ||
75 | struct IPv6UdpAddress | ||
76 | { | ||
77 | |||
78 | /** | ||
79 | * IPv6 address. | ||
80 | */ | ||
81 | struct in6_addr ipv6_addr GNUNET_PACKED; | ||
82 | |||
83 | /** | ||
84 | * Port number, in network byte order. | ||
85 | */ | ||
86 | uint16_t u6_port GNUNET_PACKED; | ||
87 | }; | ||
88 | GNUNET_NETWORK_STRUCT_END | ||
89 | |||
90 | |||
91 | /** | ||
92 | * UDP Message-Packet header (after defragmentation). | ||
93 | */ | ||
94 | struct UDPMessage | ||
95 | { | ||
96 | /** | ||
97 | * Message header. | ||
98 | */ | ||
99 | struct GNUNET_MessageHeader header; | ||
100 | |||
101 | /** | ||
102 | * Always zero for now. | ||
103 | */ | ||
104 | uint32_t reserved; | ||
105 | |||
106 | /** | ||
107 | * What is the identity of the sender | ||
108 | */ | ||
109 | struct GNUNET_PeerIdentity sender; | ||
110 | |||
111 | }; | ||
112 | |||
113 | |||
114 | /** | ||
115 | * Encapsulation of all of the state of the plugin. | ||
116 | */ | ||
117 | struct Plugin | ||
118 | { | ||
119 | |||
120 | /** | ||
121 | * Our environment. | ||
122 | */ | ||
123 | struct GNUNET_TRANSPORT_PluginEnvironment *env; | ||
124 | |||
125 | /** | ||
126 | * Session of peers with whom we are currently connected, | ||
127 | * map of peer identity to 'struct PeerSession'. | ||
128 | */ | ||
129 | struct GNUNET_CONTAINER_MultiHashMap *sessions; | ||
130 | |||
131 | /** | ||
132 | * Heap with all of our defragmentation activities. | ||
133 | */ | ||
134 | struct GNUNET_CONTAINER_Heap *defrag_ctxs; | ||
135 | |||
136 | /** | ||
137 | * ID of select task | ||
138 | */ | ||
139 | GNUNET_SCHEDULER_TaskIdentifier select_task; | ||
140 | |||
141 | /** | ||
142 | * Tokenizer for inbound messages. | ||
143 | */ | ||
144 | struct GNUNET_SERVER_MessageStreamTokenizer *mst; | ||
145 | |||
146 | /** | ||
147 | * Bandwidth tracker to limit global UDP traffic. | ||
148 | */ | ||
149 | struct GNUNET_BANDWIDTH_Tracker tracker; | ||
150 | |||
151 | /** | ||
152 | * Address we were told to bind to exclusively (IPv4). | ||
153 | */ | ||
154 | char *bind4_address; | ||
155 | |||
156 | /** | ||
157 | * Address we were told to bind to exclusively (IPv6). | ||
158 | */ | ||
159 | char *bind6_address; | ||
160 | |||
161 | /** | ||
162 | * Handle to NAT traversal support. | ||
163 | */ | ||
164 | struct GNUNET_NAT_Handle *nat; | ||
165 | |||
166 | /** | ||
167 | * FD Read set | ||
168 | */ | ||
169 | struct GNUNET_NETWORK_FDSet *rs; | ||
170 | |||
171 | /** | ||
172 | * FD Write set | ||
173 | */ | ||
174 | struct GNUNET_NETWORK_FDSet *ws; | ||
175 | |||
176 | /** | ||
177 | * The read socket for IPv4 | ||
178 | */ | ||
179 | struct GNUNET_NETWORK_Handle *sockv4; | ||
180 | |||
181 | /** | ||
182 | * The read socket for IPv6 | ||
183 | */ | ||
184 | struct GNUNET_NETWORK_Handle *sockv6; | ||
185 | |||
186 | /** | ||
187 | * Beacon broadcasting | ||
188 | * ------------------- | ||
189 | */ | ||
190 | |||
191 | /** | ||
192 | * Broadcast interval | ||
193 | */ | ||
194 | struct GNUNET_TIME_Relative broadcast_interval; | ||
195 | |||
196 | /** | ||
197 | * Broadcast with IPv4 | ||
198 | */ | ||
199 | int broadcast_ipv4; | ||
200 | |||
201 | /** | ||
202 | * Broadcast with IPv6 | ||
203 | */ | ||
204 | int broadcast_ipv6; | ||
205 | |||
206 | |||
207 | /** | ||
208 | * Tokenizer for inbound messages. | ||
209 | */ | ||
210 | struct GNUNET_SERVER_MessageStreamTokenizer *broadcast_ipv6_mst; | ||
211 | struct GNUNET_SERVER_MessageStreamTokenizer *broadcast_ipv4_mst; | ||
212 | |||
213 | /** | ||
214 | * ID of select broadcast task | ||
215 | */ | ||
216 | GNUNET_SCHEDULER_TaskIdentifier send_ipv4_broadcast_task; | ||
217 | |||
218 | /** | ||
219 | * ID of select broadcast task | ||
220 | */ | ||
221 | GNUNET_SCHEDULER_TaskIdentifier send_ipv6_broadcast_task; | ||
222 | |||
223 | /** | ||
224 | * IPv6 multicast address | ||
225 | */ | ||
226 | struct sockaddr_in6 ipv6_multicast_address; | ||
227 | |||
228 | /** | ||
229 | * DLL of IPv4 broadcast addresses | ||
230 | */ | ||
231 | struct BroadcastAddress *ipv4_broadcast_tail; | ||
232 | struct BroadcastAddress *ipv4_broadcast_head; | ||
233 | |||
234 | /** | ||
235 | * Enable IPv6 | ||
236 | */ | ||
237 | int enable_ipv6; | ||
238 | |||
239 | /** | ||
240 | * Port we broadcasting on. | ||
241 | */ | ||
242 | uint16_t broadcast_port; | ||
243 | |||
244 | /** | ||
245 | * Port we listen on. | ||
246 | */ | ||
247 | uint16_t port; | ||
248 | |||
249 | /** | ||
250 | * Port we advertise on. | ||
251 | */ | ||
252 | uint16_t aport; | ||
253 | |||
254 | struct UDPMessageWrapper *msg_head; | ||
255 | struct UDPMessageWrapper *msg_tail; | ||
256 | |||
257 | }; | ||
258 | |||
259 | |||
260 | const char * | ||
261 | udp_address_to_string (void *cls, const void *addr, size_t addrlen); | ||
262 | |||
263 | void | ||
264 | udp_broadcast_receive (); | ||
265 | |||
266 | void | ||
267 | setup_broadcast (struct Plugin *plugin, struct sockaddr_in6 *serverAddrv6, struct sockaddr_in *serverAddrv4); | ||
268 | |||
269 | void | ||
270 | stop_broadcast (struct Plugin *plugin); | ||
271 | |||
272 | /* end of plugin_transport_udp.h */ | ||