- improved nat handling
[oweals/gnunet.git] / src / transport / plugin_transport_udp.c
index 51c3aa3f3d946bdfc5caabec94e3f8bc239516b3..7141563a2353ef0d04de76f6c10c5c07e7c4186e 100644 (file)
@@ -762,6 +762,8 @@ udp_plugin_get_session (void *cls,
 {
   struct Session * s = NULL;
   struct Plugin * plugin = cls;
+  struct IPv6UdpAddress * udp_a6;
+  struct IPv4UdpAddress * udp_a4;
 
   GNUNET_assert (plugin != NULL);
   GNUNET_assert (address != NULL);
@@ -775,14 +777,23 @@ udp_plugin_get_session (void *cls,
     return NULL;
   }
 
-  if ((address->address_length == sizeof (struct IPv4UdpAddress)) &&
-      (plugin->sockv4 == NULL))
-    return NULL;
-
-  if ((address->address_length == sizeof (struct IPv6UdpAddress)) &&
-      (plugin->sockv6 == NULL))
-    return NULL;
+  if (address->address_length == sizeof (struct IPv4UdpAddress))
+  {
+    if (plugin->sockv4 == NULL)
+      return NULL;
+    udp_a4 = (struct IPv4UdpAddress *) address->address;
+    if (udp_a4->u4_port == 0)
+      return NULL;
+  }
 
+  if (address->address_length == sizeof (struct IPv6UdpAddress))
+  {
+    if (plugin->sockv6 == NULL)
+      return NULL;
+    udp_a6 = (struct IPv6UdpAddress *) address->address;
+    if (udp_a6->u6_port == 0)
+      return NULL;
+  }
 
   /* check if session already exists */
   struct SessionCompareContext cctx;
@@ -1634,7 +1645,10 @@ udp_select_send (struct Plugin *plugin, struct GNUNET_NETWORK_Handle *sock)
     udpw = plugin->ipv6_queue_head;
   }
   else
+  {
     GNUNET_break (0);
+    return 0;
+  }
 
   const struct sockaddr * sa = udpw->session->sock_addr;
   slen = udpw->session->addrlen;