aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2019-09-30 22:17:23 +0700
committerAnders Broman <a.broman58@gmail.com>2019-10-04 06:22:57 +0000
commite78430f059e43088df2a4f19aa2454c9ba8cfb6d (patch)
tree2e78f6a0cd556c380a6d00bb9a02214055518793
parent157dc2fb22c7195984dec5711fafd5f73018ad00 (diff)
GSMTAP: implement dissecting of PTCCH/D messages
According to 3GPP TS 45.002, section 3.3.4.2, PTCCH (Packet Timing advance control channel) is a packet dedicated channel, that is used for continuous Timing Advance control in (E)GPRS. There are two sub-types of that logical channel: - PTCCH/U (Uplink): used to transmit random Access Bursts to allow estimation of the Timing Advance for one MS in packet transfer mode. - PTCCH/D (Downlink): used by the network to transmit Timing Advance updates for several MS. As per 3GPP TS 45.003, section 5.2, the coding scheme used for PTCCH/U is the same as for PRACH as specified in subclause 5.3, while the coding scheme used for PTCCH/D is the same as for CS-1 as specified in subclause 5.1.1. The format of PTCCH/D messages can be described as follows: +--------------+--------------+-----+---------------+------------------+ | Octet 1 | Octet 2 | | Octet 16 | Octet 17 .. 23 | +---+----------+---+----------+-----+---+-----------+------------------+ | 0 | TA TAI=0 | 0 | TA TAI=1 | ... | 0 | TA TAI=15 | Padding 00101011 | +---+----------+---+----------+-----+---+-----------+------------------+ what gives us 16 Timing Advance values (7 bit each) for 16 different mobile stations identified by TAI (0..15). The remaining space is padding and shall be filled with constant value 0x2B. Bug: 16096 Change-Id: I0ce81d922a8a8c3981da2486baa3e1efcff46539 Reviewed-on: https://code.wireshark.org/review/34660 Reviewed-by: Pau Espin Pedrol <pespin@sysmocom.de> 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-gsmtap.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/epan/dissectors/packet-gsmtap.c b/epan/dissectors/packet-gsmtap.c
index 2bed82b04e..51b98ba4f5 100644
--- a/epan/dissectors/packet-gsmtap.c
+++ b/epan/dissectors/packet-gsmtap.c
@@ -65,6 +65,11 @@ static int hf_sacch_l1h_power_lev = -1;
static int hf_sacch_l1h_fpc = -1;
static int hf_sacch_l1h_ta = -1;
+static int hf_ptcch_spare = -1;
+static int hf_ptcch_ta_idx = -1;
+static int hf_ptcch_ta_val = -1;
+static int hf_ptcch_padding = -1;
+
static gint ett_gsmtap = -1;
enum {
@@ -427,6 +432,42 @@ dissect_sacch_l1h(tvbuff_t *tvb, proto_tree *tree)
proto_tree_add_item(l1h_tree, hf_sacch_l1h_ta, tvb, 1, 1, ENC_BIG_ENDIAN);
}
+/* Dissect a PTCCH/D (Packet Timing Advance Control Channel) message.
+ * See 3GPP TS 45.010, section 5.6.2 and 3GPP TS 45.002, section 3.3.4.2.
+ *
+ * +--------------+--------------+-----+---------------+------------------+
+ * | Octet 1 | Octet 2 | | Octet 16 | Octet 17 .. 23 |
+ * +---+----------+---+----------+-----+---+-----------+------------------+
+ * | 0 | TA TAI=0 | 0 | TA TAI=1 | ... | 0 | TA TAI=15 | Padding 00101011 |
+ * +---+----------+---+----------+-----+---+-----------+------------------+
+ */
+static void
+dissect_ptcch_dl(tvbuff_t *tvb, proto_tree *tree)
+{
+ proto_tree *sub_tree;
+ proto_item *ti, *gi;
+ int offset;
+
+ if (!tree)
+ return;
+
+ ti = proto_tree_add_protocol_format(tree, proto_gsmtap, tvb, 0, 23,
+ "PTCCH (Packet Timing Advance Control Channel) on Downlink");
+ sub_tree = proto_item_add_subtree(ti, ett_gsmtap);
+
+ for (offset = 0; offset < 16; offset++) {
+ /* Meta info: Timing Advance Index */
+ gi = proto_tree_add_uint(sub_tree, hf_ptcch_ta_idx, tvb, 0, 0, offset);
+ proto_item_set_generated(gi);
+
+ proto_tree_add_item(sub_tree, hf_ptcch_spare, tvb, offset, 1, ENC_NA);
+ proto_tree_add_item(sub_tree, hf_ptcch_ta_val, tvb, offset, 1, ENC_NA);
+ }
+
+ /* Spare padding */
+ proto_tree_add_item(sub_tree, hf_ptcch_padding, tvb, offset, -1, ENC_NA);
+}
+
static void
handle_lapdm(guint8 sub_type, tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
@@ -640,6 +681,17 @@ dissect_gsmtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _
sub_handle = GSMTAP_SUB_UM_RLC_MAC_DL;
}
break;
+ /* See 3GPP TS 45.003, section 5.2 "Packet control channels" */
+ case GSMTAP_CHANNEL_PTCCH:
+ /* PTCCH/D carries Timing Advance updates encoded with CS-1 */
+ if (pinfo->p2p_dir == P2P_DIR_RECV) {
+ dissect_ptcch_dl(payload_tvb, tree);
+ return tvb_captured_length(tvb);
+ }
+
+ /* PTCCH/U carries Access Bursts for Timing Advance estimation */
+ sub_handle = GSMTAP_SUB_DATA;
+ break;
case GSMTAP_CHANNEL_CBCH51:
case GSMTAP_CHANNEL_CBCH52:
@@ -789,6 +841,16 @@ proto_register_gsmtap(void)
NULL, HFILL } },
{ &hf_sacch_l1h_ta, { "Actual Timing Advance", "gsmtap.sacch_l1.ta",
FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
+
+ /* PTCCH (Packet Timing Advance Control Channel) on Downlink */
+ { &hf_ptcch_spare, { "Spare Bit", "gsmtap.ptcch.spare",
+ FT_UINT8, BASE_DEC, NULL, 0x80, NULL, HFILL } },
+ { &hf_ptcch_ta_idx, { "Timing Advance Index", "gsmtap.ptcch.ta_idx",
+ FT_UINT8, BASE_DEC, NULL, 0, NULL, HFILL } },
+ { &hf_ptcch_ta_val, { "Timing Advance Value", "gsmtap.ptcch.ta_val",
+ FT_UINT8, BASE_DEC, NULL, 0x7f, NULL, HFILL } },
+ { &hf_ptcch_padding, { "Spare Padding", "gsmtap.ptcch.padding",
+ FT_BYTES, SEP_SPACE, NULL, 0, NULL, HFILL } },
};
static gint *ett[] = {
&ett_gsmtap