[PFCP] Dissect more IEs.

Change-Id: Ic3a32f3317af81289da0be73474f4a8882d4bf43
Reviewed-on: https://code.wireshark.org/review/23603
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-18 17:20:36 +02:00 committed by Anders Broman
parent 88b88a0e80
commit e193309318
1 changed files with 685 additions and 43 deletions

View File

@ -64,6 +64,7 @@ static int hf_pfcp_spare_b6 = -1;
static int hf_pfcp_spare_b7 = -1;
static int hf_pfcp_spare_b7_b5 = -1;
static int hf_pfcp_spare_b7_b3 = -1;
static int hf_pfcp_spare_b7_b2 = -1;
static int hf_pfcp_spare_h0 = -1;
static int hf_pfcp_spare_h1 = -1;
static int hf_pfcp_spare_oct = -1;
@ -175,9 +176,6 @@ static int hf_pfcp_volume_threshold_ulvol = -1;
static int hf_pfcp_volume_threshold_dlvol = -1;
static int hf_pfcp_volume_quota = -1;
static int hf_pfcp_volume_quota_b2_dlvol = -1;
static int hf_pfcp_volume_quota_b1_ulvol = -1;
static int hf_pfcp_volume_quota_b0_tovol = -1;
static int hf_pfcp_volume_quota_tovol = -1;
static int hf_pfcp_volume_quota_ulvol = -1;
static int hf_pfcp_volume_quota_dlvol = -1;
@ -220,6 +218,40 @@ static int hf_pfcp_b3_trst = -1;
static int hf_pfcp_b2_dlbd = -1;
static int hf_pfcp_b1_ddnd = -1;
static int hf_pfcp_b0_bucp = -1;
static int hf_pfcp_sequence_number = -1;
static int hf_pfcp_metric = -1;
static int hf_pfcp_timer_unit = -1;
static int hf_pfcp_timer_value = -1;
static int hf_pfcp_usage_report_trigger = -1;
static int hf_pfcp_b7_immer = -1;
static int hf_pfcp_b10_liusa = -1;
static int hf_pfcp_volume_measurement = -1;
static int hf_pfcp_vol_meas_tovol = -1;
static int hf_pfcp_vol_meas_ulvol = -1;
static int hf_pfcp_vol_meas_dlvol = -1;
static int hf_pfcp_cp_function_features = -1;
static int hf_pfcp_b0_load = -1;
static int hf_pfcp_b1_ovrl = -1;
static int hf_pfcp_usage_information = -1;
static int hf_pfcp_b3_ube = -1;
static int hf_pfcp_b2_uae = -1;
static int hf_pfcp_b1_aft = -1;
static int hf_pfcp_b0_bef = -1;
static int hf_pfcp_application_instance_id = -1;
static int hf_pfcp_flow_dir = -1;
static int hf_pfcp_packet_rate = -1;
static int hf_pfcp_ulpr_b0 = -1;
static int hf_pfcp_dlpr_b1 = -1;
static int hf_pfcp_ul_time_unit = -1;
static int hf_pfcp_max_ul_pr = -1;
static int hf_pfcp_dl_time_unit = -1;
static int hf_pfcp_max_dl_pr = -1;
static int hf_pfcp_dl_flow_level_marking = -1;
static int hf_pfcp_b0_ttc = -1;
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 ett_pfcp = -1;
static int ett_pfcp_flags = -1;
@ -239,6 +271,12 @@ static int ett_pfcp_dropped_dl_traffic_threshold = -1;
static int ett_pfcp_gate_status = -1;
static int ett_pfcp_report_type = -1;
static int ett_pfcp_up_function_features = -1;
static int ett_pfcp_report_trigger = -1;
static int ett_pfcp_volume_measurement = -1;
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 expert_field ei_pfcp_ie_reserved = EI_INIT;
static expert_field ei_pfcp_ie_data_not_decoded = EI_INIT;
@ -273,6 +311,7 @@ static void dissect_pfcp_remove_qer(tvbuff_t *tvb, packet_info *pinfo, proto_tre
static void dissect_pfcp_load_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
static void dissect_pfcp_overload_control_information(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
static void dissect_pfcp_application_ids_pfds(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
static void dissect_pfcp_pfd_context(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
static void dissect_pfcp_application_detection_inf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
static void dissect_pfcp_pfcp_query_urr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
static void dissect_pfcp_usage_report_smr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type);
@ -352,6 +391,7 @@ static value_string_ext pfcp_message_type_ext = VALUE_STRING_EXT_INIT(pfcp_messa
#define PFCP_LOAD_CONTROL_INFORMATION 51
#define PFCP_OVERLOAD_CONTROL_INFORMATION 54
#define PFCP_APPLICATION_IDS_PFDS 58
#define PFCP_PFD_CONTEXT 59
#define PFCP_APPLICATION_DETECTION_INF 68
#define PFCP_QUERY_URR 77
#define PFCP_USAGE_REPORT_SMR 78
@ -642,8 +682,8 @@ dissect_pfcp_sdf_filter(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
* then the Length of Flow Description and the Flow Description fields shall be present
*/
/* m to (m+1) Length of Flow Description */
proto_tree_add_item_ret_uint(tree, hf_pfcp_flow_desc_len, tvb, offset, 1, ENC_BIG_ENDIAN, &fd_length);
offset += 1;
proto_tree_add_item_ret_uint(tree, hf_pfcp_flow_desc_len, tvb, offset, 2, ENC_BIG_ENDIAN, &fd_length);
offset += 2;
/* Flow Description
* The Flow Description field, when present, shall be encoded as an OctetString
* as specified in subclause 5.4.2 of 3GPP TS 29.212
@ -1230,13 +1270,179 @@ dissect_pfcp_apply_action(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tre
*/
/*
* 8.2.28 Downlink Data Notification Delay
*/
static void
dissect_pfcp_dl_data_notification_delay(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type _U_)
{
int offset = 0;
guint32 value;
/* Octet 5 Delay Value in integer multiples of 50 millisecs, or zero */
proto_tree_add_item_ret_uint(tree, hf_pfcp_dl_data_notification_delay, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
offset += 1;
proto_item_append_text(item, "%u ms", value * 50);
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/*
* 8.2.29 DL Buffering Duration
*/
static const value_string pfcp_timer_unit_vals[] = {
{ 0, "value is incremented in multiples of 2 seconds" },
{ 1, "value is incremented in multiples of 1 minute" },
{ 2, "value is incremented in multiples of 10 minutes" },
{ 3, "value is incremented in multiples of 1 hour" },
{ 4, "value is incremented in multiples of 10 hour" },
{ 5, "values shall be interpreted as multiples of 1 minute(version 14.0.0)" },
{ 6, "values shall be interpreted as multiples of 1 minute(version 14.0.0)" },
{ 7, "value indicates that the timer is infinite" },
{ 0, NULL }
};
static void
dissect_pfcp_dl_buffering_dur(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);
}
}
/*
* 8.2.30 DL Buffering Suggested Packet Count
*/
static void
dissect_pfcp_dl_buffering_suggested_packet_count(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
/* Octet 5 to n+4 Packet Count Value
* The length shall be set to 1 or 2 octets.
*/
proto_tree_add_item(tree, hf_pfcp_packet_count, tvb, 0, length, ENC_BIG_ENDIAN);
}
/*
* 8.2.31 SxSMReq-Flags
*/
/*
* 8.2.32 SxSRRsp-Flags
*/
/*
* 8.2.33 Sequence Number
*/
static void
dissect_pfcp_sequence_number(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_)
{
guint32 value;
/* Octet 5 to 8 Sequence Number */
proto_tree_add_item_ret_uint(tree, hf_pfcp_sequence_number, tvb, 0, 4, ENC_BIG_ENDIAN, &value);
proto_item_append_text(item, "%u", value);
}
/*
* 8.2.34 Metric
*/
static void
dissect_pfcp_metric(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item, guint16 length _U_, guint8 message_type _U_)
{
guint32 value;
/* Octet 5 Metric */
proto_tree_add_item_ret_uint(tree, hf_pfcp_metric, tvb, 0, 1, ENC_BIG_ENDIAN, &value);
proto_item_append_text(item, "%u", value);
}
/*
* 8.2.35 Timer
*/
static void
dissect_pfcp_timer(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);
}
}
/*
* 8.2.36 Packet Detection Rule ID (PDR ID)
*/
static void
@ -1404,6 +1610,37 @@ dissect_pfcp_measurement_method(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
/*
* 8.2.41 Usage Report Trigger
*/
static void
dissect_pfcp_usage_report_trigger(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_usage_report_trigger_flags[] = {
&hf_pfcp_b10_liusa,
&hf_pfcp_b9_timqu,
&hf_pfcp_b8_volqu,
&hf_pfcp_b7_immer,
&hf_pfcp_b6_droth,
&hf_pfcp_b5_stopt,
&hf_pfcp_b4_start,
&hf_pfcp_b3_quhti,
&hf_pfcp_b2_timth,
&hf_pfcp_b1_volth,
&hf_pfcp_b0_perio,
NULL
};
/* Octet 5 IMMER DROTH STOPT START QUHTI TIMTH VOLTH PERIO*/
/* Octet 6 Spare Spare Spare Spare Spare LIUSA TIMQU VOLQU*/
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_usage_report_trigger,
ett_pfcp_report_trigger, pfcp_usage_report_trigger_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT);
offset += 2;
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/*
* 8.2.42 Measurement Period
*/
@ -1484,6 +1721,48 @@ dissect_pfcp_fq_csid(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_
/*
* 8.2.44 Volume Measurement
*/
static void
dissect_pfcp_volume_measurement(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_volume_measurement_flags[] = {
&hf_pfcp_spare_b7_b3,
&hf_pfcp_b2_dlvol,
&hf_pfcp_b1_ulvol,
&hf_pfcp_b0_tovol,
NULL
};
/* Octet 5 Spare DLVOL ULVOL TOVOL*/
proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_volume_measurement,
ett_pfcp_volume_measurement, pfcp_volume_measurement_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
offset += 1;
/* Bit 1 - TOVOL: If this bit is set to "1", then the Total Volume field shall be present*/
if ((flags & 0x1) == 1) {
/* m to (m+7) Total Volume */
proto_tree_add_item(tree, hf_pfcp_vol_meas_tovol, tvb, offset, 8, ENC_BIG_ENDIAN);
offset += 8;
}
/* Bit 2 - ULVOL: If this bit is set to "1", then the Total Volume field shall be present*/
if ((flags & 0x2) == 2) {
/* p to (p+7) Uplink Volume */
proto_tree_add_item(tree, hf_pfcp_vol_meas_ulvol, tvb, offset, 8, ENC_BIG_ENDIAN);
offset += 8;
}
/* Bit 3 - DLVOL: If this bit is set to "1", then the Total Volume field shall be present*/
if ((flags & 0x4) == 4) {
/*q to (q+7) Downlink Volume */
proto_tree_add_item(tree, hf_pfcp_vol_meas_dlvol, tvb, offset, 8, ENC_BIG_ENDIAN);
offset += 8;
}
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/*
* 8.2.45 Duration Measurement
*/
@ -1608,9 +1887,9 @@ dissect_pfcp_volume_quota(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, p
static const int * pfcp_volume_quota_flags[] = {
&hf_pfcp_spare_b7_b3,
&hf_pfcp_volume_quota_b2_dlvol,
&hf_pfcp_volume_quota_b1_ulvol,
&hf_pfcp_volume_quota_b0_tovol,
&hf_pfcp_b2_dlvol,
&hf_pfcp_b1_ulvol,
&hf_pfcp_b0_tovol,
NULL
};
/* Octet 5 Spare DLVOL ULVOL TOVOL*/
@ -1837,15 +2116,106 @@ dissect_pfcp_bar_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, pro
/*
* 8.2.58 CP Function Features
*/
static void
dissect_pfcp_cp_function_features(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_cp_function_features_flags[] = {
&hf_pfcp_b1_ovrl,
&hf_pfcp_b0_load,
NULL
};
/* Octet 5
* 5/1 LOAD
* 5/2 OVRL
*/
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_cp_function_features,
ett_pfcp_cp_function_features, pfcp_cp_function_features_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.59 Usage Information
*/
static void
dissect_pfcp_usage_information(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_usage_information_flags[] = {
&hf_pfcp_spare_h1,
&hf_pfcp_b3_ube,
&hf_pfcp_b2_uae,
&hf_pfcp_b1_aft,
&hf_pfcp_b0_bef,
NULL
};
/* Octet 5 Spare UBE UAE AFT BEF */
proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_pfcp_usage_information,
ett_pfcp_usage_information, pfcp_usage_information_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.60 Application Instance ID
*/
static void
dissect_pfcp_application_instance_id(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
/* Octet 5 5 to (n+4) Application Instance Identifier
* The Application Instance Identifier shall be encoded as an OctetString (see 3GPP TS 29.212)
*/
proto_tree_add_item(tree, hf_pfcp_application_instance_id, tvb, 0, length, ENC_NA);
}
/*
* 8.2.61 Flow Information
*/
static const value_string pfcp_flow_dir_vals[] = {
{ 0, "Unspecified" },
{ 1, "Downlink (traffic to the UE)" },
{ 2, "Uplink (traffic from the UE)" },
{ 3, "Bidirectional" },
{ 0, NULL }
};
static void
dissect_pfcp_flow_inf(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
int offset = 0;
guint32 len;
/* Octet 5 Spare Flow Direction */
proto_tree_add_item(tree, hf_pfcp_spare_b7_b3, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_pfcp_flow_dir, tvb, offset, 1, ENC_BIG_ENDIAN);
offset++;
/* 6 to 7 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;
/* Flow Description
* The Flow Description field, when present, shall be encoded as an OctetString
* as specified in subclause 5.4.2 of 3GPP TS 29.212
*/
proto_tree_add_item(tree, hf_pfcp_fd, 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.62 UE IP Address
*/
@ -1881,6 +2251,7 @@ dissect_pfcp_ue_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
proto_tree_add_item(tree, hf_pfcp_ue_ip_add_ipv6, tvb, offset, 16, ENC_NA);
offset += 16;
}
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
@ -1889,6 +2260,58 @@ dissect_pfcp_ue_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
/*
* 8.2.63 Packet Rate
*/
static const value_string pfcp_pr_time_unit_vals[] = {
{ 0, "Minute" },
{ 1, "6 minutes" },
{ 2, "Hour" },
{ 3, "Day" },
{ 3, "Week" },
{ 0, NULL }
};
static void
dissect_pfcp_packet_rate(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_packet_rate_flags[] = {
&hf_pfcp_spare_b7_b2,
&hf_pfcp_dlpr_b1,
&hf_pfcp_ulpr_b0,
NULL
};
/* Octet 5 Spare DLPR ULPR */
proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_packet_rate,
ett_pfcp_packet_rate, pfcp_packet_rate_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags);
offset += 1;
/* Bit 1 - ULPR (Uplink Packet Rate): If this bit is set to "1", then octets m to (m+2) shall be present */
if ((flags & 0x1) == 1) {
/* m */
proto_tree_add_item(tree, hf_pfcp_spare_b7_b3, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_pfcp_ul_time_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
offset += 1;
/* (m+1) to (m+2) Maximum Uplink Packet Rate */
proto_tree_add_item(tree, hf_pfcp_max_ul_pr, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
}
/* Bit 2 - DLPR (Downlink Packet Rate): If this bit is set to "1", then octets p to (p+2) shall be present*/
if ((flags & 0x2) == 2) {
proto_tree_add_item(tree, hf_pfcp_spare_b7_b3, tvb, offset, 1, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_pfcp_dl_time_unit, tvb, offset, 1, ENC_BIG_ENDIAN);
offset += 1;
/* (m+1) to (m+2) Maximum Uplink Packet Rate */
proto_tree_add_item(tree, hf_pfcp_max_dl_pr, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
}
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/*
* 8.2.64 Outer Header Removal
*/
@ -1943,6 +2366,53 @@ dissect_pfcp_recovery_time_stamp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *
/*
* 8.2.66 DL Flow Level Marking
*/
static void
dissect_pfcp_dl_flow_level_marking(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
int offset = 0;
guint64 flags_val;
static const int * pfcp_dl_flow_level_marking_flags[] = {
&hf_pfcp_spare_b7_b2,
&hf_pfcp_b1_sci,
&hf_pfcp_b0_ttc,
NULL
};
/* Octet 5 Spare SCI TTC*/
proto_tree_add_bitmask_with_flags_ret_uint64(tree, tvb, offset, hf_pfcp_dl_flow_level_marking,
ett_pfcp_pfcp_dl_flow_level_marking, pfcp_dl_flow_level_marking_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &flags_val);
offset += 1;
/* Bit 1 - TTC (ToS/Traffic Class): If this bit is set to "1",
* then the ToS/Traffic Class field shall be present
*/
if ((flags_val & 0x1) == 1) {
/* m to (m+1) ToS/Traffic Class
* The ToS/Traffic Class shall be encoded on two octets as an OctetString.
* The first octet shall contain the IPv4 Type-of-Service or the IPv6 Traffic-Class field and
* the second octet shall contain the ToS/Traffic Class mask field
*/
proto_tree_add_item(tree, hf_pfcp_tos_traf_class, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
}
/* SCI (Service Class Indicator): If this bit is set to "1",
* then the Service Class Indicator field shall be present
*/
if ((flags_val & 0x2) == 2) {
/* Octets p and (p+1) of the Service Class Indicator field, when present,
* shall be encoded respectively as octets 2 and 3 of the Service Class Indicator Extension Header
* specified in Figure 5.2.2.3-1 of 3GPP TS 29.281
*/
proto_tree_add_item(tree, hf_pfcp_sci, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
}
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
}
/*
* 8.2.67 Header Enrichment
*/
@ -2101,27 +2571,27 @@ static const pfcp_ie_t pfcp_ies[] = {
/* 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 */
/* 46 */ { NULL }, /* Downlink Data Notification Delay Extendable / Subclause 8.2.28 */
/* 47 */ { NULL }, /* DL Buffering Duration Extendable / Subclause 8.2.29 */
/* 48 */ { NULL }, /* DL Buffering Suggested Packet Count Variable / Subclause 8.2.30 */
/* 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 */
/* 51 */ { dissect_pfcp_load_control_information }, /* Load Control Information Extendable / Table 7.5.3.3-1 */
/* 52 */ { NULL }, /* Sequence Number Fixed Length / Subclause 8.2.33 */
/* 53 */ { NULL }, /* Metric Fixed Length / Subclause 8.2.34 */
/* 52 */ { dissect_pfcp_sequence_number }, /* Sequence Number Fixed Length / Subclause 8.2.33 */
/* 53 */ { dissect_pfcp_metric }, /* Metric Fixed Length / Subclause 8.2.34 */
/* 54 */ { dissect_pfcp_overload_control_information }, /* Overload Control Information Extendable / Table 7.5.3.4-1 */
/* 55 */ { NULL }, /* Timer Extendable / Subclause 8.2 35 */
/* 55 */ { dissect_pfcp_timer }, /* Timer Extendable / Subclause 8.2 35 */
/* 56 */ { dissect_pfcp_pdr_id }, /* Packet Detection Rule ID Extendable / Subclause 8.2 36 */
/* 57 */ { dissect_pfcp_f_seid }, /* F-SEID Extendable / Subclause 8.2 37 */
/* 58 */ { dissect_pfcp_application_ids_pfds }, /* Application ID's PFDs Extendable / Table 7.4.3.1-2 */
/* 59 */ { NULL }, /* PFD context Extendable / Table 7.4.3.1-3 */
/* 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 */
/* 62 */ { dissect_pfcp_measurement_method }, /* Measurement Method Extendable / Subclause 8.2.40 */
/* 63 */ { NULL }, /* Usage Report Trigger Extendable / Subclause 8.2.41 */
/* 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 */
/* 65 */ { dissect_pfcp_fq_csid }, /* FQ-CSID Extendable / Subclause 8.2.43 */
/* 66 */ { NULL }, /* Volume Measurement Extendable / Subclause 8.2.44 */
/* 66 */ { dissect_pfcp_volume_measurement }, /* Volume Measurement Extendable / Subclause 8.2.44 */
/* 67 */ { dissect_pfcp_duration_measurement }, /* Duration Measurement Extendable / Subclause 8.2.45 */
/* 68 */ { dissect_pfcp_application_detection_inf }, /* Application Detection Information Extendable / Table 7.5.8.3-2 */
/* 69 */ { dissect_pfcp_time_of_first_packet }, /* Time of First Packet Extendable / Subclause 8.2.46 */
@ -2144,15 +2614,15 @@ static const pfcp_ie_t pfcp_ies[] = {
/* 86 */ { dissect_pfcp_update_bar_smr }, /* Update BAR (Session Modification Request) Extendable / Table 7.5.4.11-1 */
/* 87 */ { dissect_pfcp_remove_bar }, /* Remove BAR Extendable / Table 7.5.4.12-1 */
/* 88 */ { dissect_pfcp_bar_id }, /* BAR ID Extendable / Subclause 8.2.57 */
/* 89 */ { NULL }, /* CP Function Features Extendable / Subclause 8.2.58 */
/* 90 */ { NULL }, /* Usage Information Extendable / Subclause 8.2.59 */
/* 91 */ { NULL }, /* Application Instance ID Variable Length / Subclause 8.2.60 */
/* 92 */ { NULL }, /* Flow Information Extendable / Subclause 8.2.61 */
/* 89 */ { dissect_pfcp_cp_function_features }, /* CP Function Features Extendable / Subclause 8.2.58 */
/* 90 */ { dissect_pfcp_usage_information }, /* Usage Information Extendable / Subclause 8.2.59 */
/* 91 */ { dissect_pfcp_application_instance_id }, /* Application Instance ID Variable Length / Subclause 8.2.60 */
/* 92 */ { dissect_pfcp_flow_inf }, /* Flow Information Extendable / Subclause 8.2.61 */
/* 93 */ { dissect_pfcp_ue_ip_address }, /* UE IP Address Extendable / Subclause 8.2.62 */
/* 94 */ { NULL }, /* Packet Rate Extendable / Subclause 8.2.63 */
/* 94 */ { dissect_pfcp_packet_rate }, /* Packet Rate Extendable / Subclause 8.2.63 */
/* 95 */ { dissect_pfcp_outer_hdr_rem }, /* Outer Header Removal Extendable / Subclause 8.2.64 */
/* 96 */ { dissect_pfcp_recovery_time_stamp }, /* Recovery Time Stamp Extendable / Subclause 8.2.65 */
/* 97 */ { NULL }, /* DL Flow Level Marking Extendable / Subclause 8.2.66 */
/* 97 */ { dissect_pfcp_dl_flow_level_marking }, /* DL Flow Level Marking Extendable / Subclause 8.2.66 */
/* 98 */ { NULL }, /* Header Enrichment Extendable / Subclause 8.2.67 */
/* 99 */ { dissect_pfcp_error_indication_report }, /* Error Indication Report Extendable / Table 7.5.8.4-1 */
/* 100 */ { NULL }, /* Measurement Information Extendable / Subclause 8.2.68 */
@ -2318,6 +2788,12 @@ dissect_pfcp_application_ids_pfds(tvbuff_t *tvb, packet_info *pinfo, proto_tree
dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_APPLICATION_IDS_PFDS]);
}
static void
dissect_pfcp_pfd_context(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type)
{
dissect_pfcp_grouped_ie(tvb, pinfo, tree, item, length, message_type, ett_pfcp_elem[PFCP_PFD_CONTEXT]);
}
static void
dissect_pfcp_application_detection_inf(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item, guint16 length, guint8 message_type)
@ -2657,6 +3133,11 @@ proto_register_pfcp(void)
FT_UINT8, BASE_DEC, NULL, 0xf8,
NULL, HFILL }
},
{ &hf_pfcp_spare_b7_b2,
{ "Spare", "pfcp.spare_b7_b2",
FT_UINT8, BASE_DEC, NULL, 0xfc,
NULL, HFILL }
},
{ &hf_pfcp_spare_oct,
{ "Spare", "pfcp.spare_oct",
FT_UINT8, BASE_DEC, NULL, 0x0,
@ -2883,7 +3364,7 @@ proto_register_pfcp(void)
},
{ &hf_pfcp_flow_desc_len,
{ "Length of Flow Description", "pfcp.flow_desc_len",
FT_UINT8, BASE_DEC, NULL, 0x0,
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_fd,
@ -3202,17 +3683,17 @@ proto_register_pfcp(void)
NULL, HFILL }
},
{ &hf_pfcp_b0_tovol,
{ "TOVOL", "pfcp.volume_threshold.tovol_flg",
{ "TOVOL", "pfcp.tovol_flg",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_pfcp_b1_ulvol,
{ "ULVOL", "pfcp.volume_threshold.ulvol_flg",
{ "ULVOL", "pfcp.ulvol_flg",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_pfcp_b2_dlvol,
{ "DLVOL", "pfcp.volume_threshold.dlvol_flg",
{ "DLVOL", "pfcp.dlvol_flg",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
@ -3236,21 +3717,6 @@ proto_register_pfcp(void)
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_volume_quota_b0_tovol,
{ "TOVOL", "pfcp.volume_quota.tovol_flg",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_pfcp_volume_quota_b1_ulvol,
{ "ULVOL", "pfcp.volume_quota.ulvol_flg",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_pfcp_volume_quota_b2_dlvol,
{ "DLVOL", "pfcp.volume_quota.dlvol_flg",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_pfcp_volume_quota_tovol,
{ "Total Volume", "pfcp.volume_quota.tovol",
FT_UINT64, BASE_DEC, NULL, 0x0,
@ -3452,11 +3918,181 @@ proto_register_pfcp(void)
FT_BOOLEAN, 16, TFS(&tfs_supported_not_supported), 0x0100,
"Sending of End Marker packets", HFILL }
},
{ &hf_pfcp_sequence_number,
{ "Sequence Number", "pfcp.sequence_number",
FT_UINT32, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_metric,
{ "Metric", "pfcp.metric",
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_timer_unit,
{ "Timer unit", "pfcp.timer_unit",
FT_UINT8, BASE_DEC, VALS(pfcp_timer_unit_vals), 0xe0,
NULL, HFILL }
},
{ &hf_pfcp_timer_value,
{ "Timer value", "pfcp.timer_value",
FT_UINT8, BASE_DEC, NULL, 0x1f,
NULL, HFILL }
},
{ &hf_pfcp_usage_report_trigger,
{ "Flags", "pfcp.usage_report_trigger",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_b7_immer,
{ "IMMER (Immediate Report)", "pfcp.usage_report_trigger.immer",
FT_BOOLEAN, 16, NULL, 0x0080,
NULL, HFILL }
},
{ &hf_pfcp_b10_liusa,
{ "LIUSA (Linked Usage Reporting)", "pfcp.usage_report_trigger.liusa",
FT_BOOLEAN, 16, NULL, 0x0200,
NULL, HFILL }
},
{ &hf_pfcp_volume_measurement,
{ "Flags", "pfcp.volume_measurement",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_vol_meas_tovol,
{ "Total Volume", "pfcp.volume_measurement.tovol",
FT_UINT64, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_vol_meas_ulvol,
{ "Uplink Volume", "pfcp.volume_measurement.ulvol",
FT_UINT64, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_vol_meas_dlvol,
{ "Downlink Volume", "pfcp.volume_measurement.dlvol",
FT_UINT64, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_cp_function_features,
{ "Flags", "pfcp.cp_function_features",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_b0_load,
{ "LOAD", "pfcp.cp_function_features.load",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x01,
"Load Control", HFILL }
},
{ &hf_pfcp_b1_ovrl,
{ "OVRL", "pfcp.cp_function_features.ovrl",
FT_BOOLEAN, 8, TFS(&tfs_supported_not_supported), 0x02,
"Overload Control", HFILL }
},
{ &hf_pfcp_usage_information,
{ "Flags", "pfcp.usage_information",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_b0_bef,
{ "BEF (Before)", "pfcp.usage_information.bef",
FT_BOOLEAN, 8, NULL, 0x01,
NULL, HFILL }
},
{ &hf_pfcp_b1_aft,
{ "AFT (After)", "pfcp.usage_information.aft",
FT_BOOLEAN, 8, NULL, 0x02,
NULL, HFILL }
},
{ &hf_pfcp_b2_uae,
{ "UAE (Usage After Enforcement)", "pfcp.usage_information.uae",
FT_BOOLEAN, 8, NULL, 0x04,
NULL, HFILL }
},
{ &hf_pfcp_b3_ube,
{ "UBE (Usage Before Enforcement)", "pfcp.usage_information.ube",
FT_BOOLEAN, 8, NULL, 0x08,
NULL, HFILL }
},
{ &hf_pfcp_application_instance_id,
{ "Application Instance Identifier", "pfcp.application_instance_id",
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_flow_dir,
{ "Flow Direction", "pfcp.flow_dir",
FT_UINT8, BASE_DEC, VALS(pfcp_flow_dir_vals), 0x07,
NULL, HFILL }
},
{ &hf_pfcp_packet_rate,
{ "Flags", "pfcp.packet_rate",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_ulpr_b0,
{ "ULPR (Uplink Packet Rate)", "pfcp.packet_rate.ulpr",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
NULL, HFILL }
},
{ &hf_pfcp_dlpr_b1,
{ "DLPR (Downlink Packet Rate)", "pfcp.packet_rate.dlpr",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
NULL, HFILL }
},
{ &hf_pfcp_ul_time_unit,
{ "Uplink Time Unit", "pfcp.ul_time_unit",
FT_UINT8, BASE_DEC, VALS(pfcp_pr_time_unit_vals), 0x07,
NULL, HFILL }
},
{ &hf_pfcp_max_ul_pr,
{ "Maximum Uplink Packet Rate", "pfcp.max_ul_pr",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_dl_time_unit,
{ "Downlink Time Unit", "pfcp.dl_time_unit",
FT_UINT8, BASE_DEC, VALS(pfcp_pr_time_unit_vals), 0x07,
NULL, HFILL }
},
{ &hf_pfcp_max_dl_pr,
{ "Maximum Downlink Packet Rate", "pfcp.max_dl_pr",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_dl_flow_level_marking,
{ "Flags", "pfcp.dl_flow_level_marking",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_b0_ttc,
{ "TTC (ToS/Traffic Class)", "pfcp.dl_flow_level_marking.ttc",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x01,
NULL, HFILL }
},
{ &hf_pfcp_b1_sci,
{ "SCI(Service Class Indicator)", "pfcp.dl_flow_level_marking.sci",
FT_BOOLEAN, 8, TFS(&tfs_present_not_present), 0x02,
NULL, HFILL }
},
{ &hf_pfcp_sci,
{ "Service Class Indicator", "pfcp.sci",
FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
{ &hf_pfcp_dl_data_notification_delay,
{ "Delay Value", "pfcp.dl_data_notification_delay",
FT_UINT8, BASE_DEC, NULL, 0x0,
"Delay Value in integer multiples of 50 millisecs, or zero", HFILL }
},
{ &hf_pfcp_packet_count,
{ "Packet Count", "pfcp.packet_count",
FT_UINT16, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
};
/* Setup protocol subtree array */
#define NUM_INDIVIDUAL_ELEMS_PFCP 18
#define NUM_INDIVIDUAL_ELEMS_PFCP 24
gint *ett[NUM_INDIVIDUAL_ELEMS_PFCP +
(NUM_PFCP_IES - 1)];
@ -3478,6 +4114,12 @@ proto_register_pfcp(void)
ett[15] = &ett_pfcp_gate_status;
ett[16] = &ett_pfcp_report_type;
ett[17] = &ett_pfcp_up_function_features;
ett[18] = &ett_pfcp_report_trigger;
ett[19] = &ett_pfcp_volume_measurement;
ett[20] = &ett_pfcp_cp_function_features;
ett[21] = &ett_pfcp_usage_information;
ett[22] = &ett_pfcp_packet_rate;
ett[23] = &ett_pfcp_pfcp_dl_flow_level_marking;