aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorMatej Tkac <matej.tkac.mt@gmail.com>2017-11-10 10:50:09 +0100
committerAnders Broman <a.broman58@gmail.com>2017-11-10 12:07:08 +0000
commit6ef9538770e95bfcdda8422281013a517f92df3a (patch)
treefdb7fe3d90bfff3726bd2c462c67fa274811c1ca /epan/dissectors
parentcb7e896a4a450294dde70f01dc7cc105a883ef44 (diff)
[PFCP] PDN Type Dissection and minor fixes
Added PDN Type dissection (3GPP 29.244 Section 8.2.79) Fixed bit order in dissect_ue_ip_address Added "Encoding error" message if MBR or GBR has different format than specified in doc. Change-Id: I3b8b096fa490a2b4a16b3e6e9a640f92e389be1f Reviewed-on: https://code.wireshark.org/review/24334 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-pfcp.c86
1 files changed, 69 insertions, 17 deletions
diff --git a/epan/dissectors/packet-pfcp.c b/epan/dissectors/packet-pfcp.c
index 649de533bb..4f78b20aeb 100644
--- a/epan/dissectors/packet-pfcp.c
+++ b/epan/dissectors/packet-pfcp.c
@@ -97,6 +97,7 @@ static int hf_pfcp_f_teid_ch_id = -1;
static int hf_pfcp_f_teid_ipv4 = -1;
static int hf_pfcp_f_teid_ipv6 = -1;
static int hf_pfcp_pdn_instance = -1;
+static int hf_pfcp_pdn_type = -1;
static int hf_pfcp_ue_ip_address_flags = -1;
static int hf_pfcp_ue_ip_address_flag_b0 = -1;
static int hf_pfcp_ue_ip_address_flag_b1 = -1;
@@ -571,7 +572,8 @@ static const value_string pfcp_ie_type[] = {
{ 110, "OCI Flags" }, /* Extendable / Subclause 8.2.76 */
{ 111, "Sx Association Release Request" }, /* Extendable / Subclause 8.2.77 */
{ 112, "Graceful Release Period" }, /* Extendable / Subclause 8.2.78 */
- //113 to 65535 Spare. For future use.
+ { 113, "PDN Type" }, /* Fixed Length / Subclause 8.2.79 */
+ //114 to 65535 Spare. For future use.
{0, NULL}
};
@@ -835,15 +837,22 @@ static void
dissect_pfcp_mbr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
int offset = 0;
+ int len1 = (length != 10) ? length/2 : 5;
+
+ /* In case length is not in accordance with documentation */
+ if ( length != 10) {
+ proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, 0, 1);
+ }
+
/* 5 to 9 UL MBR
* The UL/DL MBR fields shall be encoded as kilobits per second (1 kbps = 1000 bps) in binary value
*/
- proto_tree_add_item(tree, hf_pfcp_ul_mbr, tvb, 5, length, ENC_BIG_ENDIAN);
- offset += 5;
+ proto_tree_add_item(tree, hf_pfcp_ul_mbr, tvb, offset, len1, ENC_BIG_ENDIAN);
+ offset += len1;
/* 10 to 14 DL MBR */
- proto_tree_add_item(tree, hf_pfcp_dl_mbr, tvb, 5, length, ENC_BIG_ENDIAN);
- offset += 5;
+ proto_tree_add_item(tree, hf_pfcp_dl_mbr, tvb, offset, len1, ENC_BIG_ENDIAN);
+ offset += len1;
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
@@ -858,15 +867,22 @@ static void
dissect_pfcp_gbr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
{
int offset = 0;
- /* 5 to 9 UL MBR
+ int len1 = (length != 10) ? length/2 : 5;
+
+ /* In case length is not in accordance with documentation */
+ if ( length != 10) {
+ proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_encoding_error, tvb, 0, 1);
+ }
+
+ /* 5 to 9 UL GBR
* The UL/DL MBR fields shall be encoded as kilobits per second (1 kbps = 1000 bps) in binary value
*/
- proto_tree_add_item(tree, hf_pfcp_ul_gbr, tvb, 5, length, ENC_BIG_ENDIAN);
- offset += 5;
+ proto_tree_add_item(tree, hf_pfcp_ul_gbr, tvb, offset, len1, ENC_BIG_ENDIAN);
+ offset += len1;
- /* 10 to 14 DL MBR */
- proto_tree_add_item(tree, hf_pfcp_dl_gbr, tvb, 5, length, ENC_BIG_ENDIAN);
- offset += 5;
+ /* 10 to 14 DL GBR */
+ proto_tree_add_item(tree, hf_pfcp_dl_gbr, tvb, offset, len1, ENC_BIG_ENDIAN);
+ offset += len1;
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
@@ -2460,17 +2476,18 @@ dissect_pfcp_ue_ip_address(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
ett_pfcp_ue_ip_address_flags, pfcp_ue_ip_address_flags, ENC_BIG_ENDIAN, BMT_NO_FALSE | BMT_NO_INT, &ue_ip_address_flags);
offset += 1;
- /* IPv4 address (if present)*/
- if ((ue_ip_address_flags & 0x1) == 1) {
- proto_tree_add_item(tree, hf_pfcp_ue_ip_addr_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
- offset += 4;
- }
/* IPv6 address (if present)*/
- if ((ue_ip_address_flags & 0x2) == 2) {
+ if ((ue_ip_address_flags & 0x1) == 1) {
proto_tree_add_item(tree, hf_pfcp_ue_ip_add_ipv6, tvb, offset, 16, ENC_NA);
offset += 16;
}
+ /* IPv4 address (if present)*/
+ if ((ue_ip_address_flags & 0x2) == 2) {
+ proto_tree_add_item(tree, hf_pfcp_ue_ip_addr_ipv4, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+ }
+
if (offset < length) {
proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
}
@@ -2951,6 +2968,35 @@ dissect_pfcp_graceful_release_period(tvbuff_t *tvb, packet_info *pinfo _U_, prot
}
}
+/*
+ * 8.2.79 PDN Type
+ */
+static const value_string pfcp_pdn_type_vals[] = {
+ { 0, "Reserved" },
+ { 1, "IPv4" },
+ { 2, "IPv6" },
+ { 3, "IPv4V6" },
+ { 4, "Non-IP" },
+ { 0, NULL }
+};
+
+static void
+dissect_pfcp_pdn_type(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item *item _U_, guint16 length, guint8 message_type _U_)
+{
+ int offset = 0;
+ guint32 value;
+ /* Octet 5 to (n+4) Application Identifier
+ * The Application Identifier shall be encoded as an OctetString (see 3GPP TS 29.212)
+ */
+ proto_tree_add_item_ret_uint(tree, hf_pfcp_pdn_type, tvb, offset, 1, ENC_BIG_ENDIAN, &value);
+ offset++;
+
+ proto_item_append_text(item, "%s", val_to_str_const(value, pfcp_pdn_type_vals, "Unknown"));
+
+ if (offset < length) {
+ proto_tree_add_expert(tree, pinfo, &ei_pfcp_ie_data_not_decoded, tvb, offset, -1);
+ }
+}
/* Array of functions to dissect IEs
@@ -3074,6 +3120,7 @@ static const pfcp_ie_t pfcp_ies[] = {
/* 110 */ { dissect_pfcp_oci_flags }, /* OCI Flags Extendable / Subclause 8.2.76 */
/* 111 */ { dissect_pfcp_sx_assoc_rel_req }, /* Sx Association Release Request Extendable / Subclause 8.2.77 */
/* 112 */ { dissect_pfcp_graceful_release_period }, /* Graceful Release Period Extendable / Subclause 8.2.78 */
+/* 113 */ { dissect_pfcp_pdn_type }, /* PDN Type Fixed Length / Subclause 8.2.79 */
{ NULL }, /* End of List */
};
@@ -3764,6 +3811,11 @@ proto_register_pfcp(void)
FT_BYTES, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
+ { &hf_pfcp_pdn_type,
+ { "PDN Type", "pfcp.pdn_type",
+ FT_UINT8, BASE_DEC, VALS(pfcp_pdn_type_vals), 0x7,
+ NULL, HFILL }
+ },
{ &hf_pfcp_ue_ip_address_flags,
{ "Flags", "pfcp.ue_ip_address_flags",
FT_UINT8, BASE_HEX, NULL, 0x0,