gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r25871 - gnunet/src/vpn


From: gnunet
Subject: [GNUnet-SVN] r25871 - gnunet/src/vpn
Date: Thu, 24 Jan 2013 09:51:15 +0100

Author: cfuchs
Date: 2013-01-24 09:51:15 +0100 (Thu, 24 Jan 2013)
New Revision: 25871

Modified:
   gnunet/src/vpn/gnunet-helper-vpn-windows.c
Log:
added gnunet-header stripping and adding functionality

woops logics bug discovered: when read goes into waiting, the output 
facility will 
not transfer the input buffer and forget about it silently...



Modified: gnunet/src/vpn/gnunet-helper-vpn-windows.c
===================================================================
--- gnunet/src/vpn/gnunet-helper-vpn-windows.c  2013-01-24 08:23:16 UTC (rev 
25870)
+++ gnunet/src/vpn/gnunet-helper-vpn-windows.c  2013-01-24 08:51:15 UTC (rev 
25871)
@@ -812,7 +812,7 @@
             return FALSE;
           }
         status = ReadFile (input_facility->handle,
-                           input_facility->buffer + sizeof (struct 
GNUNET_MessageHeader),
+                           input_facility->buffer,
                            sizeof (input_facility->buffer) - sizeof (struct 
GNUNET_MessageHeader),
                            &input_facility->buffer_size,
                            &input_facility->overlapped);
@@ -830,11 +830,17 @@
             if ((IOSTATE_READY == output_facility->facility_state ||
                  IOSTATE_WAITING == output_facility->facility_state)
                 && 0 < input_facility->buffer_size)
