aboutsummaryrefslogtreecommitdiff
path: root/src/transport/plugin_transport_udp.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport/plugin_transport_udp.h')
-rw-r--r--src/transport/plugin_transport_udp.h272
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
54GNUNET_NETWORK_STRUCT_BEGIN
55/**
56 * Network format for IPv4 addresses.
57 */
58struct 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 */
75struct 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};
88GNUNET_NETWORK_STRUCT_END
89
90
91/**
92 * UDP Message-Packet header (after defragmentation).
93 */
94struct 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 */
117struct 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
260const char *
261udp_address_to_string (void *cls, const void *addr, size_t addrlen);
262
263void
264udp_broadcast_receive ();
265
266void
267setup_broadcast (struct Plugin *plugin, struct sockaddr_in6 *serverAddrv6, struct sockaddr_in *serverAddrv4);
268
269void
270stop_broadcast (struct Plugin *plugin);
271
272/* end of plugin_transport_udp.h */