aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorSylvain Munaut <tnt@246tNt.com>2015-01-04 16:46:12 +0100
committerPascal Quantin <pascal.quantin@gmail.com>2015-01-04 16:29:43 +0000
commit84e43d9cb3334daa361312fccc4c308c594da6a3 (patch)
tree00ecf62fd2e2878dab474487c4de0fc4e60509f3 /epan
parent1cd9d023ba74e8e67c28194970b0fd9a215b098d (diff)
gmr1_rach: Add support for GmPRS/GMR-1 3G Channel Request Type 1 & 2
Those are related to the Packet Data service. Change-Id: Ia8e9732901609e1cdad38558aac4a2f3475a0a9d Signed-off-by: Sylvain Munaut <tnt@246tNt.com> Reviewed-on: https://code.wireshark.org/review/6291 Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-gmr1_rach.c462
1 files changed, 446 insertions, 16 deletions
diff --git a/epan/dissectors/packet-gmr1_rach.c b/epan/dissectors/packet-gmr1_rach.c
index 298c2b1712..d6394ab7f1 100644
--- a/epan/dissectors/packet-gmr1_rach.c
+++ b/epan/dissectors/packet-gmr1_rach.c
@@ -46,9 +46,12 @@ static int proto_gmr1_rach = -1;
static gint ett_rach_msg = -1;
static gint ett_rach_kls1 = -1;
static gint ett_rach_kls2 = -1;
+static gint ett_rach_gmprs_type1_kls2 = -1;
+static gint ett_rach_gmprs_type2_kls2 = -1;
static gint ett_rach_est_cause = -1;
static gint ett_rach_dialed_num = -1;
static gint ett_rach_gps_pos = -1;
+static gint ett_rach_gmprs_req_type = -1;
/* Handoffs */
static dissector_handle_t data_handle;
@@ -86,6 +89,23 @@ static int hf_rach_r = -1;
static int hf_rach_o = -1;
static int hf_rach_number_type = -1;
+static int hf_rach_gmprs_term_type = -1;
+static int hf_rach_gmprs_radio_prio = -1;
+static int hf_rach_gmprs_tlli = -1;
+static int hf_rach_gmprs_num_rlc_blks = -1;
+static int hf_rach_gmprs_peak_tput = -1;
+static int hf_rach_gmprs_dl_peak_tput = -1;
+static int hf_rach_gmprs_ul_peak_tput = -1;
+static int hf_rach_gmprs_rlc_mode = -1;
+static int hf_rach_gmprs_llc_mode = -1;
+static int hf_rach_gmprs_spare1 = -1;
+static int hf_rach_gmprs_spare2 = -1;
+static int hf_rach_gmprs_spare3 = -1;
+static int hf_rach_gmprs_reserved1 = -1;
+static int hf_rach_gmprs_req_type = -1;
+static int hf_rach_gmprs_req_type_pag_resp = -1;
+static int hf_rach_gmprs_chan_needed = -1;
+
static const value_string rach_prio_vals[] = {
{ 0, "Normal Call" },
@@ -95,11 +115,14 @@ static const value_string rach_prio_vals[] = {
static const value_string rach_est_cause_vals[] = {
{ 4, "In response to alerting" },
+ { 7, "(GmPRS) Channel Request Type 2" },
{ 8, "Location update" },
{ 9, "IMSI Detach" },
{ 10, "Supplementary Services" },
{ 11, "Short Message Services" },
{ 12, "Position Verification" },
+ { 13, "(GmPRS) Attach/RA Update" },
+ { 14, "(GmPRS) Packet Data Transfer" },
{ 15, "Emergency Call" },
{ 0, NULL }
};
@@ -147,13 +170,19 @@ static const value_string rach_precorr_vals[] = {
};
static void
-dissect_gmr1_rach_kls1(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
- int *is_moc)
+dissect_gmr1_rach_kls1(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *root_tree,
+ int *is_moc, int *is_pdt)
{
+ proto_tree *tree = NULL;
proto_item *ec_item = NULL;
proto_tree *ec_tree = NULL;
guint8 ec;
+ /* Tree */
+ tree = proto_tree_add_subtree(
+ root_tree, tvb, 0, 2,
+ ett_rach_kls1, NULL, "Class-1 informations");
+
/* Priority */
proto_tree_add_item(tree, hf_rach_prio,
tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -162,6 +191,7 @@ dissect_gmr1_rach_kls1(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree
ec = (tvb_get_guint8(tvb, offset) >> 1) & 0x1f;
*is_moc = !!(ec & 0x10);
+ *is_pdt = (ec == 14);
if (ec & 0x10)
{
@@ -191,8 +221,15 @@ dissect_gmr1_rach_kls1(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree
proto_tree_add_item(ec_tree, hf_rach_chan_needed,
tvb, offset, 1, ENC_BIG_ENDIAN);
}
+ else if (ec == 7)
+ {
+ /* Channel Request Type 2 */
+ proto_tree_add_item(tree, hf_rach_est_cause,
+ tvb, offset, 1, ENC_BIG_ENDIAN);
+ }
else
{
+ /* Other */
proto_tree_add_item(tree, hf_rach_est_cause,
tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -360,6 +397,68 @@ static const value_string rach_number_type_vals[] = {
{ 0, NULL }
};
+static const value_string rach_gmprs_term_type_vals[] = {
+ { 0x09, "Multislot class 2, Power class 1 (type C), Half Duplex, Handheld, Internal antenna, A/Gb interface, L-band" },
+ { 0x0a, "Multislot class 3, Power class 1 (type C), Half Duplex, Handheld, Internal antenna, A/Gb interface, L-band" },
+ { 0x0b, "Multislot class 4, Power class 1 (type C), Half Duplex, Handheld, Internal antenna, A/Gb interface, L-band" },
+ { 0x0c, "Multislot class 1, Power class 1 (type C), Full Duplex, Handheld, Internal antenna, A/Gb interface, L-band" },
+ { 0x0d, "Multislot class 1, Power class 9 (type D), Full Duplex, Fixed, Internal antenna, Gb interface, L-band" },
+ { 0x0e, "Multislot class 1, Power class 9 (type D), Full Duplex, Fixed, Passive external antenna, Gb interface, L-band" },
+ { 0x0f, "Multislot class 1, Power class 9 (type D), Full Duplex, Fixed, Active external antenna, Gb interface, L-band" },
+ { 0x10, "Multislot class 4, Power class 1 (type E), Half Duplex, Handheld, Internal antenna, Iu-PS interface, S-band" },
+ { 0x11, "Multislot class 5, Power class 1 (type E), Half Duplex, Handheld, Internal antenna, Iu-PS interface, S-band" },
+ { 0x12, "Multislot class 5, Power class 1 (type E), Half Duplex, Handheld, Internal antenna, Iu-PS interface, S-band" },
+ { 0x15, "Multislot class 3, Power class 1 (type F), Half Duplex, Handheld, Internal antenna, Iu-PS interface, S-band" },
+ { 0x1a, "Multislot class 3, Power class 1 (type G), Half Duplex, Handheld, Internal antenna, Iu-PS interface, S-band" },
+ { 0x1f, "Multislot class 1, Power class 2 (type H), Full Duplex, Vehicular, Internal antenna, Iu-PS interface, S-band" },
+ { 0x20, "Multislot class 5, Power class 2 (type H), Full Duplex, Vehicular, Internal antenna, Iu-PS interface, S-band" },
+ { 0x24, "Multislot class 1, Power class 9 (type I), Full Duplex, Fixed, Internal antenna, Iu-PS interface, S-band" },
+ { 0x25, "Multislot class 1, Power class 9 (type I), Full Duplex, Fixed, Internal antenna, Iu-PS interface, S-band" },
+ { 0x29, "Multislot class 3, (type J), Half Duplex, Handheld, Internal antenna, Iu-PS interface, L-band" },
+ { 0x2e, "Multislot class 3, (type K), Half Duplex, Handheld, Internal antenna, Iu-PS interface, L-band" },
+ { 0x33, "Multislot class 1, (type L), Full Duplex, Handheld, Internal antenna, Iu-PS interface, L-band" },
+ { 0x38, "Multislot class 1, (type M), Full Duplex, Fixed, External antenna, Iu-PS interface, L-band" },
+ { 0x40, "Reserved" },
+ { 0x48, "Multislot class 1, Power class 8 (type A), Full Duplex, Fixed, Internal antenna, Gb interface, L-band" },
+ { 0, NULL }
+};
+static value_string_ext rach_gmprs_term_type_ext_vals = VALUE_STRING_EXT_INIT(rach_gmprs_term_type_vals);
+
+static const value_string rach_gmprs_radio_prio_vals[] = {
+ { 0, "Radio Priority 1 (1=highest, 4=lowest)" },
+ { 1, "Radio Priority 2 (1=highest, 4=lowest)" },
+ { 2, "Radio Priority 3 (1=highest, 4=lowest)" },
+ { 3, "Radio Priority 4 (1=highest, 4=lowest)" },
+ { 0, NULL }
+};
+
+static const true_false_string rach_gmprs_rlc_mode_tfs = {
+ "Unacknowledged",
+ "Acknowledged"
+};
+
+static const true_false_string rach_gmprs_llc_mode_tfs = {
+ "Data packets",
+ "SACK/ACK packets"
+};
+
+static const value_string rach_gmprs_req_type_vals[] = {
+ { 0x04, "Suspend - In Response to Alerting for circuit switched services" },
+ { 0x06, "Suspend - MO Call" },
+ { 0x07, "Resume" },
+ { 0x08, "Suspend - Location Update" },
+ { 0x09, "Suspend - IMSI Detach" },
+ { 0x0a, "Suspend - Supplementary Services" },
+ { 0x0b, "Suspend - Short Message Services" },
+ { 0x0f, "Suspend - Emergency Call" },
+ { 0, NULL }
+};
+
+static const value_string rach_gmprs_req_type_pag_resp_vals[] = {
+ { 0x00, "Suspend - Answer to Paging" },
+ { 0, NULL }
+};
+
static int
_parse_dialed_number(gchar *s, int slen, tvbuff_t *tvb, int offset)
{
@@ -447,12 +546,18 @@ _parse_dialed_number(gchar *s, int slen, tvbuff_t *tvb, int offset)
}
static void
-dissect_gmr1_rach_kls2(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,
+dissect_gmr1_rach_kls2(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *root_tree,
int is_moc)
{
+ proto_tree *tree = NULL;
proto_item *dialed_num_item = NULL;
proto_tree *dialed_num_tree = NULL, *gps_pos_tree = NULL;
+ /* Tree */
+ tree = proto_tree_add_subtree(
+ root_tree, tvb, 2, 16,
+ ett_rach_kls2, NULL, "Class-2 informations");
+
/* MES Power Class */
proto_tree_add_item(tree, hf_rach_mes_pwr_class,
tvb, offset, 1, ENC_BIG_ENDIAN);
@@ -544,22 +649,264 @@ dissect_gmr1_rach_kls2(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree
tvb, offset + 15, 1, ENC_BIG_ENDIAN);
}
+static const crumb_spec_t rach_gmprs_type1_term_type_crumbs[] = {
+ { 0, 4 },
+ { 29, 3 },
+ { 0, 0 }
+};
+
+static const crumb_spec_t rach_gmprs_num_rlc_blks_crumbs[] = {
+ { 0, 8 },
+ { 14, 2 },
+ { 0, 0 }
+};
+
+static void
+dissect_gmprs_rach_type1_kls2(tvbuff_t *tvb, int offset,
+ packet_info *pinfo, proto_tree *root_tree, int is_pdt)
+{
+ proto_tree *tree = NULL;
+ proto_tree *gps_pos_tree = NULL;
+ guint8 term_type;
+ int is_class_d;
+
+ /* Tree */
+ tree = proto_tree_add_subtree(
+ root_tree, tvb, 2, 16,
+ ett_rach_gmprs_type1_kls2, NULL, "GmPRS Type-1 Class-2 informations");
+
+ /* GmPRS Terminal Type */
+ proto_tree_add_split_bits_item_ret_val(
+ tree, hf_rach_gmprs_term_type,
+ tvb, offset << 3,
+ rach_gmprs_type1_term_type_crumbs,
+ NULL);
+
+ term_type = ((tvb_get_guint8(tvb, offset) >> 1) & 0x78 ) |
+ ( tvb_get_guint8(tvb, offset + 3) & 0x07);
+
+ is_class_d = (term_type == 0x0d) ||
+ (term_type == 0x0e) ||
+ (term_type == 0x0f);
+
+ /* Class D terminal ? */
+ if (is_class_d) {
+ /* DL Peak Throughput */
+ proto_tree_add_item(tree, hf_rach_gmprs_dl_peak_tput,
+ tvb, offset, 1, ENC_BIG_ENDIAN);
+
+ /* Reserved */
+ proto_tree_add_item(tree, hf_rach_gmprs_reserved1,
+ tvb, offset, 2, ENC_BIG_ENDIAN);
+ } else {
+ /* SP/HPLMN ID */
+ proto_tree_add_item(tree, hf_rach_sp_hplmn_id,
+ tvb, offset, 3, ENC_BIG_ENDIAN);
+ }
+
+ /* Radio Priority */
+ proto_tree_add_item(tree, hf_rach_gmprs_radio_prio,
+ tvb, offset + 3, 1, ENC_BIG_ENDIAN);
+
+ /* Spare */
+ proto_tree_add_item(tree, hf_rach_gmprs_spare1,
+ tvb, offset + 3, 1, ENC_BIG_ENDIAN);
+
+ /* PD */
+ proto_tree_add_item(tree, hf_rach_pd,
+ tvb, offset + 3, 1, ENC_BIG_ENDIAN);
+
+ /* TLLI */
+ proto_tree_add_item(tree, hf_rach_gmprs_tlli,
+ tvb, offset + 4, 4, ENC_BIG_ENDIAN);
+
+ /* Is it for Packet Data Transfer ? */
+ if (is_pdt) {
+ /* Number of RLC blocks */
+ proto_tree_add_split_bits_item_ret_val(
+ tree, hf_rach_gmprs_num_rlc_blks,
+ tvb, (offset + 8) << 3,
+ rach_gmprs_num_rlc_blks_crumbs,
+ NULL);
+
+ /* (UL) Peak Throughput */
+ proto_tree_add_item(tree, is_class_d ?
+ hf_rach_gmprs_ul_peak_tput :
+ hf_rach_gmprs_peak_tput,
+ tvb, offset + 9, 1, ENC_BIG_ENDIAN);
+
+ /* Spare */
+ proto_tree_add_item(tree, hf_rach_gmprs_spare2,
+ tvb, offset + 9, 1, ENC_BIG_ENDIAN);
+ } else {
+ /* GPS timestamp */
+ proto_tree_add_item(tree, hf_rach_gps_timestamp,
+ tvb, offset + 8, 2, ENC_BIG_ENDIAN);
+ }
+
+ /* GPS Position */
+ gps_pos_tree = proto_tree_add_subtree(
+ tree, tvb, offset + 10, 5,
+ ett_rach_gps_pos, NULL, "GPS Position");
+
+ dissect_gmr1_rach_gps_pos(tvb, offset + 10, pinfo, gps_pos_tree);
+
+ /* RLC mode */
+ /* Off-the-air data shows bit is sometimes set even
+ * when not a PDT ... */
+ proto_tree_add_item(tree, hf_rach_gmprs_rlc_mode,
+ tvb, offset + 15, 1, ENC_BIG_ENDIAN);
+
+ /* LLC mode */
+ /* Off-the-air data shows bit is sometimes set even
+ * when not a PDT ... */
+ proto_tree_add_item(tree, hf_rach_gmprs_llc_mode,
+ tvb, offset + 15, 1, ENC_BIG_ENDIAN);
+
+ /* Spare */
+ proto_tree_add_item(tree, hf_rach_gmprs_spare3,
+ tvb, offset + 15, 1, ENC_BIG_ENDIAN);
+}
+
+static const crumb_spec_t rach_gmprs_type2_term_type_crumbs[] = {
+ { 0, 4 },
+ { 64, 3 },
+ { 0, 0 }
+};
+
+static void
+dissect_gmprs_rach_type2_kls2(tvbuff_t *tvb, int offset,
+ packet_info *pinfo, proto_tree *root_tree)
+{
+ proto_tree *tree = NULL;
+ proto_tree *gps_pos_tree = NULL;
+ guint8 req_type;
+
+ /* Tree */
+ tree = proto_tree_add_subtree(
+ root_tree, tvb, 2, 16,
+ ett_rach_gmprs_type2_kls2, NULL, "GmPRS Type-2 Class-2 informations");
+
+ /* GmPRS Terminal type */
+ proto_tree_add_split_bits_item_ret_val(
+ tree, hf_rach_gmprs_term_type,
+ tvb, offset << 3,
+ rach_gmprs_type2_term_type_crumbs,
+ NULL);
+
+ /* SP/HPLMN ID */
+ proto_tree_add_item(tree, hf_rach_sp_hplmn_id,
+ tvb, offset, 3, ENC_BIG_ENDIAN);
+
+ /* PD */
+ proto_tree_add_item(tree, hf_rach_pd,
+ tvb, offset + 3, 1, ENC_BIG_ENDIAN);
+
+ /* MSC ID */
+ proto_tree_add_item(tree, hf_rach_msc_id,
+ tvb, offset + 3, 1, ENC_BIG_ENDIAN);
+
+ /* TLLI */
+ proto_tree_add_item(tree, hf_rach_gmprs_tlli,
+ tvb, offset + 4, 4, ENC_BIG_ENDIAN);
+
+ /* Request type */
+ req_type = tvb_get_guint8(tvb, offset + 8) & 0x1f;
+
+ if ((req_type & 0x1c) == 0) {
+ /* Paging response */
+ proto_item *rt_item = proto_tree_add_item(
+ tree, hf_rach_gmprs_req_type_pag_resp,
+ tvb, offset + 8, 1, ENC_BIG_ENDIAN);
+
+ proto_tree *rt_tree = proto_item_add_subtree(rt_item, ett_rach_gmprs_req_type);
+
+ col_append_str(pinfo->cinfo, COL_INFO, "Paging response ");
+
+ /* Channel Needed */
+ proto_tree_add_item(rt_tree, hf_rach_gmprs_chan_needed,
+ tvb, offset + 8, 1, ENC_BIG_ENDIAN);
+ } else {
+ /* Other */
+ proto_tree_add_item(tree, hf_rach_gmprs_req_type,
+ tvb, offset + 8, 1, ENC_BIG_ENDIAN);
+
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s",
+ val_to_str(req_type, rach_gmprs_req_type_vals, "Unknown (%u)"));
+ }
+
+ /* Software version number */
+ proto_tree_add_item(tree, hf_rach_software_version,
+ tvb, offset + 9, 1, ENC_BIG_ENDIAN);
+
+ /* Spare */
+ proto_tree_add_item(tree, hf_rach_spare,
+ tvb, offset + 9, 1, ENC_BIG_ENDIAN);
+
+ /* GPS Position */
+ gps_pos_tree = proto_tree_add_subtree(
+ tree, tvb, offset + 10, 5,
+ ett_rach_gps_pos, NULL, "GPS Position");
+
+ dissect_gmr1_rach_gps_pos(tvb, offset + 10, pinfo, gps_pos_tree);
+
+ /* GCI */
+ proto_tree_add_item(tree, hf_rach_gci,
+ tvb, offset + 15, 1, ENC_BIG_ENDIAN);
+
+ /* R */
+ proto_tree_add_item(tree, hf_rach_r,
+ tvb, offset + 15, 1, ENC_BIG_ENDIAN);
+
+ /* O */
+ proto_tree_add_item(tree, hf_rach_o,
+ tvb, offset + 15, 1, ENC_BIG_ENDIAN);
+}
static void
dissect_gmr1_rach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
+ const int RACH_IE_CLASS1 = (1 << 0);
+ const int RACH_IE_CLASS2_GMR1 = (1 << 1);
+ const int RACH_IE_CLASS2_GMPRS_TYPE1 = (1 << 2);
+ const int RACH_IE_CLASS2_GMPRS_TYPE2 = (1 << 3);
+
proto_item *rach_item;
- proto_tree *rach_tree, *kls1_tree, *kls2_tree;
- int len, is_moc;
+ proto_tree *rach_tree;
+ const char *desc;
+ int len, is_moc, is_pdt, ies;
len = tvb_length(tvb);
+ desc = "GMR-1 Channel Request (RACH)";
+ ies = 0;
+
+ if (len == 18) {
+ guint8 ec = (tvb_get_guint8(tvb, 0) >> 1) & 0x1f;
+
+ ies |= RACH_IE_CLASS1;
+
+ if ((ec == 13) || (ec == 14)) {
+ desc = "GMR-1 GmPRS Channel Request Type 1 (RACH)";
+ ies |= RACH_IE_CLASS2_GMPRS_TYPE1;
+ } else if (ec == 7) {
+ desc = "GMR-1 GmPRS Channel Request Type 2 (RACH)";
+ ies |= RACH_IE_CLASS2_GMPRS_TYPE2;
+ } else if (ec == 12) {
+ /* Position verification exists in both GMR-1 and GmPRS-1
+ * I have no idea how to differentiate them ... but from
+ * off-the-air data, it seems it used the GMR-1 format */
+ ies |= RACH_IE_CLASS2_GMR1;
+ } else {
+ ies |= RACH_IE_CLASS2_GMR1;
+ }
+ }
+
rach_item = proto_tree_add_protocol_format(
- tree, proto_gmr1_rach, tvb, 0, len,
- "GMR-1 Channel Request (RACH)");
+ tree, proto_gmr1_rach, tvb, 0, len, "%s", desc);
rach_tree = proto_item_add_subtree(rach_item, ett_rach_msg);
- if (len != 18) {
+ if (!ies) {
col_append_str(pinfo->cinfo, COL_INFO, "(Invalid)");
call_dissector(data_handle, tvb, pinfo, tree);
return;
@@ -567,17 +914,17 @@ dissect_gmr1_rach(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
col_append_str(pinfo->cinfo, COL_INFO, "(RACH) ");
- kls1_tree = proto_tree_add_subtree(
- rach_tree, tvb, 0, 2,
- ett_rach_kls1, NULL, "Class-1 informations");
+ if (ies & RACH_IE_CLASS1)
+ dissect_gmr1_rach_kls1(tvb, 0, pinfo, rach_tree, &is_moc, &is_pdt);
- dissect_gmr1_rach_kls1(tvb, 0, pinfo, kls1_tree, &is_moc);
+ if (ies & RACH_IE_CLASS2_GMR1)
+ dissect_gmr1_rach_kls2(tvb, 2, pinfo, rach_tree, is_moc);
- kls2_tree = proto_tree_add_subtree(
- rach_tree, tvb, 2, 16,
- ett_rach_kls2, NULL, "Class-2 informations");
+ if (ies & RACH_IE_CLASS2_GMPRS_TYPE1)
+ dissect_gmprs_rach_type1_kls2(tvb, 2, pinfo, rach_tree, is_pdt);
- dissect_gmr1_rach_kls2(tvb, 2, pinfo, kls2_tree, is_moc);
+ if (ies & RACH_IE_CLASS2_GMPRS_TYPE2)
+ dissect_gmprs_rach_type2_kls2(tvb, 2, pinfo, rach_tree);
}
void
@@ -730,15 +1077,98 @@ proto_register_gmr1_rach(void)
FT_UINT8, BASE_DEC, VALS(rach_number_type_vals), 0x07,
"For MO Call only", HFILL }
},
+ { &hf_rach_gmprs_term_type,
+ { "GmPRS Terminal Type", "gmr1.rach.gmprs_term_type",
+ FT_UINT8, BASE_DEC | BASE_EXT_STRING, &rach_gmprs_term_type_ext_vals, 0x00,
+ "See GMR-1 3G 45.002 Annex C for infos", HFILL }
+ },
+ { &hf_rach_gmprs_radio_prio,
+ { "Radio Priority", "gmr1.rach.gmprs_radio_prio",
+ FT_UINT8, BASE_DEC, VALS(rach_gmprs_radio_prio_vals), 0x18,
+ "See GMPRS-1 04.060 for infos", HFILL }
+ },
+ { &hf_rach_gmprs_tlli,
+ { "TLLI", "gmr1.rach.gmprs_tlli",
+ FT_UINT32, BASE_HEX, NULL, 0x00,
+ "See GMPRS-1 04.060 for infos", HFILL }
+ },
+ { &hf_rach_gmprs_num_rlc_blks,
+ { "Number of RLC blocks", "gmr1.rach.gmprs_num_rlc_blks",
+ FT_UINT16, BASE_DEC, NULL, 0x00,
+ "See GMPRS-1 04.060 12.31 for infos", HFILL }
+ },
+ { &hf_rach_gmprs_peak_tput,
+ { "Peak Throughput", "gmr1.rach.gmprs_peak_tput",
+ FT_UINT8, BASE_DEC, NULL, 0x3c,
+ "See GMPRS-1 04.060 for infos", HFILL }
+ },
+ { &hf_rach_gmprs_dl_peak_tput,
+ { "DL Peak Throughput", "gmr1.rach.gmprs_dl_peak_tput",
+ FT_UINT8, BASE_DEC, NULL, 0x0f,
+ "See 3GPP TS 23.060 for infos", HFILL }
+ },
+ { &hf_rach_gmprs_ul_peak_tput,
+ { "UL Peak Throughput", "gmr1.rach.gmprs_ul_peak_tput",
+ FT_UINT8, BASE_DEC, NULL, 0x3c,
+ "See 3GPP TS 23.060 for infos", HFILL }
+ },
+ { &hf_rach_gmprs_rlc_mode,
+ { "RLC mode", "gmr1.rach.gmprs_rlc_mode",
+ FT_BOOLEAN, 8, TFS(&rach_gmprs_rlc_mode_tfs), 0x01,
+ NULL, HFILL }
+ },
+ { &hf_rach_gmprs_llc_mode,
+ { "LLC mode", "gmr1.rach.gmprs_llc_mode",
+ FT_BOOLEAN, 8, TFS(&rach_gmprs_llc_mode_tfs), 0x02,
+ NULL, HFILL }
+ },
+ { &hf_rach_gmprs_spare1,
+ { "Spare", "gmr1.rach.gmprs_spare1",
+ FT_UINT8, BASE_DEC, NULL, 0x20,
+ NULL, HFILL }
+ },
+ { &hf_rach_gmprs_spare2,
+ { "Spare", "gmr1.rach.gmprs_spare2",
+ FT_UINT8, BASE_DEC, NULL, 0xc0,
+ NULL, HFILL }
+ },
+ { &hf_rach_gmprs_spare3,
+ { "Spare", "gmr1.rach.gmprs_spare3",
+ FT_UINT8, BASE_DEC, NULL, 0x04,
+ NULL, HFILL }
+ },
+ { &hf_rach_gmprs_reserved1,
+ { "Reserved", "gmr1.rach.gmprs_reserved1",
+ FT_UINT16, BASE_HEX, NULL, 0xffff,
+ NULL, HFILL }
+ },
+ { &hf_rach_gmprs_req_type,
+ { "Request Type", "gmr1.rach.gmprs_req_type",
+ FT_UINT8, BASE_DEC, VALS(rach_gmprs_req_type_vals), 0x1f,
+ NULL, HFILL }
+ },
+ { &hf_rach_gmprs_req_type_pag_resp,
+ { "Request Type", "gmr1.rach.gmprs_req_type.pag_resp",
+ FT_UINT8, BASE_DEC, VALS(rach_gmprs_req_type_pag_resp_vals), 0x1c,
+ NULL, HFILL }
+ },
+ { &hf_rach_gmprs_chan_needed,
+ { "Channel Needed", "gmr1.rach.gmprs_chan_needed",
+ FT_UINT8, BASE_DEC, VALS(rach_chan_needed_vals), 0x03,
+ "Echoed from Paging Request", HFILL }
+ },
};
static gint *ett[] = {
&ett_rach_msg,
&ett_rach_kls1,
&ett_rach_kls2,
+ &ett_rach_gmprs_type1_kls2,
+ &ett_rach_gmprs_type2_kls2,
&ett_rach_est_cause,
&ett_rach_dialed_num,
&ett_rach_gps_pos,
+ &ett_rach_gmprs_req_type,
};
proto_gmr1_rach = proto_register_protocol("GEO-Mobile Radio (1) RACH", "GMR-1 RACH", "gmr1.rach");