performance API indicates disconnect
[oweals/gnunet.git] / src / include / gnunet_nat_lib.h
1 /*
2      This file is part of GNUnet.
3      (C) 2007-2014 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 include/gnunet_nat_lib.h
23  * @brief Library handling UPnP and NAT-PMP port forwarding and
24  *     external IP address retrieval
25  * @author Christian Grothoff
26  * @author Milan Bouchet-Valat
27  */
28
29 #ifndef GNUNET_NAT_LIB_H
30 #define GNUNET_NAT_LIB_H
31
32 #include "gnunet_util_lib.h"
33
34
35 /**
36  * Signature of the callback passed to #GNUNET_NAT_register() for
37  * a function to call whenever our set of 'valid' addresses changes.
38  *
39  * @param cls closure
40  * @param add_remove #GNUNET_YES to mean the new public IP address, #GNUNET_NO to mean
41  *     the previous (now invalid) one
42  * @param addr either the previous or the new public IP address
43  * @param addrlen actual length of the @a addr
44  */
45 typedef void
46 (*GNUNET_NAT_AddressCallback) (void *cls,
47                                int add_remove,
48                                const struct sockaddr *addr,
49                                socklen_t addrlen);
50
51
52 /**
53  * Signature of the callback passed to #GNUNET_NAT_register().
54  * for a function to call whenever someone asks us to do connection
55  * reversal.
56  *
57  * @param cls closure
58  * @param addr public IP address of the other peer
59  * @param addrlen actual lenght of the @a addr
60  */
61 typedef void
62 (*GNUNET_NAT_ReversalCallback) (void *cls,
63                                 const struct sockaddr *addr,
64                                 socklen_t addrlen);
65
66
67 /**
68  * Handle for active NAT registrations.
69  */
70 struct GNUNET_NAT_Handle;
71
72
73 /**
74  * Error Types for the NAT subsystem (which can then later be converted/resolved to a string)
75  */
76 enum GNUNET_NAT_FailureCode {
77   /**
78    * Just the default
79    */
80   GNUNET_NAT_ERROR_SUCCESS = GNUNET_OK,
81   
82   /**
83    * `upnpc` command not found
84    */
85   GNUNET_NAT_ERROR_UPNPC_NOT_FOUND,
86   
87   /**
88    * Failed to run `upnpc` command
89    */
90   GNUNET_NAT_ERROR_UPNPC_FAILED,
91   
92   /**
93    * `upnpc' command took too long, process killed
94    */
95   GNUNET_NAT_ERROR_UPNPC_TIMEOUT,
96   
97   /**
98    * `upnpc' command failed to establish port mapping
99    */
100   GNUNET_NAT_ERROR_UPNPC_PORTMAP_FAILED,
101   
102   /**
103    * `external-ip' command not found
104    */
105   GNUNET_NAT_ERROR_EXTERNAL_IP_UTILITY_NOT_FOUND,
106   
107   /**
108    * "no valid address was returned by `external-ip'"
109    */
110   GNUNET_NAT_ERROR_EXTERNAL_IP_NO_VALID_ADDRESS_FOUND,
111   
112   
113   
114   /**
115    * 
116    */
117   GNUNET_NAT_ERROR_,
118   
119   
120 };
121
122
123 /**
124  * Attempt to enable port redirection and detect public IP address
125  * contacting UPnP or NAT-PMP routers on the local network. Use addr
126  * to specify to which of the local host's addresses should the
127  * external port be mapped. The port is taken from the corresponding
128  * sockaddr_in[6] field.  The NAT module should call the given
129  * callback for any 'plausible' external address.
130  *
131  * @param cfg configuration to use
132  * @param is_tcp #GNUNET_YES for TCP, #GNUNET_NO for UDP
133  * @param adv_port advertised port (port we are either bound to or that our OS
134  *                 locally performs redirection from to our bound port).
135  * @param num_addrs number of addresses in @a addrs
136  * @param addrs list of local addresses packets should be redirected to
137  * @param addrlens actual lengths of the addresses in @a addrs
138  * @param address_callback function to call everytime the public IP address changes
139  * @param reversal_callback function to call if someone wants connection reversal from us,
140  *        NULL if connection reversal is not supported
141  * @param callback_cls closure for callbacks
142  * @return NULL on error, otherwise handle that can be used to unregister
143  */
144 struct GNUNET_NAT_Handle *
145 GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg,
146                      int is_tcp,
147                      uint16_t adv_port,
148                      unsigned int num_addrs,
149                      const struct sockaddr **addrs,
150                      const socklen_t *addrlens,
151                      GNUNET_NAT_AddressCallback address_callback,
152                      GNUNET_NAT_ReversalCallback reversal_callback,
153                      void *callback_cls);
154
155
156 /**
157  * Test if the given address is (currently) a plausible IP address for
158  * this peer.
159  *
160  * @param h the handle returned by register
161  * @param addr IP address to test (IPv4 or IPv6)
162  * @param addrlen number of bytes in @a addr
163  * @return #GNUNET_YES if the address is plausible,
164  *         #GNUNET_NO if the address is not plausible,
165  *         #GNUNET_SYSERR if the address is malformed
166  */
167 int
168 GNUNET_NAT_test_address (struct GNUNET_NAT_Handle *h,
169                          const void *addr,
170                          socklen_t addrlen);
171
172
173 /**
174  * We learned about a peer (possibly behind NAT) so run the
175  * gnunet-nat-client to send dummy ICMP responses to cause
176  * that peer to connect to us (connection reversal).
177  *
178  * @param h handle (used for configuration)
179  * @param sa the address of the peer (IPv4-only)
180  * @return #GNUNET_SYSERR on error, #GNUNET_NO if nat client is disabled,
181  *         #GNUNET_OK otherwise
182  */
183 int
184 GNUNET_NAT_run_client (struct GNUNET_NAT_Handle *h,
185                        const struct sockaddr_in *sa);
186
187
188 /**
189  * Stop port redirection and public IP address detection for the given
190  * handle.  This frees the handle, after having sent the needed
191  * commands to close open ports.
192  *
193  * @param h the handle to stop
194  */
195 void
196 GNUNET_NAT_unregister (struct GNUNET_NAT_Handle *h);
197
198
199 /**
200  * Handle to a NAT test.
201  */
202 struct GNUNET_NAT_Test;
203
204
205 /**
206  * Function called to report success or failure for
207  * NAT configuration test.
208  *
209  * @param cls closure
210  * @param result GNUNET_NAT_ERROR_SUCCESS on success, otherwise the specific error code
211  */
212 typedef void (*GNUNET_NAT_TestCallback) (void *cls,
213                                          enum GNUNET_NAT_FailureCode result);
214
215
216 /**
217  * Start testing if NAT traversal works using the
218  * given configuration (IPv4-only).
219  *
220  * @param cfg configuration for the NAT traversal
221  * @param is_tcp #GNUNET_YES to test TCP, #GNUNET_NO to test UDP
222  * @param bnd_port port to bind to, 0 for connection reversal
223  * @param adv_port externally advertised port to use
224  * @param report function to call with the result of the test
225  * @param report_cls closure for @a report
226  * @return handle to cancel NAT test
227  */
228 struct GNUNET_NAT_Test *
229 GNUNET_NAT_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
230                        int is_tcp,
231                        uint16_t bnd_port,
232                        uint16_t adv_port,
233                        GNUNET_NAT_TestCallback report,
234                        void *report_cls);
235
236
237 /**
238  * Stop an active NAT test.
239  *
240  * @param tst test to stop.
241  */
242 void
243 GNUNET_NAT_test_stop (struct GNUNET_NAT_Test *tst);
244
245
246 /**
247  * Signature of a callback that is given an IP address.
248  *
249  * @param cls closure
250  * @param addr the address, NULL on errors
251  * @param result GNUNET_NAT_ERROR_SUCCESS on success, otherwise the specific error code
252  */
253 typedef void (*GNUNET_NAT_IPCallback) (void *cls,
254                                        const struct in_addr *addr,
255                                        enum GNUNET_NAT_FailureCode result);
256
257
258
259 /**
260  * Opaque handle to cancel #GNUNET_NAT_mini_get_external_ipv4() operation.
261  */
262 struct GNUNET_NAT_ExternalHandle;
263
264
265 /**
266  * Try to get the external IPv4 address of this peer.
267  *
268  * @param timeout when to fail
269  * @param cb function to call with result
270  * @param cb_cls closure for @a cb
271  * @return handle for cancellation (can only be used until @a cb is called), NULL on error
272  */
273 struct GNUNET_NAT_ExternalHandle *
274 GNUNET_NAT_mini_get_external_ipv4 (struct GNUNET_TIME_Relative timeout,
275                                    GNUNET_NAT_IPCallback cb,
276                                    void *cb_cls);
277
278
279 /**
280  * Cancel operation.
281  *
282  * @param eh operation to cancel
283  */
284 void
285 GNUNET_NAT_mini_get_external_ipv4_cancel (struct GNUNET_NAT_ExternalHandle *eh);
286
287
288 /**
289  * Handle to a mapping created with upnpc.
290  */
291 struct GNUNET_NAT_MiniHandle;
292
293
294 /**
295  * Signature of the callback passed to #GNUNET_NAT_register() for
296  * a function to call whenever our set of 'valid' addresses changes.
297  *
298  * @param cls closure
299  * @param add_remove #GNUNET_YES to mean the new public IP address, #GNUNET_NO to mean
300  *     the previous (now invalid) one, #GNUNET_SYSERR indicates an error
301  * @param addr either the previous or the new public IP address
302  * @param addrlen actual length of the @a addr
303  * @param result GNUNET_NAT_ERROR_SUCCESS on success, otherwise the specific error code
304  */
305 typedef void
306 (*GNUNET_NAT_MiniAddressCallback) (void *cls,
307                                    int add_remove,
308                                    const struct sockaddr *addr,
309                                    socklen_t addrlen,
310                                    enum GNUNET_NAT_FailureCode result);
311
312
313 /**
314  * Start mapping the given port using (mini)upnpc.  This function
315  * should typically not be used directly (it is used within the
316  * general-purpose #GNUNET_NAT_register() code).  However, it can be
317  * used if specifically UPnP-based NAT traversal is to be used or
318  * tested.
319  *
320  * @param port port to map
321  * @param is_tcp #GNUNET_YES to map TCP, #GNUNET_NO for UDP
322  * @param ac function to call with mapping result
323  * @param ac_cls closure for @a ac
324  * @return NULL on error
325  */
326 struct GNUNET_NAT_MiniHandle *
327 GNUNET_NAT_mini_map_start (uint16_t port,
328                            int is_tcp,
329                            GNUNET_NAT_MiniAddressCallback ac,
330                            void *ac_cls);
331
332
333 /**
334  * Remove a mapping created with (mini)upnpc.  Calling
335  * this function will give 'upnpc' 1s to remove the mapping,
336  * so while this function is non-blocking, a task will be
337  * left with the scheduler for up to 1s past this call.
338  *
339  * @param mini the handle
340  */
341 void
342 GNUNET_NAT_mini_map_stop (struct GNUNET_NAT_MiniHandle *mini);
343
344
345 /**
346  * Handle to auto-configuration in progress.
347  */
348 struct GNUNET_NAT_AutoHandle;
349
350
351 /**
352  * Function called with the result from the autoconfiguration.
353  *
354  * @param cls closure
355  * @param diff minimal suggested changes to the original configuration
356  *             to make it work (as best as we can)
357  * @param result GNUNET_NAT_ERROR_SUCCESS on success, otherwise the specific error code
358  */
359 typedef void
360 (*GNUNET_NAT_AutoResultCallback)(void *cls,
361                                  const struct GNUNET_CONFIGURATION_Handle *diff,
362                                  enum GNUNET_NAT_FailureCode result);
363
364
365 /**
366  * Start auto-configuration routine.  The resolver service should
367  * be available when this function is called.
368  *
369  * @param cfg initial configuration
370  * @param cb function to call with autoconfiguration result
371  * @param cb_cls closure for @a cb
372  * @return handle to cancel operation
373  */
374 struct GNUNET_NAT_AutoHandle *
375 GNUNET_NAT_autoconfig_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
376                              GNUNET_NAT_AutoResultCallback cb,
377                              void *cb_cls);
378
379
380 /**
381  * Abort autoconfiguration.
382  *
383  * @param ah handle for operation to abort
384  */
385 void
386 GNUNET_NAT_autoconfig_cancel (struct GNUNET_NAT_AutoHandle *ah);
387
388 #endif
389
390 /* end of gnunet_nat_lib.h */