dns-packet

An abstract-encoding compliant module for encoding / decoding DNS packets. Lifted out of multicast-dns as a separate module.

npm install dns-packet

# Usage

var packet = require('dns-packet')
var dgram = require('dgram')
var socket = dgram.createSocket('udp4')
var buf = packet.encode({
type: 'query',
id: 1,
flags: packet.RECURSION_DESIRED,
questions: [{
type: 'A',
name: 'google.com'
}]
})
socket.on('message', function (message) {
console.log(packet.decode(message)) // prints out a response from google dns
})
socket.send(buf, 0, buf.length, 53, '8.8.8.8')

# API

### <tt>var buf = packets.encode(packet, [buf], [offset])</tt>

Encodes a DNS packet into a buffer.

### <tt>var packet = packets.decode(buf, [offset])</tt>

Decode a DNS packet from a buffer

### <tt>var len = packets.encodingLength(packet)</tt>

Returns how many bytes are needed to encode the DNS packet

# Packets

Packets look like this

{
type: 'query|response',
id: optionalIdNumber,
flags: optionalBitFlags,
questions: [...],
answers: [...],
additionals: [...],
authorities: [...]
}

The bit flags available are

packet.RECURSION_DESIRED
packet.RECURSION_AVAILABLE
packet.TRUNCATED_RESPONSE
packet.AUTHORITATIVE_ANSWER
packet.AUTHENTIC_DATA
packet.CHECKING_DISABLED

To use more than one flag bitwise-or them together

var flags = packet.RECURSION_DESIRED | packet.RECURSION_AVAILABLE

And to check for a flag use bitwise-and

var isRecursive = message.flags & packet.RECURSION_DESIRED

A question looks like this

{
type: 'A', // or SRV, AAAA, etc
name: 'google.com' // which record are you looking for
}

And an answers, additional, or authority looks like this

{
type: 'A', // or SRV, AAAA, etc
name: 'google.com', // which name is this record for
ttl: optionalTimeToLiveInSeconds,
(record specific data, see below)
}

Currently the different available records are

### <tt>A</tt>

{
data: 'IPv4 address' // fx 127.0.0.1
}

### <tt>AAAA</tt>

{
data: 'IPv6 address' // fx fe80::1
}

### <tt>TXT</tt>

{
data: Buffer('some text')
}

### <tt>NS</tt>

{
data: nameServer
}

### <tt>NULL</tt>

{
data: Buffer('any binary data')
}

### <tt>SOA</tt>

{
data:
{
mname: domainName,
rname: mailbox,
serial: zoneSerial,
refresh: refreshInterval,
retry: retryInterval,
expire: expireInterval,
minimum: minimumTTL
}
}

### <tt>SRV</tt>

{
data: {
port: servicePort,
target: serviceHostName,
priority: optionalServicePriority,
weight: optionalServiceWeight
}
}

### <tt>HINFO</tt>

{
data: {
cpu: 'cpu info',
os: 'os info'
}
}

### <tt>PTR</tt>

{
data: 'points.to.another.record'
}

### <tt>CNAME</tt>

{
data: 'cname.to.another.record'
}

### <tt>DNAME</tt>

{
data: 'dname.to.another.record'
}

### <tt>CAA</tt>

{
flags: 128, // octet
tag: 'issue|issuewild|iodef',
value: 'ca.example.net'
}

If you need another one, open an issue and we'll try to add it.

# License

MIT