diff options
Diffstat (limited to 'ui/rtp_stream_id.c')
-rw-r--r-- | ui/rtp_stream_id.c | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/ui/rtp_stream_id.c b/ui/rtp_stream_id.c new file mode 100644 index 0000000..2c00a5e --- /dev/null +++ b/ui/rtp_stream_id.c @@ -0,0 +1,188 @@ +/* rtp_stream_id.c + * RTP stream id functions for Wireshark + * + * Copyright 2003, Alcatel Business Systems + * By Lars Ruoff <lars.ruoff@gmx.net> + * + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "config.h" + +#include <stdlib.h> +#include <string.h> + +#include "file.h" + +#include "ui/rtp_stream_id.h" +#include "epan/dissectors/packet-rtp.h" + +/****************************************************************************/ +/* rtpstream id functions */ +/****************************************************************************/ + +/****************************************************************************/ +/* deep copy of id */ +void rtpstream_id_copy(const rtpstream_id_t *src, rtpstream_id_t *dest) +{ + copy_address(&(dest->src_addr), &(src->src_addr)); + dest->src_port=src->src_port; + copy_address(&(dest->dst_addr), &(src->dst_addr)); + dest->dst_port=src->dst_port; + dest->ssrc=src->ssrc; +} + +/****************************************************************************/ +/* deep copy of id from packet_info */ +void rtpstream_id_copy_pinfo(const packet_info *pinfo, rtpstream_id_t *dest, gboolean swap_src_dst) +{ + if (!swap_src_dst) + { + copy_address(&(dest->src_addr), &(pinfo->src)); + dest->src_port=pinfo->srcport; + copy_address(&(dest->dst_addr), &(pinfo->dst)); + dest->dst_port=pinfo->destport; + } + else + { + copy_address(&(dest->src_addr), &(pinfo->dst)); + dest->src_port=pinfo->destport; + copy_address(&(dest->dst_addr), &(pinfo->src)); + dest->dst_port=pinfo->srcport; + } +} + +/****************************************************************************/ +/* shallow copy from packet_info to id */ +void rtpstream_id_copy_pinfo_shallow(const packet_info *pinfo, rtpstream_id_t *dest, gboolean swap_src_dst) +{ + if (!swap_src_dst) + { + copy_address_shallow(&(dest->src_addr), &(pinfo->src)); + dest->src_port=pinfo->srcport; + copy_address_shallow(&(dest->dst_addr), &(pinfo->dst)); + dest->dst_port=pinfo->destport; + } + else + { + copy_address_shallow(&(dest->src_addr), &(pinfo->dst)); + dest->src_port=pinfo->destport; + copy_address_shallow(&(dest->dst_addr), &(pinfo->src)); + dest->dst_port=pinfo->srcport; + } +} +/****************************************************************************/ +/* free memory allocated for id */ +void rtpstream_id_free(rtpstream_id_t *id) +{ + free_address(&(id->src_addr)); + free_address(&(id->dst_addr)); + memset(id, 0, sizeof(*id)); +} + +/****************************************************************************/ +/* convert rtpstream_id_t to hash */ +guint rtpstream_id_to_hash(const rtpstream_id_t *id) +{ + guint hash = 0; + + if (!id) { return 0; } + /* XOR of: */ + /* SRC PORT | DST_PORT */ + /* SSRC */ + /* SRC ADDR */ + /* DST ADDR */ + hash ^= id->src_port | id->dst_port << 16; + hash ^= id->ssrc; + hash = add_address_to_hash(hash, &id->src_addr); + hash = add_address_to_hash(hash, &id->dst_addr); + + return hash; +} + +/****************************************************************************/ +/* compare two ids by flags */ +gboolean rtpstream_id_equal(const rtpstream_id_t *id1, const rtpstream_id_t *id2, guint flags) +{ + if (addresses_equal(&(id1->src_addr), &(id2->src_addr)) + && id1->src_port == id2->src_port + && addresses_equal(&(id1->dst_addr), &(id2->dst_addr)) + && id1->dst_port == id2->dst_port) + { + gboolean equal = TRUE; + + if ((flags & RTPSTREAM_ID_EQUAL_SSRC) + && id1->ssrc != id2->ssrc) + { + equal = FALSE; + } + + return equal; + } + + return FALSE; +} + +/****************************************************************************/ +/* compare an rtpstream id address and ports with pinfo */ +gboolean rtpstream_id_equal_pinfo(const rtpstream_id_t *id, const packet_info *pinfo, bool swap_src_dst) +{ + if (!swap_src_dst) { + if (addresses_equal(&(id->src_addr), &(pinfo->src)) + && id->src_port == pinfo->srcport + && addresses_equal(&(id->dst_addr), &(pinfo->dst)) + && id->dst_port == pinfo->destport) + { + return TRUE; + } + } else { + if (addresses_equal(&(id->src_addr), &(pinfo->dst)) + && id->src_port == pinfo->destport + && addresses_equal(&(id->dst_addr), &(pinfo->src)) + && id->dst_port == pinfo->srcport) + { + return TRUE; + } + } + + return FALSE; +} +/****************************************************************************/ +/* compare two ids, one in pinfo */ +gboolean rtpstream_id_equal_pinfo_rtp_info(const rtpstream_id_t *id, const packet_info *pinfo, const struct _rtp_info *rtp_info) +{ + if (addresses_equal(&(id->src_addr), &(pinfo->src)) + && id->src_port == pinfo->srcport + && addresses_equal(&(id->dst_addr), &(pinfo->dst)) + && id->dst_port == pinfo->destport + && id->ssrc == rtp_info->info_sync_src) + { + return TRUE; + } + + return FALSE; +} + +/****************************************************************************/ +/* convert packet_info and _rtp_info to hash */ +guint pinfo_rtp_info_to_hash(const packet_info *pinfo, const struct _rtp_info *rtp_info) +{ + guint hash = 0; + + if (!pinfo || !rtp_info) { return 0; } + /* XOR of: */ + /* SRC PORT | DST_PORT */ + /* SSRC */ + /* SRC ADDR */ + /* DST ADDR */ + hash ^= pinfo->srcport | pinfo->destport << 16; + hash ^= rtp_info->info_sync_src; + hash = add_address_to_hash(hash, &pinfo->src); + hash = add_address_to_hash(hash, &pinfo->dst); + + return hash; +} |