stat
[oweals/gnunet.git] / src / transport / plugin_transport_udp_broadcasting.c
index 623cde2bda8921bf7e8d9d375271bd41f64474c1..db6c1fe8c4b8a04eaf8de8ff4623cb3a838bfc11 100644 (file)
@@ -90,7 +90,7 @@ struct Mstv6Context
 
 
 
-void
+int
 broadcast_ipv6_mst_cb (void *cls, void *client,
                        const struct GNUNET_MessageHeader *message)
 {
@@ -104,7 +104,7 @@ broadcast_ipv6_mst_cb (void *cls, void *client,
 
   if (GNUNET_MESSAGE_TYPE_TRANSPORT_BROADCAST_BEACON !=
       ntohs (msg->header.type))
-    return;
+    return GNUNET_OK;
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "Received beacon with %u bytes from peer `%s' via address `%s'\n",
        ntohs (msg->header.size), GNUNET_i2s (&msg->sender),
@@ -128,9 +128,10 @@ broadcast_ipv6_mst_cb (void *cls, void *client,
                             ("# IPv6 multicast HELLO beacons received via udp"),
                             1, GNUNET_NO);
   GNUNET_free (mc);
+  return GNUNET_OK;
 }
 
-void
+int
 broadcast_ipv4_mst_cb (void *cls, void *client,
                        const struct GNUNET_MessageHeader *message)
 {
@@ -143,7 +144,7 @@ broadcast_ipv4_mst_cb (void *cls, void *client,
 
   if (GNUNET_MESSAGE_TYPE_TRANSPORT_BROADCAST_BEACON !=
       ntohs (msg->header.type))
-    return;
+    return GNUNET_OK;
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "Received beacon with %u bytes from peer `%s' via address `%s'\n",
        ntohs (msg->header.size), GNUNET_i2s (&msg->sender),
@@ -168,6 +169,7 @@ broadcast_ipv4_mst_cb (void *cls, void *client,
                             ("# IPv4 broadcast HELLO beacons received via udp"),
                             1, GNUNET_NO);
   GNUNET_free (mc);
+  return GNUNET_OK;
 }
 
 void
@@ -175,7 +177,7 @@ udp_broadcast_receive (struct Plugin *plugin, const char * buf, ssize_t size, st
 {
   struct GNUNET_ATS_Information ats;
 
-  if (addrlen == sizeof (struct sockaddr_in))
+  if ((GNUNET_YES == plugin->broadcast_ipv4) && (addrlen == sizeof (struct sockaddr_in)))
   {
     LOG (GNUNET_ERROR_TYPE_DEBUG,
          "Received IPv4 HELLO beacon broadcast with %i bytes from address %s\n",
@@ -189,12 +191,14 @@ udp_broadcast_receive (struct Plugin *plugin, const char * buf, ssize_t size, st
     mc->addr.u4_port = av4->sin_port;
     ats = plugin->env->get_address_type (plugin->env->cls, (const struct sockaddr *) addr, addrlen);
     mc->ats_address_network_type = ats.value;
+
+    GNUNET_assert (NULL != plugin->broadcast_ipv4_mst);
     if (GNUNET_OK !=
         GNUNET_SERVER_mst_receive (plugin->broadcast_ipv4_mst, mc, buf, size,
                                    GNUNET_NO, GNUNET_NO))
       GNUNET_free (mc);
   }
-  else if (addrlen == sizeof (struct sockaddr_in6))
+  else if ((GNUNET_YES == plugin->broadcast_ipv4) && (addrlen == sizeof (struct sockaddr_in6)))
   {
     LOG (GNUNET_ERROR_TYPE_DEBUG,
          "Received IPv6 HELLO beacon broadcast with %i bytes from address %s\n",
@@ -208,7 +212,7 @@ udp_broadcast_receive (struct Plugin *plugin, const char * buf, ssize_t size, st
     mc->addr.u6_port = av6->sin6_port;
     ats = plugin->env->get_address_type (plugin->env->cls, (const struct sockaddr *) addr, addrlen);
     mc->ats_address_network_type = ats.value;
-
+    GNUNET_assert (NULL != plugin->broadcast_ipv4_mst);
     if (GNUNET_OK !=
         GNUNET_SERVER_mst_receive (plugin->broadcast_ipv6_mst, mc, buf, size,
                                    GNUNET_NO, GNUNET_NO))
@@ -224,6 +228,8 @@ prepare_beacon (struct Plugin *plugin, struct UDP_Beacon_Message *msg)
 
   const struct GNUNET_MessageHeader *hello;
   hello = plugin->env->get_our_hello ();
+  if (NULL == hello)
+    return 0;
   hello_size = GNUNET_HELLO_size ((struct GNUNET_HELLO_Message *) hello);
   msg_size = hello_size + sizeof (struct UDP_Beacon_Message);
 
@@ -254,7 +260,7 @@ udp_ipv4_broadcast_send (void *cls,
   sent = 0;
   baddr = plugin->ipv4_broadcast_head;
   /* just IPv4 */
-  while ((baddr != NULL) && (baddr->addrlen == sizeof (struct sockaddr_in)))
+  while ((msg_size > 0) && (baddr != NULL) && (baddr->addrlen == sizeof (struct sockaddr_in)))
   {
     struct sockaddr_in *addr = (struct sockaddr_in *) baddr->addr;
 
@@ -264,7 +270,19 @@ udp_ipv4_broadcast_send (void *cls,
                                       (const struct sockaddr *) addr,
                                       baddr->addrlen);
     if (sent == GNUNET_SYSERR)
-      GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "sendto");
+    {
+      if ((ENETUNREACH == errno) || (ENETDOWN == errno))
+      {
+        /* "Network unreachable" or "Network down"
+         *
+         * This indicates that we just do not have network connectivity
+         */
+        GNUNET_log (GNUNET_ERROR_TYPE_BULK | GNUNET_ERROR_TYPE_WARNING,
+            "Network connectivity is down, cannot send beacon!\n");
+      }
+      else
+        GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "sendto");
+    }
     else
     {
       LOG (GNUNET_ERROR_TYPE_DEBUG,
@@ -297,7 +315,20 @@ udp_ipv6_broadcast_send (void *cls,
                                     &plugin->ipv6_multicast_address,
                                     sizeof (struct sockaddr_in6));
   if (sent == GNUNET_SYSERR)
-    GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "sendto");
+  {
+    if ((ENETUNREACH == errno) || (ENETDOWN == errno))
+    {
+      /* "Network unreachable" or "Network down"
+       *
+       * This indicates that this system is IPv6 enabled, but does not
+       * have a valid global IPv6 address assigned
+       */
+      GNUNET_log (GNUNET_ERROR_TYPE_BULK | GNUNET_ERROR_TYPE_WARNING,
+          "Network connectivity is down, cannot send beacon!\n");
+    }
+    else
+      GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "sendto");
+  }
   else
   {
     LOG (GNUNET_ERROR_TYPE_DEBUG,