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>
This commit is contained in:
Pascal Quantin 2017-04-28 18:39:07 +02:00 committed by Anders Broman
parent 5bda98586b
commit fb1a6320ec
11 changed files with 778 additions and 506 deletions

View File

@ -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 SignalInfo VAL_PTR = &parameter_tvb
tvbuff_t *parameter_tvb;
#.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);
}
%(DEFAULT_BODY)s
actx->value_ptr = (void*)parameter_tvb;
#.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;
gsm_map_private_info_t *gsm_map_priv = (gsm_map_private_info_t*)actx->value_ptr;
%(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;

View File

@ -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) {

View File

@ -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"

View File

@ -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 */

View File

@ -66,6 +66,8 @@ struct tcap_private_t {
guint32 session_id;
void * context;
gchar *TransactionID_str;
guint32 src_tid;
guint32 dst_tid;
};
/** @file

View File

@ -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(");

File diff suppressed because it is too large Load Diff

View File

@ -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 */

View File

@ -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");
}
/*

View File

@ -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 */

View File

@ -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 */