aboutsummaryrefslogtreecommitdiffstats
path: root/epan
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
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')
-rw-r--r--epan/dissectors/asn1/gsm_map/gsm_map.cnf353
-rw-r--r--epan/dissectors/asn1/gsm_map/packet-gsm_map-template.c105
-rw-r--r--epan/dissectors/asn1/gsm_map/packet-gsm_map-template.h31
-rw-r--r--epan/dissectors/asn1/tcap/packet-tcap-template.c25
-rw-r--r--epan/dissectors/asn1/tcap/packet-tcap-template.h2
-rw-r--r--epan/dissectors/asn1/tcap/tcap.cnf19
-rw-r--r--epan/dissectors/packet-gsm_map.c622
-rw-r--r--epan/dissectors/packet-gsm_map.h33
-rw-r--r--epan/dissectors/packet-gsm_sms.c20
-rw-r--r--epan/dissectors/packet-tcap.c68
-rw-r--r--epan/dissectors/packet-tcap.h4
11 files changed, 777 insertions, 505 deletions
diff --git a/epan/dissectors/asn1/gsm_map/gsm_map.cnf b/epan/dissectors/asn1/gsm_map/gsm_map.cnf
index 5e751aeba5..1681e9aea6 100644
--- a/epan/dissectors/asn1/gsm_map/gsm_map.cnf
+++ b/epan/dissectors/asn1/gsm_map/gsm_map.cnf
@@ -253,10 +253,12 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
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));
#.FN_BODY IMSI VAL_PTR = &parameter_tvb
- tvbuff_t *parameter_tvb;
+ tvbuff_t *parameter_tvb;
+ const char *imsi_str;
offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index, &parameter_tvb);
@@ -265,17 +267,18 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
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);
#.FN_BODY LMSI VAL_PTR = &parameter_tvb
tvbuff_t *parameter_tvb;
%(DEFAULT_BODY)s
- 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));
}
#.FN_BODY TBCD-STRING VAL_PTR = &parameter_tvb
@@ -314,6 +317,8 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
guint8 octet;
tvbuff_t *next_tvb;
proto_tree *subtree;
+ gsm_map_private_info_t *gsm_map_priv;
+ sccp_msg_info_t *sccp_msg_info;
%(DEFAULT_BODY)s
@@ -321,6 +326,8 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
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){
@@ -333,8 +340,7 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
/* 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);
@@ -357,9 +363,9 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
actx->pinfo->p2p_dir = P2P_DIR_SENT;
%(DEFAULT_BODY)s
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;
}
@@ -368,9 +374,9 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
actx->pinfo->p2p_dir = P2P_DIR_SENT;
%(DEFAULT_BODY)s
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;
}
@@ -379,9 +385,9 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
actx->pinfo->p2p_dir = P2P_DIR_SENT;
%(DEFAULT_BODY)s
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;
}
@@ -390,9 +396,9 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
actx->pinfo->p2p_dir = P2P_DIR_SENT;
%(DEFAULT_BODY)s
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;
}
@@ -401,9 +407,9 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
actx->pinfo->p2p_dir = P2P_DIR_SENT;
%(DEFAULT_BODY)s
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;
}
@@ -412,9 +418,9 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
actx->pinfo->p2p_dir = P2P_DIR_SENT;
%(DEFAULT_BODY)s
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;
}
@@ -423,9 +429,9 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
actx->pinfo->p2p_dir = P2P_DIR_RECV;
%(DEFAULT_BODY)s
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;
}
@@ -433,9 +439,9 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
actx->pinfo->p2p_dir = P2P_DIR_RECV;
%(DEFAULT_BODY)s
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;
}
@@ -444,9 +450,9 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
actx->pinfo->p2p_dir = P2P_DIR_RECV;
%(DEFAULT_BODY)s
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;
}
@@ -455,118 +461,157 @@ MAP-DialoguePDU B "0.4.0.0.1.1.1.1" "map-DialogueAS"
actx->pinfo->p2p_dir = P2P_DIR_RECV;
%(DEFAULT_BODY)s
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;
}
+#.FN_BODY SM-RP-OAold/noSM-RP-OA
+ gsm_map_packet_info_t *prev_packet_info = gsm_map_get_matching_tcap_info(actx);
+%(DEFAULT_BODY)s
+ 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);
+ }
+
+#.FN_BODY SM-RP-OA/noSM-RP-OA
+ gsm_map_packet_info_t *prev_packet_info = gsm_map_get_matching_tcap_info(actx);
+%(DEFAULT_BODY)s
+ 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);
+ }
+
+#.FN_BODY SM-RP-DAold/noSM-RP-DA
+ gsm_map_packet_info_t *prev_packet_info = gsm_map_get_matching_tcap_info(actx);
+%(DEFAULT_BODY)s
+ 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);
+ }
+
+#.FN_BODY SM-RP-DA/noSM-RP-DA
+ gsm_map_packet_info_t *prev_packet_info = gsm_map_get_matching_tcap_info(actx);
+%(DEFAULT_BODY)s
+ 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);
+ }
+
#.FN_BODY SignalInfo VAL_PTR = &parameter_tvb
- tvbuff_t *parameter_tvb;
+ tvbuff_t *parameter_tvb;
+ gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
- %(DEFAULT_BODY)s
- actx->value_ptr = (void*)parameter_tvb;
+%(DEFAULT_BODY)s
+ if (gsm_map_priv)
+ gsm_map_priv->signal_info_tvb = parameter_tvb;
#.FN_BODY SM-DeliveryFailureCause
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ /* 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;
%(DEFAULT_BODY)s
- 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);
#.FN_BODY ForwardSM-Arg
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ /* 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;
%(DEFAULT_BODY)s
- 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);
#.FN_BODY MO-ForwardSM-Arg
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ /* 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;
%(DEFAULT_BODY)s
- 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);
#.FN_BODY MO-ForwardSM-Res
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ /* 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;
%(DEFAULT_BODY)s
- 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);
#.FN_BODY MT-ForwardSM-Arg
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ /* 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;
%(DEFAULT_BODY)s
- 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);
#.FN_BODY MT-ForwardSM-Res
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ /* 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;
%(DEFAULT_BODY)s
- 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);
#.FN_BODY MT-ForwardSM-VGCS-Arg
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ /* 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;
%(DEFAULT_BODY)s
- 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);
#.FN_BODY MT-ForwardSM-VGCS-Res
-
- /* dissect_gsm_map_SignalInfo will return parameter_tvb in actx */
+ /* 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;
%(DEFAULT_BODY)s
- 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);
#.FN_BODY SS-Status VAL_PTR = &parameter_tvb
@@ -822,8 +867,10 @@ 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;
%(DEFAULT_BODY)s
-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){
@@ -834,56 +881,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;
@@ -902,10 +947,12 @@ MAP interfaces
guint8 length;
tvbuff_t *next_tvb;
proto_tree *subtree;
+ gsm_map_private_info_t *gsm_map_priv;
ProtocolId = 0xffffffff;
%(DEFAULT_BODY)s
-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){
@@ -916,56 +963,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;
diff --git a/epan/dissectors/asn1/gsm_map/packet-gsm_map-template.c b/epan/dissectors/asn1/gsm_map/packet-gsm_map-template.c
index 897b2d2e0b..c4b79eefa8 100644
--- a/epan/dissectors/asn1/gsm_map/packet-gsm_map-template.c
+++ b/epan/dissectors/asn1/gsm_map/packet-gsm_map-template.c
@@ -53,6 +53,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>
@@ -76,7 +77,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;
@@ -231,15 +232,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[] = {
@@ -2098,17 +2159,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);
}
@@ -2141,8 +2203,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);
@@ -2150,11 +2212,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) {
@@ -2177,6 +2243,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);
@@ -2184,15 +2251,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) {
diff --git a/epan/dissectors/asn1/gsm_map/packet-gsm_map-template.h b/epan/dissectors/asn1/gsm_map/packet-gsm_map-template.h
index fdce0ccb9d..c1c0ee7902 100644
--- a/epan/dissectors/asn1/gsm_map/packet-gsm_map-template.h
+++ b/epan/dissectors/asn1/gsm_map/packet-gsm_map-template.h
@@ -54,28 +54,27 @@ guint8 dissect_cbs_data_coding_scheme(tvbuff_t *tvb, packet_info *pinfo _U_, pro
void dissect_gsm_map_msisdn(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree);
typedef enum {
- GSM_MAP_RP_OA_NO_ID = 0,
- GSM_MAP_RP_OA_MSISDN,
- GSM_MAP_RP_OA_SERVICE_CENTER_ADDRESS
-} gsm_map_rp_oa_id;
+ GSM_MAP_SM_RP_OA_NO_ID = 0,
+ GSM_MAP_SM_RP_OA_MSISDN,
+ GSM_MAP_SM_RP_OA_SERVICE_CENTER_ADDRESS
+} gsm_map_sm_rp_oa_id;
typedef enum {
- GSM_MAP_RP_DA_NO_ID = 0,
- GSM_MAP_RP_DA_IMSI,
- GSM_MAP_RP_DA_LMSI,
- GSM_MAP_RP_DA_SERVICE_CENTER_ADDRESS
-} gsm_map_rp_da_id;
+ GSM_MAP_SM_RP_DA_NO_ID = 0,
+ GSM_MAP_SM_RP_DA_IMSI,
+ GSM_MAP_SM_RP_DA_LMSI,
+ GSM_MAP_SM_RP_DA_SERVICE_CENTER_ADDRESS
+} gsm_map_sm_rp_da_id;
-/* structure accessible via p_get_proto_data(pinfo->pool, pinfo, proto_gsm_map, 0) */
+/* structure accessible via p_get_proto_data(wmem_file_scope(), pinfo, proto_gsm_map, 0) */
typedef struct {
- gsm_map_rp_oa_id rp_oa_id;
- const gchar *rp_oa_str;
- gsm_map_rp_da_id rp_da_id;
- const gchar *rp_da_str;
+ gsm_map_sm_rp_oa_id sm_rp_oa_id;
+ const gchar *sm_rp_oa_str;
+ gsm_map_sm_rp_da_id sm_rp_da_id;
+ const gchar *sm_rp_da_str;
+ guint32 tcap_src_tid;
} gsm_map_packet_info_t;
-extern int proto_gsm_map;
-
#include "packet-gsm_map-exp.h"
diff --git a/epan/dissectors/asn1/tcap/packet-tcap-template.c b/epan/dissectors/asn1/tcap/packet-tcap-template.c
index 193f4699a0..24e3f58b11 100644
--- a/epan/dissectors/asn1/tcap/packet-tcap-template.c
+++ b/epan/dissectors/asn1/tcap/packet-tcap-template.c
@@ -87,7 +87,6 @@ static struct tcapsrt_info_t tcapsrt_global_info[MAX_TCAP_INSTANCE];
#define MAX_SSN 254
static range_t *global_ssn_range;
static range_t *ssn_range;
-struct tcap_private_t tcap_private;
gboolean gtcap_HandleSRT=FALSE;
/* These two timeout (in second) are used when some message are lost,
@@ -117,7 +116,6 @@ static proto_tree * tcap_stat_tree=NULL;
static dissector_handle_t data_handle;
static dissector_handle_t ansi_tcap_handle;
-static void raz_tcap_private(struct tcap_private_t * p_tcap_private);
static int dissect_tcap_param(asn1_ctx_t *actx, proto_tree *tree, tvbuff_t *tvb, int offset);
static int dissect_tcap_ITU_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_);
@@ -1826,6 +1824,7 @@ dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* d
gint8 ber_class;
gboolean pc;
gint tag;
+ struct tcap_private_t *p_tcap_private;
/* Check if ANSI TCAP and call the ANSI TCAP dissector if that's the case
* PackageType ::= CHOICE { unidirectional [PRIVATE 1] IMPLICIT UniTransactionPDU,
@@ -1874,9 +1873,9 @@ dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* d
}
cur_oid = NULL;
tcapext_oid = NULL;
- raz_tcap_private(&tcap_private);
- asn1_ctx.value_ptr = &tcap_private;
+ p_tcap_private = wmem_new0(wmem_packet_scope(), struct tcap_private_t);
+ asn1_ctx.value_ptr = p_tcap_private;
gp_tcapsrt_info=tcapsrt_razinfo();
tcap_subdissector_used=FALSE;
gp_tcap_context=NULL;
@@ -1884,7 +1883,7 @@ dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* d
if (gtcap_HandleSRT && !tcap_subdissector_used ) {
p_tcap_context=tcapsrt_call_matching(tvb, pinfo, tcap_stat_tree, gp_tcapsrt_info);
- tcap_private.context=p_tcap_context;
+ p_tcap_private->context=p_tcap_context;
/* If the current message is TCAP only,
* save the Application Context Name for the next messages
@@ -2191,20 +2190,16 @@ dissect_tcap_param(asn1_ctx_t *actx, proto_tree *tree, tvbuff_t *tvb, int offset
return offset;
}
-static void raz_tcap_private(struct tcap_private_t * p_tcap_private)
-{
- memset(p_tcap_private,0,sizeof(struct tcap_private_t) );
-}
-
/*
* Call ITU Subdissector to decode the Tcap Component
*/
static int
-dissect_tcap_ITU_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_)
+dissect_tcap_ITU_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index _U_)
{
dissector_handle_t subdissector_handle=NULL;
gboolean is_subdissector=FALSE;
struct tcaphash_context_t * p_tcap_context=NULL;
+ struct tcap_private_t *p_tcap_private = (struct tcap_private_t*)actx->value_ptr;
/*
* ok lets look at the oid and ssn and try and find a dissector, otherwise lets decode it.
@@ -2218,11 +2213,11 @@ dissect_tcap_ITU_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offs
p_tcap_context=tcapsrt_call_matching(tvb, actx->pinfo, tcap_stat_tree, gp_tcapsrt_info);
tcap_subdissector_used=TRUE;
gp_tcap_context=p_tcap_context;
- tcap_private.context=p_tcap_context;
+ p_tcap_private->context=p_tcap_context;
} else {
/* Take the last TCAP context */
p_tcap_context = gp_tcap_context;
- tcap_private.context=p_tcap_context;
+ p_tcap_private->context=p_tcap_context;
}
}
if (p_tcap_context) {
@@ -2261,8 +2256,8 @@ dissect_tcap_ITU_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offs
} else {
/* Copy the OID from the TCAP context to the current oid */
if (p_tcap_context->oid_present) {
- tcap_private.oid= (void*) p_tcap_context->oid;
- tcap_private.acv=TRUE;
+ p_tcap_private->oid= (void*) p_tcap_context->oid;
+ p_tcap_private->acv=TRUE;
}
} /* no OID */
} /* no TCAP context */
diff --git a/epan/dissectors/asn1/tcap/packet-tcap-template.h b/epan/dissectors/asn1/tcap/packet-tcap-template.h
index b79365bd79..80c40b10d9 100644
--- a/epan/dissectors/asn1/tcap/packet-tcap-template.h
+++ b/epan/dissectors/asn1/tcap/packet-tcap-template.h
@@ -66,6 +66,8 @@ struct tcap_private_t {
guint32 session_id;
void * context;
gchar *TransactionID_str;
+ guint32 src_tid;
+ guint32 dst_tid;
};
/** @file
diff --git a/epan/dissectors/asn1/tcap/tcap.cnf b/epan/dissectors/asn1/tcap/tcap.cnf
index e041ba9aae..217048ab82 100644
--- a/epan/dissectors/asn1/tcap/tcap.cnf
+++ b/epan/dissectors/asn1/tcap/tcap.cnf
@@ -113,25 +113,29 @@ ABRT-apdu/_untag/user-information abrt_user_information
#----------------------------------------------------------------------------------------
#.FN_BODY AUDT-apdu/_untag/application-context-name FN_VARIANT = _str VAL_PTR = &cur_oid
+ struct tcap_private_t *p_tcap_private = (struct tcap_private_t*)actx->value_ptr;
%(DEFAULT_BODY)s
- tcap_private.oid= (const void*) cur_oid;
- tcap_private.acv=TRUE;
+ p_tcap_private->oid= (const void*) cur_oid;
+ p_tcap_private->acv=TRUE;
#----------------------------------------------------------------------------------------
#.FN_BODY AARQ-apdu/_untag/application-context-name FN_VARIANT = _str VAL_PTR = &cur_oid
+ struct tcap_private_t *p_tcap_private = (struct tcap_private_t*)actx->value_ptr;
%(DEFAULT_BODY)s
- tcap_private.oid= (const void*) cur_oid;
- tcap_private.acv=TRUE;
+ p_tcap_private->oid= (const void*) cur_oid;
+ p_tcap_private->acv=TRUE;
#----------------------------------------------------------------------------------------
#.FN_BODY AARE-apdu/_untag/application-context-name FN_VARIANT = _str VAL_PTR = &cur_oid
+ struct tcap_private_t *p_tcap_private = (struct tcap_private_t*)actx->value_ptr;
%(DEFAULT_BODY)s
- tcap_private.oid= (const void*) cur_oid;
- tcap_private.acv=TRUE;
+ p_tcap_private->oid= (const void*) cur_oid;
+ p_tcap_private->acv=TRUE;
#----------------------------------------------------------------------------------------
#.FN_BODY OrigTransactionID
tvbuff_t *parameter_tvb;
guint8 len, i;
proto_tree *subtree;
int saved_offset;
+ struct tcap_private_t *p_tcap_private = (struct tcap_private_t*)actx->value_ptr;
hf_index = hf_tcap_tid;
saved_offset = offset;
@@ -159,6 +163,7 @@ ABRT-apdu/_untag/user-information abrt_user_information
gp_tcapsrt_info->src_tid=0;
break;
}
+ p_tcap_private->src_tid = gp_tcapsrt_info->src_tid;
if (len) {
col_append_str(actx->pinfo->cinfo, COL_INFO, "otid(");
@@ -175,6 +180,7 @@ ABRT-apdu/_untag/user-information abrt_user_information
guint8 len , i;
proto_tree *subtree;
int saved_offset;
+ struct tcap_private_t *p_tcap_private = (struct tcap_private_t*)actx->value_ptr;
hf_index = hf_tcap_tid;
saved_offset = offset;
@@ -202,6 +208,7 @@ ABRT-apdu/_untag/user-information abrt_user_information
gp_tcapsrt_info->dst_tid=0;
break;
}
+ p_tcap_private->dst_tid = gp_tcapsrt_info->dst_tid;
if (len) {
col_append_str(actx->pinfo->cinfo, COL_INFO, "dtid(");
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" );
diff --git a/epan/dissectors/packet-gsm_map.h b/epan/dissectors/packet-gsm_map.h
index 95f52c358c..d92fab0ea8 100644
--- a/epan/dissectors/packet-gsm_map.h
+++ b/epan/dissectors/packet-gsm_map.h
@@ -62,28 +62,27 @@ guint8 dissect_cbs_data_coding_scheme(tvbuff_t *tvb, packet_info *pinfo _U_, pro
void dissect_gsm_map_msisdn(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree);
typedef enum {
- GSM_MAP_RP_OA_NO_ID = 0,
- GSM_MAP_RP_OA_MSISDN,
- GSM_MAP_RP_OA_SERVICE_CENTER_ADDRESS
-} gsm_map_rp_oa_id;
+ GSM_MAP_SM_RP_OA_NO_ID = 0,
+ GSM_MAP_SM_RP_OA_MSISDN,
+ GSM_MAP_SM_RP_OA_SERVICE_CENTER_ADDRESS
+} gsm_map_sm_rp_oa_id;
typedef enum {
- GSM_MAP_RP_DA_NO_ID = 0,
- GSM_MAP_RP_DA_IMSI,
- GSM_MAP_RP_DA_LMSI,
- GSM_MAP_RP_DA_SERVICE_CENTER_ADDRESS
-} gsm_map_rp_da_id;
+ GSM_MAP_SM_RP_DA_NO_ID = 0,
+ GSM_MAP_SM_RP_DA_IMSI,
+ GSM_MAP_SM_RP_DA_LMSI,
+ GSM_MAP_SM_RP_DA_SERVICE_CENTER_ADDRESS
+} gsm_map_sm_rp_da_id;
-/* structure accessible via p_get_proto_data(pinfo->pool, pinfo, proto_gsm_map, 0) */
+/* structure accessible via p_get_proto_data(wmem_file_scope(), pinfo, proto_gsm_map, 0) */
typedef struct {
- gsm_map_rp_oa_id rp_oa_id;
- const gchar *rp_oa_str;
- gsm_map_rp_da_id rp_da_id;
- const gchar *rp_da_str;
+ gsm_map_sm_rp_oa_id sm_rp_oa_id;
+ const gchar *sm_rp_oa_str;
+ gsm_map_sm_rp_da_id sm_rp_da_id;
+ const gchar *sm_rp_da_str;
+ guint32 tcap_src_tid;
} gsm_map_packet_info_t;
-extern int proto_gsm_map;
-
/*--- Included file: packet-gsm_map-exp.h ---*/
#line 1 "./asn1/gsm_map/packet-gsm_map-exp.h"
@@ -298,7 +297,7 @@ int dissect_gsm_ss_LocationMethod(gboolean implicit_tag _U_, tvbuff_t *tvb _U_,
int dissect_NokiaMAP_Extensions_ServiceKey(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);
/*--- End of included file: packet-gsm_map-exp.h ---*/
-#line 80 "./asn1/gsm_map/packet-gsm_map-template.h"
+#line 79 "./asn1/gsm_map/packet-gsm_map-template.h"
#endif /* PACKET_GSM_MAP_H */
diff --git a/epan/dissectors/packet-gsm_sms.c b/epan/dissectors/packet-gsm_sms.c
index 275a5060a7..903f2ecbe6 100644
--- a/epan/dissectors/packet-gsm_sms.c
+++ b/epan/dissectors/packet-gsm_sms.c
@@ -47,7 +47,8 @@
#include "packet-gsm_map.h"
#include "packet-sip.h"
-static gint proto_sip = -1;
+static gint proto_gsm_map = -1;
+static gint proto_sip = -1;
void proto_register_gsm_sms(void);
@@ -1980,13 +1981,13 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset
if (proto_is_frame_protocol(pinfo->layers, "gsm_map")) {
gsm_map_packet_info_t *gsm_map_packet_info;
wmem_strbuf_append(addr_info_strbuf, "MAP");
- if ((gsm_map_packet_info = (gsm_map_packet_info_t*)p_get_proto_data(pinfo->pool, pinfo, proto_gsm_map, 0)) != NULL) {
- if (gsm_map_packet_info->rp_oa_id == GSM_MAP_RP_OA_MSISDN)
- wmem_strbuf_append(addr_info_strbuf, gsm_map_packet_info->rp_oa_str);
- else if (gsm_map_packet_info->rp_da_id == GSM_MAP_RP_DA_IMSI)
- wmem_strbuf_append(addr_info_strbuf, gsm_map_packet_info->rp_da_str);
- else if (gsm_map_packet_info->rp_da_id == GSM_MAP_RP_DA_LMSI)
- wmem_strbuf_append(addr_info_strbuf, gsm_map_packet_info->rp_da_str);
+ if ((gsm_map_packet_info = (gsm_map_packet_info_t*)p_get_proto_data(wmem_file_scope(), pinfo, proto_gsm_map, 0)) != NULL) {
+ if (gsm_map_packet_info->sm_rp_oa_id == GSM_MAP_SM_RP_OA_MSISDN)
+ wmem_strbuf_append(addr_info_strbuf, gsm_map_packet_info->sm_rp_oa_str);
+ else if (gsm_map_packet_info->sm_rp_da_id == GSM_MAP_SM_RP_DA_IMSI)
+ wmem_strbuf_append(addr_info_strbuf, gsm_map_packet_info->sm_rp_da_str);
+ else if (gsm_map_packet_info->sm_rp_da_id == GSM_MAP_SM_RP_DA_LMSI)
+ wmem_strbuf_append(addr_info_strbuf, gsm_map_packet_info->sm_rp_da_str);
}
} else if (proto_is_frame_protocol(pinfo->layers, "sip")) {
sip_info_value_t *sip_info;
@@ -3569,7 +3570,8 @@ proto_register_gsm_sms(void)
void
proto_reg_handoff_gsm_sms(void)
{
- proto_sip = proto_get_id_by_filter_name( "sip" );
+ proto_gsm_map = proto_get_id_by_filter_name("gsm_map");
+ proto_sip = proto_get_id_by_filter_name("sip");
}
/*
diff --git a/epan/dissectors/packet-tcap.c b/epan/dissectors/packet-tcap.c
index 0f6b0459e6..2c68368c00 100644
--- a/epan/dissectors/packet-tcap.c
+++ b/epan/dissectors/packet-tcap.c
@@ -205,7 +205,6 @@ static struct tcapsrt_info_t tcapsrt_global_info[MAX_TCAP_INSTANCE];
#define MAX_SSN 254
static range_t *global_ssn_range;
static range_t *ssn_range;
-struct tcap_private_t tcap_private;
gboolean gtcap_HandleSRT=FALSE;
/* These two timeout (in second) are used when some message are lost,
@@ -235,7 +234,6 @@ static proto_tree * tcap_stat_tree=NULL;
static dissector_handle_t data_handle;
static dissector_handle_t ansi_tcap_handle;
-static void raz_tcap_private(struct tcap_private_t * p_tcap_private);
static int dissect_tcap_param(asn1_ctx_t *actx, proto_tree *tree, tvbuff_t *tvb, int offset);
static int dissect_tcap_ITU_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_);
@@ -757,11 +755,12 @@ dissect_tcap_OCTET_STRING_SIZE_1_4(gboolean implicit_tag _U_, tvbuff_t *tvb _U_,
static int
dissect_tcap_OrigTransactionID(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 131 "./asn1/tcap/tcap.cnf"
+#line 134 "./asn1/tcap/tcap.cnf"
tvbuff_t *parameter_tvb;
guint8 len, i;
proto_tree *subtree;
int saved_offset;
+ struct tcap_private_t *p_tcap_private = (struct tcap_private_t*)actx->value_ptr;
hf_index = hf_tcap_tid;
saved_offset = offset;
@@ -791,6 +790,7 @@ dissect_tcap_OrigTransactionID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int
gp_tcapsrt_info->src_tid=0;
break;
}
+ p_tcap_private->src_tid = gp_tcapsrt_info->src_tid;
if (len) {
col_append_str(actx->pinfo->cinfo, COL_INFO, "otid(");
@@ -816,7 +816,7 @@ static const ber_sequence_t Begin_sequence[] = {
static int
dissect_tcap_Begin(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 215 "./asn1/tcap/tcap.cnf"
+#line 222 "./asn1/tcap/tcap.cnf"
gp_tcapsrt_info->ope=TC_BEGIN;
/* Do not change col_add_str() to col_append_str() here: we _want_ this call
@@ -838,11 +838,12 @@ gp_tcapsrt_info->ope=TC_BEGIN;
static int
dissect_tcap_DestTransactionID(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 174 "./asn1/tcap/tcap.cnf"
+#line 179 "./asn1/tcap/tcap.cnf"
tvbuff_t *parameter_tvb;
guint8 len , i;
proto_tree *subtree;
int saved_offset;
+ struct tcap_private_t *p_tcap_private = (struct tcap_private_t*)actx->value_ptr;
hf_index = hf_tcap_tid;
saved_offset = offset;
@@ -872,6 +873,7 @@ dissect_tcap_DestTransactionID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int
gp_tcapsrt_info->dst_tid=0;
break;
}
+ p_tcap_private->dst_tid = gp_tcapsrt_info->dst_tid;
if (len) {
col_append_str(actx->pinfo->cinfo, COL_INFO, "dtid(");
@@ -896,7 +898,7 @@ static const ber_sequence_t End_sequence[] = {
static int
dissect_tcap_End(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 229 "./asn1/tcap/tcap.cnf"
+#line 236 "./asn1/tcap/tcap.cnf"
gp_tcapsrt_info->ope=TC_END;
col_set_str(actx->pinfo->cinfo, COL_INFO, "End ");
@@ -918,7 +920,7 @@ static const ber_sequence_t Continue_sequence[] = {
static int
dissect_tcap_Continue(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 236 "./asn1/tcap/tcap.cnf"
+#line 243 "./asn1/tcap/tcap.cnf"
gp_tcapsrt_info->ope=TC_CONT;
col_set_str(actx->pinfo->cinfo, COL_INFO, "Continue ");
@@ -989,7 +991,7 @@ static const ber_sequence_t Abort_sequence[] = {
static int
dissect_tcap_Abort(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 243 "./asn1/tcap/tcap.cnf"
+#line 250 "./asn1/tcap/tcap.cnf"
gp_tcapsrt_info->ope=TC_ABORT;
col_set_str(actx->pinfo->cinfo, COL_INFO, "Abort ");
@@ -1039,10 +1041,11 @@ dissect_tcap_AUDT_protocol_version(gboolean implicit_tag _U_, tvbuff_t *tvb _U_,
static int
dissect_tcap_AUDT_application_context_name(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 116 "./asn1/tcap/tcap.cnf"
+ struct tcap_private_t *p_tcap_private = (struct tcap_private_t*)actx->value_ptr;
offset = dissect_ber_object_identifier_str(implicit_tag, actx, tree, tvb, offset, hf_index, &cur_oid);
- tcap_private.oid= (const void*) cur_oid;
- tcap_private.acv=TRUE;
+ p_tcap_private->oid= (const void*) cur_oid;
+ p_tcap_private->acv=TRUE;
return offset;
@@ -1135,11 +1138,12 @@ dissect_tcap_AARQ_protocol_version(gboolean implicit_tag _U_, tvbuff_t *tvb _U_,
static int
dissect_tcap_AARQ_application_context_name(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 121 "./asn1/tcap/tcap.cnf"
+#line 122 "./asn1/tcap/tcap.cnf"
+ struct tcap_private_t *p_tcap_private = (struct tcap_private_t*)actx->value_ptr;
offset = dissect_ber_object_identifier_str(implicit_tag, actx, tree, tvb, offset, hf_index, &cur_oid);
- tcap_private.oid= (const void*) cur_oid;
- tcap_private.acv=TRUE;
+ p_tcap_private->oid= (const void*) cur_oid;
+ p_tcap_private->acv=TRUE;
return offset;
@@ -1203,11 +1207,12 @@ dissect_tcap_AARE_protocol_version(gboolean implicit_tag _U_, tvbuff_t *tvb _U_,
static int
dissect_tcap_AARE_application_context_name(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 126 "./asn1/tcap/tcap.cnf"
+#line 128 "./asn1/tcap/tcap.cnf"
+ struct tcap_private_t *p_tcap_private = (struct tcap_private_t*)actx->value_ptr;
offset = dissect_ber_object_identifier_str(implicit_tag, actx, tree, tvb, offset, hf_index, &cur_oid);
- tcap_private.oid= (const void*) cur_oid;
- tcap_private.acv=TRUE;
+ p_tcap_private->oid= (const void*) cur_oid;
+ p_tcap_private->acv=TRUE;
return offset;
@@ -1423,7 +1428,7 @@ static int dissect_DialoguePDU_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, pr
/*--- End of included file: packet-tcap-fn.c ---*/
-#line 157 "./asn1/tcap/packet-tcap-template.c"
+#line 155 "./asn1/tcap/packet-tcap-template.c"
/*
* DEBUG functions
@@ -3096,6 +3101,7 @@ dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* d
gint8 ber_class;
gboolean pc;
gint tag;
+ struct tcap_private_t *p_tcap_private;
/* Check if ANSI TCAP and call the ANSI TCAP dissector if that's the case
* PackageType ::= CHOICE { unidirectional [PRIVATE 1] IMPLICIT UniTransactionPDU,
@@ -3144,9 +3150,9 @@ dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* d
}
cur_oid = NULL;
tcapext_oid = NULL;
- raz_tcap_private(&tcap_private);
- asn1_ctx.value_ptr = &tcap_private;
+ p_tcap_private = wmem_new0(wmem_packet_scope(), struct tcap_private_t);
+ asn1_ctx.value_ptr = p_tcap_private;
gp_tcapsrt_info=tcapsrt_razinfo();
tcap_subdissector_used=FALSE;
gp_tcap_context=NULL;
@@ -3154,7 +3160,7 @@ dissect_tcap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* d
if (gtcap_HandleSRT && !tcap_subdissector_used ) {
p_tcap_context=tcapsrt_call_matching(tvb, pinfo, tcap_stat_tree, gp_tcapsrt_info);
- tcap_private.context=p_tcap_context;
+ p_tcap_private->context=p_tcap_context;
/* If the current message is TCAP only,
* save the Application Context Name for the next messages
@@ -3194,7 +3200,7 @@ proto_reg_handoff_tcap(void)
/*--- End of included file: packet-tcap-dis-tab.c ---*/
-#line 1920 "./asn1/tcap/packet-tcap-template.c"
+#line 1919 "./asn1/tcap/packet-tcap-template.c"
}
static void init_tcap(void);
@@ -3536,7 +3542,7 @@ proto_register_tcap(void)
NULL, HFILL }},
/*--- End of included file: packet-tcap-hfarr.c ---*/
-#line 1993 "./asn1/tcap/packet-tcap-template.c"
+#line 1992 "./asn1/tcap/packet-tcap-template.c"
};
/* Setup protocol subtree array */
@@ -3584,7 +3590,7 @@ proto_register_tcap(void)
&ett_tcap_Associate_source_diagnostic,
/*--- End of included file: packet-tcap-ettarr.c ---*/
-#line 2003 "./asn1/tcap/packet-tcap-template.c"
+#line 2002 "./asn1/tcap/packet-tcap-template.c"
};
/*static enum_val_t tcap_options[] = {
@@ -3776,20 +3782,16 @@ dissect_tcap_param(asn1_ctx_t *actx, proto_tree *tree, tvbuff_t *tvb, int offset
return offset;
}
-static void raz_tcap_private(struct tcap_private_t * p_tcap_private)
-{
- memset(p_tcap_private,0,sizeof(struct tcap_private_t) );
-}
-
/*
* Call ITU Subdissector to decode the Tcap Component
*/
static int
-dissect_tcap_ITU_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx _U_, proto_tree *tree, int hf_index _U_)
+dissect_tcap_ITU_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index _U_)
{
dissector_handle_t subdissector_handle=NULL;
gboolean is_subdissector=FALSE;
struct tcaphash_context_t * p_tcap_context=NULL;
+ struct tcap_private_t *p_tcap_private = (struct tcap_private_t*)actx->value_ptr;
/*
* ok lets look at the oid and ssn and try and find a dissector, otherwise lets decode it.
@@ -3803,11 +3805,11 @@ dissect_tcap_ITU_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offs
p_tcap_context=tcapsrt_call_matching(tvb, actx->pinfo, tcap_stat_tree, gp_tcapsrt_info);
tcap_subdissector_used=TRUE;
gp_tcap_context=p_tcap_context;
- tcap_private.context=p_tcap_context;
+ p_tcap_private->context=p_tcap_context;
} else {
/* Take the last TCAP context */
p_tcap_context = gp_tcap_context;
- tcap_private.context=p_tcap_context;
+ p_tcap_private->context=p_tcap_context;
}
}
if (p_tcap_context) {
@@ -3846,8 +3848,8 @@ dissect_tcap_ITU_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offs
} else {
/* Copy the OID from the TCAP context to the current oid */
if (p_tcap_context->oid_present) {
- tcap_private.oid= (void*) p_tcap_context->oid;
- tcap_private.acv=TRUE;
+ p_tcap_private->oid= (void*) p_tcap_context->oid;
+ p_tcap_private->acv=TRUE;
}
} /* no OID */
} /* no TCAP context */
diff --git a/epan/dissectors/packet-tcap.h b/epan/dissectors/packet-tcap.h
index ed4589c7ee..35e9e12861 100644
--- a/epan/dissectors/packet-tcap.h
+++ b/epan/dissectors/packet-tcap.h
@@ -74,6 +74,8 @@ struct tcap_private_t {
guint32 session_id;
void * context;
gchar *TransactionID_str;
+ guint32 src_tid;
+ guint32 dst_tid;
};
/** @file
@@ -241,6 +243,6 @@ int dissect_tcap_UniDialoguePDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, in
int dissect_tcap_DialoguePDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_);
/*--- End of included file: packet-tcap-exp.h ---*/
-#line 228 "./asn1/tcap/packet-tcap-template.h"
+#line 230 "./asn1/tcap/packet-tcap-template.h"
#endif /* PACKET_tcap_H */