diff options
author | Tomas Kukosa <tomas.kukosa@siemens.com> | 2007-12-17 12:16:38 +0000 |
---|---|---|
committer | Tomas Kukosa <tomas.kukosa@siemens.com> | 2007-12-17 12:16:38 +0000 |
commit | b433163b3f45079bf73383c5b8783e5df45427f1 (patch) | |
tree | d797d4453cf4caa5dfcfce1ffa4882946f10d56b /asn1/h245 | |
parent | e36ade488a505b40e9a0c1be2a3122f78c5d36c4 (diff) |
- use structure instead of many global variables for channel setup
- move channel setup code to one function
- support RFC2198 dynamic payload type setup
svn path=/trunk/; revision=23898
Diffstat (limited to 'asn1/h245')
-rw-r--r-- | asn1/h245/h245.cnf | 191 | ||||
-rw-r--r-- | asn1/h245/packet-h245-template.c | 74 |
2 files changed, 126 insertions, 139 deletions
diff --git a/asn1/h245/h245.cnf b/asn1/h245/h245.cnf index 507fcafe4e..38c262cb58 100644 --- a/asn1/h245/h245.cnf +++ b/asn1/h245/h245.cnf @@ -2,8 +2,13 @@ # Copyright 2005 Anders Broman anders.broman[at]ericsson.com # $Id$ #---------------------------------------------------------------------------------------- + +#.OPT +PER +ALIGNED +#.END + #.EXPORTS -#---------------------------------------------------------------------------------------- T38FaxProfile DataProtocolCapability NO_PROT_PREFIX OpenLogicalChannel @@ -134,7 +139,6 @@ Rfc2733Format FECCapability/rfc2733Format FECMode/rfc2733Format #.END #---------------------------------------------------------------------------------------- #.FN_BODY OpenLogicalChannel/forwardLogicalChannelParameters - srtp_flag = FALSE; h245_lc_dissector = NULL; %(DEFAULT_BODY)s if(h223_lc_params_temp && h245_lc_dissector) @@ -643,7 +647,8 @@ if (h245_pi != NULL) if (gefx) gefx->id = standard_oid_str; if(strcmp(standard_oid_str,"0.0.8.235.0.3.76") == 0) { /* MIKEY */ - srtp_flag = TRUE; + if (upcoming_channel) + upcoming_channel->srtp_flag = TRUE; } if(!h245_lc_dissector && strcmp(standard_oid_str,"0.0.8.245.1.1.1") == 0) @@ -680,178 +685,106 @@ if (h245_pi != NULL) #---------------------------------------------------------------------------------------- #.FN_BODY UnicastAddress/iPAddress/network VAL_PTR = &value_tvb - tvbuff_t *value_tvb; %(DEFAULT_BODY)s - if ( media_channel ) - ipv4_address = tvb_get_ipv4(value_tvb, 0); - - if ( media_control_channel ) - rtcp_ipv4_address = tvb_get_ipv4(value_tvb, 0); + if (upcoming_channel && upcoming_channel->upcoming_addr) { + tvb_memcpy(value_tvb, upcoming_channel->upcoming_addr->addr_buf, 0, 4); + SET_ADDRESS(&upcoming_channel->upcoming_addr->addr, AT_IPv4, 4, upcoming_channel->upcoming_addr->addr_buf); + } #.END #---------------------------------------------------------------------------------------- #.FN_BODY UnicastAddress/iPAddress/tsapIdentifier VAL_PTR = &tsapIdentifier guint32 tsapIdentifier; %(DEFAULT_BODY)s - if ( media_channel ) - ipv4_port = tsapIdentifier; - - if ( media_control_channel ) - rtcp_ipv4_port = tsapIdentifier; + if (upcoming_channel && upcoming_channel->upcoming_addr) { + upcoming_channel->upcoming_addr->port = tsapIdentifier; + } #.END #---------------------------------------------------------------------------------------- #.FN_HDR H2250LogicalChannelAckParameters/mediaChannel - - - media_channel = TRUE; + if (upcoming_channel) + upcoming_channel->upcoming_addr = &upcoming_channel->media_addr; #.END -#---------------------------------------------------------------------------------------- -#.FN_HDR H2250LogicalChannelParameters/mediaChannel - - - media_channel = TRUE; +#.FN_FTR H2250LogicalChannelAckParameters/mediaChannel + if (upcoming_channel) + upcoming_channel->upcoming_addr = NULL; #.END #---------------------------------------------------------------------------------------- -#.FN_HDR H2250LogicalChannelAckParameters/mediaControlChannel - - - media_control_channel = TRUE; +#.FN_HDR H2250LogicalChannelParameters/mediaChannel + if (upcoming_channel) + upcoming_channel->upcoming_addr = &upcoming_channel->media_addr; #.END -#---------------------------------------------------------------------------------------- -#.FN_HDR H2250LogicalChannelParameters/mediaControlChannel - - - media_control_channel = TRUE; +#.FN_FTR H2250LogicalChannelParameters/mediaChannel + if (upcoming_channel) + upcoming_channel->upcoming_addr = NULL; #.END #---------------------------------------------------------------------------------------- -#.FN_FTR H2250LogicalChannelAckParameters/mediaChannel - - - media_channel = FALSE; +#.FN_HDR H2250LogicalChannelAckParameters/mediaControlChannel + if (upcoming_channel) + upcoming_channel->upcoming_addr = &upcoming_channel->media_control_addr; #.END -#---------------------------------------------------------------------------------------- #.FN_FTR H2250LogicalChannelAckParameters/mediaControlChannel - - - media_control_channel = FALSE; + if (upcoming_channel) + upcoming_channel->upcoming_addr = NULL; #.END #---------------------------------------------------------------------------------------- -#.FN_FTR H2250LogicalChannelParameters/mediaChannel - - - media_channel = FALSE; +#.FN_HDR H2250LogicalChannelParameters/mediaControlChannel + if (upcoming_channel) + upcoming_channel->upcoming_addr = &upcoming_channel->media_control_addr; #.END -#---------------------------------------------------------------------------------------- #.FN_FTR H2250LogicalChannelParameters/mediaControlChannel - - - media_control_channel = FALSE; + if (upcoming_channel) + upcoming_channel->upcoming_addr = NULL; #.END #---------------------------------------------------------------------------------------- #.FN_HDR OpenLogicalChannelAck/forwardMultiplexAckParameters - - media_channel = FALSE; - media_control_channel = FALSE; + upcoming_channel = ep_alloc0(sizeof(channel_info_t)); #.END #---------------------------------------------------------------------------------------- #.FN_FTR OpenLogicalChannelAck/forwardMultiplexAckParameters if (!actx->pinfo->fd->flags.visited) { - if (codec_type && strcmp(codec_type, "t38fax")==0) { - if(ipv4_address!=0 && ipv4_port!=0 && t38_handle){ - address src_addr; - - src_addr.type=AT_IPv4; - src_addr.len=4; - src_addr.data=(guint8*)&ipv4_address; - - t38_add_address(actx->pinfo, &src_addr, ipv4_port, 0, "H245", actx->pinfo->fd->num); - } - } else { - if(ipv4_address!=0 && ipv4_port!=0 && rtp_handle){ - address src_addr; - - src_addr.type=AT_IPv4; - src_addr.len=4; - src_addr.data=(guint8*)&ipv4_address; - - if (srtp_flag) { - struct srtp_info *dummy_srtp_info = se_alloc0(sizeof(struct srtp_info)); - srtp_add_address(actx->pinfo, &src_addr, ipv4_port, 0, "H245", actx->pinfo->fd->num, NULL, dummy_srtp_info); - } else { - rtp_add_address(actx->pinfo, &src_addr, ipv4_port, 0, "H245", actx->pinfo->fd->num, NULL); - } - } - if(rtcp_ipv4_address!=0 && rtcp_ipv4_port!=0 && rtcp_handle){ - address src_addr; - - src_addr.type=AT_IPv4; - src_addr.len=4; - src_addr.data=(guint8*)&rtcp_ipv4_address; - - rtcp_add_address(actx->pinfo, &src_addr, rtcp_ipv4_port, 0, "H245", actx->pinfo->fd->num); - } - } + h245_setup_channels(actx->pinfo, upcoming_channel); } + upcoming_channel = NULL; #.END #---------------------------------------------------------------------------------------- #.FN_HDR OpenLogicalChannel/reverseLogicalChannelParameters - srtp_flag = FALSE; - -#.END -#.FN_HDR OpenLogicalChannel/reverseLogicalChannelParameters/multiplexParameters - - media_channel = FALSE; - media_control_channel = FALSE; + upcoming_channel = ep_alloc0(sizeof(channel_info_t)); #.END -#---------------------------------------------------------------------------------------- -#.FN_FTR OpenLogicalChannel/reverseLogicalChannelParameters/multiplexParameters +#.FN_FTR OpenLogicalChannel/reverseLogicalChannelParameters if (!actx->pinfo->fd->flags.visited) { - if (codec_type && (strcmp(codec_type, "t38fax")==0)) { - if(ipv4_address!=0 && ipv4_port!=0 && t38_handle){ - address src_addr; - - src_addr.type=AT_IPv4; - src_addr.len=4; - src_addr.data=(guint8*)&ipv4_address; - - t38_add_address(actx->pinfo, &src_addr, ipv4_port, 0, "H245", actx->pinfo->fd->num); - } - } else { - if(ipv4_address!=0 && ipv4_port!=0 && rtp_handle){ - address src_addr; - - src_addr.type=AT_IPv4; - src_addr.len=4; - src_addr.data=(guint8*)&ipv4_address; - - if (srtp_flag) { - struct srtp_info *dummy_srtp_info = se_alloc0(sizeof(struct srtp_info)); - srtp_add_address(actx->pinfo, &src_addr, ipv4_port, 0, "H245", actx->pinfo->fd->num, NULL, dummy_srtp_info); - } else { - rtp_add_address(actx->pinfo, &src_addr, ipv4_port, 0, "H245", actx->pinfo->fd->num, NULL); - } - } - if(rtcp_ipv4_address!=0 && rtcp_ipv4_port!=0 && rtcp_handle){ - address src_addr; - - src_addr.type=AT_IPv4; - src_addr.len=4; - src_addr.data=(guint8*)&rtcp_ipv4_address; - - rtcp_add_address(actx->pinfo, &src_addr, rtcp_ipv4_port, 0, "H245", actx->pinfo->fd->num); - } - } + h245_setup_channels(actx->pinfo, upcoming_channel); } + upcoming_channel = NULL; +#.END + +#--- RTPPayloadType --------------------------------------------------------------------- +#.FN_HDR RTPPayloadType + rfc_number = 0; +#.END + +#.FN_PARS RTPPayloadType/payloadDescriptor/rfc-number + VAL_PTR = &rfc_number +#.END + +#.FN_BODY RTPPayloadType/payloadType VAL_PTR = &pt + unsigned int pt; + +%(DEFAULT_BODY)s + + if ((rfc_number == 2198) && upcoming_channel) { + upcoming_channel->rfc2198 = pt; + } #.END #--- NonStandardParameter --------------------------------------------------------------- diff --git a/asn1/h245/packet-h245-template.c b/asn1/h245/packet-h245-template.c index 8d1d67e979..1e19c3ecc2 100644 --- a/asn1/h245/packet-h245-template.c +++ b/asn1/h245/packet-h245-template.c @@ -78,9 +78,7 @@ static void init_h245_packet_info(h245_packet_info *pi); static int hf_h245_pdu_type = -1; static int hf_h245Manufacturer = -1; static int h245_tap = -1; -static int ett_h245 = -1; static int h245dg_tap = -1; -static int ett_h245_returnedFunction = -1; h245_packet_info *h245_pi=NULL; static gboolean h245_reassembly = TRUE; @@ -206,15 +204,24 @@ static const value_string h245_AudioCapability_short_vals[] = { /* To put the codec type only in COL_INFO when an OLC is read */ - const char* codec_type = NULL; -static guint32 ipv4_address; -static guint32 ipv4_port; -static guint32 rtcp_ipv4_address; -static guint32 rtcp_ipv4_port; -static gboolean media_channel; -static gboolean media_control_channel; -static gboolean srtp_flag; +static guint32 rfc_number; + +typedef struct _unicast_addr_t { + address addr; + guint8 addr_buf[16]; + guint32 port; +} unicast_addr_t; + +typedef struct _channel_info_t { + unicast_addr_t *upcoming_addr; + unicast_addr_t media_addr; + unicast_addr_t media_control_addr; + unsigned int rfc2198; + gboolean srtp_flag; +} channel_info_t; + +static channel_info_t *upcoming_channel = NULL; /* NonStandardParameter */ static const char *nsiOID; @@ -225,6 +232,7 @@ static guint32 manufacturerCode; static const value_string h245_RFC_number_vals[] = { { 2190, "RFC 2190 - H.263 Video Streams" }, + { 2198, "RFC 2198 - RTP Payload for Redundant Audio Data" }, { 2429, "RFC 2429 - 1998 Version of ITU-T Rec. H.263 Video (H.263+)" }, { 3016, "RFC 3016 - RTP Payload Format for MPEG-4 Audio/Visual Streams" }, { 3267, "RFC 3267 - Adaptive Multi-Rate (AMR) and Adaptive Multi-Rate Wideband (AMR-WB)" }, @@ -277,11 +285,57 @@ void h245_set_h223_add_lc_handle( h223_add_lc_handle_t handle ) h223_add_lc_handle = handle; } +static void h245_setup_channels(packet_info *pinfo, channel_info_t *upcoming_channel) +{ + gint *key; + GHashTable *rtp_dyn_payload = NULL; + + if (!upcoming_channel) return; + + if (codec_type && (strcmp(codec_type, "t38fax")==0)) { + if(upcoming_channel->media_addr.addr.type!=AT_NONE && upcoming_channel->media_addr.port!=0 && t38_handle){ + t38_add_address(pinfo, &upcoming_channel->media_addr.addr, + upcoming_channel->media_addr.port, 0, + "H245", pinfo->fd->num); + } + } else { + if (upcoming_channel->rfc2198 > 0) { +#if GLIB_MAJOR_VERSION < 2 + rtp_dyn_payload = g_hash_table_new( g_int_hash, g_int_equal); +#else + rtp_dyn_payload = g_hash_table_new_full( g_int_hash, g_int_equal, g_free, g_free); +#endif + key = g_malloc(sizeof(gint)); + *key = upcoming_channel->rfc2198; + g_hash_table_insert(rtp_dyn_payload, key, g_strdup("red")); + } + if (upcoming_channel->media_addr.addr.type!=AT_NONE && upcoming_channel->media_addr.port!=0 && rtp_handle){ + if (upcoming_channel->srtp_flag) { + struct srtp_info *dummy_srtp_info = se_alloc0(sizeof(struct srtp_info)); + srtp_add_address(pinfo, &upcoming_channel->media_addr.addr, + upcoming_channel->media_addr.port, 0, + "H245", pinfo->fd->num, rtp_dyn_payload, dummy_srtp_info); + } else { + rtp_add_address(pinfo, &upcoming_channel->media_addr.addr, + upcoming_channel->media_addr.port, 0, + "H245", pinfo->fd->num, rtp_dyn_payload); + } + } + if(upcoming_channel->media_control_addr.addr.type!=AT_NONE && upcoming_channel->media_control_addr.port!=0 && rtcp_handle){ + rtcp_add_address(pinfo, &upcoming_channel->media_control_addr.addr, + upcoming_channel->media_control_addr.port, 0, + "H245", pinfo->fd->num); + } + } +} + /* Initialize the protocol and registered fields */ int proto_h245 = -1; #include "packet-h245-hf.c" /* Initialize the subtree pointers */ +static int ett_h245 = -1; +static int ett_h245_returnedFunction = -1; #include "packet-h245-ett.c" /* Forward declarations */ |