aboutsummaryrefslogtreecommitdiff
path: root/src/nat/natpmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nat/natpmp.c')
-rw-r--r--src/nat/natpmp.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/nat/natpmp.c b/src/nat/natpmp.c
index 16d68c702..2a9187295 100644
--- a/src/nat/natpmp.c
+++ b/src/nat/natpmp.c
@@ -65,6 +65,7 @@ struct GNUNET_NAT_NATPMP_Handle
65{ 65{
66 const struct sockaddr *addr; 66 const struct sockaddr *addr;
67 socklen_t addrlen; 67 socklen_t addrlen;
68 struct sockaddr *ext_addr;
68 int is_mapped; 69 int is_mapped;
69 int has_discovered; 70 int has_discovered;
70 int port; 71 int port;
@@ -107,6 +108,7 @@ GNUNET_NAT_NATPMP_init (const struct sockaddr *addr, socklen_t addrlen,
107 nat->port = port; 108 nat->port = port;
108 nat->addr = addr; 109 nat->addr = addr;
109 nat->addrlen = addrlen; 110 nat->addrlen = addrlen;
111 nat->ext_addr = NULL;
110 return nat; 112 return nat;
111} 113}
112 114
@@ -160,10 +162,28 @@ GNUNET_NAT_NATPMP_pulse (struct GNUNET_NAT_NATPMP_Handle *nat, int is_enabled,
160 log_val ("readnatpmpresponseorretry", val); 162 log_val ("readnatpmpresponseorretry", val);
161 if (val >= 0) 163 if (val >= 0)
162 { 164 {
163 *ext_addr = 165 if (nat->ext_addr)
164 GNUNET_malloc (sizeof (response.pnu.publicaddress.addr)); 166 {
165 memcpy (*ext_addr, &response.pnu.publicaddress.addr, 167 GNUNET_free (nat->ext_addr);
166 (sizeof (response.pnu.publicaddress.addr))); 168 nat->ext_addr = NULL;
169 }
170
171 if (response.pnu.publicaddress.family == AF_INET)
172 {
173 nat->ext_addr =
174 GNUNET_malloc (sizeof (struct in_addr));
175 memcpy (nat->ext_addr, &response.pnu.publicaddress.addr,
176 sizeof (struct in_addr));
177 }
178 else
179 {
180 nat->ext_addr =
181 GNUNET_malloc (sizeof (struct in6_addr));
182 memcpy (nat->ext_addr, &response.pnu.publicaddress.addr6,
183 (sizeof (struct in6_addr)));
184 }
185
186 *ext_addr = nat->ext_addr;
167#ifdef DEBUG 187#ifdef DEBUG
168 GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, COMP_NAT_NATPMP, 188 GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, COMP_NAT_NATPMP,
169 _("Found public IP address %s\n"), 189 _("Found public IP address %s\n"),