};
-
-void
+int
broadcast_ipv6_mst_cb (void *cls, void *client,
const struct GNUNET_MessageHeader *message)
{
struct Plugin *plugin = cls;
struct Mstv6Context *mc = client;
const struct GNUNET_MessageHeader *hello;
- struct UDP_Beacon_Message *msg;
+ const struct UDP_Beacon_Message *msg;
+ struct GNUNET_ATS_Information atsi;
- msg = (struct UDP_Beacon_Message *) message;
+ msg = (const struct UDP_Beacon_Message *) message;
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),
udp_address_to_string (NULL, &mc->addr, sizeof (mc->addr)));
- struct GNUNET_ATS_Information atsi[2];
/* setup ATS */
- atsi[0].type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
- atsi[0].value = htonl (1);
- atsi[1].type = htonl (GNUNET_ATS_NETWORK_TYPE);
- atsi[1].value = mc->ats_address_network_type;
+ atsi.type = htonl (GNUNET_ATS_NETWORK_TYPE);
+ atsi.value = mc->ats_address_network_type;
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,
- (const struct GNUNET_ATS_Information *) &atsi, 2, NULL,
- (const char *) &mc->addr, sizeof (mc->addr));
+ 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);
GNUNET_STATISTICS_update (plugin->env->stats,
_
("# 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)
{
struct Plugin *plugin = cls;
struct Mstv4Context *mc = client;
const struct GNUNET_MessageHeader *hello;
- struct UDP_Beacon_Message *msg;
+ const struct UDP_Beacon_Message *msg;
+ struct GNUNET_ATS_Information atsi;
- msg = (struct UDP_Beacon_Message *) message;
+ msg = (const struct UDP_Beacon_Message *) message;
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),
udp_address_to_string (NULL, &mc->addr, sizeof (mc->addr)));
- struct GNUNET_ATS_Information atsi[2];
/* setup ATS */
- atsi[0].type = htonl (GNUNET_ATS_QUALITY_NET_DISTANCE);
- atsi[0].value = htonl (1);
- atsi[1].type = htonl (GNUNET_ATS_NETWORK_TYPE);
- atsi[1].value = mc->ats_address_network_type;
+ atsi.type = htonl (GNUNET_ATS_NETWORK_TYPE);
+ atsi.value = mc->ats_address_network_type;
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,
- (const struct GNUNET_ATS_Information *) &atsi, 2, NULL,
- (const char *) &mc->addr, sizeof (mc->addr));
+ 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);
GNUNET_STATISTICS_update (plugin->env->stats,
_
("# IPv4 broadcast HELLO beacons received via udp"),
1, GNUNET_NO);
GNUNET_free (mc);
+ return GNUNET_OK;
}
void
{
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",
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",
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))
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);
plugin->send_ipv4_broadcast_task = GNUNET_SCHEDULER_NO_TASK;
msg_size = prepare_beacon(plugin, (struct UDP_Beacon_Message *) &buf);
- 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;
(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,
plugin->send_ipv6_broadcast_task = GNUNET_SCHEDULER_NO_TASK;
msg_size = prepare_beacon(plugin, (struct UDP_Beacon_Message *) &buf);
- sent = 0;
sent = GNUNET_NETWORK_socket_sendto (plugin->sockv6, &buf, msg_size,
(const struct sockaddr *)
&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,
void
setup_broadcast (struct Plugin *plugin, struct sockaddr_in6 *serverAddrv6, struct sockaddr_in *serverAddrv4)
{
+ 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))
+ {
+ LOG (GNUNET_ERROR_TYPE_WARNING,
+ _("Disabling HELLO broadcasting due to friend-to-friend only configuration!\n"));
+ return;
+ }
+
+
/* create IPv4 broadcast socket */
plugin->broadcast_ipv4 = GNUNET_NO;
- if (plugin->sockv4 != NULL)
+ if ((GNUNET_YES == plugin->enable_ipv4) && (plugin->sockv4 != NULL))
{
int yes = 1;
}
plugin->broadcast_ipv6 = GNUNET_NO;
- if (plugin->sockv6 != NULL)
+ if ((GNUNET_YES == plugin->enable_ipv6) && (plugin->sockv6 != NULL))
{
memset (&plugin->ipv6_multicast_address, 0, sizeof (struct sockaddr_in6));
GNUNET_assert (1 ==