safety check
[oweals/gnunet.git] / src / transport / transport_api.c
index 414af01788e034beca088a83d86175b8058fd5a2..ca2f2cc609444135d1915835509fbd76c2dbabc9 100644 (file)
@@ -815,18 +815,39 @@ schedule_control_transmit (struct GNUNET_TRANSPORT_Handle *h,
 }
 
 
+/**
+ * FIXME: document
+ */
 struct SetQuotaContext
 {
+  /**
+   * FIXME: document
+   */
   struct GNUNET_TRANSPORT_Handle *handle;
 
+  /**
+   * FIXME: document
+   */
   struct GNUNET_PeerIdentity target;
 
+  /**
+   * FIXME: document
+   */
   GNUNET_SCHEDULER_Task cont;
 
+  /**
+   * Closure for 'cont'.
+   */
   void *cont_cls;
 
+  /**
+   * FIXME: document
+   */
   struct GNUNET_TIME_Absolute timeout;
 
+  /**
+   * FIXME: document
+   */
   struct GNUNET_BANDWIDTH_Value32NBO quota_in;
 };
 
@@ -1178,6 +1199,13 @@ neighbour_disconnect (struct NeighbourList *n)
 #endif
   GNUNET_break (n->is_connected == GNUNET_YES);
   n->is_connected = GNUNET_NO;
+  /* FIXME: this 'in_disconnect' flag is dubious; we should define 
+     clearly what disconnect means for pending 'notify_transmit_ready'
+     requests; maybe a good approach is to REQUIRE clients to 
+     call 'notify_transmit_ready_cancel' on pending requests on disconnect
+     and otherwise FAIL HARD with an assertion failure before 
+     'neighbour_free' right here (transmit_stage would be forced
+     to 'TS_NEW') */
   n->in_disconnect = GNUNET_YES;
   if (h->nd_cb != NULL)
     h->nd_cb (h->cls, &n->id);
@@ -1509,6 +1537,12 @@ GNUNET_TRANSPORT_disconnect (struct GNUNET_TRANSPORT_Handle *handle)
 #if DEBUG_TRANSPORT
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Transport disconnect called!\n");
 #endif
+  /* FIXME: this flag is dubious, we should be able to do this
+     more cleanly; also, we should probably do 'disconnect'
+     callbacks for every connected peer here, i.e. by calling
+     the iterator with 'forget_neighbours' instead of 'delete_neighbours'.
+  */
+  
   handle->in_disconnect = GNUNET_YES;
 
   GNUNET_assert (GNUNET_SYSERR !=
@@ -1600,6 +1634,7 @@ demultiplexer (void *cls, const struct GNUNET_MessageHeader *msg)
   struct NeighbourList *n;
   struct GNUNET_PeerIdentity me;
   uint16_t size;
+  uint32_t ats_count;
 
   if (h->client == NULL)
     {
@@ -1661,12 +1696,20 @@ demultiplexer (void *cls, const struct GNUNET_MessageHeader *msg)
         }
       break;
     case GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT:
-      if (size != sizeof (struct ConnectInfoMessage))
+
+      if (size < sizeof (struct ConnectInfoMessage))
         {
           GNUNET_break (0);
           break;
         }
       cim = (const struct ConnectInfoMessage *) msg;
+      ats_count = ntohl (cim->ats_count);
+      if (size != sizeof (struct ConnectInfoMessage) + ats_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information))
+        {
+          GNUNET_break (0);
+          break;
+        }
+
 #if DEBUG_TRANSPORT
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                   "Receiving `%s' message for `%4s'.\n",
@@ -1674,29 +1717,16 @@ demultiplexer (void *cls, const struct GNUNET_MessageHeader *msg)
 #endif
       n = neighbour_find (h, &cim->id);
       if (n == NULL)
-       n = neighbour_add (h,
-                          &cim->id);
+         n = neighbour_add (h, &cim->id);
       if (n == NULL)
-       {
-         GNUNET_break (0);
-         return;
-       }
+                return;
       GNUNET_break (n->is_connected == GNUNET_NO);
-      if (ntohl ((&cim->ats)[ntohl (cim->ats_count)].type) != GNUNET_TRANSPORT_ATS_ARRAY_TERMINATOR)
-       {
-         GNUNET_break (0);
-         return;
-       }
-      fprintf(stderr,"transport_api GNUNET_MESSAGE_TYPE_TRANSPORT_CONNECT ats_count %u\n",ntohl (cim->ats_count));
-     n->is_connected = GNUNET_YES;
+      n->is_connected = GNUNET_YES;
+      /* FIXME */
       if (h->nc_cb != NULL)
-                 h->nc_cb (h->cls, &n->id,
-                   NULL,
-                   0);
-     /*  if (h->nc_cb != NULL)
          h->nc_cb (h->cls, &n->id,
-                   &(cim->ats), 
-                   ntohl (cim->ats_count));*/
+                 &cim->ats,ats_count);
+      /* FIXEND */
       break;
     case GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT:
       if (size != sizeof (struct DisconnectInfoMessage))
@@ -1764,9 +1794,11 @@ demultiplexer (void *cls, const struct GNUNET_MessageHeader *msg)
         }
       im = (const struct InboundMessage *) msg;
       GNUNET_break (0 == ntohl (im->reserved));
-      GNUNET_assert(sizeof (struct InboundMessage) + ntohl(im->ats_count) * sizeof(struct GNUNET_TRANSPORT_ATS_Information) + sizeof (struct GNUNET_MessageHeader) <= size);
-      imm = (const struct GNUNET_MessageHeader *) &((&im->ats)[ntohl(im->ats_count)+1]);
-      if (ntohs (imm->size) + sizeof (struct InboundMessage) + ntohl(im->ats_count) * sizeof(struct GNUNET_TRANSPORT_ATS_Information) != size)
+      ats_count = ntohl(im->ats_count);
+      //imm = (const struct GNUNET_MessageHeader *) &im[1];
+      imm = (const struct GNUNET_MessageHeader *) &((&(im->ats))[ats_count+1]);
+
+      if (ntohs (imm->size) + sizeof (struct InboundMessage) + ats_count * sizeof (struct GNUNET_TRANSPORT_ATS_Information) != size)
         {
           GNUNET_break (0);
           break;
@@ -1787,22 +1819,11 @@ demultiplexer (void *cls, const struct GNUNET_MessageHeader *msg)
          GNUNET_break (0);
          break;
        }
-      if (ntohl ((&im->ats)[ntohl(im->ats_count)].type) != GNUNET_TRANSPORT_ATS_ARRAY_TERMINATOR)
-       {
-         GNUNET_break (0);
-         return;
-       }
-      fprintf(stderr,"transport_api GNUNET_MESSAGE_TYPE_TRANSPORT_RECV ats_count %u\n",ntohl (im->ats_count));
-    if (h->rec != NULL)
-               h->rec (h->cls, &im->peer,
-                       imm,
-                       NULL,
-                       0);
-
-       /*h->rec (h->cls, &im->peer,
-               imm, 
-               &im->ats, 
-               ntohl (im->ats_count));*/
+      /* FIXME: */
+      if (h->rec != NULL)
+               h->rec (h->cls, &im->peer, imm,
+                       &im->ats, ats_count);
+      /* ENDFIX */
       break;
     default:
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,