aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-bssap.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dissectors/packet-bssap.c')
-rw-r--r--epan/dissectors/packet-bssap.c57
1 files changed, 46 insertions, 11 deletions
diff --git a/epan/dissectors/packet-bssap.c b/epan/dissectors/packet-bssap.c
index 7078a15b71..ecbc604494 100644
--- a/epan/dissectors/packet-bssap.c
+++ b/epan/dissectors/packet-bssap.c
@@ -12,8 +12,8 @@
*
* $Id$
*
- * Wireshark - Network traffic analyzer
- * By Gerald Combs <gerald@wireshark.org>
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
@@ -353,6 +353,7 @@ static gint ett_bssap_global_cn_id = -1;
static gint ett_bssap_plmn = -1;
static dissector_handle_t data_handle;
+static dissector_handle_t rrlp_handle;
static dissector_table_t bssap_dissector_table;
static dissector_table_t bsap_dissector_table;
@@ -754,11 +755,14 @@ dissect_bssap_channel_needed(tvbuff_t *tvb, proto_tree *tree, int offset)
}
/* 18.4.3 Downlink Tunnel Payload Control and Info */
static int
-dissect_bssap_dlink_tunnel_payload_control_and_info(tvbuff_t *tvb, proto_tree *tree, int offset)
+dissect_bssap_dlink_tunnel_payload_control_and_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
{
proto_item *item = NULL;
proto_tree *ie_tree = NULL;
+ tvbuff_t *next_tvb;
guint8 ie_len;
+ guint8 octet;
+ guint8 prot_disc;
ie_len = tvb_get_guint8(tvb,offset+1);
item = proto_tree_add_item(tree, hf_bssap_dlink_tnl_pld_cntrl_amd_inf_ie, tvb, offset, ie_len+2, FALSE);
@@ -773,11 +777,28 @@ dissect_bssap_dlink_tunnel_payload_control_and_info(tvbuff_t *tvb, proto_tree *t
* TOM Protocol Discriminator: Identifies the protocol using tunnelling of non-GSM signalling.
* For coding, see 3GPP TS 44.064.
*/
- /* Bit 3
- * E: Cipher Request. When set to 1 indicates that the SGSN shall cipher the payload, when
- * set to 0 indicates that the SGSN shall not cipher the payload.
+
+ proto_tree_add_item(ie_tree, hf_bssap_tom_prot_disc, tvb, offset, 1, FALSE);
+ octet = tvb_get_guint8(tvb,offset);
+ prot_disc = (octet&0x78)>>3;
+
+ /* octet 3 bit 3 E: Cipher Request. When set to 1 indicates that the SGSN received the payload in ciphered form,
+ * when set to 0 indicates that the SGSN did not receive the payload in ciphered form.
*/
- proto_tree_add_item(ie_tree, hf_bssap_plus_ie_data, tvb, offset, ie_len, FALSE);
+ proto_tree_add_item(ie_tree, hf_bssap_e_bit, tvb, offset, 1, FALSE);
+
+ /* octet 3 bit 2 - 1
+ * Tunnel Priority: Indicates the priority of the Tunnel Payload. For coding, see Table 20.1: Association
+ * between Tunnel Priority and LLC SAPs.
+ */
+ proto_tree_add_item(ie_tree, hf_bssap_tunnel_prio, tvb, offset, 1, FALSE);
+ /* Tunnel payload */
+ next_tvb = tvb_new_subset(tvb, offset, ie_len-4, ie_len-4);
+
+ if ((prot_disc == 2)&&(rrlp_handle))
+ call_dissector(rrlp_handle, next_tvb, pinfo, ie_tree);
+ else
+ call_dissector(data_handle, next_tvb, pinfo, ie_tree);
return offset + ie_len;
@@ -1459,11 +1480,14 @@ static const value_string bssap_tom_prot_disc_values[] = {
{ 0, NULL }
};
static int
-dissect_bssap_ulink_tunnel_payload_control_and_info(tvbuff_t *tvb, proto_tree *tree, int offset)
+dissect_bssap_ulink_tunnel_payload_control_and_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
{
proto_item *item = NULL;
proto_tree *ie_tree = NULL;
+ tvbuff_t *next_tvb;
guint8 ie_len;
+ guint8 octet;
+ guint8 prot_disc;
ie_len = tvb_get_guint8(tvb,offset+1);
item = proto_tree_add_item(tree, hf_bssap_ulink_tnl_pld_cntrl_amd_inf_ie, tvb, offset, ie_len+2, FALSE);
@@ -1479,6 +1503,8 @@ dissect_bssap_ulink_tunnel_payload_control_and_info(tvbuff_t *tvb, proto_tree *t
* For coding, see 3GPP TS 44.064.
*/
proto_tree_add_item(ie_tree, hf_bssap_tom_prot_disc, tvb, offset, 1, FALSE);
+ octet = tvb_get_guint8(tvb,offset);
+ prot_disc = (octet&0x78)>>3;
/* octet 3 bit 3 E: Cipher Request. When set to 1 indicates that the SGSN received the payload in ciphered form,
* when set to 0 indicates that the SGSN did not receive the payload in ciphered form.
@@ -1490,6 +1516,13 @@ dissect_bssap_ulink_tunnel_payload_control_and_info(tvbuff_t *tvb, proto_tree *t
* between Tunnel Priority and LLC SAPs.
*/
proto_tree_add_item(ie_tree, hf_bssap_tunnel_prio, tvb, offset, 1, FALSE);
+ /* Tunnel payload */
+ next_tvb = tvb_new_subset(tvb, offset, ie_len-4, ie_len-4);
+
+ if ((prot_disc == 2)&&(rrlp_handle))
+ call_dissector(rrlp_handle, next_tvb, pinfo, ie_tree);
+ else
+ call_dissector(data_handle, next_tvb, pinfo, ie_tree);
return offset + ie_len;
@@ -1671,7 +1704,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
/* Downlink Tunnel Payload Control and Info 18.4.3 M TLV 3-223 */
if ( check_ie(tvb, tree, &offset, BSSAP_DLINK_TNL_PLD_CTR_AND_INF))
- offset = dissect_bssap_dlink_tunnel_payload_control_and_info(tvb, bssap_tree, offset);
+ offset = dissect_bssap_dlink_tunnel_payload_control_and_info(tvb, pinfo, bssap_tree, offset);
if (tvb_length_remaining(tvb,offset) == 0)
return;
@@ -1684,7 +1717,7 @@ static void dissect_bssap_plus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
/* Uplink Tunnel Payload Control and Info 18.4.25 M TLV 3-223 */
if ( check_ie(tvb, tree, &offset, BSSAP_ULINK_TNL_PLD_CTR_AND_INF))
- offset = dissect_bssap_ulink_tunnel_payload_control_and_info(tvb, bssap_tree, offset);
+ offset = dissect_bssap_ulink_tunnel_payload_control_and_info(tvb, pinfo, bssap_tree, offset);
if (tvb_length_remaining(tvb,offset) == 0)
return;
@@ -2116,7 +2149,7 @@ dissect_bssap_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
return(TRUE);
}
-/* Register the protocol with Wireshark */
+/* Register the protocol with Ethereal */
void
proto_register_bssap(void)
{
@@ -2470,4 +2503,6 @@ proto_reg_handoff_bssap(void)
dissector_add("sccp.ssn", SCCP_SSN_BSSAP_PLUS, bssap_plus_handle);
data_handle = find_dissector("data");
+ rrlp_handle = find_dissector("rrlp");
+
}