wip
[oweals/gnunet.git] / src / transport / plugin_transport_http.c
index 3f484b938104ce3cdb7e67f309c2a87925020d89..b349727229af6325596336a85f358b17ea706ddc 100644 (file)
@@ -19,7 +19,7 @@
 */
 
 /**
- * @file transport/gnunet_transport_plugin.http.c
+ * @file transport/plugin_transport_http.c
  * @brief http transport service plugin
  * @author Matthias Wachs
  */
@@ -512,18 +512,18 @@ static void http_server_daemon_v6_run (void *cls, const struct GNUNET_SCHEDULER_
 
 /**
  * Function setting up curl handle and selecting message to send
+ *
  * @param plugin plugin
- * @param ses session to send data to
- * @param con connection
- * @return bytes sent to peer
+ * @param ps session
+ * @return GNUNET_SYSERR on failure, GNUNET_NO if connecting, GNUNET_YES if ok
  */
 static int send_check_connections (struct Plugin *plugin, struct Session *ps);
 
 /**
  * Function setting up file descriptors and scheduling task to run
- * @param cls closure
- * @param ses session to send data to
- * @param
+ *
+ * @param  plugin plugin as closure
+ * @return GNUNET_SYSERR for hard failure, GNUNET_OK for ok
  */
 static int curl_schedule (struct Plugin *plugin);
 
@@ -873,9 +873,18 @@ static void mhd_write_mst_cb (void *cls,
               ntohs(message->size),
              GNUNET_i2s(&(ps->peercontext)->identity),http_plugin_address_to_string(NULL,ps->addr,ps->addrlen));
 #endif
+  struct GNUNET_TRANSPORT_ATS_Information distance[2];
+  distance[0].type = htonl (GNUNET_TRANSPORT_ATS_QUALITY_NET_DISTANCE);
+  distance[0].value = htonl (1);
+  distance[1].type = htonl (GNUNET_TRANSPORT_ATS_ARRAY_TERMINATOR);
+  distance[1].value = htonl (0);
+
   delay = pc->plugin->env->receive (ps->peercontext->plugin->env->cls,
                                                                                                                  &pc->identity,
-                                                                                                                 message, 1, ps,
+                                                                                                                 message,
+                                                                                                                 (const struct GNUNET_TRANSPORT_ATS_Information *) &distance,
+                                                                                                                 2,
+                                                                                                                 ps,
                                                                                                                  NULL,
                                                                                                                  0);
   pc->delay = delay;
@@ -987,9 +996,9 @@ mhd_access_cb (void *cls,
   struct Plugin *plugin = cls;
   struct MHD_Response *response;
   const union MHD_ConnectionInfo * conn_info;
-
-  struct sockaddr_in  *addrin;
-  struct sockaddr_in6 *addrin6;
+  const struct sockaddr *client_addr;
+  const struct sockaddr_in  *addrin;
+  const struct sockaddr_in6 *addrin6;
 
   char address[INET6_ADDRSTRLEN+14];
   struct GNUNET_PeerIdentity pi_in;
@@ -1068,9 +1077,11 @@ mhd_access_cb (void *cls,
 
     conn_info = MHD_get_connection_info(mhd_connection, MHD_CONNECTION_INFO_CLIENT_ADDRESS );
     /* Incoming IPv4 connection */
-    if ( AF_INET == conn_info->client_addr->sin_family)
+    /* cast required for legacy MHD API < 0.9.6 */
+    client_addr = (const struct sockaddr *) conn_info->client_addr;
+    if ( AF_INET == client_addr->sa_family)
     {
-      addrin = conn_info->client_addr;
+      addrin = (const struct sockaddr_in*) client_addr;
       inet_ntop(addrin->sin_family, &(addrin->sin_addr),address,INET_ADDRSTRLEN);
       memcpy(&ipv4addr.ipv4_addr,&(addrin->sin_addr),sizeof(struct in_addr));
       ipv4addr.u_port = addrin->sin_port;
@@ -1078,9 +1089,9 @@ mhd_access_cb (void *cls,
       addr_len = sizeof(struct IPv4HttpAddress);
     }
     /* Incoming IPv6 connection */
-    if ( AF_INET6 == conn_info->client_addr->sin_family)
+    if ( AF_INET6 == client_addr->sa_family)
     {
-      addrin6 = (struct sockaddr_in6 *) conn_info->client_addr;
+      addrin6 = (const struct sockaddr_in6 *) client_addr;
       inet_ntop(addrin6->sin6_family, &(addrin6->sin6_addr),address,INET6_ADDRSTRLEN);
       memcpy(&ipv6addr.ipv6_addr,&(addrin6->sin6_addr),sizeof(struct in6_addr));
       ipv6addr.u6_port = addrin6->sin6_port;
@@ -1576,9 +1587,17 @@ static void curl_receive_mst_cb  (void *cls,
               ntohs(message->size),
               GNUNET_i2s(&(pc->identity)),http_plugin_address_to_string(NULL,ps->addr,ps->addrlen));
 #endif
+  struct GNUNET_TRANSPORT_ATS_Information distance[2];
+  distance[0].type = htonl (GNUNET_TRANSPORT_ATS_QUALITY_NET_DISTANCE);
+  distance[0].value = htonl (1);
+  distance[1].type = htonl (GNUNET_TRANSPORT_ATS_ARRAY_TERMINATOR);
+  distance[1].value = htonl (0);
+
   delay = pc->plugin->env->receive (pc->plugin->env->cls,
                                                                  &pc->identity,
-                                                             message, 1, ps,
+                                                             message,
+                                                             (const struct GNUNET_TRANSPORT_ATS_Information *) &distance, 2,
+                                                             ps,
                                                              ps->addr,
                                                              ps->addrlen);
 
@@ -1589,7 +1608,7 @@ static void curl_receive_mst_cb  (void *cls,
   if (delay.rel_value > 0)
   {
 #if DEBUG_HTTP
-       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Connection %X: Inbound quota management: delay next read for %llu ms \n", ps, delay.abs_value);
+       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Connection %X: Inbound quota management: delay next read for %llu ms \n", ps, delay.rel_value);
 #endif
        pc->reset_task = GNUNET_SCHEDULER_add_delayed (delay, &reset_inbound_quota_delay, pc);
   }
@@ -1801,7 +1820,7 @@ static void curl_perform (void *cls,
 /**
  * Function setting up file descriptors and scheduling task to run
  *
- * @param plugin plugin as closure
+ * @param  plugin plugin as closure
  * @return GNUNET_SYSERR for hard failure, GNUNET_OK for ok
  */
 static int curl_schedule(struct Plugin *plugin)
@@ -2296,17 +2315,15 @@ http_plugin_send (void *cls,
       if (force_address != GNUNET_YES)
          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"No existing connection: creating new session %X to peer %s\n", ps, GNUNET_i2s(target));
 #endif
-      if ((addrlen!=0) && (addr!=NULL))
-      {
-         ps->addr = GNUNET_malloc(addrlen);
-         memcpy(ps->addr,addr,addrlen);
-         ps->addrlen = addrlen;
-      }
+         ps->addr = GNUNET_malloc(addrlen);
+         memcpy(ps->addr,addr,addrlen);
+         ps->addrlen = addrlen;
+      /*
          else
          {
                ps->addr = NULL;
                ps->addrlen = 0;
-         }
+         }*/
          ps->direction=OUTBOUND;
          ps->recv_connected = GNUNET_NO;
          ps->recv_force_disconnect = GNUNET_NO;
@@ -2343,27 +2360,27 @@ http_plugin_send (void *cls,
        //return GNUNET_SYSERR;
   }
 
-       /* create msg */
-       msg = GNUNET_malloc (sizeof (struct HTTP_Message) + msgbuf_size);
-       msg->next = NULL;
-       msg->size = msgbuf_size;
-       msg->pos = 0;
-       msg->buf = (char *) &msg[1];
-       msg->transmit_cont = cont;
-       msg->transmit_cont_cls = cont_cls;
-       memcpy (msg->buf,msgbuf, msgbuf_size);
-
-       GNUNET_CONTAINER_DLL_insert(ps->pending_msgs_head,ps->pending_msgs_tail,msg);
-       ps->queue_length_cur += msgbuf_size;
-
-       if (send_check_connections (plugin, ps) == GNUNET_SYSERR)
-         return GNUNET_SYSERR;
-         if (force_address != GNUNET_YES)
-                 pc->last_session = ps;
-
-         if (pc->last_session==NULL)
-                 pc->last_session = ps;
-         return msg->size;
+  /* create msg */
+  msg = GNUNET_malloc (sizeof (struct HTTP_Message) + msgbuf_size);
+  msg->next = NULL;
+  msg->size = msgbuf_size;
+  msg->pos = 0;
+  msg->buf = (char *) &msg[1];
+  msg->transmit_cont = cont;
+  msg->transmit_cont_cls = cont_cls;
+  memcpy (msg->buf,msgbuf, msgbuf_size);  
+  GNUNET_CONTAINER_DLL_insert (ps->pending_msgs_head,
+                              ps->pending_msgs_tail,
+                              msg);
+  ps->queue_length_cur += msgbuf_size;
+  if (send_check_connections (plugin, ps) == GNUNET_SYSERR)
+    return GNUNET_SYSERR;
+  if (force_address != GNUNET_YES)
+    pc->last_session = ps;
+  
+  if (pc->last_session==NULL)
+    pc->last_session = ps;
+  return msg->size;
 }