// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// DNS packet assembly.  See RFC 1035.
//
// This is intended to support name resolution during net.Dial.
// It doesn't have to be blazing fast.
//
// Rather than write the usual handful of routines to pack and
// unpack every message that can appear on the wire, we use
// reflection to write a generic pack/unpack for structs and then
// use it.  Thus, if in the future we need to define new message
// structs, no new pack/unpack/printing code needs to be written.
//
// The first half of this file defines the DNS message formats.
// The second half implements the conversion to and from wire format.
// A few of the structure elements have string tags to aid the
// generic pack/unpack routines.
//
// TODO(rsc)  There are enough names defined in this file that they're all
// prefixed with _DNS_.  Perhaps put this in its own package later.

package net

import (
	"fmt";
	"os";
	"reflect";
)

// Packet formats

// Wire constants.
const (
	// valid _DNS_RR_Header.Rrtype and _DNS_Question.qtype
	_DNS_TypeA = 1;
	_DNS_TypeNS = 2;
	_DNS_TypeMD = 3;
	_DNS_TypeMF = 4;
	_DNS_TypeCNAME = 5;
	_DNS_TypeSOA = 6;
	_DNS_TypeMB = 7;
	_DNS_TypeMG = 8;
	_DNS_TypeMR = 9;
	_DNS_TypeNULL = 10;
	_DNS_TypeWKS = 11;
	_DNS_TypePTR = 12;
	_DNS_TypeHINFO = 13;
	_DNS_TypeMINFO = 14;
	_DNS_TypeMX = 15;
	_DNS_TypeTXT = 16;

	// valid _DNS_Question.qtype only
	_DNS_TypeAXFR = 252;
	_DNS_TypeMAILB = 253;
	_DNS_TypeMAILA = 254;
	_DNS_TypeALL = 255;

	// valid _DNS_Question.qclass
	_DNS_ClassINET = 1;
	_DNS_ClassCSNET = 2;
	_DNS_ClassCHAOS = 3;
	_DNS_ClassHESIOD = 4;
	_DNS_ClassANY = 255;

	// _DNS_Msg.rcode
	_DNS_RcodeSuccess = 0;
	_DNS_RcodeFormatError = 1;
	_DNS_RcodeServerFailure = 2;
	_DNS_RcodeNameError = 3;
	_DNS_RcodeNotImplemented = 4;
	_DNS_RcodeRefused = 5;
)

// The wire format for the DNS packet header.
type __DNS_Header struct {
	Id uint16;
	Bits uint16;
	Qdcount, Ancount, Nscount, Arcount uint16;
}

const (
	// __DNS_Header.Bits
	_QR = 1<<15;	// query/response (response=1)
	_AA = 1<<10;	// authoritative
	_TC = 1<<9;	// truncated
	_RD = 1<<8;	// recursion desired
	_RA = 1<<7;	// recursion available
)

// DNS queries.
type _DNS_Question struct {
	Name string "domain-name";	// "domain-name" specifies encoding; see packers below
	Qtype uint16;
	Qclass uint16;
}

// DNS responses (resource records).
// There are many types of messages,
// but they all share the same header.
type _DNS_RR_Header struct {
	Name string "domain-name";
	Rrtype uint16;
	Class uint16;
	Ttl uint32;
	Rdlength uint16;	// length of data after header
}

func (h *_DNS_RR_Header) Header() *_DNS_RR_Header {
	return h
}

type _DNS_RR interface {
	Header() *_DNS_RR_Header
}


// Specific DNS RR formats for each query type.

type _DNS_RR_CNAME struct {
	Hdr _DNS_RR_Header;
	Cname string "domain-name";
}

func (rr *_DNS_RR_CNAME) Header() *_DNS_RR_Header {
	return &rr.Hdr;
}

type _DNS_RR_HINFO struct {
	Hdr _DNS_RR_Header;
	Cpu string;
	Os string;
}

func (rr *_DNS_RR_HINFO) Header() *_DNS_RR_Header {
	return &rr.Hdr;
}

type _DNS_RR_MB struct {
	Hdr _DNS_RR_Header;
	Mb string "domain-name";
}

func (rr *_DNS_RR_MB) Header() *_DNS_RR_Header {
	return &rr.Hdr;
}

type _DNS_RR_MG struct {
	Hdr _DNS_RR_Header;
	Mg string "domain-name";
}

func (rr *_DNS_RR_MG) Header() *_DNS_RR_Header {
	return &rr.Hdr;
}

