gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r16230 - gnunet/src/vpn
Date: Wed, 27 Jul 2011 09:28:21 +0200

Author: toelke
Date: 2011-07-27 09:28:21 +0200 (Wed, 27 Jul 2011)
New Revision: 16230

Modified:
   gnunet/src/vpn/gnunet-daemon-vpn-helper.c
   gnunet/src/vpn/gnunet-daemon-vpn.c
   gnunet/src/vpn/gnunet-daemon-vpn.h
   gnunet/src/vpn/gnunet-service-dns.c
   gnunet/src/vpn/gnunet-vpn-packet.h
Log:
reply ipv4-icmp

Modified: gnunet/src/vpn/gnunet-daemon-vpn-helper.c
===================================================================
--- gnunet/src/vpn/gnunet-daemon-vpn-helper.c   2011-07-27 07:28:20 UTC (rev 
16229)
+++ gnunet/src/vpn/gnunet-daemon-vpn-helper.c   2011-07-27 07:28:21 UTC (rev 
16230)
@@ -223,6 +223,7 @@
   GNUNET_assert (ntohs (message->type) == GNUNET_MESSAGE_TYPE_VPN_HELPER);
 
   struct tun_pkt *pkt_tun = (struct tun_pkt *) message;
+  GNUNET_HashCode *key;
 
   /* ethertype is ipv6 */
   if (ntohs (pkt_tun->tun.type) == 0x86dd)
@@ -232,7 +233,6 @@
       struct ip6_tcp *pkt6_tcp;
       struct ip6_udp *pkt6_udp;
       struct ip6_icmp *pkt6_icmp;
-      GNUNET_HashCode *key;
 
       switch (pkt6->ip6_hdr.nxthdr)
         {
@@ -241,7 +241,7 @@
           pkt6_tcp = (struct ip6_tcp *) pkt6;
           pkt6_udp = (struct ip6_udp *) pkt6;
 
-          if ((key = address_mapping_exists (pkt6->ip6_hdr.dadr)) != NULL)
+          if ((key = address6_mapping_exists (pkt6->ip6_hdr.dadr)) != NULL)
             {
               struct map_entry *me =
                 GNUNET_CONTAINER_multihashmap_get (hashmap, key);
@@ -389,12 +389,12 @@
           pkt6_icmp = (struct ip6_icmp *) pkt6;
           /* If this packet is an icmp-echo-request and a mapping exists, 
answer */
           if (pkt6_icmp->icmp_hdr.type == 0x80
-              && (key = address_mapping_exists (pkt6->ip6_hdr.dadr)) != NULL)
+              && (key = address6_mapping_exists (pkt6->ip6_hdr.dadr)) != NULL)
             {
               GNUNET_free (key);
               pkt6_icmp = GNUNET_malloc (ntohs (pkt6->shdr.size));
               memcpy (pkt6_icmp, pkt6, ntohs (pkt6->shdr.size));
-              GNUNET_SCHEDULER_add_now (&send_icmp_response, pkt6_icmp);
+              GNUNET_SCHEDULER_add_now (&send_icmp6_response, pkt6_icmp);
             }
           break;
         }
@@ -404,6 +404,9 @@
     {
       struct ip_pkt *pkt = (struct ip_pkt *) message;
       struct ip_udp *udp = (struct ip_udp *) message;
+      struct ip_tcp *pkt_tcp;
+      struct ip_udp *pkt_udp;
+      struct ip_icmp *pkt_icmp;
       GNUNET_assert (pkt->ip_hdr.version == 4);
 
       /* Send dns-packets to the service-dns */
@@ -433,6 +436,41 @@
                                                  GNUNET_YES,
                                                  &send_query, NULL);
         }
+      else
+        {
+          uint32_t dadr = pkt->ip_hdr.dadr;
+          unsigned char *c = (unsigned char*)&dadr;
+          GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Packet to %d.%d.%d.%d, proto 
%x\n",
+                     c[0],
+                     c[1],
+                     c[2],
+                     c[3],
+                     pkt->ip_hdr.proto);
+          switch (pkt->ip_hdr.proto)
+            {
+            case 0x06: /* TCP */
+            case 0x11: /* UDP */
+              pkt_tcp = (struct ip_tcp*) pkt;
+              pkt_udp = (struct ip_udp*) pkt;
+
+              if ((key = address4_mapping_exists (dadr)) != NULL)
+                {
+                }
+              break;
+            case 0x01:
+              /* ICMP */
+              pkt_icmp = (struct ip_icmp*)pkt;
+              if (pkt_icmp->icmp_hdr.type == 0x8 &&
+                (key = address4_mapping_exists (dadr)) != NULL)
+                {
+                  GNUNET_free(key);
+                  pkt_icmp = GNUNET_malloc(ntohs(pkt->shdr.size));
+                  memcpy(pkt_icmp, pkt, ntohs(pkt->shdr.size));
+                  GNUNET_SCHEDULER_add_now (&send_icmp4_response, pkt_icmp);
+                }
+              break;
+            }
+        }
     }
 }
 

