[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r13552 - gnunet/src/vpn
From: |
gnunet |
Subject: |
[GNUnet-SVN] r13552 - gnunet/src/vpn |
Date: |
Thu, 4 Nov 2010 18:26:58 +0100 |
Author: toelke
Date: 2010-11-04 18:26:58 +0100 (Thu, 04 Nov 2010)
New Revision: 13552
Modified:
gnunet/src/vpn/gnunet-daemon-vpn.c
gnunet/src/vpn/gnunet-vpn-packet.h
Log:
Answer an icmp-request
Modified: gnunet/src/vpn/gnunet-daemon-vpn.c
===================================================================
--- gnunet/src/vpn/gnunet-daemon-vpn.c 2010-11-04 17:26:58 UTC (rev 13551)
+++ gnunet/src/vpn/gnunet-daemon-vpn.c 2010-11-04 17:26:58 UTC (rev 13552)
@@ -350,6 +350,45 @@
NULL);
}
+static int
+address_mapping_exists(unsigned char addr[]) {
+ return 1;
+}
+
+static void
+send_icmp_response(void* cls, const struct GNUNET_SCHEDULER_TaskContext *tc) {
+ struct ip6_icmp* request = cls;
+
+ struct ip6_icmp* response = alloca(ntohs(request->shdr.size));
+ 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(0x86dd);
+
+ response->ip6_hdr.hoplmt = 255;
+ response->ip6_hdr.paylgth = request->ip6_hdr.paylgth;
+ response->ip6_hdr.nxthdr = 0x3a;
+ response->ip6_hdr.version = 6;
+ memcpy(&response->ip6_hdr.sadr, &request->ip6_hdr.dadr, 16);
+ memcpy(&response->ip6_hdr.dadr, &request->ip6_hdr.sadr, 16);
+
+ response->icmp_hdr.code = 0;
+ response->icmp_hdr.type = 0x81;
+
+ /* Magic, more Magic! */
+ response->icmp_hdr.chks = request->icmp_hdr.chks - 0x1;
+
+ /* Copy the rest of the packet */
+ memcpy(response+1, request+1, ntohs(request->shdr.size) - sizeof(struct
ip6_icmp));
+
+ /* FIXME */ GNUNET_DISK_file_write(fh_to_helper, response,
ntohs(response->shdr.size));
+
+ GNUNET_free(request);
+}
+
/**
* Receive packets from the helper-process
*/
@@ -368,6 +407,7 @@
GNUNET_assert(pkt6->ip6_hdr.version == 6);
struct ip6_tcp *pkt6_tcp;
struct ip6_udp *pkt6_udp;
+ struct ip6_icmp *pkt6_icmp;
pkt_printf(pkt6);
switch(pkt6->ip6_hdr.nxthdr)
@@ -383,6 +423,14 @@
pkt_printf_ip6dns((struct ip6_udp_dns*)pkt6_udp);
}
break;
+ case 0x3a:
+ /* ICMPv6 */
+ pkt6_icmp = GNUNET_malloc(ntohs(pkt6->shdr.size));
+ memcpy(pkt6_icmp, pkt6, ntohs(pkt6->shdr.size));
+ /* If this packet is an icmp-echo-request and a mapping exists,
answer */
+ if (pkt6_icmp->icmp_hdr.type == 0x80 &&
address_mapping_exists(pkt6->ip6_hdr.sadr))
+ GNUNET_SCHEDULER_add_now(sched, &send_icmp_response, pkt6_icmp);
+ break;
}
}
/* ethertype is ipv4 */
Modified: gnunet/src/vpn/gnunet-vpn-packet.h
===================================================================
--- gnunet/src/vpn/gnunet-vpn-packet.h 2010-11-04 17:26:58 UTC (rev 13551)
+++ gnunet/src/vpn/gnunet-vpn-packet.h 2010-11-04 17:26:58 UTC (rev 13552)
@@ -61,6 +61,12 @@
unsigned crc:16 GNUNET_PACKED;
};
+struct icmp_hdr {
+ unsigned type:8 GNUNET_PACKED;
+ unsigned code:8 GNUNET_PACKED;
+ unsigned chks:16 GNUNET_PACKED;
+};
+
// DNS-Stuff
struct dns_static {
unsigned short id GNUNET_PACKED;
@@ -155,6 +161,13 @@
unsigned char data[1];
};
+struct ip6_icmp {
+ struct GNUNET_MessageHeader shdr;
+ struct pkt_tun tun;
+ struct ip6_hdr ip6_hdr;
+ struct icmp_hdr icmp_hdr;
+};
+
struct ip6_udp {
struct GNUNET_MessageHeader shdr;
struct pkt_tun tun;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r13552 - gnunet/src/vpn,
gnunet <=