gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r12258 - gnunet/src/vpn


From: gnunet
Subject: [GNUnet-SVN] r12258 - gnunet/src/vpn
Date: Tue, 20 Jul 2010 07:45:21 +0200

Author: toelke
Date: 2010-07-20 07:45:21 +0200 (Tue, 20 Jul 2010)
New Revision: 12258

Added:
   gnunet/src/vpn/udp.c
   gnunet/src/vpn/udp.h
Modified:
   gnunet/src/vpn/packet.h
   gnunet/src/vpn/pretty-print.c
   gnunet/src/vpn/pretty-print.h
   gnunet/src/vpn/test.c
   gnunet/src/vpn/tun.h
Log:
Parse and pretty-print dns

Modified: gnunet/src/vpn/packet.h
===================================================================
--- gnunet/src/vpn/packet.h     2010-07-20 05:45:18 UTC (rev 12257)
+++ gnunet/src/vpn/packet.h     2010-07-20 05:45:21 UTC (rev 12258)
@@ -39,28 +39,45 @@
 };
 
 struct dns_pkt {
-       unsigned id:16;
+       unsigned short id;
+
+       unsigned rd:1; // recursion desired (client -> server)
+       unsigned tc:1; // message is truncated
+       unsigned aa:1; // authoritative answer
+       unsigned op:4; // query:0, inverse q.:1, status: 2
        unsigned qr:1; // query:0, response:1
-       unsigned op:4; // query:0, inverse q.:1, status: 2
-       unsigned aa:1; // authoritative answer
-       unsigned tc:1; // message is truncated
-       unsigned rd:1; // recursion desired (client -> server)
-       unsigned ra:1; // recursion available (server -> client)
-       unsigned z:2;  // reserved
-       unsigned a:1;  // answer is signed by server
+
        unsigned rcode:4; // 0 No error
                          // 1 Format error
                          // 2 Server failure
                          // 3 Name Error
                          // 4 Not Implemented
                          // 5 Refused
-       unsigned qdcount:16; // number of questions
-       unsigned ancount:16; // number of answers
-       unsigned nscount:16; // number of authority-records
-       unsigned arcount:16; // number of additional records
+       unsigned z:3;  // reserved
+       unsigned ra:1; // recursion available (server -> client)
+
+       unsigned short qdcount; // number of questions
+       unsigned short ancount; // number of answers
+       unsigned short nscount; // number of authority-records
+       unsigned short arcount; // number of additional records
        unsigned char data[1];
 };
 
+struct dns_query {
+       unsigned char* name;
+       unsigned short qtype;
+       unsigned short qclass;
+};
+
+struct dns_record {
+       unsigned char* name;
+       unsigned short type;
+       unsigned short class;
+       unsigned int ttl;
+       unsigned short data_len;
+       unsigned char* data;
+};
+
 struct ip6_pkt {
        struct pkt_tun tun;
        struct ip6_hdr hdr;
@@ -84,6 +101,11 @@
 int recv_pkt(int fd, struct pkt_tun** pkt);
 struct ip6_pkt* parse_ip6(struct pkt_tun* pkt);
 
+struct ip6_udp_dns {
+       struct ip6_udp hdr;
+       struct dns_pkt data;
+};
+
 struct ip6_tcp* parse_ip6_tcp(struct ip6_pkt*);
 struct ip6_udp* parse_ip6_udp(struct ip6_pkt*);
 

Modified: gnunet/src/vpn/pretty-print.c
===================================================================
--- gnunet/src/vpn/pretty-print.c       2010-07-20 05:45:18 UTC (rev 12257)
+++ gnunet/src/vpn/pretty-print.c       2010-07-20 05:45:21 UTC (rev 12258)
@@ -176,3 +176,120 @@
        printf("len: %u\n", ntohs(pkt->data.len));
        printf("crc: 0x%x\n", ntohs(pkt->data.crc));
 }}}
