gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r31504 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r31504 - gnunet/src/transport
Date: Wed, 18 Dec 2013 09:57:04 +0100

Author: wachs
Date: 2013-12-18 09:57:03 +0100 (Wed, 18 Dec 2013)
New Revision: 31504

Modified:
   gnunet/src/transport/plugin_transport_udp.c
   gnunet/src/transport/plugin_transport_udp.h
   gnunet/src/transport/plugin_transport_udp_broadcasting.c
Log:
fixing 0003221: Crash in UDP broadcast: 
plugin_transport_udp_broadcasting.c:253. 


Modified: gnunet/src/transport/plugin_transport_udp.c
===================================================================
--- gnunet/src/transport/plugin_transport_udp.c 2013-12-17 22:04:55 UTC (rev 
31503)
+++ gnunet/src/transport/plugin_transport_udp.c 2013-12-18 08:57:03 UTC (rev 
31504)
@@ -2499,7 +2499,7 @@
   switch (ntohs (msg->type))
   {
   case GNUNET_MESSAGE_TYPE_TRANSPORT_BROADCAST_BEACON:
-    udp_broadcast_receive (plugin, buf, size,
+      udp_broadcast_receive (plugin, buf, size,
                            (const struct sockaddr *) &addr, fromlen);
     return;
   case GNUNET_MESSAGE_TYPE_TRANSPORT_UDP_MESSAGE:
@@ -3030,9 +3030,9 @@
   struct Plugin *p;
   unsigned long long port;
   unsigned long long aport;
-  unsigned long long broadcast;
   unsigned long long udp_max_bps;
   unsigned long long enable_v6;
+  unsigned long long enable_broadcasting;
   char * bind4_address;
   char * bind6_address;
   char * fancy_interval;
@@ -3126,10 +3126,10 @@
   myoptions = 0;
 
   /* Enable neighbour discovery */
-  broadcast = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, "transport-udp",
+  enable_broadcasting = GNUNET_CONFIGURATION_get_value_yesno (env->cfg, 
"transport-udp",
                                             "BROADCAST");
-  if (broadcast == GNUNET_SYSERR)
-    broadcast = GNUNET_NO;
+  if (enable_broadcasting == GNUNET_SYSERR)
+    enable_broadcasting = GNUNET_NO;
 
   if (GNUNET_SYSERR == GNUNET_CONFIGURATION_get_value_string (env->cfg, 
"transport-udp",
                                            "BROADCAST_INTERVAL", 
&fancy_interval))
@@ -3158,6 +3158,7 @@
   p->broadcast_interval = interval;
   p->enable_ipv6 = enable_v6;
   p->enable_ipv4 = GNUNET_YES; /* default */
+  p->enable_broadcasting = enable_broadcasting;
   p->env = env;
   p->sessions = GNUNET_CONTAINER_multipeermap_create (10, GNUNET_NO);
   p->defrag_ctxs = GNUNET_CONTAINER_heap_create 
(GNUNET_CONTAINER_HEAP_ORDER_MIN);
@@ -3179,12 +3180,10 @@
     GNUNET_free (p);
     return NULL;
   }
-  else if (broadcast == GNUNET_YES)
-  {
-    LOG (GNUNET_ERROR_TYPE_DEBUG, "Starting broadcasting\n");
-    setup_broadcast (p, &server_addrv6, &server_addrv4);
-  }
 
+  /* Setup broadcasting and receiving beacons */
+  setup_broadcast (p, &server_addrv6, &server_addrv4);
+
   api = GNUNET_new (struct GNUNET_TRANSPORT_PluginFunctions);
   api->cls = p;
   api->send = NULL;
@@ -3286,11 +3285,6 @@
     GNUNET_CONTAINER_heap_destroy (plugin->defrag_ctxs);
     plugin->defrag_ctxs = NULL;
   }
-  if (plugin->mst != NULL)
-  {
-    GNUNET_SERVER_mst_destroy(plugin->mst);
-    plugin->mst = NULL;
-  }
 
   /* Clean up leftover messages */
   struct UDP_MessageWrapper * udpw;

Modified: gnunet/src/transport/plugin_transport_udp.h
===================================================================
--- gnunet/src/transport/plugin_transport_udp.h 2013-12-17 22:04:55 UTC (rev 
31503)
+++ gnunet/src/transport/plugin_transport_udp.h 2013-12-18 08:57:03 UTC (rev 
31504)
@@ -249,6 +249,11 @@
   int enable_ipv4;
 
   /**
+   * Is broadcasting enabled: GNUNET_YES or GNUNET_NO
+   */
+  int enable_broadcasting;
+
+  /**
    * Port we broadcasting on.
    */
   uint16_t broadcast_port;

