176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _GPXE_DNS_H 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _GPXE_DNS_H 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @file 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * DNS protocol 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( GPL2_OR_LATER ); 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h> 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/in.h> 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Constants 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_TYPE_A 1 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_TYPE_CNAME 5 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_TYPE_ANY 255 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_CLASS_IN 1 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_CLASS_CS 2 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_CLASS_CH 3 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_CLASS_HS 4 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_FLAG_QUERY ( 0x00 << 15 ) 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_FLAG_RESPONSE ( 0x01 << 15 ) 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_FLAG_QR(flags) ( (flags) & ( 0x01 << 15 ) ) 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_FLAG_OPCODE_QUERY ( 0x00 << 11 ) 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_FLAG_OPCODE_IQUERY ( 0x01 << 11 ) 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_FLAG_OPCODE_STATUS ( 0x02 << 11 ) 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_FLAG_OPCODE(flags) ( (flags) & ( 0x0f << 11 ) ) 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_FLAG_RD ( 0x01 << 8 ) 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_FLAG_RA ( 0x01 << 7 ) 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_FLAG_RCODE_OK ( 0x00 << 0 ) 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_FLAG_RCODE_NX ( 0x03 << 0 ) 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_FLAG_RCODE(flags) ( (flags) & ( 0x0f << 0 ) ) 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_PORT 53 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_MAX_RETRIES 3 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define DNS_MAX_CNAME_RECURSION 0x30 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * DNS protocol structures 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct dns_header { 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t id; 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t flags; 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t qdcount; 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t ancount; 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t nscount; 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t arcount; 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct dns_query_info { 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t qtype; 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t qclass; 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct dns_query { 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct dns_header dns; 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char payload[ 256 + sizeof ( struct dns_query_info ) ]; 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct dns_rr_info_common { 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t type; 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t class; 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t ttl; 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t rdlength; 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct dns_rr_info_a { 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct dns_rr_info_common common; 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct in_addr in_addr; 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct dns_rr_info_cname { 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct dns_rr_info_common common; 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char cname[0]; 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanunion dns_rr_info { 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct dns_rr_info_common common; 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct dns_rr_info_a a; 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct dns_rr_info_cname cname; 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* _GPXE_DNS_H */ 93