-improve indentation, reduce duplication of PIDs in core's neighbour map
[oweals/gnunet.git] / src / transport / gnunet-service-transport_clients.c
index 642e309e6e8b2ef14d1f3a3971a0cf934f1de7b2..f00f7c93f403e4c44c59a4cbe5fa86ee220e8078 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2010-2014 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2010-2015 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
  * @file transport/gnunet-service-transport_clients.c
- * @brief plugin management API
+ * @brief communication with clients (core service and monitors)
  * @author Christian Grothoff
  */
 #include "platform.h"
@@ -549,7 +549,9 @@ client_disconnect_notification (void *cls,
     tc->message_count--;
     GNUNET_free (mqe);
   }
-  GNUNET_CONTAINER_DLL_remove (clients_head, clients_tail, tc);
+  GNUNET_CONTAINER_DLL_remove (clients_head,
+                               clients_tail,
+                               tc);
   GNUNET_SERVER_client_set_user_context (client, NULL);
   if (NULL != tc->th)
   {
@@ -611,38 +613,47 @@ clients_handle_start (void *cls,
                       const struct GNUNET_MessageHeader *message)
 {
   const struct StartMessage *start;
+  const struct GNUNET_MessageHeader *hello;
   struct TransportClient *tc;
   uint32_t options;
 
   tc = lookup_client (client);
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Client %p sent START\n", tc);
   if (NULL != tc)
   {
     /* got 'start' twice from the same client, not allowed */
     GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    GNUNET_SERVER_receive_done (client,
+                                GNUNET_SYSERR);
     return;
   }
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Client %p sent START\n",
+              client);
   start = (const struct StartMessage *) message;
   options = ntohl (start->options);
   if ((0 != (1 & options)) &&
       (0 !=
-       memcmp (&start->self, &GST_my_identity,
+       memcmp (&start->self,
+               &GST_my_identity,
                sizeof (struct GNUNET_PeerIdentity))))
   {
     /* client thinks this is a different peer, reject */
     GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    GNUNET_SERVER_receive_done (client,
+                                GNUNET_SYSERR);
     return;
   }
   tc = setup_client (client);
   tc->send_payload = (0 != (2 & options));
-  unicast (tc,
-           GST_hello_get (),
-           GNUNET_NO);
-  GST_neighbours_iterate (&notify_client_about_neighbour, tc);
-  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+  hello = GST_hello_get ();
+  if (NULL != hello)
+    unicast (tc,
+             hello,
+             GNUNET_NO);
+  GST_neighbours_iterate (&notify_client_about_neighbour,
+                          tc);
+  GNUNET_SERVER_receive_done (client,
+                              GNUNET_OK);
 }
 
 
@@ -698,9 +709,6 @@ handle_send_transmit_continuation (void *cls,
   struct SendTransmitContinuationContext *stcc = cls;
   struct SendOkMessage send_ok_msg;
 
-  if (GNUNET_OK == success)
-    GST_neighbours_notify_payload_sent (&stcc->target,
-                                        bytes_payload);
   send_ok_msg.header.size = htons (sizeof (send_ok_msg));
   send_ok_msg.header.type = htons (GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK);
   send_ok_msg.bytes_msg = htonl (bytes_payload);
@@ -739,7 +747,8 @@ clients_handle_send (void *cls,
   {
     /* client asked for transmission before 'START' */
     GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    GNUNET_SERVER_receive_done (client,
+                                GNUNET_SYSERR);
     return;
   }
 
@@ -748,7 +757,8 @@ clients_handle_send (void *cls,
       sizeof (struct OutboundMessage) + sizeof (struct GNUNET_MessageHeader))
   {
     GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    GNUNET_SERVER_receive_done (client,
+                                GNUNET_SYSERR);
     return;
   }
   obm = (const struct OutboundMessage *) message;
@@ -757,7 +767,8 @@ clients_handle_send (void *cls,
   if (msize < sizeof (struct GNUNET_MessageHeader))
   {
     GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    GNUNET_SERVER_receive_done (client,
+                                GNUNET_SYSERR);
     return;
   }
 
@@ -771,52 +782,27 @@ clients_handle_send (void *cls,
                               gettext_noop
                               ("# bytes payload dropped (other peer was not connected)"),
                               msize, GNUNET_NO);
-    GNUNET_SERVER_receive_done (client, GNUNET_OK);
+    GNUNET_SERVER_receive_done (client,
+                                GNUNET_OK);
     return;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Received `%s' request from client with target `%4s' and first message of type %u and total size %u\n",
-              "SEND",
+              "Received SEND request for `%s' and first message of type %u and total size %u\n",
               GNUNET_i2s (&obm->peer),
               ntohs (obmm->type),
               msize);
-  GNUNET_SERVER_receive_done (client, GNUNET_OK);
+  GNUNET_SERVER_receive_done (client,
+                              GNUNET_OK);
   stcc = GNUNET_new (struct SendTransmitContinuationContext);
   stcc->target = obm->peer;
   stcc->client = client;
   GNUNET_SERVER_client_keep (client);
-  GST_manipulation_send (&obm->peer, obmm, msize,
+  GST_manipulation_send (&obm->peer,
+                         obmm,
+                         msize,
                          GNUNET_TIME_relative_ntoh (obm->timeout),
-                         &handle_send_transmit_continuation, stcc);
-}
-
-
-/**
- * Try to initiate a connection to the given peer if the blacklist
- * allowed it.
- *
- * @param cls closure (unused, NULL)
- * @param peer identity of peer that was tested
- * @param result #GNUNET_OK if the connection is allowed,
- *               #GNUNET_NO if not
- */
-static void
-try_connect_if_allowed (void *cls,
-                        const struct GNUNET_PeerIdentity *peer,
-                        int result)
-{
-  if (GNUNET_OK != result)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-                _("Blacklist refuses connection attempt to peer `%s'\n"),
-                GNUNET_i2s (peer));
-    return;                     /* not allowed */
-  }
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Blacklist allows connection attempt to peer `%s'\n",
-              GNUNET_i2s (peer));
-
-  GST_neighbours_try_connect (peer);
+                         &handle_send_transmit_continuation,
+                         stcc);
 }
 
 
@@ -845,16 +831,14 @@ clients_handle_request_connect (void *cls,
                    sizeof (struct GNUNET_PeerIdentity)))
   {
     GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_OK);
+    GNUNET_SERVER_receive_done (client,
+                                GNUNET_OK);
     return;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Received a request connect message for peer `%s'\n",
               GNUNET_i2s (&trcm->peer));
-  (void) GST_blacklist_test_allowed (&trcm->peer,
-                                     NULL,
-                                     &try_connect_if_allowed,
-                                     NULL);
+  GST_neighbours_try_connect (&trcm->peer);
   GNUNET_SERVER_receive_done (client, GNUNET_OK);
 }
 
