[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);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r31504 - gnunet/src/transport,
gnunet <=