diff options
-rw-r--r-- | epan/dissectors/packet-chdlc.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-ehdlc.c | 6 | ||||
-rw-r--r-- | epan/dissectors/packet-eth.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-fr.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-ip.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-l2tp.c | 143 | ||||
-rw-r--r-- | epan/dissectors/packet-l2tp.h | 12 | ||||
-rw-r--r-- | epan/dissectors/packet-lapd.c | 3 | ||||
-rw-r--r-- | epan/dissectors/packet-mp2t.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-mpls.c | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-ppp.c | 2 |
11 files changed, 81 insertions, 97 deletions
diff --git a/epan/dissectors/packet-chdlc.c b/epan/dissectors/packet-chdlc.c index c038a5ccc2..f6214b9271 100644 --- a/epan/dissectors/packet-chdlc.c +++ b/epan/dissectors/packet-chdlc.c @@ -33,6 +33,7 @@ #include "packet-ppp.h" #include "packet-ip.h" #include "packet-juniper.h" +#include "packet-l2tp.h" #include <epan/expert.h> /* @@ -259,6 +260,7 @@ proto_reg_handoff_chdlc(void) dissector_add_uint("wtap_encap", WTAP_ENCAP_CHDLC, chdlc_handle); dissector_add_uint("wtap_encap", WTAP_ENCAP_CHDLC_WITH_PHDR, chdlc_handle); dissector_add_uint("juniper.proto", JUNIPER_PROTO_CHDLC, chdlc_handle); + dissector_add_uint("l2tp.pw_type", L2TPv3_PROTOCOL_CHDLC, chdlc_handle); } diff --git a/epan/dissectors/packet-ehdlc.c b/epan/dissectors/packet-ehdlc.c index 44f5a190b8..e16d2fa840 100644 --- a/epan/dissectors/packet-ehdlc.c +++ b/epan/dissectors/packet-ehdlc.c @@ -30,6 +30,7 @@ #include <epan/packet.h> #include <epan/xdlc.h> +#include "packet-l2tp.h" void proto_register_ehdlc(void); void proto_reg_handoff_ehdlc(void); @@ -317,9 +318,14 @@ proto_register_ehdlc(void) void proto_reg_handoff_ehdlc(void) { + dissector_handle_t ehdlc_handle; + sub_handles[SUB_RSL] = find_dissector("gsm_abis_rsl"); sub_handles[SUB_OML] = find_dissector("gsm_abis_oml"); sub_handles[SUB_DATA] = find_dissector("data"); + + ehdlc_handle = create_dissector_handle( dissect_ehdlc, proto_ehdlc ); + dissector_add_uint("l2tp.pw_type", L2TPv3_PROTOCOL_ERICSSON, ehdlc_handle); } /* diff --git a/epan/dissectors/packet-eth.c b/epan/dissectors/packet-eth.c index 8fbe22caa0..36d7eb5558 100644 --- a/epan/dissectors/packet-eth.c +++ b/epan/dissectors/packet-eth.c @@ -39,6 +39,7 @@ #include "packet-sll.h" #include "packet-juniper.h" #include "packet-sflow.h" +#include "packet-l2tp.h" #include <epan/crc32-tvb.h> #include <wiretap/erf.h> @@ -1039,6 +1040,7 @@ proto_reg_handoff_eth(void) dissector_add_uint("gre.proto", ETHERTYPE_ETHBRIDGE, eth_withoutfcs_handle); dissector_add_uint("juniper.proto", JUNIPER_PROTO_ETHER, eth_withoutfcs_handle); dissector_add_uint("sflow_245.header_protocol", SFLOW_245_HEADER_ETHERNET, eth_withoutfcs_handle); + dissector_add_uint("l2tp.pw_type", L2TPv3_PROTOCOL_ETH, eth_withoutfcs_handle); dissector_add_uint("sll.ltype", LINUX_SLL_P_ETHERNET, eth_withoutfcs_handle); diff --git a/epan/dissectors/packet-fr.c b/epan/dissectors/packet-fr.c index 084564a406..234d59dd7f 100644 --- a/epan/dissectors/packet-fr.c +++ b/epan/dissectors/packet-fr.c @@ -48,6 +48,7 @@ #include "packet-fr.h" #include "packet-juniper.h" #include "packet-sflow.h" +#include "packet-l2tp.h" #include <epan/xdlc.h> #include <epan/etypes.h> #include <epan/oui.h> @@ -1010,6 +1011,7 @@ proto_reg_handoff_fr(void) dissector_add_uint("juniper.proto", JUNIPER_PROTO_FRELAY, fr_handle); dissector_add_uint("sflow_245.header_protocol", SFLOW_245_HEADER_FRAME_RELAY, fr_handle); dissector_add_uint("atm.aal5.type", TRAF_FR, fr_handle); + dissector_add_uint("l2tp.pw_type", L2TPv3_PROTOCOL_FR, fr_handle); fr_phdr_handle = create_dissector_handle(dissect_fr_phdr, proto_fr); dissector_add_uint("wtap_encap", WTAP_ENCAP_FRELAY_WITH_PHDR, fr_phdr_handle); diff --git a/epan/dissectors/packet-ip.c b/epan/dissectors/packet-ip.c index 5a785207ad..aeabdd7e18 100644 --- a/epan/dissectors/packet-ip.c +++ b/epan/dissectors/packet-ip.c @@ -51,6 +51,7 @@ #include "packet-juniper.h" #include "packet-sflow.h" #include "packet-gre.h" +#include "packet-l2tp.h" #ifdef HAVE_GEOIP #include <GeoIP.h> @@ -3135,6 +3136,7 @@ proto_reg_handoff_ip(void) dissector_add_uint("juniper.proto", JUNIPER_PROTO_MPLS_IP, ip_handle); dissector_add_uint("pwach.channel_type", 0x21, ip_handle); /* IPv4, RFC4385 clause 6. */ dissector_add_uint("sflow_245.header_protocol", SFLOW_245_HEADER_IPv4, ip_handle); + dissector_add_uint("l2tp.pw_type", L2TPv3_PROTOCOL_IP, ip_handle); dissector_add_for_decode_as("udp.port", ip_handle); dissector_add_uint("wtap_encap", WTAP_ENCAP_RAW_IP4, ip_handle); diff --git a/epan/dissectors/packet-l2tp.c b/epan/dissectors/packet-l2tp.c index e506809315..3ec831de67 100644 --- a/epan/dissectors/packet-l2tp.c +++ b/epan/dissectors/packet-l2tp.c @@ -60,6 +60,7 @@ #include <epan/prefs.h> #include <epan/conversation.h> #include <epan/expert.h> +#include <epan/decode_as.h> #include <wsutil/md5.h> #include <wsutil/sha1.h> @@ -207,6 +208,7 @@ static int hf_l2tp_zero_length_bit_message = -1; static int hf_l2tp_offset_padding = -1; static dissector_table_t l2tp_vendor_avp_dissector_table; +static dissector_table_t pw_type_table; #define UDP_PORT_L2TP 1701 @@ -251,36 +253,8 @@ static const enum_val_t l2tpv3_cookies[] = { }; #define L2TPv3_COOKIE_DEFAULT 0 - -#define L2TPv3_PROTOCOL_ETH 0 -#define L2TPv3_PROTOCOL_CHDLC 1 -#define L2TPv3_PROTOCOL_FR 2 -#define L2TPv3_PROTOCOL_PPP 3 -#define L2TPv3_PROTOCOL_IP 4 -#define L2TPv3_PROTOCOL_MPLS 5 -#define L2TPv3_PROTOCOL_AAL5 6 -#define L2TPv3_PROTOCOL_LAPD 7 -#define L2TPv3_PROTOCOL_DOCSIS_DMPT 8 -#define L2TPv3_PROTOCOL_ERICSSON 9 -#define L2TPv3_PROTOCOL_MAX (L2TPv3_PROTOCOL_ERICSSON + 1) - #define L2TPv3_PROTOCOL_DEFAULT L2TPv3_PROTOCOL_CHDLC -static const enum_val_t l2tpv3_protocols[] = { - {"detect", "Detect", -1}, - {"eth", "Ethernet", L2TPv3_PROTOCOL_ETH}, - {"chdlc", "Cisco HDLC", L2TPv3_PROTOCOL_CHDLC}, - {"fr", "Frame Relay", L2TPv3_PROTOCOL_FR}, - {"ppp", "PPP", L2TPv3_PROTOCOL_PPP}, - {"ip", "IP", L2TPv3_PROTOCOL_IP}, - {"mpls", "MPLS", L2TPv3_PROTOCOL_MPLS}, - {"aal5", "AAL5", L2TPv3_PROTOCOL_AAL5}, - {"lapd", "LAPD", L2TPv3_PROTOCOL_LAPD}, - {"docsis-dmpt", "DOCSIS-DMPT", L2TPv3_PROTOCOL_DOCSIS_DMPT}, - {"ehdlc", "Ericsson HDLC", L2TPv3_PROTOCOL_ERICSSON}, - {NULL, NULL, 0} -}; - #define L2TPv3_L2_SPECIFIC_NONE 0 #define L2TPv3_L2_SPECIFIC_DEFAULT 1 #define L2TPv3_L2_SPECIFIC_ATM 2 @@ -299,7 +273,6 @@ static const enum_val_t l2tpv3_l2_specifics[] = { }; static gint l2tpv3_cookie = -1; -static gint l2tpv3_protocol = -1; static gint l2tpv3_l2_specific = -1; #define MESSAGE_TYPE_SCCRQ 1 @@ -770,16 +743,8 @@ static const true_false_string tfs_new_existing = { "New", "Existing" }; static dissector_handle_t ppp_hdlc_handle; static dissector_handle_t ppp_lcp_options_handle; -static dissector_handle_t eth_withoutfcs_handle; -static dissector_handle_t chdlc_handle; -static dissector_handle_t fr_handle; -static dissector_handle_t ip_handle; -static dissector_handle_t mpls_handle; static dissector_handle_t atm_oam_handle; static dissector_handle_t llc_handle; -static dissector_handle_t lapd_handle; -static dissector_handle_t mp2t_handle; -static dissector_handle_t ehdlc_handle; static dissector_handle_t data_handle; static dissector_handle_t l2tp_udp_handle; @@ -1159,7 +1124,7 @@ static l2tpv3_session_t *store_pw_type(l2tpv3_session_t *_session, int msg_type) { l2tpv3_session_t *session = _session; - gint result = l2tpv3_protocol; + gint result = -1; guint16 pw_type; switch (msg_type) { @@ -1292,6 +1257,16 @@ static void update_session(l2tpv3_tunnel_t *tunnel, l2tpv3_session_t *session) } } +static void l2tp_prompt(packet_info *pinfo _U_, gchar* result) +{ + g_snprintf(result, MAX_DECODE_AS_PROMPT_LEN, "Decode L2TPv3 packet type 0x%04x as", + GPOINTER_TO_UINT(p_get_proto_data(pinfo->pool, pinfo, proto_l2tp, 0))); +} + +static gpointer l2tp_value(packet_info *pinfo _U_) +{ + return p_get_proto_data(pinfo->pool, pinfo, proto_l2tp, 0); +} /* * Dissect CISCO AVP:s @@ -2030,13 +2005,13 @@ process_l2tpv3_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, { int idx = *pIdx; int sid; - guint8 oam_cell = 0; + guint32 oam_cell = 0; proto_tree *l2_specific = NULL; proto_item *ti = NULL; tvbuff_t *next_tvb; gint cookie_len = l2tpv3_cookie; gint l2_spec = l2tpv3_l2_specific; - gint pw_type = l2tpv3_protocol; + gint pw_type = -1; lcce_settings_t *lcce = NULL; l2tpv3_session_t *session = NULL; @@ -2162,49 +2137,11 @@ process_l2tpv3_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, break; } - switch(pw_type){ - case L2TPv3_PROTOCOL_ETH: - call_dissector(eth_withoutfcs_handle, next_tvb, pinfo, tree); - break; - case L2TPv3_PROTOCOL_CHDLC: - call_dissector(chdlc_handle, next_tvb, pinfo, tree); - break; - case L2TPv3_PROTOCOL_FR: - call_dissector(fr_handle, next_tvb, pinfo, tree); - break; - case L2TPv3_PROTOCOL_PPP: - /* - * PPP is transported without Address and Control - * fields, ppp_hdlc_handle can handle that as if if - * was ACFC (NULL Address and Control) - */ - call_dissector(ppp_hdlc_handle, next_tvb, pinfo, tree); - break; - case L2TPv3_PROTOCOL_IP: - call_dissector(ip_handle, next_tvb, pinfo, tree); - break; - case L2TPv3_PROTOCOL_MPLS: - call_dissector(mpls_handle, next_tvb, pinfo, tree); - break; - case L2TPv3_PROTOCOL_DOCSIS_DMPT: - call_dissector(mp2t_handle, next_tvb, pinfo, tree); - break; - case L2TPv3_PROTOCOL_AAL5: - if (oam_cell) { - call_dissector(atm_oam_handle, next_tvb, pinfo, tree); - } else { - call_dissector(llc_handle, next_tvb, pinfo, tree); - } - break; - case L2TPv3_PROTOCOL_LAPD: - call_dissector(lapd_handle, next_tvb, pinfo, tree); - break; - case L2TPv3_PROTOCOL_ERICSSON: - call_dissector(ehdlc_handle, next_tvb, pinfo, tree); - break; - default: + p_add_proto_data(pinfo->pool, pinfo, proto_l2tp, 0, GUINT_TO_POINTER((guint)pw_type)); + + if (!dissector_try_uint_new(pw_type_table, pw_type, next_tvb, pinfo, tree, FALSE, GUINT_TO_POINTER(oam_cell))) + { call_dissector(data_handle, next_tvb, pinfo, tree); - break; } } @@ -2709,6 +2646,19 @@ dissect_l2tp_ip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) return; } +static int dissect_atm_oam_llc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data) +{ + guint32 oam_cell = GPOINTER_TO_UINT(data); + + if (oam_cell) { + call_dissector(atm_oam_handle, tvb, pinfo, tree); + } else { + call_dissector(llc_handle, tvb, pinfo, tree); + } + + return tvb_captured_length(tvb); +} + static void init_l2tp_dissection(void) { GSList *iterator = list_heads; @@ -3039,6 +2989,12 @@ proto_register_l2tp(void) module_t *l2tp_module; expert_module_t* expert_l2tp; + /* Decode As handling */ + static build_valid_func l2tp_da_build_value[1] = {l2tp_value}; + static decode_as_value_t l2tp_da_values = {l2tp_prompt, 1, l2tp_da_build_value}; + static decode_as_t l2tp_da = {"l2tp", "L2TPv3 payload", "l2tp.pw_type", 1, 0, &l2tp_da_values, NULL, NULL, + decode_as_default_populate_list, decode_as_default_reset, decode_as_default_change, NULL}; + proto_l2tp = proto_register_protocol( "Layer 2 Tunneling Protocol", "L2TP", "l2tp"); proto_register_field_array(proto_l2tp, hf, array_length(hf)); @@ -3047,6 +3003,7 @@ proto_register_l2tp(void) expert_register_field_array(expert_l2tp, ei, array_length(ei)); l2tp_vendor_avp_dissector_table = register_dissector_table("l2tp.vendor_avp", "L2TP vendor AVP dissector table", FT_UINT32, BASE_DEC); + pw_type_table = register_dissector_table("l2tp.pw_type", "L2TPv3 payload type", FT_UINT32, BASE_DEC); l2tp_module = prefs_register_protocol(proto_l2tp, NULL); @@ -3066,24 +3023,21 @@ proto_register_l2tp(void) l2tpv3_l2_specifics, FALSE); - prefs_register_enum_preference(l2tp_module, - "protocol", - "Decode L2TPv3 packet contents as this protocol", - "Decode L2TPv3 packet contents as this protocol", - &l2tpv3_protocol, - l2tpv3_protocols, - FALSE); + prefs_register_obsolete_preference(l2tp_module, "protocol"); prefs_register_string_preference(l2tp_module,"shared_secret","Shared Secret", "Shared secret used for control message digest authentication", &shared_secret); register_init_routine(init_l2tp_dissection); + register_decode_as(&l2tp_da); } void proto_reg_handoff_l2tp(void) { + dissector_handle_t atm_oam_llc_handle; + l2tp_udp_handle = new_create_dissector_handle(dissect_l2tp_udp, proto_l2tp); dissector_add_uint("udp.port", UDP_PORT_L2TP, l2tp_udp_handle); @@ -3103,17 +3057,12 @@ proto_reg_handoff_l2tp(void) /* * Get a handle for the dissectors used in v3. */ - eth_withoutfcs_handle = find_dissector("eth_withoutfcs"); - chdlc_handle = find_dissector("chdlc"); - fr_handle = find_dissector("fr"); - ip_handle = find_dissector("ip"); - mpls_handle = find_dissector("mpls"); atm_oam_handle = find_dissector("atm_oam_cell"); llc_handle = find_dissector("llc"); - lapd_handle = find_dissector("lapd"); - mp2t_handle = find_dissector("mp2t"); - ehdlc_handle = find_dissector("ehdlc"); data_handle = find_dissector("data"); + + atm_oam_llc_handle = new_create_dissector_handle( dissect_atm_oam_llc, proto_l2tp ); + dissector_add_uint("l2tp.pw_type", L2TPv3_PROTOCOL_AAL5, atm_oam_llc_handle); } /* diff --git a/epan/dissectors/packet-l2tp.h b/epan/dissectors/packet-l2tp.h index 1feecd06d6..04fd6e9adb 100644 --- a/epan/dissectors/packet-l2tp.h +++ b/epan/dissectors/packet-l2tp.h @@ -27,4 +27,16 @@ typedef struct _l2tp_cntrl_data { int msg_type; } l2tp_cntrl_data_t; +#define L2TPv3_PROTOCOL_ETH 0 +#define L2TPv3_PROTOCOL_CHDLC 1 +#define L2TPv3_PROTOCOL_FR 2 +#define L2TPv3_PROTOCOL_PPP 3 +#define L2TPv3_PROTOCOL_IP 4 +#define L2TPv3_PROTOCOL_MPLS 5 +#define L2TPv3_PROTOCOL_AAL5 6 +#define L2TPv3_PROTOCOL_LAPD 7 +#define L2TPv3_PROTOCOL_DOCSIS_DMPT 8 +#define L2TPv3_PROTOCOL_ERICSSON 9 +#define L2TPv3_PROTOCOL_MAX (L2TPv3_PROTOCOL_ERICSSON + 1) + #endif /* __PACKET_L2TP_H__ */ diff --git a/epan/dissectors/packet-lapd.c b/epan/dissectors/packet-lapd.c index cb46863746..c8d165db36 100644 --- a/epan/dissectors/packet-lapd.c +++ b/epan/dissectors/packet-lapd.c @@ -45,6 +45,8 @@ #include <wiretap/wtap.h> #include <epan/lapd_sapi.h> #include <epan/expert.h> +#include "packet-l2tp.h" + void proto_register_lapd(void); static int proto_lapd = -1; @@ -740,6 +742,7 @@ proto_reg_handoff_lapd(void) lapd_handle = find_dissector("lapd"); dissector_add_uint("wtap_encap", WTAP_ENCAP_LINUX_LAPD, lapd_handle); dissector_add_uint("wtap_encap", WTAP_ENCAP_LAPD, lapd_handle); + dissector_add_uint("l2tp.pw_type", L2TPv3_PROTOCOL_LAPD, lapd_handle); register_dissector("lapd-bitstream", dissect_lapd_bitstream, proto_lapd); lapd_bitstream_handle = find_dissector("lapd-bitstream"); diff --git a/epan/dissectors/packet-mp2t.c b/epan/dissectors/packet-mp2t.c index b8a5c8ba86..9f423418aa 100644 --- a/epan/dissectors/packet-mp2t.c +++ b/epan/dissectors/packet-mp2t.c @@ -35,6 +35,7 @@ #include <epan/expert.h> #include <epan/reassemble.h> #include <epan/address_types.h> +#include "packet-l2tp.h" #include <epan/tvbuff-int.h> /* XXX, for tvb_new_proxy() */ @@ -1537,6 +1538,7 @@ proto_reg_handoff_mp2t(void) dissector_add_for_decode_as("udp.port", mp2t_handle); heur_dissector_add("usb.bulk", heur_dissect_mp2t, proto_mp2t); dissector_add_uint("wtap_encap", WTAP_ENCAP_MPEG_2_TS, mp2t_handle); + dissector_add_uint("l2tp.pw_type", L2TPv3_PROTOCOL_DOCSIS_DMPT, mp2t_handle); docsis_handle = find_dissector("docsis"); mpeg_pes_handle = find_dissector("mpeg-pes"); diff --git a/epan/dissectors/packet-mpls.c b/epan/dissectors/packet-mpls.c index 86265052a0..87aa63245c 100644 --- a/epan/dissectors/packet-mpls.c +++ b/epan/dissectors/packet-mpls.c @@ -65,6 +65,7 @@ #include "packet-bfd.h" #include "packet-juniper.h" #include "packet-sflow.h" +#include "packet-l2tp.h" void proto_register_mpls(void); void proto_reg_handoff_mpls(void); @@ -642,6 +643,7 @@ proto_reg_handoff_mpls(void) dissector_add_uint("juniper.proto", JUNIPER_PROTO_CLNP_MPLS, mpls_handle); dissector_add_for_decode_as("pwach.channel_type", mpls_handle); dissector_add_uint("sflow_245.header_protocol", SFLOW_245_HEADER_MPLS, mpls_handle); + dissector_add_uint("l2tp.pw_type", L2TPv3_PROTOCOL_MPLS, mpls_handle); dissector_add_uint("udp.port", UDP_PORT_MPLS_OVER_UDP, mpls_handle); mpls_pwcw_handle = create_dissector_handle( dissect_pw_mcw, proto_pw_mcw ); diff --git a/epan/dissectors/packet-ppp.c b/epan/dissectors/packet-ppp.c index 74c2f6ef05..bae54ceba5 100644 --- a/epan/dissectors/packet-ppp.c +++ b/epan/dissectors/packet-ppp.c @@ -46,6 +46,7 @@ #include "packet-sll.h" #include "packet-juniper.h" #include "packet-sflow.h" +#include "packet-l2tp.h" void proto_register_ppp_raw_hdlc(void); void proto_reg_handoff_ppp_raw_hdlc(void); @@ -5458,6 +5459,7 @@ proto_reg_handoff_ppp(void) dissector_add_uint("gre.proto", ETHERTYPE_PPP, ppp_hdlc_handle); dissector_add_uint("juniper.proto", JUNIPER_PROTO_PPP, ppp_handle); dissector_add_uint("sflow_245.header_protocol", SFLOW_245_HEADER_PPP, ppp_hdlc_handle); + dissector_add_uint("l2tp.pw_type", L2TPv3_PROTOCOL_PPP, ppp_hdlc_handle); } void |