-              { /* hand over this buffers content */
-                memcpy (output_facility->buffer,
+              { /* hand over this buffers content and apply message header for 
gnunet */
+                struct GNUNET_MessageHeader * hdr = (struct 
GNUNET_MessageHeader *) output_facility->buffer;
+                unsigned short size = input_facility->buffer_size + sizeof 
(struct GNUNET_MessageHeader);
+                
+                memcpy (output_facility->buffer + sizeof (struct 
GNUNET_MessageHeader),
                         input_facility->buffer,
-                        sizeof (input_facility->buffer));
-                output_facility->buffer_size = input_facility->buffer_size;
+                        input_facility->buffer_size);
+
+                output_facility->buffer_size = size;
+                hdr->size = htons(size);
+                hdr->type = htons (GNUNET_MESSAGE_TYPE_VPN_HELPER);
                 output_facility->facility_state = IOSTATE_READY;
               }
             else if (0 < input_facility->buffer_size)
@@ -882,11 +888,17 @@
             if ((IOSTATE_READY == output_facility->facility_state ||
                  IOSTATE_WAITING == output_facility->facility_state)
                 && 0 < input_facility->buffer_size)
-              { /* hand over this buffers content */
-                memcpy (output_facility->buffer,
+              { /* hand over this buffers content and apply message header for 
gnunet */
+                struct GNUNET_MessageHeader * hdr = (struct 
GNUNET_MessageHeader *) output_facility->buffer;
+                unsigned short size = input_facility->buffer_size + sizeof 
(struct GNUNET_MessageHeader);
+                
+                memcpy (output_facility->buffer + sizeof (struct 
GNUNET_MessageHeader),
                         input_facility->buffer,
                         input_facility->buffer_size);
-                output_facility->buffer_size = input_facility->buffer_size;
+
+                output_facility->buffer_size = size;
+                hdr->size = htons(size);
+                hdr->type = htons (GNUNET_MESSAGE_TYPE_VPN_HELPER);
                 output_facility->facility_state = IOSTATE_READY;
                 input_facility->facility_state = IOSTATE_READY;
               }
@@ -961,15 +973,14 @@
                            &input_facility->overlapped);
 
         /* Check how the task is handled */
-        if (status && (0 < input_facility->buffer_size))
+        if (status && (sizeof(struct GNUNET_MessageHeader) < 
input_facility->buffer_size))
           {/* async event processed immediately*/
-            struct GNUNET_MessageHeader *hdr;
+            struct GNUNET_MessageHeader * hdr = (struct GNUNET_MessageHeader 
*) input_facility->buffer;
 
             /* reset event manually*/
             if (!SetEvent (input_facility->overlapped.hEvent))
               return FALSE;
 
-            hdr = (struct GNUNET_MessageHeader *) input_facility->buffer;
             if (ntohs (hdr->type) != GNUNET_MESSAGE_TYPE_VPN_HELPER ||
                 ntohs (hdr->size) > sizeof (input_facility->buffer))
               {
@@ -977,21 +988,22 @@
                 input_facility->facility_state = IOSTATE_READY;
                 return TRUE;
               }
-            //if (ntohs (hdr->size) > input_facility->buffer_size );
+            if (ntohs (hdr->size) > input_facility->buffer_size );
             // TODO: add support for partial read
 
             /* we successfully read something from the TAP and now need to
              * send it our via STDOUT. Is that possible at the moment? */
-            if (IOSTATE_READY == output_facility->facility_state ||
-                IOSTATE_WAITING == output_facility->facility_state)
-              { /* hand over this buffers content */
-                memcpy (output_facility->buffer,
+            if ((IOSTATE_READY == output_facility->facility_state ||
+                IOSTATE_WAITING == output_facility->facility_state) 
+                 && sizeof(struct GNUNET_MessageHeader) < 
input_facility->buffer_size )
+              { /* hand over this buffers content and strip gnunet message 
header */
+                memcpy (output_facility->buffer + sizeof(struct 
GNUNET_MessageHeader),
                         input_facility->buffer,
-                        sizeof (input_facility->buffer));
-                output_facility->buffer_size = input_facility->buffer_size;
+                        input_facility->buffer_size - sizeof(struct 
GNUNET_MessageHeader));
+                output_facility->buffer_size = input_facility->buffer_size - 
sizeof(struct GNUNET_MessageHeader);
                 output_facility->facility_state = IOSTATE_READY;
               }
-            else if (0 < input_facility->buffer_size)
+            else if ( IOSTATE_QUEUED == output_facility->facility_state )
               { /* If we have have read our buffer, wait for our 
write-partner*/
                 input_facility->facility_state = IOSTATE_WAITING;
                 // TODO: shall we attempt to fill our buffer or should we wait 
for our write-partner to finish?
@@ -1037,27 +1049,41 @@
                                       FALSE);
         if (status)
           {/* successful return for a queued operation */
+            struct GNUNET_MessageHeader * hdr = (struct GNUNET_MessageHeader 
*) input_facility->buffer;
+            
             if (!ResetEvent (input_facility->overlapped.hEvent))
               return FALSE;
+            
+            if (ntohs (hdr->type) != GNUNET_MESSAGE_TYPE_VPN_HELPER ||
+                ntohs (hdr->size) > sizeof (input_facility->buffer))
+              {
+                fprintf (stderr, "WARNING: Protocol violation, got GNUnet 
Message type %h, size %h!\n", ntohs (hdr->type), ntohs (hdr->size));
+                input_facility->facility_state = IOSTATE_READY;
+                return TRUE;
+              }
+            if (ntohs (hdr->size) > input_facility->buffer_size );
+            // TODO: add support for partial read
 
             /* we successfully read something from the TAP and now need to
              * send it our via STDOUT. Is that possible at the moment? */
             if ((IOSTATE_READY == output_facility->facility_state ||
                  IOSTATE_WAITING == output_facility->facility_state)
-                && 0 < input_facility->buffer_size)
-              { /* hand over this buffers content */
-                memcpy (output_facility->buffer,
+                && sizeof(struct GNUNET_MessageHeader) < 
input_facility->buffer_size)
+              { /* hand over this buffers content and strip gnunet message 
header */
+                memcpy (output_facility->buffer + sizeof(struct 
GNUNET_MessageHeader),
                         input_facility->buffer,
-                        input_facility->buffer_size);
-                output_facility->buffer_size = input_facility->buffer_size;
+                        input_facility->buffer_size - sizeof(struct 
GNUNET_MessageHeader));
+                output_facility->buffer_size = input_facility->buffer_size - 
sizeof(struct GNUNET_MessageHeader);
                 output_facility->facility_state = IOSTATE_READY;
                 input_facility->facility_state = IOSTATE_READY;
               }
-            else if (0 < input_facility->buffer_size)
+            else if (sizeof(struct GNUNET_MessageHeader) < 
input_facility->buffer_size)
               { /* If we have have read our buffer, wait for our 
write-partner*/
                 input_facility->facility_state = IOSTATE_WAITING;
                 // TODO: shall we attempt to fill our buffer or should we wait 
for our write-partner to finish?
               }
+            else if (sizeof(struct GNUNET_MessageHeader) >= 
input_facility->buffer_size)
+              input_facility->facility_state = IOSTATE_READY;
           }
         else
           { /* operation still pending/queued or failed? */




reply via email to

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