type _DNS_RR_MINFO struct {
	Hdr _DNS_RR_Header;
	Rmail string "domain-name";
	Email string "domain-name";
}

func (rr *_DNS_RR_MINFO) Header() *_DNS_RR_Header {
	return &rr.Hdr;
}

type _DNS_RR_MR struct {
	Hdr _DNS_RR_Header;
	Mr string "domain-name";
}

func (rr *_DNS_RR_MR) Header() *_DNS_RR_Header {
	return &rr.Hdr;
}

type _DNS_RR_MX struct {
	Hdr _DNS_RR_Header;
	Pref uint16;
	Mx string "domain-name";
}

func (rr *_DNS_RR_MX) Header() *_DNS_RR_Header {
	return &rr.Hdr;
}

type _DNS_RR_NS struct {
	Hdr _DNS_RR_Header;
	Ns string "domain-name";
}

func (rr *_DNS_RR_NS) Header() *_DNS_RR_Header {
	return &rr.Hdr;
}

type _DNS_RR_PTR struct {
	Hdr _DNS_RR_Header;
	Ptr string "domain-name";
}

func (rr *_DNS_RR_PTR) Header() *_DNS_RR_Header {
	return &rr.Hdr;
}

type _DNS_RR_SOA struct {
	Hdr _DNS_RR_Header;
	Ns string "domain-name";
	Mbox string "domain-name";
	Serial uint32;
	Refresh uint32;
	Retry uint32;
	Expire uint32;
	Minttl uint32;
}

func (rr *_DNS_RR_SOA) Header() *_DNS_RR_Header {
	return &rr.Hdr;
}

type _DNS_RR_TXT struct {
	Hdr _DNS_RR_Header;
	Txt string;	// not domain name
}

func (rr *_DNS_RR_TXT) Header() *_DNS_RR_Header {
	return &rr.Hdr;
}

type _DNS_RR_A struct {
	Hdr _DNS_RR_Header;
	A uint32 "ipv4";
}

func (rr *_DNS_RR_A) Header() *_DNS_RR_Header {
	return &rr.Hdr;
}



// Packing and unpacking.
//
// All the packers and unpackers take a (msg []byte, off int)
// and return (off1 int, ok bool).  If they return ok==false, they
// also return off1==len(msg), so that the next unpacker will
// also fail.  This lets us avoid checks of ok until the end of a
// packing sequence.

// Map of constructors for each RR wire type.
var rr_mk = map[int] func()_DNS_RR {
	_DNS_TypeCNAME: func() _DNS_RR { return new(_DNS_RR_CNAME) },
	_DNS_TypeHINFO: func() _DNS_RR { return new(_DNS_RR_HINFO) },
	_DNS_TypeMB: func() _DNS_RR { return new(_DNS_RR_MB) },
	_DNS_TypeMG: func() _DNS_RR { return new(_DNS_RR_MG) },
	_DNS_TypeMINFO: func() _DNS_RR { return new(_DNS_RR_MINFO) },
	_DNS_TypeMR: func() _DNS_RR { return new(_DNS_RR_MR) },
	_DNS_TypeMX: func() _DNS_RR { return new(_DNS_RR_MX) },
	_DNS_TypeNS: func() _DNS_RR { return new(_DNS_RR_NS) },
	_DNS_TypePTR: func() _DNS_RR { return new(_DNS_RR_PTR) },
	_DNS_TypeSOA: func() _DNS_RR { return new(_DNS_RR_SOA) },
	_DNS_TypeTXT: func() _DNS_RR { return new(_DNS_RR_TXT) },
	_DNS_TypeA: func() _DNS_RR { return new(_DNS_RR_A) },
}

// Pack a domain name s into msg[off:].
// Domain names are a sequence of counted strings
// split at the dots.  They end with a zero-length string.
func packDomainName(s string, msg []byte, off int) (off1 int, ok bool) {
	// Add trailing dot to canonicalize name.
	if n := len(s); n == 0 || s[n-1] != '.' {
		s += ".";
	}

	// Each dot ends a segment of the name.
	// We trade each dot byte for a length byte.
	// There is also a trailing zero.
	// Check that we have all the space we need.
	tot := len(s) + 1;
	if off+tot > len(msg) {
		return len(msg), false
	}

	// Emit sequence of counted strings, chopping at dots.
	begin := 0;
	for i := 0; i < len(s); i++ {
		if s[i] == '.' {
			if i - begin >= 1<<6 { // top two bits of length must be clear
				return len(msg), false
			}
			msg[off] = byte(i - begin);
			off++;
			for j := begin; j < i; j++ {
				msg[off] = s[j];
				off++;
			}
			begin = i+1;
		}
	}
	msg[off] = 0;
	off++;
	return off, true
}

