function mux_dissector_impl()

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