Modified: gnunet/src/vpn/gnunet-daemon-vpn.c
===================================================================
--- gnunet/src/vpn/gnunet-daemon-vpn.c  2011-07-27 07:28:20 UTC (rev 16229)
+++ gnunet/src/vpn/gnunet-daemon-vpn.c  2011-07-27 07:28:21 UTC (rev 16230)
@@ -113,7 +113,7 @@
  * @return the hash of the IP-Address if a mapping exists, NULL otherwise
  */
 GNUNET_HashCode*
-address_mapping_exists(unsigned char addr[]) {
+address6_mapping_exists(unsigned char addr[]) {
     GNUNET_HashCode* key = GNUNET_malloc(sizeof(GNUNET_HashCode));
     unsigned char* k = (unsigned char*)key;
     memset(key, 0, sizeof(GNUNET_HashCode));
@@ -130,6 +130,34 @@
       }
 }
 
+/**
+ * @return the hash of the IP-Address if a mapping exists, NULL otherwise
+ */
+GNUNET_HashCode *
+address4_mapping_exists (uint32_t addr)
+{
+  GNUNET_HashCode *key = GNUNET_malloc (sizeof (GNUNET_HashCode));
+  memset (key, 0, sizeof (GNUNET_HashCode));
+  unsigned char *c = (unsigned char *) &addr;
+  unsigned char *k = (unsigned char *) key;
+  unsigned int i;
+  for (i = 0; i < 4; i++)
+    k[3 - i] = c[i];
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "a4_m_e: getting with key %08x, addr is %08x, %d.%d.%d.%d\n",
+              *((uint32_t *) (key)), addr, c[0], c[1], c[2], c[3]);
+
+  if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains (hashmap, key))
+    return key;
+  else
+    {
+      GNUNET_free (key);
+      GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Mapping not found!\n");
+      return NULL;
+    }
+}
+
 static void
 collect_mappings(void* cls __attribute__((unused)), const struct 
GNUNET_SCHEDULER_TaskContext* tc) {
     if ( (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0)
@@ -148,10 +176,50 @@
 }
 
 void
-send_icmp_response(void* cls, const struct GNUNET_SCHEDULER_TaskContext *tc) {
+send_icmp4_response(void* cls, const struct GNUNET_SCHEDULER_TaskContext *tc) {
     if ( (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0)
       return;
 
+    struct ip_icmp* request = cls;
+
+    struct ip_icmp* response = alloca(ntohs(request->shdr.size));
+    GNUNET_assert(response != NULL);
+    memset(response, 0, ntohs(request->shdr.size));
+
+    response->shdr.size = request->shdr.size;
+    response->shdr.type = htons(GNUNET_MESSAGE_TYPE_VPN_HELPER);
+
+    response->tun.flags = 0;
+    response->tun.type = htons(0x0800);
+
+    response->ip_hdr.hdr_lngth = 5;
+    response->ip_hdr.version = 4;
+    response->ip_hdr.proto = 0x01;
+    response->ip_hdr.dadr = request->ip_hdr.sadr;
+    response->ip_hdr.sadr = request->ip_hdr.dadr;
+    response->ip_hdr.tot_lngth = request->ip_hdr.tot_lngth;
+
+    response->ip_hdr.chks = 
calculate_ip_checksum((uint16_t*)&response->ip_hdr, 20);
+
+    response->icmp_hdr.code = 0;
+    response->icmp_hdr.type = 0x0;
+
+    /* Magic, more Magic! */
+    response->icmp_hdr.chks = request->icmp_hdr.chks + 0x8;
+
+    /* Copy the rest of the packet */
+    memcpy(response+1, request+1, ntohs(request->shdr.size) - sizeof(struct 
ip_icmp));
+
+    write_to_helper(response, ntohs(response->shdr.size));
+
+    GNUNET_free(request);
+}
+
+void
+send_icmp6_response(void* cls, const struct GNUNET_SCHEDULER_TaskContext *tc) {
+    if ( (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN) != 0)
+      return;
+
     struct ip6_icmp* request = cls;
 
     struct ip6_icmp* response = alloca(ntohs(request->shdr.size));
@@ -626,6 +694,8 @@
                                                
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
             value->heap_node = GNUNET_CONTAINER_heap_insert (heap, value,
                                                              
GNUNET_TIME_absolute_get ().abs_value);
+            GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Mapping is saved in the 
hashmap with key %08x.\n",
+                       *((uint32_t*)(&key)));
             if (GNUNET_CONTAINER_heap_get_size(heap) > max_mappings)
               GNUNET_SCHEDULER_add_now(collect_mappings, NULL);
           }
@@ -766,7 +836,7 @@
   }
   memcpy(&pkt6->udp_hdr, pkt, ntohs(pkt->len));
 
-  GNUNET_HashCode* key = address_mapping_exists(pkt6->ip6_hdr.sadr);
+  GNUNET_HashCode* key = address6_mapping_exists(pkt6->ip6_hdr.sadr);
   GNUNET_assert (key != NULL);
 
   struct map_entry *me = GNUNET_CONTAINER_multihashmap_get(hashmap, key);
@@ -849,7 +919,7 @@
   }
   memcpy(&pkt6->tcp_hdr, pkt, pktlen);
 
