diff --git a/codec.rkt b/codec.rkt index 01e0edb..e0da971 100644 --- a/codec.rkt +++ b/codec.rkt @@ -226,7 +226,8 @@ ;; DomainName -> Bitstring (define (encode-domain-name labels) - (bit-string (labels :: (t:listof (t:pascal-string "Label" 64))))) + (bit-string (labels :: (t:listof (t:pascal-string "Label" 64))) + (0 :: integer bytes 1))) ;; end of list of labels! ;; Bytes Bytes ListOf -> DomainName ;; PRECONDITION: input never empty diff --git a/test-dns.rkt b/test-dns.rkt index 01c919b..dfe3ee3 100644 --- a/test-dns.rkt +++ b/test-dns.rkt @@ -3,17 +3,30 @@ (require "api.rkt") (require "codec.rkt") +(require rackunit) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Simple request/response from the wild. +;; DNS Packets collected using tcpdump. + +;; q-google-in-any-bytes : -> Bytes +;; A query for IN ANY against google.com ;; Wed Jun 29 16:33:58 2011 (4e0b8c36): UDP: localhost sent 28 bytes: ;; 00000000: 66 3A 01 00 00 01 00 00 : 00 00 00 00 06 67 6F 6F f:...........goo ;; 00000010: 67 6C 65 03 63 6F 6D 00 : 00 FF 00 01 gle.com..... ;; 0000001C: - -(define (q-google-in-any) +(define (q-google-in-any-bytes) (bytes #x66 #x3A #x01 #x00 #x00 #x01 #x00 #x00 #x00 #x00 #x00 #x00 #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #xFF #x00 #x01)) +;; q-google-in-any : DNSMessage +;; Decoded (q-google-in-any-bytes). +(define q-google-in-any (packet->dns-message (q-google-in-any-bytes))) + +;; a-google-in-any-bytes : -> Bytes +;; The answer Google gave to (q-google-in-any), once upon a time. ;; Wed Jun 29 16:33:58 2011 (4e0b8c36): UDP: dslrouter.westell.com sent 494 bytes: ;; 00000000: 66 3A 81 80 00 01 00 0F : 00 00 00 07 06 67 6F 6F f:...........goo ;; 00000010: 67 6C 65 03 63 6F 6D 00 : 00 FF 00 01 C0 0C 00 10 gle.com......... @@ -47,8 +60,7 @@ ;; 000001D0: 00 01 00 01 00 00 00 F6 : 00 04 4A 7D 73 1B C1 20 ..........J}s.. ;; 000001E0: 00 01 00 01 00 00 00 21 : 00 04 4A 7D 4D 1B .......!..J}M. ;; 000001EE: - -(define (a-google-in-any) +(define (a-google-in-any-bytes) (bytes #x66 #x3A #x81 #x80 #x00 #x01 #x00 #x0F #x00 #x00 #x00 #x07 #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #xFF #x00 #x01 #xC0 #x0C #x00 #x10 @@ -82,11 +94,106 @@ #x00 #x01 #x00 #x01 #x00 #x00 #x00 #xF6 #x00 #x04 #x4A #x7D #x73 #x1B #xC1 #x20 #x00 #x01 #x00 #x01 #x00 #x00 #x00 #x21 #x00 #x04 #x4A #x7D #x4D #x1B)) -(require racket/pretty) -(pretty-print (packet->dns-message (q-google-in-any))) -(pretty-print (packet->dns-message (a-google-in-any))) +;; a-google-in-any : DNSMessage +;; Decoded (a-google-in-any-bytes). +(define a-google-in-any (packet->dns-message (a-google-in-any-bytes))) -(pretty-print (dns-message->packet (packet->dns-message (a-google-in-any)))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Simple codec tests + +(check-equal? q-google-in-any + (dns-message 26170 + 'request + 'query + 'non-authoritative + 'not-truncated + 'recursion-desired + 'no-recursion-available + 'no-error + (list (question '(#"google" #"com") '* 'in)) + '() + '() + '())) + +(check-equal? a-google-in-any + (dns-message + 26170 + 'response + 'query + 'non-authoritative + 'not-truncated + 'recursion-desired + 'recursion-available + 'no-error + (list (question '(#"google" #"com") '* 'in)) + (list + (rr '(#"google" #"com") 'txt 'in 3119 '(#"v=spf1 include:_netblocks.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all")) + (rr '(#"google" #"com") 'a 'in 285 '#(74 125 226 146)) + (rr '(#"google" #"com") 'a 'in 285 '#(74 125 226 148)) + (rr '(#"google" #"com") 'a 'in 285 '#(74 125 226 145)) + (rr '(#"google" #"com") 'a 'in 285 '#(74 125 226 147)) + (rr '(#"google" #"com") 'a 'in 285 '#(74 125 226 144)) + (rr '(#"google" #"com") 'ns 'in 238877 '(#"ns2" #"google" #"com")) + (rr '(#"google" #"com") 'ns 'in 238877 '(#"ns3" #"google" #"com")) + (rr '(#"google" #"com") 'ns 'in 238877 '(#"ns1" #"google" #"com")) + (rr '(#"google" #"com") 'ns 'in 238877 '(#"ns4" #"google" #"com")) + (rr '(#"google" #"com") 'mx 'in 42 (mx 20 '(#"alt1" #"aspmx" #"l" #"google" #"com"))) + (rr '(#"google" #"com") 'mx 'in 42 (mx 30 '(#"alt2" #"aspmx" #"l" #"google" #"com"))) + (rr '(#"google" #"com") 'mx 'in 42 (mx 10 '(#"aspmx" #"l" #"google" #"com"))) + (rr '(#"google" #"com") 'mx 'in 42 (mx 40 '(#"alt3" #"aspmx" #"l" #"google" #"com"))) + (rr '(#"google" #"com") 'mx 'in 42 (mx 50 '(#"alt4" #"aspmx" #"l" #"google" #"com")))) + '() + (list + (rr '(#"ns3" #"google" #"com") 'a 'in 238287 '#(216 239 36 10)) + (rr '(#"ns1" #"google" #"com") 'a 'in 238287 '#(216 239 32 10)) + (rr '(#"ns4" #"google" #"com") 'a 'in 238287 '#(216 239 38 10)) + (rr '(#"ns2" #"google" #"com") 'a 'in 238287 '#(216 239 34 10)) + (rr '(#"alt2" #"aspmx" #"l" #"google" #"com") 'a 'in 240 '#(74 125 39 27)) + (rr '(#"aspmx" #"l" #"google" #"com") 'a 'in 246 '#(74 125 115 27)) + (rr '(#"alt1" #"aspmx" #"l" #"google" #"com") 'a 'in 33 '#(74 125 77 27))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Roundtrip tests +;; +;; It's not possible IN GENERAL to test the roundtrip [encoded -> +;; decoded -> encoded], because the encoding process here doesn't use +;; the domain-name compression syntax that DNS supports (whereas most +;; DNS libraries do support it). It is, however, possible to test +;; [decoded -> encoded -> decoded], which should be a structural +;; identity. + +;; check-roundtrip-ok? : DNSMessage -> Void +;; Passes iff the decoded encoded argument is equal? to the argument. +(define (check-roundtrip-ok? decoded-message) + (check-equal? (packet->dns-message (dns-message->packet decoded-message)) + decoded-message)) + +;; check-roundtrip-ok?* : Bytes -> Void +;; Used for some packets simple enough to work with roundtripping the +;; other way. Passes iff the bytes are exactly the same after a +;; roundtrip. +(define (check-roundtrip-ok?* encoded-message) + (check-equal? (dns-message->packet (packet->dns-message encoded-message)) + encoded-message)) + +(check-roundtrip-ok?* (q-google-in-any-bytes)) +;; The following is one of the compression-using packets, which won't +;; pass a check-roundtrip-ok?* tyest: +;; (check-roundtrip-ok?* (a-google-in-any-bytes)) +(check-roundtrip-ok? q-google-in-any) +(check-roundtrip-ok? a-google-in-any) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Both decoding and roundtripping. + +;; check-body : Bytes DNSMessage -> Void +;; Passes iff both check-roundtrip-ok? and check-equal?. +(define (check-both encoded-message decoded-message) + (check-equal? (packet->dns-message encoded-message) decoded-message) + (check-roundtrip-ok? decoded-message)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; IPv6 records from the wild. ;; Wed Jun 29 20:59:17 2011 (4e0bca65): UDP: localhost sent 28 bytes: ;; 00000000: 47 16 01 00 00 01 00 00 : 00 00 00 00 06 67 6F 6F G............goo @@ -101,20 +208,42 @@ ;; 00000040: 1C 20 00 00 07 08 00 12 : 75 00 00 00 01 2C . ......u...., ;; 0000004E: -(pretty-print - (packet->dns-message - (bytes - #x47 #x16 #x01 #x00 #x00 #x01 #x00 #x00 #x00 #x00 #x00 #x00 #x06 #x67 #x6F #x6F - #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #x1C #x00 #x01))) +(check-both + (bytes + #x47 #x16 #x01 #x00 #x00 #x01 #x00 #x00 #x00 #x00 #x00 #x00 #x06 #x67 #x6F #x6F + #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #x1C #x00 #x01) + (dns-message 18198 + 'request + 'query + 'non-authoritative + 'not-truncated + 'recursion-desired + 'no-recursion-available + 'no-error + (list (question '(#"google" #"com") 'aaaa 'in)) + '() + '() + '())) -(pretty-print - (packet->dns-message - (bytes - #x47 #x16 #x81 #x80 #x00 #x01 #x00 #x00 #x00 #x01 #x00 #x00 #x06 #x67 #x6F #x6F - #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #x1C #x00 #x01 #xC0 #x0C #x00 #x06 - #x00 #x01 #x00 #x00 #x02 #x52 #x00 #x26 #x03 #x6E #x73 #x31 #xC0 #x0C #x09 #x64 - #x6E #x73 #x2D #x61 #x64 #x6D #x69 #x6E #xC0 #x0C #x00 #x16 #x33 #x23 #x00 #x00 - #x1C #x20 #x00 #x00 #x07 #x08 #x00 #x12 #x75 #x00 #x00 #x00 #x01 #x2C))) +(check-both + (bytes + #x47 #x16 #x81 #x80 #x00 #x01 #x00 #x00 #x00 #x01 #x00 #x00 #x06 #x67 #x6F #x6F + #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #x1C #x00 #x01 #xC0 #x0C #x00 #x06 + #x00 #x01 #x00 #x00 #x02 #x52 #x00 #x26 #x03 #x6E #x73 #x31 #xC0 #x0C #x09 #x64 + #x6E #x73 #x2D #x61 #x64 #x6D #x69 #x6E #xC0 #x0C #x00 #x16 #x33 #x23 #x00 #x00 + #x1C #x20 #x00 #x00 #x07 #x08 #x00 #x12 #x75 #x00 #x00 #x00 #x01 #x2C) + (dns-message 18198 + 'response + 'query + 'non-authoritative + 'not-truncated + 'recursion-desired + 'recursion-available + 'no-error + (list (question '(#"google" #"com") 'aaaa 'in)) + '() + (list (rr '(#"google" #"com") 'soa 'in 594 (soa '(#"ns1" #"google" #"com") '(#"dns-admin" #"google" #"com") 1454883 7200 1800 1209600 300))) + '())) ;; Wed Jun 29 21:05:03 2011 (4e0bcbbf): UDP: localhost sent 32 bytes: ;; 00000000: 12 70 01 00 00 01 00 00 : 00 00 00 00 03 77 77 77 .p...........www @@ -128,19 +257,41 @@ ;; 00000030: 01 6C C0 10 : .l.. ;; 00000034: -(pretty-print - (packet->dns-message - (bytes - #x12 #x70 #x01 #x00 #x00 #x01 #x00 #x00 #x00 #x00 #x00 #x00 #x03 #x77 #x77 #x77 - #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #x1C #x00 #x01))) +(check-both + (bytes + #x12 #x70 #x01 #x00 #x00 #x01 #x00 #x00 #x00 #x00 #x00 #x00 #x03 #x77 #x77 #x77 + #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #x1C #x00 #x01) + (dns-message 4720 + 'request + 'query + 'non-authoritative + 'not-truncated + 'recursion-desired + 'no-recursion-available + 'no-error + (list (question '(#"www" #"google" #"com") 'aaaa 'in)) + '() + '() + '())) -(pretty-print - (packet->dns-message - (bytes - #x12 #x70 #x85 #x00 #x00 #x01 #x00 #x01 #x00 #x00 #x00 #x00 #x03 #x77 #x77 #x77 - #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #x1C #x00 #x01 - #xC0 #x0C #x00 #x05 #x00 #x01 #x00 #x09 #x3A #x80 #x00 #x08 #x03 #x77 #x77 #x77 - #x01 #x6C #xC0 #x10))) +(check-both + (bytes + #x12 #x70 #x85 #x00 #x00 #x01 #x00 #x01 #x00 #x00 #x00 #x00 #x03 #x77 #x77 #x77 + #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #x1C #x00 #x01 + #xC0 #x0C #x00 #x05 #x00 #x01 #x00 #x09 #x3A #x80 #x00 #x08 #x03 #x77 #x77 #x77 + #x01 #x6C #xC0 #x10) + (dns-message 4720 + 'response + 'query + 'authoritative + 'not-truncated + 'recursion-desired + 'no-recursion-available + 'no-error + (list (question '(#"www" #"google" #"com") 'aaaa 'in)) + (list (rr '(#"www" #"google" #"com") 'cname 'in 604800 '(#"www" #"l" #"google" #"com"))) + '() + '())) ;; Wed Jun 29 21:07:46 2011 (4e0bcc62): UDP: ns1.google.com sent 82 bytes: ;; 00000000: 23 79 85 00 00 01 00 02 : 00 00 00 00 04 69 70 76 #y...........ipv @@ -151,26 +302,30 @@ ;; 00000050: 00 68 : .h ;; 00000052: -(pretty-print - (packet->dns-message - (bytes - #x23 #x79 #x85 #x00 #x00 #x01 #x00 #x02 #x00 #x00 #x00 #x00 #x04 #x69 #x70 #x76 - #x36 #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #x1C #x00 - #x01 #xC0 #x0C #x00 #x05 #x00 #x01 #x00 #x09 #x3A #x80 #x00 #x09 #x04 #x69 #x70 - #x76 #x36 #x01 #x6C #xC0 #x11 #xC0 #x2D #x00 #x1C #x00 #x01 #x00 #x00 #x01 #x2C - #x00 #x10 #x20 #x01 #x48 #x60 #x80 #x0F #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 - #x00 #x68))) +(check-both + (bytes + #x23 #x79 #x85 #x00 #x00 #x01 #x00 #x02 #x00 #x00 #x00 #x00 #x04 #x69 #x70 #x76 + #x36 #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #x1C #x00 + #x01 #xC0 #x0C #x00 #x05 #x00 #x01 #x00 #x09 #x3A #x80 #x00 #x09 #x04 #x69 #x70 + #x76 #x36 #x01 #x6C #xC0 #x11 #xC0 #x2D #x00 #x1C #x00 #x01 #x00 #x00 #x01 #x2C + #x00 #x10 #x20 #x01 #x48 #x60 #x80 #x0F #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 + #x00 #x68) + (dns-message 9081 + 'response + 'query + 'authoritative + 'not-truncated + 'recursion-desired + 'no-recursion-available + 'no-error + (list (question '(#"ipv6" #"google" #"com") 'aaaa 'in)) + (list (rr '(#"ipv6" #"google" #"com") 'cname 'in 604800 '(#"ipv6" #"l" #"google" #"com")) + (rr '(#"ipv6" #"l" #"google" #"com") 'aaaa 'in 300 '#(32 1 72 96 128 15 0 0 0 0 0 0 0 0 0 104))) + '() + '())) -(pretty-print - (dns-message->packet - (packet->dns-message - (bytes - #x23 #x79 #x85 #x00 #x00 #x01 #x00 #x02 #x00 #x00 #x00 #x00 #x04 #x69 #x70 #x76 - #x36 #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #x1C #x00 - #x01 #xC0 #x0C #x00 #x05 #x00 #x01 #x00 #x09 #x3A #x80 #x00 #x09 #x04 #x69 #x70 - #x76 #x36 #x01 #x6C #xC0 #x11 #xC0 #x2D #x00 #x1C #x00 #x01 #x00 #x00 #x01 #x2C - #x00 #x10 #x20 #x01 #x48 #x60 #x80 #x0F #x00 #x00 #x00 #x00 #x00 #x00 #x00 #x00 - #x00 #x68)))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; SRV records from the wild. ;; Thu Jun 30 15:12:45 2011 (4e0ccaad): UDP: asgard.ccs.neu.edu sent 486 bytes: ;; 00000000: 13 CA 81 80 00 01 00 05 : 00 04 00 09 0C 5F 78 6D ............._xm @@ -213,37 +368,64 @@ ;;_xmpp-server._tcp.google.com. 900 IN SRV 20 0 5269 xmpp-server3.l.google.com. ;;_xmpp-server._tcp.google.com. 900 IN SRV 20 0 5269 xmpp-server4.l.google.com. -(pretty-print - (packet->dns-message - (bytes - #x13 #xCA #x81 #x80 #x00 #x01 #x00 #x05 #x00 #x04 #x00 #x09 #x0C #x5F #x78 #x6D - #x70 #x70 #x2D #x73 #x65 #x72 #x76 #x65 #x72 #x04 #x5F #x74 #x63 #x70 #x06 #x67 - #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #x21 #x00 #x01 #xC0 #x0C - #x00 #x21 #x00 #x01 #x00 #x00 #x03 #x72 #x00 #x21 #x00 #x14 #x00 #x00 #x14 #x95 - #x0C #x78 #x6D #x70 #x70 #x2D #x73 #x65 #x72 #x76 #x65 #x72 #x34 #x01 #x6C #x06 - #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #xC0 #x0C #x00 #x21 #x00 - #x01 #x00 #x00 #x03 #x72 #x00 #x20 #x00 #x05 #x00 #x00 #x14 #x95 #x0B #x78 #x6D - #x70 #x70 #x2D #x73 #x65 #x72 #x76 #x65 #x72 #x01 #x6C #x06 #x67 #x6F #x6F #x67 - #x6C #x65 #x03 #x63 #x6F #x6D #x00 #xC0 #x0C #x00 #x21 #x00 #x01 #x00 #x00 #x03 - #x72 #x00 #x21 #x00 #x14 #x00 #x00 #x14 #x95 #x0C #x78 #x6D #x70 #x70 #x2D #x73 - #x65 #x72 #x76 #x65 #x72 #x31 #x01 #x6C #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 - #x63 #x6F #x6D #x00 #xC0 #x0C #x00 #x21 #x00 #x01 #x00 #x00 #x03 #x72 #x00 #x21 - #x00 #x14 #x00 #x00 #x14 #x95 #x0C #x78 #x6D #x70 #x70 #x2D #x73 #x65 #x72 #x76 - #x65 #x72 #x32 #x01 #x6C #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D - #x00 #xC0 #x0C #x00 #x21 #x00 #x01 #x00 #x00 #x03 #x72 #x00 #x21 #x00 #x14 #x00 - #x00 #x14 #x95 #x0C #x78 #x6D #x70 #x70 #x2D #x73 #x65 #x72 #x76 #x65 #x72 #x33 - #x01 #x6C #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #xC1 #x02 - #x00 #x02 #x00 #x01 #x00 #x01 #x54 #x24 #x00 #x06 #x03 #x6E #x73 #x33 #xC1 #x02 - #xC1 #x02 #x00 #x02 #x00 #x01 #x00 #x01 #x54 #x24 #x00 #x06 #x03 #x6E #x73 #x34 - #xC1 #x02 #xC1 #x02 #x00 #x02 #x00 #x01 #x00 #x01 #x54 #x24 #x00 #x06 #x03 #x6E - #x73 #x32 #xC1 #x02 #xC1 #x02 #x00 #x02 #x00 #x01 #x00 #x01 #x54 #x24 #x00 #x06 - #x03 #x6E #x73 #x31 #xC1 #x02 #xC0 #x6D #x00 #x01 #x00 #x01 #x00 #x00 #x01 #x1A - #x00 #x04 #x4A #x7D #x99 #x7D #xC0 #x99 #x00 #x01 #x00 #x01 #x00 #x00 #x06 #xF6 - #x00 #x04 #x4A #x7D #x35 #x7D #xC0 #xC6 #x00 #x01 #x00 #x01 #x00 #x00 #x06 #xF6 - #x00 #x04 #x4A #x7D #x2F #x7D #xC0 #xF3 #x00 #x01 #x00 #x01 #x00 #x00 #x06 #xF6 - #x00 #x04 #x4A #x7D #x2D #x7D #xC0 #x40 #x00 #x01 #x00 #x01 #x00 #x00 #x06 #xF6 - #x00 #x04 #x4A #x7D #x2D #x7D #xC1 #x50 #x00 #x01 #x00 #x01 #x00 #x00 #x0A #xB1 - #x00 #x04 #xD8 #xEF #x20 #x0A #xC1 #x3E #x00 #x01 #x00 #x01 #x00 #x00 #x0A #xB1 - #x00 #x04 #xD8 #xEF #x22 #x0A #xC1 #x1A #x00 #x01 #x00 #x01 #x00 #x00 #x0A #xB1 - #x00 #x04 #xD8 #xEF #x24 #x0A #xC1 #x2C #x00 #x01 #x00 #x01 #x00 #x00 #x0A #xB1 - #x00 #x04 #xD8 #xEF #x26 #x0A))) +(check-both + (bytes + #x13 #xCA #x81 #x80 #x00 #x01 #x00 #x05 #x00 #x04 #x00 #x09 #x0C #x5F #x78 #x6D + #x70 #x70 #x2D #x73 #x65 #x72 #x76 #x65 #x72 #x04 #x5F #x74 #x63 #x70 #x06 #x67 + #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #x00 #x21 #x00 #x01 #xC0 #x0C + #x00 #x21 #x00 #x01 #x00 #x00 #x03 #x72 #x00 #x21 #x00 #x14 #x00 #x00 #x14 #x95 + #x0C #x78 #x6D #x70 #x70 #x2D #x73 #x65 #x72 #x76 #x65 #x72 #x34 #x01 #x6C #x06 + #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #xC0 #x0C #x00 #x21 #x00 + #x01 #x00 #x00 #x03 #x72 #x00 #x20 #x00 #x05 #x00 #x00 #x14 #x95 #x0B #x78 #x6D + #x70 #x70 #x2D #x73 #x65 #x72 #x76 #x65 #x72 #x01 #x6C #x06 #x67 #x6F #x6F #x67 + #x6C #x65 #x03 #x63 #x6F #x6D #x00 #xC0 #x0C #x00 #x21 #x00 #x01 #x00 #x00 #x03 + #x72 #x00 #x21 #x00 #x14 #x00 #x00 #x14 #x95 #x0C #x78 #x6D #x70 #x70 #x2D #x73 + #x65 #x72 #x76 #x65 #x72 #x31 #x01 #x6C #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 + #x63 #x6F #x6D #x00 #xC0 #x0C #x00 #x21 #x00 #x01 #x00 #x00 #x03 #x72 #x00 #x21 + #x00 #x14 #x00 #x00 #x14 #x95 #x0C #x78 #x6D #x70 #x70 #x2D #x73 #x65 #x72 #x76 + #x65 #x72 #x32 #x01 #x6C #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D + #x00 #xC0 #x0C #x00 #x21 #x00 #x01 #x00 #x00 #x03 #x72 #x00 #x21 #x00 #x14 #x00 + #x00 #x14 #x95 #x0C #x78 #x6D #x70 #x70 #x2D #x73 #x65 #x72 #x76 #x65 #x72 #x33 + #x01 #x6C #x06 #x67 #x6F #x6F #x67 #x6C #x65 #x03 #x63 #x6F #x6D #x00 #xC1 #x02 + #x00 #x02 #x00 #x01 #x00 #x01 #x54 #x24 #x00 #x06 #x03 #x6E #x73 #x33 #xC1 #x02 + #xC1 #x02 #x00 #x02 #x00 #x01 #x00 #x01 #x54 #x24 #x00 #x06 #x03 #x6E #x73 #x34 + #xC1 #x02 #xC1 #x02 #x00 #x02 #x00 #x01 #x00 #x01 #x54 #x24 #x00 #x06 #x03 #x6E + #x73 #x32 #xC1 #x02 #xC1 #x02 #x00 #x02 #x00 #x01 #x00 #x01 #x54 #x24 #x00 #x06 + #x03 #x6E #x73 #x31 #xC1 #x02 #xC0 #x6D #x00 #x01 #x00 #x01 #x00 #x00 #x01 #x1A + #x00 #x04 #x4A #x7D #x99 #x7D #xC0 #x99 #x00 #x01 #x00 #x01 #x00 #x00 #x06 #xF6 + #x00 #x04 #x4A #x7D #x35 #x7D #xC0 #xC6 #x00 #x01 #x00 #x01 #x00 #x00 #x06 #xF6 + #x00 #x04 #x4A #x7D #x2F #x7D #xC0 #xF3 #x00 #x01 #x00 #x01 #x00 #x00 #x06 #xF6 + #x00 #x04 #x4A #x7D #x2D #x7D #xC0 #x40 #x00 #x01 #x00 #x01 #x00 #x00 #x06 #xF6 + #x00 #x04 #x4A #x7D #x2D #x7D #xC1 #x50 #x00 #x01 #x00 #x01 #x00 #x00 #x0A #xB1 + #x00 #x04 #xD8 #xEF #x20 #x0A #xC1 #x3E #x00 #x01 #x00 #x01 #x00 #x00 #x0A #xB1 + #x00 #x04 #xD8 #xEF #x22 #x0A #xC1 #x1A #x00 #x01 #x00 #x01 #x00 #x00 #x0A #xB1 + #x00 #x04 #xD8 #xEF #x24 #x0A #xC1 #x2C #x00 #x01 #x00 #x01 #x00 #x00 #x0A #xB1 + #x00 #x04 #xD8 #xEF #x26 #x0A) + (let ((X '(#"_xmpp-server" #"_tcp" #"google" #"com"))) + (dns-message 5066 + 'response + 'query + 'non-authoritative + 'not-truncated + 'recursion-desired + 'recursion-available + 'no-error + (list (question X 'srv 'in)) + (list (rr X 'srv 'in 882 (srv 20 0 5269 '(#"xmpp-server4" #"l" #"google" #"com"))) + (rr X 'srv 'in 882 (srv 5 0 5269 '(#"xmpp-server" #"l" #"google" #"com"))) + (rr X 'srv 'in 882 (srv 20 0 5269 '(#"xmpp-server1" #"l" #"google" #"com"))) + (rr X 'srv 'in 882 (srv 20 0 5269 '(#"xmpp-server2" #"l" #"google" #"com"))) + (rr X 'srv 'in 882 (srv 20 0 5269 '(#"xmpp-server3" #"l" #"google" #"com")))) + (list (rr '(#"google" #"com") 'ns 'in 87076 '(#"ns3" #"google" #"com")) + (rr '(#"google" #"com") 'ns 'in 87076 '(#"ns4" #"google" #"com")) + (rr '(#"google" #"com") 'ns 'in 87076 '(#"ns2" #"google" #"com")) + (rr '(#"google" #"com") 'ns 'in 87076 '(#"ns1" #"google" #"com"))) + (list (rr '(#"xmpp-server" #"l" #"google" #"com") 'a 'in 282 '#(74 125 153 125)) + (rr '(#"xmpp-server1" #"l" #"google" #"com") 'a 'in 1782 '#(74 125 53 125)) + (rr '(#"xmpp-server2" #"l" #"google" #"com") 'a 'in 1782 '#(74 125 47 125)) + (rr '(#"xmpp-server3" #"l" #"google" #"com") 'a 'in 1782 '#(74 125 45 125)) + (rr '(#"xmpp-server4" #"l" #"google" #"com") 'a 'in 1782 '#(74 125 45 125)) + (rr '(#"ns1" #"google" #"com") 'a 'in 2737 '#(216 239 32 10)) + (rr '(#"ns2" #"google" #"com") 'a 'in 2737 '#(216 239 34 10)) + (rr '(#"ns3" #"google" #"com") 'a 'in 2737 '#(216 239 36 10)) + (rr '(#"ns4" #"google" #"com") 'a 'in 2737 '#(216 239 38 10))))))