// 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
}
