[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r16229 - gnunet/src/vpn
From: |
gnunet |
Subject: |
[GNUnet-SVN] r16229 - gnunet/src/vpn |
Date: |
Wed, 27 Jul 2011 09:28:20 +0200 |
Author: toelke
Date: 2011-07-27 09:28:20 +0200 (Wed, 27 Jul 2011)
New Revision: 16229
Modified:
gnunet/src/vpn/gnunet-daemon-exit.c
gnunet/src/vpn/gnunet-daemon-vpn.c
gnunet/src/vpn/gnunet-service-dns-p.h
gnunet/src/vpn/gnunet-service-dns.c
Log:
begin resolving A-records
Modified: gnunet/src/vpn/gnunet-daemon-exit.c
===================================================================
--- gnunet/src/vpn/gnunet-daemon-exit.c 2011-07-27 07:28:19 UTC (rev 16228)
+++ gnunet/src/vpn/gnunet-daemon-exit.c 2011-07-27 07:28:20 UTC (rev 16229)
@@ -1013,7 +1013,7 @@
const struct GNUNET_TRANSPORT_ATS_Information *atsi
__attribute__((unused)))
{
GNUNET_HashCode *desc = (GNUNET_HashCode *) (message + 1);
- struct udp_pkt *pkt = (struct udp_pkt *) (desc + 1);
+ struct tcp_pkt *pkt = (struct tcp_pkt *) (desc + 1);
struct remote_addr *s = (struct remote_addr *) desc;
char *buf;
size_t len;
@@ -1036,11 +1036,11 @@
switch (s->addrlen)
{
case 4:
- prepare_ipv4_packet (len, ntohs (pkt->len), pkt, 0x06, /* TCP */
+ prepare_ipv4_packet (len, pkt_len, pkt, 0x06, /* TCP */
&s->addr, tunnel, state, (struct ip_pkt *) buf);
break;
case 16:
- prepare_ipv6_packet (len, ntohs (pkt->len), pkt, 0x06, /* TCP */
+ prepare_ipv6_packet (len, pkt_len, pkt, 0x06, /* TCP */
&s->addr, tunnel, state, (struct ip6_pkt *) buf);
break;
default:
Modified: gnunet/src/vpn/gnunet-daemon-vpn.c
===================================================================
--- gnunet/src/vpn/gnunet-daemon-vpn.c 2011-07-27 07:28:19 UTC (rev 16228)
+++ gnunet/src/vpn/gnunet-daemon-vpn.c 2011-07-27 07:28:20 UTC (rev 16229)
@@ -200,7 +200,6 @@
GNUNET_assert (size >= ntohs (hdr->size));
memcpy (buf, hdr, ntohs (hdr->size));
size = ntohs(hdr->size);
- GNUNET_free (cls);
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sent!\n");
if (NULL != GNUNET_MESH_tunnel_get_head(*tunnel))
@@ -225,6 +224,7 @@
/* save the handle */
GNUNET_MESH_tunnel_set_data(*tunnel, th);
}
+ GNUNET_free (cls);
return size;
}
@@ -331,11 +331,64 @@
int local_length = 16 - ipv6prefix;
- memcpy (buf + ipv6prefix, addr, GNUNET_MAX (addrlen, local_length));
+ memcpy (buf + ipv6prefix, addr, GNUNET_MIN (addrlen, local_length));
}
/*}}}*/
/**
+ * Create a new Address from an answer-packet
+ */
+void
+new_ip4addr_remote (unsigned char *buf, unsigned char *addr, char addrlen)
+{ /* {{{ */
+ char *ipv4addr;
+ char *ipv4mask;
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_CONFIGURATION_get_value_string (cfg, "vpn",
+ "IPV4ADDR",
+ &ipv4addr));
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_CONFIGURATION_get_value_string (cfg, "vpn",
+ "IPV4MASK",
+ &ipv4mask));
+ uint32_t mask;
+ inet_pton (AF_INET, ipv4addr, buf);
+ int r = inet_pton (AF_INET, ipv4mask, &mask);
+ mask = htonl(mask);
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "inet_pton: %d; %m; mask: %08x\n", r,
mask);
+
+ GNUNET_free (ipv4addr);
+
+ int c;
+
+ if (mask)
+ {
+ mask = (mask ^ (mask - 1)) >> 1;
+ for (c = 0; mask; c++)
+ {
+ mask >>= 1;
+ }
+ }
+ else
+ {
+ c = CHAR_BIT * sizeof(mask);
+ }
+
+ c = 32-c;
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "The mask %s has %d leading 1s.\n",
ipv4mask, c);
+
+ GNUNET_free (ipv4mask);
+
+ if (c % 8 == 0)
+ c = c / 8;
+ else
+ GNUNET_assert(0);
+
+ memcpy (buf + c, addr, GNUNET_MIN (addrlen, c));
+}
+/*}}}*/
+
+/**
* This gets scheduled with cls pointing to an answer_packet and does
everything
* needed in order to send it to the helper.
*
@@ -463,7 +516,7 @@
list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct
answer_packet_list*));
memcpy(&list->pkt, pkt, htons(pkt->hdr.size));
}
- else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REMOTE)
+ else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REMOTE_AAAA)
{
pkt->subtype = GNUNET_DNS_ANSWER_TYPE_IP;
@@ -529,6 +582,60 @@
memcpy(&list->pkt, pkt, htons(pkt->hdr.size));
}
+ else if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_REMOTE_A)
+ {
+ pkt->subtype = GNUNET_DNS_ANSWER_TYPE_IP;
+
+ GNUNET_HashCode key;
+ memset(&key, 0, sizeof(GNUNET_HashCode));
+
+ unsigned char* c = ((unsigned char*)pkt)+ntohs(pkt->addroffset);
+ new_ip4addr_remote(c, pkt->addr, pkt->addrsize);
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "New mapping to %d.%d.%d.%d\n",
+ c[0],
+ c[1],
+ c[2],
+ c[3]);
+ unsigned char* k = (unsigned char*)&key;
+ /*
+ * Copy the newly generated ip-address to the key backwards (as only
the first part is used in the hash-table)
+ */
+ unsigned int i;
+ for (i = 0; i < 4; i++)
+ k[3-i] = c[i];
+
+ uint16_t namelen = strlen((char*)pkt->data+12)+1;
+
+ struct map_entry* value = GNUNET_malloc(sizeof(struct map_entry) +
namelen);
+ char* name = (char*)(value +1);
+
+ value->namelen = namelen;
+ memcpy(name, pkt->data+12, namelen);
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Setting addrlen to %d\n",
pkt->addrsize);
+ value->addrlen = pkt->addrsize;
+ memcpy(&value->addr, &pkt->addr, pkt->addrsize);
+ memset(value->additional_ports, 0, 8192);
+
+ memcpy(&value->hash, &key, sizeof(GNUNET_HashCode));
+
+ if (GNUNET_NO ==
+ GNUNET_CONTAINER_multihashmap_contains (hashmap, &key))
+ {
+ GNUNET_CONTAINER_multihashmap_put (hashmap, &key, value,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY);
+ value->heap_node = GNUNET_CONTAINER_heap_insert (heap, value,
+
GNUNET_TIME_absolute_get ().abs_value);
+ if (GNUNET_CONTAINER_heap_get_size(heap) > max_mappings)
+ GNUNET_SCHEDULER_add_now(collect_mappings, NULL);
+ }
+ else
+ GNUNET_free(value);
+
+ list = GNUNET_malloc(htons(pkt->hdr.size) + 2*sizeof(struct
answer_packet_list*));
+
+ memcpy(&list->pkt, pkt, htons(pkt->hdr.size));
+ }
else
{
GNUNET_break(0);
Modified: gnunet/src/vpn/gnunet-service-dns-p.h
===================================================================
--- gnunet/src/vpn/gnunet-service-dns-p.h 2011-07-27 07:28:19 UTC (rev
16228)
+++ gnunet/src/vpn/gnunet-service-dns-p.h 2011-07-27 07:28:20 UTC (rev
16229)
@@ -47,10 +47,16 @@
GNUNET_DNS_ANSWER_TYPE_REV,
/**
- * Answers of this type contains an IP-Address but traffic to this IP
should
+ * Answers of this type contains an IP6-Address but traffic to this IP
should
* be routed through the GNUNet.
*/
- GNUNET_DNS_ANSWER_TYPE_REMOTE
+ GNUNET_DNS_ANSWER_TYPE_REMOTE_AAAA,
+
+ /**
+ * Answers of this type contains an IP4-Address but traffic to this IP
should
+ * be routed through the GNUNet.
+ */
+ GNUNET_DNS_ANSWER_TYPE_REMOTE_A
};
struct GNUNET_vpn_service_descriptor {
Modified: gnunet/src/vpn/gnunet-service-dns.c
===================================================================
--- gnunet/src/vpn/gnunet-service-dns.c 2011-07-27 07:28:19 UTC (rev 16228)
+++ gnunet/src/vpn/gnunet-service-dns.c 2011-07-27 07:28:20 UTC (rev 16229)
@@ -241,7 +241,6 @@
GNUNET_assert (size >= (*sz + sizeof (struct GNUNET_MessageHeader)));
memcpy (hdr + 1, dns, *sz);
- GNUNET_free (cls);
if (NULL != GNUNET_MESH_tunnel_get_head(*tunnel))
{
@@ -264,6 +263,9 @@
/* save the handle */
GNUNET_MESH_tunnel_set_data(*tunnel, th);
}
+
+ GNUNET_free (cls);
+
return ntohs (hdr->size);
}
@@ -302,7 +304,6 @@
GNUNET_MESH_tunnel_set_data(cls_->tunnel, th);
}
- GNUNET_free(cls);
return size;
}
@@ -412,7 +413,11 @@
/* They sent us a packet we were not waiting for */
if (remote_pending[dns->s.id] == NULL
|| remote_pending[dns->s.id]->tunnel != tunnel)
- return GNUNET_SYSERR;
+ return GNUNET_OK;
+
+ GNUNET_free(remote_pending[dns->s.id]);
+ remote_pending[dns->s.id] = NULL;
+
if (query_states[dns->s.id].valid != GNUNET_YES)
return GNUNET_SYSERR;
query_states[dns->s.id].valid = GNUNET_NO;
@@ -428,7 +433,6 @@
answer->pkt.hdr.type = htons (GNUNET_MESSAGE_TYPE_LOCAL_RESPONSE_DNS);
answer->pkt.hdr.size = htons (len);
- answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_REMOTE;
struct dns_pkt_parsed* pdns = parse_dns_packet(dns);
@@ -464,7 +468,16 @@
struct dns_query_line *dque =
(struct dns_query_line *) (dpkt->data +
(query_states[dns->s.id].namelen));
- dque->type = htons (28); /* AAAA */
+ if (16 == answer->pkt.addrsize)
+ {
+ answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_REMOTE_AAAA;
+ dque->type = htons (28); /* AAAA */
+ }
+ else
+ {
+ answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_REMOTE_A;
+ dque->type = htons (1); /* A */
+ }
dque->class = htons (1); /* IN */
char *anname =
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r16229 - gnunet/src/vpn,
gnunet <=