// Unpack a domain name.
// In addition to the simple sequences of counted strings above,
// domain names are allowed to refer to strings elsewhere in the
// packet, to avoid repeating common suffixes when returning
// many entries in a single domain.  The pointers are marked
// by a length byte with the top two bits set.  Ignoring those
// two bits, that byte and the next give a 14 bit offset from msg[0]
// where we should pick up the trail.
// Note that if we jump elsewhere in the packet,
// we return off1 == the offset after the first pointer we found,
// which is where the next record will start.
// In theory, the pointers are only allowed to jump backward.
// We let them jump anywhere and stop jumping after a while.
func unpackDomainName(msg []byte, off int) (s string, off1 int, ok bool) {
	s = "";
	ptr := 0;	// number of pointers followed
Loop:
	for {
		if off >= len(msg) {
			return "", len(msg), false
		}
		c := int(msg[off]);
		off++;
		switch c&0xC0 {
		case 0x00:
			if c == 0x00 {
				// end of name
				break Loop
			}
			// literal string
			if off+c > len(msg) {
				return "", len(msg), false
			}
			s += string(msg[off:off+c]) + ".";
			off += c;
		case 0xC0:
			// pointer to somewhere else in msg.
			// remember location after first ptr,
			// since that's how many bytes we consumed.
			// also, don't follow too many pointers --
			// maybe there's a loop.
			if off >= len(msg) {
				return "", len(msg), false
			}
			c1 := msg[off];
			off++;
			if ptr == 0 {
				off1 = off
			}
			if ptr++; ptr > 10 {
				return "", len(msg), false
			}
			off = (c^0xC0)<<8 | int(c1);
		default:
			// 0x80 and 0x40 are reserved
			return "", len(msg), false
		}
	}
	if ptr == 0 {
		off1 = off
	}
	return s, off1, true
}

// TODO(rsc): Move into generic library?
// Pack a reflect.StructValue into msg.  Struct members can only be uint16, uint32, string,
// and other (often anonymous) structs.
func packStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int, ok bool) {
	for i := 0; i < val.NumField(); i++ {
		f := val.Type().(*reflect.StructType).Field(i);
		switch fv := val.Field(i).(type) {
		default:
			fmt.Fprintf(os.Stderr, "net: dns: unknown packing type %v", f.Type);
			return len(msg), false;
		case *reflect.StructValue:
			off, ok = packStructValue(fv, msg, off);
		case *reflect.Uint16Value:
			i := fv.Get();
			if off+2 > len(msg) {
				return len(msg), false
			}
			msg[off] = byte(i>>8);
			msg[off+1] = byte(i);
			off += 2;
		case *reflect.Uint32Value:
			i := fv.Get();
			if off+4 > len(msg) {
				return len(msg), false
			}
			msg[off] = byte(i>>24);
			msg[off+1] = byte(i>>16);
			msg[off+2] = byte(i>>8);
			msg[off+4] = byte(i);
			off += 4;
		case *reflect.StringValue:
			// There are multiple string encodings.
			// The tag distinguishes ordinary strings from domain names.
			s := fv.Get();
			switch f.Tag {
			default:
				fmt.Fprintf(os.Stderr, "net: dns: unknown string tag %v", f.Tag);
				return len(msg), false;
			case "domain-name":
				off, ok = packDomainName(s, msg, off);
				if !ok {
					return len(msg), false
				}
			case "":
				// Counted string: 1 byte length.
				if len(s) > 255 || off + 1 + len(s) > len(msg) {
					return len(msg), false
				}
				msg[off] = byte(len(s));
				off++;
				for i := 0; i < len(s); i++ {
					msg[off+i] = s[i];
				}
				off += len(s);
			}
		}
	}
	return off, true
}

func structValue(any interface{}) *reflect.StructValue {
	return reflect.NewValue(any).(*reflect.PtrValue).Elem().(*reflect.StructValue);
}

func packStruct(any interface{}, msg []byte, off int) (off1 int, ok bool) {
	off, ok = packStructValue(structValue(any), msg, off);
	return off, ok
}

