Check that you are not present in trail twice
[oweals/gnunet.git] / src / transport / plugin_transport_udp_broadcasting.c
index c17a3ccfff1ca80e734c71a91b9d76c8753c42bc..9ed1bff65a155b80ff69f959e3ce20d4ae2bea6c 100644 (file)
@@ -135,6 +135,7 @@ broadcast_ipv6_mst_cb (void *cls, void *client,
 {
   struct Plugin *plugin = cls;
   struct Mstv6Context *mc = client;
+  struct GNUNET_HELLO_Address *address;
   const struct GNUNET_MessageHeader *hello;
   const struct UDP_Beacon_Message *msg;
   struct GNUNET_ATS_Information atsi;
@@ -155,19 +156,12 @@ broadcast_ipv6_mst_cb (void *cls, void *client,
   GNUNET_break (ntohl(mc->ats_address_network_type) != GNUNET_ATS_NET_UNSPECIFIED);
 
   hello = (struct GNUNET_MessageHeader *) &msg[1];
-  plugin->env->receive (plugin->env->cls,
-                       &msg->sender,
-                       hello,
-                        NULL,
-                        (const char *) &mc->addr,
-                        sizeof (mc->addr));
-  plugin->env->update_address_metrics (plugin->env->cls,
-                                      &msg->sender,
-                                      (const char *) &mc->addr,
-                                      sizeof (mc->addr),
-                                      NULL,
-                                      &atsi, 1);
-
+  address = GNUNET_HELLO_address_allocate (&msg->sender, PLUGIN_NAME,
+      (const char *) &mc->addr, sizeof (mc->addr), GNUNET_HELLO_ADDRESS_INFO_INBOUND);
+  plugin->env->receive (plugin->env->cls, address, NULL, hello);
+  plugin->env->update_address_metrics (plugin->env->cls, address,
+                                      NULL, &atsi, 1);
+  GNUNET_HELLO_address_free (address);
   GNUNET_STATISTICS_update (plugin->env->stats,
                             _
                             ("# IPv6 multicast HELLO beacons received via udp"),
@@ -183,6 +177,7 @@ broadcast_ipv4_mst_cb (void *cls, void *client,
 {
   struct Plugin *plugin = cls;
   struct Mstv4Context *mc = client;
+  struct GNUNET_HELLO_Address *address;
   const struct GNUNET_MessageHeader *hello;
   const struct UDP_Beacon_Message *msg;
   struct GNUNET_ATS_Information atsi;
@@ -204,19 +199,12 @@ broadcast_ipv4_mst_cb (void *cls, void *client,
   GNUNET_break (ntohl(mc->ats_address_network_type) != GNUNET_ATS_NET_UNSPECIFIED);
 
   hello = (struct GNUNET_MessageHeader *) &msg[1];
-  plugin->env->receive (plugin->env->cls,
-                       &msg->sender,
-                       hello,
-                        NULL,
-                        (const char *) &mc->addr,
-                        sizeof (mc->addr));
-
-  plugin->env->update_address_metrics (plugin->env->cls,
-                                      &msg->sender,
-                                      (const char *) &mc->addr,
-                                      sizeof (mc->addr),
-                                      NULL,
-                                      &atsi, 1);
+  address = GNUNET_HELLO_address_allocate (&msg->sender, PLUGIN_NAME,
+      (const char *) &mc->addr, sizeof (mc->addr), GNUNET_HELLO_ADDRESS_INFO_INBOUND);
+  plugin->env->receive (plugin->env->cls, address, NULL, hello);
+  plugin->env->update_address_metrics (plugin->env->cls, address,
+                                       NULL, &atsi, 1);
+  GNUNET_HELLO_address_free (address);
 
   GNUNET_STATISTICS_update (plugin->env->stats,
                             _("# IPv4 broadcast HELLO beacons received via udp"),
@@ -228,7 +216,7 @@ broadcast_ipv4_mst_cb (void *cls, void *client,
 
 void
 udp_broadcast_receive (struct Plugin *plugin,
-                       const char * buf,
+                       const char *buf,
                        ssize_t size,
                        const struct sockaddr *addr,
                        size_t addrlen)
@@ -485,6 +473,7 @@ iface_proc (void *cls,
 {
   struct Plugin *plugin = cls;
   struct BroadcastAddress *ba;
+  struct GNUNET_ATS_Information network;
 
   if (NULL == addr)
     return GNUNET_OK;
@@ -499,11 +488,19 @@ iface_proc (void *cls,
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "netmask %s for interface %s %p\n ",
               GNUNET_a2s (netmask, addrlen), name, netmask);
 
+  network = plugin->env->get_address_type (plugin->env->cls, broadcast_addr, addrlen);
+  if (GNUNET_ATS_NET_LOOPBACK == ntohl(network.value))
+  {
+    /* Broadcasting on loopback does not make sense */
+    return GNUNET_YES;
+  }
+
   ba = GNUNET_new (struct BroadcastAddress);
   ba->plugin = plugin;
   ba->addr = GNUNET_malloc (addrlen);
   memcpy (ba->addr, broadcast_addr, addrlen);
   ba->addrlen = addrlen;
+
   if ( (GNUNET_YES == plugin->enable_ipv4) &&
        (NULL != plugin->sockv4) &&
        (addrlen == sizeof (struct sockaddr_in)) )
@@ -677,7 +674,7 @@ stop_broadcast (struct Plugin *plugin)
             (plugin->sockv6, IPPROTO_IPV6, IPV6_LEAVE_GROUP,
              &multicastRequest, sizeof (multicastRequest)))
         {
-          GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, setsockopt);
+          GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "setsockopt");
         }
         else
         {