| 1 | #include "idl_types.h" | 
|---|
| 2 |  | 
|---|
| 3 | /* | 
|---|
| 4 | IDL structures for DNS operations | 
|---|
| 5 |  | 
|---|
| 6 | DNS is not traditionally encoded using IDL/NDR. This is a bit of an | 
|---|
| 7 | experiment, and I may well switch us back to a more traditional | 
|---|
| 8 | encoding if it doesn't work out | 
|---|
| 9 | */ | 
|---|
| 10 |  | 
|---|
| 11 | import "misc.idl"; | 
|---|
| 12 | [ | 
|---|
| 13 | helper("librpc/ndr/ndr_dns.h"), | 
|---|
| 14 | helpstring("DNS records"), | 
|---|
| 15 | version(0.0), | 
|---|
| 16 | uuid("a047c001-5f22-40b0-9d52-7042c43f711a") | 
|---|
| 17 | ] | 
|---|
| 18 | interface dns | 
|---|
| 19 | { | 
|---|
| 20 | const int DNS_SERVICE_PORT       = 53; | 
|---|
| 21 |  | 
|---|
| 22 | typedef [public,bitmap16bit] bitmap { | 
|---|
| 23 | DNS_RCODE                   = 0x000F, | 
|---|
| 24 | DNS_FLAG_BROADCAST          = 0x0010, | 
|---|
| 25 | DNS_FLAG_RECURSION_AVAIL    = 0x0080, | 
|---|
| 26 | DNS_FLAG_RECURSION_DESIRED  = 0x0100, | 
|---|
| 27 | DNS_FLAG_TRUNCATION         = 0x0200, | 
|---|
| 28 | DNS_FLAG_AUTHORITATIVE      = 0x0400, | 
|---|
| 29 | DNS_OPCODE                  = 0x7800, | 
|---|
| 30 | DNS_FLAG_REPLY              = 0x8000 | 
|---|
| 31 | } dns_operation; | 
|---|
| 32 |  | 
|---|
| 33 | /* the opcodes are in the operation field, masked with | 
|---|
| 34 | DNS_OPCODE */ | 
|---|
| 35 | typedef [public] enum { | 
|---|
| 36 | DNS_OPCODE_QUERY          =  (0x0<<11), | 
|---|
| 37 | DNS_OPCODE_IQUERY         =  (0x1<<11), | 
|---|
| 38 | DNS_OPCODE_STATUS         =  (0x2<<11), | 
|---|
| 39 | DNS_OPCODE_REGISTER       =  (0x5<<11), | 
|---|
| 40 | DNS_OPCODE_RELEASE        =  (0x6<<11), | 
|---|
| 41 | DNS_OPCODE_WACK           =  (0x7<<11), | 
|---|
| 42 | DNS_OPCODE_REFRESH        =  (0x8<<11), | 
|---|
| 43 | DNS_OPCODE_REFRESH2       =  (0x9<<11), | 
|---|
| 44 | DNS_OPCODE_MULTI_HOME_REG =  (0xf<<11) | 
|---|
| 45 | } dns_opcode; | 
|---|
| 46 |  | 
|---|
| 47 | /* rcode values */ | 
|---|
| 48 | typedef [public] enum { | 
|---|
| 49 | DNS_RCODE_OK       = 0x0, | 
|---|
| 50 | DNS_RCODE_FORMERR  = 0x1, | 
|---|
| 51 | DNS_RCODE_SERVFAIL = 0x2, | 
|---|
| 52 | DNS_RCODE_NXDOMAIN = 0x3, | 
|---|
| 53 | DNS_RCODE_NOTIMP   = 0x4, | 
|---|
| 54 | DNS_RCODE_REFUSED  = 0x5, | 
|---|
| 55 | DNS_RCODE_YXDOMAIN = 0x6, | 
|---|
| 56 | DNS_RCODE_YXRRSET  = 0x7, | 
|---|
| 57 | DNS_RCODE_NXRRSET  = 0x8, | 
|---|
| 58 | DNS_RCODE_NOTAUTH  = 0x9, | 
|---|
| 59 | DNS_RCODE_NOTZONE  = 0xA | 
|---|
| 60 | } dns_rcode; | 
|---|
| 61 |  | 
|---|
| 62 | typedef [public,enum16bit] enum { | 
|---|
| 63 | DNS_QCLASS_IP   = 0x0001, | 
|---|
| 64 | DNS_QCLASS_NONE = 0x00FE, | 
|---|
| 65 | DNS_QCLASS_ANY  = 0x00FF | 
|---|
| 66 | } dns_qclass; | 
|---|
| 67 |  | 
|---|
| 68 | /* These vese values could have been merged with NBT_QTYPE values, but | 
|---|
| 69 | DNS_QTYPE_SRV and NBT_QTYPE_STATUS have the same numeric value. */ | 
|---|
| 70 | typedef [public,enum16bit] enum { | 
|---|
| 71 | DNS_QTYPE_ZERO   = 0x0000, | 
|---|
| 72 | DNS_QTYPE_A      = 0x0001, | 
|---|
| 73 | DNS_QTYPE_NS     = 0x0002, | 
|---|
| 74 | DNS_QTYPE_MD     = 0x0003, | 
|---|
| 75 | DNS_QTYPE_MF     = 0x0004, | 
|---|
| 76 | DNS_QTYPE_CNAME  = 0x0005, | 
|---|
| 77 | DNS_QTYPE_SOA    = 0x0006, | 
|---|
| 78 | DNS_QTYPE_MB     = 0x0007, | 
|---|
| 79 | DNS_QTYPE_MG     = 0x0008, | 
|---|
| 80 | DNS_QTYPE_MR     = 0x0009, | 
|---|
| 81 | DNS_QTYPE_NULL   = 0x000A, | 
|---|
| 82 | DNS_QTYPE_WKS    = 0x000B, | 
|---|
| 83 | DNS_QTYPE_PTR    = 0x000C, | 
|---|
| 84 | DNS_QTYPE_HINFO  = 0x000D, | 
|---|
| 85 | DNS_QTYPE_MINFO  = 0x000E, | 
|---|
| 86 | DNS_QTYPE_MX     = 0x000F, | 
|---|
| 87 | DNS_QTYPE_TXT    = 0x0010, | 
|---|
| 88 | DNS_QTYPE_RP     = 0x0011, | 
|---|
| 89 | DNS_QTYPE_AFSDB  = 0x0012, | 
|---|
| 90 | DNS_QTYPE_X25    = 0x0013, | 
|---|
| 91 | DNS_QTYPE_ISDN   = 0x0014, | 
|---|
| 92 | DNS_QTYPE_RT     = 0x0015, | 
|---|
| 93 | DNS_QTYPE_SIG    = 0x0018, | 
|---|
| 94 | DNS_QTYPE_KEY    = 0x0019, | 
|---|
| 95 | DNS_QTYPE_AAAA   = 0x001C, | 
|---|
| 96 | DNS_QTYPE_LOC    = 0x001D, | 
|---|
| 97 | DNS_QTYPE_NXT    = 0x001E, | 
|---|
| 98 | DNS_QTYPE_NETBIOS= 0x0020, | 
|---|
| 99 | DNS_QTYPE_SRV    = 0x0021, | 
|---|
| 100 | DNS_QTYPE_ATMA   = 0x0022, | 
|---|
| 101 | DNS_QTYPE_NAPTR  = 0x0023, | 
|---|
| 102 | DNS_QTYPE_DNAME  = 0x0027, | 
|---|
| 103 | DNS_QTYPE_DS     = 0x002B, | 
|---|
| 104 | DNS_QTYPE_RRSIG  = 0x002E, | 
|---|
| 105 | DNS_QTYPE_NSEC   = 0x002F, | 
|---|
| 106 | DNS_QTYPE_DNSKEY = 0x0030, | 
|---|
| 107 | DNS_QTYPE_DHCID  = 0x0031, | 
|---|
| 108 | DNS_QTYPE_ALL    = 0x00FF, | 
|---|
| 109 | DNS_QTYPE_WINS   = 0xFF01, | 
|---|
| 110 | DNS_QTYPE_WINSR  = 0xFF02 | 
|---|
| 111 | } dns_qtype; | 
|---|
| 112 |  | 
|---|
| 113 | typedef [public] struct { | 
|---|
| 114 | dns_string name; | 
|---|
| 115 | dns_qtype  question_type; | 
|---|
| 116 | dns_qclass question_class; | 
|---|
| 117 | } dns_name_question; | 
|---|
| 118 |  | 
|---|
| 119 | typedef [public] struct { | 
|---|
| 120 | uint16 length; | 
|---|
| 121 | uint8  data[length]; | 
|---|
| 122 | } dns_rdata_data; | 
|---|
| 123 |  | 
|---|
| 124 | typedef struct { | 
|---|
| 125 | dns_string mname; | 
|---|
| 126 | dns_string rname; | 
|---|
| 127 | uint32     serial; | 
|---|
| 128 | uint32     refresh; | 
|---|
| 129 | uint32     retry; | 
|---|
| 130 | uint32     expire; | 
|---|
| 131 | uint32     minimum; | 
|---|
| 132 | } dns_soa_record; | 
|---|
| 133 |  | 
|---|
| 134 | typedef [public] struct { | 
|---|
| 135 | uint16     priority; | 
|---|
| 136 | uint16     weight; | 
|---|
| 137 | uint16     port; | 
|---|
| 138 | dns_string target; | 
|---|
| 139 | } dns_srv_record; | 
|---|
| 140 |  | 
|---|
| 141 | typedef [public] struct { | 
|---|
| 142 | uint16     preference; | 
|---|
| 143 | dns_string exchange; | 
|---|
| 144 | } dns_mx_record; | 
|---|
| 145 |  | 
|---|
| 146 | typedef [nodiscriminant,public,flag(NDR_NOALIGN)] union { | 
|---|
| 147 | [case(DNS_QTYPE_A)]     ipv4address      ipv4_record; | 
|---|
| 148 | [case(DNS_QTYPE_NS)]    dns_string       ns_record; | 
|---|
| 149 | [case(DNS_QTYPE_CNAME)] dns_string       cname_record; | 
|---|
| 150 | [case(DNS_QTYPE_SOA)]   dns_soa_record   soa_record; | 
|---|
| 151 | [case(DNS_QTYPE_PTR)]   dns_string       ptr_record; | 
|---|
| 152 | [case(DNS_QTYPE_MX)]    dns_mx_record    mx_record; | 
|---|
| 153 | [case(DNS_QTYPE_AAAA)]  ipv6address      ipv6_record; | 
|---|
| 154 | [case(DNS_QTYPE_SRV)]   dns_srv_record   srv_record; | 
|---|
| 155 | [default]; | 
|---|
| 156 | } dns_rdata; | 
|---|
| 157 |  | 
|---|
| 158 | typedef [flag(LIBNDR_PRINT_ARRAY_HEX|NDR_NOALIGN),nopush,nopull] struct { | 
|---|
| 159 | dns_string name; | 
|---|
| 160 | dns_qtype  rr_type; | 
|---|
| 161 | dns_qclass rr_class; | 
|---|
| 162 | uint32     ttl; | 
|---|
| 163 | uint16     length; /* Should be set to either UINT16_MAX or 0 */ | 
|---|
| 164 | [switch_is(rr_type)] dns_rdata rdata; | 
|---|
| 165 | DATA_BLOB  unexpected; | 
|---|
| 166 | } dns_res_rec; | 
|---|
| 167 |  | 
|---|
| 168 | typedef [flag(NDR_NOALIGN|NDR_BIG_ENDIAN|NDR_PAHEX),public] struct { | 
|---|
| 169 | uint16            id; | 
|---|
| 170 | dns_operation     operation; | 
|---|
| 171 | uint16            qdcount; | 
|---|
| 172 | uint16            ancount; | 
|---|
| 173 | uint16            nscount; | 
|---|
| 174 | uint16            arcount; | 
|---|
| 175 | dns_name_question questions[qdcount]; | 
|---|
| 176 | dns_res_rec       answers[ancount]; | 
|---|
| 177 | dns_res_rec       nsrecs[nscount]; | 
|---|
| 178 | dns_res_rec       additional[arcount]; | 
|---|
| 179 | } dns_name_packet; | 
|---|
| 180 |  | 
|---|
| 181 | /* | 
|---|
| 182 | this is a convenience hook for ndrdump | 
|---|
| 183 | */ | 
|---|
| 184 | void decode_dns_name_packet( | 
|---|
| 185 | [in] dns_name_packet packet | 
|---|
| 186 | ); | 
|---|
| 187 | } | 
|---|