@@ -1025,6 +1009,9 @@ clients_handle_address_to_string (void *cls,
   papi = GST_plugins_printer_find (plugin_name);
   if (NULL == papi)
   {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Failed to find plugin `%s'\n",
+                plugin_name);
     atsm.header.size = ntohs (sizeof (struct AddressToStringResultMessage));
     atsm.header.type = ntohs (GNUNET_MESSAGE_TYPE_TRANSPORT_ADDRESS_TO_STRING_REPLY);
     atsm.res = htonl (GNUNET_SYSERR);
@@ -1044,6 +1031,10 @@ clients_handle_address_to_string (void *cls,
   actx->tc = tc;
   GNUNET_CONTAINER_DLL_insert (a2s_head, a2s_tail, actx);
   GNUNET_SERVER_disable_receive_done_warning (client);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Pretty-printing address of %u bytes using plugin `%s'\n",
+              address_len,
+              plugin_name);
   papi->address_pretty_printer (papi->cls,
                                 plugin_name,
                                 address, address_len,
@@ -1078,7 +1069,10 @@ compose_address_iterate_response_message (const struct GNUNET_PeerIdentity *peer
     alen = address->address_length;
   }
   else
-    tlen = alen = 0;
+  {
+    tlen = 0;
+    alen = 0;
+  }
   size = (sizeof (struct PeerIterateResponseMessage) + alen + tlen);
   msg = GNUNET_malloc (size);
   msg->header.size = htons (size);
@@ -1176,7 +1170,6 @@ struct IterationContext
  * Output information of validation entries to the given client.
  *
  * @param cls the `struct IterationContext *`
- * @param peer identity of the neighbour
  * @param address the address
  * @param last_validation point in time when last validation was performed
  * @param valid_until point in time how long address is valid
@@ -1185,7 +1178,6 @@ struct IterationContext
  */
 static void
 send_validation_information (void *cls,
-                             const struct GNUNET_PeerIdentity *peer,
                              const struct GNUNET_HELLO_Address *address,
                              struct GNUNET_TIME_Absolute last_validation,
                              struct GNUNET_TIME_Absolute valid_until,
@@ -1196,13 +1188,13 @@ send_validation_information (void *cls,
   struct ValidationIterateResponseMessage *msg;
 
   if ( (GNUNET_YES != pc->all) &&
-       (0 != memcmp (peer, &pc->id, sizeof (pc->id))) )
+       (0 != memcmp (&address->peer, &pc->id, sizeof (pc->id))) )
     return;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Sending information about for validation entry for peer `%s' using address `%s'\n",
-              GNUNET_i2s(peer),
+              GNUNET_i2s (&address->peer),
               (NULL != address) ? GST_plugins_a2s (address) : "<none>");
-  msg = compose_validation_iterate_response_message (peer, address);
+  msg = compose_validation_iterate_response_message (&address->peer, address);
   msg->last_validation = GNUNET_TIME_absolute_hton(last_validation);
   msg->valid_until = GNUNET_TIME_absolute_hton(valid_until);
   msg->next_validation = GNUNET_TIME_absolute_hton(next_validation);
@@ -1274,7 +1266,8 @@ clients_handle_monitor_peers (void *cls,
                                           client)) )
   {
     GNUNET_break (0);
-    GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
+    GNUNET_SERVER_receive_done (client,
+                                GNUNET_SYSERR);
     return;
   }
   GNUNET_SERVER_disable_receive_done_warning (client);
