refactor DHT for new service API
[oweals/gnunet.git] / src / cadet / cadet_common.c
index b1d0501b2bc8d7d96e8346916e83d86d5a63c066..c24bc5c4b6b97a3b0c6f1be5a355e23917f3f66c 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2012 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2012 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
      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.
 */
 
 /**
@@ -47,7 +47,7 @@ GC_f2s (int fwd)
   else
   {
     /* Not an error, can happen with CONNECTION_BROKEN messages. */
-    return "";
+    return "\???";
   }
 }
 
@@ -81,7 +81,7 @@ const struct GNUNET_HashCode *
 GC_h2hc (const struct GNUNET_CADET_Hash *id)
 {
   static struct GNUNET_HashCode hc;
-  memcpy (&hc, id, sizeof (*id));
+  GNUNET_memcpy (&hc, id, sizeof (*id));
 
   return &hc;
 }
@@ -92,253 +92,293 @@ GC_h2s (const struct GNUNET_CADET_Hash *id)
 {
   static char s[53];
 
-  memcpy (s, GNUNET_h2s_full (GC_h2hc (id)), 52);
+  GNUNET_memcpy (s, GNUNET_h2s_full (GC_h2hc (id)), 52);
   s[52] = '\0';
 
   return s;
 }
 
 
+/**
+ * Allocate a string with a hexdump of any binary data.
+ *
+ * @param bin Arbitrary binary data.
+ * @param len Length of @a bin in bytes.
+ * @param output Where to write the output (if *output be NULL it's allocated).
+ *
+ * @return The size of the output.
+ */
+size_t
+GC_bin2s (void *bin, unsigned int len, char **output)
+{
+  char *data = bin;
+  char *buf;
+  unsigned int s_len;
+  unsigned int i;
+
+  s_len = 2 * len + 1;
+  if (NULL == *output)
+    *output = GNUNET_malloc (s_len);
+  buf = *output;
+
+  for (i = 0; i < len; i++)
+  {
+    SPRINTF (&buf[2 * i], "%2X", data[i]);
+  }
+  buf[s_len - 1] = '\0';
+
+  return s_len;
+}
+
+
 #if !defined(GNUNET_CULL_LOGGING)
 const char *
 GC_m2s (uint16_t m)
 {
-  static char buf[2][32];
+  static char buf[2][16];
   static int idx;
-  const char *t;
+  const char *s;
 
   idx = (idx + 1) % 2;
   switch (m)
   {
+    /**
+     * Used to mark the "payload" of a non-payload message.
+     */
+    case 0:
+      s = "retransmit";
+      break;
+
       /**
        * Request the creation of a path
        */
     case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_CREATE:
-      t = "CONNECTION_CREATE";
+      s = "CONN_CREAT";
       break;
 
       /**
        * Request the modification of an existing path
        */
     case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_ACK:
-      t = "CONNECTION_ACK";
+      s = "CONN_ACK";
       break;
 
       /**
        * Notify that a connection of a path is no longer valid
        */
     case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_BROKEN:
-      t = "CONNECTION_BROKEN";
+      s = "CONN_BRKN";
       break;
 
       /**
        * At some point, the route will spontaneously change
        */
     case GNUNET_MESSAGE_TYPE_CADET_PATH_CHANGED:
-      t = "PATH_CHANGED";
+      s = "PATH_CHNGD";
       break;
 
       /**
        * Transport payload data.
        */
     case GNUNET_MESSAGE_TYPE_CADET_DATA:
-      t = "DATA";
+      s = "DATA";
       break;
 
     /**
      * Confirm receipt of payload data.
      */
     case GNUNET_MESSAGE_TYPE_CADET_DATA_ACK:
-      t = "DATA_ACK";
+      s = "DATA_ACK";
       break;
 
       /**
        * Key exchange encapsulation.
        */
     case GNUNET_MESSAGE_TYPE_CADET_KX:
-      t = "KX";
-      break;
-
-      /**
-       * New ephemeral key.
-       */
-    case GNUNET_MESSAGE_TYPE_CADET_KX_EPHEMERAL:
-      t = "KX_EPHEMERAL";
+      s = "KX";
       break;
 
       /**
-       * Challenge to test peer's session key.
+       * Axolotl key exchange message.
        */
-    case GNUNET_MESSAGE_TYPE_CADET_KX_PING:
-      t = "KX_PING";
-      break;
-
-      /**
-       * Answer to session key challenge.
-       */
-    case GNUNET_MESSAGE_TYPE_CADET_KX_PONG:
-      t = "KX_PONG";
+    case GNUNET_MESSAGE_TYPE_CADET_AX_KX:
+      s = "AX_KX";
       break;
 
       /**
        * Request the destuction of a path
        */
     case GNUNET_MESSAGE_TYPE_CADET_CONNECTION_DESTROY:
-      t = "CONNECTION_DESTROY";
+      s = "CONN_DSTRY";
       break;
 
       /**
        * ACK for a data packet.
        */
     case GNUNET_MESSAGE_TYPE_CADET_ACK:
-      t = "ACK";
+      s = "ACK";
       break;
 
       /**
        * POLL for ACK.
        */
     case GNUNET_MESSAGE_TYPE_CADET_POLL:
-      t = "POLL";
+      s = "POLL";
       break;
 
       /**
        * Announce origin is still alive.
        */
     case GNUNET_MESSAGE_TYPE_CADET_KEEPALIVE:
-      t = "KEEPALIVE";
+      s = "KEEPALIVE";
       break;
 
-    /**
-       * Connect to the cadet service, specifying subscriptions
+      /**
+       * Open port
        */
-    case GNUNET_MESSAGE_TYPE_CADET_LOCAL_CONNECT:
-      t = "LOCAL_CONNECT";
+    case GNUNET_MESSAGE_TYPE_CADET_LOCAL_PORT_OPEN:
+      s = "OPEN_PORT";
+      break;
+
+      /**
+       * Close port
+       */
+    case GNUNET_MESSAGE_TYPE_CADET_LOCAL_PORT_CLOSE:
+      s = "CLOSE_PORT";
       break;
 
       /**
        * Ask the cadet service to create a new tunnel
        */
     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_CREATE:
-      t = "CHANNEL_CREATE";
+      s = "CHAN_CREAT";
       break;
 
       /**
        * Ask the cadet service to destroy a tunnel
        */
     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_DESTROY:
-      t = "CHANNEL_DESTROY";
+      s = "CHAN_DSTRY";
       break;
 
       /**
        * Confirm the creation of a channel.
        */
     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_ACK:
-      t = "CHANNEL_ACK";
+      s = "CHAN_ACK";
       break;
 
       /**
        * Confirm the creation of a channel.
        */
     case GNUNET_MESSAGE_TYPE_CADET_CHANNEL_NACK:
-      t = "CHANNEL_NACK";
+      s = "CHAN_NACK";
       break;
 
       /**
-       * Encrypted payload.
+       * Axolotl encrypted payload.
        */
-    case GNUNET_MESSAGE_TYPE_CADET_ENCRYPTED:
-      t = "ENCRYPTED";
+    case GNUNET_MESSAGE_TYPE_CADET_AX:
+      s = "AX";
       break;
 
       /**
        * Local payload traffic
        */
     case GNUNET_MESSAGE_TYPE_CADET_LOCAL_DATA:
-      t = "LOCAL_DATA";
+      s = "LOC_DATA";
       break;
 
       /**
        * Local ACK for data.
        */
     case GNUNET_MESSAGE_TYPE_CADET_LOCAL_ACK:
-      t = "LOCAL_ACK";
+      s = "LOC_ACK";
       break;
 
       /**
        * Local monitoring of channels.
        */
     case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_CHANNELS:
-      t = "LOCAL_INFO_CHANNELS";
+      s = "INFO_CHANS";
       break;
 
       /**
        * Local monitoring of a channel.
        */
     case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_CHANNEL:
-      t = "LOCAL_INFO_CHANNEL";
+      s = "INFO_CHAN";
       break;
 
       /**
        * Local monitoring of service.
        */
     case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNELS:
-      t = "LOCAL_INFO_TUNNELS";
+      s = "INFO_TUNS";
       break;
 
       /**
        * Local monitoring of service.
        */
     case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_TUNNEL:
-      t = "LOCAL_INFO_TUNNEL";
+      s = "INFO_TUN";
       break;
 
       /**
        * Local information about all connections of service.
        */
     case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_CONNECTIONS:
-      t = "LOCAL_INFO_CONNECTIONS";
+      s = "INFO_CONNS";
       break;
 
       /**
        * Local information of service about a specific connection.
        */
     case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_CONNECTION:
-      t = "LOCAL_INFO_CONNECTION";
+      s = "INFO_CONN";
       break;
 
       /**
        * Local information about all peers known to the service.
        */
     case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEERS:
-      t = "LOCAL_INFO_PEERS";
+      s = "INFO_PEERS";
       break;
 
       /**
        * Local information of service about a specific peer.
        */
     case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_PEER:
-      t = "LOCAL_INFO_PEER";
+      s = "INFO_PEER";
       break;
 
       /**
        * Traffic (net-cat style) used by the Command Line Interface.
        */
     case GNUNET_MESSAGE_TYPE_CADET_CLI:
-      t = "CLI";
+      s = "CLI";
       break;
 
       /**
        * Debug request.
        */
     case GNUNET_MESSAGE_TYPE_CADET_LOCAL_INFO_DUMP:
-      t = "INFO_DUMP";
+      s = "INFO_DUMP";
       break;
 
+      /**
+       * Used to mark the "payload" of a non-payload message.
+       */
+    case UINT16_MAX:
+      s = "      N/A";
+      break;
+
+
     default:
-      sprintf(buf[idx], "%u (UNKNOWN TYPE)", m);
+      SPRINTF (buf[idx], "{UNK: %5u}", m);
       return buf[idx];
   }
-  sprintf(buf[idx], "{%18s}", t);
+  SPRINTF (buf[idx], "{%10s}", s);
   return buf[idx];
 }
 #else