diff options
author | Anders Broman <anders.broman@ericsson.com> | 2013-07-22 20:44:01 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2013-07-22 20:44:01 +0000 |
commit | 5e56e729531908980066248a322d20e77bd7cfcc (patch) | |
tree | a0b1460a2820b4f8aa58ece7e8bc1b17b3ae9e3d /epan | |
parent | e07c9fccacdcee5b4743bc4cebb6c1e969253ccd (diff) |
Dissect S6 feature list.
svn path=/trunk/; revision=50796
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-diameter.c | 18 | ||||
-rw-r--r-- | epan/dissectors/packet-diameter.h | 5 | ||||
-rw-r--r-- | epan/dissectors/packet-diameter_3gpp.c | 309 |
3 files changed, 323 insertions, 9 deletions
diff --git a/epan/dissectors/packet-diameter.c b/epan/dissectors/packet-diameter.c index 4bde5dd232..fe02def1dd 100644 --- a/epan/dissectors/packet-diameter.c +++ b/epan/dissectors/packet-diameter.c @@ -910,7 +910,6 @@ dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) value_string *cmd_vs; const char *cmd_str; guint32 cmd = tvb_get_ntoh24(tvb,5); - guint32 fourth = tvb_get_ntohl(tvb,8); guint32 hop_by_hop_id, end_to_end_id; conversation_t *conversation; diameter_conv_info_t *diameter_conv_info; @@ -919,6 +918,10 @@ dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) proto_item *it; nstime_t ns; void *pd_save; + diam_sub_dis_t *diam_sub_dis_inf = ep_new0(diam_sub_dis_t); + + + diam_sub_dis_inf->application_id = tvb_get_ntohl(tvb,8); pd_save = pinfo->private_data; col_set_str(pinfo->cinfo, COL_PROTOCOL, "DIAMETER"); @@ -967,18 +970,19 @@ dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) break; } case DIAMETER_RFC: { - /* Store the application id to be used by subdissectors */ - pinfo->private_data = &fourth; cmd_vs = (value_string *)(void *)all_cmds->data; app_item = proto_tree_add_item(diam_tree, hf_diameter_application_id, tvb, 8, 4, ENC_BIG_ENDIAN); - if (try_val_to_str(fourth, dictionary.applications) == NULL) { + /* Store the application id to be used by subdissectors */ + pinfo->private_data = diam_sub_dis_inf; + + if (try_val_to_str(diam_sub_dis_inf->application_id, dictionary.applications) == NULL) { proto_tree *tu = proto_item_add_subtree(app_item,ett_unknown); proto_item *iu = proto_tree_add_text(tu, tvb, 8, 4, "Unknown Application Id, " "if you know what this is you can add it to dictionary.xml"); expert_add_info_format(c->pinfo, iu, PI_UNDECODED, PI_WARN, - "Unknown Application Id (%u)", fourth); + "Unknown Application Id (%u)", diam_sub_dis_inf->application_id); PROTO_ITEM_SET_GENERATED(iu); } @@ -1005,8 +1009,8 @@ dissect_diameter_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) cmd, msgflags_str[((flags_bits>>4)&0x0f)], c->version_rfc ? "appl" : "vend", - val_to_str_const(fourth, c->version_rfc ? dictionary.applications : vnd_short_vs, "Unknown"), - fourth, + val_to_str_const(diam_sub_dis_inf->application_id, c->version_rfc ? dictionary.applications : vnd_short_vs, "Unknown"), + diam_sub_dis_inf->application_id, tvb_get_ntohl(tvb,12), tvb_get_ntohl(tvb,16)); diff --git a/epan/dissectors/packet-diameter.h b/epan/dissectors/packet-diameter.h index 6878764e3c..ffcc428aa7 100644 --- a/epan/dissectors/packet-diameter.h +++ b/epan/dissectors/packet-diameter.h @@ -38,3 +38,8 @@ typedef struct _diameter_req_ans_pair_t gboolean processing_request; /* TRUE if processing request, FALSE if processing answer. */ } diameter_req_ans_pair_t; +/* Info needed by AVP sub dissectors */ +typedef struct _diam_sub_dis_t { + guint32 application_id; + guint32 feature_list_id; +} diam_sub_dis_t; diff --git a/epan/dissectors/packet-diameter_3gpp.c b/epan/dissectors/packet-diameter_3gpp.c index 82bdc4f5dd..f59bb3e715 100644 --- a/epan/dissectors/packet-diameter_3gpp.c +++ b/epan/dissectors/packet-diameter_3gpp.c @@ -35,6 +35,7 @@ #include <epan/packet.h> #include <epan/asn1.h> +#include "packet-diameter.h" #include "packet-gsm_map.h" #include "packet-gsm_a_common.h" #include "packet-e164.h" @@ -63,6 +64,40 @@ static int hf_diameter_3gpp_feature_list_flags = -1; static int hf_diameter_3gpp_feature_list_flags_bit0 = -1; static int hf_diameter_3gpp_feature_list_flags_bit1 = -1; static int hf_diameter_3gpp_feature_list_flags_bit2 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit0 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit1 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit2 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit3 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit4 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit5 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit6 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit7 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit8 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit9 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit10 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit11 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit12 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit13 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit14 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit15 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit16 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit17 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit18 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit19 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit20 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit21 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit22 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit23 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit24 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit25 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit26 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit27 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit28 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit29 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit30 = -1; +static int hf_diameter_3gpp_feature_list1_s6a_flags_bit31 = -1; +static int hf_diameter_3gpp_feature_list2_s6a_flags_bit0 = -1; +static int hf_diameter_3gpp_feature_list2_s6a_flags_bit1 = -1; static int hf_diameter_3gpp_ulr_flags = -1; static int hf_diameter_3gpp_ulr_flags_bit0 = -1; static int hf_diameter_3gpp_ulr_flags_bit1 = -1; @@ -187,6 +222,25 @@ dissect_diameter_3gpp_visited_nw_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto return length; } + +/* AVP Code: 629 Feature-List-id + * Feature list Id is neede to dissect Feature list in S6a/S6d application + * Ref 3GPP TS 29.272 + */ + +static int +dissect_diameter_3gpp_feature_list_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void *data _U_) +{ + diam_sub_dis_t *diam_sub_dis_inf; + + if(pinfo->private_data){ + diam_sub_dis_inf = (diam_sub_dis_t*)pinfo->private_data; + diam_sub_dis_inf->feature_list_id = tvb_get_ntohl(tvb,0); + } + + return 4; +} + /* AVP Code: 630 Feature-List * Interpretation depends on Application Id * imscxdx.xml @@ -199,13 +253,16 @@ dissect_diameter_3gpp_feature_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_ proto_item* item; proto_tree *sub_tree; int offset = 0; - guint32 bit_offset, application_id = 0; + guint32 bit_offset, application_id = 0, feature_list_id = 0; + diam_sub_dis_t *diam_sub_dis_inf; item = proto_tree_add_item(tree, hf_diameter_3gpp_feature_list_flags, tvb, offset, 4, ENC_BIG_ENDIAN); sub_tree = proto_item_add_subtree(item, diameter_3gpp_feature_list_ett); if(pinfo->private_data){ - application_id = *(guint32*)pinfo->private_data; + diam_sub_dis_inf = (diam_sub_dis_t*)pinfo->private_data; + application_id = diam_sub_dis_inf->application_id; + feature_list_id = diam_sub_dis_inf->feature_list_id; } bit_offset = 0; if(application_id == 16777216){ @@ -220,6 +277,80 @@ dissect_diameter_3gpp_feature_list(tvbuff_t *tvb, packet_info *pinfo _U_, proto_ bit_offset++; offset = bit_offset>>3; + }else if(application_id == 16777251){ + /* ApplicationId: 3GPP S6a/S6d */ + if(feature_list_id == 1){ + /* 3GPP TS 29.272 Table 7.3.10/1: Features of Feature-List-ID 1 used in S6a/S6d */ + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit31, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit30, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit29, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit28, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit27, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit26, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit25, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit24, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit23, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit22, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit21, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit20, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit19, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit18, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit17, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit16, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit15, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit14, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit13, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit12, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit11, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit10, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit9, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit8, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit7, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit6, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit5, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit4, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit3, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit2, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list1_s6a_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + }else if(feature_list_id == 2){ + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_spare_bits, tvb, bit_offset, 30, ENC_BIG_ENDIAN); + bit_offset+=30; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list2_s6a_flags_bit1, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + bit_offset++; + proto_tree_add_bits_item(sub_tree, hf_diameter_3gpp_feature_list2_s6a_flags_bit0, tvb, bit_offset, 1, ENC_BIG_ENDIAN); + } } return 4; @@ -714,6 +845,9 @@ proto_reg_handoff_diameter_3gpp(void) /* AVP Code: 606 User-Data */ dissector_add_uint("diameter.3gpp", 606, new_create_dissector_handle(dissect_diameter_3gpp_user_data, proto_diameter_3gpp)); + /* AVP Code: 629 Feature-List */ + dissector_add_uint("diameter.3gpp", 629, new_create_dissector_handle(dissect_diameter_3gpp_feature_list_id, proto_diameter_3gpp)); + /* AVP Code: 630 Feature-List */ dissector_add_uint("diameter.3gpp", 630, new_create_dissector_handle(dissect_diameter_3gpp_feature_list, proto_diameter_3gpp)); @@ -876,6 +1010,177 @@ proto_register_diameter_3gpp(void) FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, NULL, HFILL } }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit0, + { "Operator Determined Barring of all Packet Oriented Services", "diameter.3gpp.feature_list1_s6a_flags_bit0", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit1, + { "Operator Determined Barring of Packet Oriented Services from access points that are within the HPLMN whilst the subscriber is roaming in a VPLMN", "diameter.3gpp.feature_list1_s6a_flags_bit1", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit2, + { "Operator Determined Barring of Packet Oriented Services from access points that are within the roamed to VPLMN", "diameter.3gpp.feature_list1_s6a_flags_bit2", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit3, + { "Operator Determined Barring of all outgoing calls", "diameter.3gpp.feature_list1_s6a_flags_bit3", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit4, + { "Operator Determined Barring of all outgoing international calls", "diameter.3gpp.feature_list1_s6a_flags_bit4", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit5, + { "Operator Determined Barring of all outgoing international calls except those directed to the home PLMN country", "diameter.3gpp.feature_list1_s6a_flags_bit5", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit6, + { "Operator Determined Barring of all outgoing inter-zonal calls", "diameter.3gpp.feature_list1_s6a_flags_bit6", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit7, + { "Operator Determined Barring of all outgoing inter-zonal calls except those directed to the home PLMN country", "diameter.3gpp.feature_list1_s6a_flags_bit7", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit8, + { "Operator Determined Barring of all outgoing international calls except those directed to the home PLMN country and Barring of all outgoing inter-zonal calls", "diameter.3gpp.feature_list1_s6a_flags_bit8", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit9, + { "Regional Subscription", "diameter.3gpp.feature_list1_s6a_flags_bit9", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit10, + { "Trace Function", "diameter.3gpp.feature_list1_s6a_flags_bit10", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit11, + { "All LCS Privacy Exception Classes", "diameter.3gpp.feature_list1_s6a_flags_bit11", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit12, + { "Allow location by any LCS client", "diameter.3gpp.feature_list1_s6a_flags_bit12", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit13, + { "Allow location by any value added LCS client to which a call/session is established from the target UE", "diameter.3gpp.feature_list1_s6a_flags_bit13", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit14, + { "Allow location by designated external value added LCS clients", "diameter.3gpp.feature_list1_s6a_flags_bit14", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit15, + { "Allow location by designated PLMN operator LCS clients", "diameter.3gpp.feature_list1_s6a_flags_bit15", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit16, + { "Allow location by LCS clients of a designated LCS service type", "diameter.3gpp.feature_list1_s6a_flags_bit16", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit17, + { "All Mobile Originating Location Request Classes", "diameter.3gpp.feature_list1_s6a_flags_bit17", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit18, + { "Allow an MS to request its own location", "diameter.3gpp.feature_list1_s6a_flags_bit18", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit19, + { "Allow an MS to perform self location without interaction with the PLMN", "diameter.3gpp.feature_list1_s6a_flags_bit19", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit20, + { "Allow an MS to request transfer of its location to another LCS client", "diameter.3gpp.feature_list1_s6a_flags_bit20", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit21, + { "Short Message MO-PP", "diameter.3gpp.feature_list1_s6a_flags_bit21", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit22, + { "Barring of Outgoing Calls", "diameter.3gpp.feature_list1_s6a_flags_bit22", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit23, + { "Barring of all outgoing calls", "diameter.3gpp.feature_list1_s6a_flags_bit23", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit24, + { "Barring of outgoing international calls", "diameter.3gpp.feature_list1_s6a_flags_bit24", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit25, + { "Barring of outgoing international calls except those directed to the home PLMN Country", "diameter.3gpp.feature_list1_s6a_flags_bit25", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit26, + { "UE Reachability Notifcation", "diameter.3gpp.feature_list1_s6a_flags_bit26", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit27, + { "Terminating Access Domain Selection Data Retrieval", "diameter.3gpp.feature_list1_s6a_flags_bit27", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit28, + { "State/Location Information Retrieval", "diameter.3gpp.feature_list1_s6a_flags_bit28", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit29, + { "Partial Purge from a Combined MME/SGSN", "diameter.3gpp.feature_list1_s6a_flags_bit29", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit30, + { "UE Time Zone Retrieval", "diameter.3gpp.feature_list1_s6a_flags1_bit30", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list1_s6a_flags_bit31, + { "Additional MSISDN", "diameter.3gpp.feature_list1_s6a_flags_bit31", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list2_s6a_flags_bit0, + { "SMS in MME", "diameter.3gpp.feature_list2_s6a_flags_bit0", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, + { &hf_diameter_3gpp_feature_list2_s6a_flags_bit1, + { "SMS in SGSN", "diameter.3gpp.feature_list2_s6a_flags_bit1", + FT_BOOLEAN, BASE_NONE, TFS(&tfs_supported_not_supported), 0x0, + NULL, HFILL } + }, { &hf_diameter_3gpp_ulr_flags, { "ULR Flags", "diameter.3gpp.ulr_flags", FT_UINT32, BASE_HEX, NULL, 0x0, |