Packer works!
This commit is contained in:
parent
af870ebc8f
commit
737b31fcc2
|
@ -47,7 +47,17 @@ var dnspack = exports.DNS_PACKER = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function packLabel(sequence, terminates) {
|
function packLabelSequence(sequence, terminates) {
|
||||||
|
console.log('sequence:', sequence);
|
||||||
|
if (labelsMap[sequence]) {
|
||||||
|
console.log('cached sequence:', sequence);
|
||||||
|
// minimal compression pointer 0xc0 (192)
|
||||||
|
dv.setUint8(total, 0xc0, false);
|
||||||
|
total += 1;
|
||||||
|
dv.setUint8(total, labelsMap[sequence].total, false);
|
||||||
|
total += 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (terminates) {
|
if (terminates) {
|
||||||
// we don't want non-terminating rdata cached, just terminating names
|
// we don't want non-terminating rdata cached, just terminating names
|
||||||
labelsMap[total] = { total: total, name: sequence };
|
labelsMap[total] = { total: total, name: sequence };
|
||||||
|
@ -62,19 +72,22 @@ var dnspack = exports.DNS_PACKER = {
|
||||||
total += 1;
|
total += 1;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
if (terminates) {
|
||||||
|
// trailing 0 (null) as label sequence terminator
|
||||||
|
dv.setUint8(total, 0, false);
|
||||||
|
total += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function packQuestion(q) {
|
function packQuestion(q) {
|
||||||
lint(q);
|
lint(q);
|
||||||
|
|
||||||
packLabel(q.name);
|
packLabelSequence(q.name, true);
|
||||||
// trailing 0 (null) as label sequence terminator
|
|
||||||
dv.setUint8(total, 0, false);
|
|
||||||
total += 1;
|
|
||||||
|
|
||||||
dv.setUint16(total, q.type, false);
|
dv.setUint16(total, q.type, false);
|
||||||
dv.setUint16(total + 2, q.class, false);
|
total += 2;
|
||||||
total += 4; // two bytes type two bytes class
|
dv.setUint16(total, q.class, false);
|
||||||
|
total += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
function packAnswer(a) {
|
function packAnswer(a) {
|
||||||
|
|
|
@ -8,8 +8,12 @@ exports.DNS_PACKER_TYPE_A = function (ab, dv, total, record) {
|
||||||
throw new Error("no address on A record");
|
throw new Error("no address on A record");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RDLENGTH
|
||||||
|
dv.setUint16(total, 4, false);
|
||||||
|
total += 2;
|
||||||
|
|
||||||
|
// RDATA
|
||||||
// i.e. 127.0.0.1 => 0x7F, 0x00, 0x00, 0x01
|
// i.e. 127.0.0.1 => 0x7F, 0x00, 0x00, 0x01
|
||||||
//record.rdlength = 4;
|
|
||||||
record.address.split('.').forEach(function (octet) {
|
record.address.split('.').forEach(function (octet) {
|
||||||
dv.setUint8(total, parseInt(octet, 10), false);
|
dv.setUint8(total, parseInt(octet, 10), false);
|
||||||
total += 1;
|
total += 1;
|
||||||
|
|
|
@ -23,6 +23,12 @@ exports.DNS_PACKER_TYPE_AAAA = function (ab, dv, total, record) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// RDLENGTH
|
||||||
|
dv.setUint16(total, 16, false);
|
||||||
|
total += 2;
|
||||||
|
|
||||||
|
// RDATA
|
||||||
parts.forEach(function (sedectet) {
|
parts.forEach(function (sedectet) {
|
||||||
dv.setUint16(total, parseInt(sedectet, 16), false);
|
dv.setUint16(total, parseInt(sedectet, 16), false);
|
||||||
total += 2;
|
total += 2;
|
||||||
|
|
Loading…
Reference in New Issue