diff options
author | Uli Heilmeier <uh@heilmeier.eu> | 2017-04-01 22:48:33 +0200 |
---|---|---|
committer | Michael Mann <mmann78@netscape.net> | 2017-04-08 14:33:12 +0000 |
commit | 6d204e51520d3b5013e5acf319eb01cef6fab0a3 (patch) | |
tree | 40016d5593ee3b601eaab1f23972b88c14928d48 | |
parent | 029c38d3fc3cdeb907c11db69992a820e6624e13 (diff) |
ANCP: Update to RFC6320
Updates ANCP dissector to final RFC6320.
Additional updates types and codes to current IANA registry values:
https://www.iana.org/assignments/ancp/ancp.xhtml
Bug: 13532
Change-Id: I15d3e66e049d425350a528d04d4a5ff24d9b26bd
Reviewed-on: https://code.wireshark.org/review/20964
Reviewed-by: Michael Mann <mmann78@netscape.net>
-rw-r--r-- | epan/dissectors/packet-ancp.c | 313 |
1 files changed, 228 insertions, 85 deletions
diff --git a/epan/dissectors/packet-ancp.c b/epan/dissectors/packet-ancp.c index 69674fb2ef..614ffc6dd5 100644 --- a/epan/dissectors/packet-ancp.c +++ b/epan/dissectors/packet-ancp.c @@ -5,8 +5,11 @@ * More info on the protocol can be found on IETF: * http://tools.ietf.org/wg/ancp/ * http://tools.ietf.org/html/draft-ietf-ancp-protocol-09 + * https://tools.ietf.org/html/rfc6320 + * https://www.iana.org/assignments/ancp/ancp.xhtml * * Copyright 2010, Aniruddha.A (anira@cisco.com) + * Uli Heilmeier, 2017; Update to RFC6320; current IANA registry types * * Wireshark - Network traffic analyzer * By Gerald Combs <gerald@wireshark.org> @@ -38,6 +41,7 @@ #define ANCP_MIN_HDR 4 #define ANCP_GSMP_ETHER_TYPE 0x880C #define TECH_TYPE_DSL 0x5 +#define TECH_TYPE_PON 0x1 #define ANCP_RESULT_MASK 0xF0 #define ANCP_CODE_MASK 0x0FFF @@ -49,6 +53,9 @@ #define ANCP_MTYPE_PORT_MGMT 32 #define ANCP_MTYPE_PORT_UP 80 #define ANCP_MTYPE_PORT_DN 81 +#define ANCP_MTYPE_ADJ_UPD 85 +#define ANCP_MTYPE_GEN_RSP 91 +#define ANCP_MTYPE_PROV 93 /* Topology Discovery Extensions */ #define TLV_DSL_LINE_ATTRIBUTES 0x04 @@ -70,6 +77,7 @@ void proto_register_ancp(void); void proto_reg_handoff_ancp(void); static int hf_ancp_len = -1; +static int hf_ancp_len2 = -1; static int hf_ancp_ver = -1; static int hf_ancp_mtype = -1; static int hf_ancp_timer = -1; @@ -91,6 +99,10 @@ static int hf_ancp_code = -1; static int hf_ancp_trans_id = -1; static int hf_ancp_i_flag = -1; static int hf_ancp_submsg_num = -1; +static int hf_ancp_pudm_unused = -1; +static int hf_ancp_function = -1; +static int hf_ancp_x_function = -1; +static int hf_ancp_ext_flags_res = -1; static int hf_ancp_port = -1; static int hf_ancp_port_sess_num = -1; static int hf_ancp_evt_seq_num = -1; @@ -99,7 +111,9 @@ static int hf_ancp_reserved = -1; static int hf_ancp_blk_len = -1; static int hf_ancp_num_ext_tlvs = -1; static int hf_ancp_ext_tlv_type = -1; +static int hf_ancp_ext_tlv_len = -1; static int hf_ancp_dsl_line_stlv_type = -1; +static int hf_ancp_dsl_line_stlv_len = -1; static int hf_ancp_dsl_line_stlv_value = -1; static int hf_ancp_ext_tlv_value_str = -1; static int hf_ancp_oam_opaque = -1; @@ -166,6 +180,9 @@ static const value_string mtype_names[] = { { 32, "Port-Management" }, { 80, "Port-Up" }, { 81, "Port-Down" }, + { 85, "Adjacency Update" }, + { 91, "Generic Response" }, + { 93, "Provisioning" }, { 0, NULL } }; @@ -194,23 +211,33 @@ static const value_string resulttype_names[] = { { 0, NULL } }; -static const value_string codetype_names[] = { /* For now, these are OAM codes*/ - { 0x500, "Access-line-doesn't-exist" }, - { 0x501, "Loopback-Test-Timeout" }, +static const value_string codetype_names[] = { + { 0x000, "No result" }, + { 0x002, "Invalid request message" }, + { 0x006, "One or more of the specified ports are down" }, + { 0x013, "Out of resources" }, + { 0x051, "Request message type not implemented" }, + { 0x053, "Malformed message" }, + { 0x054, "Mandatory TLV missing" }, + { 0x055, "Invalid TLV contents" }, + { 0x500, "One or more of the specified ports do not exist" }, + { 0x501, "Loopback test timed out" }, { 0x502, "Reserved" }, - { 0x503, "DSL-line-status-showtime" }, - { 0x504, "DSL-line-status-idle" }, - { 0x505, "DSL-line-status-silent" }, - { 0x506, "DSL-line-status-training" }, - { 0x507, "DSL-line-integrity-error" }, - { 0x508, "DSLAM resource-unavailable" }, - { 0x509, "Invalid Test Parameter" }, + { 0x503, "DSL access line status showtime" }, + { 0x504, "DSL access line status idle" }, + { 0x505, "DSL access line status silent" }, + { 0x506, "DSL access line status training" }, + { 0x507, "DSL access line integrity error" }, + { 0x508, "DSLAM resource not available" }, + { 0x509, "Invalid test parameter" }, { 0, NULL } }; static const value_string techtype_str[] = { + { 0x00, "Not technology dependent" }, { 0x01, "PON" }, { 0x05, "DSL" }, + { 0xFF, "Reserved" }, { 0, NULL } }; @@ -273,74 +300,73 @@ static const value_string dsl_line_state_names[] = { { 0, NULL } }; +static const value_string function_names[] = { + { 0, "Reserved" }, + { 8, "Configure Connection Service Data" }, + { 9, "Remote Loopback" }, + { 0, NULL } +}; + static const value_string ext_tlv_types[] = { - { 0x01, "Access-Loop-Circuit-ID" }, - { 0x02, "Access-Loop-Remote-ID" }, - { 0x03, "Access-Aggregation-Circuit-ID-ASCII" }, - { 0x04, "DSL Line Attributes" }, - { 0x06, "Access-Aggregation-Circuit-ID-Binary" }, - { 0x07, "OAM-Loopback-Test-Parameters" }, - { 0x08, "Opaque-Data" }, - { 0x09, "OAM-Loopback-Test-Response-String" }, + { 0x0001, "Access-Loop-Circuit-ID" }, + { 0x0002, "Access-Loop-Remote-ID" }, + { 0x0003, "Access-Aggregation-Circuit-ID-ASCII" }, + { 0x0004, "DSL Line Attributes" }, + { 0x0005, "Service-Profile-Name" }, + { 0x0006, "Access-Aggregation-Circuit-ID-Binary" }, + { 0x0007, "OAM-Loopback-Test-Parameters" }, + { 0x0008, "Opaque-Data" }, + { 0x0009, "OAM-Loopback-Test-Response-String" }, + { 0x0011, "Command" }, + { 0x0013, "Multicast-Service-Profile" }, + { 0x0015, "Bandwidth-Allocation" }, + { 0x0016, "Bandwidth-Request" }, + { 0x0018, "Multicast-Service-Profile-Name" }, + { 0x0019, "Multicast-Flow" }, + { 0x0021, "List-Action" }, + { 0x0022, "Sequence-Number" }, + { 0x0024, "White-List-CAC" }, + { 0x0025, "MRepCtl-CAC" }, + { 0x0081, "Actual-Net-Data-Rate-Upstream" }, + { 0x0082, "Actual-Net-Data-Rate-Downstream" }, + { 0x0083, "Minimum-Net-Data-Rate-Upstream" }, + { 0x0084, "Minimum-Net-Data-Rate-Downstream" }, + { 0x0085, "Attainable-Net-Data-Rate-Upstream" }, + { 0x0086, "Attainable-Net-Data-Rate-Downstream" }, + { 0x0087, "Maximum-Net-Data-Rate-Upstream" }, + { 0x0088, "Maximum-Net-Data-Rate-Downstream" }, + { 0x0089, "Minimum-Net-Low-Power-Data-Rate-Upstream" }, + { 0x008A, "Minimum-Net-Low-Power-Data-Rate-Downstream" }, + { 0x008B, "Maximum-Interleaving-Delay-Upstream" }, + { 0x008C, "Actual-Interleaving-Delay-Upstream" }, + { 0x008D, "Maximum-Interleaving-Delay-Downstream" }, + { 0x008E, "Actual-Interleaving-Delay-Downstream" }, + { 0x008F, "DSL-Line-State" }, + { 0x0090, "Access-Loop-Encapsulation" }, + { 0x0091, "DSL-Type" }, + { 0x0092, "Request-Source-IP" }, + { 0x0093, "Request-Source-MAC" }, + { 0x0094, "Report-Buffering-Time" }, + { 0x0095, "Committed-Bandwidth" }, + { 0x0096, "Request-Source-Device-Id" }, + { 0x0106, "Status-Info" }, + { 0x1000, "Target (single access line variant)" }, { 0, NULL } }; +static value_string_ext ext_tlv_types_ext = VALUE_STRING_EXT_INIT(ext_tlv_types); -static void -dissect_ancp_port_up_dn_mgmt(tvbuff_t *tvb, proto_tree *ancp_tree, gint offset) +static gint +dissect_ancp_tlv(tvbuff_t *tvb, proto_tree *tlv_tree, gint offset) { - guint8 tech_type; - - proto_tree_add_item(ancp_tree, hf_ancp_port, tvb, offset, 4, ENC_BIG_ENDIAN); - offset += 4; - - proto_tree_add_item(ancp_tree, hf_ancp_port_sess_num, tvb, offset, 4, ENC_BIG_ENDIAN); - offset += 4; - - proto_tree_add_item(ancp_tree, hf_ancp_evt_seq_num, tvb, offset, 4, ENC_BIG_ENDIAN); - offset += 4; - - proto_tree_add_item(ancp_tree, hf_ancp_label, tvb, offset, 8, ENC_BIG_ENDIAN); - offset += 8; - - /* Start of the Extension Block */ - proto_tree_add_item(ancp_tree, hf_ancp_reserved, tvb, offset, 1, ENC_BIG_ENDIAN); - offset += 1; - /* - * We have already displayed the message type in the common header dissect - * so need not display this again here - skip it - */ - offset += 1; /* Message type in Ext Blk */ - - proto_tree_add_item(ancp_tree, hf_ancp_tech_type, tvb, offset, 1, ENC_BIG_ENDIAN); - tech_type = tvb_get_guint8(tvb, offset); - offset += 1; - - proto_tree_add_item(ancp_tree, hf_ancp_blk_len, tvb, offset, 1, ENC_BIG_ENDIAN); - offset += 1; - - if (tech_type == TECH_TYPE_DSL) { - proto_item *sti; - proto_tree *tlv_tree; guint16 tlen, ttype; - gint16 num_tlvs, num_stlvs; - - proto_tree_add_item(ancp_tree, hf_ancp_num_ext_tlvs, tvb, offset, 2, ENC_BIG_ENDIAN); - num_tlvs = tvb_get_ntohs(tvb, offset); - offset += 2; + gint16 num_stlvs; + proto_item *tti; - sti = proto_tree_add_item(ancp_tree, hf_ancp_len, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_item_append_text(sti, " (Extension Block)"); - offset += 2; - - /* Create a TLV sub tree */ - tlv_tree = proto_item_add_subtree(sti, ett_ancp_len); - - for( ;num_tlvs; num_tlvs--) { proto_tree_add_item(tlv_tree, hf_ancp_ext_tlv_type, tvb, offset, 2, ENC_BIG_ENDIAN); ttype = tvb_get_ntohs(tvb, offset); offset += 2; - sti = proto_tree_add_item(tlv_tree, hf_ancp_len, tvb, offset, 2, ENC_BIG_ENDIAN); + tti = proto_tree_add_item(tlv_tree, hf_ancp_ext_tlv_len, tvb, offset, 2, ENC_BIG_ENDIAN); tlen = tvb_get_ntohs(tvb, offset); offset += 2; @@ -357,7 +383,7 @@ dissect_ancp_port_up_dn_mgmt(tvbuff_t *tvb, proto_tree *ancp_tree, gint offset) gint val; /* Create a DSL Attribute SubTree */ - dsl_tree = proto_item_add_subtree(sti, ett_ancp_ext_tlv_type); + dsl_tree = proto_item_add_subtree(tti, ett_ancp_ext_tlv_type); num_stlvs = tlen / 8; /* TODO - better way? */ for ( ;num_stlvs; num_stlvs--) { proto_tree_add_item(dsl_tree, @@ -365,11 +391,13 @@ dissect_ancp_port_up_dn_mgmt(tvbuff_t *tvb, proto_tree *ancp_tree, gint offset) 2, ENC_BIG_ENDIAN); stlvtype = tvb_get_ntohs(tvb, offset); offset += 2; - /* Skip sub-tlv-len display for now */ + proto_tree_add_item(dsl_tree, + hf_ancp_dsl_line_stlv_len, tvb, offset, + 2, ENC_BIG_ENDIAN); stlvlen = tvb_get_ntohs(tvb, offset); offset += 2; /* Sub TLV Length */ - sti = proto_tree_add_item(dsl_tree, + tti = proto_tree_add_item(dsl_tree, hf_ancp_dsl_line_stlv_value, tvb, offset, stlvlen, ENC_BIG_ENDIAN); val = tvb_get_ntohl(tvb, offset); @@ -377,19 +405,19 @@ dissect_ancp_port_up_dn_mgmt(tvbuff_t *tvb, proto_tree *ancp_tree, gint offset) switch (stlvtype) { case TLV_DSL_LINE_STATE: - proto_item_append_text(sti, " (%s)", + proto_item_append_text(tti, " (%s)", val_to_str(val, dsl_line_state_names, "Unknown (0x%02x)")); break; case TLV_DSL_TYPE: - proto_item_append_text(sti, " (%s)", + proto_item_append_text(tti, " (%s)", val_to_str(val, dsl_line_type_names, "Unknown (0x%02x)")); break; default: /* Add Unit */ - proto_item_append_text(sti, " %s", + proto_item_append_text(tti, " %s", val_to_str(stlvtype, dsl_line_attr_units, "Unknown (0x%02x)")); @@ -427,6 +455,67 @@ dissect_ancp_port_up_dn_mgmt(tvbuff_t *tvb, proto_tree *ancp_tree, gint offset) SKIPPADDING(offset, tlen); break; } /* end switch {ttype} */ + return offset; +} + +static void +dissect_ancp_port_up_dn_mgmt(tvbuff_t *tvb, proto_tree *ancp_tree, gint offset, guint8 mtype) +{ + guint8 tech_type; + gint16 num_tlvs; + proto_item *sti; + + if (mtype == ANCP_MTYPE_PORT_MGMT) { + proto_tree_add_item(ancp_tree, hf_ancp_pudm_unused, tvb, offset, 14, ENC_NA); + offset += 14; + + proto_tree_add_item(ancp_tree, hf_ancp_function, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + + proto_tree_add_item(ancp_tree, hf_ancp_x_function, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + + proto_tree_add_item(ancp_tree, hf_ancp_pudm_unused, tvb, offset, 4, ENC_NA); + offset += 4; + } else { + proto_tree_add_item(ancp_tree, hf_ancp_pudm_unused, tvb, offset, 20, ENC_NA); + offset += 20; + } + + proto_tree_add_item(ancp_tree, hf_ancp_ext_flags_res, tvb, offset, 1, ENC_NA); + offset += 1; + + proto_tree_add_item(ancp_tree, hf_ancp_mtype, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; + + if (mtype == ANCP_MTYPE_PORT_MGMT) { + proto_tree_add_item(ancp_tree, hf_ancp_reserved, tvb, offset, 2, ENC_NA); + offset += 2; + tech_type = 0; + } else { + proto_tree_add_item(ancp_tree, hf_ancp_tech_type, tvb, offset, 1, ENC_BIG_ENDIAN); + tech_type = tvb_get_guint8(tvb, offset); + offset += 1; + + proto_tree_add_item(ancp_tree, hf_ancp_reserved, tvb, offset, 1, ENC_NA); + offset += 1; + } + + proto_tree_add_item(ancp_tree, hf_ancp_num_ext_tlvs, tvb, offset, 2, ENC_BIG_ENDIAN); + num_tlvs = tvb_get_ntohs(tvb, offset); + offset += 2; + + sti = proto_tree_add_item(ancp_tree, hf_ancp_blk_len, tvb, offset, 2, ENC_BIG_ENDIAN); + offset += 2; + + if (tech_type == TECH_TYPE_DSL || tech_type == TECH_TYPE_PON) { + proto_tree *tlv_tree; + + /* Create a TLV sub tree */ + tlv_tree = proto_item_add_subtree(sti, ett_ancp_len); + + for( ;num_tlvs; num_tlvs--) { + offset = dissect_ancp_tlv(tvb, tlv_tree, offset); } /* end for {numtlvs} */ } /* end if {DSL} */ } @@ -486,7 +575,7 @@ dissect_ancp_adj_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ancp_tree, proto_tree_add_item(ancp_tree, hf_ancp_receiver_instance, tvb, offset, 3, ENC_BIG_ENDIAN); offset += 3; - proto_tree_add_item(ancp_tree, hf_ancp_tech_type, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_item(ancp_tree, hf_ancp_reserved, tvb, offset, 1, ENC_NA); offset += 1; sti = proto_tree_add_item(ancp_tree, hf_ancp_num_tlvs, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -545,8 +634,11 @@ dissect_ancp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* struct ancp_tap_t *ancp_info; proto_item *ti; proto_item *sti; + proto_item *tti; proto_tree *ancp_tree; + proto_tree *tlv_tree; guint8 byte; + guint16 len; offset = 0; if (tvb_get_ntohs(tvb, offset) != ANCP_GSMP_ETHER_TYPE) @@ -568,6 +660,7 @@ dissect_ancp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* offset = 2; /* skip ether type */ proto_tree_add_item(ancp_tree, hf_ancp_len, tvb, offset, 2, ENC_BIG_ENDIAN); + len = tvb_get_ntohs(tvb, offset); offset += 2; sti = proto_tree_add_item(ancp_tree, hf_ancp_ver, tvb, offset, 1, ENC_BIG_ENDIAN); @@ -603,15 +696,12 @@ dissect_ancp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* proto_tree_add_item(ancp_tree, hf_ancp_i_flag, tvb, offset, 1, ENC_BIG_ENDIAN); /* treat as 1B, but don't change offset */ - sti = proto_tree_add_item(ancp_tree, hf_ancp_submsg_num, tvb, + proto_tree_add_item(ancp_tree, hf_ancp_submsg_num, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; - /* - * Lets not display the 'Length' field now, it is anyway same - * as GSMP Length - * which we have already displayed at the start of the dissect - */ + tti = proto_tree_add_item(ancp_tree, hf_ancp_len2, tvb, offset, + 2, ENC_BIG_ENDIAN); offset += 2; /* Length */ } @@ -624,7 +714,18 @@ dissect_ancp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* case ANCP_MTYPE_PORT_MGMT: /* FALL THRU */ case ANCP_MTYPE_PORT_UP: - dissect_ancp_port_up_dn_mgmt(tvb, ancp_tree, offset); + dissect_ancp_port_up_dn_mgmt(tvb, ancp_tree, offset, mtype); + break; + case ANCP_MTYPE_PROV: + /* FALL THRU */ + case ANCP_MTYPE_GEN_RSP: + tlv_tree = proto_item_add_subtree(tti, ett_ancp_len); + + while( offset < len + 4) { + offset = dissect_ancp_tlv(tvb, tlv_tree, offset); + } + break; + case ANCP_MTYPE_ADJ_UPD: break; default: proto_item_append_text(sti, " (Unknown Message %d)", mtype); @@ -660,6 +761,12 @@ proto_register_ancp(void) NULL, 0x0, NULL, HFILL } }, + { &hf_ancp_len2, + { "Length", "ancp.len2", + FT_UINT16, BASE_DEC, + NULL, 0x0, + NULL, HFILL } + }, { &hf_ancp_ver, { "Version", "ancp.ver", FT_UINT8, BASE_HEX, @@ -786,6 +893,30 @@ proto_register_ancp(void) NULL, ANCP_SUBMSG_MASK, NULL, HFILL } }, + { &hf_ancp_pudm_unused, + { "Unused Bytes", "ancp.unused", + FT_BYTES, BASE_NONE, + NULL, 0x0, + NULL, HFILL } + }, + { &hf_ancp_function, + { "Function", "ancp.function", + FT_UINT8, BASE_DEC, + VALS(function_names), 0x0, + NULL, HFILL } + }, + { &hf_ancp_x_function, + { "X-Function", "ancp.x_function", + FT_UINT8, BASE_DEC, + NULL, 0x0, + NULL, HFILL } + }, + { &hf_ancp_ext_flags_res, + { "Extension Flags Reserved", "ancp.ext_flags", + FT_BYTES, BASE_NONE, + NULL, 0x0, + NULL, HFILL } + }, { &hf_ancp_port, { "Port", "ancp.port", FT_UINT32, BASE_DEC, @@ -812,13 +943,13 @@ proto_register_ancp(void) }, { &hf_ancp_reserved, { "Reserved", "ancp.reserved", - FT_UINT8, BASE_DEC, + FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_ancp_blk_len, { "Block Length", "ancp.blk_len", - FT_UINT8, BASE_DEC, + FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, @@ -829,9 +960,15 @@ proto_register_ancp(void) NULL, HFILL } }, { &hf_ancp_ext_tlv_type, - { "TLV", "ancp.ext_tlv.type", + { "TLV Type", "ancp.ext_tlv.type", + FT_UINT16, BASE_DEC|BASE_EXT_STRING, + &ext_tlv_types_ext, 0x0, + NULL, HFILL } + }, + { &hf_ancp_ext_tlv_len, + { "TLV Length", "ancp.ext_tlv.len", FT_UINT16, BASE_DEC, - VALS(ext_tlv_types), 0x0, + NULL, 0x0, NULL, HFILL } }, { &hf_ancp_dsl_line_stlv_type, @@ -840,6 +977,12 @@ proto_register_ancp(void) VALS(dsl_line_attrs), 0x0, NULL, HFILL } }, + { &hf_ancp_dsl_line_stlv_len, + { "Sub-TLV Length", "ancp.sub_tlv_len", + FT_UINT16, BASE_DEC, + NULL, 0x0, + NULL, HFILL } + }, { &hf_ancp_dsl_line_stlv_value, { "Value", "ancp.dsl_line_param", FT_UINT32, BASE_DEC, |