struct query_packet_list *head;
struct query_packet_list *tail;
- struct answer_packet_list *answer_head;
- struct answer_packet_list *answer_tail;
+ struct answer_packet_list *answer_proc_head;
+ struct answer_packet_list *answer_proc_tail;
};
static struct vpn_cls mycls;
static void helper_write(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tsdkctx) {
if (tsdkctx->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)
return;
- struct answer_packet_list* ans = mycls.answer_head;
+ struct answer_packet_list* ans = mycls.answer_proc_head;
size_t len = ntohs(ans->pkt.hdr.size);
GNUNET_assert(ans->pkt.subtype == GNUNET_DNS_ANSWER_TYPE_IP);
memcpy(&pkt->udp_dns.data, ans->pkt.data, data_len);
- GNUNET_CONTAINER_DLL_remove (mycls.answer_head, mycls.answer_tail, ans);
+ GNUNET_CONTAINER_DLL_remove (mycls.answer_proc_head, mycls.answer_proc_tail, ans);
GNUNET_free(ans);
/* FIXME */ GNUNET_DISK_file_write(mycls.fh_to_helper, pkt, pkt_len);
- if (mycls.answer_head != NULL)
+ if (mycls.answer_proc_head != NULL)
GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL);
}
/* struct GNUNET_CLIENT_TransmitHandle* th = */ GNUNET_CLIENT_notify_transmit_ready(mycls.dns_connection, ntohs(mycls.head->pkt.hdr.size), GNUNET_TIME_UNIT_FOREVER_REL, GNUNET_YES, &send_query, NULL);
}
-static void
-dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg)
+static void
+process_answer(void* cls, const struct GNUNET_SCHEDULER_TaskContext* tc) {
+ struct answer_packet* pkt = cls;
+
+ if (pkt->subtype == GNUNET_DNS_ANSWER_TYPE_IP)
+ {
+ 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));
+
+ GNUNET_CONTAINER_DLL_insert_after(mycls.answer_proc_head, mycls.answer_proc_tail, mycls.answer_proc_tail, list);
+
+ 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
+dns_answer_handler(void* cls, const struct GNUNET_MessageHeader *msg)
{
- if (msg == NULL)
+ if (msg == NULL)
{
GNUNET_CLIENT_disconnect(mycls.dns_connection, GNUNET_NO);
mycls.dns_connection = NULL;
&reconnect_to_service_dns,
NULL);
return;
- }
- struct answer_packet_list* pkt = GNUNET_malloc(ntohs(msg->size) + 2*sizeof(struct answer_packet_list*));
-
- memcpy(&pkt->pkt, msg, ntohs(msg->size));
- GNUNET_CONTAINER_DLL_insert_after(mycls.answer_head, mycls.answer_tail, mycls.answer_tail, pkt);
- GNUNET_SCHEDULER_add_write_file (mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.fh_to_helper, &helper_write, NULL);
+ }
+ void *pkt = GNUNET_malloc(ntohs(msg->size));
+
+ memcpy(pkt, msg, ntohs(msg->size));
+
+ GNUNET_SCHEDULER_add_now(mycls.sched, process_answer, pkt);
GNUNET_CLIENT_receive(mycls.dns_connection, &dns_answer_handler, NULL, GNUNET_TIME_UNIT_FOREVER_REL);
}
unsigned remote_ip:32;
unsigned local_port:16;
};
-static struct dns_query_id_state query_states[65536]; /* This is < 1MiB */
+static struct dns_query_id_state query_states[65536]; /* This is < 1.5MiB */
void hijack(unsigned short port) {
char port_s[6];
size_t send_answer(void* cls, size_t size, void* buf);
+struct receive_dht_cls {
+ unsigned short id;
+ struct GNUNET_DHT_GetHandle* handle;
+};
+
void receive_dht(void *cls,
struct GNUNET_TIME_Absolute exp,
const GNUNET_HashCode *key,
size_t size,
const void *data)
{
- unsigned short id = *((unsigned short*)cls);
+ unsigned short id = ((struct receive_dht_cls*)cls)->id;
+ struct GNUNET_DHT_GetHandle* handle = ((struct receive_dht_cls*)cls)->handle;
GNUNET_free(cls);
GNUNET_assert(type == GNUNET_BLOCK_TYPE_DNS);
answer->pkt.to = query_states[id].local_ip;
answer->pkt.dst_port = query_states[id].local_port;
+ answer->pkt.id = id;
+
memcpy(answer->pkt.data, data, size);
GNUNET_CONTAINER_DLL_insert_after(mycls.head, mycls.tail, mycls.tail, answer);
- /* struct GNUNET_CONNECTION_TransmitHandle* th = */ GNUNET_SERVER_notify_transmit_ready(query_states[id].client, len, GNUNET_TIME_UNIT_FOREVER_REL, &send_answer, query_states[id].client);
+ GNUNET_SERVER_notify_transmit_ready(query_states[id].client,
+ len,
+ GNUNET_TIME_UNIT_FOREVER_REL,
+ &send_answer,
+ query_states[id].client);
+
+ GNUNET_DHT_get_stop(handle);
}
/**
if (pdns->queries[0]->namelen > 9 &&
0 == strncmp(pdns->queries[0]->name+(pdns->queries[0]->namelen - 9), ".gnunet.", 9)) {
- unsigned short* id = GNUNET_malloc(sizeof(unsigned short));
- *id = dns->s.id;
-
GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Query for .gnunet!\n");
GNUNET_HashCode key;
GNUNET_CRYPTO_hash(pdns->queries[0]->name, pdns->queries[0]->namelen, &key);
+
GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Getting with key %08x, len is %d\n", *((unsigned int*)&key), pdns->queries[0]->namelen);
- GNUNET_DHT_get_start(mycls.dht,
+
+ struct receive_dht_cls* cls = GNUNET_malloc(sizeof(struct receive_dht_cls));
+ cls->id = dns->s.id;
+
+ cls->handle = GNUNET_DHT_get_start(mycls.dht,
GNUNET_TIME_UNIT_MINUTES,
GNUNET_BLOCK_TYPE_DNS,
&key,
NULL,
0,
receive_dht,
- id);
+ cls);
+
goto out;
}