Wireshark-dev: [Wireshark-dev] myProtocol_handle = find_dissector("myprotocol");	is NULL
      
      
Hi all,
 
I have created two dissectors. 
I would like one dissector to use the other 
one.
I am getting a NULL return value when I call 
find_dissector();
 
The lower level dissector is named mgw and the 
pertinent code sections are:
From file packet-mgw.c:
---8<---
       void 
proto_register_mgw();
       void 
proto_reg_handoff_mgw();
static void dissect_mgw(tvbuff_t *tvb, packet_info 
*pinfo, proto_tree *tree);
 
static 
int  proto_mgw = -1;
static dissector_handle_t 
mgw_handle;
void
proto_register_mgw(void)
{
 static 
hf_register_info hf[] = {
 
  /* MGW header */
  { 
&hf_mgw_hdr,
   { "Message Header", 
 
     "mgw.hdr", 
     
FT_PROTOCOL,     
     
BASE_NONE,
     NULL, 
     0x0, 
     "", 
     HFILL 
}},
...
 proto_mgw = proto_register_protocol ("LSI MGW Framework 
Transport Protocol", "LSI MGW", "mgw");
 proto_register_field_array(proto_mgw, hf, 
array_length(hf));
 proto_register_subtree_array(ett, 
array_length(ett));
 
}
void
proto_reg_handoff_mgw(void)
{
 static 
gboolean initialized = FALSE;
 guint32 i;
 
 if (!initialized) 
{
  mgw_handle = create_dissector_handle(dissect_mgw, 
proto_mgw);
  for 
(i=global_mgw_base_port;i<=(global_mgw_base_port+3);i++) 
{
   dissector_add("udp.port", i, 
mgw_handle);
  }
/*   dissector_add("lsiint_hc.dstch", 
0x07f0, mgw_handle); */
/*   dissector_add("lsiint_hc.dstch", 
0x07f1, mgw_handle); */
/*   dissector_add("lsiint_hc.dstch", 
0x07f2, mgw_handle); */
/*   dissector_add("lsiint_hc.dstch", 
0x07f3, mgw_handle); */
  initialized = 
TRUE;
 }
}
---8<---
Calling from UDP port above works fine.
However, when I try to call from my upper level dissector, it 
fails.
The commented out dissector_add functions cause 
wireshark to crash.
From file 
packet-lsiint.c: 
---8<---
       void 
proto_reg_handoff_lsiint();
       void 
proto_register_lsiint_hc();
static dissector_handle_t 
lsiint_hc_handle;
void
proto_reg_handoff_lsiint(void)
{
  
static gboolean initialized = FALSE;
 
  if (!initialized) 
{
    lsiint_hc_handle = 
create_dissector_handle(dissect_lsiint_hc, 
proto_lsiint_hc);
    register_dissector("lsiint_hc",  
dissect_lsiint_hc,  proto_lsiint_hc);
    mgw_handle = 
find_dissector("mgw");
    if (mgw_handle == NULL) 
{
     fprintf(stderr, "MGW handle is 
NULL\n");
    }
    data_handle = 
find_dissector("data");
    initialized = TRUE;
  
}
}
---8<---
If I make mgw_handle 
global in packet-mgw.c and an extern in packet-lsiint.c, then the protocol 
decodes happen as they should.
 
What am I doing wrong 
with the registration?
 
Many thanks in 
advance,
 
 -posey