aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-uma.c
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2005-04-15 07:50:19 +0000
committerAnders Broman <anders.broman@ericsson.com>2005-04-15 07:50:19 +0000
commit191d38789c12a49b215d873093bb812cb92a3a9e (patch)
tree3929f28ead802dfec2cb05cbf84e350e55b14382 /epan/dissectors/packet-uma.c
parent0d7fcee40d865501a2240c7521071ec904bbdc6a (diff)
Setr up conversations for RTP and RTCP.
svn path=/trunk/; revision=14085
Diffstat (limited to 'epan/dissectors/packet-uma.c')
-rw-r--r--epan/dissectors/packet-uma.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/epan/dissectors/packet-uma.c b/epan/dissectors/packet-uma.c
index 0ab79b62d2..d4c75cf0fd 100644
--- a/epan/dissectors/packet-uma.c
+++ b/epan/dissectors/packet-uma.c
@@ -69,10 +69,14 @@
#include <epan/packet.h>
#include "prefs.h"
#include "packet-bssap.h"
+#include "packet-rtp.h"
+#include "packet-rtcp.h"
static dissector_handle_t uma_tcp_handle = NULL;
static dissector_handle_t data_handle = NULL;
static dissector_table_t bssap_pdu_type_table=NULL;
+static dissector_handle_t rtp_handle = NULL;
+static dissector_handle_t rtcp_handle = NULL;
/* Initialize the protocol and registered fields */
static int proto_uma = -1;
@@ -224,6 +228,8 @@ static guint gbl_umaTcpPort1 = 14001;
/* Global variables */
guint32 sgw_ipv4_address;
guint32 unc_ipv4_address;
+ guint32 rtp_ipv4_address;
+ guint32 rtcp_ipv4_address;
guint32 GPRS_user_data_ipv4_address;
/*
@@ -1655,12 +1661,14 @@ dissect_urr_IE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
*/
octet = tvb_get_guint8(tvb,ie_offset);
proto_tree_add_item(urr_ie_tree, hf_uma_urr_IP_Address_type, tvb, ie_offset, 1, FALSE);
+ if (ie_len > 4 )
ie_offset++;
if ( octet == 0x57 ){ /* IPv6 */
}else{ /* All other values shall be interpreted as Ipv4 address in this version of the protocol.*/
tvb_memcpy(tvb, (char *)&unc_ipv4_address, ie_offset, 4);
proto_tree_add_ipv4(urr_ie_tree, hf_uma_urr_unc_ipv4, tvb, ie_offset, 4, unc_ipv4_address);
+ rtp_ipv4_address = unc_ipv4_address;
}
break;
@@ -1729,10 +1737,39 @@ dissect_urr_IE(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset)
case 104: /* RTP UDP port */
RTP_UDP_port = tvb_get_ntohs(tvb,ie_offset);
proto_tree_add_item(urr_ie_tree, hf_uma_urr_RTP_port, tvb, ie_offset, 2, FALSE);
+ /* 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);
+ */
+
+ if((!pinfo->fd->flags.visited) && rtp_ipv4_address!=0 && RTP_UDP_port!=0 && rtp_handle){
+ address src_addr;
+
+ src_addr.type=AT_IPv4;
+ src_addr.len=4;
+ src_addr.data=(char *)&rtp_ipv4_address;
+
+ rtp_add_address(pinfo, &src_addr, RTP_UDP_port, 0, "UMA", pinfo->fd->num, 0);
+ if ((RTP_UDP_port & 0x1) == 0){ /* Even number RTP port RTCP should follow on odd number */
+ RTCP_UDP_port = RTP_UDP_port + 1;
+ rtcp_add_address(pinfo, &src_addr, RTCP_UDP_port, 0, "UMA", pinfo->fd->num);
+ }
+ }
break;
case 105: /* RTCP UDP port */
RTCP_UDP_port = tvb_get_ntohs(tvb,ie_offset);
proto_tree_add_item(urr_ie_tree, hf_uma_urr_RTCP_port, tvb, ie_offset, 2, FALSE);
+ /* TODO find out exactly which element contains IP addr */
+ if((!pinfo->fd->flags.visited) && rtcp_ipv4_address!=0 && RTCP_UDP_port!=0 && rtcp_handle){
+ address src_addr;
+
+ src_addr.type=AT_IPv4;
+ src_addr.len=4;
+ src_addr.data=(char *)&rtcp_ipv4_address;
+
+ rtcp_add_address(pinfo, &src_addr, RTCP_UDP_port, 0, "UMA", pinfo->fd->num);
+ }
break;
default:
proto_tree_add_text(urr_ie_tree,tvb,ie_offset,ie_len,"DATA");
@@ -1834,6 +1871,9 @@ proto_reg_handoff_uma(void)
TcpPort1=gbl_umaTcpPort1;
dissector_add("tcp.port", gbl_umaTcpPort1, uma_tcp_handle);
data_handle = find_dissector("data");
+ rtp_handle = find_dissector("rtp");
+ rtcp_handle = find_dissector("rtcp");
+
}