aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-gsm_map.c
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2017-04-28 18:39:07 +0200
committerAnders Broman <a.broman58@gmail.com>2017-04-29 06:04:18 +0000
commitfb1a6320ec67fc30414948b8e7e8c63c37a15983 (patch)
tree5ceda3d9f686c6c4f698d7b382041d109f5138f0 /epan/dissectors/packet-gsm_map.c
parent5bda98586b4f81c14a5f3b8feacd10392dc0d078 (diff)
GSM MAP: use TCAP OTID to retrieve SM-RP-OA and SM-RP-DA fields when required
Bug: 13592 Change-Id: Ib8a0ff6d897699c44e5c4b8834123169066cf904 Reviewed-on: https://code.wireshark.org/review/21397 Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-gsm_map.c')
-rw-r--r--epan/dissectors/packet-gsm_map.c622
1 files changed, 387 insertions, 235 deletions
diff --git a/epan/dissectors/packet-gsm_map.c b/epan/dissectors/packet-gsm_map.c
index c46277faa6..08fb11bb23 100644
--- a/epan/dissectors/packet-gsm_map.c
+++ b/epan/dissectors/packet-gsm_map.c
@@ -61,6 +61,7 @@
#include <epan/oids.h>
#include <epan/expert.h>
#include <epan/proto_data.h>
+#include <epan/conversation.h>
#include <wsutil/strtoi.h>
#include <epan/asn1.h>
@@ -84,7 +85,7 @@ void proto_register_gsm_map(void);
void proto_reg_handoff_gsm_map(void);
/* Initialize the protocol and registered fields */
-int proto_gsm_map = -1;
+static int proto_gsm_map = -1;
static int proto_gsm_map_dialogue = -1;
static int proto_gsm_map_ms = -1;
@@ -342,10 +343,10 @@ static int hf_gsm_map_sm_sip_uri_B = -1; /* SIP_URI */
static int hf_gsm_map_sm_imsi_01 = -1; /* T_imsi */
static int hf_gsm_map_sm_lmsi_01 = -1; /* T_lmsi */
static int hf_gsm_map_sm_serviceCentreAddressDA = -1; /* T_serviceCentreAddressDA */
-static int hf_gsm_map_sm_noSM_RP_DA = -1; /* NULL */
+static int hf_gsm_map_sm_noSM_RP_DA = -1; /* T_noSM_RP_DA */
static int hf_gsm_map_sm_msisdn_01 = -1; /* T_msisdn */
static int hf_gsm_map_sm_serviceCentreAddressOA = -1; /* T_serviceCentreAddressOA */
-static int hf_gsm_map_sm_noSM_RP_OA = -1; /* NULL */
+static int hf_gsm_map_sm_noSM_RP_OA = -1; /* T_noSM_RP_OA */
static int hf_gsm_map_sm_absentSubscriberDiagnosticSM = -1; /* AbsentSubscriberDiagnosticSM */
static int hf_gsm_map_sm_deliveryOutcomeIndicator = -1; /* NULL */
static int hf_gsm_map_sm_additionalSM_DeliveryOutcome = -1; /* SM_DeliveryOutcome */
@@ -1727,10 +1728,10 @@ static int hf_gsm_old_moreMessagesToSend = -1; /* NULL */
static int hf_gsm_old_imsi_01 = -1; /* T_imsi */
static int hf_gsm_old_lmsi = -1; /* T_lmsi */
static int hf_gsm_old_serviceCentreAddressDA = -1; /* T_serviceCentreAddressDA */
-static int hf_gsm_old_noSM_RP_DA = -1; /* NULL */
+static int hf_gsm_old_noSM_RP_DA = -1; /* T_noSM_RP_DA */
static int hf_gsm_old_msisdn_01 = -1; /* T_msisdn */
static int hf_gsm_old_serviceCentreAddressOA = -1; /* T_serviceCentreAddressOA */
-static int hf_gsm_old_noSM_RP_OA = -1; /* NULL */
+static int hf_gsm_old_noSM_RP_OA = -1; /* T_noSM_RP_OA */
static int hf_gsm_old_cug_CheckInfo = -1; /* CUG_CheckInfo */
static int hf_gsm_old_numberOfForwarding = -1; /* NumberOfForwarding */
static int hf_gsm_old_networkSignalInfo = -1; /* ExternalSignalInfo */
@@ -1972,7 +1973,7 @@ static int hf_NokiaMAP_Extensions_AccessSubscriptionListExt_item = -1; /* Acces
static int hf_NokiaMAP_Extensions_AllowedServiceData_amr_wb_allowed = -1;
/*--- End of included file: packet-gsm_map-hf.c ---*/
-#line 154 "./asn1/gsm_map/packet-gsm_map-template.c"
+#line 155 "./asn1/gsm_map/packet-gsm_map-template.c"
/* Initialize the subtree pointers */
static gint ett_gsm_map = -1;
@@ -2696,7 +2697,7 @@ static gint ett_NokiaMAP_Extensions_AccessSubscriptionListExt = -1;
static gint ett_NokiaMAP_Extensions_AllowedServiceData = -1;
/*--- End of included file: packet-gsm_map-ett.c ---*/
-#line 186 "./asn1/gsm_map/packet-gsm_map-template.c"
+#line 187 "./asn1/gsm_map/packet-gsm_map-template.c"
static expert_field ei_gsm_map_unknown_sequence3 = EI_INIT;
static expert_field ei_gsm_map_unknown_sequence = EI_INIT;
@@ -2745,15 +2746,75 @@ static int dissect_returnResultData(proto_tree *tree, tvbuff_t *tvb, int offset,
static int dissect_returnErrorData(proto_tree *tree, tvbuff_t *tvb, int offset, asn1_ctx_t *actx);
const gchar* gsm_map_opr_code(guint32 val, proto_item *item);
-static gsm_map_packet_info_t *gsm_map_get_packet_info(packet_info *pinfo)
+typedef struct {
+ struct tcap_private_t * tcap_private;
+ sccp_msg_info_t *sccp_msg_info;
+ tvbuff_t *signal_info_tvb;
+} gsm_map_private_info_t;
+
+typedef struct {
+ wmem_tree_t *packets;
+} gsm_map_conv_info_t;
+
+static gsm_map_packet_info_t *gsm_map_get_packet_info(asn1_ctx_t *actx, gboolean store_conv_info)
{
- gsm_map_packet_info_t *gsm_map_pi = (gsm_map_packet_info_t*)p_get_proto_data(pinfo->pool, pinfo, proto_gsm_map, 0);
- if (gsm_map_pi)
- return gsm_map_pi;
- gsm_map_pi = wmem_new0(pinfo->pool, gsm_map_packet_info_t);
- p_add_proto_data(pinfo->pool, pinfo, proto_gsm_map, 0, gsm_map_pi);
+ gsm_map_packet_info_t *gsm_map_pi = (gsm_map_packet_info_t*)p_get_proto_data(wmem_file_scope(), actx->pinfo, proto_gsm_map, 0);
+ if (!gsm_map_pi) {
+ gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
+ gsm_map_pi = wmem_new0(wmem_file_scope(), gsm_map_packet_info_t);
+ p_add_proto_data(wmem_file_scope(), actx->pinfo, proto_gsm_map, 0, gsm_map_pi);
+ if (store_conv_info && gsm_map_priv && gsm_map_priv->tcap_private) {
+ conversation_t *conversation;
+ gsm_map_conv_info_t *gsm_map_info;
+ wmem_tree_key_t key[3];
+ conversation = find_or_create_conversation(actx->pinfo);
+ gsm_map_info = (gsm_map_conv_info_t *)conversation_get_proto_data(conversation, proto_gsm_map);
+ if (!gsm_map_info) {
+ gsm_map_info = wmem_new(wmem_file_scope(), gsm_map_conv_info_t);
+ gsm_map_info->packets = wmem_tree_new(wmem_file_scope());
+ conversation_add_proto_data(conversation, proto_gsm_map, gsm_map_info);
+ }
+ gsm_map_pi->tcap_src_tid = gsm_map_priv->tcap_private->src_tid;
+ key[0].length = 1;
+ key[0].key = &gsm_map_priv->tcap_private->src_tid;
+ key[1].length = 1;
+ key[1].key = &actx->pinfo->num;
+ key[2].length = 0;
+ key[2].key = NULL;
+ wmem_tree_insert32_array(gsm_map_info->packets, key, (void *)gsm_map_pi);
+ }
+ }
return gsm_map_pi;
}
+
+static gsm_map_packet_info_t *gsm_map_get_matching_tcap_info(asn1_ctx_t *actx)
+{
+ gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
+ if (gsm_map_priv && gsm_map_priv->tcap_private) {
+ conversation_t *conversation;
+ gsm_map_conv_info_t *gsm_map_info;
+ wmem_tree_key_t key[3];
+ gsm_map_packet_info_t *gsm_map_pi;
+ conversation = find_or_create_conversation(actx->pinfo);
+ gsm_map_info = (gsm_map_conv_info_t *)conversation_get_proto_data(conversation, proto_gsm_map);
+ if (!gsm_map_info) {
+ gsm_map_info = wmem_new(wmem_file_scope(), gsm_map_conv_info_t);
+ gsm_map_info->packets = wmem_tree_new(wmem_file_scope());
+ conversation_add_proto_data(conversation, proto_gsm_map, gsm_map_info);
+ }
+ key[0].length = 1;
+ key[0].key = &gsm_map_priv->tcap_private->src_tid;
+ key[1].length = 1;
+ key[1].key = &actx->pinfo->num;
+ key[2].length = 0;
+ key[2].key = NULL;
+ gsm_map_pi = (gsm_map_packet_info_t*)wmem_tree_lookup32_array_le(gsm_map_info->packets, key);
+ if (gsm_map_pi && gsm_map_pi->tcap_src_tid == gsm_map_priv->tcap_private->src_tid)
+ return gsm_map_pi;
+ }
+ return NULL;
+}
+
/* Value strings */
const value_string gsm_map_PDP_Type_Organisation_vals[] = {
@@ -3550,7 +3611,7 @@ dissect_gsm_map_SLR_ArgExtensionContainer(gboolean implicit_tag _U_, tvbuff_t *t
int
dissect_gsm_map_TBCD_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 282 "./asn1/gsm_map/gsm_map.cnf"
+#line 285 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
const char *digit_str;
proto_tree *subtree;
@@ -3608,7 +3669,8 @@ dissect_gsm_map_AddressString(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int
subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_isdn_address_string);
dissect_gsm_map_msisdn(parameter_tvb, actx->pinfo , subtree);
- actx->private_data = tvb_bytes_to_str(actx->pinfo->pool, parameter_tvb, 0, tvb_captured_length(parameter_tvb));
+ if (!PINFO_FD_VISITED(actx->pinfo))
+ actx->private_data = tvb_bytes_to_str(wmem_file_scope(), parameter_tvb, 0, tvb_captured_length(parameter_tvb));
@@ -3665,13 +3727,15 @@ dissect_gsm_map_ProtocolId(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int off
static int
dissect_gsm_map_SignalInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 465 "./asn1/gsm_map/gsm_map.cnf"
- tvbuff_t *parameter_tvb;
+#line 507 "./asn1/gsm_map/gsm_map.cnf"
+ tvbuff_t *parameter_tvb;
+ gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
- offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
+ offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
&parameter_tvb);
- actx->value_ptr = (void*)parameter_tvb;
+ if (gsm_map_priv)
+ gsm_map_priv->signal_info_tvb = parameter_tvb;
@@ -3689,7 +3753,7 @@ static const ber_sequence_t gsm_map_ExternalSignalInfo_sequence[] = {
int
dissect_gsm_map_ExternalSignalInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 893 "./asn1/gsm_map/gsm_map.cnf"
+#line 938 "./asn1/gsm_map/gsm_map.cnf"
/*
-- Information about the internal structure is given in
-- clause 7.6.9.
@@ -3702,12 +3766,14 @@ MAP interfaces
guint8 length;
tvbuff_t *next_tvb;
proto_tree *subtree;
+ gsm_map_private_info_t *gsm_map_priv;
ProtocolId = 0xffffffff;
offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
gsm_map_ExternalSignalInfo_sequence, hf_index, ett_gsm_map_ExternalSignalInfo);
-if (!actx->value_ptr)
+ gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
+ if (!gsm_map_priv || !gsm_map_priv->signal_info_tvb)
return offset;
subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_externalsignalinfo);
switch (ProtocolId){
@@ -3718,56 +3784,54 @@ if (!actx->value_ptr)
* function
*/
/* Get tag */
- octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0);
- proto_tree_add_item(subtree, hf_gsm_map_ie_tag, (tvbuff_t*)actx->value_ptr, 0,1,ENC_BIG_ENDIAN);
+ octet = tvb_get_guint8(gsm_map_priv->signal_info_tvb,0);
+ proto_tree_add_item(subtree, hf_gsm_map_ie_tag, gsm_map_priv->signal_info_tvb, 0,1,ENC_BIG_ENDIAN);
/* get length */
- length = tvb_get_guint8((tvbuff_t*)actx->value_ptr,1);
- proto_tree_add_item(subtree, hf_gsm_map_len, (tvbuff_t*)actx->value_ptr, 1,1,ENC_BIG_ENDIAN);
+ length = tvb_get_guint8(gsm_map_priv->signal_info_tvb,1);
+ proto_tree_add_item(subtree, hf_gsm_map_len, gsm_map_priv->signal_info_tvb, 1,1,ENC_BIG_ENDIAN);
/* Branch on tag */
switch(octet){
case 4:
/* Dissect the data part */
- de_bearer_cap((tvbuff_t*)actx->value_ptr, subtree, actx->pinfo, 2, length, NULL, 0);
+ de_bearer_cap(gsm_map_priv->signal_info_tvb, subtree, actx->pinfo, 2, length, NULL, 0);
/* TODO: There may be more than one IE */
break;
default:
- proto_tree_add_expert(subtree, actx->pinfo, &ei_gsm_map_undecoded, (tvbuff_t*)actx->value_ptr, 0, length);
+ proto_tree_add_expert(subtree, actx->pinfo, &ei_gsm_map_undecoded, gsm_map_priv->signal_info_tvb, 0, length);
break;
}/* switch(octet) */
break;
case 2:
/* gsm-0806 */
- octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0);
+ octet = tvb_get_guint8(gsm_map_priv->signal_info_tvb,0);
/* Discrimination parameter */
- proto_tree_add_item(subtree, hf_gsm_map_disc_par, (tvbuff_t*)actx->value_ptr, 0,1,ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_gsm_map_disc_par, gsm_map_priv->signal_info_tvb, 0,1,ENC_BIG_ENDIAN);
if ( octet == 0) {/* DISCRIMINATION TS 48 006(GSM 08.06 version 5.3.0) */
/* Strip off discrimination and length */
- proto_tree_add_item(subtree, hf_gsm_map_len, (tvbuff_t*)actx->value_ptr, 1,1,ENC_BIG_ENDIAN);
- next_tvb = tvb_new_subset_remaining((tvbuff_t*)actx->value_ptr, 2);
- call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree,
- p_get_proto_data(actx->pinfo->pool, actx->pinfo, proto_gsm_map, actx->pinfo->curr_layer_num));
+ proto_tree_add_item(subtree, hf_gsm_map_len, gsm_map_priv->signal_info_tvb, 1,1,ENC_BIG_ENDIAN);
+ next_tvb = tvb_new_subset_remaining(gsm_map_priv->signal_info_tvb, 2);
+ call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree, gsm_map_priv->sccp_msg_info);
}else if(octet==1){
- proto_tree_add_item(subtree, hf_gsm_map_dlci, (tvbuff_t*)actx->value_ptr, 1,1,ENC_BIG_ENDIAN);
- proto_tree_add_item(subtree, hf_gsm_map_len, (tvbuff_t*)actx->value_ptr, 2,1,ENC_BIG_ENDIAN);
- next_tvb = tvb_new_subset_remaining((tvbuff_t*)actx->value_ptr, 3);
+ proto_tree_add_item(subtree, hf_gsm_map_dlci, gsm_map_priv->signal_info_tvb, 1,1,ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_gsm_map_len, gsm_map_priv->signal_info_tvb, 2,1,ENC_BIG_ENDIAN);
+ next_tvb = tvb_new_subset_remaining(gsm_map_priv->signal_info_tvb, 3);
call_dissector(dtap_handle, next_tvb, actx->pinfo, subtree);
}
break;
case 3:
/* gsm-BSSMAP TODO Is it correct to stripp off two first octets here?*/
- octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0);
+ octet = tvb_get_guint8(gsm_map_priv->signal_info_tvb,0);
if ( octet == 0) {/* DISCRIMINATION TS 48 006 */
- next_tvb = tvb_new_subset_remaining((tvbuff_t*)actx->value_ptr, 2);
- call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree,
- p_get_proto_data(actx->pinfo->pool, actx->pinfo, proto_gsm_map, actx->pinfo->curr_layer_num));
+ next_tvb = tvb_new_subset_remaining(gsm_map_priv->signal_info_tvb, 2);
+ call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree, gsm_map_priv->sccp_msg_info);
}
break;
/* ets-300102-1 (~Q.931 ) */
case 4:
- octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0);
- length = tvb_get_guint8((tvbuff_t*)actx->value_ptr,1);
+ octet = tvb_get_guint8(gsm_map_priv->signal_info_tvb,0);
+ length = tvb_get_guint8(gsm_map_priv->signal_info_tvb,1);
if ( octet == 4 )
- dissect_q931_bearer_capability_ie((tvbuff_t*)actx->value_ptr, 2, length, subtree);
+ dissect_q931_bearer_capability_ie(gsm_map_priv->signal_info_tvb, 2, length, subtree);
break;
default:
break;
@@ -3829,12 +3893,14 @@ dissect_gsm_map_AccessNetworkProtocolId(gboolean implicit_tag _U_, tvbuff_t *tvb
static int
dissect_gsm_map_LongSignalInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 312 "./asn1/gsm_map/gsm_map.cnf"
+#line 315 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
guint8 octet;
tvbuff_t *next_tvb;
proto_tree *subtree;
+ gsm_map_private_info_t *gsm_map_priv;
+ sccp_msg_info_t *sccp_msg_info;
offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
@@ -3844,6 +3910,8 @@ dissect_gsm_map_LongSignalInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int
if (!parameter_tvb)
return offset;
+ gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
+ sccp_msg_info = gsm_map_priv ? gsm_map_priv->sccp_msg_info : NULL;
subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_LongSignalInfo);
switch (AccessNetworkProtocolId){
@@ -3856,8 +3924,7 @@ dissect_gsm_map_LongSignalInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int
/* Strip off discrimination and length */
proto_tree_add_item(subtree, hf_gsm_map_len, parameter_tvb, 1,1,ENC_BIG_ENDIAN);
next_tvb = tvb_new_subset_remaining(parameter_tvb, 2);
- call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree,
- p_get_proto_data(actx->pinfo->pool, actx->pinfo, proto_gsm_map, actx->pinfo->curr_layer_num));
+ call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree, sccp_msg_info);
}else if(octet==1){
proto_tree_add_item(subtree, hf_gsm_map_dlci, parameter_tvb, 1,1,ENC_BIG_ENDIAN);
proto_tree_add_item(subtree, hf_gsm_map_len, parameter_tvb, 2,1,ENC_BIG_ENDIAN);
@@ -3908,7 +3975,7 @@ dissect_gsm_map_AlertingPattern(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, in
int
dissect_gsm_map_GSN_Address(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 716 "./asn1/gsm_map/gsm_map.cnf"
+#line 761 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
guint8 octet;
@@ -3953,8 +4020,9 @@ dissect_gsm_map_Time(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U
int
dissect_gsm_map_IMSI(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 259 "./asn1/gsm_map/gsm_map.cnf"
- tvbuff_t *parameter_tvb;
+#line 260 "./asn1/gsm_map/gsm_map.cnf"
+ tvbuff_t *parameter_tvb;
+ const char *imsi_str;
offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &parameter_tvb);
@@ -3963,11 +4031,12 @@ dissect_gsm_map_IMSI(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U
if(tvb_reported_length(parameter_tvb)==0)
return offset;
- /* Hide the octet string default printout */
- PROTO_ITEM_SET_HIDDEN(actx->created_item);
- actx->private_data = wmem_strdup(actx->pinfo->pool,
- dissect_e212_imsi(parameter_tvb, actx->pinfo, tree,
- 0, tvb_reported_length(parameter_tvb), FALSE));
+ /* Hide the octet string default printout */
+ PROTO_ITEM_SET_HIDDEN(actx->created_item);
+ imsi_str = dissect_e212_imsi(parameter_tvb, actx->pinfo, tree,
+ 0, tvb_reported_length(parameter_tvb), FALSE);
+ if (!PINFO_FD_VISITED(actx->pinfo))
+ actx->private_data = wmem_strdup(wmem_file_scope(), imsi_str);
@@ -3978,13 +4047,13 @@ dissect_gsm_map_IMSI(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U
static int
dissect_gsm_map_LMSI(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 275 "./asn1/gsm_map/gsm_map.cnf"
+#line 278 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
&parameter_tvb);
- if (parameter_tvb) {
- actx->private_data = tvb_bytes_to_str(actx->pinfo->pool, parameter_tvb, 0, tvb_captured_length(parameter_tvb));
+ if (parameter_tvb && !PINFO_FD_VISITED(actx->pinfo)) {
+ actx->private_data = tvb_bytes_to_str(wmem_file_scope(), parameter_tvb, 0, tvb_captured_length(parameter_tvb));
}
@@ -4083,7 +4152,7 @@ dissect_gsm_map_HLR_List(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offse
int
dissect_gsm_map_GlobalCellId(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 975 "./asn1/gsm_map/gsm_map.cnf"
+#line 1020 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
proto_tree *subtree;
@@ -4360,7 +4429,7 @@ dissect_gsm_map_TA_Id(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _
int
dissect_gsm_map_RAIdentity(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 740 "./asn1/gsm_map/gsm_map.cnf"
+#line 785 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
proto_tree *subtree;
@@ -4408,7 +4477,7 @@ dissect_gsm_map_CellGlobalIdOrServiceAreaIdFixedLength(gboolean implicit_tag _U_
int
dissect_gsm_map_LAIFixedLength(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 752 "./asn1/gsm_map/gsm_map.cnf"
+#line 797 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
proto_tree *subtree;
@@ -4534,7 +4603,7 @@ dissect_gsm_map_EMLPP_Info(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int off
static int
dissect_gsm_map_Ext_SS_Status(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 592 "./asn1/gsm_map/gsm_map.cnf"
+#line 637 "./asn1/gsm_map/gsm_map.cnf"
/* Note Ext-SS-Status can have more than one byte */
tvbuff_t *parameter_tvb;
@@ -4667,7 +4736,7 @@ dissect_gsm_map_ss_RegisterSS_Arg(gboolean implicit_tag _U_, tvbuff_t *tvb _U_,
int
dissect_gsm_map_ss_SS_Status(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 572 "./asn1/gsm_map/gsm_map.cnf"
+#line 617 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
guint8 octet;
@@ -4701,7 +4770,7 @@ dissect_gsm_map_ss_ForwardingOptions(gboolean implicit_tag _U_, tvbuff_t *tvb _U
offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
NULL);
-#line 659 "./asn1/gsm_map/gsm_map.cnf"
+#line 704 "./asn1/gsm_map/gsm_map.cnf"
proto_tree_add_item(tree, hf_gsm_map_notification_to_forwarding_party, tvb, 0,1,ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_gsm_map_redirecting_presentation, tvb, 0,1,ENC_BIG_ENDIAN);
@@ -5020,7 +5089,7 @@ dissect_gsm_map_ss_InterrogateSS_Res(gboolean implicit_tag _U_, tvbuff_t *tvb _U
int
dissect_gsm_map_ss_USSD_DataCodingScheme(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 615 "./asn1/gsm_map/gsm_map.cnf"
+#line 660 "./asn1/gsm_map/gsm_map.cnf"
/*The structure of the USSD-DataCodingScheme is defined by
* the Cell Broadcast Data Coding Scheme as described in
* TS 3GPP TS 23.038
@@ -5046,7 +5115,7 @@ dissect_gsm_map_ss_USSD_DataCodingScheme(gboolean implicit_tag _U_, tvbuff_t *tv
int
dissect_gsm_map_ss_USSD_String(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 630 "./asn1/gsm_map/gsm_map.cnf"
+#line 675 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
guint length;
@@ -5497,19 +5566,20 @@ static const ber_sequence_t gsm_map_er_SM_DeliveryFailureCause_sequence[] = {
static int
dissect_gsm_map_er_SM_DeliveryFailureCause(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 472 "./asn1/gsm_map/gsm_map.cnf"
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+#line 516 "./asn1/gsm_map/gsm_map.cnf"
+ /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
guint8 oct;
+ gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
gsm_map_er_SM_DeliveryFailureCause_sequence, hf_index, ett_gsm_map_er_SM_DeliveryFailureCause);
- if (!actx->value_ptr)
+ if (!gsm_map_priv || !gsm_map_priv->signal_info_tvb)
return offset;
/* Detailed diagnostic information contains either a SMS-SUBMIT-REPORT or a SMS-DELIVERY-REPORT */
- oct = tvb_get_guint8((tvbuff_t*)actx->value_ptr, 0);
+ oct = tvb_get_guint8(gsm_map_priv->signal_info_tvb, 0);
actx->pinfo->p2p_dir = ((oct & 0x03) == 0) ? P2P_DIR_RECV : P2P_DIR_SENT;
- call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL);
+ call_dissector_only(gsm_sms_handle, gsm_map_priv->signal_info_tvb, actx->pinfo, top_tree, NULL);
@@ -6430,15 +6500,15 @@ dissect_gsm_map_sm_RoutingInfoForSM_Res(gboolean implicit_tag _U_, tvbuff_t *tvb
static int
dissect_gsm_map_sm_T_imsi(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 400 "./asn1/gsm_map/gsm_map.cnf"
+#line 406 "./asn1/gsm_map/gsm_map.cnf"
actx->private_data = NULL;
actx->pinfo->p2p_dir = P2P_DIR_SENT;
offset = dissect_gsm_map_IMSI(implicit_tag, tvb, offset, actx, tree, hf_index);
if (actx->private_data) {
- gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx->pinfo);
- gsm_map_pi->rp_da_id = GSM_MAP_RP_DA_IMSI;
- gsm_map_pi->rp_da_str = (const gchar*)actx->private_data;
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, TRUE);
+ gsm_map_pi->sm_rp_da_id = GSM_MAP_SM_RP_DA_IMSI;
+ gsm_map_pi->sm_rp_da_str = (const gchar*)actx->private_data;
actx->private_data = NULL;
}
@@ -6451,15 +6521,15 @@ dissect_gsm_map_sm_T_imsi(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offs
static int
dissect_gsm_map_sm_T_lmsi(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 411 "./asn1/gsm_map/gsm_map.cnf"
+#line 417 "./asn1/gsm_map/gsm_map.cnf"
actx->private_data = NULL;
actx->pinfo->p2p_dir = P2P_DIR_SENT;
offset = dissect_gsm_map_LMSI(implicit_tag, tvb, offset, actx, tree, hf_index);
if (actx->private_data) {
- gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx->pinfo);
- gsm_map_pi->rp_da_id = GSM_MAP_RP_DA_LMSI;
- gsm_map_pi->rp_da_str = (const gchar*)actx->private_data;
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, TRUE);
+ gsm_map_pi->sm_rp_da_id = GSM_MAP_SM_RP_DA_LMSI;
+ gsm_map_pi->sm_rp_da_str = (const gchar*)actx->private_data;
actx->private_data = NULL;
}
@@ -6472,15 +6542,15 @@ dissect_gsm_map_sm_T_lmsi(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offs
static int
dissect_gsm_map_sm_T_serviceCentreAddressDA(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 454 "./asn1/gsm_map/gsm_map.cnf"
+#line 460 "./asn1/gsm_map/gsm_map.cnf"
actx->private_data = NULL;
actx->pinfo->p2p_dir = P2P_DIR_RECV;
offset = dissect_gsm_map_AddressString(implicit_tag, tvb, offset, actx, tree, hf_index);
if (actx->private_data) {
- gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx->pinfo);
- gsm_map_pi->rp_da_id = GSM_MAP_RP_DA_SERVICE_CENTER_ADDRESS;
- gsm_map_pi->rp_da_str = (const gchar*)actx->private_data;
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, TRUE);
+ gsm_map_pi->sm_rp_da_id = GSM_MAP_SM_RP_DA_SERVICE_CENTER_ADDRESS;
+ gsm_map_pi->sm_rp_da_str = (const gchar*)actx->private_data;
actx->private_data = NULL;
}
@@ -6490,6 +6560,25 @@ dissect_gsm_map_sm_T_serviceCentreAddressDA(gboolean implicit_tag _U_, tvbuff_t
}
+
+static int
+dissect_gsm_map_sm_T_noSM_RP_DA(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 498 "./asn1/gsm_map/gsm_map.cnf"
+ gsm_map_packet_info_t *prev_packet_info = gsm_map_get_matching_tcap_info(actx);
+ offset = dissect_ber_null(implicit_tag, actx, tree, tvb, offset, hf_index);
+
+ if (prev_packet_info && !PINFO_FD_VISITED(actx->pinfo)) {
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, FALSE);
+ gsm_map_pi->sm_rp_da_id = prev_packet_info->sm_rp_da_id;
+ gsm_map_pi->sm_rp_da_str = wmem_strdup(wmem_file_scope(), prev_packet_info->sm_rp_da_str);
+ }
+
+
+
+ return offset;
+}
+
+
const value_string gsm_map_sm_SM_RP_DA_vals[] = {
{ 0, "imsi" },
{ 1, "lmsi" },
@@ -6502,7 +6591,7 @@ static const ber_choice_t gsm_map_sm_SM_RP_DA_choice[] = {
{ 0, &hf_gsm_map_sm_imsi_01 , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_gsm_map_sm_T_imsi },
{ 1, &hf_gsm_map_sm_lmsi_01 , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_gsm_map_sm_T_lmsi },
{ 4, &hf_gsm_map_sm_serviceCentreAddressDA, BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_gsm_map_sm_T_serviceCentreAddressDA },
- { 5, &hf_gsm_map_sm_noSM_RP_DA, BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_gsm_map_sm_NULL },
+ { 5, &hf_gsm_map_sm_noSM_RP_DA, BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_gsm_map_sm_T_noSM_RP_DA },
{ 0, NULL, 0, 0, 0, NULL }
};
@@ -6519,14 +6608,14 @@ dissect_gsm_map_sm_SM_RP_DA(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int of
static int
dissect_gsm_map_sm_T_msisdn(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 433 "./asn1/gsm_map/gsm_map.cnf"
+#line 439 "./asn1/gsm_map/gsm_map.cnf"
actx->pinfo->p2p_dir = P2P_DIR_RECV;
offset = dissect_gsm_map_ISDN_AddressString(implicit_tag, tvb, offset, actx, tree, hf_index);
if (actx->private_data) {
- gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx->pinfo);
- gsm_map_pi->rp_oa_id = GSM_MAP_RP_OA_MSISDN;
- gsm_map_pi->rp_oa_str = (const gchar*)actx->private_data;
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, TRUE);
+ gsm_map_pi->sm_rp_oa_id = GSM_MAP_SM_RP_OA_MSISDN;
+ gsm_map_pi->sm_rp_oa_str = (const gchar*)actx->private_data;
actx->private_data = NULL;
}
@@ -6539,15 +6628,15 @@ dissect_gsm_map_sm_T_msisdn(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int of
static int
dissect_gsm_map_sm_T_serviceCentreAddressOA(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 367 "./asn1/gsm_map/gsm_map.cnf"
+#line 373 "./asn1/gsm_map/gsm_map.cnf"
actx->private_data = NULL;
actx->pinfo->p2p_dir = P2P_DIR_SENT;
offset = dissect_gsm_map_AddressString(implicit_tag, tvb, offset, actx, tree, hf_index);
if (actx->private_data) {
- gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx->pinfo);
- gsm_map_pi->rp_oa_id = GSM_MAP_RP_OA_SERVICE_CENTER_ADDRESS;
- gsm_map_pi->rp_oa_str = (const gchar*)actx->private_data;
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, TRUE);
+ gsm_map_pi->sm_rp_oa_id = GSM_MAP_SM_RP_OA_SERVICE_CENTER_ADDRESS;
+ gsm_map_pi->sm_rp_oa_str = (const gchar*)actx->private_data;
actx->private_data = NULL;
}
@@ -6557,6 +6646,25 @@ dissect_gsm_map_sm_T_serviceCentreAddressOA(gboolean implicit_tag _U_, tvbuff_t
}
+
+static int
+dissect_gsm_map_sm_T_noSM_RP_OA(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 480 "./asn1/gsm_map/gsm_map.cnf"
+ gsm_map_packet_info_t *prev_packet_info = gsm_map_get_matching_tcap_info(actx);
+ offset = dissect_ber_null(implicit_tag, actx, tree, tvb, offset, hf_index);
+
+ if (prev_packet_info && !PINFO_FD_VISITED(actx->pinfo)) {
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, FALSE);
+ gsm_map_pi->sm_rp_oa_id = prev_packet_info->sm_rp_oa_id;
+ gsm_map_pi->sm_rp_oa_str = wmem_strdup(wmem_file_scope(), prev_packet_info->sm_rp_oa_str);
+ }
+
+
+
+ return offset;
+}
+
+
const value_string gsm_map_sm_SM_RP_OA_vals[] = {
{ 2, "msisdn" },
{ 4, "serviceCentreAddressOA" },
@@ -6567,7 +6675,7 @@ const value_string gsm_map_sm_SM_RP_OA_vals[] = {
static const ber_choice_t gsm_map_sm_SM_RP_OA_choice[] = {
{ 2, &hf_gsm_map_sm_msisdn_01, BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_gsm_map_sm_T_msisdn },
{ 4, &hf_gsm_map_sm_serviceCentreAddressOA, BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_gsm_map_sm_T_serviceCentreAddressOA },
- { 5, &hf_gsm_map_sm_noSM_RP_OA, BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_gsm_map_sm_NULL },
+ { 5, &hf_gsm_map_sm_noSM_RP_OA, BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_gsm_map_sm_T_noSM_RP_OA },
{ 0, NULL, 0, 0, 0, NULL }
};
@@ -6611,19 +6719,19 @@ static const ber_sequence_t gsm_map_sm_MO_ForwardSM_Arg_sequence[] = {
static int
dissect_gsm_map_sm_MO_ForwardSM_Arg(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 500 "./asn1/gsm_map/gsm_map.cnf"
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+#line 545 "./asn1/gsm_map/gsm_map.cnf"
+ /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
gsm_map_sm_MO_ForwardSM_Arg_sequence, hf_index, ett_gsm_map_sm_MO_ForwardSM_Arg);
- if (!actx->value_ptr)
- return offset;
- if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
- actx->pinfo->p2p_dir = P2P_DIR_RECV;
- }
- call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL);
+ if (!gsm_map_priv || !gsm_map_priv->signal_info_tvb)
+ return offset;
+ if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
+ actx->pinfo->p2p_dir = P2P_DIR_RECV;
+ }
+ call_dissector_only(gsm_sms_handle, gsm_map_priv->signal_info_tvb, actx->pinfo, top_tree, NULL);
@@ -6639,19 +6747,19 @@ static const ber_sequence_t gsm_map_sm_MO_ForwardSM_Res_sequence[] = {
static int
dissect_gsm_map_sm_MO_ForwardSM_Res(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 512 "./asn1/gsm_map/gsm_map.cnf"
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+#line 557 "./asn1/gsm_map/gsm_map.cnf"
+ /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
gsm_map_sm_MO_ForwardSM_Res_sequence, hf_index, ett_gsm_map_sm_MO_ForwardSM_Res);
- if (!actx->value_ptr)
- return offset;
- if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
- actx->pinfo->p2p_dir = P2P_DIR_SENT;
- }
- call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL);
+ if (!gsm_map_priv || !gsm_map_priv->signal_info_tvb)
+ return offset;
+ if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
+ actx->pinfo->p2p_dir = P2P_DIR_SENT;
+ }
+ call_dissector_only(gsm_sms_handle, gsm_map_priv->signal_info_tvb, actx->pinfo, top_tree, NULL);
@@ -6677,19 +6785,19 @@ static const ber_sequence_t gsm_map_sm_MT_ForwardSM_Arg_sequence[] = {
static int
dissect_gsm_map_sm_MT_ForwardSM_Arg(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 524 "./asn1/gsm_map/gsm_map.cnf"
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+#line 569 "./asn1/gsm_map/gsm_map.cnf"
+ /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
gsm_map_sm_MT_ForwardSM_Arg_sequence, hf_index, ett_gsm_map_sm_MT_ForwardSM_Arg);
- if (!actx->value_ptr)
- return offset;
- if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
- actx->pinfo->p2p_dir = P2P_DIR_SENT;
- }
- call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL);
+ if (!gsm_map_priv || !gsm_map_priv->signal_info_tvb)
+ return offset;
+ if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
+ actx->pinfo->p2p_dir = P2P_DIR_SENT;
+ }
+ call_dissector_only(gsm_sms_handle, gsm_map_priv->signal_info_tvb, actx->pinfo, top_tree, NULL);
@@ -6705,19 +6813,19 @@ static const ber_sequence_t gsm_map_sm_MT_ForwardSM_Res_sequence[] = {
static int
dissect_gsm_map_sm_MT_ForwardSM_Res(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 536 "./asn1/gsm_map/gsm_map.cnf"
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+#line 581 "./asn1/gsm_map/gsm_map.cnf"
+ /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
gsm_map_sm_MT_ForwardSM_Res_sequence, hf_index, ett_gsm_map_sm_MT_ForwardSM_Res);
- if (!actx->value_ptr)
- return offset;
- if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
- actx->pinfo->p2p_dir = P2P_DIR_RECV;
- }
- call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL);
+ if (!gsm_map_priv || !gsm_map_priv->signal_info_tvb)
+ return offset;
+ if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
+ actx->pinfo->p2p_dir = P2P_DIR_RECV;
+ }
+ call_dissector_only(gsm_sms_handle, gsm_map_priv->signal_info_tvb, actx->pinfo, top_tree, NULL);
@@ -6904,19 +7012,19 @@ static const ber_sequence_t gsm_map_sm_MT_ForwardSM_VGCS_Arg_sequence[] = {
static int
dissect_gsm_map_sm_MT_ForwardSM_VGCS_Arg(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 548 "./asn1/gsm_map/gsm_map.cnf"
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+#line 593 "./asn1/gsm_map/gsm_map.cnf"
+ /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
gsm_map_sm_MT_ForwardSM_VGCS_Arg_sequence, hf_index, ett_gsm_map_sm_MT_ForwardSM_VGCS_Arg);
- if (!actx->value_ptr)
- return offset;
- if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
- actx->pinfo->p2p_dir = P2P_DIR_SENT;
- }
- call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL);
+ if (!gsm_map_priv || !gsm_map_priv->signal_info_tvb)
+ return offset;
+ if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
+ actx->pinfo->p2p_dir = P2P_DIR_SENT;
+ }
+ call_dissector_only(gsm_sms_handle, gsm_map_priv->signal_info_tvb, actx->pinfo, top_tree, NULL);
@@ -6961,19 +7069,19 @@ static const ber_sequence_t gsm_map_sm_MT_ForwardSM_VGCS_Res_sequence[] = {
static int
dissect_gsm_map_sm_MT_ForwardSM_VGCS_Res(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 560 "./asn1/gsm_map/gsm_map.cnf"
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+#line 605 "./asn1/gsm_map/gsm_map.cnf"
+ /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
gsm_map_sm_MT_ForwardSM_VGCS_Res_sequence, hf_index, ett_gsm_map_sm_MT_ForwardSM_VGCS_Res);
- if (!actx->value_ptr)
- return offset;
- if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
- actx->pinfo->p2p_dir = P2P_DIR_RECV;
- }
- call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL);
+ if (!gsm_map_priv || !gsm_map_priv->signal_info_tvb)
+ return offset;
+ if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
+ actx->pinfo->p2p_dir = P2P_DIR_RECV;
+ }
+ call_dissector_only(gsm_sms_handle, gsm_map_priv->signal_info_tvb, actx->pinfo, top_tree, NULL);
@@ -8356,7 +8464,7 @@ dissect_gsm_map_ms_GeographicalInformation(gboolean implicit_tag _U_, tvbuff_t *
static int
dissect_gsm_map_ms_LocationNumber(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1036 "./asn1/gsm_map/gsm_map.cnf"
+#line 1081 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
proto_tree *subtree;
const char *digit_str;
@@ -9046,7 +9154,7 @@ dissect_gsm_map_ms_SGSN_Capability(gboolean implicit_tag _U_, tvbuff_t *tvb _U_,
static int
dissect_gsm_map_ms_APN(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1009 "./asn1/gsm_map/gsm_map.cnf"
+#line 1054 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
proto_tree *subtree;
int length, name_len, tmp;
@@ -9312,7 +9420,7 @@ dissect_gsm_map_ms_UpdateGprsLocationRes(gboolean implicit_tag _U_, tvbuff_t *tv
static int
dissect_gsm_map_ms_IntegrityProtectionInformation(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 788 "./asn1/gsm_map/gsm_map.cnf"
+#line 833 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
asn1_ctx_t asn1_ctx;
@@ -9335,7 +9443,7 @@ dissect_gsm_map_ms_IntegrityProtectionInformation(gboolean implicit_tag _U_, tvb
static int
dissect_gsm_map_ms_EncryptionInformation(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 800 "./asn1/gsm_map/gsm_map.cnf"
+#line 845 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
asn1_ctx_t asn1_ctx;
@@ -9420,7 +9528,7 @@ dissect_gsm_map_ms_AllowedUMTS_Algorithms(gboolean implicit_tag _U_, tvbuff_t *t
static int
dissect_gsm_map_ms_RadioResourceInformation(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 764 "./asn1/gsm_map/gsm_map.cnf"
+#line 809 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
proto_tree *subtree;
@@ -9491,7 +9599,7 @@ dissect_gsm_map_ms_BSSMAP_ServiceHandover(gboolean implicit_tag _U_, tvbuff_t *t
static int
dissect_gsm_map_ms_RANAP_ServiceHandover(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 776 "./asn1/gsm_map/gsm_map.cnf"
+#line 821 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
asn1_ctx_t asn1_ctx;
@@ -10440,7 +10548,7 @@ static int
dissect_gsm_map_ms_T_forwardingOptions(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
offset = dissect_gsm_map_ms_Ext_ForwOptions(implicit_tag, tvb, offset, actx, tree, hf_index);
-#line 665 "./asn1/gsm_map/gsm_map.cnf"
+#line 710 "./asn1/gsm_map/gsm_map.cnf"
proto_tree_add_item(tree, hf_gsm_map_notification_to_forwarding_party, tvb, 0,1,ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_gsm_map_redirecting_presentation, tvb, 0,1,ENC_BIG_ENDIAN);
@@ -11603,7 +11711,7 @@ dissect_gsm_map_ms_VlrCamelSubscriptionInfo(gboolean implicit_tag _U_, tvbuff_t
static int
dissect_gsm_map_ms_PDP_Type(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 673 "./asn1/gsm_map/gsm_map.cnf"
+#line 718 "./asn1/gsm_map/gsm_map.cnf"
guint8 pdp_type_org;
tvbuff_t *parameter_tvb;
@@ -11636,7 +11744,7 @@ dissect_gsm_map_ms_PDP_Type(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int of
int
dissect_gsm_map_ms_QoS_Subscribed(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 695 "./asn1/gsm_map/gsm_map.cnf"
+#line 740 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
@@ -11658,7 +11766,7 @@ dissect_gsm_map_ms_QoS_Subscribed(gboolean implicit_tag _U_, tvbuff_t *tvb _U_,
int
dissect_gsm_map_ms_Ext_QoS_Subscribed(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 706 "./asn1/gsm_map/gsm_map.cnf"
+#line 751 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
@@ -16096,7 +16204,7 @@ dissect_gsm_map_lcs_ProvideSubscriberLocation_Arg(gboolean implicit_tag _U_, tvb
int
dissect_gsm_map_lcs_Ext_GeographicalInformation(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 987 "./asn1/gsm_map/gsm_map.cnf"
+#line 1032 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
proto_tree *subtree;
@@ -17565,7 +17673,7 @@ static const ber_sequence_t gsm_old_Bss_APDU_sequence[] = {
static int
dissect_gsm_old_Bss_APDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 813 "./asn1/gsm_map/gsm_map.cnf"
+#line 858 "./asn1/gsm_map/gsm_map.cnf"
guint8 octet;
guint8 length;
tvbuff_t *next_tvb;
@@ -17578,10 +17686,12 @@ and GSM 09.10. The Protocol ID indicates that the message or messages are accord
For the coding of the messages see GSM 08.06 and GSM 08.08.
*/
ProtocolId = 0xffffffff;
+ gsm_map_private_info_t *gsm_map_priv;
offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
gsm_old_Bss_APDU_sequence, hf_index, ett_gsm_old_Bss_APDU);
-if (!actx->value_ptr)
+ gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
+if (!gsm_map_priv || !gsm_map_priv->signal_info_tvb)
return offset;
subtree = proto_item_add_subtree(actx->created_item, ett_gsm_map_externalsignalinfo);
switch (ProtocolId){
@@ -17592,56 +17702,54 @@ if (!actx->value_ptr)
* function
*/
/* Get tag */
- octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0);
- proto_tree_add_item(subtree, hf_gsm_map_ie_tag, (tvbuff_t*)actx->value_ptr, 0,1,ENC_BIG_ENDIAN);
+ octet = tvb_get_guint8(gsm_map_priv->signal_info_tvb,0);
+ proto_tree_add_item(subtree, hf_gsm_map_ie_tag, gsm_map_priv->signal_info_tvb, 0,1,ENC_BIG_ENDIAN);
/* get length */
- length = tvb_get_guint8((tvbuff_t*)actx->value_ptr,1);
- proto_tree_add_item(subtree, hf_gsm_map_len, (tvbuff_t*)actx->value_ptr, 1,1,ENC_BIG_ENDIAN);
+ length = tvb_get_guint8(gsm_map_priv->signal_info_tvb,1);
+ proto_tree_add_item(subtree, hf_gsm_map_len, gsm_map_priv->signal_info_tvb, 1,1,ENC_BIG_ENDIAN);
/* Branch on tag */
switch(octet){
case 4:
/* Dissect the data part */
- de_bearer_cap((tvbuff_t*)actx->value_ptr, subtree, actx->pinfo, 2, length, NULL, 0);
+ de_bearer_cap(gsm_map_priv->signal_info_tvb, subtree, actx->pinfo, 2, length, NULL, 0);
/* TODO: There may be more than one IE */
break;
default:
- proto_tree_add_expert(subtree, actx->pinfo, &ei_gsm_map_undecoded, (tvbuff_t*)actx->value_ptr, 0, length);
+ proto_tree_add_expert(subtree, actx->pinfo, &ei_gsm_map_undecoded, gsm_map_priv->signal_info_tvb, 0, length);
break;
}/* switch(octet) */
break;
case 2:
/* gsm-0806 */
- octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0);
+ octet = tvb_get_guint8(gsm_map_priv->signal_info_tvb,0);
/* Discrimination parameter */
- proto_tree_add_item(subtree, hf_gsm_map_disc_par, (tvbuff_t*)actx->value_ptr, 0,1,ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_gsm_map_disc_par, gsm_map_priv->signal_info_tvb, 0,1,ENC_BIG_ENDIAN);
if ( octet == 0) {/* DISCRIMINATION TS 48 006(GSM 08.06 version 5.3.0) */
/* Strip off discrimination and length */
- proto_tree_add_item(subtree, hf_gsm_map_len, (tvbuff_t*)actx->value_ptr, 1,1,ENC_BIG_ENDIAN);
- next_tvb = tvb_new_subset_remaining((tvbuff_t*)actx->value_ptr, 2);
- call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree,
- p_get_proto_data(actx->pinfo->pool, actx->pinfo, proto_gsm_map, actx->pinfo->curr_layer_num));
+ proto_tree_add_item(subtree, hf_gsm_map_len, gsm_map_priv->signal_info_tvb, 1,1,ENC_BIG_ENDIAN);
+ next_tvb = tvb_new_subset_remaining(gsm_map_priv->signal_info_tvb, 2);
+ call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree, gsm_map_priv->sccp_msg_info);
}else if(octet==1){
- proto_tree_add_item(subtree, hf_gsm_map_dlci, (tvbuff_t*)actx->value_ptr, 1,1,ENC_BIG_ENDIAN);
- proto_tree_add_item(subtree, hf_gsm_map_len, (tvbuff_t*)actx->value_ptr, 2,1,ENC_BIG_ENDIAN);
- next_tvb = tvb_new_subset_remaining((tvbuff_t*)actx->value_ptr, 3);
+ proto_tree_add_item(subtree, hf_gsm_map_dlci, gsm_map_priv->signal_info_tvb, 1,1,ENC_BIG_ENDIAN);
+ proto_tree_add_item(subtree, hf_gsm_map_len, gsm_map_priv->signal_info_tvb, 2,1,ENC_BIG_ENDIAN);
+ next_tvb = tvb_new_subset_remaining(gsm_map_priv->signal_info_tvb, 3);
call_dissector(dtap_handle, next_tvb, actx->pinfo, subtree);
}
break;
case 3:
/* gsm-BSSMAP -- Value 3 is reserved and must not be used*/
- octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0);
+ octet = tvb_get_guint8(gsm_map_priv->signal_info_tvb,0);
if ( octet == 0) {/* DISCRIMINATION TS 48 006 */
- next_tvb = tvb_new_subset_remaining((tvbuff_t*)actx->value_ptr, 2);
- call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree,
- p_get_proto_data(actx->pinfo->pool, actx->pinfo, proto_gsm_map, actx->pinfo->curr_layer_num));
+ next_tvb = tvb_new_subset_remaining(gsm_map_priv->signal_info_tvb, 2);
+ call_dissector_with_data(bssap_handle, next_tvb, actx->pinfo, subtree, gsm_map_priv->sccp_msg_info);
}
break;
/* ets-300102-1 (~Q.931 ) */
case 4:
- octet = tvb_get_guint8((tvbuff_t*)actx->value_ptr,0);
- length = tvb_get_guint8((tvbuff_t*)actx->value_ptr,1);
+ octet = tvb_get_guint8(gsm_map_priv->signal_info_tvb,0);
+ length = tvb_get_guint8(gsm_map_priv->signal_info_tvb,1);
if ( octet == 4 )
- dissect_q931_bearer_capability_ie((tvbuff_t*)actx->value_ptr, 2, length, subtree);
+ dissect_q931_bearer_capability_ie(gsm_map_priv->signal_info_tvb, 2, length, subtree);
break;
default:
break;
@@ -18150,15 +18258,15 @@ dissect_gsm_old_PlmnContainer(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int
static int
dissect_gsm_old_T_imsi(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 378 "./asn1/gsm_map/gsm_map.cnf"
+#line 384 "./asn1/gsm_map/gsm_map.cnf"
actx->private_data = NULL;
actx->pinfo->p2p_dir = P2P_DIR_SENT;
offset = dissect_gsm_map_IMSI(implicit_tag, tvb, offset, actx, tree, hf_index);
if (actx->private_data) {
- gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx->pinfo);
- gsm_map_pi->rp_da_id = GSM_MAP_RP_DA_IMSI;
- gsm_map_pi->rp_da_str = (const gchar*)actx->private_data;
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, TRUE);
+ gsm_map_pi->sm_rp_da_id = GSM_MAP_SM_RP_DA_IMSI;
+ gsm_map_pi->sm_rp_da_str = (const gchar*)actx->private_data;
actx->private_data = NULL;
}
@@ -18171,15 +18279,15 @@ dissect_gsm_old_T_imsi(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset
static int
dissect_gsm_old_T_lmsi(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 389 "./asn1/gsm_map/gsm_map.cnf"
+#line 395 "./asn1/gsm_map/gsm_map.cnf"
actx->private_data = NULL;
actx->pinfo->p2p_dir = P2P_DIR_SENT;
offset = dissect_gsm_map_LMSI(implicit_tag, tvb, offset, actx, tree, hf_index);
if (actx->private_data) {
- gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx->pinfo);
- gsm_map_pi->rp_da_id = GSM_MAP_RP_DA_LMSI;
- gsm_map_pi->rp_da_str = (const gchar*)actx->private_data;
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, TRUE);
+ gsm_map_pi->sm_rp_da_id = GSM_MAP_SM_RP_DA_LMSI;
+ gsm_map_pi->sm_rp_da_str = (const gchar*)actx->private_data;
actx->private_data = NULL;
}
@@ -18192,15 +18300,15 @@ dissect_gsm_old_T_lmsi(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset
static int
dissect_gsm_old_T_serviceCentreAddressDA(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 443 "./asn1/gsm_map/gsm_map.cnf"
+#line 449 "./asn1/gsm_map/gsm_map.cnf"
actx->private_data = NULL;
actx->pinfo->p2p_dir = P2P_DIR_RECV;
offset = dissect_gsm_map_AddressString(implicit_tag, tvb, offset, actx, tree, hf_index);
if (actx->private_data) {
- gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx->pinfo);
- gsm_map_pi->rp_da_id = GSM_MAP_RP_DA_SERVICE_CENTER_ADDRESS;
- gsm_map_pi->rp_da_str = (const gchar*)actx->private_data;
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, TRUE);
+ gsm_map_pi->sm_rp_da_id = GSM_MAP_SM_RP_DA_SERVICE_CENTER_ADDRESS;
+ gsm_map_pi->sm_rp_da_str = (const gchar*)actx->private_data;
actx->private_data = NULL;
}
@@ -18210,6 +18318,25 @@ dissect_gsm_old_T_serviceCentreAddressDA(gboolean implicit_tag _U_, tvbuff_t *tv
}
+
+static int
+dissect_gsm_old_T_noSM_RP_DA(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 489 "./asn1/gsm_map/gsm_map.cnf"
+ gsm_map_packet_info_t *prev_packet_info = gsm_map_get_matching_tcap_info(actx);
+ offset = dissect_ber_null(implicit_tag, actx, tree, tvb, offset, hf_index);
+
+ if (prev_packet_info && !PINFO_FD_VISITED(actx->pinfo)) {
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, FALSE);
+ gsm_map_pi->sm_rp_da_id = prev_packet_info->sm_rp_da_id;
+ gsm_map_pi->sm_rp_da_str = wmem_strdup(wmem_file_scope(), prev_packet_info->sm_rp_da_str);
+ }
+
+
+
+ return offset;
+}
+
+
static const value_string gsm_old_SM_RP_DAold_vals[] = {
{ 0, "imsi" },
{ 1, "lmsi" },
@@ -18222,7 +18349,7 @@ static const ber_choice_t gsm_old_SM_RP_DAold_choice[] = {
{ 0, &hf_gsm_old_imsi_01 , BER_CLASS_CON, 0, BER_FLAGS_IMPLTAG, dissect_gsm_old_T_imsi },
{ 1, &hf_gsm_old_lmsi , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_gsm_old_T_lmsi },
{ 4, &hf_gsm_old_serviceCentreAddressDA, BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_gsm_old_T_serviceCentreAddressDA },
- { 5, &hf_gsm_old_noSM_RP_DA , BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_gsm_old_NULL },
+ { 5, &hf_gsm_old_noSM_RP_DA , BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_gsm_old_T_noSM_RP_DA },
{ 0, NULL, 0, 0, 0, NULL }
};
@@ -18239,15 +18366,15 @@ dissect_gsm_old_SM_RP_DAold(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int of
static int
dissect_gsm_old_T_msisdn(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 422 "./asn1/gsm_map/gsm_map.cnf"
+#line 428 "./asn1/gsm_map/gsm_map.cnf"
actx->private_data = NULL;
actx->pinfo->p2p_dir = P2P_DIR_RECV;
offset = dissect_gsm_map_ISDN_AddressString(implicit_tag, tvb, offset, actx, tree, hf_index);
if (actx->private_data) {
- gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx->pinfo);
- gsm_map_pi->rp_oa_id = GSM_MAP_RP_OA_MSISDN;
- gsm_map_pi->rp_oa_str = (const gchar*)actx->private_data;
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, TRUE);
+ gsm_map_pi->sm_rp_oa_id = GSM_MAP_SM_RP_OA_MSISDN;
+ gsm_map_pi->sm_rp_oa_str = (const gchar*)actx->private_data;
actx->private_data = NULL;
}
@@ -18260,15 +18387,15 @@ dissect_gsm_old_T_msisdn(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offse
static int
dissect_gsm_old_T_serviceCentreAddressOA(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 356 "./asn1/gsm_map/gsm_map.cnf"
+#line 362 "./asn1/gsm_map/gsm_map.cnf"
actx->private_data = NULL;
actx->pinfo->p2p_dir = P2P_DIR_SENT;
offset = dissect_gsm_map_AddressString(implicit_tag, tvb, offset, actx, tree, hf_index);
if (actx->private_data) {
- gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx->pinfo);
- gsm_map_pi->rp_oa_id = GSM_MAP_RP_OA_SERVICE_CENTER_ADDRESS;
- gsm_map_pi->rp_oa_str = (const gchar*)actx->private_data;
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, TRUE);
+ gsm_map_pi->sm_rp_oa_id = GSM_MAP_SM_RP_OA_SERVICE_CENTER_ADDRESS;
+ gsm_map_pi->sm_rp_oa_str = (const gchar*)actx->private_data;
actx->private_data = NULL;
}
@@ -18278,6 +18405,25 @@ dissect_gsm_old_T_serviceCentreAddressOA(gboolean implicit_tag _U_, tvbuff_t *tv
}
+
+static int
+dissect_gsm_old_T_noSM_RP_OA(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
+#line 471 "./asn1/gsm_map/gsm_map.cnf"
+ gsm_map_packet_info_t *prev_packet_info = gsm_map_get_matching_tcap_info(actx);
+ offset = dissect_ber_null(implicit_tag, actx, tree, tvb, offset, hf_index);
+
+ if (prev_packet_info && !PINFO_FD_VISITED(actx->pinfo)) {
+ gsm_map_packet_info_t *gsm_map_pi = gsm_map_get_packet_info(actx, FALSE);
+ gsm_map_pi->sm_rp_oa_id = prev_packet_info->sm_rp_oa_id;
+ gsm_map_pi->sm_rp_oa_str = wmem_strdup(wmem_file_scope(), prev_packet_info->sm_rp_oa_str);
+ }
+
+
+
+ return offset;
+}
+
+
static const value_string gsm_old_SM_RP_OAold_vals[] = {
{ 2, "msisdn" },
{ 4, "serviceCentreAddressOA" },
@@ -18288,7 +18434,7 @@ static const value_string gsm_old_SM_RP_OAold_vals[] = {
static const ber_choice_t gsm_old_SM_RP_OAold_choice[] = {
{ 2, &hf_gsm_old_msisdn_01 , BER_CLASS_CON, 2, BER_FLAGS_IMPLTAG, dissect_gsm_old_T_msisdn },
{ 4, &hf_gsm_old_serviceCentreAddressOA, BER_CLASS_CON, 4, BER_FLAGS_IMPLTAG, dissect_gsm_old_T_serviceCentreAddressOA },
- { 5, &hf_gsm_old_noSM_RP_OA , BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_gsm_old_NULL },
+ { 5, &hf_gsm_old_noSM_RP_OA , BER_CLASS_CON, 5, BER_FLAGS_IMPLTAG, dissect_gsm_old_T_noSM_RP_OA },
{ 0, NULL, 0, 0, 0, NULL }
};
@@ -18312,23 +18458,23 @@ static const ber_sequence_t gsm_old_ForwardSM_Arg_sequence[] = {
static int
dissect_gsm_old_ForwardSM_Arg(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 484 "./asn1/gsm_map/gsm_map.cnf"
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+#line 529 "./asn1/gsm_map/gsm_map.cnf"
+ /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
gsm_old_ForwardSM_Arg_sequence, hf_index, ett_gsm_old_ForwardSM_Arg);
- if (!actx->value_ptr)
- return offset;
- if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
- if (gsmmap_pdu_type == 1) {
- actx->pinfo->p2p_dir = P2P_DIR_SENT;
- } else {
- actx->pinfo->p2p_dir = P2P_DIR_RECV;
- }
- }
- call_dissector_only(gsm_sms_handle, (tvbuff_t*)actx->value_ptr, actx->pinfo, top_tree, NULL);
+ if (!gsm_map_priv || !gsm_map_priv->signal_info_tvb)
+ return offset;
+ if (actx->pinfo->p2p_dir == P2P_DIR_UNKNOWN) {
+ if (gsmmap_pdu_type == 1) {
+ actx->pinfo->p2p_dir = P2P_DIR_SENT;
+ } else {
+ actx->pinfo->p2p_dir = P2P_DIR_RECV;
+ }
+ }
+ call_dissector_only(gsm_sms_handle, gsm_map_priv->signal_info_tvb, actx->pinfo, top_tree, NULL);
@@ -19332,7 +19478,7 @@ dissect_gsm_ss_LCS_PeriodicLocationCancellationArg(gboolean implicit_tag _U_, tv
static int
dissect_gsm_map_ericsson_T_locationInformation(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
-#line 1065 "./asn1/gsm_map/gsm_map.cnf"
+#line 1110 "./asn1/gsm_map/gsm_map.cnf"
tvbuff_t *parameter_tvb;
proto_tree *subtree;
guint8 rat;
@@ -20981,7 +21127,7 @@ dissect_NokiaMAP_Extensions_AllowedServiceData(gboolean implicit_tag _U_, tvbuff
/*--- End of included file: packet-gsm_map-fn.c ---*/
-#line 841 "./asn1/gsm_map/packet-gsm_map-template.c"
+#line 902 "./asn1/gsm_map/packet-gsm_map-template.c"
/* Specific translation for MAP V3 */
const value_string gsm_map_V1V2_opr_code_strings[] = {
@@ -21203,7 +21349,7 @@ const value_string gsm_map_opr_code_strings[] = {
/* Unknown or empty loop list OPERATION */
/*--- End of included file: packet-gsm_map-table.c ---*/
-#line 852 "./asn1/gsm_map/packet-gsm_map-template.c"
+#line 913 "./asn1/gsm_map/packet-gsm_map-template.c"
{ 0, NULL }
};
@@ -21420,7 +21566,7 @@ static const value_string gsm_map_err_code_string_vals[] = {
/* Unknown or empty loop list OPERATION */
/*--- End of included file: packet-gsm_map-table.c ---*/
-#line 858 "./asn1/gsm_map/packet-gsm_map-template.c"
+#line 919 "./asn1/gsm_map/packet-gsm_map-template.c"
{ 0, NULL }
};
#endif
@@ -22664,17 +22810,18 @@ static int dissect_NokiaMAP_ext_DsdArgExt(tvbuff_t *tvb, packet_info *pinfo, pro
}
static int
-dissect_gsm_map_GSMMAPPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree,
- int hf_index _U_, struct tcap_private_t * p_private_tcap) {
+dissect_gsm_map_GSMMAPPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset,
+ asn1_ctx_t *actx, proto_tree *tree, int hf_index _U_) {
char *version_ptr;
opcode = 0;
if (pref_application_context_version == APPLICATON_CONTEXT_FROM_TRACE) {
+ gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
application_context_version = 0;
- if (p_private_tcap != NULL){
- if (p_private_tcap->acv==TRUE ){
- version_ptr = strrchr((const char*)p_private_tcap->oid,'.');
+ if (gsm_map_priv && gsm_map_priv->tcap_private != NULL){
+ if (gsm_map_priv->tcap_private->acv==TRUE ){
+ version_ptr = strrchr((const char*)gsm_map_priv->tcap_private->oid,'.');
if (version_ptr){
ws_strtoi32(version_ptr + 1, NULL, &application_context_version);
}
@@ -22707,8 +22854,8 @@ dissect_gsm_map(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void
/* Used for gsm_map TAP */
static gsm_map_tap_rec_t tap_rec;
gint op_idx;
- struct tcap_private_t * p_private_tcap = (struct tcap_private_t *)data;
asn1_ctx_t asn1_ctx;
+ gsm_map_private_info_t *gsm_map_priv;
asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
@@ -22716,11 +22863,15 @@ dissect_gsm_map(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void
top_tree = parent_tree;
+ gsm_map_priv = wmem_new0(wmem_packet_scope(), gsm_map_private_info_t);
+ gsm_map_priv->tcap_private = (struct tcap_private_t *)data;
+ asn1_ctx.value_ptr = gsm_map_priv;
+
/* create display subtree for the protocol */
item = proto_tree_add_item(parent_tree, proto_gsm_map, tvb, 0, -1, ENC_NA);
tree = proto_item_add_subtree(item, ett_gsm_map);
- dissect_gsm_map_GSMMAPPDU(FALSE, tvb, 0, &asn1_ctx, tree, -1, p_private_tcap);
+ dissect_gsm_map_GSMMAPPDU(FALSE, tvb, 0, &asn1_ctx, tree, -1);
try_val_to_str_idx(opcode, gsm_map_opr_code_strings, &op_idx);
if (op_idx != -1) {
@@ -22743,6 +22894,7 @@ dissect_gsm_map_sccp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
static gsm_map_tap_rec_t tap_rec;
gint op_idx;
asn1_ctx_t asn1_ctx;
+ gsm_map_private_info_t *gsm_map_priv;
asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
@@ -22750,15 +22902,15 @@ dissect_gsm_map_sccp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree,
top_tree = parent_tree;
+ gsm_map_priv = wmem_new0(wmem_packet_scope(), gsm_map_private_info_t);
+ gsm_map_priv->sccp_msg_info = (sccp_msg_info_t *)data;
+ asn1_ctx.value_ptr = gsm_map_priv;
+
/* create display subtree for the protocol */
item = proto_tree_add_item(parent_tree, proto_gsm_map, tvb, 0, -1, ENC_NA);
tree = proto_item_add_subtree(item, ett_gsm_map);
- /* Save the sccp_msg_info_t data (if present) because it can't be passed
- through function calls */
- p_add_proto_data(pinfo->pool, pinfo, proto_gsm_map, pinfo->curr_layer_num, data);
-
- dissect_gsm_map_GSMMAPPDU(FALSE, tvb, 0, &asn1_ctx, tree, -1, NULL);
+ dissect_gsm_map_GSMMAPPDU(FALSE, tvb, 0, &asn1_ctx, tree, -1);
try_val_to_str_idx(opcode, gsm_map_opr_code_strings, &op_idx);
if (op_idx != -1) {
@@ -30704,7 +30856,7 @@ void proto_register_gsm_map(void) {
NULL, HFILL }},
/*--- End of included file: packet-gsm_map-hfarr.c ---*/
-#line 3064 "./asn1/gsm_map/packet-gsm_map-template.c"
+#line 3131 "./asn1/gsm_map/packet-gsm_map-template.c"
};
/* List of subtrees */
@@ -31430,7 +31582,7 @@ void proto_register_gsm_map(void) {
&ett_NokiaMAP_Extensions_AllowedServiceData,
/*--- End of included file: packet-gsm_map-ettarr.c ---*/
-#line 3098 "./asn1/gsm_map/packet-gsm_map-template.c"
+#line 3165 "./asn1/gsm_map/packet-gsm_map-template.c"
};
static ei_register_info ei[] = {
@@ -31574,7 +31726,7 @@ void proto_register_gsm_map(void) {
/*--- End of included file: packet-gsm_map-dis-tab.c ---*/
-#line 3158 "./asn1/gsm_map/packet-gsm_map-template.c"
+#line 3225 "./asn1/gsm_map/packet-gsm_map-template.c"
oid_add_from_string("ericsson-gsm-Map-Ext","1.2.826.0.1249.58.1.0" );
oid_add_from_string("accessTypeNotAllowed-id","1.3.12.2.1107.3.66.1.2");
/*oid_add_from_string("map-ac networkLocUp(1) version3(3)","0.4.0.0.1.0.1.3" );