#define LOG(kind,...) GNUNET_log_from (kind, "transport-udp", __VA_ARGS__)
/* *********** Cryogenic ********** */
-
+#if LINUX
#include <sys/stat.h>
#include <fcntl.h>
unsigned long delay_msecs;
unsigned long timeout_msecs;
};
-/************************************/
+#endif
+/************************************/
struct UDP_Beacon_Message
void *addr;
socklen_t addrlen;
-
- /*
- * Cryogenic fields
+
+#if LINUX
+ /**
+ * Cryogenic handle.
*/
- struct GNUNET_DISK_FileHandle cryogenic_fd;
+ struct GNUNET_DISK_FileHandle *cryogenic_fd;
+ /**
+ * Time out for cryogenic.
+ */
struct pm_times cryogenic_times;
+#endif
};
{
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;
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"),
{
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;
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"),
void
udp_broadcast_receive (struct Plugin *plugin,
- const char * buf,
+ const char *buf,
ssize_t size,
const struct sockaddr *addr,
size_t addrlen)
size, GNUNET_a2s ((const struct sockaddr *) addr, addrlen));
struct Mstv4Context *mc;
- mc = GNUNET_malloc (sizeof (struct Mstv4Context));
+ mc = GNUNET_new (struct Mstv4Context);
struct sockaddr_in *av4 = (struct sockaddr_in *) addr;
mc->addr.ipv4_addr = av4->sin_addr.s_addr;
size, GNUNET_a2s ((const struct sockaddr *) &addr, addrlen));
struct Mstv6Context *mc;
- mc = GNUNET_malloc (sizeof (struct Mstv6Context));
+ mc = GNUNET_new (struct Mstv6Context);
struct sockaddr_in6 *av6 = (struct sockaddr_in6 *) addr;
mc->addr.ipv6_addr = av6->sin6_addr;
GNUNET_a2s (baddr->addr, baddr->addrlen));
}
}
-
+
+#if LINUX
/*
* Cryogenic
*/
- if (baddr->cryogenic_fd.fd > 0)
+ if (NULL != baddr->cryogenic_fd)
{
- baddr->cryogenic_times.delay_msecs = (plugin->broadcast_interval/1000.0)*0.5;
- baddr->cryogenic_times.timeout_msecs = (plugin->broadcast_interval/1000.0)*1.5;
-
- if (ioctl(baddr->cryogenic_fd.fd,
+ baddr->cryogenic_times.delay_msecs = (plugin->broadcast_interval.rel_value_us/1000.0)*0.5;
+ baddr->cryogenic_times.timeout_msecs = (plugin->broadcast_interval.rel_value_us/1000.0)*1.5;
+
+ if (ioctl(baddr->cryogenic_fd->fd,
PM_SET_DELAY_AND_TIMEOUT,
&baddr->cryogenic_times) < 0)
{
&udp_ipv4_broadcast_send, baddr);
}
else
- GNUNET_SCHEDULER_add_write_file (&baddr->cryogenic_fd,
- &udp_ipv4_broadcast_send, baddr);
-
+ GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
+ baddr->cryogenic_fd,
+ &udp_ipv4_broadcast_send,
+ baddr);
+
}
else
+#endif
baddr->broadcast_task =
GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval,
&udp_ipv4_broadcast_send, baddr);
GNUNET_a2s ((const struct sockaddr *) &plugin->ipv6_multicast_address,
sizeof (struct sockaddr_in6)));
}
+#if LINUX
/*
* Cryogenic
*/
- if (baddr->cryogenic_fd.fd > 0)
+ if (NULL != baddr->cryogenic_fd)
{
- baddr->cryogenic_times.delay_msecs = (plugin->broadcast_interval/1000.0)*0.5;
- baddr->cryogenic_times.timeout_msecs = (plugin->broadcast_interval/1000.0)*1.5;
-
- if (ioctl(baddr->cryogenic_fd.fd,
+ baddr->cryogenic_times.delay_msecs = (plugin->broadcast_interval.rel_value_us/1000.0)*0.5;
+ baddr->cryogenic_times.timeout_msecs = (plugin->broadcast_interval.rel_value_us/1000.0)*1.5;
+
+ if (ioctl(baddr->cryogenic_fd->fd,
PM_SET_DELAY_AND_TIMEOUT,
&baddr->cryogenic_times) < 0)
{
&udp_ipv6_broadcast_send, baddr);
}
else
- GNUNET_SCHEDULER_add_write_file (&baddr->cryogenic_fd,
- &udp_ipv4_broadcast_send, baddr);
+ GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
+ baddr->cryogenic_fd,
+ &udp_ipv4_broadcast_send,
+ baddr);
}
else
+#endif
baddr->broadcast_task =
GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval,
&udp_ipv6_broadcast_send, baddr);
{
struct Plugin *plugin = cls;
struct BroadcastAddress *ba;
+ struct GNUNET_ATS_Information network;
if (NULL == addr)
return GNUNET_OK;
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)) )
{
-
- /*
- * setup Cryogenic FD for ipv4 broadcasting
- */
+#if LINUX
+ /*
+ * setup Cryogenic FD for ipv4 broadcasting
+ */
char *filename;
+
GNUNET_asprintf (&filename,
- "/dev/power/%s",
+ "/dev/cryogenic/%s",
name);
- ba->cryogenic_fd =
+ if (0 == ACCESS (name, R_OK))
+ {
+ ba->cryogenic_fd =
GNUNET_DISK_file_open (filename,
- GNUNET_DISK_OPEN_WRITE,
- GNUNET_DISK_PERM_NONE);
+ GNUNET_DISK_OPEN_WRITE,
+ GNUNET_DISK_PERM_NONE);
+ }
GNUNET_free (filename);
-
+#endif
ba->broadcast_task =
GNUNET_SCHEDULER_add_now (&udp_ipv4_broadcast_send, ba);
}
}
else
{
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "IPv6 multicasting running\n");
-
+#if LINUX
/*
* setup Cryogenic FD for ipv6 broadcasting
*/
char *filename;
+
GNUNET_asprintf (&filename,
- "/dev/power/%s",
+ "/dev/cryogenic/%s",
name);
- ba->cryogenic_fd =
+ if (0 == ACCESS (name, R_OK))
+ {
+ ba->cryogenic_fd =
GNUNET_DISK_file_open (filename,
- GNUNET_DISK_OPEN_WRITE,
- GNUNET_DISK_PERM_NONE);
+ GNUNET_DISK_OPEN_WRITE,
+ GNUNET_DISK_PERM_NONE);
+ }
GNUNET_free (filename);
-
-
+#endif
ba->broadcast_task =
GNUNET_SCHEDULER_add_now (&udp_ipv6_broadcast_send, ba);
}
const struct GNUNET_MessageHeader *hello;
hello = plugin->env->get_our_hello ();
- if (GNUNET_YES == GNUNET_HELLO_is_friend_only((const struct GNUNET_HELLO_Message *) hello))
+ if (GNUNET_YES ==
+ GNUNET_HELLO_is_friend_only ((const struct GNUNET_HELLO_Message *) hello))
{
LOG (GNUNET_ERROR_TYPE_WARNING,
_("Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"));
return;
}
+ /* always create tokenizers */
+ plugin->broadcast_ipv4_mst =
+ 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))
{
_("Failed to set IPv4 broadcast option for broadcast socket on port %d\n"),
ntohs (server_addrv4->sin_port));
}
- else
- {
- plugin->broadcast_ipv4_mst =
- GNUNET_SERVER_mst_create (broadcast_ipv4_mst_cb, plugin);
- LOG (GNUNET_ERROR_TYPE_DEBUG, "IPv4 Broadcasting running\n");
- }
}
+ /* create IPv6 multicast socket */
if ((GNUNET_YES == plugin->enable_ipv6) && (plugin->sockv6 != NULL))
{
memset (&plugin->ipv6_multicast_address, 0, sizeof (struct sockaddr_in6));
&plugin->ipv6_multicast_address.sin6_addr));
plugin->ipv6_multicast_address.sin6_family = AF_INET6;
plugin->ipv6_multicast_address.sin6_port = htons (plugin->port);
- plugin->broadcast_ipv6_mst =
- GNUNET_SERVER_mst_create (broadcast_ipv6_mst_cb, plugin);
}
GNUNET_OS_network_interfaces_list (&iface_proc, plugin);
}
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;
-
- multicastRequest.ipv6mr_multiaddr =
- plugin->ipv6_multicast_address.sin6_addr;
- multicastRequest.ipv6mr_interface = s6->sin6_scope_id;
+ struct BroadcastAddress *p = plugin->broadcast_head;
- /* 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");
+ }
}
- }
-
- /*
- * Close Cryogenic FD
- */
- GNUNET_DISK_file_cose(p->cryogenic_fd);
- GNUNET_CONTAINER_DLL_remove (plugin->broadcast_head,
- plugin->broadcast_tail, p);
- GNUNET_free (p->addr);
- GNUNET_free (p);
+#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);
+ }
}
- if (plugin->broadcast_ipv4_mst != NULL)
+
+ /* Destroy MSTs */
+ if (NULL != plugin->broadcast_ipv4_mst)
+ {
GNUNET_SERVER_mst_destroy (plugin->broadcast_ipv4_mst);
- if (plugin->broadcast_ipv6_mst != NULL)
+ plugin->broadcast_ipv4_mst = NULL;
+ }
+ if (NULL != plugin->broadcast_ipv6_mst)
+ {
GNUNET_SERVER_mst_destroy (plugin->broadcast_ipv6_mst);
+ plugin->broadcast_ipv6_mst = NULL;
+ }
}
/* end of plugin_transport_udp_broadcasting.c */