From 7221215cdca74a587615e4e1ab9d79540bf58043 Mon Sep 17 00:00:00 2001 From: Michael Mann Date: Tue, 12 Nov 2013 22:04:03 +0000 Subject: [PATCH] Add "rtp handle protection" inside srtp_add_address/rtp_add_address/bluetooth_add_address so dissectors calling it don't need to find "rtp" just for the handle check. svn path=/trunk/; revision=53288 --- asn1/h245/packet-h245-template.c | 5 +- epan/dissectors/packet-ansi_a.c | 5 +- epan/dissectors/packet-gsm_a_bssmap.c | 4 +- epan/dissectors/packet-h245.c | 5 +- epan/dissectors/packet-rtp.c | 4 +- epan/dissectors/packet-sdp.c | 28 +++++----- epan/dissectors/packet-skinny.c | 74 +++++++++++++-------------- epan/dissectors/packet-uma.c | 8 ++- 8 files changed, 58 insertions(+), 75 deletions(-) diff --git a/asn1/h245/packet-h245-template.c b/asn1/h245/packet-h245-template.c index e69c4d91d8..e791a4f007 100644 --- a/asn1/h245/packet-h245-template.c +++ b/asn1/h245/packet-h245-template.c @@ -60,7 +60,7 @@ #define PSNAME "H.245" #define PFNAME "h245" -static dissector_handle_t rtp_handle=NULL; + static dissector_handle_t rtcp_handle=NULL; static dissector_table_t nsp_object_dissector_table; static dissector_table_t nsp_h221_dissector_table; @@ -370,7 +370,7 @@ static void h245_setup_channels(packet_info *pinfo, channel_info_t *upcoming_cha /* DEBUG g_warning("h245_setup_channels media_addr.addr.type %u port %u",upcoming_channel_lcl->media_addr.addr.type, upcoming_channel_lcl->media_addr.port ); */ - if (upcoming_channel_lcl->media_addr.addr.type!=AT_NONE && upcoming_channel_lcl->media_addr.port!=0 && rtp_handle) { + if (upcoming_channel_lcl->media_addr.addr.type!=AT_NONE && upcoming_channel_lcl->media_addr.port!=0) { srtp_add_address(pinfo, &upcoming_channel_lcl->media_addr.addr, upcoming_channel_lcl->media_addr.port, 0, "H245", pinfo->fd->num, upcoming_channel_lcl->is_video , rtp_dyn_payload, dummy_srtp_info); @@ -576,7 +576,6 @@ void proto_register_h245(void) { void proto_reg_handoff_h245(void) { dissector_handle_t h245_handle; - rtp_handle = find_dissector("rtp"); rtcp_handle = find_dissector("rtcp"); data_handle = find_dissector("data"); h263_handle = find_dissector("h263data"); diff --git a/epan/dissectors/packet-ansi_a.c b/epan/dissectors/packet-ansi_a.c index 3841b57278..379e90e0be 100644 --- a/epan/dissectors/packet-ansi_a.c +++ b/epan/dissectors/packet-ansi_a.c @@ -720,7 +720,6 @@ static gint ett_vp_algs = -1; static expert_field ei_ansi_a_extraneous_data = EI_INIT; static char a_bigbuf[1024]; -static dissector_handle_t rtp_handle=NULL; static dissector_handle_t data_handle; static dissector_handle_t dtap_handle; static dissector_table_t is637_dissector_table; /* IS-637-A Transport Layer (SMS) */ @@ -8419,8 +8418,7 @@ elem_a2p_bearer_format(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, proto_item_set_len(item, curr_offset - orig_offset); - if (rtp_handle && - format_assigned && + if (format_assigned && (first_assigned_found == FALSE)) { key = wmem_new(wmem_file_scope(), gint); @@ -12413,7 +12411,6 @@ proto_reg_handoff_ansi_a(void) dtap_handle = create_dissector_handle(dissect_dtap, proto_a_dtap); sip_dtap_bsmap_handle = create_dissector_handle(dissect_sip_dtap_bsmap, proto_a_dtap); data_handle = find_dissector("data"); - rtp_handle = find_dissector("rtp"); dissector_add_uint("bsap.pdu_type", BSSAP_PDU_TYPE_BSMAP, bsmap_handle); dissector_add_uint("bsap.pdu_type", BSSAP_PDU_TYPE_DTAP, dtap_handle); diff --git a/epan/dissectors/packet-gsm_a_bssmap.c b/epan/dissectors/packet-gsm_a_bssmap.c index e13b3db6d7..959b72e598 100644 --- a/epan/dissectors/packet-gsm_a_bssmap.c +++ b/epan/dissectors/packet-gsm_a_bssmap.c @@ -664,7 +664,6 @@ static dissector_handle_t gsm_bsslap_handle = NULL; static dissector_handle_t dtap_handle; static dissector_handle_t bssgp_handle; static dissector_handle_t rrc_handle; -static dissector_handle_t rtp_handle; static proto_tree *g_tree; static guint8 cell_discriminator = 0x0f; /* tracks whether handover is to UMTS */ @@ -3871,7 +3870,7 @@ be_aoip_trans_lay_add(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo _U_, g break; } - if ((!pinfo->fd->flags.visited) && rtp_port != 0 && rtp_handle) { + if ((!pinfo->fd->flags.visited) && rtp_port != 0) { rtp_add_address(pinfo, &rtp_dst_addr, rtp_port, 0, "BSS MAP", pinfo->fd->num, FALSE, 0); rtcp_add_address(pinfo, &rtp_dst_addr, rtp_port+1, 0, "BSS MAP", pinfo->fd->num); } @@ -8139,7 +8138,6 @@ proto_reg_handoff_gsm_a_bssmap(void) gsm_bsslap_handle = find_dissector("gsm_bsslap"); bssgp_handle = find_dissector ("bssgp"); rrc_handle = find_dissector ("rrc"); - rtp_handle = find_dissector("rtp"); } diff --git a/epan/dissectors/packet-h245.c b/epan/dissectors/packet-h245.c index 7193507286..1fa486709b 100644 --- a/epan/dissectors/packet-h245.c +++ b/epan/dissectors/packet-h245.c @@ -68,7 +68,7 @@ #define PSNAME "H.245" #define PFNAME "h245" -static dissector_handle_t rtp_handle=NULL; + static dissector_handle_t rtcp_handle=NULL; static dissector_table_t nsp_object_dissector_table; static dissector_table_t nsp_h221_dissector_table; @@ -501,7 +501,7 @@ static void h245_setup_channels(packet_info *pinfo, channel_info_t *upcoming_cha /* DEBUG g_warning("h245_setup_channels media_addr.addr.type %u port %u",upcoming_channel_lcl->media_addr.addr.type, upcoming_channel_lcl->media_addr.port ); */ - if (upcoming_channel_lcl->media_addr.addr.type!=AT_NONE && upcoming_channel_lcl->media_addr.port!=0 && rtp_handle) { + if (upcoming_channel_lcl->media_addr.addr.type!=AT_NONE && upcoming_channel_lcl->media_addr.port!=0) { srtp_add_address(pinfo, &upcoming_channel_lcl->media_addr.addr, upcoming_channel_lcl->media_addr.port, 0, "H245", pinfo->fd->num, upcoming_channel_lcl->is_video , rtp_dyn_payload, dummy_srtp_info); @@ -20777,7 +20777,6 @@ void proto_register_h245(void) { void proto_reg_handoff_h245(void) { dissector_handle_t h245_handle; - rtp_handle = find_dissector("rtp"); rtcp_handle = find_dissector("rtcp"); data_handle = find_dissector("data"); h263_handle = find_dissector("h263data"); diff --git a/epan/dissectors/packet-rtp.c b/epan/dissectors/packet-rtp.c index e8adf5d89c..59cbae33f2 100644 --- a/epan/dissectors/packet-rtp.c +++ b/epan/dissectors/packet-rtp.c @@ -829,7 +829,7 @@ bluetooth_add_address(packet_info *pinfo, address *addr, * we've already done this work, so we don't need to do it * again. */ - if (pinfo->fd->flags.visited) + if ((pinfo->fd->flags.visited) || (rtp_handle == NULL)) { return; } @@ -913,7 +913,7 @@ srtp_add_address(packet_info *pinfo, address *addr, int port, int other_port, * we've already done this work, so we don't need to do it * again. */ - if (pinfo->fd->flags.visited) + if ((pinfo->fd->flags.visited) || (rtp_handle == NULL)) { return; } diff --git a/epan/dissectors/packet-sdp.c b/epan/dissectors/packet-sdp.c index ba08f5c592..25666a4ae4 100644 --- a/epan/dissectors/packet-sdp.c +++ b/epan/dissectors/packet-sdp.c @@ -75,7 +75,6 @@ #include "packet-h264.h" #include "packet-mp4ves.h" -static dissector_handle_t rtp_handle; static dissector_handle_t rtcp_handle; static dissector_handle_t sprt_handle; static dissector_handle_t msrp_handle; @@ -1837,8 +1836,7 @@ setup_sdp_transport(tvbuff_t *tvb, packet_info *pinfo, enum sdp_exchange_type ex if ((transport_info->media_port[n] != 0) && (transport_info->proto_bitmask[n] & (SDP_RTP_PROTO|SDP_SRTP_PROTO)) && (transport_info->proto_bitmask[n] & (SDP_IPv4|SDP_IPv6))) { - if (rtp_handle) { - if (transport_info->proto_bitmask[n] & SDP_SRTP_PROTO) { + if (transport_info->proto_bitmask[n] & SDP_SRTP_PROTO) { srtp_info = wmem_new0(wmem_file_scope(), struct srtp_info); if (transport_info->encryption_algorithm != SRTP_ENC_ALG_NOT_SET) { srtp_info->encryption_algorithm = transport_info->encryption_algorithm; @@ -1850,15 +1848,15 @@ setup_sdp_transport(tvbuff_t *tvb, packet_info *pinfo, enum sdp_exchange_type ex srtp_add_address(pinfo, &transport_info->src_addr[n], transport_info->media_port[n], 0, "SDP", pinfo->fd->num, (transport_info->proto_bitmask[n] & SDP_VIDEO) ? TRUE : FALSE, transport_info->media[n].rtp_dyn_payload, srtp_info); - } else { + } else { rtp_add_address(pinfo, &transport_info->src_addr[n], transport_info->media_port[n], 0, "SDP", pinfo->fd->num, (transport_info->proto_bitmask[n] & SDP_VIDEO) ? TRUE : FALSE, transport_info->media[n].rtp_dyn_payload); - } - transport_info->media[n].set_rtp = TRUE; - /* SPRT might use the same port... */ - current_rtp_port = transport_info->media_port[n]; } + transport_info->media[n].set_rtp = TRUE; + /* SPRT might use the same port... */ + current_rtp_port = transport_info->media_port[n]; + if (rtcp_handle) { if (transport_info->proto_bitmask[n] & SDP_SRTP_PROTO) { srtcp_add_address(pinfo, &transport_info->src_addr[n], transport_info->media_port[n]+1, 0, "SDP", pinfo->fd->num, srtp_info); @@ -2178,8 +2176,7 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) (transport_info->media_port[n] != 0) && (transport_info->proto_bitmask[n] & (SDP_RTP_PROTO|SDP_SRTP_PROTO)) && (transport_info->proto_bitmask[n] & (SDP_IPv4|SDP_IPv6))) { - if (rtp_handle) { - if (transport_info->proto_bitmask[n] & SDP_SRTP_PROTO) { + if (transport_info->proto_bitmask[n] & SDP_SRTP_PROTO) { srtp_info = wmem_new0(wmem_file_scope(), struct srtp_info); if (transport_info->encryption_algorithm != SRTP_ENC_ALG_NOT_SET) { srtp_info->encryption_algorithm = transport_info->encryption_algorithm; @@ -2190,15 +2187,15 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) srtp_add_address(pinfo, &transport_info->src_addr[n], transport_info->media_port[n], 0, "SDP", pinfo->fd->num, (transport_info->proto_bitmask[n] & SDP_VIDEO) ? TRUE : FALSE, transport_info->media[n].rtp_dyn_payload, srtp_info); - } else { + } else { rtp_add_address(pinfo, &transport_info->src_addr[n], transport_info->media_port[n], 0, "SDP", pinfo->fd->num, (transport_info->proto_bitmask[n] & SDP_VIDEO) ? TRUE : FALSE, transport_info->media[n].rtp_dyn_payload); - } - transport_info->media[n].set_rtp = TRUE; - /* SPRT might use the same port... */ - current_rtp_port = transport_info->media_port[n]; } + transport_info->media[n].set_rtp = TRUE; + /* SPRT might use the same port... */ + current_rtp_port = transport_info->media_port[n]; + if (rtcp_handle) { if (transport_info->proto_bitmask[n] & SDP_SRTP_PROTO) { srtcp_add_address(pinfo, &transport_info->src_addr[n], transport_info->media_port[n]+1, 0, "SDP", pinfo->fd->num, srtp_info); @@ -2734,7 +2731,6 @@ proto_reg_handoff_sdp(void) { dissector_handle_t sdp_handle; - rtp_handle = find_dissector("rtp"); rtcp_handle = find_dissector("rtcp"); msrp_handle = find_dissector("msrp"); sprt_handle = find_dissector("sprt"); diff --git a/epan/dissectors/packet-skinny.c b/epan/dissectors/packet-skinny.c index 5d36067a2d..acbb60ae4a 100644 --- a/epan/dissectors/packet-skinny.c +++ b/epan/dissectors/packet-skinny.c @@ -1374,8 +1374,6 @@ static gint ett_skinny_softKeyMap = -1; /* desegmentation of SCCP */ static gboolean skinny_desegment = TRUE; -static dissector_handle_t rtp_handle=NULL; - /* tap register id */ static int skinny_tap = -1; @@ -1629,22 +1627,24 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da case 0x0022: /* OpenReceiveChannelAck */ if (hdr_version == BASIC_MSG_TYPE) { + address src_addr; + guint32 ipv4_address; proto_tree_add_item(skinny_tree, hf_skinny_ORCStatus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item(skinny_tree, hf_skinny_ipAddress, tvb, offset+16, 4, ENC_BIG_ENDIAN); proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+20, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+24, 4, ENC_LITTLE_ENDIAN); - if (rtp_handle) { - address src_addr; - guint32 ipv4_address; - src_addr.type = AT_IPv4; - src_addr.len = 4; - src_addr.data = (guint8 *)&ipv4_address; - ipv4_address = tvb_get_ipv4(tvb, offset+16); - rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+20), 0, "Skinny", pinfo->fd->num, is_video, NULL); - } + src_addr.type = AT_IPv4; + src_addr.len = 4; + src_addr.data = (guint8 *)&ipv4_address; + ipv4_address = tvb_get_ipv4(tvb, offset+16); + rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+20), 0, "Skinny", pinfo->fd->num, is_video, NULL); + si->passThruId = tvb_get_letohl(tvb, offset+24); } else if (hdr_version == CM7_MSG_TYPE_A || hdr_version == CM7_MSG_TYPE_B || hdr_version == CM7_MSG_TYPE_C || hdr_version == CM7_MSG_TYPE_D) { + address src_addr; + guint32 ipv4_address; + proto_tree_add_item(skinny_tree, hf_skinny_ORCStatus, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); /*Assume the field of next 4 bytes is IP Version*/ ipversion = tvb_get_ntohl(tvb, offset+16); @@ -1657,16 +1657,13 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da } proto_tree_add_item(skinny_tree, hf_skinny_portNumber, tvb, offset+36, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+40, 4, ENC_LITTLE_ENDIAN); - if (rtp_handle) { - address src_addr; - guint32 ipv4_address; - src_addr.type = AT_IPv4; - src_addr.len = 4; - src_addr.data = (guint8 *)&ipv4_address; - ipv4_address = tvb_get_ipv4(tvb, offset+20); - rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+36), 0, "Skinny", pinfo->fd->num, is_video, NULL); - } + src_addr.type = AT_IPv4; + src_addr.len = 4; + src_addr.data = (guint8 *)&ipv4_address; + ipv4_address = tvb_get_ipv4(tvb, offset+20); + rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+36), 0, "Skinny", pinfo->fd->num, is_video, NULL); + si->passThruId = tvb_get_letohl(tvb, offset+40); } break; @@ -2298,6 +2295,9 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da case 0x008a: /* StartMediaTransmission */ if (hdr_version == BASIC_MSG_TYPE) { + address src_addr; + guint32 ipv4_address; + proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item(skinny_tree, hf_skinny_remoteIpAddr, tvb, offset+20, 4, ENC_BIG_ENDIAN); @@ -2308,20 +2308,20 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da proto_tree_add_item(skinny_tree, hf_skinny_silenceSuppression, tvb, offset+40, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item(skinny_tree, hf_skinny_maxFramesPerPacket, tvb, offset+44, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(skinny_tree, hf_skinny_g723BitRate, tvb, offset+48, 4, ENC_LITTLE_ENDIAN); - if (rtp_handle) { - address src_addr; - guint32 ipv4_address; - src_addr.type = AT_IPv4; - src_addr.len = 4; - src_addr.data = (char *)&ipv4_address; - ipv4_address = tvb_get_ipv4(tvb, offset+20); - rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+24), 0, "Skinny", pinfo->fd->num, is_video, NULL); - } + src_addr.type = AT_IPv4; + src_addr.len = 4; + src_addr.data = (char *)&ipv4_address; + ipv4_address = tvb_get_ipv4(tvb, offset+20); + rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+24), 0, "Skinny", pinfo->fd->num, is_video, NULL); + si->passThruId = tvb_get_letohl(tvb, offset+16); } else if (hdr_version == CM7_MSG_TYPE_A || hdr_version == CM7_MSG_TYPE_B || hdr_version == CM7_MSG_TYPE_C || hdr_version == CM7_MSG_TYPE_D) { + address src_addr; + guint32 ipv4_address; + proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+12, 4, ENC_LITTLE_ENDIAN); proto_tree_add_item(skinny_tree, hf_skinny_passThruPartyID, tvb, offset+16, 4, ENC_LITTLE_ENDIAN); /*Assume the field of next 4 bytes is IP Version*/ @@ -2344,16 +2344,13 @@ dissect_skinny_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* da /* proto_tree_add_item(skinny_tree, hf_skinny_conferenceID, tvb, offset+66, 4, ENC_LITTLE_ENDIAN); */ /* proto_tree_add_item(skinny_tree, hf_skinny_rtpDTMFPayload, tvb, offset+126, 4, ENC_LITTLE_ENDIAN); */ /* proto_tree_add_item(skinny_tree, hf_skinny_rtptimeout, tvb, offset+130, 4, ENC_LITTLE_ENDIAN); */ - if (rtp_handle) { - address src_addr; - guint32 ipv4_address; - src_addr.type = AT_IPv4; - src_addr.len = 4; - src_addr.data = (char *)&ipv4_address; - ipv4_address = tvb_get_ipv4(tvb, offset+24); - rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+40), 0, "Skinny", pinfo->fd->num, is_video, NULL); - } + src_addr.type = AT_IPv4; + src_addr.len = 4; + src_addr.data = (char *)&ipv4_address; + ipv4_address = tvb_get_ipv4(tvb, offset+24); + rtp_add_address(pinfo, &src_addr, tvb_get_letohl(tvb, offset+40), 0, "Skinny", pinfo->fd->num, is_video, NULL); + si->passThruId = tvb_get_letohl(tvb, offset+16); } break; @@ -5379,7 +5376,6 @@ proto_reg_handoff_skinny(void) dissector_handle_t skinny_handle; if (!skinny_prefs_initialized) { - rtp_handle = find_dissector("rtp"); /* Skinny content type and internet media type used by other dissectors are the same */ media_type_dissector_table = find_dissector_table("media_type"); skinny_handle = new_create_dissector_handle(dissect_skinny, proto_skinny); diff --git a/epan/dissectors/packet-uma.c b/epan/dissectors/packet-uma.c index a8006be187..44887ccc07 100644 --- a/epan/dissectors/packet-uma.c +++ b/epan/dissectors/packet-uma.c @@ -78,7 +78,6 @@ static dissector_handle_t uma_tcp_handle; static dissector_handle_t uma_udp_handle; static dissector_handle_t data_handle; static dissector_table_t bssap_pdu_type_table; -static dissector_handle_t rtp_handle; static dissector_handle_t rtcp_handle; static dissector_handle_t llc_handle; @@ -1528,8 +1527,8 @@ dissect_uma_IE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) proto_tree_add_item(urr_ie_tree, hf_uma_urr_RTP_port, tvb, ie_offset, 2, ENC_BIG_ENDIAN); /* TODO find out exactly which element contains IP addr */ /* Debug - proto_tree_add_text(urr_ie_tree,tvb,ie_offset,ie_len,"IP %u, Port %u Handle %u", - rtp_ipv4_address,RTP_UDP_port,rtp_handle); + proto_tree_add_text(urr_ie_tree,tvb,ie_offset,ie_len,"IP %u, Port %u, + rtp_ipv4_address,RTP_UDP_port); */ if(unc_ipv4_address!=0){ SET_ADDRESS(&src_addr, AT_IPv4, 4, &unc_ipv4_address); @@ -1537,7 +1536,7 @@ dissect_uma_IE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset) /* Set Source IP = own IP */ src_addr = pinfo->src; } - if((!pinfo->fd->flags.visited) && RTP_UDP_port!=0 && rtp_handle){ + if((!pinfo->fd->flags.visited) && RTP_UDP_port!=0){ rtp_add_address(pinfo, &src_addr, RTP_UDP_port, 0, "UMA", pinfo->fd->num, FALSE, 0); if ((RTP_UDP_port & 0x1) == 0){ /* Even number RTP port RTCP should follow on odd number */ @@ -1758,7 +1757,6 @@ proto_reg_handoff_uma(void) uma_udp_handle = find_dissector("umaudp"); dissector_add_handle("udp.port", uma_udp_handle); /* for "decode-as" */ data_handle = find_dissector("data"); - rtp_handle = find_dissector("rtp"); rtcp_handle = find_dissector("rtcp"); llc_handle = find_dissector("llcgprs"); bssap_pdu_type_table = find_dissector_table("bssap.pdu_type");