+
+static char* dns_types(unsigned short type) {{{
+       static char* types[] = { /*{{{*/
+               "",
+               "A",              // 1 a host address
+               "NS",             // 2 an authoritative name server
+               "MD",             // 3 a mail destination (Obsolete - use MX)
+               "MF",             // 4 a mail forwarder (Obsolete - use MX)
+               "CNAME",          // 5 the canonical name for an alias
+               "SOA",            // 6 marks the start of a zone of authority
+               "MB",             // 7 a mailbox domain name (EXPERIMENTAL)
+               "MG",             // 8 a mail group member (EXPERIMENTAL)
+               "MR",             // 9 a mail rename domain name (EXPERIMENTAL)
+               "NULL",           // 10 a null RR (EXPERIMENTAL)
+               "WKS",            // 11 a well known service description
+               "PTR",            // 12 a domain name pointer
+               "HINFO",          // 13 host information
+               "MINFO",          // 14 mailbox or mail list information
+               "MX",             // 15 mail exchange
+               "TXT",            // 16 text strings
+               "RP",
+               "AFSDB"
+       }; /*}}}*/
+
+       static char* qtypes[] = { /* + 252! {{{ */
+               "AXFR",           // 252 A request for a transfer of an entire 
zone
+               "MAILB",          // 253 A request for mailbox-related records 
(MB, MG or MR)
+               "MAILA",          // 254 A request for mail agent RRs (Obsolete 
- see MX)
+               "*",              // 255 A request for all records
+       }; /*}}}*/
+
+       if (type <= 18) return types[type];
+       if (type >= 252 && type <= 255) return qtypes[type-252];
+       
+       switch(type) {
+               case 24: return "SIG";
+               case 25: return "KEY";
+               case 28: return "AAAA";
+               case 29: return "LOC";
+               case 33: return "SRV";
+               case 35: return "NAPTR";
+               case 36: return "KX";
+               case 37: return "CERT";
+               case 39: return "DNAME";
+               case 42: return "APL";
+               case 43: return "DS";
+               case 44: return "SSHFP";
+               case 45: return "IPSECKEY";
+               case 46: return "RRSIG";
+               case 47: return "NSEC";
+               case 48: return "DNSKEY";
+               case 49: return "DHCID";
+               case 50: return "NSEC3";
+               case 51: return "NSEC3PARAM";
+               case 55: return "HIP";
+               case 99: return "SPF";
+               case 249: return "TKEY";
+               case 250: return "TSIG";
+               case 32768: return "TA";
+               case 32769: return "DLV";
+       }
+
+       return 0;
+
+}}}
+
+static char* dns_classes(short class) {{{
+       static char* classes[] = { /*{{{*/
+               "",
+               "IN", // 1 the Internet
+               "CS", // 2 the CSNET class (Obsolete - used only for examples 
in some obsolete RFCs)
+               "CH", // 3 the CHAOS class
+               "HS", // 4 Hesiod [Dyer 87]
+       }; /*}}}*/
+
+       if (class <= 4) return classes[class];
+       return 0;
+}}}
+
+void pkt_printf_ip6dns(struct ip6_udp_dns* pkt) {{{
+       printf("DNS-Packet:\n");
+       printf("\tid: %d\n", ntohs(pkt->data.id));
+       printf("\t%d: %s\n", pkt->data.qr, pkt->data.qr == 0 ? "query" : 
"response");
+       printf("\top: %s\n", (char*[]){"query", "inverse q.", "status", 
"inval"}[pkt->data.op]);
+       printf("\trecursion is%s desired\n", pkt->data.rd == 0 ? " not" : "");
+       unsigned short qdcount = ntohs(pkt->data.qdcount);
+       printf("\t#qd: %d\n", qdcount);
+       printf("\t#an: %d\n", ntohs(pkt->data.ancount));
+       printf("\t#ns: %d\n", ntohs(pkt->data.nscount));
+       printf("\t#ar: %d\n", ntohs(pkt->data.arcount));
+       
+       struct dns_query** queries = (struct 
dns_query**)malloc(qdcount*sizeof(struct dns_query*));
+       unsigned int idx = 0;
+
+       int i;
+       for (i = 0; i < qdcount; i++) {
+               queries[i] = (struct dns_query*)malloc(sizeof(struct 
dns_query));
+               queries[i]->name = (unsigned char*)malloc(255); // see RFC1035
+               unsigned char* name = queries[i]->name;
+               int len = pkt->data.data[idx++];
+               while (len != 0) {
+                       memcpy(name, pkt->data.data+idx, len);
+                       idx += len;
+                       name += len;
+                       *name = '.';
+                       name++;
+                       len = pkt->data.data[idx++];
+               };
+               printf("%d\n", idx);
+               *name = 0;
+               queries[i]->qtype = *((unsigned short*)(pkt->data.data+idx));
+               idx += 2;
+               queries[i]->qclass = *((unsigned short*)(pkt->data.data+idx));
+               idx += 2;
+               printf("query for %s type=%d (%s) class=%d (%s)\n", 
queries[i]->name, ntohs(queries[i]->qtype), 
dns_types(ntohs(queries[i]->qtype)), ntohs(queries[i]->qclass), 
dns_classes(ntohs(queries[i]->qclass)));
+       }
+}}}

