forked from osmocom/wireshark
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>
This commit is contained in:
parent
1cd9d023ba
commit
84e43d9cb3
|
@ -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");
|
||||
|
|
Loading…
Reference in New Issue