diff --git a/epan/dissectors/packet-erf.c b/epan/dissectors/packet-erf.c index 88c7f89207..10e3430eed 100644 --- a/epan/dissectors/packet-erf.c +++ b/epan/dissectors/packet-erf.c @@ -108,6 +108,7 @@ typedef struct sdh_g707_format_s } sdh_g707_format_t; static dissector_handle_t erf_handle; +static dissector_table_t erf_dissector_table; /* Initialize the protocol and registered fields */ static int proto_erf = -1; @@ -284,13 +285,6 @@ static expert_field ei_erf_checksum_error = EI_INIT; /* Default subdissector, display raw hex data */ static dissector_handle_t data_handle; -/* IPv4 and IPv6 subdissectors */ -static dissector_handle_t ipv4_handle; -static dissector_handle_t ipv6_handle; - -static dissector_handle_t infiniband_handle; -static dissector_handle_t infiniband_link_handle; - typedef enum { ERF_HDLC_CHDLC = 0, ERF_HDLC_PPP = 1, @@ -315,7 +309,6 @@ static gint erf_aal5_type = ERF_AAL5_GUESS; static dissector_handle_t atm_untruncated_handle; static gboolean erf_ethfcs = TRUE; -static dissector_handle_t ethwithfcs_handle, ethwithoutfcs_handle; static dissector_handle_t sdh_handle; @@ -1241,7 +1234,7 @@ dissect_erf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) switch (erf_type) { case ERF_TYPE_RAW_LINK: - if(sdh_handle){ + if(sdh_handle) { call_dissector(sdh_handle, tvb, pinfo, tree); } else{ @@ -1249,32 +1242,18 @@ dissect_erf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } break; + case ERF_TYPE_ETH: + case ERF_TYPE_COLOR_ETH: + case ERF_TYPE_DSM_COLOR_ETH: + dissect_eth_header(tvb, pinfo, erf_tree); + /* fall through */ case ERF_TYPE_IPV4: - if (ipv4_handle) - call_dissector(ipv4_handle, tvb, pinfo, tree); - else - call_dissector(data_handle, tvb, pinfo, tree); - break; - case ERF_TYPE_IPV6: - if (ipv6_handle) - call_dissector(ipv6_handle, tvb, pinfo, tree); - else - call_dissector(data_handle, tvb, pinfo, tree); - break; - case ERF_TYPE_INFINIBAND: - if (infiniband_handle) - call_dissector(infiniband_handle, tvb, pinfo, tree); - else - call_dissector(data_handle, tvb, pinfo, tree); - break; - case ERF_TYPE_INFINIBAND_LINK: - if (infiniband_link_handle) - call_dissector(infiniband_link_handle, tvb, pinfo, tree); - else + if (!dissector_try_uint(erf_dissector_table, erf_type, tvb, pinfo, tree)) { call_dissector(data_handle, tvb, pinfo, tree); + } break; case ERF_TYPE_LEGACY: @@ -1445,16 +1424,6 @@ dissect_erf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) call_dissector(atm_untruncated_handle, new_tvb, pinfo, tree); break; - case ERF_TYPE_ETH: - case ERF_TYPE_COLOR_ETH: - case ERF_TYPE_DSM_COLOR_ETH: - dissect_eth_header(tvb, pinfo, erf_tree); - if (erf_ethfcs) - call_dissector(ethwithfcs_handle, tvb, pinfo, tree); - else - call_dissector(ethwithoutfcs_handle, tvb, pinfo, tree); - break; - case ERF_TYPE_MC_HDLC: dissect_mc_hdlc_header(tvb, pinfo, erf_tree); /* continue with type HDLC */ @@ -1963,6 +1932,8 @@ proto_register_erf(void) "Ethernet packets have FCS", "Whether the FCS is present in Ethernet packets", &erf_ethfcs); + + erf_dissector_table = register_dissector_table("erf.types.type", "Type", FT_UINT8, BASE_DEC); } void @@ -1973,14 +1944,6 @@ proto_reg_handoff_erf(void) /* Dissector called to dump raw data, or unknown protocol */ data_handle = find_dissector("data"); - /* Get handle for IP dissectors) */ - ipv4_handle = find_dissector("ip"); - ipv6_handle = find_dissector("ipv6"); - - /* Get handle for Infiniband dissector */ - infiniband_handle = find_dissector("infiniband"); - infiniband_link_handle = find_dissector("infiniband_link"); - /* Get handles for serial line protocols */ chdlc_handle = find_dissector("chdlc"); ppp_handle = find_dissector("ppp_hdlc"); @@ -1990,9 +1953,5 @@ proto_reg_handoff_erf(void) /* Get handle for ATM dissector */ atm_untruncated_handle = find_dissector("atm_untruncated"); - /* Get handles for Ethernet dissectors */ - ethwithfcs_handle = find_dissector("eth_withfcs"); - ethwithoutfcs_handle = find_dissector("eth_withoutfcs"); - sdh_handle = find_dissector("sdh"); } diff --git a/epan/dissectors/packet-eth.c b/epan/dissectors/packet-eth.c index 7e75a503ec..e475909dce 100644 --- a/epan/dissectors/packet-eth.c +++ b/epan/dissectors/packet-eth.c @@ -41,6 +41,7 @@ #include "packet-usb.h" #include #include +#include void proto_register_eth(void); void proto_reg_handoff_eth(void); @@ -1021,6 +1022,7 @@ proto_reg_handoff_eth(void) eth_withoutfcs_handle = find_dissector("eth_withoutfcs"); dissector_add_uint("ethertype", ETHERTYPE_ETHBRIDGE, eth_withoutfcs_handle); + dissector_add_uint("erf.types.type", ERF_TYPE_ETH, eth_withoutfcs_handle); dissector_add_uint("chdlc.protocol", ETHERTYPE_ETHBRIDGE, eth_withoutfcs_handle); dissector_add_uint("gre.proto", ETHERTYPE_ETHBRIDGE, eth_withoutfcs_handle); diff --git a/epan/dissectors/packet-infiniband.c b/epan/dissectors/packet-infiniband.c index 4aee7b2709..8bfec9e92f 100644 --- a/epan/dissectors/packet-infiniband.c +++ b/epan/dissectors/packet-infiniband.c @@ -38,6 +38,7 @@ #include #include #include +#include #include "packet-infiniband.h" @@ -107,6 +108,7 @@ static gint ett_link = -1; /* Dissector Declaration */ static dissector_handle_t ib_handle; +static dissector_handle_t ib_link_handle; /* Subdissectors Declarations */ static dissector_handle_t ipv6_handle; @@ -7366,7 +7368,7 @@ void proto_register_infiniband(void) &pref_dissect_eoib); proto_infiniband_link = proto_register_protocol("InfiniBand Link", "InfiniBand Link", "infiniband_link"); - register_dissector("infiniband_link", dissect_infiniband_link, proto_infiniband_link); + ib_link_handle = register_dissector("infiniband_link", dissect_infiniband_link, proto_infiniband_link); proto_register_field_array(proto_infiniband_link, hf_link, array_length(hf_link)); proto_register_subtree_array(ett_link_array, array_length(ett_link_array)); @@ -7386,6 +7388,12 @@ void proto_reg_handoff_infiniband(void) eth_handle = find_dissector("eth"); ethertype_dissector_table = find_dissector_table("ethertype"); + /* announce an anonymous Infiniband dissector */ + dissector_add_uint("erf.types.type", ERF_TYPE_INFINIBAND, ib_handle); + + /* announce an anonymous Infiniband dissector */ + dissector_add_uint("erf.types.type", ERF_TYPE_INFINIBAND_LINK, ib_link_handle); + /* create and announce an anonymous RoCE dissector */ roce_handle = create_dissector_handle(dissect_roce, proto_infiniband); dissector_add_uint("ethertype", ETHERTYPE_ROCE, roce_handle); diff --git a/epan/dissectors/packet-ip.c b/epan/dissectors/packet-ip.c index 5fedb0b4cb..181e49e7f0 100644 --- a/epan/dissectors/packet-ip.c +++ b/epan/dissectors/packet-ip.c @@ -50,6 +50,7 @@ #include #include #include +#include #include "packet-ip.h" @@ -3104,6 +3105,7 @@ proto_reg_handoff_ip(void) data_handle = find_dissector("data"); dissector_add_uint("ethertype", ETHERTYPE_IP, ip_handle); + dissector_add_uint("erf.types.type", ERF_TYPE_IPV4, ip_handle); dissector_add_uint("ppp.protocol", PPP_IP, ip_handle); dissector_add_uint("ppp.protocol", ETHERTYPE_IP, ip_handle); dissector_add_uint("gre.proto", ETHERTYPE_IP, ip_handle); diff --git a/epan/dissectors/packet-ipv6.c b/epan/dissectors/packet-ipv6.c index 3857f465b5..c28035a90e 100644 --- a/epan/dissectors/packet-ipv6.c +++ b/epan/dissectors/packet-ipv6.c @@ -47,6 +47,7 @@ #include #include #include +#include #include "packet-ipv6.h" #include "packet-ip.h" @@ -2985,6 +2986,7 @@ proto_reg_handoff_ipv6(void) data_handle = find_dissector("data"); ipv6_handle = find_dissector("ipv6"); dissector_add_uint("ethertype", ETHERTYPE_IPv6, ipv6_handle); + dissector_add_uint("erf.types.type", ERF_TYPE_IPV6, ipv6_handle); dissector_add_uint("ppp.protocol", PPP_IPV6, ipv6_handle); dissector_add_uint("ppp.protocol", ETHERTYPE_IPv6, ipv6_handle); dissector_add_uint("gre.proto", ETHERTYPE_IPv6, ipv6_handle);