in finagle-mux/src/main/lua/mux_dissector.lua [289:417]
function mux_dissector_impl(tvbuf, pktinfo, root)
dprint("mux_dissector_impl called")
if looks_like_mux(tvbuf, pktinfo,root) == false then
dprint("looks_like_mux returned false, bailing out")
return 0
end
pktinfo.cols.protocol:set("MUX")
local pktlen = tvbuf:reported_length_remaining()
local tree = root:add(mux, tvbuf:range(0,pktlen))
tree:add(pf_size, tvbuf:range(0,4))
local size = tvbuf:range(0,4):uint()
local typeint = tvbuf:range(4,1):uint()
local typestr = MESSAGE_TYPES[typeint]
if pktlen == 19 and typeint == MSG_TYPE_OLD_RERR and size == 15 and tvbuf:range(8, 11):string() == CAN_TINIT_PAYLOAD then
tree:add(pf_type, MSG_TYPE_CAN_TINIT)
local typestr = "CanTinit"
else
tree:add(pf_type, tvbuf:range(4,1))
end
if not typestr then
typestr = "unknown type (".. typeint .. ")"
end
tree:add(pf_tag, tvbuf:range(5,3))
local tag = tvbuf:range(5,3):uint()
pktinfo.cols.info:prepend(typestr .." Tag=".. tag .." ")
local pos = 8
if typeint == MSG_TYPE_RERR or typeint == MSG_TYPE_OLD_RERR then
tree:add(pf_why, tvbuf(pos, size - 4))
elseif typeint == MSG_TYPE_OLD_TDISCARDED or typeint == MSG_TYPE_TDISCARDED then
tree:add(pf_discard_tag, tvbuf:range(pos, 3))
tree:add(pf_why, tvbuf(pos + 3, size - 7))
elseif typeint == MSG_TYPE_TDISPATCH then
local numctxs = tvbuf:range(pos,2):uint()
pos = pos + 2
local ctx_tree = tree:add("Contexts: ".. numctxs)
for ctx = 1,numctxs do
local keylen = tvbuf:range(pos,2):uint()
pos = pos + 2
local key = tvbuf:range(pos, keylen):string()
pos = pos + keylen
local vallen = tvbuf:range(pos,2):uint()
pos = pos + 2
local value = tvbuf:range(pos,vallen):bytes()
pos = pos + vallen
decodeCtx(ctx_tree, key, value)
end
local destlen = tvbuf:range(pos,2):uint()
pos = pos + 2
local dest = tvbuf:range(pos, destlen):string()
if dest:len() > 0 then
tree:add(pf_dest, dest)
end
pos = pos + destlen
local numdtabs = tvbuf:range(pos,2):uint()
pos = pos + 2
if numdtabs > 0 then
local dtab_tree = tree:add("Dtabs")
for entry = 1,numdtabs do
local len = tvbuf:range(pos,2):uint()
pos = pos + 2
local src = tvbuf:range(pos, len):string()
pos = pos + len
len = tvbuf:range(pos,2):uint()
pos = pos + 2
local dst = tvbuf:range(pos, len):string()
pos = pos + len
dtab_tree:add(src .." => ".. dst)
end
end
end
local remaining = size - pos + 4
tree:add(pf_payload_len, remaining)
tree:add(pf_mux_overhead, size - remaining + 4)
pos = pos + remaining
return pos
end