* Formats and coding
* (3GPP TS 24.080 version 4.3.0 Release 4)
*
- * $Id: packet-gsm_a.c,v 1.3 2003/10/30 19:39:33 guy Exp $
+ * $Id: packet-gsm_a.c,v 1.12 2004/03/19 07:54:57 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
#include <stdio.h>
#include <stdlib.h>
-#include <gmodule.h>
-
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-
-#ifdef HAVE_NETINET_IN_H
-# include <netinet/in.h>
-#endif
#include <string.h>
#include "epan/packet.h"
#include "prefs.h"
+#include "tap.h"
+#include "asn1.h"
+#include "packet-tcap.h"
#include "packet-bssap.h"
+#include "packet-gsm_ss.h"
+#include "packet-gsm_a.h"
/* PROTOTYPES/FORWARDS */
-static const value_string gsm_bssmap_msg_strings[] = {
+const value_string gsm_a_bssmap_msg_strings[] = {
{ 0x01, "Assignment Request" },
{ 0x02, "Assignment Complete" },
{ 0x03, "Assignment Failure" },
{ 0, NULL },
};
-static const value_string gsm_dtap_msg_mm_strings[] = {
+const value_string gsm_a_dtap_msg_mm_strings[] = {
{ 0x01, "IMSI Detach Indication" },
{ 0x02, "Location Updating Accept" },
{ 0x04, "Location Updating Reject" },
{ 0, NULL },
};
-static const value_string gsm_dtap_msg_rr_strings[] = {
+const value_string gsm_a_dtap_msg_rr_strings[] = {
{ 0x3c, "RR Initialisation Request" },
{ 0x3b, "Additional Assignment" },
{ 0x3f, "Immediate Assignment" },
{ 0, NULL },
};
-static const value_string gsm_dtap_msg_cc_strings[] = {
+const value_string gsm_a_dtap_msg_cc_strings[] = {
{ 0x01, "Alerting" },
{ 0x08, "Call Confirmed" },
{ 0x02, "Call Proceeding" },
{ 0, NULL },
};
-static const value_string gsm_dtap_msg_gmm_strings[] = {
+const value_string gsm_a_dtap_msg_gmm_strings[] = {
{ 0x01, "Attach Request" },
{ 0x02, "Attach Accept" },
{ 0x03, "Attach Complete" },
{ 0, NULL },
};
-static const value_string gsm_dtap_msg_sms_strings[] = {
+const value_string gsm_a_dtap_msg_sms_strings[] = {
{ 0x01, "CP-DATA" },
{ 0x04, "CP-ACK" },
{ 0x10, "CP-ERROR" },
{ 0, NULL },
};
-static const value_string gsm_dtap_msg_sm_strings[] = {
+const value_string gsm_a_dtap_msg_sm_strings[] = {
{ 0x41, "Activate PDP Context Request" },
{ 0x42, "Activate PDP Context Accept" },
{ 0x43, "Activate PDP Context Reject" },
{ 0, NULL },
};
-static const value_string gsm_dtap_msg_ss_strings[] = {
+const value_string gsm_a_dtap_msg_ss_strings[] = {
{ 0x2a, "Release Complete" },
{ 0x3a, "Facility" },
{ 0x3b, "Register" },
{ 0, NULL },
};
-static const gchar *pd_str[] = {
+const gchar *gsm_a_pd_str[] = {
"Group Call Control",
"Broadcast Call Control",
"Reserved: was allocated in earlier phases of the protocol",
static int proto_a_dtap = -1;
static int proto_a_rp = -1;
+static int gsm_a_tap = -1;
+
static int hf_gsm_a_none = -1;
static int hf_gsm_a_bssmap_msg_type = -1;
static int hf_gsm_a_dtap_msg_mm_type = -1;
static int hf_gsm_a_dlci_cc = -1;
static int hf_gsm_a_dlci_spare = -1;
static int hf_gsm_a_dlci_sapi = -1;
+static int hf_gsm_a_bssmap_cause = -1;
+static int hf_gsm_a_dtap_cause = -1;
/* Initialize the subtree pointers */
static gint ett_bssmap_msg = -1;
static gint ett_gsm_enc_info = -1;
static gint ett_cell_list = -1;
static gint ett_dlci = -1;
+static gint ett_bc_oct_3a = -1;
+static gint ett_bc_oct_4 = -1;
+static gint ett_bc_oct_5 = -1;
+static gint ett_bc_oct_5a = -1;
+static gint ett_bc_oct_5b = -1;
+static gint ett_bc_oct_6 = -1;
+static gint ett_bc_oct_6a = -1;
+static gint ett_bc_oct_6b = -1;
+static gint ett_bc_oct_6c = -1;
+static gint ett_bc_oct_6d = -1;
+static gint ett_bc_oct_6e = -1;
+static gint ett_bc_oct_6f = -1;
+static gint ett_bc_oct_6g = -1;
+static gint ett_bc_oct_7 = -1;
+
+static gint ett_tc_component = -1;
+static gint ett_tc_invoke_id = -1;
+static gint ett_tc_linked_id = -1;
+static gint ett_tc_opr_code = -1;
+static gint ett_tc_err_code = -1;
+static gint ett_tc_prob_code = -1;
+static gint ett_tc_sequence = -1;
static char a_bigbuf[1024];
static gchar a_add_string[1024];
static packet_info *g_pinfo;
static proto_tree *g_tree;
-/*
- * current RP message type
- */
-static gint gsm_a_rp_type;
-
/*
* this should be set on a per message basis, if possible
*/
return(cnt);
}
-/* Generate, into "buf", a string showing the bits of a bitfield.
- * Return a pointer to the character after that string.
- */
-static char *
-my_decode_bitfield_value(char *buf, guint32 val, guint32 mask, int width)
-{
- int i;
- guint32 bit;
- char *p;
-
- i = 0;
- p = buf;
- bit = 1 << (width - 1);
-
- for (;;)
- {
- if (mask & bit)
- {
- /* This bit is part of the field. Show its value. */
- if (val & bit)
- {
- *p++ = '1';
- }
- else
- {
- *p++ = '0';
- }
- }
- else
- {
- /* This bit is not part of the field. */
- *p++ = '.';
- }
-
- bit >>= 1;
- i++;
-
- if (i >= width) break;
-
- if (i % 4 == 0) *p++ = ' ';
- }
-
- *p = '\0';
-
- return(p);
-}
-
static gchar *
my_match_strval(guint32 val, const value_string *vs, gint *idx)
{
BE_RET_ERR_REQ, /* Return Error Request */
BE_RET_ERR_CAUSE, /* Return Error Cause */
BE_SEG, /* Segmentation */
- BE_NONE, /* NONE */
+ BE_NONE /* NONE */
}
bssmap_elem_idx_t;
value = tvb_get_ntohs(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, value, 0xffe0, 16);
+ other_decode_bitfield_value(a_bigbuf, value, 0xffe0, 16);
proto_tree_add_text(tree,
tvb, curr_offset, 2,
- "%s : PCM Multiplexer: %d",
+ "%s : PCM Multiplexer: %u",
a_bigbuf,
(value & 0xffe0) >> 5);
- my_decode_bitfield_value(a_bigbuf, value, 0x001f, 16);
+ other_decode_bitfield_value(a_bigbuf, value, 0x001f, 16);
proto_tree_add_text(tree,
tvb, curr_offset, 2,
- "%s : Timeslot: %d",
+ "%s : Timeslot: %u",
a_bigbuf,
value & 0x001f);
curr_offset += 2;
- sprintf(add_string, " - (%1$d) (0x%1$04x)", value);
+ sprintf(add_string, " - (%u) (0x%04x)", value, value);
/* no length check possible */
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Extension: %s",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Cause Class: %s",
a_bigbuf,
str);
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : National Cause",
{
value = tvb_get_guint8(tvb, curr_offset + 1);
- my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : Cause (MSB): %d",
+ "%s : Cause (MSB): %u",
a_bigbuf,
((oct & 0x7f) << 8) | value);
curr_offset++;
- my_decode_bitfield_value(a_bigbuf, value, 0xff, 8);
+ other_decode_bitfield_value(a_bigbuf, value, 0xff, 8);
proto_tree_add_text(tree, tvb, curr_offset, 1,
"%s : Cause (LSB)",
a_bigbuf);
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Cause: (%d) %s",
+ other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+ proto_tree_add_uint_format(tree, hf_gsm_a_bssmap_cause,
+ tvb, curr_offset, 1, oct & 0x7f,
+ "%s : Cause: (%u) %s",
a_bigbuf,
oct & 0x7f,
str);
curr_offset++;
- sprintf(add_string, " - (%d) %s", oct & 0x7f, str);
+ sprintf(add_string, " - (%u) %s", oct & 0x7f, str);
}
EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, DTAP_PD_MASK, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, DTAP_PD_MASK, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Protocol Discriminator: %s",
a_bigbuf,
- pd_str[oct & DTAP_PD_MASK]);
+ gsm_a_pd_str[oct & DTAP_PD_MASK]);
curr_offset++;
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : TI flag: %s",
a_bigbuf,
((oct & 0x08) ? "allocated by receiver" : "allocated by sender"));
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : TIO: %d",
+ "%s : TIO: %u",
a_bigbuf,
oct & 0x07);
do
{
- my_decode_bitfield_value(a_bigbuf, oct, mask, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, mask, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : GSM A5/%d: %spermitted",
+ "%s : GSM A5/%u: %spermitted",
a_bigbuf,
alg_id,
(mask & oct) ? "" : "not ");
}
while (mask != 0x01);
- my_decode_bitfield_value(a_bigbuf, oct, mask, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, mask, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : No encryption: %spermitted",
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Speech/Data Indicator: %s",
{
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Extension: %s",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Speech version identifier: %s",
{
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "Channel Rate and Type: Max channels %d, %s",
+ "Channel Rate and Type: Max channels %u, %s",
num_chan,
str);
}
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Extension: %s",
a_bigbuf,
(oct & 0x80) ? "extended" : "not extended");
- my_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : %sTransparent service",
}
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x3f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x3f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Rate: %s",
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Extension: %s",
a_bigbuf,
(oct & 0x80) ? "extended" : "not extended");
- my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
if (num_chan == 0)
{
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : 14.5 kbit/s (TCH/F14.4) %sallowed",
a_bigbuf,
(oct & 0x08) ? "" : "not ");
- my_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : 12.0 kbit/s (TCH F/9.6) %sallowed",
a_bigbuf,
(oct & 0x02) ? "" : "not ");
- my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : 6.0 kbit/s (TCH F/4.8) %sallowed",
}
else
{
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : 14.5/14.4 kbit/s (TCH/F14.4) %sallowed",
a_bigbuf,
(oct & 0x08) ? "" : "not ");
- my_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : 12.0/9.6 kbit/s (TCH F/9.6) %sallowed",
a_bigbuf,
(oct & 0x02) ? "" : "not ");
- my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : 6.0/4.8 kbit/s (TCH F/4.8) %sallowed",
if (add_string[0] == '\0')
{
- sprintf(add_string, " - CI (%d)", value);
+ sprintf(add_string, " - CI (%u)", value);
}
else
{
- sprintf(add_string, "%s/CI (%d)", add_string, value);
+ sprintf(add_string, "%s/CI (%u)", add_string, value);
}
break;
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
str = cell_disc_str[disc];
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : Cell Identification Discriminator: (%d) %s",
+ "%s : Cell Identification Discriminator: (%u) %s",
a_bigbuf,
disc,
str);
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Preemption Capability Indicator (PCI): this allocation request %s preempt an existing connection",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x3c, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x3c, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : Priority Level: (%d) %s",
+ "%s : Priority Level: (%u) %s",
a_bigbuf,
(oct & 0x3c) >> 2,
str);
- sprintf(add_string, " - (%d)", (oct & 0x3c) >> 2);
+ sprintf(add_string, " - (%u)", (oct & 0x3c) >> 2);
- my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Queuing Allowed Indicator (QA): queuing %sallowed",
a_bigbuf,
(oct & 0x02) ? "" : "not ");
- my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Preemption Vulnerability Indicator (PVI): this connection %s be preempted by another allocation request",
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xfe, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xfe, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : BSS is %s to activate DTX in the downlink direction",
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
str = cell_disc_str[disc];
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : Cell Identification Discriminator: (%d) %s",
+ "%s : Cell Identification Discriminator: (%u) %s",
a_bigbuf,
disc,
str);
item =
proto_tree_add_text(tree,
tvb, curr_offset, -1,
- "Cell %d",
+ "Cell %u",
num_cells + 1);
subtree = proto_item_add_subtree(item, ett_cell_list);
}
while ((len - (curr_offset - offset)) > 0);
- sprintf(add_string, " - %d cell%s",
+ sprintf(add_string, " - %u cell%s",
num_cells, plurality(num_cells, "", "s"));
EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Channel mode: %s",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Channel: %s",
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xfe, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xfe, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : IMEISV must %sbe included by the mobile station",
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : %s",
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "Circuit pool number: %d%s",
+ "Circuit pool number: %u%s",
oct,
str);
curr_offset++;
- sprintf(add_string, " - (%d)", oct);
+ sprintf(add_string, " - (%u)", oct);
/* no length check possible */
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Channel Mode: %s",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : Channel: (%d) %s",
+ "%s : Channel: (%u) %s",
a_bigbuf,
oct & 0x0f,
str);
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xfc, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xfc, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : qri: it is recommended %sto allow queuing",
a_bigbuf,
(oct & 0x02) ? "" : "not ");
- my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Speech version identifier: %s",
DE_RAD_PRIO, /* Radio Priority */
DE_GPRS_TIMER, /* GPRS Timer */
DE_GPRS_TIMER_2, /* GPRS Timer 2 */
- DE_NONE, /* NONE */
+ DE_NONE /* NONE */
}
dtap_elem_idx_t;
proto_tree_add_text(subtree,
tvb, curr_offset, 2,
- "Location Area Code (LAC): 0x%04x (%d)",
+ "Location Area Code (LAC): 0x%04x (%u)",
value,
value);
switch (oct & 0x07)
{
case 0: /* No Identity */
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Unused",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Odd/Even Indicator: %s",
a_bigbuf,
(oct & 0x08) ? "ODD" : "EVEN");
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Type of Identity: No Identity Code",
case 1: /* IMSI */
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Identity Digit 1: %c",
odd = oct & 0x08;
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Odd/Even Indicator: %s",
a_bigbuf,
odd ? "ODD" : "EVEN");
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Type of Identity: %s",
{
oct = tvb_get_guint8(tvb, curr_offset - 1);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset - 1, 1,
"%s : Filler",
break;
case 2: /* IMEI */
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Identity Digit 1: %c",
a_bigbuf,
Dgt_msid.out[(oct & 0xf0) >> 4]);
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Odd/Even Indicator: %s",
a_bigbuf,
(oct & 0x08) ? "ODD" : "EVEN");
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Type of Identity: IMEI",
break;
case 4: /* TMSI/P-TMSI */
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Unused",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Odd/Even Indicator: %s",
a_bigbuf,
(oct & 0x08) ? "ODD" : "EVEN");
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Type of Identity: TMSI/P-TMSI",
subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_MS_CM_1]);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Spare",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Revision Level: %s",
a_bigbuf,
str);
- my_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : ES IND: Controlled Early Classmark Sending is %simplemented",
a_bigbuf,
(oct & 0x10) ? "" : "not ");
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : A5/1: encryption algorithm A5/1 %savailable",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : RF power capability: %s",
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Revision Level: %s",
a_bigbuf,
str);
- my_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : ES IND: Controlled Early Classmark Sending is %simplemented",
a_bigbuf,
(oct & 0x10) ? "" : "not ");
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : A5/1: encryption algorithm A5/1 %savailable",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : RF power capability: %s",
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : PS capability (pseudo-synchronization capability): %spresent",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x30, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x30, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : SS Screening Indicator: %s",
a_bigbuf,
str);
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : SM capability (MT SMS pt to pt capability): MS %s MT SMS",
a_bigbuf,
(oct & 0x08) ? "supports" : "does not support");
- my_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : VBS notification reception: %s",
(oct & 0x04) ? "VBS capability and notifications wanted" :
"no VBS capability or no notifications wanted");
- my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : VGCS notification reception: %s",
(oct & 0x02) ? "VGCS capability and notifications wanted" :
"no VGCS capability or no notifications wanted");
- my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : FC Frequency Capability",
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : CM3: %s",
"The MS supports options that are indicated in classmark 3 IE" :
"The MS does not support any options that are indicated in CM3");
- my_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : LCS VA capability: LCS value added location request notification capability %ssupported",
a_bigbuf,
(oct & 0x20) ? "" : "not ");
- my_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : UCS2 treatment: %s",
"the ME has no preference between the use of the default alphabet and the use of UCS2" :
"the ME has a preference for the default alphabet (defined in 3GPP TS 03.38) over UCS2");
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : SoLSA: the ME %s SoLSA",
a_bigbuf,
(oct & 0x08) ? "supports" : "does not support");
- my_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : CMSP (CM Service Prompt): %s",
"'Network initiated MO CM connection request' supported for at least one CM protocol" :
"'Network initiated MO CM connection request' not supported");
- my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : A5/3: encryption algorithm A5/3 %savailable",
a_bigbuf,
(oct & 0x02) ? "" : "not ");
- my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : A5/2: encryption algorithm A5/2 %savailable",
value = tvb_get_ntohl(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, value, 0xffffffe0, 32);
+ other_decode_bitfield_value(a_bigbuf, value, 0xffffffe0, 32);
proto_tree_add_text(tree, tvb, curr_offset, 4,
- "%s : Group or Broadcast call reference: %d (0x%04x)",
+ "%s : Group or Broadcast call reference: %u (0x%04x)",
a_bigbuf,
(value & 0xffffffe0) >> 5,
(value & 0xffffffe0) >> 5);
- my_decode_bitfield_value(a_bigbuf, value, 0x00000010, 32);
+ other_decode_bitfield_value(a_bigbuf, value, 0x00000010, 32);
proto_tree_add_text(tree, tvb, curr_offset, 4,
"%s : SF Service Flag: %s",
a_bigbuf,
(value & 0x00000010) ?
"VGCS (Group call reference)" : "VBS (Broadcast call reference)");
- my_decode_bitfield_value(a_bigbuf, value, 0x00000008, 32);
+ other_decode_bitfield_value(a_bigbuf, value, 0x00000008, 32);
proto_tree_add_text(tree, tvb, curr_offset, 4,
"%s : AF Acknowledgement Flag: acknowledgment is %srequired",
a_bigbuf,
break;
}
- my_decode_bitfield_value(a_bigbuf, value, 0x00000007, 32);
+ other_decode_bitfield_value(a_bigbuf, value, 0x00000007, 32);
proto_tree_add_text(tree, tvb, curr_offset, 4,
"%s : Call Priority: %s",
a_bigbuf,
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree, tvb, curr_offset, 1,
"%s : Ciphering Information",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(tree, tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_PD_SAPI]);
- my_decode_bitfield_value(a_bigbuf, oct, 0xc0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xc0, 8);
proto_tree_add_text(subtree, tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x30, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x30, 8);
proto_tree_add_text(subtree, tvb, curr_offset, 1,
"%s : SAPI (Sevice Access Point Identifier): %s",
a_bigbuf,
str);
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(subtree, tvb, curr_offset, 1,
"%s : PD (Protocol Discriminator): %s",
a_bigbuf,
- pd_str[oct & 0x0f]);
+ gsm_a_pd_str[oct & 0x0f]);
curr_offset++;
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : %s",
proto_tree_add_text(tree,
tvb, curr_offset, 3,
- "PLMN[%d] Mobile Country Code (MCC): %s, Mobile Network Code (MNC): %s",
+ "PLMN[%u] Mobile Country Code (MCC): %s, Mobile Network Code (MNC): %s",
num_plmn + 1,
mcc,
mnc);
num_plmn++;
}
- sprintf(add_string, " - %d PLMN%s",
+ sprintf(add_string, " - %u PLMN%s",
num_plmn, plurality(num_plmn, "", "s"));
EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "RR Cause value: 0x%02x (%d) %s",
+ "RR Cause value: 0x%02x (%u) %s",
oct,
oct,
str);
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Extension",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Coding Scheme: %s",
a_bigbuf,
str);
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Add CI: The MS should %s",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Number of spare bits in last octet: %s",
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "Reject Cause value: 0x%02x (%d) %s",
+ "Reject Cause value: 0x%02x (%u) %s",
oct,
oct,
str);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "Time Zone: 0x%02x (%d)",
+ "Time Zone: 0x%02x (%u)",
oct,
oct);
proto_tree_add_text(tree,
tvb, curr_offset, 3,
- "Year %d%d, Month %d%d, Day %d%d",
+ "Year %u%u, Month %u%u, Day %u%u",
oct & 0x0f,
(oct & 0xf0) >> 4,
oct2 & 0x0f,
proto_tree_add_text(tree,
tvb, curr_offset, 3,
- "Hour %d%d, Minutes %d%d, Seconds %d%d",
+ "Hour %u%u, Minutes %u%u, Seconds %u%u",
oct & 0x0f,
(oct & 0xf0) >> 4,
oct2 & 0x0f,
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "Time Zone: 0x%02x (%d)",
+ "Time Zone: 0x%02x (%u)",
oct,
oct);
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xfc, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xfc, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : %s",
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Extension",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x0c, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0c, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Hold auxiliary state: %s",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Multi party auxiliary state: %s",
}
/*
- * [3] 10.5.4.5a
+ * [3] 10.5.4.5
*/
static guint8
-de_cc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+de_bearer_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
guint8 oct;
+ guint8 itc;
+ gboolean extended;
guint32 curr_offset;
+ guint32 saved_offset;
+ proto_tree *subtree;
+ proto_item *item;
+ gchar *str;
+
+#define DE_BC_ITC_SPEECH 0x00
+#define DE_BC_ITC_UDI 0x01
+#define DE_BC_ITC_EX_PLMN 0x02
+#define DE_BC_ITC_FASC_G3 0x03
+#define DE_BC_ITC_OTHER_ITC 0x05
+#define DE_BC_ITC_RSVD_NET 0x07
- add_string = add_string;
curr_offset = offset;
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ /* octet 3 */
- switch ((oct & 0xf0) >> 4)
+ /*
+ * warning, bearer cap uses extended values that
+ * are reversed from other parameters!
+ */
+ extended = (oct & 0x80) ? FALSE : TRUE;
+ itc = oct & 0x07;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
+
+ switch (is_uplink)
{
- case 0:
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Maximum number of supported bearers: 1",
- a_bigbuf);
+ case IS_UPLINK_FALSE:
+ str = "Spare";
+ break;
+
+ case IS_UPLINK_TRUE:
+ /*
+ * depends on Information transfer capability
+ */
+ switch (itc)
+ {
+ case DE_BC_ITC_SPEECH:
+ if (extended)
+ {
+ switch ((oct & 0x60) >> 5)
+ {
+ case 1: str = "MS supports at least full rate speech version 1 but does not support half rate speech version 1"; break;
+ case 2: str = "MS supports at least full rate speech version 1 and half rate speech version 1. MS has a greater preference for half rate speech version 1 than for full rate speech version 1"; break;
+ case 3: str = "MS supports at least full rate speech version 1 and half rate speech version 1. MS has a greater preference for full rate speech version 1 than for half rate speech version 1"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+ break;
+ }
+ else
+ {
+ switch ((oct & 0x60) >> 5)
+ {
+ case 1: str = "Full rate support only MS/fullrate speech version 1 supported"; break;
+ case 2: str = "Dual rate support MS/half rate speech version 1 preferred, full rate speech version 1 also supported"; break;
+ case 3: str = "Dual rate support MS/full rate speech version 1 preferred, half rate speech version 1 also supported"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+ break;
+ }
+ break;
+
+ default:
+ switch ((oct & 0x60) >> 5)
+ {
+ case 1: str = "Full rate support only MS"; break;
+ case 2: str = "Dual rate support MS/half rate preferred"; break;
+ case 3: str = "Dual rate support MS/full rate preferred"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+ break;
+ }
break;
default:
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Maximum number of supported bearers: %d",
- a_bigbuf,
- (oct & 0xf0) >> 4);
+ str = "(dissect problem)";
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x0c, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : Spare",
- a_bigbuf);
+ "%s : Radio channel requirement: %s",
+ a_bigbuf,
+ str);
- my_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : PCP: the mobile station %s the Prolonged Clearing Procedure",
+ "%s : Coding standard: %s",
a_bigbuf,
- (oct & 0x02) ? "supports" : "does not support");
+ (oct & 0x10) ? "reserved" : "GSM standardized coding");
- my_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : DTMF: %s",
+ "%s : Transfer mode: %s",
a_bigbuf,
- (oct & 0x01) ?
- "the mobile station supports DTMF as specified in subclause 5.5.7 of TS 24.008" :
- "reserved for earlier versions of the protocol");
+ (oct & 0x08) ? "packet" : "circuit");
+
+ switch (itc)
+ {
+ case DE_BC_ITC_SPEECH: str = "Speech"; break;
+ case DE_BC_ITC_UDI: str = "Unrestricted digital information"; break;
+ case DE_BC_ITC_EX_PLMN: str = "3.1 kHz audio, ex PLMN"; break;
+ case DE_BC_ITC_FASC_G3: str = "Facsimile group 3"; break;
+ case DE_BC_ITC_OTHER_ITC: str = "Other ITC (See Octet 5a)"; break;
+ case DE_BC_ITC_RSVD_NET: str = "Reserved, to be used in the network"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Information transfer capability: %s",
+ a_bigbuf,
+ str);
+
+ sprintf(add_string, " - (%s)", str);
curr_offset++;
NO_MORE_DATA_CHECK(len);
- oct = tvb_get_guint8(tvb, curr_offset);
+ switch (itc)
+ {
+ case DE_BC_ITC_SPEECH:
+ /* octets 3a */
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Spare",
- a_bigbuf);
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, -1,
+ "Octets 3a - Speech Versions");
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Maximum number of speech bearers: %d",
- a_bigbuf,
- oct & 0x0f);
+ subtree = proto_item_add_subtree(item, ett_bc_oct_3a);
- curr_offset++;
+ saved_offset = curr_offset;
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+ do
+ {
+ oct = tvb_get_guint8(tvb, curr_offset);
- return(curr_offset - offset);
-}
+ extended = (oct & 0x80) ? FALSE : TRUE;
-/*
- * [3] 10.5.4.6
- */
-static guint8
-de_call_state(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
-{
- guint8 oct;
- guint32 curr_offset;
- proto_tree *subtree;
- proto_item *item;
- gchar *str;
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
- len = len;
- add_string = add_string;
- curr_offset = offset;
+ other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Coding: octet used for %s",
+ a_bigbuf,
+ (oct & 0x40) ? "other extension of octet 3" :
+ "extension of information transfer capability");
- oct = tvb_get_guint8(tvb, curr_offset);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x30, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Spare",
+ a_bigbuf);
- item =
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- gsm_dtap_elem_strings[DE_CALL_STATE].strptr);
+ switch (oct & 0x0f)
+ {
+ case 0: str = "GSM full rate speech version 1"; break;
+ case 2: str = "GSM full rate speech version 2"; break;
+ case 4: str = "GSM full rate speech version 3"; break;
+ case 1: str = "GSM half rate speech version 1"; break;
+ case 5: str = "GSM half rate speech version 3"; break;
+ default:
+ str = "Speech version TBD";
+ break;
+ }
- subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CALL_STATE]);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Speech version indication: %s",
+ a_bigbuf,
+ str);
- switch ((oct & 0xc0) >> 6)
- {
- case 0: str = "Coding as specified in ITU-T Rec. Q.931"; break;
- case 1: str = "Reserved for other international standards"; break;
- case 2: str = "National standard"; break;
- default:
- str = "Standard defined for the GSM PLMNS";
- break;
- }
+ curr_offset++;
+ }
+ while (extended &&
+ ((len - (curr_offset - offset)) > 0));
- my_decode_bitfield_value(a_bigbuf, oct, 0xc0, 8);
- proto_tree_add_text(subtree,
- tvb, curr_offset, 1,
- "%s : Coding standard: %s",
- a_bigbuf,
- str);
+ proto_item_set_len(item, curr_offset - saved_offset);
+ break;
- switch (oct & 0x3f)
- {
- case 0x00: str = "UO - null NO - null"; break;
- case 0x02: str = "U0.1- MM connection pending N0.1- MM connection pending"; break;
- case 0x22: str = "U0.2- CC prompt present N0.2- CC connection pending"; break;
- case 0x23: str = "U0.3- Wait for network information N0.3- Network answer pending"; break;
- case 0x24: str = "U0.4- CC-Establishment present N0.4- CC-Establishment present"; break;
- case 0x25: str = "U0.5- CC-Establishment confirmed N0.5- CC-Establishment confirmed"; break;
- case 0x26: str = "U0.6- Recall present N0.6- Recall present"; break;
- case 0x01: str = "U1 - call initiated N1 - call initiated"; break;
- case 0x03: str = "U3 - mobile originating call proceeding N3 - mobile originating call proceeding"; break;
- case 0x04: str = "U4 - call delivered N4 - call delivered"; break;
- case 0x06: str = "U6 - call present N6 - call present"; break;
- case 0x07: str = "U7 - call received N7 - call received"; break;
- case 0x08: str = "U8 - connect request N8 - connect request"; break;
- case 0x09: str = "U9 - mobile terminating call confirmed N9 - mobile terminating call confirmed"; break;
- case 0x0a: str = "U10- active N10- active"; break;
- case 0x0b: str = "U11- disconnect request"; break;
- case 0x0c: str = "U12- disconnect indication N12-disconnect indication"; break;
- case 0x13: str = "U19- release request N19- release request"; break;
- case 0x1a: str = "U26- mobile originating modify N26- mobile originating modify"; break;
- case 0x1b: str = "U27- mobile terminating modify N27- mobile terminating modify"; break;
- case 0x1c: str = " N28- connect indication"; break;
default:
- str = "Unknown";
- break;
- }
+ /* octet 4 */
- my_decode_bitfield_value(a_bigbuf, oct, 0x3f, 8);
- proto_tree_add_text(subtree,
- tvb, curr_offset, 1,
- "%s : Call state value: %s",
- a_bigbuf,
- str);
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Octet 4");
- curr_offset++;
+ subtree = proto_item_add_subtree(item, ett_bc_oct_4);
- /* no length check possible */
+ oct = tvb_get_guint8(tvb, curr_offset);
- return(curr_offset - offset);
-}
+ extended = (oct & 0x80) ? FALSE : TRUE;
-/*
- * [3] 10.5.4.7
- */
-static guint8
-de_cld_party_bcd_num(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
-{
- guint8 oct;
- guint8 ton;
- guint8 *poctets;
- guint32 curr_offset;
- gchar *str;
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
- curr_offset = offset;
+ other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Compression: data compression %s%s",
+ a_bigbuf,
+ (oct & 0x40) ? "" : "not ",
+ is_uplink ? "allowed" : "possible");
- oct = tvb_get_guint8(tvb, curr_offset);
+ switch ((oct & 0x30) >> 4)
+ {
+ case 0x00: str = "Service data unit integrity"; break;
+ case 0x03: str = "Unstructured"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
- proto_tree_add_text(tree,
+ other_decode_bitfield_value(a_bigbuf, oct, 0x30, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Structure: %s",
+ a_bigbuf,
+ str);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Duplex mode: %s",
+ a_bigbuf,
+ (oct & 0x08) ? "Full" : "Half");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Configuration: %s",
+ a_bigbuf,
+ (oct & 0x04) ? "Reserved" : "Point-to-point");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : NIRR: %s",
+ a_bigbuf,
+ (oct & 0x02) ?
+ "Data up to and including 4.8 kb/s, full rate, non-transparent, 6 kb/s radio interface rate is requested" :
+ "No meaning is associated with this value");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Establishment: %s",
+ a_bigbuf,
+ (oct & 0x01) ? "Reserved" : "Demand");
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ /* octet 5 */
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Octet 5");
+
+ subtree = proto_item_add_subtree(item, ett_bc_oct_5);
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ extended = (oct & 0x80) ? FALSE : TRUE;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Access Identity: %s",
+ a_bigbuf,
+ (oct & 0x60) ? "Reserved" : "Octet identifier");
+
+ switch ((oct & 0x18) >> 3)
+ {
+ case 0x00: str = "No rate adaption"; break;
+ case 0x01: str = "V.110, I.460/X.30 rate adaptation"; break;
+ case 0x02: str = "ITU-T X.31 flag stuffing"; break;
+ default:
+ str = "Other rate adaption (see octet 5a)"; break;
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x18, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Rate Adaption: %s",
+ a_bigbuf,
+ str);
+
+ switch (oct & 0x07)
+ {
+ case 0x01: str = "I.440/450"; break;
+ case 0x02: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+ case 0x03: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+ case 0x04: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+ case 0x05: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+ case 0x06: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+ default:
+ str = "Reserved"; break;
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Signalling Access Protocol: %s",
+ a_bigbuf,
+ str);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ if (!extended) goto bc_octet_6;
+
+ /* octet 5a */
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Octet 5a");
+
+ subtree = proto_item_add_subtree(item, ett_bc_oct_5a);
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ extended = (oct & 0x80) ? FALSE : TRUE;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Other ITC: %s",
+ a_bigbuf,
+ (oct & 0x60) ? "Reserved" : "Restricted digital information");
+
+ switch ((oct & 0x18) >> 3)
+ {
+ case 0x00: str = "V.120"; break;
+ case 0x01: str = "H.223 & H.245"; break;
+ case 0x02: str = "PIAFS"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x18, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Other Rate Adaption: %s",
+ a_bigbuf,
+ str);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Spare",
+ a_bigbuf);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ if (!extended) goto bc_octet_6;
+
+ /* octet 5b */
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Octet 5b");
+
+ subtree = proto_item_add_subtree(item, ett_bc_oct_5b);
+
+ extended = (oct & 0x80) ? FALSE : TRUE;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Rate Adaption Header: %sincluded",
+ a_bigbuf,
+ (oct & 0x40) ? "" : "not ");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Multiple frame establishment support in data link: %s",
+ a_bigbuf,
+ (oct & 0x20) ? "Supported" : "Not supported, only UI frames allowed");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Mode of operation: %s",
+ a_bigbuf,
+ (oct & 0x10) ? "Protocol sensitive" : "Bit transparent");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Logical link identifier negotiation: %s",
+ a_bigbuf,
+ (oct & 0x08) ? "Full protocol negotiation" : "Default, LLI=256 only");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Assignor/Assignee: Message originator is '%s'",
+ a_bigbuf,
+ (oct & 0x04) ? "assignor only" : "default assignee");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : In band/Out of band negotiation: Negotiation is done %s",
+ a_bigbuf,
+ (oct & 0x02) ?
+ "with USER INFORMATION messages on a temporary signalling connection" :
+ "in-band using logical link zero");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Spare",
+ a_bigbuf);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+bc_octet_6:
+
+ /* octet 6 */
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Octet 6");
+
+ subtree = proto_item_add_subtree(item, ett_bc_oct_6);
+
+ extended = (oct & 0x80) ? FALSE : TRUE;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Layer 1 Identity: %s",
+ a_bigbuf,
+ ((oct & 0x60) == 0x20) ? "Octet identifier" : "Reserved");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x1e, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : User information layer 1 protocol: %s",
+ a_bigbuf,
+ (oct & 0x1e) ? "Reserved" : "Default layer 1 protocol");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Synchronous/asynchronous: %s",
+ a_bigbuf,
+ (oct & 0x01) ? "Asynchronous" : "Synchronous");
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ if (!extended) goto bc_octet_7;
+
+ /* octet 6a */
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Octet 6a");
+
+ subtree = proto_item_add_subtree(item, ett_bc_oct_6a);
+
+ extended = (oct & 0x80) ? FALSE : TRUE;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Number of Stop Bits: %s",
+ a_bigbuf,
+ (oct & 0x40) ? "2" : "1");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Negotiation: %s",
+ a_bigbuf,
+ (oct & 0x20) ? "Reserved" : "In-band negotiation not possible");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Number of data bits excluding parity bit if present: %s",
+ a_bigbuf,
+ (oct & 0x10) ? "8" : "7");
+
+ switch (oct & 0x0f)
+ {
+ case 0x01: str = "0.3 kbit/s Recommendation X.1 and V.110"; break;
+ case 0x02: str = "1.2 kbit/s Recommendation X.1 and V.110"; break;
+ case 0x03: str = "2.4 kbit/s Recommendation X.1 and V.110"; break;
+ case 0x04: str = "4.8 kbit/s Recommendation X.1 and V.110"; break;
+ case 0x05: str = "9.6 kbit/s Recommendation X.1 and V.110"; break;
+ case 0x06: str = "12.0 kbit/s transparent (non compliance with X.1 and V.110)"; break;
+ case 0x07: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : User rate: %s",
+ a_bigbuf,
+ str);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ if (!extended) goto bc_octet_7;
+
+ /* octet 6b */
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Octet 6b");
+
+ subtree = proto_item_add_subtree(item, ett_bc_oct_6b);
+
+ extended = (oct & 0x80) ? FALSE : TRUE;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
+
+ switch ((oct & 0x60) >> 5)
+ {
+ case 0x02: str = "8 kbit/s"; break;
+ case 0x03: str = "16 kbit/s"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : V.110/X.30 rate adaptation Intermediate rate: %s",
+ a_bigbuf,
+ str);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Network independent clock (NIC) on transmission (Tx): %s to send data with network independent clock",
+ a_bigbuf,
+ (oct & 0x10) ? "requires" : "does not require");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Network independent clock (NIC) on reception (Rx): %s accept data with network independent clock",
+ a_bigbuf,
+ (oct & 0x08) ? "can" : "cannot");
+
+ switch (oct & 0x07)
+ {
+ case 0x00: str = "Odd"; break;
+ case 0x02: str = "Even"; break;
+ case 0x03: str = "None"; break;
+ case 0x04: str = "Forced to 0"; break;
+ case 0x05: str = "Forced to 1"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Parity information: %s",
+ a_bigbuf,
+ str);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ if (!extended) goto bc_octet_7;
+
+ /* octet 6c */
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Octet 6c");
+
+ subtree = proto_item_add_subtree(item, ett_bc_oct_6c);
+
+ extended = (oct & 0x80) ? FALSE : TRUE;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
+
+ switch ((oct & 0x60) >> 5)
+ {
+ case 0x01: str = "Non transparent (RLP)"; break;
+ case 0x02: str = "Both, transparent preferred"; break;
+ case 0x03: str = "Both, non transparent preferred"; break;
+ default:
+ str = "Transparent";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Connection element: %s",
+ a_bigbuf,
+ str);
+
+ switch (oct & 0x1f)
+ {
+ case 0x00: str = "None"; break;
+ case 0x01: str = "V.21"; break;
+ case 0x02: str = "V.22"; break;
+ case 0x03: str = "V.22 bis"; break;
+ case 0x04: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+ case 0x05: str = "V.26 ter"; break;
+ case 0x06: str = "V.32"; break;
+ case 0x07: str = "Modem for undefined interface"; break;
+ case 0x08: str = "Autobauding type 1"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x1f, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Modem type: %s",
+ a_bigbuf,
+ str);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ if (!extended) goto bc_octet_7;
+
+ /* octet 6d */
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Octet 6d");
+
+ subtree = proto_item_add_subtree(item, ett_bc_oct_6d);
+
+ extended = (oct & 0x80) ? FALSE : TRUE;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
+
+ switch ((oct & 0x60) >> 5)
+ {
+ case 0x00: str = "No other modem type specified in this field"; break;
+ case 0x02: str = "V.34"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Other modem type: %s",
+ a_bigbuf,
+ str);
+
+ switch (oct & 0x1f)
+ {
+ case 0x00: str = "Fixed network user rate not applicable/No meaning is associated with this value"; break;
+ case 0x01: str = "9.6 kbit/s Recommendation X.1 and V.110"; break;
+ case 0x02: str = "14.4 kbit/s Recommendation X.1 and V.110"; break;
+ case 0x03: str = "19.2 kbit/s Recommendation X.1 and V.110"; break;
+ case 0x04: str = "28.8 kbit/s Recommendation X.1 and V.110"; break;
+ case 0x05: str = "38.4 kbit/s Recommendation X.1 and V.110"; break;
+ case 0x06: str = "48.0 kbit/s Recommendation X.1 and V.110(synch)"; break;
+ case 0x07: str = "56.0 kbit/s Recommendation X.1 and V.110(synch) /bit transparent"; break;
+ case 0x08: str = "64.0 kbit/s bit transparent"; break;
+ case 0x09: str = "33.6 kbit/s bit transparent"; break;
+ case 0x0a: str = "32.0 kbit/s Recommendation I.460"; break;
+ case 0x0b: str = "31.2 kbit/s Recommendation V.34"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x1f, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Fixed network user rate: %s",
+ a_bigbuf,
+ str);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ if (!extended) goto bc_octet_7;
+
+ /* octet 6e */
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Octet 6e");
+
+ subtree = proto_item_add_subtree(item, ett_bc_oct_6e);
+
+ extended = (oct & 0x80) ? FALSE : TRUE;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
+
+ if (is_uplink == IS_UPLINK_TRUE)
+ {
+ other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Acceptable channel codings: TCH/F14.4 %sacceptable",
+ a_bigbuf,
+ (oct & 0x40) ? "" : "not ");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Acceptable channel codings: Spare",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Acceptable channel codings: TCH/F9.6 %sacceptable",
+ a_bigbuf,
+ (oct & 0x10) ? "" : "not ");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Acceptable channel codings: TCH/F4.8 %sacceptable",
+ a_bigbuf,
+ (oct & 0x08) ? "" : "not ");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Maximum number of traffic channels: %u TCH",
+ a_bigbuf,
+ (oct & 0x07) + 1);
+ }
+ else
+ {
+ other_decode_bitfield_value(a_bigbuf, oct, 0x78, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Acceptable channel codings: Spare",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Maximum number of traffic channels: Spare",
+ a_bigbuf);
+ }
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ if (!extended) goto bc_octet_7;
+
+ /* octet 6f */
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Octet 6f");
+
+ subtree = proto_item_add_subtree(item, ett_bc_oct_6f);
+
+ extended = (oct & 0x80) ? FALSE : TRUE;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
+
+ switch ((oct & 0x70) >> 4)
+ {
+ case 0x00: str = "not allowed/required/applicable"; break;
+ case 0x01: str = "up to 1 TCH/F allowed/may be requested"; break;
+ case 0x02: str = "up to 2 TCH/F allowed/may be requested"; break;
+ case 0x03: str = "up to 3 TCH/F allowed/may be requested"; break;
+ case 0x04: str = "up to 4 TCH/F allowed/may be requested"; break;
+ default:
+ str = "up to 4 TCH/F may be requested";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : UIMI, User initiated modification indication: %s",
+ a_bigbuf,
+ str);
+
+ if (is_uplink == IS_UPLINK_TRUE)
+ {
+ switch (oct & 0x0f)
+ {
+ case 0x00: str = "Air interface user rate not applicable/No meaning associated with this value"; break;
+ case 0x01: str = "9.6 kbit/s"; break;
+ case 0x02: str = "14.4 kbit/s"; break;
+ case 0x03: str = "19.2 kbit/s"; break;
+ case 0x05: str = "28.8 kbit/s"; break;
+ case 0x06: str = "38.4 kbit/s"; break;
+ case 0x07: str = "43.2 kbit/s"; break;
+ case 0x08: str = "57.6 kbit/s"; break;
+ case 0x09: str = "interpreted by the network as 38.4 kbit/s in this version of the protocol"; break;
+ case 0x0a: str = "interpreted by the network as 38.4 kbit/s in this version of the protocol"; break;
+ case 0x0b: str = "interpreted by the network as 38.4 kbit/s in this version of the protocol"; break;
+ case 0x0c: str = "interpreted by the network as 38.4 kbit/s in this version of the protocol"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Wanted air interface user rate: %s",
+ a_bigbuf,
+ str);
+ }
+ else
+ {
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Wanted air interface user rate: Spare",
+ a_bigbuf);
+ }
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ if (!extended) goto bc_octet_7;
+
+ /* octet 6g */
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Octet 6g");
+
+ subtree = proto_item_add_subtree(item, ett_bc_oct_6g);
+
+ extended = (oct & 0x80) ? FALSE : TRUE;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
+
+ if (is_uplink == IS_UPLINK_TRUE)
+ {
+ other_decode_bitfield_value(a_bigbuf, oct, 0x40, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Acceptable channel codings extended: TCH/F28.8 %sacceptable",
+ a_bigbuf,
+ (oct & 0x40) ? "" : "not ");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x20, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Acceptable channel codings extended: TCH/F32.0 %sacceptable",
+ a_bigbuf,
+ (oct & 0x20) ? "" : "not ");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Acceptable channel codings extended: TCH/F43.2 %sacceptable",
+ a_bigbuf,
+ (oct & 0x10) ? "" : "not ");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Acceptable channel codings extended: TCH/F43.2 %sacceptable",
+ a_bigbuf,
+ (oct & 0x10) ? "" : "not ");
+
+ switch ((oct & 0x0c) >> 2)
+ {
+ case 0: str = "Channel coding symmetry preferred"; break;
+ case 2: str = "Downlink biased channel coding asymmetry is preferred"; break;
+ case 1: str = "Uplink biased channel coding asymmetry is preferred"; break;
+ default:
+ str = "Unused, treat as Channel coding symmetry preferred";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0c, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Channel Coding Asymmetry Indication: %s",
+ a_bigbuf,
+ str);
+ }
+ else
+ {
+ other_decode_bitfield_value(a_bigbuf, oct, 0x7c, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : EDGE Channel Codings: Spare",
+ a_bigbuf);
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Spare",
+ a_bigbuf);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+bc_octet_7:
+
+ /* octet 7 */
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "Octet 7");
+
+ subtree = proto_item_add_subtree(item, ett_bc_oct_7);
+
+ extended = (oct & 0x80) ? FALSE : TRUE;
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ extended ? "extended" : "not extended");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Layer 2 Identity: %s",
+ a_bigbuf,
+ ((oct & 0x60) == 0x40) ? "Octet identifier" : "Reserved");
+
+ switch (oct & 0x1f)
+ {
+ case 0x06: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+ case 0x08: str = "ISO 6429, codeset 0 (DC1/DC3)"; break;
+ case 0x09: str = "Reserved: was allocated but never used in earlier phases of the protocol"; break;
+ case 0x0a: str = "Videotex profile 1"; break;
+ case 0x0c: str = "COPnoFlCt (Character oriented Protocol with no Flow Control mechanism)"; break;
+ case 0x0d: str = "Reserved: was allocated in earlier phases of the protocol"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x1f, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : User information layer 2 protocol: %s",
+ a_bigbuf,
+ str);
+ break;
+ }
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.5a
+ */
+static guint8
+de_cc_cap(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+ guint8 oct;
+ guint32 curr_offset;
+
+ add_string = add_string;
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+
+ switch ((oct & 0xf0) >> 4)
+ {
+ case 0:
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Maximum number of supported bearers: 1",
+ a_bigbuf);
+ break;
+
+ default:
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Maximum number of supported bearers: %u",
+ a_bigbuf,
+ (oct & 0xf0) >> 4);
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0c, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Spare",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x02, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : PCP: the mobile station %s the Prolonged Clearing Procedure",
+ a_bigbuf,
+ (oct & 0x02) ? "supports" : "does not support");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x01, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : DTMF: %s",
+ a_bigbuf,
+ (oct & 0x01) ?
+ "the mobile station supports DTMF as specified in subclause 5.5.7 of TS 24.008" :
+ "reserved for earlier versions of the protocol");
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Spare",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Maximum number of speech bearers: %u",
+ a_bigbuf,
+ oct & 0x0f);
+
+ curr_offset++;
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.6
+ */
+static guint8
+de_call_state(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+ guint8 oct;
+ guint32 curr_offset;
+ proto_tree *subtree;
+ proto_item *item;
+ gchar *str;
+
+ len = len;
+ add_string = add_string;
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ item =
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ gsm_dtap_elem_strings[DE_CALL_STATE].strptr);
+
+ subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CALL_STATE]);
+
+ switch ((oct & 0xc0) >> 6)
+ {
+ case 0: str = "Coding as specified in ITU-T Rec. Q.931"; break;
+ case 1: str = "Reserved for other international standards"; break;
+ case 2: str = "National standard"; break;
+ default:
+ str = "Standard defined for the GSM PLMNS";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0xc0, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Coding standard: %s",
+ a_bigbuf,
+ str);
+
+ switch (oct & 0x3f)
+ {
+ case 0x00: str = "UO - null NO - null"; break;
+ case 0x02: str = "U0.1- MM connection pending N0.1- MM connection pending"; break;
+ case 0x22: str = "U0.2- CC prompt present N0.2- CC connection pending"; break;
+ case 0x23: str = "U0.3- Wait for network information N0.3- Network answer pending"; break;
+ case 0x24: str = "U0.4- CC-Establishment present N0.4- CC-Establishment present"; break;
+ case 0x25: str = "U0.5- CC-Establishment confirmed N0.5- CC-Establishment confirmed"; break;
+ case 0x26: str = "U0.6- Recall present N0.6- Recall present"; break;
+ case 0x01: str = "U1 - call initiated N1 - call initiated"; break;
+ case 0x03: str = "U3 - mobile originating call proceeding N3 - mobile originating call proceeding"; break;
+ case 0x04: str = "U4 - call delivered N4 - call delivered"; break;
+ case 0x06: str = "U6 - call present N6 - call present"; break;
+ case 0x07: str = "U7 - call received N7 - call received"; break;
+ case 0x08: str = "U8 - connect request N8 - connect request"; break;
+ case 0x09: str = "U9 - mobile terminating call confirmed N9 - mobile terminating call confirmed"; break;
+ case 0x0a: str = "U10- active N10- active"; break;
+ case 0x0b: str = "U11- disconnect request"; break;
+ case 0x0c: str = "U12- disconnect indication N12-disconnect indication"; break;
+ case 0x13: str = "U19- release request N19- release request"; break;
+ case 0x1a: str = "U26- mobile originating modify N26- mobile originating modify"; break;
+ case 0x1b: str = "U27- mobile terminating modify N27- mobile terminating modify"; break;
+ case 0x1c: str = " N28- connect indication"; break;
+ default:
+ str = "Unknown";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x3f, 8);
+ proto_tree_add_text(subtree,
+ tvb, curr_offset, 1,
+ "%s : Call state value: %s",
+ a_bigbuf,
+ str);
+
+ curr_offset++;
+
+ /* no length check possible */
+
+ return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.7
+ */
+static guint8
+de_cld_party_bcd_num(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+ guint8 oct;
+ guint8 ton;
+ guint8 *poctets;
+ guint32 curr_offset;
+ gchar *str;
+
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Extension",
+ a_bigbuf);
+
+ ton = (oct & 0x70) >> 4;
+ switch (ton)
+ {
+ case 0: str = "Unknown"; break;
+ case 1: str = "International number"; break;
+ case 2: str = "National number"; break;
+ case 3: str = "Network specific number"; break;
+ case 4: str = "Dedicated access, short code"; break;
+ case 7: str = "Reserved for extension"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Type of number: %s",
+ a_bigbuf,
+ str);
+
+ if ((ton == 0) ||
+ (ton == 1) ||
+ (ton == 2) ||
+ (ton == 4))
+ {
+ switch (oct & 0x0f)
+ {
+ case 0: str = "Unknown"; break;
+ case 1: str = "ISDN/telephony numbering plan (Rec. E.164/E.163)"; break;
+ case 3: str = "Data numbering plan (Recommendation X.121)"; break;
+ case 4: str = "Telex numbering plan (Recommendation F.69)"; break;
+ case 8: str = "National numbering plan"; break;
+ case 9: str = "Private numbering plan"; break;
+ case 11: str = "Reserved for CTS (see 3GPP TS 44.056)"; break;
+ case 15: str = "Reserved for extension"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+ }
+ else
+ {
+ str = "not applicable";
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Numbering plan identification: %s",
+ a_bigbuf,
+ str);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ poctets = tvb_get_string(tvb, curr_offset, len - (curr_offset - offset));
+
+ my_dgt_tbcd_unpack(a_bigbuf, poctets, len - (curr_offset - offset),
+ &Dgt_mbcd);
+ g_free(poctets);
+
+ proto_tree_add_string_format(tree, hf_gsm_a_cld_party_bcd_num,
+ tvb, curr_offset, len - (curr_offset - offset),
+ a_bigbuf,
+ "BCD Digits: %s",
+ a_bigbuf);
+
+ curr_offset += len - (curr_offset - offset);
+
+ sprintf(add_string, " - (%s)", a_bigbuf);
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.8
+ */
+static guint8
+de_cld_party_sub_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+ guint8 oct;
+ guint32 curr_offset;
+ gchar *str;
+
+ add_string = add_string;
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Extension",
+ a_bigbuf);
+
+ switch ((oct & 0x70) >> 4)
+ {
+ case 0: str = "NSAP (X.213/ISO 8348 AD2)"; break;
+ case 2: str = "User specified"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Type of subaddress: %s",
+ a_bigbuf,
+ str);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Odd/Even indicator: %s",
+ a_bigbuf,
+ (oct & 0x08) ?
+ "odd number of address signals" : "even number of address signals");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Spare",
+ a_bigbuf);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ proto_tree_add_text(tree,
+ tvb, curr_offset, len - (curr_offset - offset),
+ "Subaddress information");
+
+ curr_offset += len - (curr_offset - offset);
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.9
+ */
+static guint8
+de_clg_party_bcd_num(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+ guint8 oct;
+ guint8 ton;
+ guint8 *poctets;
+ guint32 curr_offset;
+ gchar *str;
+
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Extension",
+ a_bigbuf);
+
+ ton = (oct & 0x70) >> 4;
+ switch (ton)
+ {
+ case 0: str = "Unknown"; break;
+ case 1: str = "International number"; break;
+ case 2: str = "National number"; break;
+ case 3: str = "Network specific number"; break;
+ case 4: str = "Dedicated access, short code"; break;
+ case 7: str = "Reserved for extension"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Type of number: %s",
+ a_bigbuf,
+ str);
+
+ if ((ton == 0) ||
+ (ton == 1) ||
+ (ton == 2) ||
+ (ton == 4))
+ {
+ switch (oct & 0x0f)
+ {
+ case 0: str = "Unknown"; break;
+ case 1: str = "ISDN/telephony numbering plan (Rec. E.164/E.163)"; break;
+ case 3: str = "Data numbering plan (Recommendation X.121)"; break;
+ case 4: str = "Telex numbering plan (Recommendation F.69)"; break;
+ case 8: str = "National numbering plan"; break;
+ case 9: str = "Private numbering plan"; break;
+ case 11: str = "Reserved for CTS (see 3GPP TS 44.056)"; break;
+ case 15: str = "Reserved for extension"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+ }
+ else
+ {
+ str = "not applicable";
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Numbering plan identification: %s",
+ a_bigbuf,
+ str);
+
+ curr_offset++;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Extension",
+ a_bigbuf);
+
+ switch ((oct & 0x60) >> 5)
+ {
+ case 0: str = "Presentation allowed"; break;
+ case 1: str = "Presentation restricted"; break;
+ case 2: str = "Number not available due to interworking"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Presentation indicator: %s",
+ a_bigbuf,
+ str);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x1c, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Spare",
+ a_bigbuf);
+
+ switch (oct & 0x03)
+ {
+ case 0: str = "User-provided, not screened"; break;
+ case 1: str = "User-provided, verified and passed"; break;
+ case 2: str = "User-provided, verified and failed"; break;
+ default:
+ str = "Network provided";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Screening indicator: %s",
+ a_bigbuf,
+ str);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ poctets = tvb_get_string(tvb, curr_offset, len - (curr_offset - offset));
+
+ my_dgt_tbcd_unpack(a_bigbuf, poctets, len - (curr_offset - offset),
+ &Dgt_mbcd);
+ g_free(poctets);
+
+ proto_tree_add_string_format(tree, hf_gsm_a_clg_party_bcd_num,
+ tvb, curr_offset, len - (curr_offset - offset),
+ a_bigbuf,
+ "BCD Digits: %s",
+ a_bigbuf);
+
+ curr_offset += len - (curr_offset - offset);
+
+ sprintf(add_string, " - (%s)", a_bigbuf);
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.10
+ */
+static guint8
+de_clg_party_sub_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+ guint8 oct;
+ guint32 curr_offset;
+ gchar *str;
+
+ add_string = add_string;
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Extension",
a_bigbuf);
- ton = (oct & 0x70) >> 4;
- switch (ton)
+ switch ((oct & 0x70) >> 4)
{
- case 0: str = "Unknown"; break;
- case 1: str = "International number"; break;
- case 2: str = "National number"; break;
- case 3: str = "Network specific number"; break;
- case 4: str = "Dedicated access, short code"; break;
- case 7: str = "Reserved for extension"; break;
+ case 0: str = "NSAP (X.213/ISO 8348 AD2)"; break;
+ case 2: str = "User specified"; break;
default:
str = "Reserved";
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : Type of number: %s",
+ "%s : Type of subaddress: %s",
a_bigbuf,
str);
- if ((ton == 0) ||
- (ton == 1) ||
- (ton == 2) ||
- (ton == 4))
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Odd/Even indicator: %s",
+ a_bigbuf,
+ (oct & 0x08) ?
+ "odd number of address signals" : "even number of address signals");
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Spare",
+ a_bigbuf);
+
+ curr_offset++;
+
+ NO_MORE_DATA_CHECK(len);
+
+ proto_tree_add_text(tree,
+ tvb, curr_offset, len - (curr_offset - offset),
+ "Subaddress information");
+
+ curr_offset += len - (curr_offset - offset);
+
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+
+ return(curr_offset - offset);
+}
+
+/*
+ * [3] 10.5.4.11
+ */
+static guint8
+de_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+{
+ guint8 oct;
+ guint8 cause;
+ guint32 curr_offset;
+ gchar *str;
+
+ curr_offset = offset;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Extension: %s",
+ a_bigbuf,
+ (oct & 0x80) ? "not extended" : "extended");
+
+ switch ((oct & 0x60) >> 5)
{
- switch (oct & 0x0f)
- {
- case 0: str = "Unknown"; break;
- case 1: str = "ISDN/telephony numbering plan (Rec. E.164/E.163)"; break;
- case 3: str = "Data numbering plan (Recommendation X.121)"; break;
- case 4: str = "Telex numbering plan (Recommendation F.69)"; break;
- case 8: str = "National numbering plan"; break;
- case 9: str = "Private numbering plan"; break;
- case 11: str = "Reserved for CTS (see 3GPP TS 44.056)"; break;
- case 15: str = "Reserved for extension"; break;
- default:
- str = "Reserved";
- break;
- }
+ case 0: str = "Coding as specified in ITU-T Rec. Q.931"; break;
+ case 1: str = "Reserved for other international standards"; break;
+ case 2: str = "National standard"; break;
+ default:
+ str = "Standard defined for the GSM PLMNS";
+ break;
}
- else
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Coding standard: %s",
+ a_bigbuf,
+ str);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Spare",
+ a_bigbuf);
+
+ switch (oct & 0x0f)
{
- str = "not applicable";
+ case 0: str = "User"; break;
+ case 1: str = "Private network serving the local user"; break;
+ case 2: str = "Public network serving the local user"; break;
+ case 3: str = "Transit network"; break;
+ case 4: str = "Public network serving the remote user"; break;
+ case 5: str = "Private network serving the remote user"; break;
+ case 7: str = "International network"; break;
+ case 10: str = "Network beyond interworking point"; break;
+ default:
+ str = "Reserved";
+ break;
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Location: %s",
+ a_bigbuf,
+ str);
+
+ curr_offset++;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+
+ if (!(oct & 0x80))
+ {
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Extension",
+ a_bigbuf);
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Recommendation",
+ a_bigbuf);
+
+ curr_offset++;
+
+ oct = tvb_get_guint8(tvb, curr_offset);
+ }
+
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ proto_tree_add_text(tree,
+ tvb, curr_offset, 1,
+ "%s : Extension",
+ a_bigbuf);
+
+ cause = oct & 0x7f;
+ switch (cause)
+ {
+ case 1: str = "Unassigned (unallocated) number"; break;
+ case 3: str = "No route to destination"; break;
+ case 6: str = "Channel unacceptable"; break;
+ case 8: str = "Operator determined barring"; break;
+ case 16: str = "Normal call clearing"; break;
+ case 17: str = "User busy"; break;
+ case 18: str = "No user responding"; break;
+ case 19: str = "User alerting, no answer"; break;
+ case 21: str = "Call rejected"; break;
+ case 22: str = "Number changed"; break;
+ case 25: str = "Pre-emption"; break;
+ case 26: str = "Non selected user clearing"; break;
+ case 27: str = "Destination out of order"; break;
+ case 28: str = "Invalid number format (incomplete number)"; break;
+ case 29: str = "Facility rejected"; break;
+ case 30: str = "Response to STATUS ENQUIRY"; break;
+ case 31: str = "Normal, unspecified"; break;
+ case 34: str = "No circuit/channel available"; break;
+ case 38: str = "Network out of order"; break;
+ case 41: str = "Temporary failure"; break;
+ case 42: str = "Switching equipment congestion"; break;
+ case 43: str = "Access information discarded"; break;
+ case 44: str = "requested circuit/channel not available"; break;
+ case 47: str = "Resources unavailable, unspecified"; break;
+ case 49: str = "Quality of service unavailable"; break;
+ case 50: str = "Requested facility not subscribed"; break;
+ case 55: str = "Incoming calls barred within the CUG"; break;
+ case 57: str = "Bearer capability not authorized"; break;
+ case 58: str = "Bearer capability not presently available"; break;
+ case 63: str = "Service or option not available, unspecified"; break;
+ case 65: str = "Bearer service not implemented"; break;
+ case 68: str = "ACM equal to or greater than ACMmax"; break;
+ case 69: str = "Requested facility not implemented"; break;
+ case 70: str = "Only restricted digital information bearer capability is available"; break;
+ case 79: str = "Service or option not implemented, unspecified"; break;
+ case 81: str = "Invalid transaction identifier value"; break;
+ case 87: str = "User not member of CUG"; break;
+ case 88: str = "Incompatible destination"; break;
+ case 91: str = "Invalid transit network selection"; break;
+ case 95: str = "Semantically incorrect message"; break;
+ case 96: str = "Invalid mandatory information"; break;
+ case 97: str = "Message type non-existent or not implemented"; break;
+ case 98: str = "Message type not compatible with protocol state"; break;
+ case 99: str = "Information element non-existent or not implemented"; break;
+ case 100: str = "Conditional IE error"; break;
+ case 101: str = "Message not compatible with protocol state"; break;
+ case 102: str = "Recovery on timer expiry"; break;
+ case 111: str = "Protocol error, unspecified"; break;
+ case 127: str = "Interworking, unspecified"; break;
+ default:
+ if (cause <= 31) { str = "Treat as Normal, unspecified"; }
+ else if ((cause >= 32) && (cause <= 47)) { str = "Treat as Resources unavailable, unspecified"; }
+ else if ((cause >= 48) && (cause <= 63)) { str = "Treat as Service or option not available, unspecified"; }
+ else if ((cause >= 64) && (cause <= 79)) { str = "Treat as Service or option not implemented, unspecified"; }
+ else if ((cause >= 80) && (cause <= 95)) { str = "Treat as Semantically incorrect message"; }
+ else if ((cause >= 96) && (cause <= 111)) { str = "Treat as Protocol error, unspecified"; }
+ else if ((cause >= 112) && (cause <= 127)) { str = "Treat as Interworking, unspecified"; }
+ break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Numbering plan identification: %s",
+ other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+ proto_tree_add_uint_format(tree, hf_gsm_a_dtap_cause,
+ tvb, curr_offset, 1, cause,
+ "%s : Cause: (%u) %s",
a_bigbuf,
+ cause,
str);
curr_offset++;
- NO_MORE_DATA_CHECK(len);
-
- poctets = tvb_get_string(tvb, curr_offset, len - (curr_offset - offset));
+ sprintf(add_string, " - (%u) %s", cause, str);
- my_dgt_tbcd_unpack(a_bigbuf, poctets, len - (curr_offset - offset),
- &Dgt_mbcd);
- g_free(poctets);
+ NO_MORE_DATA_CHECK(len);
- proto_tree_add_string_format(tree, hf_gsm_a_cld_party_bcd_num,
+ proto_tree_add_text(tree,
tvb, curr_offset, len - (curr_offset - offset),
- a_bigbuf,
- "BCD Digits: %s",
- a_bigbuf);
+ "Diagnostics");
curr_offset += len - (curr_offset - offset);
- sprintf(add_string, " - (%s)", a_bigbuf);
-
EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
return(curr_offset - offset);
}
-/*
- * [3] 10.5.4.8
+
+#define GSM_A_TC_START_SUBTREE(_Gtree, _Gsaved_offset, _Gtag, _Gstr1, _Gett, _Gdef_len_p, _Glen_p, _Gsubtree_p) \
+ { \
+ guint _len_offset; \
+ proto_item *_item; \
+ \
+ _len_offset = asn1->offset; \
+ asn1_length_decode(asn1, _Gdef_len_p, _Glen_p); \
+ \
+ _item = \
+ proto_tree_add_text(_Gtree, asn1->tvb, _Gsaved_offset, -1, _Gstr1); \
+ \
+ _Gsubtree_p = proto_item_add_subtree(_item, _Gett); \
+ \
+ proto_tree_add_text(_Gsubtree_p, asn1->tvb, \
+ _Gsaved_offset, _len_offset - _Gsaved_offset, "Tag: 0x%02x", _Gtag); \
+ \
+ if (*_Gdef_len_p) \
+ { \
+ proto_tree_add_text(_Gsubtree_p, asn1->tvb, \
+ _len_offset, asn1->offset - _len_offset, "Length: %d", *_Glen_p); \
+ } \
+ else \
+ { \
+ proto_tree_add_text(_Gsubtree_p, asn1->tvb, \
+ _len_offset, asn1->offset - _len_offset, "Length: Indefinite"); \
+ \
+ *_Glen_p = tcap_find_eoc(asn1); \
+ } \
+ \
+ proto_item_set_len(_item, (asn1->offset - _Gsaved_offset) + *_Glen_p + \
+ (*_Gdef_len_p ? 0 : TCAP_EOC_LEN)); \
+ }
+
+/*
+ * [6] 3.6
*/
static guint8
-de_cld_party_sub_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+de_facility(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
- guint8 oct;
- guint32 curr_offset;
+ ASN1_SCK asn1_real, *asn1;
+ proto_item *item;
+ proto_tree *subtree, *temp_subtree, *seq_subtree;
+ guint saved_offset, comp_saved_offset, comp_len_offset, comp_data_offset;
+ guint comp_len, temp_len;
+ gboolean def_len[3];
+ guint comp_tag, tag;
gchar *str;
+ gint32 int_val;
add_string = add_string;
- curr_offset = offset;
- oct = tvb_get_guint8(tvb, curr_offset);
+ asn1 = &asn1_real;
+ asn1_open(asn1, tvb, offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Extension",
- a_bigbuf);
+ /* call next dissector for EACH component */
- switch ((oct & 0x70) >> 4)
+ while ((len - (asn1->offset - offset)) > 0)
{
- case 0: str = "NSAP (X.213/ISO 8348 AD2)"; break;
- case 2: str = "User specified"; break;
- default:
- str = "Reserved";
- break;
- }
+ comp_saved_offset = asn1->offset;
+ saved_offset = asn1->offset;
+ asn1_id_decode1(asn1, &comp_tag);
- my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Type of subaddress: %s",
- a_bigbuf,
- str);
+ comp_len_offset = asn1->offset;
+ comp_len = 0;
+ def_len[0] = FALSE;
+ asn1_length_decode(asn1, &def_len[0], &comp_len);
+ comp_data_offset = asn1->offset;
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Odd/Even indicator: %s",
- a_bigbuf,
- (oct & 0x08) ?
- "odd number of address signals" : "even number of address signals");
+ if (def_len[0])
+ {
+ temp_len = comp_len + (asn1->offset - saved_offset);
+ }
+ else
+ {
+ comp_len = tcap_find_eoc(asn1);
+ temp_len = comp_len + (asn1->offset - saved_offset) + TCAP_EOC_LEN;
+ }
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Spare",
- a_bigbuf);
+ item =
+ proto_tree_add_text(tree, asn1->tvb, comp_saved_offset, temp_len, "Component");
- curr_offset++;
+ subtree = proto_item_add_subtree(item, ett_tc_component);
- NO_MORE_DATA_CHECK(len);
+ str = match_strval((guint32) comp_tag, tcap_component_type_str);
- proto_tree_add_text(tree,
- tvb, curr_offset, len - (curr_offset - offset),
- "Subaddress information");
+ if (str == NULL)
+ {
+ proto_tree_add_text(subtree, asn1->tvb, comp_saved_offset, temp_len,
+ "Unknown component type tag, ignoring component");
- curr_offset += len - (curr_offset - offset);
+ asn1->offset = comp_saved_offset + temp_len;
+ continue;
+ }
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+ proto_tree_add_text(subtree, asn1->tvb, comp_saved_offset,
+ comp_len_offset - comp_saved_offset,
+ "%s Type Tag: 0x%02x", str, comp_tag);
- return(curr_offset - offset);
-}
+ if (def_len[0])
+ {
+ proto_tree_add_text(subtree, asn1->tvb,
+ comp_len_offset, asn1->offset - comp_len_offset, "Length: %d", comp_len);
+ }
+ else
+ {
+ proto_tree_add_text(subtree, asn1->tvb,
+ comp_len_offset, asn1->offset - comp_len_offset, "Length: Indefinite");
+ }
-/*
- * [3] 10.5.4.9
- */
-static guint8
-de_clg_party_bcd_num(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
-{
- guint8 oct;
- guint8 ton;
- guint8 *poctets;
- guint32 curr_offset;
- gchar *str;
+ saved_offset = asn1->offset;
+ asn1_id_decode1(asn1, &tag);
- curr_offset = offset;
+ GSM_A_TC_START_SUBTREE(subtree, saved_offset, tag, "Invoke ID",
+ ett_tc_invoke_id, &def_len[1], &temp_len, temp_subtree);
- oct = tvb_get_guint8(tvb, curr_offset);
+ if (temp_len > 0)
+ {
+ saved_offset = asn1->offset;
+ asn1_int32_value_decode(asn1, temp_len, &int_val);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Extension",
- a_bigbuf);
+ proto_tree_add_text(temp_subtree, asn1->tvb,
+ saved_offset, temp_len, "Invoke ID: %d", int_val);
+ }
- ton = (oct & 0x70) >> 4;
- switch (ton)
- {
- case 0: str = "Unknown"; break;
- case 1: str = "International number"; break;
- case 2: str = "National number"; break;
- case 3: str = "Network specific number"; break;
- case 4: str = "Dedicated access, short code"; break;
- case 7: str = "Reserved for extension"; break;
- default:
- str = "Reserved";
- break;
- }
+ if (!def_len[1])
+ {
+ saved_offset = asn1->offset;
+ asn1_eoc_decode(asn1, -1);
- my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Type of number: %s",
- a_bigbuf,
- str);
+ proto_tree_add_text(subtree, asn1->tvb,
+ saved_offset, asn1->offset - saved_offset, "End of Contents");
+ }
- if ((ton == 0) ||
- (ton == 1) ||
- (ton == 2) ||
- (ton == 4))
- {
- switch (oct & 0x0f)
+ switch (comp_tag)
{
- case 0: str = "Unknown"; break;
- case 1: str = "ISDN/telephony numbering plan (Rec. E.164/E.163)"; break;
- case 3: str = "Data numbering plan (Recommendation X.121)"; break;
- case 4: str = "Telex numbering plan (Recommendation F.69)"; break;
- case 8: str = "National numbering plan"; break;
- case 9: str = "Private numbering plan"; break;
- case 11: str = "Reserved for CTS (see 3GPP TS 44.056)"; break;
- case 15: str = "Reserved for extension"; break;
- default:
- str = "Reserved";
+ case TCAP_COMP_INVOKE:
+ saved_offset = asn1->offset;
+ asn1_id_decode1(asn1, &tag);
+
+ if (tag == TCAP_LINKED_ID_TAG)
+ {
+ GSM_A_TC_START_SUBTREE(subtree, saved_offset, tag, "Linked ID",
+ ett_tc_linked_id, &def_len[1], &temp_len, temp_subtree);
+
+ if (temp_len > 0)
+ {
+ saved_offset = asn1->offset;
+ asn1_int32_value_decode(asn1, temp_len, &int_val);
+
+ proto_tree_add_text(temp_subtree, asn1->tvb,
+ saved_offset, temp_len, "Linked ID: %d", int_val);
+ }
+
+ if (!def_len[1])
+ {
+ saved_offset = asn1->offset;
+ asn1_eoc_decode(asn1, -1);
+
+ proto_tree_add_text(subtree, asn1->tvb,
+ saved_offset, asn1->offset - saved_offset, "End of Contents");
+ }
+
+ saved_offset = asn1->offset;
+ asn1_id_decode1(asn1, &tag);
+ }
+
+ GSM_A_TC_START_SUBTREE(subtree, saved_offset, tag, "Operation Code",
+ ett_tc_opr_code, &def_len[1], &temp_len, temp_subtree);
+
+ if (temp_len > 0)
+ {
+ saved_offset = asn1->offset;
+ asn1_int32_value_decode(asn1, temp_len, &int_val);
+
+ str = match_strval(int_val, gsm_ss_opr_code_strings);
+
+ proto_tree_add_text(temp_subtree, asn1->tvb,
+ saved_offset, temp_len, "Operation Code: %s (%d)",
+ (str == NULL) ? "Unknown Operation Code" : str,
+ int_val);
+ }
+
+ if (!def_len[1])
+ {
+ saved_offset = asn1->offset;
+ asn1_eoc_decode(asn1, -1);
+
+ proto_tree_add_text(subtree, asn1->tvb,
+ saved_offset, asn1->offset - saved_offset, "End of Contents");
+ }
+
+ if ((comp_len - (asn1->offset - comp_data_offset)) > 0)
+ {
+ gsm_ss_dissect(asn1, subtree,
+ comp_len - (asn1->offset - comp_data_offset), int_val, comp_tag);
+ }
break;
- }
- }
- else
- {
- str = "not applicable";
- }
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Numbering plan identification: %s",
- a_bigbuf,
- str);
+ case TCAP_COMP_RRL:
+ if ((len - (asn1->offset - offset)) > 0)
+ {
+ saved_offset = asn1->offset;
+ asn1_id_decode1(asn1, &tag);
- curr_offset++;
+ GSM_A_TC_START_SUBTREE(subtree, saved_offset, tag, "Sequence",
+ ett_tc_sequence, &def_len[1], &temp_len, seq_subtree);
- oct = tvb_get_guint8(tvb, curr_offset);
+ saved_offset = asn1->offset;
+ asn1_id_decode1(asn1, &tag);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Extension",
- a_bigbuf);
+ GSM_A_TC_START_SUBTREE(seq_subtree, saved_offset, tag, "Operation Code",
+ ett_tc_opr_code, &def_len[2], &temp_len, temp_subtree);
- switch ((oct & 0x60) >> 5)
- {
- case 0: str = "Presentation allowed"; break;
- case 1: str = "Presentation restricted"; break;
- case 2: str = "Number not available due to interworking"; break;
- default:
- str = "Reserved";
- break;
- }
+ if (temp_len > 0)
+ {
+ saved_offset = asn1->offset;
+ asn1_int32_value_decode(asn1, temp_len, &int_val);
- my_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Presentation indicator: %s",
- a_bigbuf,
- str);
+ str = match_strval(int_val, gsm_ss_opr_code_strings);
- my_decode_bitfield_value(a_bigbuf, oct, 0x1c, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Spare",
- a_bigbuf);
+ proto_tree_add_text(temp_subtree, asn1->tvb,
+ saved_offset, temp_len, "Operation Code: %s (%d)",
+ (str == NULL) ? "Unknown Operation Code" : str,
+ int_val);
+ }
- switch (oct & 0x03)
- {
- case 0: str = "User-provided, not screened"; break;
- case 1: str = "User-provided, verified and passed"; break;
- case 2: str = "User-provided, verified and failed"; break;
- default:
- str = "Network provided";
- break;
- }
+ if (!def_len[2])
+ {
+ saved_offset = asn1->offset;
+ asn1_eoc_decode(asn1, -1);
- my_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Screening indicator: %s",
- a_bigbuf,
- str);
+ proto_tree_add_text(subtree, asn1->tvb,
+ saved_offset, asn1->offset - saved_offset, "End of Contents");
+ }
+
+ if ((comp_len - (asn1->offset - comp_data_offset)) > 0)
+ {
+ gsm_ss_dissect(asn1, seq_subtree,
+ comp_len - (asn1->offset - comp_data_offset), int_val, comp_tag);
+ }
+
+ if (!def_len[1])
+ {
+ saved_offset = asn1->offset;
+ asn1_eoc_decode(asn1, -1);
+
+ proto_tree_add_text(subtree, asn1->tvb,
+ saved_offset, asn1->offset - saved_offset, "End of Contents");
+ }
+ }
+ break;
+
+ case TCAP_COMP_RE:
+ saved_offset = asn1->offset;
+ asn1_id_decode1(asn1, &tag);
+
+ GSM_A_TC_START_SUBTREE(subtree, saved_offset, tag, "Error Code",
+ ett_tc_err_code, &def_len[1], &temp_len, temp_subtree);
+
+ if (temp_len > 0)
+ {
+ proto_tree_add_text(temp_subtree, asn1->tvb,
+ asn1->offset, temp_len, "Error Code");
+
+ asn1->offset += temp_len;
+ }
+
+ if (!def_len[1])
+ {
+ saved_offset = asn1->offset;
+ asn1_eoc_decode(asn1, -1);
+
+ proto_tree_add_text(subtree, asn1->tvb,
+ saved_offset, asn1->offset - saved_offset, "End of Contents");
+ }
+
+ if ((comp_len - (asn1->offset - comp_data_offset)) > 0)
+ {
+ /*
+ * XXX need conversations to determine 'opr_code'
+ */
+ gsm_ss_dissect(asn1, subtree,
+ comp_len - (asn1->offset - comp_data_offset), 0, comp_tag);
+ }
+ break;
- curr_offset++;
+ case TCAP_COMP_REJECT:
+ saved_offset = asn1->offset;
+ asn1_id_decode1(asn1, &tag);
- NO_MORE_DATA_CHECK(len);
+ GSM_A_TC_START_SUBTREE(subtree, saved_offset, tag, "Problem Code",
+ ett_tc_prob_code, &def_len[1], &temp_len, temp_subtree);
- poctets = tvb_get_string(tvb, curr_offset, len - (curr_offset - offset));
+ if (temp_len > 0)
+ {
+ proto_tree_add_text(temp_subtree, asn1->tvb,
+ asn1->offset, temp_len, "Problem Code");
- my_dgt_tbcd_unpack(a_bigbuf, poctets, len - (curr_offset - offset),
- &Dgt_mbcd);
- g_free(poctets);
+ asn1->offset += temp_len;
+ }
- proto_tree_add_string_format(tree, hf_gsm_a_clg_party_bcd_num,
- tvb, curr_offset, len - (curr_offset - offset),
- a_bigbuf,
- "BCD Digits: %s",
- a_bigbuf);
+ if (!def_len[1])
+ {
+ saved_offset = asn1->offset;
+ asn1_eoc_decode(asn1, -1);
- curr_offset += len - (curr_offset - offset);
+ proto_tree_add_text(subtree, asn1->tvb,
+ saved_offset, asn1->offset - saved_offset, "End of Contents");
+ }
+ break;
+ }
- sprintf(add_string, " - (%s)", a_bigbuf);
+ if (!def_len[0])
+ {
+ saved_offset = asn1->offset;
+ asn1_eoc_decode(asn1, -1);
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+ proto_tree_add_text(subtree, asn1->tvb,
+ saved_offset, asn1->offset - saved_offset, "End of Contents");
+ }
+ }
- return(curr_offset - offset);
+ return(len);
}
/*
- * [3] 10.5.4.10
+ * [3] 10.5.4.17
*/
static guint8
-de_clg_party_sub_addr(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+de_keypad_facility(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
guint8 oct;
guint32 curr_offset;
- gchar *str;
- add_string = add_string;
+ len = len;
curr_offset = offset;
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : Extension",
+ "%s : Spare",
a_bigbuf);
- switch ((oct & 0x70) >> 4)
- {
- case 0: str = "NSAP (X.213/ISO 8348 AD2)"; break;
- case 2: str = "User specified"; break;
- default:
- str = "Reserved";
- break;
- }
-
- my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Type of subaddress: %s",
- a_bigbuf,
- str);
-
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : Odd/Even indicator: %s",
+ "%s : Keypad information: %c",
a_bigbuf,
- (oct & 0x08) ?
- "odd number of address signals" : "even number of address signals");
-
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Spare",
- a_bigbuf);
+ oct & 0x7f);
curr_offset++;
- NO_MORE_DATA_CHECK(len);
-
- proto_tree_add_text(tree,
- tvb, curr_offset, len - (curr_offset - offset),
- "Subaddress information");
-
- curr_offset += len - (curr_offset - offset);
+ sprintf(add_string, " - %c", oct & 0x7f);
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
+ /* no length check possible */
return(curr_offset - offset);
}
/*
- * [3] 10.5.4.11
+ * [3] 10.5.4.21
*/
static guint8
-de_cause(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
+de_prog_ind(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
{
guint8 oct;
- guint8 cause;
guint32 curr_offset;
gchar *str;
+ len = len;
curr_offset = offset;
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Extension: %s",
a_bigbuf,
- (oct & 0x80) ? "not extended" : "extended");
+ (oct & 0x80) ? "extended" : "not extended");
switch ((oct & 0x60) >> 5)
{
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x60, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Coding standard: %s",
a_bigbuf,
str);
- my_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x10, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
case 0: str = "User"; break;
case 1: str = "Private network serving the local user"; break;
case 2: str = "Public network serving the local user"; break;
- case 3: str = "Transit network"; break;
case 4: str = "Public network serving the remote user"; break;
case 5: str = "Private network serving the remote user"; break;
- case 7: str = "International network"; break;
case 10: str = "Network beyond interworking point"; break;
default:
str = "Reserved";
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Location: %s",
oct = tvb_get_guint8(tvb, curr_offset);
- if (!(oct & 0x80))
- {
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Extension",
- a_bigbuf);
-
- my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Recommendation",
- a_bigbuf);
-
- curr_offset++;
-
- oct = tvb_get_guint8(tvb, curr_offset);
- }
-
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Extension",
- a_bigbuf);
-
- cause = oct & 0x7f;
- switch (cause)
- {
- case 1: str = "Unassigned (unallocated) number"; break;
- case 3: str = "No route to destination"; break;
- case 6: str = "Channel unacceptable"; break;
- case 8: str = "Operator determined barring"; break;
- case 16: str = "Normal call clearing"; break;
- case 17: str = "User busy"; break;
- case 18: str = "No user responding"; break;
- case 19: str = "User alerting, no answer"; break;
- case 21: str = "Call rejected"; break;
- case 22: str = "Number changed"; break;
- case 25: str = "Pre-emption"; break;
- case 26: str = "Non selected user clearing"; break;
- case 27: str = "Destination out of order"; break;
- case 28: str = "Invalid number format (incomplete number)"; break;
- case 29: str = "Facility rejected"; break;
- case 30: str = "Response to STATUS ENQUIRY"; break;
- case 31: str = "Normal, unspecified"; break;
- case 34: str = "No circuit/channel available"; break;
- case 38: str = "Network out of order"; break;
- case 41: str = "Temporary failure"; break;
- case 42: str = "Switching equipment congestion"; break;
- case 43: str = "Access information discarded"; break;
- case 44: str = "requested circuit/channel not available"; break;
- case 47: str = "Resources unavailable, unspecified"; break;
- case 49: str = "Quality of service unavailable"; break;
- case 50: str = "Requested facility not subscribed"; break;
- case 55: str = "Incoming calls barred within the CUG"; break;
- case 57: str = "Bearer capability not authorized"; break;
- case 58: str = "Bearer capability not presently available"; break;
- case 63: str = "Service or option not available, unspecified"; break;
- case 65: str = "Bearer service not implemented"; break;
- case 68: str = "ACM equal to or greater than ACMmax"; break;
- case 69: str = "Requested facility not implemented"; break;
- case 70: str = "Only restricted digital information bearer capability is available"; break;
- case 79: str = "Service or option not implemented, unspecified"; break;
- case 81: str = "Invalid transaction identifier value"; break;
- case 87: str = "User not member of CUG"; break;
- case 88: str = "Incompatible destination"; break;
- case 91: str = "Invalid transit network selection"; break;
- case 95: str = "Semantically incorrect message"; break;
- case 96: str = "Invalid mandatory information"; break;
- case 97: str = "Message type non-existent or not implemented"; break;
- case 98: str = "Message type not compatible with protocol state"; break;
- case 99: str = "Information element non-existent or not implemented"; break;
- case 100: str = "Conditional IE error"; break;
- case 101: str = "Message not compatible with protocol state"; break;
- case 102: str = "Recovery on timer expiry"; break;
- case 111: str = "Protocol error, unspecified"; break;
- case 127: str = "Interworking, unspecified"; break;
- default:
- if (cause <= 31) { str = "Treat as Normal, unspecified"; }
- else if ((cause >= 32) && (cause <= 47)) { str = "Treat as Resources unavailable, unspecified"; }
- else if ((cause >= 48) && (cause <= 63)) { str = "Treat as Service or option not available, unspecified"; }
- else if ((cause >= 64) && (cause <= 79)) { str = "Treat as Service or option not implemented, unspecified"; }
- else if ((cause >= 80) && (cause <= 95)) { str = "Treat as Semantically incorrect message"; }
- else if ((cause >= 96) && (cause <= 111)) { str = "Treat as Protocol error, unspecified"; }
- else if ((cause >= 112) && (cause <= 127)) { str = "Treat as Interworking, unspecified"; }
- break;
- }
-
- my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : Cause: (%d) %s",
+ "%s : Extension: %s",
a_bigbuf,
- cause,
- str);
-
- curr_offset++;
-
- sprintf(add_string, " - (%d) %s", cause, str);
-
- NO_MORE_DATA_CHECK(len);
-
- proto_tree_add_text(tree,
- tvb, curr_offset, len - (curr_offset - offset),
- "Diagnostics");
-
- curr_offset += len - (curr_offset - offset);
-
- EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
-
- return(curr_offset - offset);
-}
-
-/*
- * [3] 10.5.4.17
- */
-static guint8
-de_keypad_facility(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string)
-{
- guint8 oct;
- guint32 curr_offset;
- gchar *str;
-
- len = len;
- curr_offset = offset;
-
- oct = tvb_get_guint8(tvb, curr_offset);
-
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
- proto_tree_add_text(tree,
- tvb, curr_offset, 1,
- "%s : Spare",
- a_bigbuf);
+ (oct & 0x80) ? "extended" : "not extended");
- switch ((oct & 0x60) >> 5)
+ switch (oct & 0x7f)
{
- case 0: str = "Coding as specified in ITU-T Rec. Q.931"; break;
- case 1: str = "Reserved for other international standards"; break;
- case 2: str = "National standard"; break;
+ case 1: str = "Call is not end-to-end PLMN/ISDN, further call progress information may be available in-band"; break;
+ case 2: str = "Destination address in non-PLMN/ISDN"; break;
+ case 3: str = "Origination address in non-PLMN/ISDN"; break;
+ case 4: str = "Call has returned to the PLMN/ISDN"; break;
+ case 8: str = "In-band information or appropriate pattern now available"; break;
+ case 32: str = "Call is end-to-end PLMN/ISDN"; break;
+ case 64: str = "Queueing"; break;
default:
- str = "Standard defined for the GSM PLMNS";
+ str = "Unspecific";
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : Keypad information: %c",
+ "%s : Progress Description: %s (%d)",
a_bigbuf,
+ str,
oct & 0x7f);
- curr_offset++;
+ sprintf(add_string, " - %d", oct & 0x7f);
- sprintf(add_string, " - %c", oct & 0x7f);
+ curr_offset++;
- /* no length check possible */
+ EXTRANEOUS_DATA_CHECK(len, curr_offset - offset);
return(curr_offset - offset);
}
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : %s",
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "Cause: (%d) %s",
+ "Cause: (%u) %s",
oct,
str);
curr_offset++;
- sprintf(add_string, " - (%d) %s", oct, str);
+ sprintf(add_string, " - (%u) %s", oct, str);
/* no length check possible */
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "RP-Message Reference: 0x%02x (%d)",
+ "RP-Message Reference: 0x%02x (%u)",
oct,
oct);
*/
tpdu_tvb = tvb_new_subset(tvb, curr_offset, len, len);
- dissector_try_port(sms_dissector_table, gsm_a_rp_type, tpdu_tvb, g_pinfo, g_tree);
+ dissector_try_port(sms_dissector_table, 0, tpdu_tvb, g_pinfo, g_tree);
curr_offset += len;
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Extension: %s",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x7f, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
- "%s : Cause: (%d) %s",
+ "%s : Cause: (%u) %s",
a_bigbuf,
oct & 0x7f,
str);
curr_offset++;
- sprintf(add_string, " - (%d) %s", oct & 0x7f, str);
+ sprintf(add_string, " - (%u) %s", oct & 0x7f, str);
NO_MORE_DATA_CHECK(len);
de_day_saving_time, /* Daylight Saving Time */
/* Call Control Information Elements 10.5.4 */
de_aux_states, /* Auxiliary States */
- NULL, /* Bearer Capability */
+ de_bearer_cap, /* Bearer Capability */
de_cc_cap, /* Call Control Capabilities */
de_call_state, /* Call State */
de_cld_party_bcd_num, /* Called Party BCD Number */
NULL /* handled inline */, /* Congestion Level */
NULL, /* Connected Number */
NULL, /* Connected Subaddress */
- NULL, /* Facility */
+ de_facility, /* Facility */
NULL, /* High Layer Compatibility */
de_keypad_facility, /* Keypad Facility */
NULL, /* Low Layer Compatibility */
NULL, /* More Data */
NULL, /* Notification Indicator */
- NULL, /* Progress Indicator */
+ de_prog_ind, /* Progress Indicator */
NULL, /* Recall type $(CCBS)$ */
NULL, /* Redirecting Party BCD Number */
NULL, /* Redirecting Party Subaddress */
default: \
proto_tree_add_text(tree, \
tvb, curr_offset, -1, \
- "Unknown PDU type (%d)", SEV_pdu_type); \
+ "Unknown PDU type (%u)", SEV_pdu_type); \
return(consumed); \
}
subtree = proto_item_add_subtree(item, elem_ett[idx]);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Element ID",
#define ELEM_MAND_TLV(EMT_iei, EMT_pdu_type, EMT_elem_idx, EMT_elem_name_addition) \
{\
- if ((consumed = elem_tlv(tvb, tree, EMT_iei, EMT_pdu_type, EMT_elem_idx, curr_offset, curr_len, EMT_elem_name_addition)) > 0) \
+ if ((consumed = elem_tlv(tvb, tree, (guint8) EMT_iei, EMT_pdu_type, EMT_elem_idx, curr_offset, curr_len, EMT_elem_name_addition)) > 0) \
{ \
curr_offset += consumed; \
curr_len -= consumed; \
#define ELEM_OPT_TLV(EOT_iei, EOT_pdu_type, EOT_elem_idx, EOT_elem_name_addition) \
{\
- if ((consumed = elem_tlv(tvb, tree, EOT_iei, EOT_pdu_type, EOT_elem_idx, curr_offset, curr_len, EOT_elem_name_addition)) > 0) \
+ if ((consumed = elem_tlv(tvb, tree, (guint8) EOT_iei, EOT_pdu_type, EOT_elem_idx, curr_offset, curr_len, EOT_elem_name_addition)) > 0) \
{ \
curr_offset += consumed; \
curr_len -= consumed; \
#define ELEM_MAND_TV(EMT_iei, EMT_pdu_type, EMT_elem_idx, EMT_elem_name_addition) \
{\
- if ((consumed = elem_tv(tvb, tree, EMT_iei, EMT_pdu_type, EMT_elem_idx, curr_offset, EMT_elem_name_addition)) > 0) \
+ if ((consumed = elem_tv(tvb, tree, (guint8) EMT_iei, EMT_pdu_type, EMT_elem_idx, curr_offset, EMT_elem_name_addition)) > 0) \
{ \
curr_offset += consumed; \
curr_len -= consumed; \
#define ELEM_OPT_TV(EOT_iei, EOT_pdu_type, EOT_elem_idx, EOT_elem_name_addition) \
{\
- if ((consumed = elem_tv(tvb, tree, EOT_iei, EOT_pdu_type, EOT_elem_idx, curr_offset, EOT_elem_name_addition)) > 0) \
+ if ((consumed = elem_tv(tvb, tree, (guint8) EOT_iei, EOT_pdu_type, EOT_elem_idx, curr_offset, EOT_elem_name_addition)) > 0) \
{ \
curr_offset += consumed; \
curr_len -= consumed; \
#define ELEM_OPT_T(EOT_iei, EOT_pdu_type, EOT_elem_idx, EOT_elem_name_addition) \
{\
- if ((consumed = elem_t(tvb, tree, EOT_iei, EOT_pdu_type, EOT_elem_idx, curr_offset, EOT_elem_name_addition)) > 0) \
+ if ((consumed = elem_t(tvb, tree, (guint8) EOT_iei, EOT_pdu_type, EOT_elem_idx, curr_offset, EOT_elem_name_addition)) > 0) \
{ \
curr_offset += consumed; \
curr_len -= consumed; \
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
-#define NUM_GSM_BSSMAP_MSG (sizeof(gsm_bssmap_msg_strings)/sizeof(value_string))
+#define NUM_GSM_BSSMAP_MSG (sizeof(gsm_a_bssmap_msg_strings)/sizeof(value_string))
static gint ett_gsm_bssmap_msg[NUM_GSM_BSSMAP_MSG];
static void (*bssmap_msg_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
bssmap_ass_req, /* Assignment Request */
*/
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CIPH_KEY_SEQ_NUM]);
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
switch (oct & 0x07)
{
default:
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
- "%s : Ciphering Key Sequence Number: %d",
+ "%s : Ciphering Key Sequence Number: %u",
a_bigbuf,
oct & 0x07);
break;
*/
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CIPH_KEY_SEQ_NUM]);
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
switch (oct & 0x07)
{
default:
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
- "%s : Ciphering Key Sequence Number: %d",
+ "%s : Ciphering Key Sequence Number: %u",
a_bigbuf,
oct & 0x07);
break;
subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CIPH_KEY_SEQ_NUM]);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
switch ((oct & 0x70) >> 4)
{
default:
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
- "%s : Ciphering Key Sequence Number: %d",
+ "%s : Ciphering Key Sequence Number: %u",
a_bigbuf,
(oct & 0x70) >> 4);
break;
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
- "%s : Service Type: (%d) %s",
+ "%s : Service Type: (%u) %s",
a_bigbuf,
oct & 0x0f,
str);
*/
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_ID_TYPE]);
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Spare",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Type of identity: %s",
subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CIPH_KEY_SEQ_NUM]);
- my_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x80, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x70, 8);
switch ((oct & 0x70) >> 4)
{
default:
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
- "%s : Ciphering Key Sequence Number: %d",
+ "%s : Ciphering Key Sequence Number: %u",
a_bigbuf,
(oct & 0x70) >> 4);
break;
subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_LOC_UPD_TYPE]);
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Follow-On Request (FOR): %s",
a_bigbuf,
(oct & 0x08) ? "Follow-on request pending" : "No follow-on request pending");
- my_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x04, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Spare",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x03, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Updating Type: %s",
*/
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
subtree = proto_item_add_subtree(item, ett_gsm_dtap_elem[DE_CIPH_KEY_SEQ_NUM]);
- my_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x08, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Spare",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x07, 8);
switch (oct & 0x07)
{
default:
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
- "%s : Ciphering Key Sequence Number: %d",
+ "%s : Ciphering Key Sequence Number: %u",
a_bigbuf,
oct & 0x07);
break;
*/
oct = tvb_get_guint8(tvb, curr_offset);
- my_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0xf0, 8);
proto_tree_add_text(tree,
tvb, curr_offset, 1,
"%s : Spare",
break;
}
- my_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
+ other_decode_bitfield_value(a_bigbuf, oct, 0x0f, 8);
proto_tree_add_text(subtree,
tvb, curr_offset, 1,
"%s : Congestion level: %s",
EXTRANEOUS_DATA_CHECK(curr_len, 0);
}
-#define NUM_GSM_DTAP_MSG_MM (sizeof(gsm_dtap_msg_mm_strings)/sizeof(value_string))
+#define NUM_GSM_DTAP_MSG_MM (sizeof(gsm_a_dtap_msg_mm_strings)/sizeof(value_string))
static gint ett_gsm_dtap_msg_mm[NUM_GSM_DTAP_MSG_MM];
static void (*dtap_msg_mm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
dtap_mm_imsi_det_ind, /* IMSI Detach Indication */
NULL, /* NONE */
};
-#define NUM_GSM_DTAP_MSG_RR (sizeof(gsm_dtap_msg_rr_strings)/sizeof(value_string))
+#define NUM_GSM_DTAP_MSG_RR (sizeof(gsm_a_dtap_msg_rr_strings)/sizeof(value_string))
static gint ett_gsm_dtap_msg_rr[NUM_GSM_DTAP_MSG_RR];
static void (*dtap_msg_rr_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
NULL, /* RR Initialisation Request */
NULL, /* NONE */
};
-#define NUM_GSM_DTAP_MSG_CC (sizeof(gsm_dtap_msg_cc_strings)/sizeof(value_string))
+#define NUM_GSM_DTAP_MSG_CC (sizeof(gsm_a_dtap_msg_cc_strings)/sizeof(value_string))
static gint ett_gsm_dtap_msg_cc[NUM_GSM_DTAP_MSG_CC];
static void (*dtap_msg_cc_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
dtap_cc_alerting, /* Alerting */
NULL, /* NONE */
};
-#define NUM_GSM_DTAP_MSG_GMM (sizeof(gsm_dtap_msg_gmm_strings)/sizeof(value_string))
+#define NUM_GSM_DTAP_MSG_GMM (sizeof(gsm_a_dtap_msg_gmm_strings)/sizeof(value_string))
static gint ett_gsm_dtap_msg_gmm[NUM_GSM_DTAP_MSG_GMM];
static void (*dtap_msg_gmm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
NULL, /* Attach Request */
NULL, /* NONE */
};
-#define NUM_GSM_DTAP_MSG_SMS (sizeof(gsm_dtap_msg_sms_strings)/sizeof(value_string))
+#define NUM_GSM_DTAP_MSG_SMS (sizeof(gsm_a_dtap_msg_sms_strings)/sizeof(value_string))
static gint ett_gsm_dtap_msg_sms[NUM_GSM_DTAP_MSG_SMS];
static void (*dtap_msg_sms_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
dtap_sms_cp_data, /* CP-DATA */
NULL, /* NONE */
};
-#define NUM_GSM_DTAP_MSG_SM (sizeof(gsm_dtap_msg_sm_strings)/sizeof(value_string))
+#define NUM_GSM_DTAP_MSG_SM (sizeof(gsm_a_dtap_msg_sm_strings)/sizeof(value_string))
static gint ett_gsm_dtap_msg_sm[NUM_GSM_DTAP_MSG_SM];
static void (*dtap_msg_sm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
NULL, /* Activate PDP Context Request */
NULL, /* NONE */
};
-#define NUM_GSM_DTAP_MSG_SS (sizeof(gsm_dtap_msg_ss_strings)/sizeof(value_string))
+#define NUM_GSM_DTAP_MSG_SS (sizeof(gsm_a_dtap_msg_ss_strings)/sizeof(value_string))
static gint ett_gsm_dtap_msg_ss[NUM_GSM_DTAP_MSG_SS];
static void (*dtap_msg_ss_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len) = {
dtap_cc_release_complete, /* Release Complete */
gchar *str;
- if (!proto_is_protocol_enabled(proto_a_rp))
- {
- call_dissector(data_handle, tvb, pinfo, tree);
- return;
- }
-
if (check_col(pinfo->cinfo, COL_INFO))
{
col_append_str(pinfo->cinfo, COL_INFO, "(RP) ");
}
else
{
- gsm_a_rp_type = oct;
-
rp_item =
proto_tree_add_protocol_format(tree, proto_a_rp, tvb, 0, -1,
"GSM A-I/F RP - %s",
static void
dissect_bssmap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
+ static gsm_a_tap_rec_t tap_rec[4];
+ static gsm_a_tap_rec_t *tap_p;
+ static int tap_current=0;
guint8 oct;
guint32 offset, saved_offset;
guint32 len;
gchar *str;
- if (!proto_is_protocol_enabled(proto_a_bssmap))
- {
- call_dissector(data_handle, tvb, pinfo, tree);
- return;
- }
-
if (check_col(pinfo->cinfo, COL_INFO))
{
col_append_str(pinfo->cinfo, COL_INFO, "(BSSMAP) ");
}
/*
- * In the interest of speed, if "tree" is NULL, don't do any work
- * not necessary to generate protocol tree items.
+ * set tap record pointer
*/
- if (!tree)
+ tap_current++;
+ if (tap_current == 4)
{
- return;
+ tap_current = 0;
}
+ tap_p = &tap_rec[tap_current];
+
offset = 0;
saved_offset = offset;
*/
oct = tvb_get_guint8(tvb, offset++);
- str = my_match_strval((guint32) oct, gsm_bssmap_msg_strings, &idx);
+ str = my_match_strval((guint32) oct, gsm_a_bssmap_msg_strings, &idx);
/*
* create the protocol tree
proto_tree_add_uint_format(bssmap_tree, hf_gsm_a_bssmap_msg_type,
tvb, saved_offset, 1, oct, "Message Type");
+ tap_p->pdu_type = BSSAP_PDU_TYPE_BSSMAP;
+ tap_p->message_type = oct;
+
+ tap_queue_packet(gsm_a_tap, pinfo, tap_p);
+
if (str == NULL) return;
if ((len - offset) <= 0) return;
static void
dissect_dtap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
- void (*msg_fcn)(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len);
- guint8 oct;
- guint8 pd;
- guint32 offset;
- guint32 len;
- guint32 oct_1, oct_2;
- gint idx;
- proto_item *dtap_item = NULL;
- proto_tree *dtap_tree = NULL;
- proto_item *oct_1_item = NULL;
- proto_tree *pd_tree = NULL;
- gchar *msg_str;
- const gchar *str;
- gint ett_tree;
- gint ti;
- int hf_idx;
+ static gsm_a_tap_rec_t tap_rec[4];
+ static gsm_a_tap_rec_t *tap_p;
+ static int tap_current=0;
+ void (*msg_fcn)(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len);
+ guint8 oct;
+ guint8 pd;
+ guint32 offset;
+ guint32 len;
+ guint32 oct_1, oct_2;
+ gint idx;
+ proto_item *dtap_item = NULL;
+ proto_tree *dtap_tree = NULL;
+ proto_item *oct_1_item = NULL;
+ proto_tree *pd_tree = NULL;
+ gchar *msg_str;
+ const gchar *str;
+ gint ett_tree;
+ gint ti;
+ int hf_idx;
+ gboolean nsd;
- if (!proto_is_protocol_enabled(proto_a_dtap))
- {
- call_dissector(data_handle, tvb, pinfo, tree);
- return;
- }
-
len = tvb_length(tvb);
if (len < 2)
}
/*
- * In the interest of speed, if "tree" is NULL, don't do any work
- * not necessary to generate protocol tree items.
+ * set tap record pointer
*/
- if (!tree)
+ tap_current++;
+ if (tap_current == 4)
{
- return;
+ tap_current = 0;
}
+ tap_p = &tap_rec[tap_current];
+
offset = 0;
oct_2 = 0;
ett_tree = -1;
hf_idx = -1;
msg_fcn = NULL;
+ nsd = FALSE;
/*
* octet 1
switch (pd)
{
case 3:
- str = pd_str[pd];
- msg_str = my_match_strval((guint32) (oct & DTAP_CC_IEI_MASK), gsm_dtap_msg_cc_strings, &idx);
+ str = gsm_a_pd_str[pd];
+ msg_str = my_match_strval((guint32) (oct & DTAP_CC_IEI_MASK), gsm_a_dtap_msg_cc_strings, &idx);
ett_tree = ett_gsm_dtap_msg_cc[idx];
hf_idx = hf_gsm_a_dtap_msg_cc_type;
msg_fcn = dtap_msg_cc_fcn[idx];
ti = (oct_1 & DTAP_TI_MASK) >> 4;
+ nsd = TRUE;
break;
case 5:
- str = pd_str[pd];
- msg_str = my_match_strval((guint32) (oct & DTAP_MM_IEI_MASK), gsm_dtap_msg_mm_strings, &idx);
+ str = gsm_a_pd_str[pd];
+ msg_str = my_match_strval((guint32) (oct & DTAP_MM_IEI_MASK), gsm_a_dtap_msg_mm_strings, &idx);
ett_tree = ett_gsm_dtap_msg_mm[idx];
hf_idx = hf_gsm_a_dtap_msg_mm_type;
msg_fcn = dtap_msg_mm_fcn[idx];
+ nsd = TRUE;
break;
case 6:
- str = pd_str[pd];
- msg_str = my_match_strval((guint32) (oct & DTAP_RR_IEI_MASK), gsm_dtap_msg_rr_strings, &idx);
+ str = gsm_a_pd_str[pd];
+ msg_str = my_match_strval((guint32) (oct & DTAP_RR_IEI_MASK), gsm_a_dtap_msg_rr_strings, &idx);
ett_tree = ett_gsm_dtap_msg_rr[idx];
hf_idx = hf_gsm_a_dtap_msg_rr_type;
msg_fcn = dtap_msg_rr_fcn[idx];
break;
case 8:
- str = pd_str[pd];
- msg_str = my_match_strval((guint32) (oct & DTAP_GMM_IEI_MASK), gsm_dtap_msg_gmm_strings, &idx);
+ str = gsm_a_pd_str[pd];
+ msg_str = my_match_strval((guint32) (oct & DTAP_GMM_IEI_MASK), gsm_a_dtap_msg_gmm_strings, &idx);
ett_tree = ett_gsm_dtap_msg_gmm[idx];
hf_idx = hf_gsm_a_dtap_msg_gmm_type;
msg_fcn = dtap_msg_gmm_fcn[idx];
break;
case 9:
- str = pd_str[pd];
- msg_str = my_match_strval((guint32) (oct & DTAP_SMS_IEI_MASK), gsm_dtap_msg_sms_strings, &idx);
+ str = gsm_a_pd_str[pd];
+ msg_str = my_match_strval((guint32) (oct & DTAP_SMS_IEI_MASK), gsm_a_dtap_msg_sms_strings, &idx);
ett_tree = ett_gsm_dtap_msg_sms[idx];
hf_idx = hf_gsm_a_dtap_msg_sms_type;
msg_fcn = dtap_msg_sms_fcn[idx];
break;
case 10:
- str = pd_str[pd];
- msg_str = my_match_strval((guint32) (oct & DTAP_SM_IEI_MASK), gsm_dtap_msg_sm_strings, &idx);
+ str = gsm_a_pd_str[pd];
+ msg_str = my_match_strval((guint32) (oct & DTAP_SM_IEI_MASK), gsm_a_dtap_msg_sm_strings, &idx);
ett_tree = ett_gsm_dtap_msg_sm[idx];
hf_idx = hf_gsm_a_dtap_msg_sm_type;
msg_fcn = dtap_msg_sm_fcn[idx];
break;
case 11:
- str = pd_str[pd];
- msg_str = my_match_strval((guint32) (oct & DTAP_SS_IEI_MASK), gsm_dtap_msg_ss_strings, &idx);
+ str = gsm_a_pd_str[pd];
+ msg_str = my_match_strval((guint32) (oct & DTAP_SS_IEI_MASK), gsm_a_dtap_msg_ss_strings, &idx);
ett_tree = ett_gsm_dtap_msg_ss[idx];
hf_idx = hf_gsm_a_dtap_msg_ss_type;
msg_fcn = dtap_msg_ss_fcn[idx];
ti = (oct_1 & DTAP_TI_MASK) >> 4;
+ nsd = TRUE;
break;
default:
- str = pd_str[pd];
+ str = gsm_a_pd_str[pd];
break;
}
if (ti == -1)
{
- my_decode_bitfield_value(a_bigbuf, oct_1, 0xf0, 8);
+ other_decode_bitfield_value(a_bigbuf, oct_1, 0xf0, 8);
proto_tree_add_text(pd_tree,
tvb, 0, 1,
"%s : Skip Indicator",
}
else
{
- my_decode_bitfield_value(a_bigbuf, oct_1, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct_1, 0x80, 8);
proto_tree_add_text(pd_tree,
tvb, 0, 1,
"%s : TI flag: %s",
{
/* ti is extended to next octet */
- my_decode_bitfield_value(a_bigbuf, oct_1, 0x70, 8);
+ other_decode_bitfield_value(a_bigbuf, oct_1, 0x70, 8);
proto_tree_add_text(pd_tree,
tvb, 0, 1,
"%s : TIO: The TI value is given by the TIE in octet 2",
}
else
{
- my_decode_bitfield_value(a_bigbuf, oct_1, 0x70, 8);
+ other_decode_bitfield_value(a_bigbuf, oct_1, 0x70, 8);
proto_tree_add_text(pd_tree,
tvb, 0, 1,
- "%s : TIO: %d",
+ "%s : TIO: %u",
a_bigbuf,
ti & DTAP_TIE_PRES_MASK);
}
}
- my_decode_bitfield_value(a_bigbuf, oct_1, DTAP_PD_MASK, 8);
+ other_decode_bitfield_value(a_bigbuf, oct_1, DTAP_PD_MASK, 8);
proto_tree_add_text(pd_tree,
tvb, 0, 1,
- "%s : Protocol Discriminator: %d",
+ "%s : Protocol Discriminator: %u",
a_bigbuf,
pd);
if ((ti != -1) &&
(ti & DTAP_TIE_PRES_MASK) == DTAP_TIE_PRES_MASK)
{
- my_decode_bitfield_value(a_bigbuf, oct_2, 0x80, 8);
+ other_decode_bitfield_value(a_bigbuf, oct_2, 0x80, 8);
proto_tree_add_text(pd_tree,
tvb, 1, 1,
"%s : Extension",
a_bigbuf);
- my_decode_bitfield_value(a_bigbuf, oct_2, DTAP_TIE_MASK, 8);
+ other_decode_bitfield_value(a_bigbuf, oct_2, DTAP_TIE_MASK, 8);
proto_tree_add_text(pd_tree,
tvb, 1, 1,
- "%s : TIE: %d",
+ "%s : TIE: %u",
a_bigbuf,
oct_2 & DTAP_TIE_MASK);
}
/*
- * XXX
* N(SD)
*/
+ if ((pinfo->p2p_dir == P2P_DIR_RECV) &&
+ nsd)
+ {
+ /* XXX */
+ }
/*
* add DTAP message name
offset++;
+ tap_p->pdu_type = BSSAP_PDU_TYPE_DTAP;
+ tap_p->message_type = (nsd ? (oct & 0x3f) : oct);
+ tap_p->protocol_disc = pd;
+
+ tap_queue_packet(gsm_a_tap, pinfo, tap_p);
+
if (msg_str == NULL) return;
if ((len - offset) <= 0) return;
{
{ &hf_gsm_a_bssmap_msg_type,
{ "BSSMAP Message Type", "gsm_a.bssmap_msgtype",
- FT_UINT8, BASE_HEX, VALS(gsm_bssmap_msg_strings), 0x0,
+ FT_UINT8, BASE_HEX, VALS(gsm_a_bssmap_msg_strings), 0x0,
"", HFILL }
},
{ &hf_gsm_a_dtap_msg_mm_type,
{ "DTAP Mobility Management Message Type", "gsm_a.dtap_msg_mm_type",
- FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_mm_strings), 0x0,
+ FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_mm_strings), 0x0,
"", HFILL }
},
{ &hf_gsm_a_dtap_msg_rr_type,
{ "DTAP Radio Resources Management Message Type", "gsm_a.dtap_msg_rr_type",
- FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_rr_strings), 0x0,
+ FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_rr_strings), 0x0,
"", HFILL }
},
{ &hf_gsm_a_dtap_msg_cc_type,
{ "DTAP Call Control Message Type", "gsm_a.dtap_msg_cc_type",
- FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_cc_strings), 0x0,
+ FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_cc_strings), 0x0,
"", HFILL }
},
{ &hf_gsm_a_dtap_msg_gmm_type,
{ "DTAP GPRS Mobility Management Message Type", "gsm_a.dtap_msg_gmm_type",
- FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_gmm_strings), 0x0,
+ FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_gmm_strings), 0x0,
"", HFILL }
},
{ &hf_gsm_a_dtap_msg_sms_type,
{ "DTAP Short Message Service Message Type", "gsm_a.dtap_msg_sms_type",
- FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_sms_strings), 0x0,
+ FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_sms_strings), 0x0,
"", HFILL }
},
{ &hf_gsm_a_dtap_msg_sm_type,
{ "DTAP GPRS Session Management Message Type", "gsm_a.dtap_msg_sm_type",
- FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_sm_strings), 0x0,
+ FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_sm_strings), 0x0,
"", HFILL }
},
{ &hf_gsm_a_dtap_msg_ss_type,
{ "DTAP Non call Supplementary Service Message Type", "gsm_a.dtap_msg_ss_type",
- FT_UINT8, BASE_HEX, VALS(gsm_dtap_msg_ss_strings), 0x0,
+ FT_UINT8, BASE_HEX, VALS(gsm_a_dtap_msg_ss_strings), 0x0,
"", HFILL }
},
{ &hf_gsm_a_rp_msg_type,
{ &hf_gsm_a_dlci_cc,
{ "Control Channel", "bssap.dlci.cc",
FT_UINT8, BASE_HEX, VALS(bssap_cc_values), 0xc0,
- "", HFILL}},
+ "", HFILL}
+ },
{ &hf_gsm_a_dlci_spare,
{ "Spare", "bssap.dlci.spare",
FT_UINT8, BASE_HEX, NULL, 0x38,
- "", HFILL}},
+ "", HFILL}
+ },
{ &hf_gsm_a_dlci_sapi,
{ "SAPI", "bssap.dlci.sapi",
FT_UINT8, BASE_HEX, VALS(bssap_sapi_values), 0x07,
- "", HFILL}},
+ "", HFILL}
+ },
+ { &hf_gsm_a_bssmap_cause,
+ { "BSSMAP Cause", "gsm_a_bssmap.cause",
+ FT_UINT8, BASE_HEX, 0, 0x0,
+ "", HFILL }
+ },
+ { &hf_gsm_a_dtap_cause,
+ { "DTAP Cause", "gsm_a_dtap.cause",
+ FT_UINT8, BASE_HEX, 0, 0x0,
+ "", HFILL }
+ },
};
/* Setup protocol subtree array */
-#define NUM_INDIVIDUAL_ELEMS 10
+#define NUM_INDIVIDUAL_ELEMS 33
static gint *ett[NUM_INDIVIDUAL_ELEMS + NUM_GSM_BSSMAP_MSG +
NUM_GSM_DTAP_MSG_MM + NUM_GSM_DTAP_MSG_RR + NUM_GSM_DTAP_MSG_CC +
NUM_GSM_DTAP_MSG_GMM + NUM_GSM_DTAP_MSG_SMS +
ett[7] = &ett_gsm_enc_info;
ett[8] = &ett_cell_list;
ett[9] = &ett_dlci;
+ ett[10] = &ett_bc_oct_3a;
+ ett[11] = &ett_bc_oct_4;
+ ett[12] = &ett_bc_oct_5;
+ ett[13] = &ett_bc_oct_5a;
+ ett[14] = &ett_bc_oct_5b;
+ ett[15] = &ett_bc_oct_6;
+ ett[16] = &ett_bc_oct_6a;
+ ett[17] = &ett_bc_oct_6b;
+ ett[18] = &ett_bc_oct_6c;
+ ett[19] = &ett_bc_oct_6d;
+ ett[20] = &ett_bc_oct_6e;
+ ett[21] = &ett_bc_oct_6f;
+ ett[22] = &ett_bc_oct_6g;
+ ett[23] = &ett_bc_oct_7;
+
+ ett[24] = &ett_tc_component;
+ ett[25] = &ett_tc_invoke_id;
+ ett[26] = &ett_tc_linked_id;
+ ett[27] = &ett_tc_opr_code;
+ ett[28] = &ett_tc_err_code;
+ ett[29] = &ett_tc_prob_code;
+ ett[30] = &ett_tc_sequence;
+ ett[31] = &gsm_ss_ett_sequence;
+ ett[32] = &gsm_ss_ett_param;
last_offset = NUM_INDIVIDUAL_ELEMS;
FT_UINT8, BASE_DEC);
proto_register_subtree_array(ett, array_length(ett));
+
+ gsm_a_tap = register_tap("gsm_a");
}