From 547e2294083ea34c0d4111419cd318a0833a4bce Mon Sep 17 00:00:00 2001 From: Sebastian Wagner <2000sw@gmail.com> Date: Tue, 4 Nov 2014 22:36:41 +0100 Subject: [PATCH 1/3] - rudimentary parsing of rfc3925 Vendor-Identifying Vendor Options --- lib/parser.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/parser.js b/lib/parser.js index 281621a..acdb0f1 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -221,6 +221,25 @@ module.exports.parse = function(msg, rinfo) { offset = readIp(msg, offset, p, 'subnetAddress'); break; } + case 125: { // https://tools.ietf.org/html/rfc3925 + if(p.options.dhcpMessageType != 6) { + p.options.VIVendorSpecificInformation = {}; + var len = msg.readUInt8(offset++), + vendoropts = msg.slice(offset, offset + len), + vendorpointer = 0, + position = 0; + while (vendorpointer + 4 + 1 < vendoropts.length) { + var enterprisenumber = vendoropts.readUInt32BE(vendorpointer), + dataLen = vendoropts.readUInt8(vendorpointer + 4), + dataEnd = vendorpointer + 4 + 1 + dataLen, + vendordata = vendoropts.slice(vendorpointer + 4 + 1, dataEnd); + vendorpointer = dataEnd; + p.options.VIVendorSpecificInformation[enterprisenumber] = {position: position++, vendordata: vendordata}; + } + offset+=len; + break; + } + } default: { var len = msg.readUInt8(offset++); console.log('Unhandled DHCP option ' + code + '/' + len + 'b'); From 9768c85a11be8499111793a9496ce2aba099822d Mon Sep 17 00:00:00 2001 From: Sebastian Wagner <2000sw@gmail.com> Date: Wed, 5 Nov 2014 23:46:27 +0100 Subject: [PATCH 2/3] - hint length of vendorData, prepare subOptions --- lib/parser.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/parser.js b/lib/parser.js index acdb0f1..f625231 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -222,6 +222,7 @@ module.exports.parse = function(msg, rinfo) { break; } case 125: { // https://tools.ietf.org/html/rfc3925 + // may be used in any packets where "other" options are allowed if(p.options.dhcpMessageType != 6) { p.options.VIVendorSpecificInformation = {}; var len = msg.readUInt8(offset++), @@ -234,7 +235,12 @@ module.exports.parse = function(msg, rinfo) { dataEnd = vendorpointer + 4 + 1 + dataLen, vendordata = vendoropts.slice(vendorpointer + 4 + 1, dataEnd); vendorpointer = dataEnd; - p.options.VIVendorSpecificInformation[enterprisenumber] = {position: position++, vendordata: vendordata}; + // Enterprise Number SHOULD only occur once + p.options.VIVendorSpecificInformation[enterprisenumber] = { + position: position++, + vandordatalength: dataLen, + subOptions: [] + }; } offset+=len; break; From 8c6bd3885a37cb22e891caf19f3ca106c3da2e56 Mon Sep 17 00:00:00 2001 From: Sebastian Wagner <2000sw@gmail.com> Date: Wed, 5 Nov 2014 23:47:16 +0100 Subject: [PATCH 3/3] - parse encapsulated vendor-specific option-data as subOption --- lib/parser.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/parser.js b/lib/parser.js index f625231..dffe83c 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -241,6 +241,21 @@ module.exports.parse = function(msg, rinfo) { vandordatalength: dataLen, subOptions: [] }; + vendorDataPointer = 0; + // option-data field MUST be encoded as a sequence of code/length/value fields + while (vendorDataPointer + 1 < vendordata.length) { + var subOptionCode = vendordata.readUInt8(vendorDataPointer), + subOptionLength = vendordata.readUInt8(vendorDataPointer + 1), + subOptionStart = vendorDataPointer + 1 + 1, + subOptionData = vendordata.slice(subOptionStart, subOptionStart + subOptionLength); + vendorDataPointer = subOptionStart + subOptionLength; + // Option codes 0 and 255 have no pre-defined interpretation or format + p.options.VIVendorSpecificInformation[enterprisenumber].subOptions.push({ + subOptionCode: subOptionCode, + subOptionLength: subOptionLength, + subOptionData: subOptionData + }); + } } offset+=len; break;