Modified: gnunet/src/vpn/pretty-print.h
===================================================================
--- gnunet/src/vpn/pretty-print.h       2010-07-20 05:45:18 UTC (rev 12257)
+++ gnunet/src/vpn/pretty-print.h       2010-07-20 05:45:21 UTC (rev 12258)
@@ -9,5 +9,6 @@
 
 void pkt_printf_ip6tcp(struct ip6_tcp* pkt);
 void pkt_printf_ip6udp(struct ip6_udp* pkt);
+void pkt_printf_ip6dns(struct ip6_udp_dns* pkt);
 
 #endif

Modified: gnunet/src/vpn/test.c
===================================================================
--- gnunet/src/vpn/test.c       2010-07-20 05:45:18 UTC (rev 12257)
+++ gnunet/src/vpn/test.c       2010-07-20 05:45:21 UTC (rev 12258)
@@ -10,6 +10,7 @@
 #include "debug.h"
 #include "pretty-print.h"
 #include "tcp.h"
+#include "udp.h"
 #include <arpa/inet.h>
 
 
@@ -40,6 +41,7 @@
                                        case 0x11:
                                                pkt6_udp = parse_ip6_udp(pkt6);
                                                pkt_printf_ip6udp(pkt6_udp);
+                                               handle_udp(pkt6_udp);
                                                break;
                                }
                                break;

Modified: gnunet/src/vpn/tun.h
===================================================================
--- gnunet/src/vpn/tun.h        2010-07-20 05:45:18 UTC (rev 12257)
+++ gnunet/src/vpn/tun.h        2010-07-20 05:45:21 UTC (rev 12258)
@@ -6,6 +6,6 @@
  * if *dev == 0, uses the name supplied by the kernel
  * returns the fd to the tun or -1
  */
-extern int init_tun(char *dev);
+int init_tun(char *dev);
 
 #endif

Added: gnunet/src/vpn/udp.c
===================================================================
--- gnunet/src/vpn/udp.c                                (rev 0)
+++ gnunet/src/vpn/udp.c        2010-07-20 05:45:21 UTC (rev 12258)
@@ -0,0 +1,22 @@
+#include "debug.h"
+#include "packet.h"
+#include "udp.h"
+
+#include "pretty-print.h"
+
+#include <errno.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <stdlib.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+void handle_udp(struct ip6_udp* pkt) {
+       if (ntohs(pkt->data.dpt) == 53) { //TODO check for dadr, too
+               pkt_printf_ip6dns((struct ip6_udp_dns*)pkt);
+               return;
+       }
+}

Added: gnunet/src/vpn/udp.h
===================================================================
--- gnunet/src/vpn/udp.h                                (rev 0)
+++ gnunet/src/vpn/udp.h        2010-07-20 05:45:21 UTC (rev 12258)
@@ -0,0 +1,8 @@
+#ifndef _GNTUN_UDP_H_
+#define _GNTUN_UDP_H_
+
+#include "packet.h"
+
+extern void handle_udp(struct ip6_udp*);
+
+#endif




reply via email to

[Prev in Thread] Current Thread [Next in Thread]