aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2019-11-07 11:36:36 +0100
committerAnders Broman <a.broman58@gmail.com>2019-11-07 11:07:55 +0000
commitc0ae7c1c97e7c495ba344a7363378c60e5a9e1dd (patch)
treedab5b676abb0a28ca68c4d987dc44ac26066fdf4
parentb56b6f6a8fa357a167e76a2001f5ae791eba64ea (diff)
RTCP: MCPTT add more dissection.
Change-Id: Ibd9e51802b12dcf993aa8564bee21ad42d8b8660 Reviewed-on: https://code.wireshark.org/review/35010 Petri-Dish: Anders Broman <a.broman58@gmail.com> Tested-by: Petri Dish Buildbot Reviewed-by: Anders Broman <a.broman58@gmail.com>
-rw-r--r--epan/dissectors/packet-rtcp.c171
1 files changed, 168 insertions, 3 deletions
diff --git a/epan/dissectors/packet-rtcp.c b/epan/dissectors/packet-rtcp.c
index 3435eb0a5a..7a07497817 100644
--- a/epan/dissectors/packet-rtcp.c
+++ b/epan/dissectors/packet-rtcp.c
@@ -60,6 +60,7 @@
#include "packet-rtcp.h"
#include "packet-rtp.h"
+#include "packet-e212.h"
#include <epan/conversation.h>
#include <epan/prefs.h>
@@ -751,6 +752,17 @@ static int hf_rtcp_mcptt_num_ssrc = -1;
static int hf_rtcp_mcptt_func_alias = -1;
static int hf_rtcp_mcptt_num_fas = -1;
static int hf_rtcp_mcptt_fa_len = -1;
+static int hf_rtcp_mcptt_loc_type = -1;
+static int hf_rtcp_mcptt_cellid = -1;
+static int hf_rtcp_mcptt_enodebid = -1;
+static int hf_rtcp_mcptt_ecgi_eci = -1;
+static int hf_rtcp_mcptt_tac = -1;
+static int hf_rtcp_mcptt_mbms_serv_area = -1;
+static int hf_rtcp_mcptt_mbsfn_area_id = -1;
+static int hf_rtcp_mcptt_lat = -1;
+static int hf_rtcp_mcptt_long = -1;
+static int hf_rtcp_mcptt_msg_type = -1;
+static int hf_rtcp_mcptt_num_loc = -1;
/* RTCP fields defining a sub tree */
static gint ett_rtcp = -1;
@@ -785,6 +797,7 @@ static gint ett_ms_vsr_entry = -1;
static gint ett_ms_ds = -1;
static gint ett_rtcp_mcpt = -1;
static gint ett_rtcp_mcptt_participant_ref = -1;
+static gint ett_rtcp_mcptt_eci = -1;
static expert_field ei_rtcp_bye_reason_not_padded = EI_INIT;
static expert_field ei_rtcp_xr_block_length_bad = EI_INIT;
@@ -797,6 +810,7 @@ static expert_field ei_rtcp_missing_block_header = EI_INIT;
static expert_field ei_rtcp_block_length = EI_INIT;
static expert_field ei_srtcp_encrypted_payload = EI_INIT;
static expert_field ei_rtcp_rtpfb_transportcc_bad = EI_INIT;
+static expert_field ei_rtcp_mcptt_location_type = EI_INIT;
/* Main dissection function */
static int dissect_rtcp( tvbuff_t *tvb, packet_info *pinfo,
@@ -2283,6 +2297,83 @@ static const value_string rtcp_mcptt_source_vals[] = {
{ 0, NULL },
};
+static const value_string rtcp_mcptt_loc_type_vals[] = {
+ { 0x0, "Not provided" },
+ { 0x1, "ECGI" },
+ { 0x2, "Tracking Area" },
+ { 0x3, "PLMN ID" },
+ { 0x4, "MBMS Service Area" },
+ { 0x5, "MBSFN Area ID" },
+ { 0x6, "Geographic coordinates" },
+ { 0, NULL },
+};
+
+static int
+dissect_rtcp_mcptt_location_ie(tvbuff_t* tvb, packet_info* pinfo, int offset, proto_tree* tree)
+{
+ guint32 loc_type;
+ const int* ECGI_flags[] = {
+ &hf_rtcp_mcptt_enodebid,
+ &hf_rtcp_mcptt_cellid,
+ NULL
+ };
+
+ /* Location Type */
+ proto_tree_add_item_ret_uint(tree, hf_rtcp_mcptt_loc_type, tvb, offset, 1, ENC_BIG_ENDIAN, &loc_type);
+ offset += 1;
+
+ switch (loc_type) {
+ case 0:
+ /* Not provided */
+ break;
+ case 1:
+ /* ECGI - 56 bits = MCC + MNC + ECI*/
+ dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, offset, E212_ECGI, TRUE);
+ offset += 3;
+ proto_tree_add_bitmask(tree, tvb, offset, hf_rtcp_mcptt_ecgi_eci, ett_rtcp_mcptt_eci, ECGI_flags, ENC_BIG_ENDIAN);
+ offset += 4;
+ break;
+ case 2:
+ /* Tracking Area - 40 bits = MCC + MNC + 16 bits */
+ /* ECGI - 56 bits = MCC + MNC + ECI*/
+ dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, offset, E212_ECGI, TRUE);
+ offset += 3;
+ proto_tree_add_item(tree, hf_rtcp_mcptt_tac, tvb, offset, 2, ENC_NA);
+ offset += 2;
+ break;
+ case 3:
+ /* PLMN ID - 24 bits = MCC+MNC */
+ dissect_e212_mcc_mnc_wmem_packet_str(tvb, pinfo, tree, offset, E212_ECGI, TRUE);
+ offset += 3;
+ break;
+ case 4:
+ /* MBMS Service Area - 16 bits = [0-65535] */
+ proto_tree_add_item(tree, hf_rtcp_mcptt_mbms_serv_area, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+ break;
+ case 5:
+ /* MBSFN Area ID - 8 bits = [0-255] */
+ proto_tree_add_item(tree, hf_rtcp_mcptt_mbsfn_area_id, tvb, offset, 1, ENC_BIG_ENDIAN);
+ offset += 1;
+ break;
+ case 6:
+ /* Geographic coordinates - 48 bits = latitude in first 24 bits + longitude in last 24 bits coded as
+ * in subclause 6.1 in 3GPP TS 23.032
+ * XXX Make use of dissect_geographical_description() ?
+ */
+ proto_tree_add_item(tree, hf_rtcp_mcptt_lat, tvb, offset, 3, ENC_BIG_ENDIAN);
+ offset += 3;
+ proto_tree_add_item(tree, hf_rtcp_mcptt_long, tvb, offset, 3, ENC_BIG_ENDIAN);
+ offset += 3;
+ break;
+ default:
+ proto_tree_add_expert(tree, pinfo, &ei_rtcp_mcptt_location_type, tvb, offset-1, 1);
+ break;
+ }
+
+ return offset;
+}
+
/* TS 24.380 */
static int
dissect_rtcp_app_mcpt(tvbuff_t* tvb, packet_info* pinfo, int offset, proto_tree* tree,
@@ -2447,8 +2538,10 @@ dissect_rtcp_app_mcpt(tvbuff_t* tvb, packet_info* pinfo, int offset, proto_tree*
}
case 12:
/* Message Type */
- proto_tree_add_item(sub_tree, hf_rtcp_mcptt_fld_val, tvb, offset, mcptt_fld_len, ENC_NA);
- offset += mcptt_fld_len;
+ proto_tree_add_item(sub_tree, hf_rtcp_mcptt_msg_type, tvb, offset, 1, ENC_NA);
+ offset += 1;
+ proto_tree_add_item(sub_tree, hf_rtcp_spare16, tvb, offset, 1, ENC_NA);
+ offset += 1;
break;
case 13:
{
@@ -2524,8 +2617,23 @@ dissect_rtcp_app_mcpt(tvbuff_t* tvb, packet_info* pinfo, int offset, proto_tree*
case 19:
/* Location */
+ offset = dissect_rtcp_mcptt_location_ie(tvb, pinfo, offset, sub_tree);
+ break;
case 20:
/* List of Locations */
+ {
+ guint32 num_loc;
+ /* Number of SSRCs*/
+ proto_tree_add_item_ret_uint(sub_tree, hf_rtcp_mcptt_num_loc, tvb, offset, 1, ENC_BIG_ENDIAN, &num_loc);
+ offset += 1;
+
+ while (num_loc > 0) {
+ offset = dissect_rtcp_mcptt_location_ie(tvb, pinfo, offset, sub_tree);
+ num_loc--;
+ }
+ break;
+ }
+
default:
proto_tree_add_item(sub_tree, hf_rtcp_mcptt_fld_val, tvb, offset, mcptt_fld_len, ENC_NA);
offset += mcptt_fld_len;
@@ -7343,6 +7451,61 @@ proto_register_rtcp(void)
FT_UINT8, BASE_DEC, NULL, 0x0,
NULL, HFILL }
},
+ { &hf_rtcp_mcptt_loc_type,
+ { "Location Type", "rtcp.app_data.mcptt.loc_type",
+ FT_UINT8, BASE_DEC, VALS(rtcp_mcptt_loc_type_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_rtcp_mcptt_cellid,
+ {"CellId", "rtcp.app_data.mcptt.cellid",
+ FT_UINT32, BASE_DEC, NULL, 0xFF,
+ NULL, HFILL}
+ },
+ { &hf_rtcp_mcptt_enodebid,
+ { "eNodeB Id", "rtcp.app_data.mcptt.enodebid",
+ FT_UINT32, BASE_DEC, NULL, 0x0FFFFF00,
+ NULL, HFILL }
+ },
+ { &hf_rtcp_mcptt_ecgi_eci,
+ {"ECI (E-UTRAN Cell Identifier)", "rtcp.app_data.mcptt.ecgi_eci",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}
+ },
+ { &hf_rtcp_mcptt_tac,
+ { "Tracking Area Code", "rtcp.app_data.mcptt.tac",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_rtcp_mcptt_mbms_serv_area,
+ { "MBMS Service Area", "rtcp.app_data.mcptt.mbms_serv_area",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_rtcp_mcptt_mbsfn_area_id,
+ { "MBSFN Area ID", "rtcp.app_data.mcptt.mbsfn_area_id",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_rtcp_mcptt_lat,
+ { "Latitude value", "rtcp.app_data.mcptt.lat",
+ FT_INT24, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_rtcp_mcptt_long,
+ { "Longitude value", "rtcp.app_data.mcptt.long",
+ FT_INT24, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
+ { &hf_rtcp_mcptt_msg_type,
+ { "Message Type", "rtcp.app_data.mcptt.msg_type",
+ FT_UINT8, BASE_DEC, VALS(rtcp_mcpt_subtype_vals), 0x0,
+ NULL, HFILL }
+ },
+ { &hf_rtcp_mcptt_num_loc,
+ { "Number of Locations", "rtcp.app_data.mcptt.num_loc",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ NULL, HFILL }
+ },
};
static gint *ett[] =
@@ -7378,7 +7541,8 @@ proto_register_rtcp(void)
&ett_ms_vsr_entry,
&ett_ms_ds,
&ett_rtcp_mcpt,
- &ett_rtcp_mcptt_participant_ref
+ &ett_rtcp_mcptt_participant_ref,
+ &ett_rtcp_mcptt_eci
};
static ei_register_info ei[] = {
@@ -7393,6 +7557,7 @@ proto_register_rtcp(void)
{ &ei_rtcp_block_length, { "rtcp.block_length.invalid", PI_PROTOCOL, PI_WARN, "Block length is greater than packet length", EXPFILL }},
{ &ei_srtcp_encrypted_payload, { "srtcp.encrypted_payload", PI_UNDECODED, PI_WARN, "Encrypted RTCP Payload - not dissected", EXPFILL }},
{ &ei_rtcp_rtpfb_transportcc_bad, { "rtcp.rtpfb.transportcc_bad", PI_MALFORMED, PI_WARN, "Too many packet chunks (more than packet status count)", EXPFILL }},
+ { &ei_rtcp_mcptt_location_type, { "rtcp.mcpttb.location_type_uk", PI_PROTOCOL, PI_WARN, "Unknown location type", EXPFILL }},
};
module_t *rtcp_module;