[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r13055 - gnunet/src/vpn
From: |
gnunet |
Subject: |
[GNUnet-SVN] r13055 - gnunet/src/vpn |
Date: |
Tue, 21 Sep 2010 17:14:42 +0200 |
Author: toelke
Date: 2010-09-21 17:14:42 +0200 (Tue, 21 Sep 2010)
New Revision: 13055
Modified:
gnunet/src/vpn/gnunet-service-dns-p.h
gnunet/src/vpn/gnunet-service-dns.c
Log:
send the answer from dns to the vpn
Modified: gnunet/src/vpn/gnunet-service-dns-p.h
===================================================================
--- gnunet/src/vpn/gnunet-service-dns-p.h 2010-09-21 15:14:40 UTC (rev
13054)
+++ gnunet/src/vpn/gnunet-service-dns-p.h 2010-09-21 15:14:42 UTC (rev
13055)
@@ -19,4 +19,19 @@
struct query_packet pkt;
};
+struct answer_packet {
+ struct GNUNET_MessageHeader hdr;
+
+ unsigned from:32 GNUNET_PACKED;
+ unsigned to:32 GNUNET_PACKED;
+ unsigned dst_port:16 GNUNET_PACKED;
+
+ unsigned char data[1];
+};
+struct answer_packet_list {
+ struct answer_packet_list* next GNUNET_PACKED;
+ struct answer_packet_list* prev GNUNET_PACKED;
+ struct answer_packet pkt;
+};
+
#endif
Modified: gnunet/src/vpn/gnunet-service-dns.c
===================================================================
--- gnunet/src/vpn/gnunet-service-dns.c 2010-09-21 15:14:40 UTC (rev 13054)
+++ gnunet/src/vpn/gnunet-service-dns.c 2010-09-21 15:14:42 UTC (rev 13055)
@@ -31,6 +31,7 @@
#include "gnunet_protocols.h"
#include "gnunet-vpn-packet.h"
#include "gnunet-vpn-pretty-print.h"
+#include "gnunet_container_lib.h"
struct dns_cls {
struct GNUNET_SCHEDULER_Handle *sched;
@@ -38,6 +39,9 @@
struct GNUNET_NETWORK_Handle *dnsout;
unsigned short dnsoutport;
+
+ struct answer_packet_list *head;
+ struct answer_packet_list *tail;
};
static struct dns_cls mycls;
@@ -87,6 +91,27 @@
GNUNET_SERVER_receive_done(client, GNUNET_OK);
}
+size_t send_answer(void* cls, size_t size, void* buf) {
+ struct answer_packet_list* query = mycls.head;
+ size_t len = ntohs(query->pkt.hdr.size);
+
+ GNUNET_assert(len <= size);
+
+ memcpy(buf, &query->pkt.hdr, len);
+
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Sent %d bytes.\n", len);
+
+ GNUNET_CONTAINER_DLL_remove (mycls.head, mycls.tail, query);
+
+ GNUNET_free(query);
+
+ if (mycls.head != NULL) {
+ GNUNET_SERVER_notify_transmit_ready(cls,
ntohs(mycls.head->pkt.hdr.size), GNUNET_TIME_UNIT_FOREVER_REL, &send_answer,
cls);
+ }
+
+ return len;
+}
+
static void read_response (void *cls, const struct
GNUNET_SCHEDULER_TaskContext *tc) {
unsigned char buf[65536];
struct dns_pkt* dns = (struct dns_pkt*)buf;
@@ -94,13 +119,34 @@
if (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)
return;
+ struct sockaddr_in addr;
+ memset(&addr, 0, sizeof addr);
+ unsigned int addrlen = sizeof addr;
+
int r;
- r = GNUNET_NETWORK_socket_recv(mycls.dnsout, buf, 65536);
+ r = GNUNET_NETWORK_socket_recvfrom(mycls.dnsout, buf, 65536, (struct
sockaddr*)&addr, &addrlen);
+ /* if (r < 0) TODO */
+
if (query_states[dns->id].valid == 1) {
query_states[dns->id].valid = 0;
- GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Would send answer to
Client %x, to IP %x:%d\n", query_states[dns->id].client,
ntohl(query_states[dns->id].local_ip), ntohs(query_states[dns->id].local_port));
+ size_t len = sizeof(struct answer_packet) + r - 1; /* 1 for the
unsigned char data[1]; */
+ struct answer_packet_list* answer = GNUNET_malloc(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.from = addr.sin_addr.s_addr;
+ answer->pkt.to = query_states[dns->id].local_ip;
+ answer->pkt.dst_port = query_states[dns->id].local_port;
+ memcpy(answer->pkt.data, buf, r);
+
+ GNUNET_CONTAINER_DLL_insert_after(mycls.head, mycls.tail,
mycls.tail, answer);
+
+ struct GNUNET_CONNECTION_TransmitHandle* th =
GNUNET_SERVER_notify_transmit_ready(query_states[dns->id].client, len,
GNUNET_TIME_UNIT_FOREVER_REL, &send_answer, query_states[dns->id].client);
+ if (th != NULL)
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Queued sending of
%d bytes.\n", len);
+ else
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Already queued for
%d bytes.\n", len);
}
GNUNET_SCHEDULER_add_read_net(mycls.sched,
GNUNET_TIME_UNIT_FOREVER_REL, mycls.dnsout, &read_response, NULL);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r13055 - gnunet/src/vpn,
gnunet <=