diff options
author | Pascal Quantin <pascal.quantin@gmail.com> | 2017-04-26 20:28:35 +0200 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2017-04-28 04:17:39 +0000 |
commit | aeccfa3e651df3a4ee89ce334fad80fda092c6f4 (patch) | |
tree | 280b06c3d5cde20ea1ff44fb71826c7291e7a7f3 /epan/dissectors/packet-gsm_sms.c | |
parent | ffddacf79ed36e70aa6831262675317d0586b361 (diff) |
GSM SMS: Use SIP To / From tapped addresses for reassembly
Ping-Bug: 13592
Change-Id: Ie07033972943ef38ca88bc0e82463ebccd281ce2
Reviewed-on: https://code.wireshark.org/review/21354
Reviewed-by: Michael Mann <mmann78@netscape.net>
Petri-Dish: Michael Mann <mmann78@netscape.net>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-gsm_sms.c')
-rw-r--r-- | epan/dissectors/packet-gsm_sms.c | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/epan/dissectors/packet-gsm_sms.c b/epan/dissectors/packet-gsm_sms.c index b784008688..275a5060a7 100644 --- a/epan/dissectors/packet-gsm_sms.c +++ b/epan/dissectors/packet-gsm_sms.c @@ -45,6 +45,9 @@ #include <epan/asn1.h> #include "packet-gsm_sms.h" #include "packet-gsm_map.h" +#include "packet-sip.h" + +static gint proto_sip = -1; void proto_register_gsm_sms(void); @@ -1962,9 +1965,7 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset sm_fragment_params *p_frag_params; sm_fragment_params_key *p_frag_params_key, frag_params_key; - wmem_strbuf_t *addr_info_strbuf; const gchar *addr_info, *addr; - gsm_map_packet_info_t *gsm_map_packet_info; gsm_sms_udh_fields_t udh_fields; memset(&udh_fields, 0, sizeof(udh_fields)); @@ -1975,16 +1976,35 @@ dis_field_ud(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset addr = ""; /* check if lower layers provide additional info */ if (reassemble_sms_with_lower_layers_info) { - addr_info_strbuf = wmem_strbuf_new(wmem_packet_scope(), addr); - 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); + wmem_strbuf_t *addr_info_strbuf = wmem_strbuf_new(wmem_packet_scope(), addr); + 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); + } } else if (proto_is_frame_protocol(pinfo->layers, "sip")) { + sip_info_value_t *sip_info; + wmem_list_frame_t *frame; + guint8 curr_layer_num; wmem_strbuf_append(addr_info_strbuf, "SIP"); + curr_layer_num = pinfo->curr_layer_num-1; + frame = wmem_list_frame_prev(wmem_list_tail(pinfo->layers)); + while (frame && (proto_sip != (gint) GPOINTER_TO_UINT(wmem_list_frame_data(frame)))) { + frame = wmem_list_frame_prev(frame); + curr_layer_num--; + } + if ((sip_info = (sip_info_value_t*)p_get_proto_data(pinfo->pool, pinfo, proto_sip, curr_layer_num)) != NULL) { + if (sip_info->tap_from_addr) + wmem_strbuf_append(addr_info_strbuf, sip_info->tap_from_addr); + if (sip_info->tap_to_addr) + wmem_strbuf_append(addr_info_strbuf, sip_info->tap_to_addr); + } } else if (proto_is_frame_protocol(pinfo->layers, "gsm_a.rp")) { wmem_strbuf_append(addr_info_strbuf, "RP"); } else if (proto_is_frame_protocol(pinfo->layers, "etsi_cat")) { @@ -3546,6 +3566,12 @@ proto_register_gsm_sms(void) } +void +proto_reg_handoff_gsm_sms(void) +{ + proto_sip = proto_get_id_by_filter_name( "sip" ); +} + /* * Editor modelines - http://www.wireshark.org/tools/modelines.html * |