[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r13403 - gnunet/src/vpn
From: |
gnunet |
Subject: |
[GNUnet-SVN] r13403 - gnunet/src/vpn |
Date: |
Tue, 26 Oct 2010 15:55:56 +0200 |
Author: toelke
Date: 2010-10-26 15:55:56 +0200 (Tue, 26 Oct 2010)
New Revision: 13403
Modified:
gnunet/src/vpn/gnunet-daemon-vpn.c
gnunet/src/vpn/gnunet-service-dns-p.h
gnunet/src/vpn/gnunet-service-dns.c
gnunet/src/vpn/gnunet-vpn-packet.h
Log:
Answer questions for .gnunet with an ipv6-address
Modified: gnunet/src/vpn/gnunet-daemon-vpn.c
===================================================================
--- gnunet/src/vpn/gnunet-daemon-vpn.c 2010-10-26 13:55:55 UTC (rev 13402)
+++ gnunet/src/vpn/gnunet-daemon-vpn.c 2010-10-26 13:55:56 UTC (rev 13403)
@@ -36,6 +36,7 @@
#include "gnunet-service-dns-p.h"
#include "gnunet_client_lib.h"
#include "gnunet_container_lib.h"
+#include "block_dns.h"
/**
* Final status code.
@@ -307,8 +308,25 @@
process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
struct answer_packet* pkt = cls;
- if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_IP)
+ if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_SERVICE)
{
+ pkt->subtype = GNUNET_DNS_ANSWER_TYPE_IP;
+ unsigned char ip6addr[16];
+ memcpy(ip6addr, (int[]){htons(0x1234)}, 2);
+ memcpy(ip6addr+2, &pkt->peer, 7);
+ memcpy(ip6addr+9, &pkt->service_descriptor, 7);
+
+ memcpy(((char*)pkt)+ntohs(pkt->addroffset), ip6addr, 16);
+
+ /*FIXME:
+ * -save DNS_Record into hashmap, pointed to by ip
+ * -regularily walk through hashmap, deleting old entries
+ * when is an entry old?
+ * have a last-used field
+ * don't remove if last-used "recent", ask dht again if record
expired
+ */
+ }
+
struct answer_packet_list* list = GNUNET_malloc(htons(pkt->hdr.size) +
2*sizeof(struct answer_packet_list*));
memcpy(&list->pkt, pkt, htons(pkt->hdr.size));
@@ -318,15 +336,6 @@
GNUNET_SCHEDULER_add_write_file (mycls.sched,
GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL);
return;
- }
-
- if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_SERVICE)
- {
- /*FIXME:
- * -find new IP-address for this service
- * -create a DNS-Answer
- */
- }
}
static void
Modified: gnunet/src/vpn/gnunet-service-dns-p.h
===================================================================
--- gnunet/src/vpn/gnunet-service-dns-p.h 2010-10-26 13:55:55 UTC (rev
13402)
+++ gnunet/src/vpn/gnunet-service-dns-p.h 2010-10-26 13:55:56 UTC (rev
13403)
@@ -40,7 +40,13 @@
unsigned dst_port:16 GNUNET_PACKED;
unsigned short id GNUNET_PACKED;
+ GNUNET_HashCode peer;
+ GNUNET_HashCode service_descriptor;
+ uint64_t ports;
+ uint32_t service_type;
+ unsigned addroffset:16 GNUNET_PACKED;
+
unsigned char data[1];
};
Modified: gnunet/src/vpn/gnunet-service-dns.c
===================================================================
--- gnunet/src/vpn/gnunet-service-dns.c 2010-10-26 13:55:55 UTC (rev 13402)
+++ gnunet/src/vpn/gnunet-service-dns.c 2010-10-26 13:55:56 UTC (rev 13403)
@@ -61,6 +61,8 @@
unsigned local_ip:32;
unsigned remote_ip:32;
unsigned local_port:16;
+ char* name;
+ unsigned namelen:8;
};
static struct dns_query_id_state query_states[65536]; /* This is < 1.5MiB */
@@ -108,21 +110,59 @@
const struct GNUNET_DNS_Record* rec = data;
GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Got block of size %d, peer: %08x, desc:
%08x\n", size, *((unsigned int*)&rec->peer), *((unsigned
int*)&rec->service_descriptor));
- size_t len = sizeof(struct answer_packet) + size - 1; /* 1 for the unsigned
char data[1]; */
+ size_t len = sizeof(struct answer_packet) - 1 \
+ + sizeof(struct dns_static) \
+ + query_states[id].namelen \
+ + sizeof(struct dns_query_line) \
+ + 2 /* To hold the pointer to the name */ \
+ + sizeof(struct dns_record_line) - 1 \
+ + 16;
+ ;
struct answer_packet_list* answer = GNUNET_malloc(len + 2*sizeof(struct
answer_packet_list*));
+ memset(answer, 0, len + 2*sizeof(struct answer_packet_list*));
+
answer->pkt.hdr.type = htons(GNUNET_MESSAGE_TYPE_LOCAL_RESPONSE_DNS);
answer->pkt.hdr.size = htons(len);
answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_SERVICE;
+ GNUNET_CRYPTO_hash(&rec->peer, sizeof(struct
GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), &answer->pkt.peer);
+ memcpy(&answer->pkt.service_descriptor, &rec->service_descriptor,
sizeof(GNUNET_HashCode));
+ memcpy(&answer->pkt.service_type, &rec->service_type,
sizeof(answer->pkt.service_type));
+ memcpy(&answer->pkt.ports, &rec->ports, sizeof(answer->pkt.ports));
+
answer->pkt.from = query_states[id].remote_ip;
answer->pkt.to = query_states[id].local_ip;
answer->pkt.dst_port = query_states[id].local_port;
- answer->pkt.id = id;
+ struct dns_pkt *dpkt = (struct dns_pkt*)answer->pkt.data;
- memcpy(answer->pkt.data, data, size);
+ dpkt->s.id = id;
+ dpkt->s.aa = 1;
+ dpkt->s.qr = 1;
+ dpkt->s.ra = 1;
+ dpkt->s.qdcount = htons(1);
+ dpkt->s.ancount = htons(1);
+ memcpy(dpkt->data, query_states[id].name, query_states[id].namelen);
+ GNUNET_free(query_states[id].name);
+
+
+ struct dns_query_line* dque = (struct
dns_query_line*)(dpkt->data+(query_states[id].namelen));
+ dque->type = htons(28);
+ dque->class = htons(1);
+
+ char* anname = (char*)(dpkt->data+(query_states[id].namelen)+sizeof(struct
dns_query_line));
+ memcpy(anname, (char[]){0xc0, 0x0c}, 2);
+
+ struct dns_record_line *drec_data = (struct
dns_record_line*)(dpkt->data+(query_states[id].namelen)+sizeof(struct
dns_query_line)+2);
+ drec_data->type = htons(28); /* AAAA */
+ drec_data->class = htons(1); /* IN */
+ drec_data->ttl = htonl(3600); /* FIXME: read from block */
+ drec_data->data_len = htons(16);
+
+ answer->pkt.addroffset = htons((unsigned short)((unsigned
long)(&drec_data->data)-(unsigned long)(&answer->pkt)));
+
GNUNET_CONTAINER_DLL_insert_after(mycls.head, mycls.tail, mycls.tail,
answer);
GNUNET_SERVER_notify_transmit_ready(query_states[id].client,
@@ -156,6 +196,9 @@
query_states[dns->s.id].local_ip = pkt->orig_from;
query_states[dns->s.id].local_port = pkt->src_port;
query_states[dns->s.id].remote_ip = pkt->orig_to;
+ query_states[dns->s.id].namelen = strlen((char*)dns->data) + 1;
+ query_states[dns->s.id].name =
GNUNET_malloc(query_states[dns->s.id].namelen);
+ memcpy(query_states[dns->s.id].name, dns->data,
query_states[dns->s.id].namelen);
if (pdns->queries[0]->namelen > 9 &&
0 == strncmp(pdns->queries[0]->name+(pdns->queries[0]->namelen -
9), ".gnunet.", 9)) {
Modified: gnunet/src/vpn/gnunet-vpn-packet.h
===================================================================
--- gnunet/src/vpn/gnunet-vpn-packet.h 2010-10-26 13:55:55 UTC (rev 13402)
+++ gnunet/src/vpn/gnunet-vpn-packet.h 2010-10-26 13:55:56 UTC (rev 13403)
@@ -98,6 +98,11 @@
struct dns_record** additional;
};
+struct dns_query_line {
+ unsigned short type;
+ unsigned short class;
+};
+
struct dns_query {
char* name;
unsigned char namelen;
@@ -105,6 +110,14 @@
unsigned short qclass;
};
+struct dns_record_line {
+ unsigned short type;
+ unsigned short class;
+ unsigned int ttl;
+ unsigned short data_len;
+ unsigned char data;
+};
+
struct dns_record {
char* name;
unsigned char namelen;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r13403 - gnunet/src/vpn,
gnunet <=