(no commit message)
authorMatthias Wachs <wachs@net.in.tum.de>
Thu, 13 Oct 2011 14:40:39 +0000 (14:40 +0000)
committerMatthias Wachs <wachs@net.in.tum.de>
Thu, 13 Oct 2011 14:40:39 +0000 (14:40 +0000)
src/transport/gnunet-service-transport_neighbours.c

index 51524556fcf56c018351cc9f28e93f2bcba43928..a3582d5b5eb0a2f48266271078099e6d384072e7 100644 (file)
@@ -614,6 +614,52 @@ GST_neighbours_stop ()
   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
@@ -637,7 +683,7 @@ GST_neighbours_switch_to_address (const struct GNUNET_PeerIdentity *peer,
 {
   struct NeighbourMapEntry *n;
   struct SessionConnectMessage connect_msg;
-  int was_connected;
+  struct AddressContext *ac;
 
   GNUNET_assert (neighbours != NULL);
 
@@ -649,12 +695,10 @@ GST_neighbours_switch_to_address (const struct GNUNET_PeerIdentity *peer,
     // 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,
@@ -662,6 +706,12 @@ GST_neighbours_switch_to_address (const struct GNUNET_PeerIdentity *peer,
               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);
@@ -680,17 +730,10 @@ GST_neighbours_switch_to_address (const struct GNUNET_PeerIdentity *peer,
   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);
 }
 
 /**