// TODO(rsc): Move into generic library?
// Unpack a reflect.StructValue from msg.
// Same restrictions as packStructValue.
func unpackStructValue(val *reflect.StructValue, msg []byte, off int) (off1 int, ok bool) {
	for i := 0; i < val.NumField(); i++ {
		f := val.Type().(*reflect.StructType).Field(i);
		switch fv := val.Field(i).(type) {
		default:
			fmt.Fprintf(os.Stderr, "net: dns: unknown packing type %v", f.Type);
			return len(msg), false;
		case *reflect.StructValue:
			off, ok = unpackStructValue(fv, msg, off);
		case *reflect.Uint16Value:
			if off+2 > len(msg) {
				return len(msg), false
			}
			i := uint16(msg[off])<<8 | uint16(msg[off+1]);
			fv.Set(i);
			off += 2;
		case *reflect.Uint32Value:
			if off+4 > len(msg) {
				return len(msg), false
			}
			i := uint32(msg[off])<<24 | uint32(msg[off+1])<<16 | uint32(msg[off+2])<<8 | uint32(msg[off+3]);
			fv.Set(i);
			off += 4;
		case *reflect.StringValue:
			var s string;
			switch f.Tag {
			default:
				fmt.Fprintf(os.Stderr, "net: dns: unknown string tag %v", f.Tag);
				return len(msg), false;
			case "domain-name":
				s, off, ok = unpackDomainName(msg, off);
				if !ok {
					return len(msg), false
				}
			case "":
				if off >= len(msg) || off+1+int(msg[off]) > len(msg) {
					return len(msg), false
				}
				n := int(msg[off]);
				off++;
				b := make([]byte, n);
				for i := 0; i < n; i++ {
					b[i] = msg[off+i];
				}
				off += n;
				s = string(b);
			}
			fv.Set(s);
		}
	}
	return off, true
}

func unpackStruct(any interface{}, msg []byte, off int) (off1 int, ok bool) {
	off, ok = unpackStructValue(structValue(any), msg, off);
	return off, ok
}

// Generic struct printer.
// Doesn't care about the string tag "domain-name",
// but does look for an "ipv4" tag on uint32 variables,
// printing them as IP addresses.
func printStructValue(val *reflect.StructValue) string {
	s := "{";
	for i := 0; i < val.NumField(); i++ {
		if i > 0 {
			s += ", ";
		}
		f := val.Type().(*reflect.StructType).Field(i);
		if !f.Anonymous {
			s += f.Name + "=";
		}
		fval := val.Field(i);
		if fv, ok := fval.(*reflect.StructValue); ok {
			s += printStructValue(fv);
		} else if fv, ok := fval.(*reflect.Uint32Value); ok && f.Tag == "ipv4" {
			i := fv.Get();
			s += IPv4(byte(i>>24), byte(i>>16), byte(i>>8), byte(i)).String();
		} else {
			s += fmt.Sprint(fval.Interface())
		}
	}
	s += "}";
	return s;
}

func printStruct(any interface{}) string {
	return printStructValue(structValue(any));
}

// Resource record packer.
func packRR(rr _DNS_RR, msg []byte, off int) (off2 int, ok bool) {
	var off1 int;
	// pack twice, once to find end of header
	// and again to find end of packet.
	// a bit inefficient but this doesn't need to be fast.
	// off1 is end of header
	// off2 is end of rr
	off1, ok = packStruct(rr.Header(), msg, off);
	off2, ok = packStruct(rr, msg, off);
	if !ok {
		return len(msg), false
	}
	// pack a third time; redo header with correct data length
	rr.Header().Rdlength = uint16(off2 - off1);
	packStruct(rr.Header(), msg, off);
	return off2, true
}

// Resource record unpacker.
func unpackRR(msg []byte, off int) (rr _DNS_RR, off1 int, ok bool) {
	// unpack just the header, to find the rr type and length
	var h _DNS_RR_Header;
	off0 := off;
	if off, ok = unpackStruct(&h, msg, off); !ok {
		return nil, len(msg), false
	}
	end := off+int(h.Rdlength);

	// make an rr of that type and re-unpack.
	// again inefficient but doesn't need to be fast.
	mk, known := rr_mk[int(h.Rrtype)];
	if !known {
		return &h, end, true
	}
	rr = mk();
	off, ok = unpackStruct(rr, msg, off0);
	if off != end {
		return &h, end, true
	}
	return rr, off, ok
}

// Usable representation of a DNS packet.

// A manually-unpacked version of (id, bits).
// This is in its own struct for easy printing.
type __DNS_Msg_Top struct {
	id uint16;
	response bool;
	opcode int;
	authoritative bool;
	truncated bool;
	recursion_desired bool;
	recursion_available bool;
	rcode int;
}