@@ -1296,19 +1289,23 @@ clients_handle_monitor_peers (void *cls,
     pc.all = GNUNET_NO;
     pc.id = msg->peer;
   }
-  GST_neighbours_iterate (&send_peer_information, &pc);
+  GST_neighbours_iterate (&send_peer_information,
+                          &pc);
 
   if (GNUNET_YES != ntohl (msg->one_shot))
   {
-    setup_peer_monitoring_client (client, &msg->peer);
+    setup_peer_monitoring_client (client,
+                                  &msg->peer);
   }
   else
   {
-    GNUNET_SERVER_transmit_context_append_data (tc, NULL, 0,
-        GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_RESPONSE);
+    GNUNET_SERVER_transmit_context_append_data (tc,
+                                                NULL,
+                                                0,
+                                                GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PEER_RESPONSE);
   }
-
-  GNUNET_SERVER_transmit_context_run (tc, GNUNET_TIME_UNIT_FOREVER_REL);
+  GNUNET_SERVER_transmit_context_run (tc,
+                                      GNUNET_TIME_UNIT_FOREVER_REL);
 }
 
 
@@ -1411,8 +1408,8 @@ plugin_session_info_cb (void *cls,
 
   if (0 == GNUNET_SERVER_notification_context_get_size (plugin_nc))
   {
-    fprintf (stderr, "UNSUB!\n");
-    GST_plugins_monitor_subscribe (NULL, NULL);
+    GST_plugins_monitor_subscribe (NULL,
+                                   NULL);
     return;
   }
   if ( (NULL == info) &&
@@ -1458,9 +1455,13 @@ plugin_session_info_cb (void *cls,
   msg->plugin_name_len = htons (slen);
   msg->plugin_address_len = htons (alen);
   name = (char *) &msg[1];
-  memcpy (name, info->address->transport_name, slen);
-  addr = &name[slen + 1];
-  memcpy (addr, info->address->address, alen);
+  memcpy (name,
+          info->address->transport_name,
+          slen);
+  addr = &name[slen];
+  memcpy (addr,
+          info->address->address,
+          alen);
   if (NULL != sync_client)
     GNUNET_SERVER_notification_context_unicast (plugin_nc,
                                                 sync_client,
@@ -1488,9 +1489,12 @@ clients_handle_monitor_plugins (void *cls,
 {
   GNUNET_SERVER_client_mark_monitor (client);
   GNUNET_SERVER_disable_receive_done_warning (client);
-  GNUNET_SERVER_notification_context_add (plugin_nc, client);
+  GNUNET_SERVER_notification_context_add (plugin_nc,
+                                          client);
+  GNUNET_assert (NULL == sync_client);
   sync_client = client;
-  GST_plugins_monitor_subscribe (&plugin_session_info_cb, NULL);
+  GST_plugins_monitor_subscribe (&plugin_session_info_cb,
+                                 NULL);
 }
 
 
@@ -1530,7 +1534,8 @@ GST_clients_start (struct GNUNET_SERVER_Handle *server)
      GNUNET_MESSAGE_TYPE_TRANSPORT_BLACKLIST_REPLY,
      sizeof (struct BlacklistMessage)},
     {&GST_manipulation_set_metric, NULL,
-     GNUNET_MESSAGE_TYPE_TRANSPORT_TRAFFIC_METRIC, 0},
+     GNUNET_MESSAGE_TYPE_TRANSPORT_TRAFFIC_METRIC,
+     sizeof (struct TrafficMetricMessage) },
     {&clients_handle_monitor_plugins, NULL,
      GNUNET_MESSAGE_TYPE_TRANSPORT_MONITOR_PLUGIN_START,
      sizeof (struct GNUNET_MessageHeader) },
@@ -1590,6 +1595,10 @@ GST_clients_broadcast (const struct GNUNET_MessageHeader *msg,
 {
   struct TransportClient *tc;
 
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Asked to broadcast message of type %u with %u bytes\n",
+              (unsigned int) ntohs (msg->type),
+              (unsigned int) ntohs (msg->size));
   for (tc = clients_head; NULL != tc; tc = tc->next)
   {
     if ( (GNUNET_YES == may_drop) &&