chiark / gitweb /
WIP dns packet en/decoding test program
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 21 Jul 2011 19:02:39 +0000 (20:02 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 27 Aug 2011 15:44:04 +0000 (16:44 +0100)
dns-bitenc-test.c [new file with mode: 0644]

diff --git a/dns-bitenc-test.c b/dns-bitenc-test.c
new file mode 100644 (file)
index 0000000..5d09cfb
--- /dev/null
@@ -0,0 +1,65 @@
+#define NMYLABELS 3
+static const char *const mylabels[NMYLABELS]={"z","example","com"};
+static const char prefix[]="PREFIX ";
+static const char suffix[]=" SUFFIX";
+static uint8_t packet[100];
+
+static struct dnsbitenc enc;
+
+int main(int argc, const char **argv) {
+    const char **argv_save=
+    memcpy(packet+sizeof(packet)-sizeof(suffix), suffix, sizeof(suffix));
+    dnsbitenc_start(&enc, packet+sizeof(prefix),
+                   sizeof(packet)-sizeof(prefix)-sizeof(suffix));
+    for (;;) {
+       const char *arg = *++argv;
+       if (!strcmp(arg,"b")) {
+           uint32_t val=strtoul(*++argv,0,0);
+           int bits=atoi(*++argv);
+           dnsbitenc_addbits(&enc,val,bits);
+       } else if (!strcmp(arg,"w")) {
+           uint32_t val=strtoul(*++argv,0,0);
+           dnsbitenc_addu32(&enc,val);
+       } else if (!strcmp(arg,"r")) {
+           const char *rest=*++argv;
+           int l=strlen(rest);
+           int nofit=dnsbitenc_restbytes(&enc,rest,l);
+           printf("FIT %.*s|%.*s\n",l-nofit,rest,nofit,rest+l-nofit);
+           break;
+       } else {
+           abort();
+       }
+    }
+    const uint8_t *encoded=dnsbitenc_getresult(&enc);
+    const uint8_t *pktbegin=encoded-sizeof(prefix);
+    memcpy(pktbegin,prefix,sizeof(prefix));
+
+    const uint8_t *pr;
+    for (pr=pktbegin; pr<packet+sizeof(packet); pr++)
+       printf("%02x",*pr);
+    printf("\n");
+
+    uint8_t domainend;
+    int r=dnsbitdec_start(&dec, pktbegin, packet+sizeof(packet),
+                         pktbegin+sizeof(prefix), NMYLABELS,mylabels,
+                         &domainend);
+    if (r) {
+       printf("DEC ERROR %d\n",r);
+       return 0;
+    }
+    argv=argv_save;
+    for (;;) {
+       const char *arg = *++argv;
+       if (!strcmp(arg,"b")) {
+           ++argv;
+           int bits=atoi(*++argv);
+           uint32_t 
+
+           if (nofit)
+               
+           } else 
+
+       const int c0=*arg++;
+       switch (c0) {
+       case 'b':
+