gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r11902 - gnunet/src/transport


From: gnunet
Subject: [GNUnet-SVN] r11902 - gnunet/src/transport
Date: Wed, 23 Jun 2010 14:39:10 +0200

Author: wachs
Date: 2010-06-23 14:39:10 +0200 (Wed, 23 Jun 2010)
New Revision: 11902

Modified:
   gnunet/src/transport/plugin_transport_http.c
   gnunet/src/transport/test_plugin_transport_http.c
Log:
plugin changed to be loadable multiple times


Modified: gnunet/src/transport/plugin_transport_http.c
===================================================================
--- gnunet/src/transport/plugin_transport_http.c        2010-06-23 12:05:51 UTC 
(rev 11901)
+++ gnunet/src/transport/plugin_transport_http.c        2010-06-23 12:39:10 UTC 
(rev 11902)
@@ -318,11 +318,6 @@
 };
 
 /**
- * Information about this plugin
- */
-static struct Plugin *plugin;
-
-/**
  * Create a new session
  *
  * @param addr_in address the peer is using inbound
@@ -330,10 +325,12 @@
  * @param peer identity
  * @return created session object
  */
-static struct Session * create_session (char * addr_in, size_t addrlen_in, 
char * addr_out, size_t addrlen_out, const struct GNUNET_PeerIdentity *peer)
+static struct Session * create_session (void * cls, char * addr_in, size_t 
addrlen_in, char * addr_out, size_t addrlen_out, const struct 
GNUNET_PeerIdentity *peer)
 {
+  struct Plugin *plugin = cls;
   struct Session * ses = GNUNET_malloc ( sizeof( struct Session) );
 
+  GNUNET_assert(cls !=NULL);
   if (addrlen_in != 0)
   {
     ses->addr_in = GNUNET_malloc (addrlen_in);
@@ -378,9 +375,7 @@
 
 static void messageTokenizerCallback (void *cls,
                                       void *client,
-                                      const struct
-                                      GNUNET_MessageHeader *
-                                      message)
+                                      const struct GNUNET_MessageHeader 
*message)
 {
   struct Session * cs = cls;
   GNUNET_assert(cs != NULL);
@@ -390,13 +385,10 @@
              ntohs(message->type),
               ntohs(message->size),
              GNUNET_i2s(&(cs->partner)));
-  plugin->env->receive(plugin->env->cls, 
-                      &cs->partner, 
-                      message, 1, NULL, 
-                      NULL, 0);
-
-                      /*(char *)cs->addr_in,
-                      cs->addr_in_len);*/
+  cs->plugin->env->receive(cs->plugin->env->cls,
+                           &cs->partner,
+                           message, 1, NULL,
+                           NULL, 0);
 }
 
 /**
@@ -406,6 +398,9 @@
 acceptPolicyCallback (void *cls,
                       const struct sockaddr *addr, socklen_t addr_len)
 {
+#if 0
+  struct Plugin *plugin = cls;
+#endif
   /* Every connection is accepted, nothing more to do here */
   return MHD_YES;
 }