type _DNS_Msg struct {
	__DNS_Msg_Top;
	question []_DNS_Question;
	answer []_DNS_RR;
	ns []_DNS_RR;
	extra []_DNS_RR;
}


func (dns *_DNS_Msg) Pack() (msg []byte, ok bool) {
	var dh __DNS_Header;

	// Convert convenient _DNS_Msg into wire-like __DNS_Header.
	dh.Id = dns.id;
	dh.Bits = uint16(dns.opcode)<<11 | uint16(dns.rcode);
	if dns.recursion_available {
		dh.Bits |= _RA;
	}
	if dns.recursion_desired {
		dh.Bits |= _RD;
	}
	if dns.truncated {
		dh.Bits |= _TC;
	}
	if dns.authoritative {
		dh.Bits |= _AA;
	}
	if dns.response {
		dh.Bits |= _QR;
	}

	// Prepare variable sized arrays.
	question := dns.question;
	answer := dns.answer;
	ns := dns.ns;
	extra := dns.extra;

	dh.Qdcount = uint16(len(question));
	dh.Ancount = uint16(len(answer));
	dh.Nscount = uint16(len(ns));
	dh.Arcount = uint16(len(extra));

	// Could work harder to calculate message size,
	// but this is far more than we need and not
	// big enough to hurt the allocator.
	msg = make([]byte, 2000);

	// Pack it in: header and then the pieces.
	off := 0;
	off, ok = packStruct(&dh, msg, off);
	for i := 0; i < len(question); i++ {
		off, ok = packStruct(&question[i], msg, off);
	}
	for i := 0; i < len(answer); i++ {
		off, ok = packStruct(answer[i], msg, off);
	}
	for i := 0; i < len(ns); i++ {
		off, ok = packStruct(ns[i], msg, off);
	}
	for i := 0; i < len(extra); i++ {
		off, ok = packStruct(extra[i], msg, off);
	}
	if !ok {
		return nil, false
	}
	return msg[0:off], true
}

func (dns *_DNS_Msg) Unpack(msg []byte) bool {
	// Header.
	var dh __DNS_Header;
	off := 0;
	var ok bool;
	if off, ok = unpackStruct(&dh, msg, off); !ok {
		return false
	}
	dns.id = dh.Id;
	dns.response = (dh.Bits & _QR) != 0;
	dns.opcode = int(dh.Bits >> 11) & 0xF;
	dns.authoritative = (dh.Bits & _AA) != 0;
	dns.truncated = (dh.Bits & _TC) != 0;
	dns.recursion_desired = (dh.Bits & _RD) != 0;
	dns.recursion_available = (dh.Bits & _RA) != 0;
	dns.rcode = int(dh.Bits & 0xF);

	// Arrays.
	dns.question = make([]_DNS_Question, dh.Qdcount);
	dns.answer = make([]_DNS_RR, dh.Ancount);
	dns.ns = make([]_DNS_RR, dh.Nscount);
	dns.extra = make([]_DNS_RR, dh.Arcount);

	for i := 0; i < len(dns.question); i++ {
		off, ok = unpackStruct(&dns.question[i], msg, off);
	}
	for i := 0; i < len(dns.answer); i++ {
		dns.answer[i], off, ok = unpackRR(msg, off);
	}
	for i := 0; i < len(dns.ns); i++ {
		dns.ns[i], off, ok = unpackRR(msg, off);
	}
	for i := 0; i < len(dns.extra); i++ {
		dns.extra[i], off, ok = unpackRR(msg, off);
	}
	if !ok {
		return false
	}
//	if off != len(msg) {
//		println("extra bytes in dns packet", off, "<", len(msg));
//	}
	return true
}

func (dns *_DNS_Msg) String() string {
	s := "DNS: "+printStruct(&dns.__DNS_Msg_Top)+"\n";
	if len(dns.question) > 0 {
		s += "-- Questions\n";
		for i := 0; i < len(dns.question); i++ {
			s += printStruct(&dns.question[i])+"\n";
		}
	}
	if len(dns.answer) > 0 {
		s += "-- Answers\n";
		for i := 0; i < len(dns.answer); i++ {
			s += printStruct(dns.answer[i])+"\n";
		}
	}
	if len(dns.ns) > 0 {
		s += "-- Name servers\n";
		for i := 0; i < len(dns.ns); i++ {
			s += printStruct(dns.ns[i])+"\n";
		}
	}
	if len(dns.extra) > 0 {
		s += "-- Extra\n";
		for i := 0; i < len(dns.extra); i++ {
			s += printStruct(dns.extra[i])+"\n";
		}
	}
	return s;
}
