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