Modified: gnunet/src/transport/plugin_transport_udp_broadcasting.c
===================================================================
--- gnunet/src/transport/plugin_transport_udp_broadcasting.c    2013-12-17 
22:04:55 UTC (rev 31503)
+++ gnunet/src/transport/plugin_transport_udp_broadcasting.c    2013-12-18 
08:57:03 UTC (rev 31504)
@@ -612,6 +612,10 @@
     GNUNET_SERVER_mst_create (&broadcast_ipv4_mst_cb, plugin);
   plugin->broadcast_ipv6_mst =
     GNUNET_SERVER_mst_create (&broadcast_ipv6_mst_cb, plugin);
+
+  if (GNUNET_YES != plugin->enable_broadcasting)
+    return; /* We do not send, just receive */
+
   /* create IPv4 broadcast socket */
   if ((GNUNET_YES == plugin->enable_ipv4) && (NULL != plugin->sockv4))
   {
@@ -626,6 +630,7 @@
            ntohs (server_addrv4->sin_port));
     }
   }
+  /* create IPv6 multicast socket */
   if ((GNUNET_YES == plugin->enable_ipv6) && (plugin->sockv6 != NULL))
   {
     memset (&plugin->ipv6_multicast_address, 0, sizeof (struct sockaddr_in6));
@@ -642,49 +647,55 @@
 void
 stop_broadcast (struct Plugin *plugin)
 {
-  while (plugin->broadcast_head != NULL)
+  if (GNUNET_YES == plugin->enable_broadcasting)
   {
-    struct BroadcastAddress *p = plugin->broadcast_head;
-
-    if (p->broadcast_task != GNUNET_SCHEDULER_NO_TASK)
+    /* Disable broadcasting */
+    while (plugin->broadcast_head != NULL)
     {
-      GNUNET_SCHEDULER_cancel (p->broadcast_task);
-      p->broadcast_task = GNUNET_SCHEDULER_NO_TASK;
-    }
-    if ((GNUNET_YES == plugin->enable_ipv6) &&
-        (NULL != plugin->sockv6) &&
-        (p->addrlen == sizeof (struct sockaddr_in6)))
-    {
-      /* Create IPv6 multicast request */
-      struct ipv6_mreq multicastRequest;
-      const struct sockaddr_in6 *s6 = (const struct sockaddr_in6 *) p->addr;
+      struct BroadcastAddress *p = plugin->broadcast_head;
 
-      multicastRequest.ipv6mr_multiaddr =
-        plugin->ipv6_multicast_address.sin6_addr;
-      multicastRequest.ipv6mr_interface = s6->sin6_scope_id;
-
-      /* Leave the multicast group */
-      if (GNUNET_OK ==
-          GNUNET_NETWORK_socket_setsockopt
-          (plugin->sockv6, IPPROTO_IPV6, IPV6_LEAVE_GROUP,
-           &multicastRequest, sizeof (multicastRequest)))
+      if (p->broadcast_task != GNUNET_SCHEDULER_NO_TASK)
       {
-        GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, setsockopt);
+        GNUNET_SCHEDULER_cancel (p->broadcast_task);
+        p->broadcast_task = GNUNET_SCHEDULER_NO_TASK;
       }
-      else
+      if ((GNUNET_YES == plugin->enable_ipv6) &&
+          (NULL != plugin->sockv6) &&
+          (p->addrlen == sizeof (struct sockaddr_in6)))
       {
-        LOG (GNUNET_ERROR_TYPE_DEBUG, "IPv6 multicasting stopped\n");
+        /* Create IPv6 multicast request */
+        struct ipv6_mreq multicastRequest;
+        const struct sockaddr_in6 *s6 = (const struct sockaddr_in6 *) p->addr;
+
+        multicastRequest.ipv6mr_multiaddr =
+          plugin->ipv6_multicast_address.sin6_addr;
+        multicastRequest.ipv6mr_interface = s6->sin6_scope_id;
+
+        /* Leave the multicast group */
+        if (GNUNET_OK ==
+            GNUNET_NETWORK_socket_setsockopt
+            (plugin->sockv6, IPPROTO_IPV6, IPV6_LEAVE_GROUP,
+             &multicastRequest, sizeof (multicastRequest)))
+        {
+          GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, setsockopt);
+        }
+        else
+        {
+          LOG (GNUNET_ERROR_TYPE_DEBUG, "IPv6 multicasting stopped\n");
+        }
       }
-    }
 
 #if LINUX
     GNUNET_DISK_file_close(p->cryogenic_fd);
 #endif
-    GNUNET_CONTAINER_DLL_remove (plugin->broadcast_head,
-                                 plugin->broadcast_tail, p);
-    GNUNET_free (p->addr);
-    GNUNET_free (p);
+      GNUNET_CONTAINER_DLL_remove (plugin->broadcast_head,
+                                   plugin->broadcast_tail, p);
+      GNUNET_free (p->addr);
+      GNUNET_free (p);
+    }
   }
+
+  /* Destroy MSTs */
   if (NULL != plugin->broadcast_ipv4_mst)
   {
     GNUNET_SERVER_mst_destroy (plugin->broadcast_ipv4_mst);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]