dest.sin_port = htons(53);
dest.sin_addr.s_addr = pkt->orig_to;
- query_states[dns->id].valid = 1;
- query_states[dns->id].client = client;
- query_states[dns->id].local_ip = pkt->orig_from;
- query_states[dns->id].local_port = pkt->src_port;
+ query_states[dns->s.id].valid = 1;
+ query_states[dns->s.id].client = client;
+ query_states[dns->s.id].local_ip = pkt->orig_from;
+ query_states[dns->s.id].local_port = pkt->src_port;
/* int r = */ GNUNET_NETWORK_socket_sendto(mycls.dnsout, dns, ntohs(pkt->hdr.size) - sizeof(struct query_packet) + 1, (struct sockaddr*) &dest, sizeof dest);
/* if (r < 0) TODO */
- if (query_states[dns->id].valid == 1) {
- query_states[dns->id].valid = 0;
+ if (query_states[dns->s.id].valid == 1) {
+ query_states[dns->s.id].valid = 0;
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;
+ answer->pkt.to = query_states[dns->s.id].local_ip;
+ answer->pkt.dst_port = query_states[dns->s.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);
+ /* struct GNUNET_CONNECTION_TransmitHandle* th = */ GNUNET_SERVER_notify_transmit_ready(query_states[dns->s.id].client, len, GNUNET_TIME_UNIT_FOREVER_REL, &send_answer, query_states[dns->s.id].client);
}
GNUNET_SCHEDULER_add_read_net(mycls.sched, GNUNET_TIME_UNIT_FOREVER_REL, mycls.dnsout, &read_response, NULL);
};
// DNS-Stuff
-struct dns_pkt {
+struct dns_static {
unsigned short id GNUNET_PACKED;
unsigned rd:1 GNUNET_PACKED; // recursion desired (client -> server)
unsigned short ancount GNUNET_PACKED; // number of answers
unsigned short nscount GNUNET_PACKED; // number of authority-records
unsigned short arcount GNUNET_PACKED; // number of additional records
+};
+
+struct dns_pkt {
+ struct dns_static s;
unsigned char data[1];
};
+struct dns_pkt_parsed {
+ struct dns_static s;
+ struct dns_query* queries;
+ struct dns_record* answers;
+ struct dns_record* nameservers;
+ struct dns_record* additional;
+};
+
struct dns_query {
unsigned char* name;
unsigned short qtype;
void pkt_printf_dns(struct dns_pkt* pkt) {{{
printf("DNS-Packet:\n");
- printf("\tid: %d\n", ntohs(pkt->id));
- printf("\t%d: %s\n", pkt->qr, pkt->qr == 0 ? "query" : "response");
- printf("\top: %s\n", (char*[]){"query", "inverse q.", "status", "inval"}[pkt->op]);
- printf("\trecursion is%s desired\n", pkt->rd == 0 ? " not" : "");
- unsigned short qdcount = ntohs(pkt->qdcount);
- unsigned short ancount = ntohs(pkt->ancount);
- unsigned short nscount = ntohs(pkt->nscount);
- unsigned short arcount = ntohs(pkt->arcount);
+ printf("\tid: %d\n", ntohs(pkt->s.id));
+ printf("\t%d: %s\n", pkt->s.qr, pkt->s.qr == 0 ? "query" : "response");
+ printf("\top: %s\n", (char*[]){"query", "inverse q.", "status", "inval"}[pkt->s.op]);
+ printf("\trecursion is%s desired\n", pkt->s.rd == 0 ? " not" : "");
+ unsigned short qdcount = ntohs(pkt->s.qdcount);
+ unsigned short ancount = ntohs(pkt->s.ancount);
+ unsigned short nscount = ntohs(pkt->s.nscount);
+ unsigned short arcount = ntohs(pkt->s.arcount);
printf("\t#qd: %d\n", qdcount);
printf("\t#an: %d\n", ancount);
printf("\t#ns: %d\n", nscount);