[PFCP] Add more IE dissection.

Change-Id: Ib055d43fa13aa826ce449ad93cecaab9617d75db
Reviewed-on: https://code.wireshark.org/review/23617
Petri-Dish: Anders Broman <a.broman58@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
AndersBroman 2017-09-19 16:09:35 +02:00 committed by Anders Broman
parent 1783a3b7df
commit dae91bcb90
1 changed files with 332 additions and 6 deletions

View File

@ -62,9 +62,12 @@ static int hf_pfcp_spare_b4 = -1;
static int hf_pfcp_spare_b5 = -1;
static int hf_pfcp_spare_b6 = -1;
static int hf_pfcp_spare_b7 = -1;
static int hf_pfcp_spare_b7_b6 = -1;
static int hf_pfcp_spare_b7_b5 = -1;
static int hf_pfcp_spare_b7_b4 = -1;
static int hf_pfcp_spare_b7_b3 = -1;
static int hf_pfcp_spare_b7_b2 = -1;
static int hf_pfcp_spare_b7_b1 = -1;
static int hf_pfcp_spare_h0 = -1;
static int hf_pfcp_spare_h1 = -1;
static int hf_pfcp_spare_oct = -1;
@ -252,6 +255,24 @@ static int hf_pfcp_b1_sci = -1;
static int hf_pfcp_sci = -1;
static int hf_pfcp_dl_data_notification_delay = -1;
static int hf_pfcp_packet_count = -1;
static int hf_pfcp_pfcp_dl_data_service_inf_flags = -1;
static int hf_pfcp_b0_ppi = -1;
static int hf_pfcp_ppi = -1;
static int hf_pfcp_sxsmreq_flags = -1;
static int hf_pfcp_b0_drobu = -1;
static int hf_pfcp_b1_sndem = -1;
static int hf_pfcp_sxsrrsp_flags = -1;
static int hf_pfcp_pfd_contents_flags = -1;
static int hf_pfcp_b0_fd = -1;
static int hf_pfcp_b3_cp = -1;
static int hf_pfcp_b2_dn = -1;
static int hf_pfcp_b1_url = -1;
static int hf_pfcp_url_len = -1;
static int hf_pfcp_url = -1;
static int hf_pfcp_dn_len = -1;
static int hf_pfcp_dn = -1;
static int hf_pfcp_cp_len = -1;
static int hf_pfcp_cp = -1;
static int ett_pfcp = -1;
static int ett_pfcp_flags = -1;
@ -277,6 +298,9 @@ static int ett_pfcp_cp_function_features = -1;
static int ett_pfcp_usage_information = -1;
static int ett_pfcp_packet_rate = -1;
static int ett_pfcp_pfcp_dl_flow_level_marking = -1;
static int ett_pfcp_dl_data_service_inf = -1;
static int ett_pfcp_sxsmreq = -1;
static int ett_pfcp_sxsrrsp = -1;
static expert_field ei_pfcp_ie_reserved = EI_INIT;
static expert_field ei_pfcp_ie_data_not_decoded = EI_INIT;
@ -1268,6 +1292,37 @@ dissect_pfcp_apply_action(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tre
/*
* 8.2.27 Downlink Data Service Information
*/
static void
dissect_pfcp_dl_data_service_inf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
int offset = 0;
guint64 flags;
static const int * pfcp_dl_data_service_inf_flags[] = {
&hf_pfcp_spare_b7_b1,
&hf_pfcp_b0_ppi,
NULL
};
/* Octet 5 Spare PPI */
proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_pfcp_dl_data_service_inf_flags,
ett_pfcp_dl_data_service_inf, pfcp_dl_data_service_inf_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT | BMT_NO_TFS, &flags);
offset += 1;
/* The PPI flag in octet 5 indicates whether the Paging Policy Indication value in octet 'm' shall be present */
if ((flags & 0x1) == 1) {
/* m Spare Paging Policy Indication value
* encoded as the DSCP in TOS (IPv4) or TC (IPv6) information received in the IP payload of the GTP-U packet
* from the PGW (see IETF RFC 2474
*/
proto_tree_add_item(tree, hf_pfcp_spare_b7_b6, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_pfcp_ppi, tvb, offset, 1, ENC_BIG_ENDIAN);
offset++;
}
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/*
* 8.2.28 Downlink Data Notification Delay
*/
@ -1362,9 +1417,51 @@ dissect_pfcp_dl_buffering_suggested_packet_count(tvbuff_t *tvb, packet_info *pin
/*
* 8.2.31 SxSMReq-Flags
*/
static void
dissect_pfcp_sxsmreq_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
int offset = 0;
static const int * pfcp_sxsmreq_flags[] = {
&hf_pfcp_spare_b7_b2,
&hf_pfcp_b1_sndem,
&hf_pfcp_b0_drobu,
NULL
};
/* Octet 5 Spare Spare Spare Spare Spare Spare SNDEM DROBU */
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_sxsmreq_flags,
ett_pfcp_sxsmreq, pfcp_sxsmreq_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
offset += 1;
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/*
* 8.2.32 SxSRRsp-Flags
*/
static void
dissect_pfcp_sxsrrsp_flags(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
int offset = 0;
static const int * pfcp_sxsrrsp_flags[] = {
&hf_pfcp_spare_b7_b1,
&hf_pfcp_b0_drobu,
NULL
};
/* Octet 5 Spare Spare Spare Spare Spare Spare Spare DROBU */
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_sxsrrsp_flags,
ett_pfcp_sxsrrsp, pfcp_sxsrrsp_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
offset += 1;
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/*
* 8.2.33 Sequence Number
*/
@ -1581,6 +1678,83 @@ dissect_pfcp_node_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_
/*
* 8.2.39 PFD Contents
*/
static void
dissect_pfcp_pfd_contents(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
int offset = 0;
guint64 flags;
guint32 len;
static const int * pfcp_pfd_contents_flags[] = {
&hf_pfcp_spare_b7_b4,
&hf_pfcp_b3_cp,
&hf_pfcp_b2_dn,
&hf_pfcp_b1_url,
&hf_pfcp_b0_fd,
NULL
};
/* Octet 5 Spare CP DN URL FD*/
proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_pfd_contents_flags,
ett_pfcp_measurement_method_flags, pfcp_pfd_contents_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
offset += 1;
/* Bit 1 - FD (Flow Description): If this bit is set to "1", then the Length of Flow Description
* and the Flow Description fields shall be present
*/
if ((flags & 0x1) == 1) {
/* The Flow Description field, when present, shall be encoded as an OctetString
* as specified in subclause 6.4.3.7 of 3GPP TS 29.251
*/
/* m to (m+1) Length of Flow Description */
proto_tree_add_item_ret_uint(tree, hf_pfcp_flow_desc_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
offset += 2;
/* (m+2) to p Flow Description */
proto_tree_add_item(tree, hf_pfcp_fd, tvb, offset, len, ENC_NA);
offset += len;
}
/* Bit 2 - URL (URL): If this bit is set to "1", then the Length of URL and the URL fields shall be present */
if ((flags & 0x2) == 2) {
/* q to (q+1) Length of URL */
proto_tree_add_item_ret_uint(tree, hf_pfcp_url_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
offset += 2;
/* (q+2) to r URL */
proto_tree_add_item(tree, hf_pfcp_url, tvb, offset, len, ENC_NA);
offset += len;
}
/* Bit 3 - DN (Domain Name): If this bit is set to "1", then the Length of Domain Name and
* the Domain Name fields shall be present
*/
if ((flags & 0x4) == 4) {
/* s to (s+1) Length of Domain Name */
proto_tree_add_item_ret_uint(tree, hf_pfcp_dn_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
offset += 2;
/* (s+2) to t Domain Name */
proto_tree_add_item(tree, hf_pfcp_dn, tvb, offset, len, ENC_NA);
offset += len;
}
/* Bit 4 - CP (Custom PFD Content): If this bit is set to "1", then the Length of Custom PFD Content and
* the Custom PFD Content fields shall be present
*/
if ((flags & 0x8) == 8) {
/* u to (u+1) Length of Custom PFD Content */
proto_tree_add_item_ret_uint(tree, hf_pfcp_cp_len, tvb, offset, 2, ENC_BIG_ENDIAN, &len);
offset += 2;
/* (u+2) to v Custom PFD Content */
proto_tree_add_item(tree, hf_pfcp_cp, tvb, offset, len, ENC_NA);
offset += len;
}
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/*
* 8.2.40 Measurement Method
*/
@ -2514,7 +2688,51 @@ dissect_pfcp_qer_id(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_i
/*
* 8.2.78 Graceful Release Period
*/
static void
dissect_pfcp_graceful_release_period(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_)
{
int offset = 0;
guint32 unit, value;
/* Octet 5 Timer unit Timer value */
proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_unit, tvb, offset, 1, ENC_BIG_ENDIAN, &unit);
proto_tree_add_item_ret_uint(tree, hf_pfcp_timer_value, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
offset++;
unit = unit >> 5;
switch (unit) {
case 0:
proto_item_append_text(item, "%u s", value * 2);
break;
case 1:
proto_item_append_text(item, "%u min", value);
break;
case 2:
proto_item_append_text(item, "%u min", value * 10);
break;
case 3:
proto_item_append_text(item, "%u hours", value);
break;
case 4:
proto_item_append_text(item, "%u hours", value * 10);
break;
case 7:
proto_item_append_text(item, "%u Infinite", value);
break;
/* Value 5 and 6 */
default:
proto_item_append_text(item, "%u min", value * 10);
break;
}
if ((unit != 7) && (value == 0)) {
proto_item_append_text(item, " Stopped");
}
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/* Array of functions to dissect IEs
@ -2570,12 +2788,12 @@ static const pfcp_ie_t pfcp_ies[] = {
/* 42 */ { dissect_pfcp_destination_interface }, /* Destination Interface Extendable / Subclause 8.2.24 */
/* 43 */ { dissect_pfcp_up_function_features }, /* UP Function Features Extendable / Subclause 8.2.25 */
/* 44 */ { dissect_pfcp_apply_action }, /* Apply Action Extendable / Subclause 8.2.26 */
/* 45 */ { NULL }, /* Downlink Data Service Information Extendable / Subclause 8.2.27 */
/* 45 */ { dissect_pfcp_dl_data_service_inf }, /* Downlink Data Service Information Extendable / Subclause 8.2.27 */
/* 46 */ { dissect_pfcp_dl_data_notification_delay }, /* Downlink Data Notification Delay Extendable / Subclause 8.2.28 */
/* 47 */ { dissect_pfcp_dl_buffering_dur }, /* DL Buffering Duration Extendable / Subclause 8.2.29 */
/* 48 */ { dissect_pfcp_dl_buffering_suggested_packet_count }, /* DL Buffering Suggested Packet Count Variable / Subclause 8.2.30 */
/* 49 */ { NULL }, /* SxSMReq-Flags Extendable / Subclause 8.2.31 */
/* 50 */ { NULL }, /* SxSRRsp-Flags Extendable / Subclause 8.2.32 */
/* 49 */ { dissect_pfcp_sxsmreq_flags }, /* SxSMReq-Flags Extendable / Subclause 8.2.31 */
/* 50 */ { dissect_pfcp_sxsrrsp_flags }, /* SxSRRsp-Flags Extendable / Subclause 8.2.32 */
/* 51 */ { dissect_pfcp_load_control_information }, /* Load Control Information Extendable / Table 7.5.3.3-1 */
/* 52 */ { dissect_pfcp_sequence_number }, /* Sequence Number Fixed Length / Subclause 8.2.33 */
/* 53 */ { dissect_pfcp_metric }, /* Metric Fixed Length / Subclause 8.2.34 */
@ -2586,7 +2804,7 @@ static const pfcp_ie_t pfcp_ies[] = {
/* 58 */ { dissect_pfcp_application_ids_pfds }, /* Application ID's PFDs Extendable / Table 7.4.3.1-2 */
/* 59 */ { dissect_pfcp_pfd_context }, /* PFD context Extendable / Table 7.4.3.1-3 */
/* 60 */ { dissect_pfcp_node_id }, /* Node ID Extendable / Subclause 8.2.38 */
/* 61 */ { NULL }, /* PFD contents Extendable / Subclause 8.2.39 */
/* 61 */ { dissect_pfcp_pfd_contents }, /* PFD contents Extendable / Subclause 8.2.39 */
/* 62 */ { dissect_pfcp_measurement_method }, /* Measurement Method Extendable / Subclause 8.2.40 */
/* 63 */ { dissect_pfcp_usage_report_trigger }, /* Usage Report Trigger Extendable / Subclause 8.2.41 */
/* 64 */ { dissect_pfcp_measurement_period }, /* Measurement Period Extendable / Subclause 8.2.42 */
@ -2637,7 +2855,7 @@ static const pfcp_ie_t pfcp_ies[] = {
/* 109 */ { dissect_pfcp_qer_id }, /* QER ID Extendable / Subclause 8.2.75 */
/* 110 */ { NULL }, /* OCI Flags Extendable / Subclause 8.2.76 */
/* 111 */ { NULL }, /* Sx Association Release Request Extendable / Subclause 8.2.77 */
/* 112 */ { NULL }, /* Graceful Release Period Extendable / Subclause 8.2.78 */
/* 112 */ { dissect_pfcp_graceful_release_period }, /* Graceful Release Period Extendable / Subclause 8.2.78 */
{ NULL }, /* End of List */
};
@ -3123,11 +3341,21 @@ proto_register_pfcp(void)
FT_UINT8, BASE_DEC, NULL, 0x80,
NULL, HFILL }
},
{ &hf_pfcp_spare_b7_b6,
{ "Spare", "pfcp.spare_b7_b6",
FT_UINT8, BASE_DEC, NULL, 0xc0,
NULL, HFILL }
},
{ &hf_pfcp_spare_b7_b5,
{ "Spare", "pfcp.spare_b7_b5",
FT_UINT8, BASE_DEC, NULL, 0xe0,
NULL, HFILL }
},
{ &hf_pfcp_spare_b7_b4,
{ "Spare", "pfcp.spare_b7_b4",
FT_UINT8, BASE_DEC, NULL, 0xf0,
NULL, HFILL }
},
{ &hf_pfcp_spare_b7_b3,
{ "Spare", "pfcp.spare_b7_b3",
FT_UINT8, BASE_DEC, NULL, 0xf8,
@ -3138,6 +3366,11 @@ proto_register_pfcp(void)
FT_UINT8, BASE_DEC, NULL, 0xfc,
NULL, HFILL }
},
{ &hf_pfcp_spare_b7_b1,
{ "Spare", "pfcp.spare_b7_b1",
FT_UINT8, BASE_DEC, NULL, 0xfe,
NULL, HFILL }
},
{ &hf_pfcp_spare_oct,
{ "Spare", "pfcp.spare_oct",
FT_UINT8, BASE_DEC, NULL, 0x0,
@ -4088,11 +4321,101 @@ proto_register_pfcp(void)
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_pfcp_dl_data_service_inf_flags,
{ "Flags", "pfcp.dl_data_service_inf_flags",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_b0_ppi,
{ "PPI(Paging Policy Indication)", "pfcp.dl_data_service_inf.ppi",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
NULL, HFILL }
},
{ &hf_pfcp_ppi,
{ "Paging Policy Indication", "pfcp.ppi",
FT_UINT16, BASE_DEC, NULL, 0x7f,
NULL, HFILL }
},
{ &hf_pfcp_sxsmreq_flags,
{ "Flags", "pfcp.sxsmreq_flags",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_b0_drobu,
{ "DROBU (Drop Buffered Packets)", "pfcp.sxsmreq_flags.drobu",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_pfcp_b1_sndem,
{ "SNDEM (Send End Marker Packets)", "pfcp.sxsmreq_flags.sndem",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_pfcp_sxsrrsp_flags,
{ "Flags", "pfcp.sxsrrsp_flags",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_pfd_contents_flags,
{ "Flags", "pfcp.pfd_contents_flags",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_b0_fd,
{ "FD (Flow Description)", "pfcp.pfd_contents_flags.fd",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_pfcp_b1_url,
{ "URL (URL)", "pfcp.pfd_contents_flags.url",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_pfcp_b2_dn,
{ "DN (Domain Name)", "pfcp.pfd_contents_flags.dn",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_pfcp_b3_cp,
{ "CP (Custom PFD Content)", "pfcp.pfd_contents_flags.cp",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_pfcp_url_len,
{ "Length of URL", "pfcp.url_len",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_url,
{ "URL", "pfcp.url",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_dn_len,
{ "Length of Domain Name", "pfcp.dn_len",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_dn,
{ "Domain Name", "pfcp.dn",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_cp_len,
{ "Length of Custom PFD Content", "pfcp.cp_len",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_cp,
{ "Custom PFD Content", "pfcp.cp",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
};
/* Setup protocol subtree array */
#define NUM_INDIVIDUAL_ELEMS_PFCP 24
#define NUM_INDIVIDUAL_ELEMS_PFCP 27
gint *ett[NUM_INDIVIDUAL_ELEMS_PFCP +
(NUM_PFCP_IES - 1)];
@ -4120,6 +4443,9 @@ proto_register_pfcp(void)
ett[21] = &ett_pfcp_usage_information;
ett[22] = &ett_pfcp_packet_rate;
ett[23] = &ett_pfcp_pfcp_dl_flow_level_marking;
ett[24] = &ett_pfcp_dl_data_service_inf;
ett[25] = &ett_pfcp_sxsmreq;
ett[26] = &ett_pfcp_sxsrrsp;