From 656cbdfe4a4503de01137c0734ce181c69d20e44 Mon Sep 17 00:00:00 2001 From: Uli Heilmeier Date: Wed, 2 Mar 2016 16:45:02 +0100 Subject: L2TP: Additional AVPs from RFC 5515 This commit adds additional AVPs from RFC 5515 to L2TP. Bug: 12208 Change-Id: I389342d05375a41ae834197978e9babab9b7b674 Reviewed-on: https://code.wireshark.org/review/14290 Reviewed-by: Michael Mann Petri-Dish: Michael Mann Tested-by: Petri Dish Buildbot Reviewed-by: Alexis La Goutte --- epan/dissectors/packet-l2tp.c | 157 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 146 insertions(+), 11 deletions(-) (limited to 'epan') diff --git a/epan/dissectors/packet-l2tp.c b/epan/dissectors/packet-l2tp.c index 6d4deaee2e..f578caa816 100644 --- a/epan/dissectors/packet-l2tp.c +++ b/epan/dissectors/packet-l2tp.c @@ -143,9 +143,19 @@ static int hf_l2tp_broadband_actual_interleaving_delay_up = -1; static int hf_l2tp_broadband_maximum_interleaving_delay_down = -1; static int hf_l2tp_broadband_actual_interleaving_delay_down = -1; static int hf_l2tp_broadband_access_loop_encapsulation = -1; +static int hf_l2tp_broadband_access_loop_encapsulation_data_link = -1; +static int hf_l2tp_broadband_access_loop_encapsulation_enc1 = -1; +static int hf_l2tp_broadband_access_loop_encapsulation_enc2 = -1; static int hf_l2tp_broadband_ancp_access_line_type = -1; static int hf_l2tp_broadband_iwf_session = -1; - +static int hf_l2tp_avp_csu = -1; +static int hf_l2tp_avp_csu_res = -1; +static int hf_l2tp_avp_csu_remote_session_id_v2 = -1; +static int hf_l2tp_avp_csu_current_tx_speed_v2 = -1; +static int hf_l2tp_avp_csu_current_rx_speed_v2 = -1; +static int hf_l2tp_avp_csu_remote_session_id_v3 = -1; +static int hf_l2tp_avp_csu_current_tx_speed_v3 = -1; +static int hf_l2tp_avp_csu_current_rx_speed_v3 = -1; /* Generated from convert_proto_tree_add_text.pl */ static int hf_l2tp_cisco_pw_type = -1; @@ -261,8 +271,10 @@ static gint ett_l2tp = -1; static gint ett_l2tp_ctrl = -1; static gint ett_l2tp_avp = -1; static gint ett_l2tp_avp_sub = -1; +static gint ett_l2tp_ale_sub = -1; static gint ett_l2tp_lcp = -1; static gint ett_l2tp_l2_spec = -1; +static gint ett_l2tp_csu = -1; static expert_field ei_l2tp_incorrect_digest = EI_INIT; /* Generated from convert_proto_tree_add_text.pl */ @@ -327,6 +339,8 @@ static gint l2tpv3_l2_specific = -1; #define MESSAGE_TYPE_MSE 25 #define MESSAGE_TYPE_MSI 26 #define MESSAGE_TYPE_MSEN 27 +#define MESSAGE_TYPE_CSUN 28 +#define MESSAGE_TYPE_CSURQ 29 static const value_string message_type_vals[] = { { MESSAGE_TYPE_SCCRQ, "Start_Control_Request" }, @@ -358,6 +372,8 @@ static const value_string message_type_vals[] = { { MESSAGE_TYPE_MSE, "Multicast-Session-Establishment" }, { MESSAGE_TYPE_MSI, "Multicast-Session-Information" }, { MESSAGE_TYPE_MSEN, "Multicast-Session-End-Notify" }, + { MESSAGE_TYPE_CSUN, "Connect-Speed-Update-Notification" }, + { MESSAGE_TYPE_CSURQ, "Connect-Speed-Update-Request" }, { 0, NULL }, }; static value_string_ext message_type_vals_ext = VALUE_STRING_EXT_INIT(message_type_vals); @@ -392,6 +408,8 @@ static const value_string l2tp_message_type_short_str_vals[] = { { MESSAGE_TYPE_MSE, "MSE" }, { MESSAGE_TYPE_MSI, "MSI" }, { MESSAGE_TYPE_MSEN, "MSEN" }, + { MESSAGE_TYPE_CSUN, "CSUN" }, + { MESSAGE_TYPE_CSURQ, "CSURQ" }, { 0, NULL }, }; static value_string_ext l2tp_message_type_short_str_vals_ext = VALUE_STRING_EXT_INIT(l2tp_message_type_short_str_vals); @@ -579,6 +597,7 @@ static const value_string error_code_vals[] = { #define CTL_MSG_AUTH_NONCE 73 #define TX_CONNECT_SPEED_V3 74 #define RX_CONNECT_SPEED_V3 75 +#define CONNECT_SPEED_UPDATE 97 /* http://www.iana.org/assignments/l2tp-parameters/l2tp-parameters.xhtml */ #define NUM_AVP_TYPES 102 @@ -663,7 +682,7 @@ static const value_string avp_type_vals[] = { { 94, "Maximum Receive Unit (MRU)" }, /*[RFC4623] */ { 95, "Maximum Reassembled Receive Unit (MRRU)" }, /*[RFC4623] */ { 96, "VCCV Capability" }, /*[RFC5085] */ - { 97, "Connect Speed Update" }, /*[RFC5515] */ + { CONNECT_SPEED_UPDATE, "Connect Speed Update" }, /*[RFC5515] */ { 98, "Connect Speed Update Enable" }, /*[RFC5515] */ { 99, "TDM Pseudowire" }, /*[RFC5611] */ { 100, "RTP AVP" }, /*[RFC5611] */ @@ -807,6 +826,49 @@ static const value_string pw_types_vals[] = { { 0, NULL }, }; +static const value_string ale_datalink_types_vals[] = { + { 0x00, "ATM AAL5" }, + { 0x01, "Ethernet" }, + { 0, NULL }, +}; + +static const value_string ale_enc1_types_vals[] = { + { 0x00, "NA - Not Available" }, + { 0x01, "Untagged Ethernet" }, + { 0x02, "Single-Tagged Ethernet" }, + { 0, NULL }, +}; + +static const value_string ale_enc2_types_vals[] = { + { 0x00, "NA - Not Available" }, + { 0x01, "PPPoA LLC" }, + { 0x02, "PPPoA Null" }, + { 0x03, "IP over ATM (IPoA) LLC" }, + { 0x04, "IPoA Null" }, + { 0x05, "Ethernet over AAL5 LLC with Frame Check Sequence (FCS)" }, + { 0x06, "Ethernet over AAL5 LLC without FCS" }, + { 0x07, "Ethernet over AAL5 Null with FCS" }, + { 0x08, "Ethernet over AAL5 Null without FCS" }, + { 0, NULL }, +}; + +static const value_string ancp_types_vals[] = { + { 0x01, "ADSL1" }, + { 0x02, "ADSL2" }, + { 0x03, "ADSL2+" }, + { 0x04, "VDSL1" }, + { 0x05, "VDSL2" }, + { 0x06, "SDSL" }, + { 0x07, "UNKNOWN" }, + { 0, NULL }, +}; + +static const value_string iwf_types_vals[] = { + { 0x00, "IWF not performed" }, + { 0x01, "IWF performed" }, + { 0, NULL }, +}; + static const true_false_string tfs_up_down = { "Up", "Down" }; static const true_false_string tfs_new_existing = { "New", "Existing" }; @@ -1455,7 +1517,8 @@ static int dissect_l2tp_broadband_avps(tvbuff_t *tvb, packet_info *pinfo _U_, pr guint32 avp_vendor_id; guint16 avp_len; guint16 ver_len_hidden; - proto_tree *l2tp_avp_tree; + proto_tree *l2tp_avp_tree, *l2tp_avp_ale_tree; + proto_item *ta; ver_len_hidden = tvb_get_ntohs(tvb, offset); avp_len = AVP_LENGTH(ver_len_hidden); @@ -1554,15 +1617,21 @@ static int dissect_l2tp_broadband_avps(tvbuff_t *tvb, packet_info *pinfo _U_, pr break; case BROADBAND_ACCESS_LOOP_ENCAPSULATION: - proto_tree_add_item(l2tp_avp_tree, hf_l2tp_broadband_access_loop_encapsulation, tvb, offset, avp_len, ENC_NA); + { + ta = proto_tree_add_item(l2tp_avp_tree, hf_l2tp_broadband_access_loop_encapsulation, tvb, offset, avp_len, ENC_NA); + l2tp_avp_ale_tree = proto_item_add_subtree(ta, ett_l2tp_ale_sub); + proto_tree_add_item(l2tp_avp_ale_tree, hf_l2tp_broadband_access_loop_encapsulation_data_link, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(l2tp_avp_ale_tree, hf_l2tp_broadband_access_loop_encapsulation_enc1, tvb, offset+1, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(l2tp_avp_ale_tree, hf_l2tp_broadband_access_loop_encapsulation_enc1, tvb, offset+2, 1, ENC_BIG_ENDIAN); + } break; case BROADBAND_ANCP_ACCESS_LINE_TYPE: - proto_tree_add_item(l2tp_avp_tree, hf_l2tp_broadband_ancp_access_line_type, tvb, offset, avp_len, ENC_NA); + proto_tree_add_item(l2tp_avp_tree, hf_l2tp_broadband_ancp_access_line_type, tvb, offset, avp_len, ENC_BIG_ENDIAN); break; case BROADBAND_IWF_SESSION: - proto_tree_add_item(l2tp_avp_tree, hf_l2tp_broadband_iwf_session, tvb, offset, avp_len, ENC_NA); + proto_tree_add_item(l2tp_avp_tree, hf_l2tp_broadband_iwf_session, tvb, offset, avp_len, ENC_BIG_ENDIAN); break; default: @@ -1669,8 +1738,8 @@ static void process_control_avps(tvbuff_t *tvb, guint32 ccid, l2tpv3_tunnel_t *tunnel) { - proto_tree *l2tp_lcp_avp_tree, *l2tp_avp_tree = NULL, *l2tp_avp_tree_sub; - proto_item *tf, *te; + proto_tree *l2tp_lcp_avp_tree, *l2tp_avp_tree = NULL, *l2tp_avp_tree_sub, *l2tp_avp_csu_tree; + proto_item *tf, *te, *tc; int msg_type = 0; gboolean isStopCcn = FALSE; @@ -2185,6 +2254,26 @@ static void process_control_avps(tvbuff_t *tvb, } break; } + case CONNECT_SPEED_UPDATE: + { + tc = proto_tree_add_item(l2tp_avp_tree, hf_l2tp_avp_csu, tvb, idx, avp_len, ENC_NA); + l2tp_avp_csu_tree = proto_item_add_subtree(tc, ett_l2tp_csu); + if (avp_len == 12) { + /* L2TPv2 */ + proto_tree_add_item(l2tp_avp_csu_tree, hf_l2tp_avp_csu_res, tvb, idx, 2, ENC_NA); + proto_tree_add_item(l2tp_avp_csu_tree, hf_l2tp_avp_csu_remote_session_id_v2, tvb, idx+2, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(l2tp_avp_csu_tree, hf_l2tp_avp_csu_current_tx_speed_v2, tvb, idx+4, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(l2tp_avp_csu_tree, hf_l2tp_avp_csu_current_rx_speed_v2, tvb, idx+8, 4, ENC_BIG_ENDIAN); + } + else if (avp_len == 20) { + /* L2TPv3 */ + proto_tree_add_item(l2tp_avp_csu_tree, hf_l2tp_avp_csu_remote_session_id_v3, tvb, idx, 4, ENC_BIG_ENDIAN); + proto_tree_add_item(l2tp_avp_csu_tree, hf_l2tp_avp_csu_current_tx_speed_v3, tvb, idx+4, 8, ENC_BIG_ENDIAN); + proto_tree_add_item(l2tp_avp_csu_tree, hf_l2tp_avp_csu_current_rx_speed_v3, tvb, idx+12, 8, ENC_BIG_ENDIAN); + } + break; + } + default: if(avp_len>0) proto_tree_add_expert(l2tp_avp_tree, pinfo, &ei_l2tp_vendor_specific_avp_data, tvb, idx, avp_len); @@ -3163,17 +3252,61 @@ proto_register_l2tp(void) "Actual Interleaving Dalay Downstream in ms", HFILL }}, { &hf_l2tp_broadband_access_loop_encapsulation, - { "Access Loop Encapsulation", "l2tp.broadband.access_loop_encapsulation", FT_BYTES, BASE_NONE, NULL, 0x0, + { "Access Loop Encapsulation", "l2tp.broadband.access_loop_encapsulation", FT_NONE, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + + { &hf_l2tp_broadband_access_loop_encapsulation_data_link, + { "Data Link", "l2tp.broadband.access_loop_encapsulation.data_link", FT_UINT8, BASE_HEX, VALS(ale_datalink_types_vals), 0x0, + NULL, HFILL }}, + + { &hf_l2tp_broadband_access_loop_encapsulation_enc1, + { "Encaps 1", "l2tp.broadband.access_loop_encapsulation.enc1", FT_UINT8, BASE_HEX, VALS(ale_enc1_types_vals), 0x0, + NULL, HFILL }}, + + { &hf_l2tp_broadband_access_loop_encapsulation_enc2, + { "Encaps 2", "l2tp.broadband.access_loop_encapsulation.enc2", FT_UINT8, BASE_HEX, VALS(ale_enc2_types_vals), 0x0, NULL, HFILL }}, { &hf_l2tp_broadband_ancp_access_line_type, - { "ANCP Access Line Type", "l2tp.broadband.ancp_access_line_type", FT_BYTES, BASE_NONE, NULL, 0x0, + { "ANCP Access Line Type", "l2tp.broadband.ancp_access_line_type", FT_UINT32, BASE_HEX, VALS(ancp_types_vals), 0x0, NULL, HFILL }}, { &hf_l2tp_broadband_iwf_session, - { "IWF Session", "l2tp.broadband.iwf_session", FT_BYTES, BASE_NONE, NULL, 0x0, + { "IWF Session", "l2tp.broadband.iwf_session", FT_UINT32, BASE_HEX, VALS(iwf_types_vals), 0x0, + NULL, HFILL }}, + + { &hf_l2tp_avp_csu, + { "Connect Speed Update","l2tp.avp.csu", FT_NONE, BASE_NONE, NULL, 0x0, + NULL, HFILL }}, + + { &hf_l2tp_avp_csu_res, + { "Reserved", "l2tp.avp.csu.res", FT_UINT16, BASE_HEX, NULL, 0x0, + NULL, HFILL }}, + + { &hf_l2tp_avp_csu_remote_session_id_v2, + { "Remote Session ID", "l2tp.avp.csu.res", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_l2tp_avp_csu_current_tx_speed_v2, + { "Current TX Connect Speed", "l2tp.avp.csu.current_tx_speed", FT_UINT32, BASE_DEC, NULL, 0x0, + "Current TX Connect Speed in bps", HFILL }}, + + { &hf_l2tp_avp_csu_current_rx_speed_v2, + { "Current RX Connect Speed", "l2tp.avp.csu.current_rx_speed", FT_UINT32, BASE_DEC, NULL, 0x0, + "Current RX Connect Speed in bps", HFILL }}, + + { &hf_l2tp_avp_csu_remote_session_id_v3, + { "Remote Session ID", "l2tp.avp.csu.res", FT_UINT32, BASE_HEX, NULL, 0x0, + NULL, HFILL }}, + + { &hf_l2tp_avp_csu_current_tx_speed_v3, + { "Current TX Connect Speed", "l2tp.avp.csu.current_tx_speed", FT_UINT64, BASE_DEC, NULL, 0x0, + "Current TX Connect Speed in bps", HFILL }}, + + { &hf_l2tp_avp_csu_current_rx_speed_v3, + { "Current RX Connect Speed", "l2tp.avp.csu.current_rx_speed", FT_UINT64, BASE_DEC, NULL, 0x0, + "Current RX Connect Speed in bps", HFILL }}, + /* Generated from convert_proto_tree_add_text.pl */ { &hf_l2tp_cisco_assigned_control_connection_id, { "Assigned Control Connection ID", "l2tp.cisco.assigned_control_connection_id", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_l2tp_cisco_pw_type, { "PW Type", "l2tp.cisco.pw_type", FT_UINT16, BASE_DEC, VALS(pw_types_vals), 0x0, NULL, HFILL }}, @@ -3265,8 +3398,10 @@ proto_register_l2tp(void) &ett_l2tp_ctrl, &ett_l2tp_avp, &ett_l2tp_avp_sub, + &ett_l2tp_ale_sub, &ett_l2tp_l2_spec, &ett_l2tp_lcp, + &ett_l2tp_csu, }; static ei_register_info ei[] = { -- cgit v1.2.3