-  GNUNET_HashCode* key = address_mapping_exists(pkt6->ip6_hdr.sadr);
+  GNUNET_HashCode* key = address6_mapping_exists(pkt6->ip6_hdr.sadr);
   GNUNET_assert (key != NULL);
 
   struct map_entry *me = GNUNET_CONTAINER_multihashmap_get(hashmap, key);

Modified: gnunet/src/vpn/gnunet-daemon-vpn.h
===================================================================
--- gnunet/src/vpn/gnunet-daemon-vpn.h  2011-07-27 07:28:20 UTC (rev 16229)
+++ gnunet/src/vpn/gnunet-daemon-vpn.h  2011-07-27 07:28:21 UTC (rev 16230)
@@ -38,13 +38,14 @@
 void
 process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc);
 
-void
-send_icmp_response(void* cls, const struct GNUNET_SCHEDULER_TaskContext *tc);
+void send_icmp6_response(void* cls, const struct GNUNET_SCHEDULER_TaskContext 
*tc);
+void send_icmp4_response(void* cls, const struct GNUNET_SCHEDULER_TaskContext 
*tc);
 
 size_t
 send_udp_service (void *cls, size_t size, void *buf);
 
-GNUNET_HashCode* address_mapping_exists(unsigned char addr[]);
+GNUNET_HashCode* address6_mapping_exists(unsigned char addr[]);
+GNUNET_HashCode* address4_mapping_exists(uint32_t addr);
 
 unsigned int port_in_ports (uint64_t ports, uint16_t port);
 

Modified: gnunet/src/vpn/gnunet-service-dns.c
===================================================================
--- gnunet/src/vpn/gnunet-service-dns.c 2011-07-27 07:28:20 UTC (rev 16229)
+++ gnunet/src/vpn/gnunet-service-dns.c 2011-07-27 07:28:21 UTC (rev 16230)
@@ -468,15 +468,24 @@
   struct dns_query_line *dque =
     (struct dns_query_line *) (dpkt->data +
                                (query_states[dns->s.id].namelen));
+
+  struct dns_record_line *drec_data =
+    (struct dns_record_line *) (dpkt->data +
+                                (query_states[dns->s.id].namelen) +
+                                sizeof (struct dns_query_line) + 2);
   if (16 == answer->pkt.addrsize)
     {
       answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_REMOTE_AAAA;
       dque->type = htons (28);      /* AAAA */
+      drec_data->type = htons (28); /* AAAA */
+      drec_data->data_len = htons (16);
     }
   else
     {
       answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_REMOTE_A;
       dque->type = htons (1);      /* A */
+      drec_data->type = htons (1); /* A*/
+      drec_data->data_len = htons (4);
     }
   dque->class = htons (1);      /* IN */
 
@@ -484,16 +493,9 @@
     (char *) (dpkt->data + (query_states[dns->s.id].namelen) +
               sizeof (struct dns_query_line));
   memcpy (anname, "\xc0\x0c", 2);
-
-  struct dns_record_line *drec_data =
-    (struct dns_record_line *) (dpkt->data +
-                                (query_states[dns->s.id].namelen) +
-                                sizeof (struct dns_query_line) + 2);
-  drec_data->type = htons (28); /* AAAA */
   drec_data->class = htons (1); /* IN */
 
   drec_data->ttl = pdns->answers[0]->ttl;
-  drec_data->data_len = htons (16);
 
   /* Calculate at which offset in the packet the IPv6-Address belongs, it is
    * filled in by the daemon-vpn */

Modified: gnunet/src/vpn/gnunet-vpn-packet.h
===================================================================
--- gnunet/src/vpn/gnunet-vpn-packet.h  2011-07-27 07:28:20 UTC (rev 16229)
+++ gnunet/src/vpn/gnunet-vpn-packet.h  2011-07-27 07:28:21 UTC (rev 16230)
@@ -215,4 +215,11 @@
        unsigned char data[1];
 };
 
+struct ip_icmp {
+    struct GNUNET_MessageHeader shdr;
+    struct pkt_tun tun;
+    struct ip_hdr ip_hdr;
+    struct icmp_hdr icmp_hdr;
+};
+
 #endif




reply via email to

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