Home | History | Annotate | Download | only in gpxe
      1 #ifndef _GPXE_DNS_H
      2 #define _GPXE_DNS_H
      3 
      4 /** @file
      5  *
      6  * DNS protocol
      7  *
      8  */
      9 
     10 FILE_LICENCE ( GPL2_OR_LATER );
     11 
     12 #include <stdint.h>
     13 #include <gpxe/in.h>
     14 
     15 /*
     16  * Constants
     17  *
     18  */
     19 
     20 #define DNS_TYPE_A		1
     21 #define DNS_TYPE_CNAME		5
     22 #define DNS_TYPE_ANY		255
     23 
     24 #define DNS_CLASS_IN		1
     25 #define DNS_CLASS_CS		2
     26 #define DNS_CLASS_CH		3
     27 #define DNS_CLASS_HS		4
     28 
     29 #define DNS_FLAG_QUERY		( 0x00 << 15 )
     30 #define DNS_FLAG_RESPONSE	( 0x01 << 15 )
     31 #define DNS_FLAG_QR(flags)	( (flags) & ( 0x01 << 15 ) )
     32 #define DNS_FLAG_OPCODE_QUERY	( 0x00 << 11 )
     33 #define DNS_FLAG_OPCODE_IQUERY	( 0x01 << 11 )
     34 #define DNS_FLAG_OPCODE_STATUS	( 0x02 << 11 )
     35 #define DNS_FLAG_OPCODE(flags)	( (flags) & ( 0x0f << 11 ) )
     36 #define DNS_FLAG_RD		( 0x01 << 8 )
     37 #define DNS_FLAG_RA		( 0x01 << 7 )
     38 #define DNS_FLAG_RCODE_OK	( 0x00 << 0 )
     39 #define DNS_FLAG_RCODE_NX	( 0x03 << 0 )
     40 #define DNS_FLAG_RCODE(flags)	( (flags) & ( 0x0f << 0 ) )
     41 
     42 #define	DNS_PORT		53
     43 #define	DNS_MAX_RETRIES		3
     44 #define	DNS_MAX_CNAME_RECURSION	0x30
     45 
     46 /*
     47  * DNS protocol structures
     48  *
     49  */
     50 struct dns_header {
     51 	uint16_t	id;
     52 	uint16_t	flags;
     53 	uint16_t	qdcount;
     54 	uint16_t	ancount;
     55 	uint16_t	nscount;
     56 	uint16_t	arcount;
     57 } __attribute__ (( packed ));
     58 
     59 struct dns_query_info {
     60 	uint16_t	qtype;
     61 	uint16_t	qclass;
     62 } __attribute__ (( packed ));
     63 
     64 struct dns_query {
     65 	struct dns_header dns;
     66 	char		payload[ 256 + sizeof ( struct dns_query_info ) ];
     67 } __attribute__ (( packed ));
     68 
     69 struct dns_rr_info_common {
     70 	uint16_t	type;
     71 	uint16_t	class;
     72 	uint32_t	ttl;
     73 	uint16_t	rdlength;
     74 } __attribute__ (( packed ));
     75 
     76 struct dns_rr_info_a {
     77 	struct dns_rr_info_common common;
     78 	struct in_addr in_addr;
     79 } __attribute__ (( packed ));
     80 
     81 struct dns_rr_info_cname {
     82 	struct dns_rr_info_common common;
     83 	char cname[0];
     84 } __attribute__ (( packed ));
     85 
     86 union dns_rr_info {
     87 	struct dns_rr_info_common common;
     88 	struct dns_rr_info_a a;
     89 	struct dns_rr_info_cname cname;
     90 };
     91 
     92 #endif /* _GPXE_DNS_H */
     93