Forget to commit some files
[oweals/gnunet.git] / src / include / gnunet_nat_lib.h
1 /*
2      This file is part of GNUnet.
3      Copyright (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., 51 Franklin Street, Fifth Floor,
18      Boston, MA 02110-1301, 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_StatusCode
77 {
78   /**
79    * Just the default
80    */
81   GNUNET_NAT_ERROR_SUCCESS = GNUNET_OK,
82
83   /**
84    * IPC Failure
85    */
86   GNUNET_NAT_ERROR_IPC_FAILURE,
87
88   /**
89    * Failure in network subsystem, check permissions
90    */
91   GNUNET_NAT_ERROR_INTERNAL_NETWORK_ERROR,
92
93   /**
94    * test timed out
95    */
96   GNUNET_NAT_ERROR_TIMEOUT,
97
98   /**
99    * detected that we are offline
100    */
101   GNUNET_NAT_ERROR_NOT_ONLINE,
102
103   /**
104    * `upnpc` command not found
105    */
106   GNUNET_NAT_ERROR_UPNPC_NOT_FOUND,
107
108   /**
109    * Failed to run `upnpc` command
110    */
111   GNUNET_NAT_ERROR_UPNPC_FAILED,
112
113   /**
114    * `upnpc' command took too long, process killed
115    */
116   GNUNET_NAT_ERROR_UPNPC_TIMEOUT,
117
118   /**
119    * `upnpc' command failed to establish port mapping
120    */
121   GNUNET_NAT_ERROR_UPNPC_PORTMAP_FAILED,
122
123   /**
124    * `external-ip' command not found
125    */
126   GNUNET_NAT_ERROR_EXTERNAL_IP_UTILITY_NOT_FOUND,
127
128   /**
129    * Failed to run `external-ip` command
130    */
131   GNUNET_NAT_ERROR_EXTERNAL_IP_UTILITY_FAILED,
132
133   /**
134    * `external-ip' command output invalid
135    */
136   GNUNET_NAT_ERROR_EXTERNAL_IP_UTILITY_OUTPUT_INVALID,
137
138   /**
139    * "no valid address was returned by `external-ip'"
140    */
141   GNUNET_NAT_ERROR_EXTERNAL_IP_ADDRESS_INVALID,
142
143   /**
144    * Could not determine interface with internal/local network address
145    */
146   GNUNET_NAT_ERROR_NO_VALID_IF_IP_COMBO,
147
148   /**
149    * No working gnunet-helper-nat-server found
150    */
151   GNUNET_NAT_ERROR_HELPER_NAT_SERVER_NOT_FOUND,
152
153   /**
154    * NAT test could not be initialized
155    */
156   GNUNET_NAT_ERROR_NAT_TEST_START_FAILED,
157
158   /**
159    * NAT test timeout
160    */
161   GNUNET_NAT_ERROR_NAT_TEST_TIMEOUT,
162
163   /**
164    * NAT test failed to initiate
165    */
166   GNUNET_NAT_ERROR_NAT_REGISTER_FAILED,
167
168   /**
169    *
170    */
171   GNUNET_NAT_ERROR_HELPER_NAT_CLIENT_NOT_FOUND,
172
173
174
175   /**
176    *
177    */
178   GNUNET_NAT_ERROR_
179 };
180
181
182 /**
183  * Converts `enum GNUNET_NAT_StatusCode` to string
184  *
185  * @param err error code to resolve to a string
186  * @return point to a static string containing the error code
187  */
188 const char *
189 GNUNET_NAT_status2string (enum GNUNET_NAT_StatusCode err);
190
191
192 /**
193  * Attempt to enable port redirection and detect public IP address
194  * contacting UPnP or NAT-PMP routers on the local network. Use addr
195  * to specify to which of the local host's addresses should the
196  * external port be mapped. The port is taken from the corresponding
197  * sockaddr_in[6] field.  The NAT module should call the given
198  * callback for any 'plausible' external address.
199  *
200  * @param cfg configuration to use
201  * @param is_tcp #GNUNET_YES for TCP, #GNUNET_NO for UDP
202  * @param adv_port advertised port (port we are either bound to or that our OS
203  *                 locally performs redirection from to our bound port).
204  * @param num_addrs number of addresses in @a addrs
205  * @param addrs list of local addresses packets should be redirected to
206  * @param addrlens actual lengths of the addresses in @a addrs
207  * @param address_callback function to call everytime the public IP address changes
208  * @param reversal_callback function to call if someone wants connection reversal from us,
209  *        NULL if connection reversal is not supported
210  * @param callback_cls closure for callbacks
211  * @return NULL on error, otherwise handle that can be used to unregister
212  */
213 struct GNUNET_NAT_Handle *
214 GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg,
215                      int is_tcp,
216                      uint16_t adv_port,
217                      unsigned int num_addrs,
218                      const struct sockaddr **addrs,
219                      const socklen_t *addrlens,
220                      GNUNET_NAT_AddressCallback address_callback,
221                      GNUNET_NAT_ReversalCallback reversal_callback,
222                      void *callback_cls,
223                      struct GNUNET_NETWORK_Handle* sock);
224
225
226 /**
227  * Test if the given address is (currently) a plausible IP address for
228  * this peer.
229  *
230  * @param h the handle returned by register
231  * @param addr IP address to test (IPv4 or IPv6)
232  * @param addrlen number of bytes in @a addr
233  * @return #GNUNET_YES if the address is plausible,
234  *         #GNUNET_NO if the address is not plausible,
235  *         #GNUNET_SYSERR if the address is malformed
236  */
237 int
238 GNUNET_NAT_test_address (struct GNUNET_NAT_Handle *h,
239                          const void *addr,
240                          socklen_t addrlen);
241
242
243 /**
244  * We learned about a peer (possibly behind NAT) so run the
245  * gnunet-nat-client to send dummy ICMP responses to cause
246  * that peer to connect to us (connection reversal).
247  *
248  * @param h handle (used for configuration)
249  * @param sa the address of the peer (IPv4-only)
250  * @return #GNUNET_SYSERR on error, #GNUNET_NO if nat client is disabled,
251  *         #GNUNET_OK otherwise
252  */
253 int
254 GNUNET_NAT_run_client (struct GNUNET_NAT_Handle *h,
255                        const struct sockaddr_in *sa);
256
257
258 /**
259  * Stop port redirection and public IP address detection for the given
260  * handle.  This frees the handle, after having sent the needed
261  * commands to close open ports.
262  *
263  * @param h the handle to stop
264  */
265 void
266 GNUNET_NAT_unregister (struct GNUNET_NAT_Handle *h);
267
268
269 /**
270  * Handle to a NAT test.
271  */
272 struct GNUNET_NAT_Test;
273
274
275 /**
276  * Function called to report success or failure for
277  * NAT configuration test.
278  *
279  * @param cls closure
280  * @param result #GNUNET_NAT_ERROR_SUCCESS on success, otherwise the specific error code
281  */
282 typedef void (*GNUNET_NAT_TestCallback) (void *cls,
283                                          enum GNUNET_NAT_StatusCode result);
284
285
286 /**
287  * Start testing if NAT traversal works using the
288  * given configuration (IPv4-only).
289  *
290  * @param cfg configuration for the NAT traversal
291  * @param is_tcp #GNUNET_YES to test TCP, #GNUNET_NO to test UDP
292  * @param bnd_port port to bind to, 0 for connection reversal
293  * @param adv_port externally advertised port to use
294  * @param timeout delay after which the test should be aborted
295  * @param report function to call with the result of the test;
296  *               you still must call #GNUNET_NAT_test_stop().
297  * @param report_cls closure for @a report
298  * @return handle to cancel NAT test
299  */
300 struct GNUNET_NAT_Test *
301 GNUNET_NAT_test_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
302                        int is_tcp,
303                        uint16_t bnd_port,
304                        uint16_t adv_port,
305                        struct GNUNET_TIME_Relative timeout,
306                        GNUNET_NAT_TestCallback report,
307                        void *report_cls);
308
309
310 /**
311  * Stop an active NAT test.
312  *
313  * @param tst test to stop.
314  */
315 void
316 GNUNET_NAT_test_stop (struct GNUNET_NAT_Test *tst);
317
318
319 /**
320  * Signature of a callback that is given an IP address.
321  *
322  * @param cls closure
323  * @param addr the address, NULL on errors
324  * @param result #GNUNET_NAT_ERROR_SUCCESS on success, otherwise the specific error code
325  */
326 typedef void (*GNUNET_NAT_IPCallback) (void *cls,
327                                        const struct in_addr *addr,
328                                        enum GNUNET_NAT_StatusCode result);
329
330
331
332 /**
333  * Opaque handle to cancel #GNUNET_NAT_mini_get_external_ipv4() operation.
334  */
335 struct GNUNET_NAT_ExternalHandle;
336
337
338 /**
339  * Try to get the external IPv4 address of this peer.
340  *
341  * @param timeout when to fail
342  * @param cb function to call with result
343  * @param cb_cls closure for @a cb
344  * @return handle for cancellation (can only be used until @a cb is called), NULL on error
345  */
346 struct GNUNET_NAT_ExternalHandle *
347 GNUNET_NAT_mini_get_external_ipv4 (struct GNUNET_TIME_Relative timeout,
348                                    GNUNET_NAT_IPCallback cb,
349                                    void *cb_cls);
350
351
352 /**
353  * Cancel operation.
354  *
355  * @param eh operation to cancel
356  */
357 void
358 GNUNET_NAT_mini_get_external_ipv4_cancel (struct GNUNET_NAT_ExternalHandle *eh);
359
360
361 /**
362  * Handle to a mapping created with upnpc.
363  */
364 struct GNUNET_NAT_MiniHandle;
365
366
367 /**
368  * Signature of the callback passed to #GNUNET_NAT_register() for
369  * a function to call whenever our set of 'valid' addresses changes.
370  *
371  * @param cls closure
372  * @param add_remove #GNUNET_YES to mean the new public IP address, #GNUNET_NO to mean
373  *     the previous (now invalid) one, #GNUNET_SYSERR indicates an error
374  * @param addr either the previous or the new public IP address
375  * @param addrlen actual length of the @a addr
376  * @param result #GNUNET_NAT_ERROR_SUCCESS on success, otherwise the specific error code
377  */
378 typedef void
379 (*GNUNET_NAT_MiniAddressCallback) (void *cls,
380                                    int add_remove,
381                                    const struct sockaddr *addr,
382                                    socklen_t addrlen,
383                                    enum GNUNET_NAT_StatusCode result);
384
385
386 /**
387  * Start mapping the given port using (mini)upnpc.  This function
388  * should typically not be used directly (it is used within the
389  * general-purpose #GNUNET_NAT_register() code).  However, it can be
390  * used if specifically UPnP-based NAT traversal is to be used or
391  * tested.
392  *
393  * @param port port to map
394  * @param is_tcp #GNUNET_YES to map TCP, #GNUNET_NO for UDP
395  * @param ac function to call with mapping result
396  * @param ac_cls closure for @a ac
397  * @return NULL on error
398  */
399 struct GNUNET_NAT_MiniHandle *
400 GNUNET_NAT_mini_map_start (uint16_t port,
401                            int is_tcp,
402                            GNUNET_NAT_MiniAddressCallback ac,
403                            void *ac_cls);
404
405
406 /**
407  * Remove a mapping created with (mini)upnpc.  Calling
408  * this function will give 'upnpc' 1s to remove the mapping,
409  * so while this function is non-blocking, a task will be
410  * left with the scheduler for up to 1s past this call.
411  *
412  * @param mini the handle
413  */
414 void
415 GNUNET_NAT_mini_map_stop (struct GNUNET_NAT_MiniHandle *mini);
416
417
418 /**
419  * Handle to auto-configuration in progress.
420  */
421 struct GNUNET_NAT_AutoHandle;
422
423
424 /**
425  * Function called with the result from the autoconfiguration.
426  *
427  * @param cls closure
428  * @param diff minimal suggested changes to the original configuration
429  *             to make it work (as best as we can)
430  * @param result #GNUNET_NAT_ERROR_SUCCESS on success, otherwise the specific error code
431  */
432 typedef void
433 (*GNUNET_NAT_AutoResultCallback)(void *cls,
434                                  const struct GNUNET_CONFIGURATION_Handle *diff,
435                                  enum GNUNET_NAT_StatusCode result);
436
437
438 /**
439  * Start auto-configuration routine.  The resolver service should
440  * be available when this function is called.
441  *
442  * @param cfg initial configuration
443  * @param cb function to call with autoconfiguration result
444  * @param cb_cls closure for @a cb
445  * @return handle to cancel operation
446  */
447 struct GNUNET_NAT_AutoHandle *
448 GNUNET_NAT_autoconfig_start (const struct GNUNET_CONFIGURATION_Handle *cfg,
449                              GNUNET_NAT_AutoResultCallback cb,
450                              void *cb_cls);
451
452
453 /**
454  * Abort autoconfiguration.
455  *
456  * @param ah handle for operation to abort
457  */
458 void
459 GNUNET_NAT_autoconfig_cancel (struct GNUNET_NAT_AutoHandle *ah);
460
461 /**
462  * Handle for active STUN Requests.
463  */
464 struct GNUNET_NAT_STUN_Handle;
465
466
467
468
469 /**
470  * Function called with the result from NAT request.
471  *
472  * @param cls closure
473  * @param diff minimal suggested changes to the original configuration
474  *             to make it work (as best as we can)
475  * @param result #GNUNET_NAT_ERROR_SUCCESS on success, otherwise the specific error code
476  */
477 typedef void
478 (*GNUNET_NAT_stun_RequestCallback)(void *cls,
479                                  enum GNUNET_NAT_StatusCode result);
480
481
482 /**
483  * Make Generic STUN request and
484  * Send a generic stun request to the server specified using the specified socket.
485  * possibly waiting for a reply and filling the 'reply' field with
486  * the externally visible address.
487  *
488
489  * @param server, the address of the stun server
490  * @param port, port of the stun server
491  * @param sock the socket used to send the request
492  * @return #GNUNET_OK success, #GNUNET_NO on error.
493  */
494 int
495 GNUNET_NAT_stun_make_request(char * server,
496                              int port,
497                              struct GNUNET_NETWORK_Handle * sock, GNUNET_NAT_stun_RequestCallback cb,
498                              void *cb_cls);
499
500
501 /**
502  *
503  * Handle an incoming STUN message, Do some basic sanity checks on packet size and content,
504  * try to extract a bit of information, and possibly reply.
505  * At the moment this only processes BIND requests, and returns
506  * the externally visible address of the request.
507  * If a callback is specified, invoke it with the attribute.
508  *
509  * @param data, the packet
510  * @param len, the length of the packet
511  * @param arg, sockaddr_in where we will set our discovered packet
512  *
513  * @return, #GNUNET_OK on OK, #GNUNET_NO if the packet is invalid ( not a stun packet)
514  */
515 int
516 GNUNET_NAT_stun_handle_packet(const void *data,
517                               size_t len,
518                               struct sockaddr_in *arg);
519
520 /**
521  * CHECK if is a valid STUN packet sending to GNUNET_NAT_stun_handle_packet.
522  * It also check if it can handle the packet based on the NAT handler.
523  * You don't need to call anything else to check if the packet is valid,
524  *
525  * @param cls the NAT handle
526  * @param data, packet
527  * @param len, packet length
528  *
529  * @return #GNUNET_NO if it can't decode,# GNUNET_YES if is a packet
530  */
531 int
532 GNUNET_NAT_is_valid_stun_packet(void *cls,
533                                   const void *data,
534                                   size_t len);
535
536
537
538 #endif
539
540 /* end of gnunet_nat_lib.h */