diff options
author | Christian Grothoff <christian@grothoff.org> | 2017-01-05 21:23:02 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2017-01-05 21:23:02 +0100 |
commit | 1b7f6eea0a06abab9b75b30f021aa6313fccfcd4 (patch) | |
tree | 0d726dbd6650997c22a7c17ce833ce53c23bde9e | |
parent | 07d7291d64688ecf9ef0bf2b663b10a168d5fff2 (diff) | |
download | gnunet-1b7f6eea0a06abab9b75b30f021aa6313fccfcd4.tar.gz gnunet-1b7f6eea0a06abab9b75b30f021aa6313fccfcd4.zip |
pass section name instead of specific option via IPC
-rw-r--r-- | doc/man/gnunet-nat.1 | 4 | ||||
-rw-r--r-- | src/include/gnunet_nat_service.h | 4 | ||||
-rw-r--r-- | src/nat/gnunet-nat.c | 14 | ||||
-rw-r--r-- | src/nat/gnunet-service-nat.c | 20 | ||||
-rw-r--r-- | src/nat/nat.h | 9 | ||||
-rw-r--r-- | src/nat/nat_api.c | 19 | ||||
-rw-r--r-- | src/transport/transport.conf.in | 13 |
7 files changed, 50 insertions, 33 deletions
diff --git a/doc/man/gnunet-nat.1 b/doc/man/gnunet-nat.1 index a834a1d96..01e0267a4 100644 --- a/doc/man/gnunet-nat.1 +++ b/doc/man/gnunet-nat.1 | |||
@@ -39,8 +39,8 @@ Assuming we are listening at ADDRESS for connection reversal requests. | |||
39 | Ask the peer at ADDRESS for connection reversal, using the local address for the target address of the reversal. | 39 | Ask the peer at ADDRESS for connection reversal, using the local address for the target address of the reversal. |
40 | 40 | ||
41 | .B | 41 | .B |
42 | .IP "\-p ADDRESS, \-\-punch=ADDRESS" | 42 | .IP "\-S NAME, \-\-section=NAME" |
43 | A hole was punched manually through the NAT. We should use ADDRESS as our external hostname and port for advertising for incoming requests. The special hostname 'AUTO' can be used to indicate that GNUnet should determine the external IP address by other means (such as upnpc), and just take the port number from ADDRESS. | 43 | Name of section in configuration file to use for additional options. |
44 | 44 | ||
45 | .B | 45 | .B |
46 | .IP "\-s, \-\-stun" | 46 | .IP "\-s, \-\-stun" |
diff --git a/src/include/gnunet_nat_service.h b/src/include/gnunet_nat_service.h index 0dbc23e74..6b9650306 100644 --- a/src/include/gnunet_nat_service.h +++ b/src/include/gnunet_nat_service.h | |||
@@ -185,8 +185,8 @@ struct GNUNET_NAT_Handle; | |||
185 | * address_callback for any 'plausible' external address. | 185 | * address_callback for any 'plausible' external address. |
186 | * | 186 | * |
187 | * @param cfg configuration to use | 187 | * @param cfg configuration to use |
188 | * @param config_section name of the configuration section for optionsx | ||
188 | * @param proto protocol this is about, IPPROTO_TCP or IPPROTO_UDP | 189 | * @param proto protocol this is about, IPPROTO_TCP or IPPROTO_UDP |
189 | * @param hole_external hostname and port of manually punched hole in NAT, otherwise NULL (or empty string) | ||
190 | * @param num_addrs number of addresses in @a addrs | 190 | * @param num_addrs number of addresses in @a addrs |
191 | * @param addrs list of local addresses packets should be redirected to | 191 | * @param addrs list of local addresses packets should be redirected to |
192 | * @param addrlens actual lengths of the addresses in @a addrs | 192 | * @param addrlens actual lengths of the addresses in @a addrs |
@@ -198,8 +198,8 @@ struct GNUNET_NAT_Handle; | |||
198 | */ | 198 | */ |
199 | struct GNUNET_NAT_Handle * | 199 | struct GNUNET_NAT_Handle * |
200 | GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, | 200 | GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, |
201 | const char *config_section, | ||
201 | uint8_t proto, | 202 | uint8_t proto, |
202 | const char *hole_external, | ||
203 | unsigned int num_addrs, | 203 | unsigned int num_addrs, |
204 | const struct sockaddr **addrs, | 204 | const struct sockaddr **addrs, |
205 | const socklen_t *addrlens, | 205 | const socklen_t *addrlens, |
diff --git a/src/nat/gnunet-nat.c b/src/nat/gnunet-nat.c index 81e4549b5..4171babf9 100644 --- a/src/nat/gnunet-nat.c +++ b/src/nat/gnunet-nat.c | |||
@@ -39,10 +39,10 @@ static int global_ret; | |||
39 | static struct GNUNET_NAT_AutoHandle *ah; | 39 | static struct GNUNET_NAT_AutoHandle *ah; |
40 | 40 | ||
41 | /** | 41 | /** |
42 | * External hostname and port, if user manually punched | 42 | * Name of section in configuration file to use for |
43 | * the NAT. | 43 | * additional options. |
44 | */ | 44 | */ |
45 | static char *hole_external; | 45 | static char *section_name; |
46 | 46 | ||
47 | /** | 47 | /** |
48 | * Flag set to 1 if we use IPPROTO_UDP. | 48 | * Flag set to 1 if we use IPPROTO_UDP. |
@@ -568,8 +568,8 @@ run (void *cls, | |||
568 | if (NULL != local_addr) | 568 | if (NULL != local_addr) |
569 | { | 569 | { |
570 | nh = GNUNET_NAT_register (c, | 570 | nh = GNUNET_NAT_register (c, |
571 | section_name, | ||
571 | proto, | 572 | proto, |
572 | hole_external, | ||
573 | 1, | 573 | 1, |
574 | (const struct sockaddr **) &local_sa, | 574 | (const struct sockaddr **) &local_sa, |
575 | &local_len, | 575 | &local_len, |
@@ -698,9 +698,9 @@ main (int argc, | |||
698 | {'r', "remote", "ADDRESS", | 698 | {'r', "remote", "ADDRESS", |
699 | gettext_noop ("which remote IP and port should be asked for connection reversal"), | 699 | gettext_noop ("which remote IP and port should be asked for connection reversal"), |
700 | GNUNET_YES, &GNUNET_GETOPT_set_string, &remote_addr }, | 700 | GNUNET_YES, &GNUNET_GETOPT_set_string, &remote_addr }, |
701 | {'p', "punched", NULL, | 701 | {'S', "section", NULL, |
702 | gettext_noop ("external hostname and port of NAT, if punched manually; use AUTO for hostname for automatic determination of the external IP"), | 702 | gettext_noop ("name of configuration section to find additional options, such as manual host punching data"), |
703 | GNUNET_YES, &GNUNET_GETOPT_set_string, &hole_external }, | 703 | GNUNET_YES, &GNUNET_GETOPT_set_string, §ion_name }, |
704 | {'s', "stun", NULL, | 704 | {'s', "stun", NULL, |
705 | gettext_noop ("enable STUN processing"), | 705 | gettext_noop ("enable STUN processing"), |
706 | GNUNET_NO, &GNUNET_GETOPT_set_one, &do_stun }, | 706 | GNUNET_NO, &GNUNET_GETOPT_set_one, &do_stun }, |
diff --git a/src/nat/gnunet-service-nat.c b/src/nat/gnunet-service-nat.c index 8af27af9e..79f806f27 100644 --- a/src/nat/gnunet-service-nat.c +++ b/src/nat/gnunet-service-nat.c | |||
@@ -30,8 +30,6 @@ | |||
30 | * TODO: | 30 | * TODO: |
31 | * - test and document (!) ICMP based NAT traversal | 31 | * - test and document (!) ICMP based NAT traversal |
32 | * - test manual hole punching support | 32 | * - test manual hole punching support |
33 | * - consider passing transport plugin name instead of | ||
34 | * external IP address string (more flexible!) | ||
35 | * - adapt existing transports to use new NAT logic | 33 | * - adapt existing transports to use new NAT logic |
36 | * - abandon legacy NAT code | 34 | * - abandon legacy NAT code |
37 | * | 35 | * |
@@ -186,6 +184,11 @@ struct ClientHandle | |||
186 | char *hole_external; | 184 | char *hole_external; |
187 | 185 | ||
188 | /** | 186 | /** |
187 | * Name of the configuration section this client cares about. | ||
188 | */ | ||
189 | char *section_name; | ||
190 | |||
191 | /** | ||
189 | * Task for periodically re-running the @e ext_dns DNS lookup. | 192 | * Task for periodically re-running the @e ext_dns DNS lookup. |
190 | */ | 193 | */ |
191 | struct GNUNET_SCHEDULER_Task *ext_dns_task; | 194 | struct GNUNET_SCHEDULER_Task *ext_dns_task; |
@@ -505,7 +508,7 @@ check_register (void *cls, | |||
505 | off += alen; | 508 | off += alen; |
506 | left -= alen; | 509 | left -= alen; |
507 | } | 510 | } |
508 | if (left != ntohs (message->hole_external_len)) | 511 | if (left != ntohs (message->str_len)) |
509 | { | 512 | { |
510 | GNUNET_break (0); | 513 | GNUNET_break (0); |
511 | return GNUNET_SYSERR; | 514 | return GNUNET_SYSERR; |
@@ -1575,10 +1578,14 @@ handle_register (void *cls, | |||
1575 | off += alen; | 1578 | off += alen; |
1576 | } | 1579 | } |
1577 | 1580 | ||
1578 | ch->hole_external | 1581 | ch->section_name |
1579 | = GNUNET_strndup (off, | 1582 | = GNUNET_strndup (off, |
1580 | ntohs (message->hole_external_len)); | 1583 | ntohs (message->str_len)); |
1581 | if (0 != ntohs (message->hole_external_len)) | 1584 | if (GNUNET_OK == |
1585 | GNUNET_CONFIGURATION_get_value_string (cfg, | ||
1586 | ch->section_name, | ||
1587 | "HOLE_EXTERNAL", | ||
1588 | &ch->hole_external)) | ||
1582 | lookup_hole_external (ch); | 1589 | lookup_hole_external (ch); |
1583 | 1590 | ||
1584 | /* Actually send IP address list to client */ | 1591 | /* Actually send IP address list to client */ |
@@ -2352,6 +2359,7 @@ client_disconnect_cb (void *cls, | |||
2352 | ch->ext_dns = NULL; | 2359 | ch->ext_dns = NULL; |
2353 | } | 2360 | } |
2354 | GNUNET_free (ch->hole_external); | 2361 | GNUNET_free (ch->hole_external); |
2362 | GNUNET_free (ch->section_name); | ||
2355 | GNUNET_free (ch); | 2363 | GNUNET_free (ch); |
2356 | } | 2364 | } |
2357 | 2365 | ||
diff --git a/src/nat/nat.h b/src/nat/nat.h index af418c7c2..02bae71e9 100644 --- a/src/nat/nat.h +++ b/src/nat/nat.h | |||
@@ -29,6 +29,7 @@ | |||
29 | #include "gnunet_util_lib.h" | 29 | #include "gnunet_util_lib.h" |
30 | 30 | ||
31 | 31 | ||
32 | |||
32 | GNUNET_NETWORK_STRUCT_BEGIN | 33 | GNUNET_NETWORK_STRUCT_BEGIN |
33 | 34 | ||
34 | /** | 35 | /** |
@@ -111,10 +112,9 @@ struct GNUNET_NAT_RegisterMessage | |||
111 | 112 | ||
112 | /** | 113 | /** |
113 | * Number of bytes in the string that follow which | 114 | * Number of bytes in the string that follow which |
114 | * specify the hostname and port of a manually punched | 115 | * specifies a section name in the configuration. |
115 | * hole for this client. | ||
116 | */ | 116 | */ |
117 | uint16_t hole_external_len GNUNET_PACKED; | 117 | uint16_t str_len GNUNET_PACKED; |
118 | 118 | ||
119 | /** | 119 | /** |
120 | * Number of addresses that this service is bound to that follow. | 120 | * Number of addresses that this service is bound to that follow. |
@@ -126,8 +126,7 @@ struct GNUNET_NAT_RegisterMessage | |||
126 | /* Followed by @e num_addrs addresses of type 'struct | 126 | /* Followed by @e num_addrs addresses of type 'struct |
127 | sockaddr' */ | 127 | sockaddr' */ |
128 | 128 | ||
129 | /* Followed by @e hole_external_len bytes giving a hostname | 129 | /* Followed by @e str_len section name to use for options */ |
130 | and port */ | ||
131 | 130 | ||
132 | }; | 131 | }; |
133 | 132 | ||
diff --git a/src/nat/nat_api.c b/src/nat/nat_api.c index 008ad19e4..06b4b99fa 100644 --- a/src/nat/nat_api.c +++ b/src/nat/nat_api.c | |||
@@ -368,8 +368,8 @@ do_connect (void *cls) | |||
368 | * address_callback for any 'plausible' external address. | 368 | * address_callback for any 'plausible' external address. |
369 | * | 369 | * |
370 | * @param cfg configuration to use | 370 | * @param cfg configuration to use |
371 | * @param config_section name of the configuration section for optionsx | ||
371 | * @param proto protocol this is about, IPPROTO_TCP or IPPROTO_UDP | 372 | * @param proto protocol this is about, IPPROTO_TCP or IPPROTO_UDP |
372 | * @param hole_external hostname and port of manually punched hole in NAT, otherwise NULL (or empty string) | ||
373 | * @param num_addrs number of addresses in @a addrs | 373 | * @param num_addrs number of addresses in @a addrs |
374 | * @param addrs list of local addresses packets should be redirected to | 374 | * @param addrs list of local addresses packets should be redirected to |
375 | * @param addrlens actual lengths of the addresses in @a addrs | 375 | * @param addrlens actual lengths of the addresses in @a addrs |
@@ -381,8 +381,8 @@ do_connect (void *cls) | |||
381 | */ | 381 | */ |
382 | struct GNUNET_NAT_Handle * | 382 | struct GNUNET_NAT_Handle * |
383 | GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, | 383 | GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, |
384 | const char *config_section, | ||
384 | uint8_t proto, | 385 | uint8_t proto, |
385 | const char *hole_external, | ||
386 | unsigned int num_addrs, | 386 | unsigned int num_addrs, |
387 | const struct sockaddr **addrs, | 387 | const struct sockaddr **addrs, |
388 | const socklen_t *addrlens, | 388 | const socklen_t *addrlens, |
@@ -393,17 +393,14 @@ GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
393 | struct GNUNET_NAT_Handle *nh; | 393 | struct GNUNET_NAT_Handle *nh; |
394 | struct GNUNET_NAT_RegisterMessage *rm; | 394 | struct GNUNET_NAT_RegisterMessage *rm; |
395 | size_t len; | 395 | size_t len; |
396 | size_t hole_external_len; | 396 | size_t str_len; |
397 | char *off; | 397 | char *off; |
398 | 398 | ||
399 | len = 0; | 399 | len = 0; |
400 | for (unsigned int i=0;i<num_addrs;i++) | 400 | for (unsigned int i=0;i<num_addrs;i++) |
401 | len += addrlens[i]; | 401 | len += addrlens[i]; |
402 | hole_external_len | 402 | str_len = strlen (config_section) + 1; |
403 | = (NULL == hole_external) | 403 | len += str_len; |
404 | ? 0 | ||
405 | : strlen (hole_external); | ||
406 | len += hole_external_len; | ||
407 | if ( (len > GNUNET_SERVER_MAX_MESSAGE_SIZE - sizeof (*rm)) || | 404 | if ( (len > GNUNET_SERVER_MAX_MESSAGE_SIZE - sizeof (*rm)) || |
408 | (num_addrs > UINT16_MAX) ) | 405 | (num_addrs > UINT16_MAX) ) |
409 | { | 406 | { |
@@ -419,7 +416,7 @@ GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
419 | if (NULL != reversal_callback) | 416 | if (NULL != reversal_callback) |
420 | rm->flags |= GNUNET_NAT_RF_REVERSAL; | 417 | rm->flags |= GNUNET_NAT_RF_REVERSAL; |
421 | rm->proto = proto; | 418 | rm->proto = proto; |
422 | rm->hole_external_len = htons (hole_external_len); | 419 | rm->str_len = htons (str_len); |
423 | rm->num_addrs = htons ((uint16_t) num_addrs); | 420 | rm->num_addrs = htons ((uint16_t) num_addrs); |
424 | off = (char *) &rm[1]; | 421 | off = (char *) &rm[1]; |
425 | for (unsigned int i=0;i<num_addrs;i++) | 422 | for (unsigned int i=0;i<num_addrs;i++) |
@@ -459,8 +456,8 @@ GNUNET_NAT_register (const struct GNUNET_CONFIGURATION_Handle *cfg, | |||
459 | off += addrlens[i]; | 456 | off += addrlens[i]; |
460 | } | 457 | } |
461 | GNUNET_memcpy (off, | 458 | GNUNET_memcpy (off, |
462 | hole_external, | 459 | config_section, |
463 | hole_external_len); | 460 | str_len); |
464 | 461 | ||
465 | nh = GNUNET_new (struct GNUNET_NAT_Handle); | 462 | nh = GNUNET_new (struct GNUNET_NAT_Handle); |
466 | nh->reg = &rm->header; | 463 | nh->reg = &rm->header; |
diff --git a/src/transport/transport.conf.in b/src/transport/transport.conf.in index 95e3f9944..4e9f17f77 100644 --- a/src/transport/transport.conf.in +++ b/src/transport/transport.conf.in | |||
@@ -55,6 +55,9 @@ MAX_CONNECTIONS = 128 | |||
55 | # Enable TCP stealth? | 55 | # Enable TCP stealth? |
56 | TCP_STEALTH = NO | 56 | TCP_STEALTH = NO |
57 | 57 | ||
58 | # Configuration for manually punched holes in NAT. | ||
59 | # HOLE_EXTERNAL = auto:2086 | ||
60 | |||
58 | [transport-udp] | 61 | [transport-udp] |
59 | # Use PORT = 0 to autodetect a port available | 62 | # Use PORT = 0 to autodetect a port available |
60 | PORT = 2086 | 63 | PORT = 2086 |
@@ -69,6 +72,9 @@ BROADCAST_INTERVAL = 30 s | |||
69 | MAX_BPS = 1000000 | 72 | MAX_BPS = 1000000 |
70 | TESTING_IGNORE_KEYS = ACCEPT_FROM; | 73 | TESTING_IGNORE_KEYS = ACCEPT_FROM; |
71 | 74 | ||
75 | # Configuration for manually punched holes in NAT. | ||
76 | # HOLE_EXTERNAL = auto:2086 | ||
77 | |||
72 | [transport-http_client] | 78 | [transport-http_client] |
73 | MAX_CONNECTIONS = 128 | 79 | MAX_CONNECTIONS = 128 |
74 | TESTING_IGNORE_KEYS = ACCEPT_FROM; | 80 | TESTING_IGNORE_KEYS = ACCEPT_FROM; |
@@ -99,6 +105,9 @@ TESTING_IGNORE_KEYS = ACCEPT_FROM; | |||
99 | # Enable TCP stealth? | 105 | # Enable TCP stealth? |
100 | TCP_STEALTH = NO | 106 | TCP_STEALTH = NO |
101 | 107 | ||
108 | # Configuration for manually punched holes in NAT. | ||
109 | # HOLE_EXTERNAL = auto:2086 | ||
110 | |||
102 | [transport-https_client] | 111 | [transport-https_client] |
103 | MAX_CONNECTIONS = 128 | 112 | MAX_CONNECTIONS = 128 |
104 | TESTING_IGNORE_KEYS = ACCEPT_FROM; | 113 | TESTING_IGNORE_KEYS = ACCEPT_FROM; |
@@ -140,6 +149,10 @@ TESTING_IGNORE_KEYS = ACCEPT_FROM; | |||
140 | # Enable TCP stealth? | 149 | # Enable TCP stealth? |
141 | TCP_STEALTH = NO | 150 | TCP_STEALTH = NO |
142 | 151 | ||
152 | # Configuration for manually punched holes in NAT. | ||
153 | # HOLE_EXTERNAL = auto:2086 | ||
154 | |||
155 | |||
143 | [transport-wlan] | 156 | [transport-wlan] |
144 | # Name of the interface in monitor mode (typically monX) | 157 | # Name of the interface in monitor mode (typically monX) |
145 | INTERFACE = mon0 | 158 | INTERFACE = mon0 |