dissect-wireshark: fix decoding of several fields
HopLimit and PitToken are not NonNegativeIntegers.
ApplicationParameters and Content are not strings but arbitrary bytes.
Recognize "None" values in NackReason and CachePolicyType.
Refs: #3197, #4517
Change-Id: I18c55a638bf5985d8ec4a1f2a76dba7b7e4407ad
diff --git a/tools/dissect-wireshark/ndn.lua b/tools/dissect-wireshark/ndn.lua
index d4fa4b4..dbc95a7 100755
--- a/tools/dissect-wireshark/ndn.lua
+++ b/tools/dissect-wireshark/ndn.lua
@@ -112,8 +112,11 @@
end
function getNackReasonDetail(b)
+ assert(b.type == 801)
local code = getNonNegativeInteger(b)
- if code == UInt64(50) then return "Congestion"
+
+ if code == UInt64(0) then return "None"
+ elseif code == UInt64(50) then return "Congestion"
elseif code == UInt64(100) then return "Duplicate"
elseif code == UInt64(150) then return "NoRoute"
else return tostring(code)
@@ -121,20 +124,31 @@
end
function getCachePolicyDetail(b)
+ assert(b.type == 821)
local code = getNonNegativeInteger(b)
- if (code == 1) then return "NoCache"
- else return "Unknown"
+
+ if code == UInt64(0) then return "None"
+ elseif code == UInt64(1) then return "NoCache"
+ else return tostring(code) .. " (unknown)"
end
end
function getNonce(b)
assert(b.type == 10)
- if (b.length ~= 4) then
+ if b.length ~= 4 then
return "invalid (should have 4 octets)"
end
return getValue(b):uint()
end
+function getHopLimit(b)
+ assert(b.type == 34)
+ if b.length ~= 1 then
+ return "invalid (should have 1 octet)"
+ end
+ return getValue(b):uint()
+end
+
function getTrue(block)
return "Yes"
end
@@ -197,17 +211,17 @@
[31] = {name = "LinkDelegation" , summary = true},
[30] = {name = "LinkPreference" , field = ProtoField.uint64("ndn.linkpreference", "LinkPreference", base.DEC) , value = getNonNegativeInteger},
[10] = {name = "Nonce" , field = ProtoField.uint32("ndn.nonce", "Nonce", base.HEX) , value = getNonce},
- [12] = {name = "InterestLifetime" , field = ProtoField.uint64("ndn.interestlifetime", "InterestLifetime", base.DEC) , value = getNonNegativeInteger},
- [34] = {name = "HopLimit" , field = ProtoField.uint64("ndn.hoplimit", "HopLimit", base.DEC) , value = getNonNegativeInteger},
- [36] = {name = "ApplicationParameters" , field = ProtoField.string("ndn.applicationparameters", "ApplicationParameters")},
+ [12] = {name = "InterestLifetime" , field = ProtoField.uint64("ndn.lifetime", "InterestLifetime", base.DEC) , value = getNonNegativeInteger},
+ [34] = {name = "HopLimit" , field = ProtoField.uint8("ndn.hoplimit", "HopLimit", base.DEC) , value = getHopLimit},
+ [36] = {name = "ApplicationParameters" , field = ProtoField.bytes("ndn.app_params", "ApplicationParameters")},
-- Data and its sub-elements in Packet Format v0.3
[6] = {name = "Data" , summary = true},
[20] = {name = "MetaInfo" , summary = true},
- [24] = {name = "ContentType" , field = ProtoField.uint64("ndn.contenttype", "Content Type", base.DEC) , value = getNonNegativeInteger},
- [25] = {name = "FreshnessPeriod" , field = ProtoField.uint64("ndn.freshnessperiod", "FreshnessPeriod", base.DEC) , value = getNonNegativeInteger},
- [26] = {name = "FinalBlockId" , field = ProtoField.string("ndn.finalblockid", "FinalBlockId") , value = getUriFromFinalBlockId},
- [21] = {name = "Content" , field = ProtoField.string("ndn.content", "Content")},
+ [24] = {name = "ContentType" , field = ProtoField.uint64("ndn.contenttype", "ContentType", base.DEC) , value = getNonNegativeInteger},
+ [25] = {name = "FreshnessPeriod" , field = ProtoField.uint64("ndn.freshness", "FreshnessPeriod", base.DEC) , value = getNonNegativeInteger},
+ [26] = {name = "FinalBlockId" , field = ProtoField.string("ndn.finalblock", "FinalBlockId") , value = getUriFromFinalBlockId},
+ [21] = {name = "Content" , field = ProtoField.bytes("ndn.content", "Content")},
[22] = {name = "SignatureInfo" , summary = true},
[27] = {name = "SignatureType" , field = ProtoField.uint64("ndn.signaturetype", "SignatureType", base.DEC) , value = getNonNegativeInteger},
[28] = {name = "KeyLocator" , summary = true},
@@ -219,7 +233,7 @@
[81] = {name = "Sequence" , field = ProtoField.uint64("ndn.sequence", "Sequence", base.DEC) , value = getNonNegativeInteger},
[82] = {name = "FragIndex" , field = ProtoField.uint64("ndn.fragindex", "FragIndex", base.DEC) , value = getNonNegativeInteger},
[83] = {name = "FragCount" , field = ProtoField.uint64("ndn.fragcount", "FragCount", base.DEC) , value = getNonNegativeInteger},
- [98] = {name = "PitToken" , field = ProtoField.uint64("ndn.pit_token", "PitToken", base.DEC) , value = getNonNegativeInteger},
+ [98] = {name = "PitToken" , field = ProtoField.bytes("ndn.pit_token", "PitToken")},
[100] = {name = "LpPacket" , summary = true},
[800] = {name = "Nack" , summary = true},
[801] = {name = "NackReason" , field = ProtoField.string("ndn.nack_reason", "NackReason") , value = getNackReasonDetail},