disconnect_notify_cb = NULL;
}
+struct AddressContext
+{
+ struct NeighbourMapEntry * n;
+ struct GNUNET_TRANSPORT_ATS_Information * ats;
+ uint32_t ats_count;
+};
+
+void neighbour_send_cb (void *cls, int success)
+{
+ struct AddressContext * ac = cls;
+ struct NeighbourMapEntry * n = ac->n;
+ int was_connected = n->is_connected;
+
+ if (success == GNUNET_YES)
+ {
+ n->is_connected = GNUNET_YES;
+
+ /* was already connected */
+ if (was_connected == GNUNET_YES)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Successfully switched to address `%s' for peer `%s' \n",
+ GST_plugins_a2s(n->plugin_name, n->addr, n->addrlen),
+ GNUNET_i2s (&n->id));
+ GNUNET_free (ac);
+ return;
+ }
+
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Successfully connected to peer `%s' with address `%s'\n",
+ GNUNET_i2s (&n->id),
+ GST_plugins_a2s(n->plugin_name, n->addr, n->addrlen));
+
+ neighbours_connected++;
+ GNUNET_STATISTICS_update (GST_stats, gettext_noop ("# peers connected"), 1,
+ GNUNET_NO);
+ connect_notify_cb (callback_cls, &n->id, ac->ats, ac->ats_count);
+ GNUNET_free (ac);
+ return;
+ }
+
+ /* Could not connecte using this address, notifying ATS about bad address */
+ GNUNET_ATS_address_destroyed(GST_ats, &n->id, n->plugin_name, n->addr, n->addrlen, n->session);
+ GNUNET_ATS_suggest_address(GST_ats, &n->id);
+ GNUNET_free (ac);
+}
/**
* For an existing neighbour record, set the active connection to
{
struct NeighbourMapEntry *n;
struct SessionConnectMessage connect_msg;
- int was_connected;
+ struct AddressContext *ac;
GNUNET_assert (neighbours != NULL);
// GNUNET_break (0);
return;
}
- was_connected = n->is_connected;
- n->is_connected = GNUNET_YES;
#if DEBUG_TRANSPORT
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
- "SWITCH! Peer `%4s' switches to plugin `%s' address '%s' session %X\n",
+ "Peer `%4s' switches to plugin `%s' address '%s' session %X\n",
GNUNET_i2s (peer), plugin_name,
(address_len == 0) ? "<inbound>" : GST_plugins_a2s (plugin_name,
address,
session);
#endif
+ ac = GNUNET_malloc(sizeof (struct AddressContext) +
+ ats_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information));
+ ac->n = n;
+ ac->ats_count = ats_count;
+ memcpy(&ac[1],ats, ats_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information));
+
GNUNET_free_non_null (n->addr);
n->addr = GNUNET_malloc (address_len);
memcpy (n->addr, address, address_len);
connect_msg.timestamp =
GNUNET_TIME_absolute_hton (GNUNET_TIME_absolute_get ());
GST_neighbours_send (peer, &connect_msg, sizeof (connect_msg),
- GNUNET_TIME_UNIT_FOREVER_REL, NULL, NULL);
+ GNUNET_TIME_UNIT_FOREVER_REL, &neighbour_send_cb, ac);
n->keepalive_task = GNUNET_SCHEDULER_add_now (&neighbour_keepalive_task,
n);
- if (GNUNET_YES == was_connected)
- return;
- /* First tell clients about connected neighbours...*/
- neighbours_connected++;
- GNUNET_STATISTICS_update (GST_stats, gettext_noop ("# peers connected"), 1,
- GNUNET_NO);
- connect_notify_cb (callback_cls, peer, ats, ats_count);
}
/**