@@ -426,6 +421,7 @@
                        const char *upload_data,
                        size_t * upload_data_size, void **httpSessionCache)
 {
+  struct Plugin *plugin = cls;
   struct MHD_Response *response;
   struct Session * cs;
   const union MHD_ConnectionInfo * conn_info;
@@ -439,6 +435,7 @@
   struct IPv4HttpAddress ipv4addr;
   struct IPv6HttpAddress ipv6addr;
 
+  GNUNET_assert(cls !=NULL);
   cur_msg = NULL;
   send_error_to_client = GNUNET_NO;
 
@@ -482,9 +479,9 @@
     {
       /* create new session object */
       if ( AF_INET6 == conn_info->client_addr->sin_family)
-        cs = create_session((char *) &ipv6addr, sizeof(struct 
IPv6HttpAddress),NULL, 0, &pi_in);
+        cs = create_session(plugin, (char *) &ipv6addr, sizeof(struct 
IPv6HttpAddress),NULL, 0, &pi_in);
       if ( AF_INET == conn_info->client_addr->sin_family)
-        cs = create_session((char *) &ipv4addr, sizeof(struct 
IPv4HttpAddress),NULL, 0, &pi_in);
+        cs = create_session(plugin, (char *) &ipv4addr, sizeof(struct 
IPv4HttpAddress),NULL, 0, &pi_in);
 
       /* Insert session into hashmap */
       GNUNET_CONTAINER_multihashmap_put ( plugin->sessions,
@@ -626,18 +623,24 @@
 
 
 /**
- * Call MHD to process pending requests and then go back
+ * Call MHD to process pending ipv4 requests and then go back
  * and schedule the next run.
  */
-static void http_daemon_run (void *cls, const struct 
GNUNET_SCHEDULER_TaskContext *tc);
+static void http_daemon_v4_run (void *cls, const struct 
GNUNET_SCHEDULER_TaskContext *tc);
+/**
+ * Call MHD to process pending ipv6 requests and then go back
+ * and schedule the next run.
+ */
+static void http_daemon_v6_run (void *cls, const struct 
GNUNET_SCHEDULER_TaskContext *tc);
 
 /**
  * Function that queries MHD's select sets and
  * starts the task waiting for them.
  */
 static GNUNET_SCHEDULER_TaskIdentifier
-http_daemon_prepare (struct MHD_Daemon *daemon_handle)
+http_daemon_prepare (void * cls, struct MHD_Daemon *daemon_handle)
 {
+  struct Plugin *plugin = cls;
   GNUNET_SCHEDULER_TaskIdentifier ret;
   fd_set rs;
   fd_set ws;
@@ -650,6 +653,7 @@
   int haveto;
   struct GNUNET_TIME_Relative tv;
 
+  GNUNET_assert(cls !=NULL);
   FD_ZERO(&rs);
   FD_ZERO(&ws);
   FD_ZERO(&es);
@@ -671,14 +675,28 @@
   GNUNET_NETWORK_fdset_copy_native (wrs, &rs, max);
   GNUNET_NETWORK_fdset_copy_native (wws, &ws, max);
   GNUNET_NETWORK_fdset_copy_native (wes, &es, max);
-  ret = GNUNET_SCHEDULER_add_select (plugin->env->sched,
-                                     GNUNET_SCHEDULER_PRIORITY_DEFAULT,
-                                     GNUNET_SCHEDULER_NO_TASK,
-                                     tv,
-                                     wrs,
-                                     wws,
-                                     &http_daemon_run,
-                                     daemon_handle);
+  if (daemon_handle == plugin->http_daemon_v4)
+  {
+    ret = GNUNET_SCHEDULER_add_select (plugin->env->sched,
+                                       GNUNET_SCHEDULER_PRIORITY_DEFAULT,
+                                       GNUNET_SCHEDULER_NO_TASK,
+                                       tv,
+                                       wrs,
+                                       wws,
+                                       &http_daemon_v4_run,
+                                       plugin);
+  }
+  if (daemon_handle == plugin->http_daemon_v6)
+  {
+    ret = GNUNET_SCHEDULER_add_select (plugin->env->sched,
+                                       GNUNET_SCHEDULER_PRIORITY_DEFAULT,
+                                       GNUNET_SCHEDULER_NO_TASK,
+                                       tv,
+                                       wrs,
+                                       wws,
+                                       &http_daemon_v6_run,
+                                       plugin);
+  }
   GNUNET_NETWORK_fdset_destroy (wrs);
   GNUNET_NETWORK_fdset_destroy (wws);
   GNUNET_NETWORK_fdset_destroy (wes);
@@ -689,25 +707,42 @@
  * Call MHD to process pending requests and then go back
  * and schedule the next run.
  */
-static void http_daemon_run (void *cls,
+static void http_daemon_v4_run (void *cls,
                              const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-  struct MHD_Daemon *daemon_handle = cls;
+  struct Plugin *plugin = cls;
 
-  if (daemon_handle == plugin->http_daemon_v4)
+  GNUNET_assert(cls !=NULL);
+  if (plugin->http_task_v4 != GNUNET_SCHEDULER_NO_TASK)
     plugin->http_task_v4 = GNUNET_SCHEDULER_NO_TASK;
 
-  if (daemon_handle == plugin->http_daemon_v6)
+  if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
+    return;
+
+  GNUNET_assert (MHD_YES == MHD_run (plugin->http_daemon_v4));
+  plugin->http_task_v4 = http_daemon_prepare (plugin, plugin->http_daemon_v4);
+  return;
+}
+
+
+/**
+ * Call MHD to process pending requests and then go back
+ * and schedule the next run.
+ */
+static void http_daemon_v6_run (void *cls,
+                             const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  struct Plugin *plugin = cls;
+
+  GNUNET_assert(cls !=NULL);
+  if (plugin->http_task_v6 != GNUNET_SCHEDULER_NO_TASK)
     plugin->http_task_v6 = GNUNET_SCHEDULER_NO_TASK;
 
   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
     return;
 
-  GNUNET_assert (MHD_YES == MHD_run (daemon_handle));
-  if (daemon_handle == plugin->http_daemon_v4)
-    plugin->http_task_v4 = http_daemon_prepare (daemon_handle);
-  if (daemon_handle == plugin->http_daemon_v6)
-    plugin->http_task_v6 = http_daemon_prepare (daemon_handle);
+  GNUNET_assert (MHD_YES == MHD_run (plugin->http_daemon_v6));
+  plugin->http_task_v6 = http_daemon_prepare (plugin, plugin->http_daemon_v6);
   return;
 }
 
@@ -828,19 +863,21 @@
  * @param ses session to send data to
  * @return bytes sent to peer
  */
-static size_t send_prepare(struct Session* ses );
+static size_t send_prepare(void *cls, struct Session* ses );
 
 /**
  * Function setting up curl handle and selecting message to send
  * @param ses session to send data to
  * @return bytes sent to peer
  */
-static ssize_t send_select_init (struct Session* ses )
+static ssize_t send_select_init (void *cls, struct Session* ses )
 {
+  struct Plugin *plugin = cls;
   int bytes_sent = 0;
   CURLMcode mret;
   struct HTTP_Message * msg;
 
+  GNUNET_assert(cls !=NULL);
   if ( NULL == ses->curl_handle)
     ses->curl_handle = curl_easy_init();
   if( NULL == ses->curl_handle)
@@ -877,13 +914,14 @@
                 curl_multi_strerror (mret));
     return -1;
   }
-  bytes_sent = send_prepare (ses );
+  bytes_sent = send_prepare (plugin, ses );
   return bytes_sent;
 }
 
 static void send_execute (void *cls,
              const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
+  struct Plugin *plugin = cls;
   static unsigned int handles_last_run;
   int running;
   struct CURLMsg *msg;
@@ -891,6 +929,7 @@
   struct Session * cs = NULL;
   long http_result;
 
+  GNUNET_assert(cls !=NULL);
   plugin->http_task_send = GNUNET_SCHEDULER_NO_TASK;
   if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
     return;
@@ -960,7 +999,7 @@
                   /* send pending messages */
                   if (cs->pending_outbound_msg_tail!= NULL)
                   {
-                    send_select_init (cs);
+                    send_select_init (plugin, cs);
                   }
                   return;
                 default:
@@ -973,7 +1012,7 @@
       handles_last_run = running;
     }
   while (mret == CURLM_CALL_MULTI_PERFORM);
-  send_prepare(cls);
+  send_prepare(plugin, cls);
 }
 
 
@@ -982,8 +1021,9 @@
  * @param ses session to send data to
  * @return bytes sent to peer
  */
-static size_t send_prepare(struct Session* ses )
+static size_t send_prepare(void *cls, struct Session* ses )
 {
+  struct Plugin *plugin = cls;
   fd_set rs;
   fd_set ws;
   fd_set es;
@@ -993,6 +1033,7 @@
   long to;
   CURLMcode mret;
 
+  GNUNET_assert(cls !=NULL);
   max = -1;
   FD_ZERO (&rs);
   FD_ZERO (&ws);
@@ -1027,7 +1068,7 @@
                                    grs,
                                    gws,
                                    &send_execute,
-                                   ses);
+                                   plugin);
   GNUNET_NETWORK_fdset_destroy (gws);
   GNUNET_NETWORK_fdset_destroy (grs);
 
@@ -1063,31 +1104,33 @@
  */
 static ssize_t
 http_plugin_send (void *cls,
-                      const struct GNUNET_PeerIdentity *target,
-                      const char *msgbuf,
-                      size_t msgbuf_size,
-                      unsigned int priority,
-                      struct GNUNET_TIME_Relative to,
-                      struct Session *session,
-                      const void *addr,
-                      size_t addrlen,
-                      int force_address,
-                      GNUNET_TRANSPORT_TransmitContinuation cont,
-                      void *cont_cls)
+                  const struct GNUNET_PeerIdentity *target,
+                  const char *msgbuf,
+                  size_t msgbuf_size,
+                  unsigned int priority,
+                  struct GNUNET_TIME_Relative to,
+                  struct Session *session,
+                  const void *addr,
+                  size_t addrlen,
+                  int force_address,
+                  GNUNET_TRANSPORT_TransmitContinuation cont,
+                  void *cont_cls)
 {
-  char * address;
-  char * url;
-  struct Session* cs;
-  struct HTTP_Message * msg;
+  struct Plugin *plugin = cls;
+  char *address;
+  char *url;
+  struct Session *cs;
+  struct HTTP_Message *msg;
   unsigned int res;
 
+  GNUNET_assert(cls !=NULL);
   url = NULL;
   address = NULL;
 
   cs = GNUNET_CONTAINER_multihashmap_get (plugin->sessions, 
&target->hashPubKey);
   if ( cs == NULL)
   {
-    cs = create_session((char *) addr, addrlen, NULL, 0, target);
+    cs = create_session(plugin, (char *) addr, addrlen, NULL, 0, target);
     cs->is_active = GNUNET_YES;
     res = GNUNET_CONTAINER_multihashmap_put ( plugin->sessions,
                                         &cs->partner.hashPubKey,
@@ -1142,7 +1185,7 @@
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"HTTP Plugin: url `%s'\n",url);
   if (msg == cs->pending_outbound_msg_tail)
   {
-    return send_select_init (cs);
+    return send_select_init (plugin, cs);
   }
   return msgbuf_size;
 }
@@ -1200,6 +1243,7 @@
   unsigned int port;
   unsigned int res;
 
+  GNUNET_assert(cls !=NULL);
   if (addrlen == sizeof (struct IPv6HttpAddress))
   {
     address = GNUNET_malloc (INET6_ADDRSTRLEN);
@@ -1248,10 +1292,12 @@
 http_plugin_address_suggested (void *cls,
                                   void *addr, size_t addrlen)
 {
+  struct Plugin *plugin = cls;
   struct IPv4HttpAddress *v4;
   struct IPv6HttpAddress *v6;
   unsigned int port;
 
+  GNUNET_assert(cls !=NULL);
   if ((addrlen != sizeof (struct IPv4HttpAddress)) &&
       (addrlen != sizeof (struct IPv6HttpAddress)))
     {
@@ -1314,6 +1360,7 @@
   unsigned int port;
   unsigned int res;
 
+  GNUNET_assert(cls !=NULL);
   if (addrlen == sizeof (struct IPv6HttpAddress))
     {
       address = GNUNET_malloc (INET6_ADDRSTRLEN);
@@ -1358,12 +1405,14 @@
                     int isDefault,
                     const struct sockaddr *addr, socklen_t addrlen)
 {
+  struct Plugin *plugin = cls;
   struct IPv4HttpAddress t4;
   struct IPv6HttpAddress t6;
   int af;
   void *arg;
   uint16_t args;
 
+  GNUNET_assert(cls !=NULL);
   af = addr->sa_family;
   if (af == AF_INET)
     {
@@ -1444,6 +1493,7 @@
   struct Plugin *plugin = api->cls;
   CURLMcode mret;
 
+  GNUNET_assert(cls !=NULL);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Unloading http plugin...\n");
 
   if ( plugin->http_task_v4 != GNUNET_SCHEDULER_NO_TASK)
@@ -1499,10 +1549,12 @@
 libgnunet_plugin_transport_http_init (void *cls)
 {
   struct GNUNET_TRANSPORT_PluginEnvironment *env = cls;
+  struct Plugin *plugin;
   struct GNUNET_TRANSPORT_PluginFunctions *api;
   struct GNUNET_TIME_Relative gn_timeout;
   long long unsigned int port;
 
+  GNUNET_assert(cls !=NULL);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Starting http plugin...\n");
 
   plugin = GNUNET_malloc (sizeof (struct Plugin));
@@ -1543,7 +1595,7 @@
     plugin->http_daemon_v6 = MHD_start_daemon (MHD_USE_IPv6,
                                        port,
                                        &acceptPolicyCallback,
-                                       NULL , &accessHandlerCallback, NULL,
+                                       plugin , &accessHandlerCallback, plugin,
                                        MHD_OPTION_CONNECTION_LIMIT, (unsigned 
int) 16,
                                        MHD_OPTION_PER_IP_CONNECTION_LIMIT, 
(unsigned int) 1,
                                        MHD_OPTION_CONNECTION_TIMEOUT, 
(gn_timeout.value / 1000),
@@ -1553,7 +1605,7 @@
     plugin->http_daemon_v4 = MHD_start_daemon (MHD_NO_FLAG,
                                        port,
                                        &acceptPolicyCallback,
-                                       NULL , &accessHandlerCallback, NULL,
+                                       plugin , &accessHandlerCallback, plugin,
                                        MHD_OPTION_CONNECTION_LIMIT, (unsigned 
int) 16,
                                        MHD_OPTION_PER_IP_CONNECTION_LIMIT, 
(unsigned int) 1,
                                        MHD_OPTION_CONNECTION_TIMEOUT, 
(gn_timeout.value / 1000),
@@ -1562,9 +1614,9 @@
                                        MHD_OPTION_END);
     }
   if (plugin->http_daemon_v4 != NULL)
-    plugin->http_task_v4 = http_daemon_prepare (plugin->http_daemon_v4);
+    plugin->http_task_v4 = http_daemon_prepare (plugin, 
plugin->http_daemon_v4);
   if (plugin->http_daemon_v6 != NULL)
-    plugin->http_task_v6 = http_daemon_prepare (plugin->http_daemon_v6);
+    plugin->http_task_v6 = http_daemon_prepare (plugin, 
plugin->http_daemon_v6);
 
   if (plugin->http_task_v4 != GNUNET_SCHEDULER_NO_TASK)
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,"Starting MHD with IPv4 on port 
%u\n",port);

Modified: gnunet/src/transport/test_plugin_transport_http.c
===================================================================
--- gnunet/src/transport/test_plugin_transport_http.c   2010-06-23 12:05:51 UTC 
(rev 11901)
+++ gnunet/src/transport/test_plugin_transport_http.c   2010-06-23 12:39:10 UTC 
(rev 11902)
@@ -1170,9 +1170,9 @@
   while (cur != NULL)
   {
 
-    api->address_pretty_printer 
(NULL,"http",cur->addr,cur->addrlen,GNUNET_NO,TEST_TIMEOUT,&pretty_printer_cb,NULL);
-    addr_str = api->address_to_string (NULL,cur->addr,cur->addrlen);
-    suggest_res = api->check_address (NULL,cur->addr,cur->addrlen);
+    api->address_pretty_printer (api->cls, "http",cur->addr,cur->addrlen, 
GNUNET_NO,TEST_TIMEOUT, &pretty_printer_cb,NULL);
+    addr_str = api->address_to_string (api->cls, cur->addr, cur->addrlen);
+    suggest_res = api->check_address (api->cls, cur->addr, cur->addrlen);
 
     GNUNET_assert (GNUNET_OK == suggest_res);
     GNUNET_assert (NULL != addr_str);
@@ -1190,19 +1190,19 @@
   struct IPv4HttpAddress failing_addr;
   failing_addr.ipv4_addr = htonl(INADDR_LOOPBACK);
   failing_addr.u_port = htons(0);
-  suggest_res = api->check_address (NULL,&failing_addr,sizeof (struct 
IPv4HttpAddress));
+  suggest_res = api->check_address (api->cls,&failing_addr,sizeof (struct 
IPv4HttpAddress));
   GNUNET_assert (GNUNET_SYSERR == suggest_res);
 
   /* Suggesting addresses with wrong size*/
   failing_addr.ipv4_addr = htonl(INADDR_LOOPBACK);
   failing_addr.u_port = htons(0);
-  suggest_res = api->check_address (NULL,&failing_addr,sizeof (struct 
IPv6HttpAddress));
+  suggest_res = api->check_address (api->cls,&failing_addr,sizeof (struct 
IPv6HttpAddress));
   GNUNET_assert (GNUNET_SYSERR == suggest_res);
 
   /* Suggesting addresses with wrong address*/
   failing_addr.ipv4_addr = htonl(INADDR_LOOPBACK);
   failing_addr.u_port = htons(12389);
-  suggest_res = api->check_address (NULL,&failing_addr,sizeof (struct 
IPv4HttpAddress));
+  suggest_res = api->check_address (api->cls,&failing_addr,sizeof (struct 
IPv4HttpAddress));
   GNUNET_assert (GNUNET_SYSERR == suggest_res);
 
   /* test sending to client */
@@ -1235,7 +1235,7 @@
   test_valid_ident.test_executed = GNUNET_NO;
   test_valid_ident.test_failed = GNUNET_YES;
 
-  test_addr = (char *) api->address_to_string 
(NULL,addr_head->addr,addr_head->addrlen);
+  test_addr = (char *) api->address_to_string 
(api->cls,addr_head->addr,addr_head->addrlen);
   run_connection_tests();
 
   /* testing finished */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]