diff options
Diffstat (limited to 'epan/dissectors/packet-sdp.c')
-rw-r--r-- | epan/dissectors/packet-sdp.c | 1986 |
1 files changed, 1034 insertions, 952 deletions
diff --git a/epan/dissectors/packet-sdp.c b/epan/dissectors/packet-sdp.c index ab1b081070..855699906c 100644 --- a/epan/dissectors/packet-sdp.c +++ b/epan/dissectors/packet-sdp.c @@ -1,4 +1,4 @@ -/* packet-sdp.c + /* packet-sdp.c * Routines for SDP packet disassembly (RFC 2327) * * Jason Lango <jal@netapp.com> @@ -31,6 +31,7 @@ #endif #include <stdlib.h> +#include <string.h> #include <ctype.h> #ifdef HAVE_SYS_TYPES_H @@ -78,12 +79,12 @@ #include "packet-h264.h" #include "packet-mp4ves.h" -static dissector_handle_t rtp_handle = NULL; -static dissector_handle_t rtcp_handle = NULL; -static dissector_handle_t t38_handle = NULL; -static dissector_handle_t msrp_handle = NULL; -static dissector_handle_t h264_handle = NULL; -static dissector_handle_t mp4ves_handle = NULL; +static dissector_handle_t rtp_handle; +static dissector_handle_t rtcp_handle; +static dissector_handle_t t38_handle; +static dissector_handle_t msrp_handle; +static dissector_handle_t h264_handle; +static dissector_handle_t mp4ves_handle; static int sdp_tap = -1; @@ -214,20 +215,20 @@ typedef struct { } transport_media_pt_t; typedef struct { - char *connection_address; - char *connection_type; - char *media_type; - char *encoding_name[SDP_NO_OF_PT]; - int sample_rate[SDP_NO_OF_PT]; - char *media_port[SDP_MAX_RTP_CHANNELS]; - char *media_proto[SDP_MAX_RTP_CHANNELS]; + char *connection_address; + char *connection_type; + char *media_type; + char *encoding_name[SDP_NO_OF_PT]; + int sample_rate[SDP_NO_OF_PT]; + char *media_port[SDP_MAX_RTP_CHANNELS]; + char *media_proto[SDP_MAX_RTP_CHANNELS]; transport_media_pt_t media[SDP_MAX_RTP_CHANNELS]; - gint8 media_count; + gint8 media_count; /* SRTP related info */ - guint encryption_algorithm; - guint auth_algorithm; - guint mki_len; /* number of octets used for the MKI in the RTP payload */ - guint auth_tag_len; /* number of octets used for the Auth Tag in the RTP payload */ + guint encryption_algorithm; + guint auth_algorithm; + guint mki_len; /* number of octets used for the MKI in the RTP payload */ + guint auth_tag_len; /* number of octets used for the Auth Tag in the RTP payload */ } transport_info_t; @@ -265,7 +266,7 @@ static void dissect_sdp_encryption_key(tvbuff_t *tvb, proto_item * ti); static void dissect_sdp_session_attribute(tvbuff_t *tvb, packet_info *pinfo, proto_item *ti); static void dissect_sdp_media(tvbuff_t *tvb, proto_item *ti, transport_info_t *transport_info); -static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto_item *ti, int length,transport_info_t *transport_info); +static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto_item *ti, int length, transport_info_t *transport_info); static void free_encoding_name_str (void *ptr) { @@ -279,8 +280,8 @@ static void free_encoding_name_str (void *ptr) static void dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - proto_tree *sdp_tree; - proto_item *ti, *sub_ti; + proto_tree *sdp_tree; + proto_item *ti, *sub_ti; gint offset = 0; gint next_offset; int linelen; @@ -289,60 +290,60 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) guchar delim; int datalen; int tokenoffset; - int hf = -1; - char *string; + int hf = -1; + char *string; address src_addr; transport_info_t transport_info; - guint32 port=0; - gboolean is_rtp=FALSE; - gboolean is_srtp=FALSE; - gboolean is_t38=FALSE; - gboolean is_msrp=FALSE; - gboolean set_rtp=FALSE; - gboolean is_ipv4_addr=FALSE; - gboolean is_ipv6_addr=FALSE; - gboolean is_video=FALSE; + guint32 port = 0; + gboolean is_rtp = FALSE; + gboolean is_srtp = FALSE; + gboolean is_t38 = FALSE; + gboolean is_msrp = FALSE; + gboolean set_rtp = FALSE; + gboolean is_ipv4_addr = FALSE; + gboolean is_ipv6_addr = FALSE; + gboolean is_video = FALSE; guint32 ipaddr[4]; - gint n,i; - sdp_packet_info *sdp_pi; - gchar *unknown_encoding = ep_strdup("Unknown"); + gint n, i; + sdp_packet_info *sdp_pi; + gchar *unknown_encoding = ep_strdup("Unknown"); struct srtp_info *srtp_info = NULL; /* Initialise packet info for passing to tap */ - sdp_pi = ep_alloc(sizeof(sdp_packet_info)); + sdp_pi = ep_alloc(sizeof (sdp_packet_info)); sdp_pi->summary_str[0] = '\0'; /* Initialise RTP channel info */ - transport_info.connection_address=NULL; - transport_info.connection_type=NULL; - transport_info.media_type=NULL; + transport_info.connection_address = NULL; + transport_info.connection_type = NULL; + transport_info.media_type = NULL; /* Initialise SRTP crypto info XXX note currently we only handle one crypto line in the SDP * We should probably handle offer/answer and session updates etc(SIP) quite possibly the whole handling of * seting up the RTP conversations should be done by the signaling protocol(s) calling the SDP dissector * and the SDP dissector just provide the relevant data. */ - transport_info.encryption_algorithm = SRTP_ENC_ALG_NOT_SET; - transport_info.auth_algorithm = SRTP_AUTH_ALG_NONE; - transport_info.mki_len = 0; /* number of octets used for the MKI in the RTP payload */ - transport_info.auth_tag_len = 0; /* number of octets used for the Auth Tag in the RTP payload */ + transport_info.encryption_algorithm = SRTP_ENC_ALG_NOT_SET; + transport_info.auth_algorithm = SRTP_AUTH_ALG_NONE; + transport_info.mki_len = 0; /* number of octets used for the MKI in the RTP payload */ + transport_info.auth_tag_len = 0; /* number of octets used for the Auth Tag in the RTP payload */ - for (n=0; n < SDP_NO_OF_PT; n++){ - transport_info.encoding_name[n]=unknown_encoding; - transport_info.sample_rate[n] = 0; + for (n = 0; n < SDP_NO_OF_PT; n++) { + transport_info.encoding_name[n] = unknown_encoding; + transport_info.sample_rate[n] = 0; } - for (n=0; n < SDP_MAX_RTP_CHANNELS; n++) + for (n = 0; n < SDP_MAX_RTP_CHANNELS; n++) { - transport_info.media_port[n]=NULL; - transport_info.media_proto[n]=NULL; + transport_info.media_port[n] = NULL; + transport_info.media_proto[n] = NULL; transport_info.media[n].pt_count = 0; transport_info.media[n].rtp_dyn_payload = - g_hash_table_new_full( g_int_hash, g_int_equal, g_free, free_encoding_name_str); + g_hash_table_new_full(g_int_hash, g_int_equal, g_free, free_encoding_name_str); } transport_info.media_count = 0; @@ -387,8 +388,8 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if (linelen < 2) break; - type = tvb_get_guint8(tvb,offset); - delim = tvb_get_guint8(tvb,offset + 1); + type = tvb_get_guint8(tvb, offset); + delim = tvb_get_guint8(tvb, offset + 1); if (delim != '=') { proto_item *ti2 = proto_tree_add_item(sdp_tree, hf_invalid, tvb, offset, linelen, ENC_ASCII|ENC_NA); expert_add_info_format(pinfo, ti2, PI_MALFORMED, PI_NOTE, @@ -413,8 +414,7 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) case 'i': if (in_media_description) { hf = hf_media_title; - } - else{ + } else { hf = hf_session_info; } break; @@ -449,8 +449,7 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) case 'a': if (in_media_description) { hf = hf_media_attribute; - } - else{ + } else { hf = hf_session_attribute; } break; @@ -468,12 +467,12 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) linelen - tokenoffset); sub_ti = proto_tree_add_string(sdp_tree, hf, tvb, offset, linelen, string); - call_sdp_subdissector(tvb_new_subset(tvb,offset+tokenoffset, - linelen-tokenoffset, - linelen-tokenoffset), - pinfo, - hf,sub_ti,linelen-tokenoffset,&transport_info), - offset = next_offset; + call_sdp_subdissector(tvb_new_subset(tvb, offset + tokenoffset, + linelen - tokenoffset, + linelen - tokenoffset), + pinfo, + hf, sub_ti, linelen-tokenoffset,&transport_info), + offset = next_offset; } @@ -485,62 +484,61 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) for (n = 0; n < transport_info.media_count; n++) { - if(transport_info.media_port[n]!=NULL) { + if (transport_info.media_port[n] != NULL) { port = atol(transport_info.media_port[n]); } - if(transport_info.media_proto[n]!=NULL) { + if (transport_info.media_proto[n] != NULL) { /* Check if media protocol is RTP * and stream decoding is enabled in preferences */ - if(global_sdp_establish_conversation){ - /* Check if media protocol is RTP */ - is_rtp = (strcmp(transport_info.media_proto[n],"RTP/AVP")==0); - /* Check if media protocol is SRTP */ - is_srtp = (strcmp(transport_info.media_proto[n],"RTP/SAVP")==0); - /* Check if media protocol is T38 */ - is_t38 = ( (strcmp(transport_info.media_proto[n],"UDPTL")==0) || - (strcmp(transport_info.media_proto[n],"udptl")==0) ); - /* Check if media protocol is MSRP/TCP */ - is_msrp = (strcmp(transport_info.media_proto[n],"msrp/tcp")==0); - } + if (global_sdp_establish_conversation) { + /* Check if media protocol is RTP */ + is_rtp = (strcmp(transport_info.media_proto[n],"RTP/AVP") == 0); + /* Check if media protocol is SRTP */ + is_srtp = (strcmp(transport_info.media_proto[n],"RTP/SAVP") == 0); + /* Check if media protocol is T38 */ + is_t38 = ((strcmp(transport_info.media_proto[n],"UDPTL") == 0) || + (strcmp(transport_info.media_proto[n],"udptl") == 0)); + /* Check if media protocol is MSRP/TCP */ + is_msrp = (strcmp(transport_info.media_proto[n],"msrp/tcp") == 0); + } } - if(transport_info.connection_address!=NULL) { - if(transport_info.connection_type!=NULL) { - if (strcmp(transport_info.connection_type,"IP4")==0) { - if(inet_pton(AF_INET,transport_info.connection_address, &ipaddr)==1 ) { + if (transport_info.connection_address != NULL) { + if (transport_info.connection_type != NULL) { + if (strcmp(transport_info.connection_type, "IP4") == 0) { + if (inet_pton(AF_INET, transport_info.connection_address, &ipaddr) == 1) { /* connection_address could be converted to a valid ipv4 address*/ - is_ipv4_addr=TRUE; - src_addr.type=AT_IPv4; - src_addr.len=4; + is_ipv4_addr = TRUE; + src_addr.type = AT_IPv4; + src_addr.len = 4; } - } - else if (strcmp(transport_info.connection_type,"IP6")==0){ - if (inet_pton(AF_INET6, transport_info.connection_address, &ipaddr)==1){ + } else if (strcmp(transport_info.connection_type, "IP6") == 0) { + if (inet_pton(AF_INET6, transport_info.connection_address, &ipaddr) == 1) { /* connection_address could be converted to a valid ipv6 address*/ - is_ipv6_addr=TRUE; - src_addr.type=AT_IPv6; - src_addr.len=16; + is_ipv6_addr = TRUE; + src_addr.type = AT_IPv6; + src_addr.len = 16; } } } } - if (strcmp(transport_info.media_type,"video")==0){ + if (strcmp(transport_info.media_type,"video") == 0) { is_video = TRUE; } set_rtp = FALSE; /* Add (s)rtp and (s)rtcp conversation, if available (overrides t38 if conversation already set) */ - if((!pinfo->fd->flags.visited) && port!=0 && (is_rtp||is_srtp) && (is_ipv4_addr || is_ipv6_addr)){ - src_addr.data=(guint8*)&ipaddr; - if(rtp_handle){ + if ((!pinfo->fd->flags.visited) && port != 0 && (is_rtp || is_srtp) && (is_ipv4_addr || is_ipv6_addr)) { + src_addr.data = (guint8*)&ipaddr; + if (rtp_handle) { if (is_srtp) { - srtp_info = se_alloc0(sizeof(struct srtp_info)); - if(transport_info.encryption_algorithm != SRTP_ENC_ALG_NOT_SET){ - srtp_info->encryption_algorithm = transport_info.encryption_algorithm; - srtp_info->auth_algorithm = transport_info.auth_algorithm; - srtp_info->mki_len = transport_info.mki_len; - srtp_info->auth_tag_len = transport_info.auth_tag_len; + srtp_info = se_alloc0(sizeof (struct srtp_info)); + if (transport_info.encryption_algorithm != SRTP_ENC_ALG_NOT_SET) { + srtp_info->encryption_algorithm = transport_info.encryption_algorithm; + srtp_info->auth_algorithm = transport_info.auth_algorithm; + srtp_info->mki_len = transport_info.mki_len; + srtp_info->auth_tag_len = transport_info.auth_tag_len; } srtp_add_address(pinfo, &src_addr, port, 0, "SDP", pinfo->fd->num, is_video, @@ -551,44 +549,45 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } set_rtp = TRUE; } - if(rtcp_handle){ + if (rtcp_handle) { port++; - if(is_srtp){ - srtcp_add_address(pinfo, &src_addr, port, 0, "SDP", pinfo->fd->num, srtp_info); - }else{ - rtcp_add_address(pinfo, &src_addr, port, 0, "SDP", pinfo->fd->num); + if (is_srtp) { + srtcp_add_address(pinfo, &src_addr, port, 0, "SDP", pinfo->fd->num, srtp_info); + } else { + rtcp_add_address(pinfo, &src_addr, port, 0, "SDP", pinfo->fd->num); } } } /* Add t38 conversation, if available and only if no rtp */ - if((!pinfo->fd->flags.visited) && port!=0 && !set_rtp && is_t38 && is_ipv4_addr){ - src_addr.data=(guint8*)&ipaddr; - if(t38_handle){ + if ((!pinfo->fd->flags.visited) && (port != 0) && !set_rtp && is_t38 && is_ipv4_addr) { + src_addr.data = (guint8*)&ipaddr; + if (t38_handle) { t38_add_address(pinfo, &src_addr, port, 0, "SDP", pinfo->fd->num); } } /* Add MSRP conversation. Uses addresses discovered in attribute rather than connection information of media session line */ - if (is_msrp ){ - if ((!pinfo->fd->flags.visited) && msrp_transport_address_set){ - if(msrp_handle){ - src_addr.type=AT_IPv4; - src_addr.len=4; - src_addr.data=(guint8*)&msrp_ipaddr; + if (is_msrp) { + if ((!pinfo->fd->flags.visited) && msrp_transport_address_set) { + if (msrp_handle) { + src_addr.type = AT_IPv4; + src_addr.len = 4; + src_addr.data = (guint8*)&msrp_ipaddr; msrp_add_address(pinfo, &src_addr, msrp_port_number, "SDP", pinfo->fd->num); } } } - if (port!=0) { + if (port != 0) { /* Create the RTP summary str for the Voip Call analysis */ for (i = 0; i < transport_info.media[n].pt_count; i++) { /* if the payload type is dynamic (96 to 127), check the hash table to add the desc in the SDP summary */ - if ( (transport_info.media[n].pt[i] >=96) && (transport_info.media[n].pt[i] <=127) ) { - encoding_name_and_rate_t *encoding_name_and_rate_pt = g_hash_table_lookup(transport_info.media[n].rtp_dyn_payload, &transport_info.media[n].pt[i]); + if ((transport_info.media[n].pt[i] >= 96) && (transport_info.media[n].pt[i] <= 127)) { + encoding_name_and_rate_t *encoding_name_and_rate_pt = + g_hash_table_lookup(transport_info.media[n].rtp_dyn_payload, &transport_info.media[n].pt[i]); if (encoding_name_and_rate_pt) { if (strlen(sdp_pi->summary_str)) g_strlcat(sdp_pi->summary_str, " ", 50); g_strlcat(sdp_pi->summary_str, encoding_name_and_rate_pt->encoding_name, 50); @@ -600,7 +599,9 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } } else if (strlen(sdp_pi->summary_str)) g_strlcat(sdp_pi->summary_str, " ", 50); - g_strlcat(sdp_pi->summary_str, val_to_str_ext(transport_info.media[n].pt[i], &rtp_payload_type_short_vals_ext, "%u"), 50); + g_strlcat(sdp_pi->summary_str, + val_to_str_ext(transport_info.media[n].pt[i], &rtp_payload_type_short_vals_ext, "%u"), + 50); } } @@ -609,7 +610,7 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) rtp_free_hash_dyn_payload(transport_info.media[n].rtp_dyn_payload); /* Create the T38 summary str for the Voip Call analysis */ - if (port!=0 && is_t38) { + if ((port != 0) && is_t38) { if (strlen(sdp_pi->summary_str)) g_strlcat(sdp_pi->summary_str, " ", 50); g_strlcat(sdp_pi->summary_str, "t38", 50); } @@ -624,8 +625,7 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) datalen = tvb_length_remaining(tvb, offset); if (datalen > 0) { - proto_tree_add_text(sdp_tree, tvb, offset, datalen, "Data (%d bytes)", - datalen); + proto_tree_add_text(sdp_tree, tvb, offset, datalen, "Data (%d bytes)", datalen); } /* Report this packet to the tap */ @@ -633,42 +633,42 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } static void -call_sdp_subdissector(tvbuff_t *tvb, packet_info *pinfo, int hf, proto_tree* ti, int length,transport_info_t *transport_info){ - if(hf == hf_owner){ - dissect_sdp_owner(tvb,ti); - } else if ( hf == hf_connection_info) { - dissect_sdp_connection_info(tvb,ti,transport_info); - } else if ( hf == hf_bandwidth) { - dissect_sdp_bandwidth(tvb,ti); - } else if ( hf == hf_time) { - dissect_sdp_time(tvb,ti); - } else if ( hf == hf_repeat_time ){ - dissect_sdp_repeat_time(tvb,ti); - } else if ( hf == hf_timezone ) { - dissect_sdp_timezone(tvb,ti); - } else if ( hf == hf_encryption_key ) { - dissect_sdp_encryption_key(tvb,ti); - } else if ( hf == hf_session_attribute ){ - dissect_sdp_session_attribute(tvb,pinfo,ti); - } else if ( hf == hf_media ) { - dissect_sdp_media(tvb,ti,transport_info); - } else if ( hf == hf_media_attribute ){ - dissect_sdp_media_attribute(tvb,pinfo,ti, length, transport_info); +call_sdp_subdissector(tvbuff_t *tvb, packet_info *pinfo, int hf, proto_tree* ti, int length, transport_info_t *transport_info) { + if (hf == hf_owner) { + dissect_sdp_owner(tvb, ti); + } else if (hf == hf_connection_info) { + dissect_sdp_connection_info(tvb, ti, transport_info); + } else if (hf == hf_bandwidth) { + dissect_sdp_bandwidth(tvb, ti); + } else if (hf == hf_time) { + dissect_sdp_time(tvb, ti); + } else if (hf == hf_repeat_time) { + dissect_sdp_repeat_time(tvb, ti); + } else if (hf == hf_timezone) { + dissect_sdp_timezone(tvb, ti); + } else if (hf == hf_encryption_key) { + dissect_sdp_encryption_key(tvb, ti); + } else if (hf == hf_session_attribute) { + dissect_sdp_session_attribute(tvb, pinfo, ti); + } else if (hf == hf_media) { + dissect_sdp_media(tvb, ti, transport_info); + } else if (hf == hf_media_attribute) { + dissect_sdp_media_attribute(tvb, pinfo, ti, length, transport_info); } } static void -dissect_sdp_owner(tvbuff_t *tvb, proto_item *ti){ +dissect_sdp_owner(tvbuff_t *tvb, proto_item *ti) { proto_tree *sdp_owner_tree; - gint offset,next_offset,tokenlen; + gint offset, next_offset, tokenlen; offset = 0; - sdp_owner_tree = proto_item_add_subtree(ti,ett_sdp_owner); + sdp_owner_tree = proto_item_add_subtree(ti, ett_sdp_owner); /* Find the username */ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if( next_offset == -1 ) + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset == -1) return; tokenlen = next_offset - offset; @@ -677,8 +677,8 @@ dissect_sdp_owner(tvbuff_t *tvb, proto_item *ti){ offset = next_offset + 1; /* Find the session id */ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if( next_offset == -1 ) + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset == -1) return; tokenlen = next_offset - offset; @@ -687,8 +687,8 @@ dissect_sdp_owner(tvbuff_t *tvb, proto_item *ti){ offset = next_offset + 1; /* Find the version */ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if( next_offset == -1 ) + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset == -1) return; tokenlen = next_offset - offset; @@ -697,8 +697,8 @@ dissect_sdp_owner(tvbuff_t *tvb, proto_item *ti){ offset = next_offset + 1; /* Find the network type */ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if( next_offset == -1 ) + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset == -1) return; tokenlen = next_offset - offset; @@ -707,8 +707,8 @@ dissect_sdp_owner(tvbuff_t *tvb, proto_item *ti){ offset = next_offset + 1; /* Find the address type */ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if( next_offset == -1 ) + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset == -1) return; tokenlen = next_offset - offset; @@ -717,7 +717,7 @@ dissect_sdp_owner(tvbuff_t *tvb, proto_item *ti){ offset = next_offset + 1; /* Find the address */ - proto_tree_add_item(sdp_owner_tree,hf_owner_address, tvb, offset, -1, ENC_ASCII|ENC_NA); + proto_tree_add_item(sdp_owner_tree, hf_owner_address, tvb, offset, -1, ENC_ASCII|ENC_NA); } /* @@ -726,9 +726,9 @@ dissect_sdp_owner(tvbuff_t *tvb, proto_item *ti){ */ static void dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti, - transport_info_t *transport_info){ + transport_info_t *transport_info) { proto_tree *sdp_connection_info_tree; - gint offset,next_offset,tokenlen; + gint offset, next_offset, tokenlen; offset = 0; @@ -736,8 +736,8 @@ dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti, ett_sdp_connection_info); /* Find the network type */ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if( next_offset == -1 ) + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset == -1) return; tokenlen = next_offset - offset; @@ -747,8 +747,8 @@ dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti, offset = next_offset + 1; /* Find the address type */ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if( next_offset == -1 ) + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset == -1) return; tokenlen = next_offset - offset; /* Save connection address type */ @@ -762,12 +762,12 @@ dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti, /* Find the connection address */ /* XXX - what if there's a <number of addresses> value? */ - next_offset = tvb_find_guint8(tvb,offset,-1,'/'); - if( next_offset == -1){ + next_offset = tvb_find_guint8(tvb, offset, -1, '/'); + if (next_offset == -1) { tokenlen = -1; /* end of tvbuff */ /* Save connection address */ transport_info->connection_address = - (char*)tvb_get_ephemeral_string(tvb, offset, tvb_length_remaining(tvb, offset)); + (char*)tvb_get_ephemeral_string(tvb, offset, tvb_length_remaining(tvb, offset)); } else { tokenlen = next_offset - offset; /* Save connection address */ @@ -777,17 +777,17 @@ dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti, proto_tree_add_item(sdp_connection_info_tree, hf_connection_info_connection_address, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - if(next_offset != -1){ + if (next_offset != -1) { offset = next_offset + 1; - next_offset = tvb_find_guint8(tvb,offset,-1,'/'); - if( next_offset == -1){ + next_offset = tvb_find_guint8(tvb, offset, -1, '/'); + if (next_offset == -1) { tokenlen = -1; /* end of tvbuff */ } else { tokenlen = next_offset - offset; } proto_tree_add_item(sdp_connection_info_tree, hf_connection_info_ttl, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - if(next_offset != -1){ + if (next_offset != -1) { offset = next_offset + 1; proto_tree_add_item(sdp_connection_info_tree, hf_connection_info_num_addr, tvb, offset, -1, ENC_ASCII|ENC_NA); @@ -796,34 +796,34 @@ dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti, } static void -dissect_sdp_bandwidth(tvbuff_t *tvb, proto_item *ti){ - proto_tree * sdp_bandwidth_tree; - gint offset, next_offset, tokenlen; +dissect_sdp_bandwidth(tvbuff_t *tvb, proto_item *ti) { + proto_tree *sdp_bandwidth_tree; + gint offset, next_offset, tokenlen; proto_item *item; - gboolean unit_is_kbs = FALSE; - gboolean unit_is_bps = FALSE; + gboolean unit_is_kbs = FALSE; + gboolean unit_is_bps = FALSE; offset = 0; - sdp_bandwidth_tree = proto_item_add_subtree(ti,ett_sdp_bandwidth); + sdp_bandwidth_tree = proto_item_add_subtree(ti, ett_sdp_bandwidth); /* find the modifier */ - next_offset = tvb_find_guint8(tvb,offset,-1,':'); + next_offset = tvb_find_guint8(tvb, offset, -1, ':'); - if( next_offset == -1) + if (next_offset == -1) return; tokenlen = next_offset - offset; item = proto_tree_add_item(sdp_bandwidth_tree, hf_bandwidth_modifier, tvb, offset, - tokenlen, ENC_ASCII|ENC_NA); - if (tvb_strneql(tvb, offset, "CT", 2) == 0){ + tokenlen, ENC_ASCII|ENC_NA); + if (tvb_strneql(tvb, offset, "CT", 2) == 0) { proto_item_append_text(item, " [Conference Total(total bandwidth of all RTP sessions)]"); unit_is_kbs = TRUE; - }else if (tvb_strneql(tvb, offset, "AS", 2) == 0){ + } else if (tvb_strneql(tvb, offset, "AS", 2) == 0) { proto_item_append_text(item, " [Application Specific (RTP session bandwidth)]"); unit_is_kbs = TRUE; - }else if (tvb_strneql(tvb, offset, "TIAS", 4) == 0){ + } else if (tvb_strneql(tvb, offset, "TIAS", 4) == 0) { proto_item_append_text(item, " [Transport Independent Application Specific maximum]"); unit_is_bps = TRUE; } @@ -832,24 +832,24 @@ dissect_sdp_bandwidth(tvbuff_t *tvb, proto_item *ti){ offset = next_offset + 1; item = proto_tree_add_item(sdp_bandwidth_tree, hf_bandwidth_value, tvb, offset, -1, - ENC_ASCII|ENC_NA); + ENC_ASCII|ENC_NA); if (unit_is_kbs == TRUE) proto_item_append_text(item, " kb/s"); if (unit_is_bps == TRUE) proto_item_append_text(item, " b/s"); } -static void dissect_sdp_time(tvbuff_t *tvb, proto_item* ti){ +static void dissect_sdp_time(tvbuff_t *tvb, proto_item* ti) { proto_tree *sdp_time_tree; - gint offset,next_offset, tokenlen; + gint offset, next_offset, tokenlen; offset = 0; - sdp_time_tree = proto_item_add_subtree(ti,ett_sdp_time); + sdp_time_tree = proto_item_add_subtree(ti, ett_sdp_time); /* get start time */ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if( next_offset == -1 ) + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset == -1) return; tokenlen = next_offset - offset; @@ -861,17 +861,17 @@ static void dissect_sdp_time(tvbuff_t *tvb, proto_item* ti){ proto_tree_add_item(sdp_time_tree, hf_time_stop, tvb, offset, -1, ENC_ASCII|ENC_NA); } -static void dissect_sdp_repeat_time(tvbuff_t *tvb, proto_item* ti){ +static void dissect_sdp_repeat_time(tvbuff_t *tvb, proto_item* ti) { proto_tree *sdp_repeat_time_tree; - gint offset,next_offset, tokenlen; + gint offset, next_offset, tokenlen; offset = 0; - sdp_repeat_time_tree = proto_item_add_subtree(ti,ett_sdp_time); + sdp_repeat_time_tree = proto_item_add_subtree(ti, ett_sdp_time); /* get interval */ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if( next_offset == -1 ) + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset == -1) return; tokenlen = next_offset - offset; @@ -880,48 +880,48 @@ static void dissect_sdp_repeat_time(tvbuff_t *tvb, proto_item* ti){ /* get duration */ offset = next_offset + 1; - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if( next_offset == -1 ) + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset == -1) return; tokenlen = next_offset - offset; - proto_tree_add_item(sdp_repeat_time_tree,hf_repeat_time_duration, tvb, + proto_tree_add_item(sdp_repeat_time_tree, hf_repeat_time_duration, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); /* get offsets */ do{ offset = next_offset +1; - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if(next_offset != -1){ + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset != -1) { tokenlen = next_offset - offset; } else { tokenlen = -1; /* end of tvbuff */ } proto_tree_add_item(sdp_repeat_time_tree, hf_repeat_time_offset, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - } while( next_offset != -1 ); + } while (next_offset != -1); } static void -dissect_sdp_timezone(tvbuff_t *tvb, proto_item* ti){ +dissect_sdp_timezone(tvbuff_t *tvb, proto_item* ti) { proto_tree* sdp_timezone_tree; - gint offset, next_offset, tokenlen; + gint offset, next_offset, tokenlen; offset = 0; - sdp_timezone_tree = proto_item_add_subtree(ti,ett_sdp_timezone); + sdp_timezone_tree = proto_item_add_subtree(ti, ett_sdp_timezone); do{ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if(next_offset == -1) + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset == -1) break; tokenlen = next_offset - offset; proto_tree_add_item(sdp_timezone_tree, hf_timezone_time, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); offset = next_offset + 1; - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if(next_offset != -1){ + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset != -1) { tokenlen = next_offset - offset; } else { tokenlen = -1; /* end of tvbuff */ @@ -934,43 +934,43 @@ dissect_sdp_timezone(tvbuff_t *tvb, proto_item* ti){ } -static void dissect_sdp_encryption_key(tvbuff_t *tvb, proto_item * ti){ +static void dissect_sdp_encryption_key(tvbuff_t *tvb, proto_item * ti) { proto_tree *sdp_encryption_key_tree; - gint offset, next_offset, tokenlen; + gint offset, next_offset, tokenlen; offset = 0; - sdp_encryption_key_tree = proto_item_add_subtree(ti,ett_sdp_encryption_key); + sdp_encryption_key_tree = proto_item_add_subtree(ti, ett_sdp_encryption_key); - next_offset = tvb_find_guint8(tvb,offset,-1,':'); + next_offset = tvb_find_guint8(tvb, offset, -1, ':'); - if(next_offset == -1) + if (next_offset == -1) return; tokenlen = next_offset - offset; - proto_tree_add_item(sdp_encryption_key_tree,hf_encryption_key_type, + proto_tree_add_item(sdp_encryption_key_tree, hf_encryption_key_type, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); offset = next_offset + 1; - proto_tree_add_item(sdp_encryption_key_tree,hf_encryption_key_data, + proto_tree_add_item(sdp_encryption_key_tree, hf_encryption_key_data, tvb, offset, -1, ENC_ASCII|ENC_NA); } -static void dissect_key_mgmt(tvbuff_t *tvb, packet_info * pinfo, proto_item * ti){ - gchar *data_p = NULL; - gchar *prtcl_id = NULL; - gint len; - tvbuff_t *keymgmt_tvb; - gboolean found_match = FALSE; +static void dissect_key_mgmt(tvbuff_t *tvb, packet_info * pinfo, proto_item * ti) { + gchar *data_p = NULL; + gchar *prtcl_id = NULL; + gint len; + tvbuff_t *keymgmt_tvb; + gboolean found_match = FALSE; proto_tree *key_tree; - gint next_offset; - gint offset = 0; - gint tokenlen; + gint next_offset; + gint offset = 0; + gint tokenlen; key_tree = proto_item_add_subtree(ti, ett_sdp_key_mgmt); - next_offset = tvb_find_guint8(tvb,offset,-1,' '); + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); if (next_offset == -1) return; @@ -990,7 +990,7 @@ static void dissect_key_mgmt(tvbuff_t *tvb, packet_info * pinfo, proto_item * ti keymgmt_tvb = base64_to_tvb(tvb, data_p); add_new_data_source(pinfo, keymgmt_tvb, "Key Management Data"); - if ( prtcl_id != NULL && key_mgmt_dissector_table != NULL ) { + if ((prtcl_id != NULL) && (key_mgmt_dissector_table != NULL)) { found_match = dissector_try_string(key_mgmt_dissector_table, prtcl_id, keymgmt_tvb, pinfo, @@ -999,10 +999,9 @@ static void dissect_key_mgmt(tvbuff_t *tvb, packet_info * pinfo, proto_item * ti if (found_match) { proto_item *ti2 = proto_tree_add_item(key_tree, hf_key_mgmt_data, - keymgmt_tvb, 0, -1, ENC_NA); + keymgmt_tvb, 0, -1, ENC_NA); PROTO_ITEM_SET_HIDDEN(ti2); - } - else { + } else { proto_tree_add_item(key_tree, hf_key_mgmt_data, keymgmt_tvb, 0, -1, ENC_NA); } @@ -1010,78 +1009,78 @@ static void dissect_key_mgmt(tvbuff_t *tvb, packet_info * pinfo, proto_item * ti } -static void dissect_sdp_session_attribute(tvbuff_t *tvb, packet_info * pinfo, proto_item * ti){ - proto_tree *sdp_session_attribute_tree; - gint offset, next_offset, tokenlen; - guint8 *field_name; +static void dissect_sdp_session_attribute(tvbuff_t *tvb, packet_info * pinfo, proto_item * ti) { + proto_tree *sdp_session_attribute_tree; + gint offset, next_offset, tokenlen; + guint8 *field_name; - offset = 0; + offset = 0; - sdp_session_attribute_tree = proto_item_add_subtree(ti, - ett_sdp_session_attribute); + sdp_session_attribute_tree = proto_item_add_subtree(ti, + ett_sdp_session_attribute); - next_offset = tvb_find_guint8(tvb,offset,-1,':'); + next_offset = tvb_find_guint8(tvb, offset, -1, ':'); - if(next_offset == -1) - return; + if (next_offset == -1) + return; - tokenlen = next_offset - offset; + tokenlen = next_offset - offset; - proto_tree_add_item(sdp_session_attribute_tree, hf_session_attribute_field, - tvb, offset, tokenlen, ENC_ASCII|ENC_NA); + proto_tree_add_item(sdp_session_attribute_tree, hf_session_attribute_field, + tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - field_name = tvb_get_ephemeral_string(tvb, offset, tokenlen); + field_name = tvb_get_ephemeral_string(tvb, offset, tokenlen); - offset = next_offset + 1; + offset = next_offset + 1; - if (strcmp((char*)field_name, "ipbcp") == 0) { - offset = tvb_pbrk_guint8(tvb,offset,-1,"0123456789", NULL); + if (strcmp((char*)field_name, "ipbcp") == 0) { + offset = tvb_pbrk_guint8(tvb, offset, -1,"0123456789", NULL); - if (offset == -1) - return; + if (offset == -1) + return; - next_offset = tvb_find_guint8(tvb,offset,-1,' '); + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); - if (next_offset == -1) - return; + if (next_offset == -1) + return; - tokenlen = next_offset - offset; + tokenlen = next_offset - offset; - proto_tree_add_item(sdp_session_attribute_tree,hf_ipbcp_version,tvb,offset,tokenlen,ENC_ASCII|ENC_NA); + proto_tree_add_item(sdp_session_attribute_tree, hf_ipbcp_version, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - offset = tvb_pbrk_guint8(tvb,offset,-1,"ABCDEFGHIJKLMNOPQRSTUVWXYZ", NULL); + offset = tvb_pbrk_guint8(tvb, offset, -1,"ABCDEFGHIJKLMNOPQRSTUVWXYZ", NULL); - if (offset == -1) - return; + if (offset == -1) + return; - tokenlen = tvb_find_line_end(tvb,offset,-1, &next_offset, FALSE); + tokenlen = tvb_find_line_end(tvb, offset, -1, &next_offset, FALSE); - if (tokenlen == -1) - return; + if (tokenlen == -1) + return; - proto_tree_add_item(sdp_session_attribute_tree,hf_ipbcp_type,tvb,offset,tokenlen,ENC_ASCII|ENC_NA); - } else if (strcmp((char*)field_name, "key-mgmt") == 0) { - tvbuff_t *key_tvb; - proto_item *key_ti; + proto_tree_add_item(sdp_session_attribute_tree, hf_ipbcp_type, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); + } else if (strcmp((char*)field_name, "key-mgmt") == 0) { + tvbuff_t *key_tvb; + proto_item *key_ti; - key_tvb = tvb_new_subset_remaining(tvb, offset); - key_ti = proto_tree_add_item(sdp_session_attribute_tree, hf_key_mgmt_att_value, key_tvb, 0, -1, ENC_ASCII|ENC_NA); + key_tvb = tvb_new_subset_remaining(tvb, offset); + key_ti = proto_tree_add_item(sdp_session_attribute_tree, hf_key_mgmt_att_value, key_tvb, 0, -1, ENC_ASCII|ENC_NA); - dissect_key_mgmt(key_tvb, pinfo, key_ti); - } else { - proto_tree_add_item(sdp_session_attribute_tree, hf_session_attribute_value, - tvb, offset, -1, ENC_ASCII|ENC_NA); - } + dissect_key_mgmt(key_tvb, pinfo, key_ti); + } else { + proto_tree_add_item(sdp_session_attribute_tree, hf_session_attribute_value, + tvb, offset, -1, ENC_ASCII|ENC_NA); + } } /* Dissect media description */ static void dissect_sdp_media(tvbuff_t *tvb, proto_item *ti, - transport_info_t *transport_info){ + transport_info_t *transport_info) { proto_tree *sdp_media_tree; - gint offset, next_offset, tokenlen, idx; - guint8 *media_format; + gint offset, next_offset, tokenlen, idx; + guint8 *media_format; offset = 0; @@ -1089,11 +1088,11 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti, msrp_transport_address_set = FALSE; /* Create tree for media session */ - sdp_media_tree = proto_item_add_subtree(ti,ett_sdp_media); + sdp_media_tree = proto_item_add_subtree(ti, ett_sdp_media); - next_offset = tvb_find_guint8(tvb,offset, -1, ' '); + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); - if(next_offset == -1) + if (next_offset == -1) return; tokenlen = next_offset - offset; @@ -1106,13 +1105,13 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti, offset = next_offset + 1; - next_offset = tvb_find_guint8(tvb,offset, -1, ' '); - if(next_offset == -1) + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset == -1) return; tokenlen = next_offset - offset; - next_offset = tvb_find_guint8(tvb,offset, tokenlen, '/'); + next_offset = tvb_find_guint8(tvb, offset, tokenlen, '/'); - if(next_offset != -1){ + if (next_offset != -1) { tokenlen = next_offset - offset; /* Save port info */ transport_info->media_port[transport_info->media_count] = (char*)tvb_get_ephemeral_string(tvb, offset, tokenlen); @@ -1120,17 +1119,17 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti, proto_tree_add_uint(sdp_media_tree, hf_media_port, tvb, offset, tokenlen, atoi((char*)tvb_get_ephemeral_string(tvb, offset, tokenlen))); offset = next_offset + 1; - next_offset = tvb_find_guint8(tvb,offset, -1, ' '); - if(next_offset == -1) + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + if (next_offset == -1) return; tokenlen = next_offset - offset; proto_tree_add_item(sdp_media_tree, hf_media_portcount, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); offset = next_offset + 1; } else { - next_offset = tvb_find_guint8(tvb,offset, -1, ' '); + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); - if(next_offset == -1) + if (next_offset == -1) return; tokenlen = next_offset - offset; /* Save port info */ @@ -1142,9 +1141,9 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti, offset = next_offset + 1; } - next_offset = tvb_find_guint8(tvb,offset,-1,' '); + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); - if( next_offset == -1) + if ( next_offset == -1) return; tokenlen = next_offset - offset; @@ -1157,9 +1156,9 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti, do { offset = next_offset + 1; - next_offset = tvb_find_guint8(tvb,offset,-1,' '); + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); - if(next_offset == -1){ + if (next_offset == -1) { tokenlen = tvb_length_remaining(tvb, offset); /* End of tvbuff */ if (tokenlen == 0) break; /* Nothing more left */ @@ -1184,7 +1183,7 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti, /* Increase the count of media channels, but don't walk off the end of the arrays. */ - if (transport_info->media_count < (SDP_MAX_RTP_CHANNELS-1)){ + if (transport_info->media_count < (SDP_MAX_RTP_CHANNELS-1)) { transport_info->media_count++; } @@ -1203,68 +1202,68 @@ ascii_bytes_to_tvb(tvbuff_t *tvb, packet_info *pinfo, gint len, gchar *msg) guint8 *buf = g_malloc(10240); /* arbitrary maximum length */ - if(len<20480){ + if (len < 20480) { int i; tvbuff_t *bytes_tvb; /* first, skip to where the encoded pdu starts, this is the first hex digit after the '=' char. */ - while(1){ - if((*msg==0)||(*msg=='\n')){ + while (1) { + if ((*msg == 0) || (*msg == '\n')) { return NULL; } - if(*msg=='='){ + if (*msg == '=') { msg++; break; } msg++; } - while(1){ - if((*msg==0)||(*msg=='\n')){ + while (1) { + if ((*msg == 0) || (*msg == '\n')) { return NULL; } - if( ((*msg>='0')&&(*msg<='9')) - || ((*msg>='a')&&(*msg<='f')) - || ((*msg>='A')&&(*msg<='F'))){ + if ( ((*msg >= '0') && (*msg <= '9')) + || ((*msg >= 'a') && (*msg <= 'f')) + || ((*msg >= 'A') && (*msg <= 'F'))) { break; } msg++; } - i=0; - while( ((*msg>='0')&&(*msg<='9')) - ||((*msg>='a')&&(*msg<='f')) - ||((*msg>='A')&&(*msg<='F')) ){ + i = 0; + while (((*msg >= '0') && (*msg <= '9')) + || ((*msg >= 'a') && (*msg <= 'f')) + || ((*msg >= 'A') && (*msg <= 'F'))) { int val; - if((*msg>='0')&&(*msg<='9')){ - val=(*msg)-'0'; - } else if((*msg>='a')&&(*msg<='f')){ - val=(*msg)-'a'+10; - } else if((*msg>='A')&&(*msg<='F')){ - val=(*msg)-'A'+10; + if ((*msg >= '0') && (*msg <= '9')) { + val = (*msg)-'0'; + } else if ((*msg >= 'a') && (*msg <= 'f')) { + val = (*msg)-'a'+10; + } else if ((*msg >= 'A') && (*msg <= 'F')) { + val = (*msg)-'A'+10; } else { return NULL; } - val<<=4; + val <<= 4; msg++; - if((*msg>='0')&&(*msg<='9')){ - val|=(*msg)-'0'; - } else if((*msg>='a')&&(*msg<='f')){ - val|=(*msg)-'a'+10; - } else if((*msg>='A')&&(*msg<='F')){ - val|=(*msg)-'A'+10; + if ((*msg >= '0') && (*msg <= '9')) { + val |= (*msg)-'0'; + } else if ((*msg >= 'a') && (*msg <= 'f')) { + val |= (*msg)-'a'+10; + } else if ((*msg >= 'A') && (*msg <= 'F')) { + val |= (*msg)-'A'+10; } else { return NULL; } msg++; - buf[i]=(guint8)val; + buf[i] = (guint8)val; i++; } - if(i==0){ + if (i == 0) { return NULL; } - bytes_tvb = tvb_new_child_real_data(tvb, buf,i,i); + bytes_tvb = tvb_new_child_real_data(tvb, buf, i, i); tvb_set_free_cb(bytes_tvb, g_free); add_new_data_source(pinfo, bytes_tvb, "ASCII bytes to tvb"); return bytes_tvb; @@ -1315,24 +1314,24 @@ static const value_string h264_packetization_mode_vals[] = * TODO: Make this a more generic routine to dissect fmtp parameters depending on media types */ static void -decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset, gint tokenlen, char *mime_type){ - gint next_offset; - gint end_offset; - guint8 *field_name; - gchar *format_specific_parameter; - proto_item *item; - tvbuff_t * volatile data_tvb; +decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset, gint tokenlen, char *mime_type) { + gint next_offset; + gint end_offset; + guint8 *field_name; + gchar *format_specific_parameter; + proto_item *item; + tvbuff_t * volatile data_tvb; end_offset = offset + tokenlen; - /* - proto_tree_add_text(tree, tvb, offset, tokenlen, "Debug; Analysed string: '%s'", - tvb_get_ephemeral_string(tvb, offset, tokenlen)); - */ +#if 0 + proto_tree_add_text(tree, tvb, offset, tokenlen, "Debug; Analysed string: '%s'", + tvb_get_ephemeral_string(tvb, offset, tokenlen)); +#endif /* Look for an '=' within this value - this may indicate that there is a profile-level-id parameter to find if the MPEG4 media type is in use */ - next_offset = tvb_find_guint8(tvb,offset,-1,'='); + next_offset = tvb_find_guint8(tvb, offset, -1, '='); if (next_offset == -1) { /* Give up (and avoid exception) if '=' not found */ @@ -1342,12 +1341,13 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset /* Find the name of the parameter */ tokenlen = next_offset - offset; field_name = tvb_get_ephemeral_string(tvb, offset, tokenlen); - /*proto_tree_add_text(tree, tvb, offset, tokenlen, "Debug; MIMEtype '%s'Parameter name: '%s'", mime_type, field_name); */ - +#if 0 + proto_tree_add_text(tree, tvb, offset, tokenlen, "Debug; MIMEtype '%s'Parameter name: '%s'", mime_type, field_name); */ +#endif offset = next_offset; /* Dissect the MPEG4 profile-level-id parameter if present */ - if (mime_type != NULL && g_ascii_strcasecmp(mime_type, "MP4V-ES") == 0) { + if ((mime_type != NULL) && (g_ascii_strcasecmp(mime_type, "MP4V-ES") == 0)) { if (strcmp((char*)field_name, "profile-level-id") == 0) { offset++; tokenlen = end_offset - offset; @@ -1361,14 +1361,15 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset format_specific_parameter = tvb_get_ephemeral_string(tvb, offset, tokenlen); /* ascii_bytes_to_tvb requires the "=" to be in the buffer */ data_tvb = ascii_bytes_to_tvb(tvb, pinfo, tokenlen, format_specific_parameter); - if(mp4ves_handle && data_tvb){ + if (mp4ves_handle && data_tvb) { dissect_mp4ves_config(data_tvb, pinfo, tree); } } } /* Dissect the H263-2000 profile parameter if present */ - if ((mime_type != NULL && g_ascii_strcasecmp(mime_type, "H263-2000") == 0)||(mime_type != NULL && g_ascii_strcasecmp(mime_type, "H263-1998") == 0)) { + if (((mime_type != NULL) && (g_ascii_strcasecmp(mime_type, "H263-2000") == 0)) || + ((mime_type != NULL) && (g_ascii_strcasecmp(mime_type, "H263-1998") == 0))) { if (strcmp((char*)field_name, "profile") == 0) { offset++; tokenlen = end_offset - offset; @@ -1376,7 +1377,7 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset item = proto_tree_add_uint(tree, hf_sdp_fmtp_h263_profile, tvb, offset, tokenlen, atol((char*)format_specific_parameter)); PROTO_ITEM_SET_GENERATED(item); - } else if(strcmp((char*)field_name, "level") == 0) { + } else if (strcmp((char*)field_name, "level") == 0) { offset++; tokenlen = end_offset - offset; format_specific_parameter = tvb_get_ephemeral_string(tvb, offset, tokenlen); @@ -1399,7 +1400,7 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset * in bit-significance order, starting from the * most significant bit, and 3) level_idc. */ - if (mime_type != NULL && g_ascii_strcasecmp(mime_type, "H264") == 0) { + if ((mime_type != NULL) && (g_ascii_strcasecmp(mime_type, "H264") == 0)) { if (strcmp(field_name, "profile-level-id") == 0) { int length = 0; @@ -1407,28 +1408,27 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset tokenlen = end_offset - offset; format_specific_parameter = tvb_get_ephemeral_string(tvb, offset, tokenlen); data_tvb = ascii_bytes_to_tvb(tvb, pinfo, tokenlen, format_specific_parameter); - if(!data_tvb){ - proto_tree_add_text(tree, tvb, offset, tokenlen, "Could not convert '%s' to 3 bytes",format_specific_parameter); + if (!data_tvb) { + proto_tree_add_text(tree, tvb, offset, tokenlen, "Could not convert '%s' to 3 bytes", format_specific_parameter); return; } length = tvb_length(data_tvb); - if (length == 3){ - if(h264_handle && data_tvb){ + if (length == 3) { + if (h264_handle && data_tvb) { dissect_h264_profile(data_tvb, pinfo, tree); } - }else{ + } else { item = proto_tree_add_text(tree, tvb, offset, tokenlen, "Incorrectly coded, must be three bytes"); PROTO_ITEM_SET_GENERATED(item); } - }else if (strcmp(field_name, "packetization-mode") == 0) { + } else if (strcmp(field_name, "packetization-mode") == 0) { offset++; tokenlen = end_offset - offset; format_specific_parameter = tvb_get_ephemeral_string(tvb, offset, tokenlen); item = proto_tree_add_uint(tree, hf_sdp_h264_packetization_mode, tvb, offset, tokenlen, atol((char*)format_specific_parameter)); PROTO_ITEM_SET_GENERATED(item); - - }else if (strcmp(field_name, "sprop-parameter-sets") == 0) { + } else if (strcmp(field_name, "sprop-parameter-sets") == 0) { /* The value of the parameter is the base64 [6] representation of the initial parameter set NAL units as specified in @@ -1439,26 +1439,26 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset pair of parameter sets in the list. */ gchar *data_p = NULL; - gint comma_offset; + gint comma_offset; /* Move past '=' */ offset++; - comma_offset = tvb_find_guint8(tvb,offset,-1,','); - if (comma_offset != -1){ + comma_offset = tvb_find_guint8(tvb, offset, -1, ','); + if (comma_offset != -1) { tokenlen = comma_offset - offset; - }else{ + } else { tokenlen = end_offset - offset; } data_p = tvb_get_ephemeral_string(tvb, offset, tokenlen); proto_tree_add_text(tree, tvb, offset, tokenlen, "NAL unit 1 string: %s", data_p); - /* proto_tree_add_text(tree, tvb, offset, tokenlen, "String %s",data_p); */ + /* proto_tree_add_text(tree, tvb, offset, tokenlen, "String %s", data_p); */ data_tvb = base64_to_tvb(tvb, data_p); add_new_data_source(pinfo, data_tvb, "h264 prop-parameter-sets"); - if(h264_handle && data_tvb){ + if (h264_handle && data_tvb) { TRY { dissect_h264_nal_unit(data_tvb, pinfo, tree); } @@ -1469,11 +1469,11 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset show_reported_bounds_error(tvb, pinfo, tree); } ENDTRY; - if (comma_offset != -1){ + if (comma_offset != -1) { /* Second NAL unit */ - offset = comma_offset +1; + offset = comma_offset +1; tokenlen = end_offset - offset; - data_p = tvb_get_ephemeral_string(tvb, offset, tokenlen); + data_p = tvb_get_ephemeral_string(tvb, offset, tokenlen); proto_tree_add_text(tree, tvb, offset, tokenlen, "NAL unit 2 string: %s", data_p); data_tvb = base64_to_tvb(tvb, data_p); add_new_data_source(pinfo, data_tvb, "h264 prop-parameter-sets 2"); @@ -1486,7 +1486,7 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset } typedef struct { - const char *name; + const char *name; } sdp_names_t; #define SDP_RTPMAP 1 @@ -1509,438 +1509,450 @@ static gint find_sdp_media_attribute_names(tvbuff_t *tvb, int offset, guint len) guint i; for (i = 1; i < array_length(sdp_media_attribute_names); i++) { - if (len == strlen(sdp_media_attribute_names[i].name) && - tvb_strncaseeql(tvb, offset, sdp_media_attribute_names[i].name, len) == 0) + if ((len == strlen(sdp_media_attribute_names[i].name)) && + (tvb_strncaseeql(tvb, offset, sdp_media_attribute_names[i].name, len) == 0)) return i; } return -1; } -static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto_item * ti, int length, transport_info_t *transport_info){ - proto_tree *sdp_media_attribute_tree, *parameter_item; - proto_item *fmtp_item, *media_format_item, *parameter_tree; - proto_tree *fmtp_tree; - gint offset, next_offset, tokenlen, n, colon_offset; - /*??guint8 *field_name;*/ - guint8 *payload_type; - guint8 *attribute_value; - gint *key; - guint8 pt; - gint sdp_media_attrbute_code; - const char *msrp_res = "msrp://"; - const char *h324ext_h223lcparm = "h324ext/h223lcparm"; - gboolean has_more_pars = TRUE; - tvbuff_t *h245_tvb; - encoding_name_and_rate_t *encoding_name_and_rate; - guint8 master_key_length = 0, master_salt_length = 0; - - offset = 0; - - /* Create attribute tree */ - sdp_media_attribute_tree = proto_item_add_subtree(ti, - ett_sdp_media_attribute); - /* Find end of field */ - colon_offset = tvb_find_guint8(tvb,offset,-1,':'); - - if(colon_offset == -1) - return; +static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto_item * ti, int length, transport_info_t *transport_info) { + proto_tree *sdp_media_attribute_tree, *parameter_item; + proto_item *fmtp_item, *media_format_item, *parameter_tree; + proto_tree *fmtp_tree; + gint offset, next_offset, tokenlen, n, colon_offset; + /*??guint8 *field_name;*/ + guint8 *payload_type; + guint8 *attribute_value; + gint *key; + guint8 pt; + gint sdp_media_attrbute_code; + const char *msrp_res = "msrp://"; + const char *h324ext_h223lcparm = "h324ext/h223lcparm"; + gboolean has_more_pars = TRUE; + tvbuff_t *h245_tvb; + guint8 master_key_length = 0, master_salt_length = 0; + encoding_name_and_rate_t *encoding_name_and_rate; - /* Attribute field name is token before ':' */ - tokenlen = colon_offset - offset; - proto_tree_add_item(sdp_media_attribute_tree, - hf_media_attribute_field, - tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - /*??field_name = tvb_get_ephemeral_string(tvb, offset, tokenlen);*/ - sdp_media_attrbute_code = find_sdp_media_attribute_names(tvb, offset, tokenlen); + offset = 0; - /* Skip colon */ - offset = colon_offset + 1; - /* skip leading wsp */ - offset = tvb_skip_wsp(tvb,offset,tvb_length_remaining(tvb,offset)); + /* Create attribute tree */ + sdp_media_attribute_tree = proto_item_add_subtree(ti, + ett_sdp_media_attribute); + /* Find end of field */ + colon_offset = tvb_find_guint8(tvb, offset, -1, ':'); - /* Value is the remainder of the line */ - attribute_value = tvb_get_ephemeral_string(tvb, offset, tvb_length_remaining(tvb, offset)); + if (colon_offset == -1) + return; + /* Attribute field name is token before ':' */ + tokenlen = colon_offset - offset; + proto_tree_add_item(sdp_media_attribute_tree, + hf_media_attribute_field, + tvb, offset, tokenlen, ENC_ASCII|ENC_NA); + /*??field_name = tvb_get_ephemeral_string(tvb, offset, tokenlen);*/ + sdp_media_attrbute_code = find_sdp_media_attribute_names(tvb, offset, tokenlen); + /* Skip colon */ + offset = colon_offset + 1; + /* skip leading wsp */ + offset = tvb_skip_wsp(tvb, offset, tvb_length_remaining(tvb, offset)); - /*********************************************/ - /* Special parsing for some field name types */ + /* Value is the remainder of the line */ + attribute_value = tvb_get_ephemeral_string(tvb, offset, tvb_length_remaining(tvb, offset)); - switch (sdp_media_attrbute_code){ - case SDP_RTPMAP: - /* decode the rtpmap to see if it is DynamicPayload to dissect them automatic */ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - if(next_offset == -1) - return; - tokenlen = next_offset - offset; + /*********************************************/ + /* Special parsing for some field name types */ - proto_tree_add_item(sdp_media_attribute_tree, hf_media_format, tvb, - offset, tokenlen, ENC_ASCII|ENC_NA); + switch (sdp_media_attrbute_code) { + case SDP_RTPMAP: + /* decode the rtpmap to see if it is DynamicPayload to dissect them automatic */ + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); - payload_type = tvb_get_ephemeral_string(tvb, offset, tokenlen); + if (next_offset == -1) + return; - offset = next_offset + 1; + tokenlen = next_offset - offset; - next_offset = tvb_find_guint8(tvb,offset,-1,'/'); + proto_tree_add_item(sdp_media_attribute_tree, hf_media_format, tvb, + offset, tokenlen, ENC_ASCII|ENC_NA); - if(next_offset == -1){ - return; - } + payload_type = tvb_get_ephemeral_string(tvb, offset, tokenlen); - tokenlen = next_offset - offset; + offset = next_offset + 1; - proto_tree_add_item(sdp_media_attribute_tree, hf_media_encoding_name, tvb, - offset, tokenlen, ENC_ASCII|ENC_NA); + next_offset = tvb_find_guint8(tvb, offset, -1, '/'); - pt = atoi((char*)payload_type); - if (pt >= SDP_NO_OF_PT) { - return; /* Invalid */ - } + if (next_offset == -1) { + return; + } - key = g_malloc( sizeof(gint) ); - *key = atol((char*)payload_type); + tokenlen = next_offset - offset; - transport_info->encoding_name[pt] = (char*)tvb_get_ephemeral_string(tvb, offset, tokenlen); + proto_tree_add_item(sdp_media_attribute_tree, hf_media_encoding_name, tvb, + offset, tokenlen, ENC_ASCII|ENC_NA); - next_offset = next_offset + 1; - offset = next_offset; - while (length-1 >= next_offset){ - if(!isdigit(tvb_get_guint8(tvb, next_offset))) - break; - next_offset++; - } - tokenlen = next_offset - offset; - proto_tree_add_item(sdp_media_attribute_tree, hf_media_sample_rate, tvb, - offset, tokenlen, ENC_ASCII|ENC_NA); - transport_info->sample_rate[pt] = atoi(tvb_get_ephemeral_string(tvb, offset, tokenlen)); - /* As per RFC2327 it is possible to have multiple Media Descriptions ("m="). - For example: - - a=rtpmap:101 G726-32/8000 - m=audio 49170 RTP/AVP 0 97 - a=rtpmap:97 telephone-event/8000 - m=audio 49172 RTP/AVP 97 101 - a=rtpmap:97 G726-24/8000 - - The Media attributes ("a="s) after the "m=" only apply for that "m=". - If there is an "a=" before the first "m=", that attribute applies for - all the session (all the "m="s). - */ - - /* so, if this "a=" appear before any "m=", we add it to all the dynamic - * hash tables - */ - if (transport_info->media_count == 0) { - for (n=0; n < SDP_MAX_RTP_CHANNELS; n++) { - encoding_name_and_rate = g_malloc( sizeof(encoding_name_and_rate_t)); - encoding_name_and_rate->encoding_name = g_strdup(transport_info->encoding_name[pt]); - encoding_name_and_rate->sample_rate = transport_info->sample_rate[pt]; - if (n==0){ - g_hash_table_insert(transport_info->media[n].rtp_dyn_payload, - key, encoding_name_and_rate); - } - else { /* we create a new key and encoding_name to assign to the other hash tables */ - gint *key2; - key2=g_malloc( sizeof(gint) ); - *key2=atol((char*)payload_type); - g_hash_table_insert(transport_info->media[n].rtp_dyn_payload, - key2, encoding_name_and_rate); - } - } - return; - /* if the "a=" is after an "m=", only apply to this "m=" */ - }else - /* in case there is an overflow in SDP_MAX_RTP_CHANNELS, we keep always the last "m=" */ - encoding_name_and_rate = g_malloc( sizeof(encoding_name_and_rate_t)); + pt = atoi((char*)payload_type); + if (pt >= SDP_NO_OF_PT) { + return; /* Invalid */ + } + + key = g_malloc(sizeof (gint)); + *key = atol((char*)payload_type); + + transport_info->encoding_name[pt] = (char*)tvb_get_ephemeral_string(tvb, offset, tokenlen); + + next_offset = next_offset + 1; + offset = next_offset; + while (length-1 >= next_offset) { + if (!isdigit(tvb_get_guint8(tvb, next_offset))) + break; + next_offset++; + } + tokenlen = next_offset - offset; + proto_tree_add_item(sdp_media_attribute_tree, hf_media_sample_rate, tvb, + offset, tokenlen, ENC_ASCII|ENC_NA); + transport_info->sample_rate[pt] = atoi(tvb_get_ephemeral_string(tvb, offset, tokenlen)); + /* As per RFC2327 it is possible to have multiple Media Descriptions ("m="). + For example: + + a=rtpmap:101 G726-32/8000 + m=audio 49170 RTP/AVP 0 97 + a=rtpmap:97 telephone-event/8000 + m=audio 49172 RTP/AVP 97 101 + a=rtpmap:97 G726-24/8000 + + The Media attributes ("a="s) after the "m=" only apply for that "m=". + If there is an "a=" before the first "m=", that attribute applies for + all the session (all the "m="s). + */ + /* so, if this "a=" appear before any "m=", we add it to all the dynamic + * hash tables + */ + if (transport_info->media_count == 0) { + for (n = 0; n < SDP_MAX_RTP_CHANNELS; n++) { + encoding_name_and_rate = g_malloc(sizeof (encoding_name_and_rate_t)); encoding_name_and_rate->encoding_name = g_strdup(transport_info->encoding_name[pt]); encoding_name_and_rate->sample_rate = transport_info->sample_rate[pt]; - if (transport_info->media_count == SDP_MAX_RTP_CHANNELS-1) - g_hash_table_insert(transport_info->media[ transport_info->media_count ].rtp_dyn_payload, - key, encoding_name_and_rate); - else - g_hash_table_insert(transport_info->media[ transport_info->media_count-1 ].rtp_dyn_payload, - key, encoding_name_and_rate); - break; - case SDP_FMTP: - if(sdp_media_attribute_tree){ - guint8 media_format; - /* Reading the Format parameter(fmtp) */ - /* Skip leading space, if any */ - offset = tvb_skip_wsp(tvb,offset,tvb_length_remaining(tvb,offset)); - /* Media format extends to the next space */ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - - if(next_offset == -1) - return; + if (n == 0) { + g_hash_table_insert(transport_info->media[n].rtp_dyn_payload, + key, encoding_name_and_rate); + } else { /* we create a new key and encoding_name to assign to the other hash tables */ + gint *key2; + key2 = g_malloc(sizeof (gint)); + *key2 = atol((char*)payload_type); + g_hash_table_insert(transport_info->media[n].rtp_dyn_payload, + key2, encoding_name_and_rate); + } + } + return; + /* if the "a=" is after an "m=", only apply to this "m=" */ + } else + /* in case there is an overflow in SDP_MAX_RTP_CHANNELS, we keep always the last "m=" */ + encoding_name_and_rate = g_malloc(sizeof (encoding_name_and_rate_t)); + + encoding_name_and_rate->encoding_name = g_strdup(transport_info->encoding_name[pt]); + encoding_name_and_rate->sample_rate = transport_info->sample_rate[pt]; + if (transport_info->media_count == SDP_MAX_RTP_CHANNELS-1) + g_hash_table_insert(transport_info->media[ transport_info->media_count ].rtp_dyn_payload, + key, encoding_name_and_rate); + else + g_hash_table_insert(transport_info->media[ transport_info->media_count-1 ].rtp_dyn_payload, + key, encoding_name_and_rate); + break; + case SDP_FMTP: + if (sdp_media_attribute_tree) { + guint8 media_format; + /* Reading the Format parameter(fmtp) */ + /* Skip leading space, if any */ + offset = tvb_skip_wsp(tvb, offset, tvb_length_remaining(tvb, offset)); + /* Media format extends to the next space */ + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + + if (next_offset == -1) + return; - tokenlen = next_offset - offset; + tokenlen = next_offset - offset; - media_format_item = proto_tree_add_item(sdp_media_attribute_tree, - hf_media_format, tvb, offset, - tokenlen, ENC_ASCII|ENC_NA); - media_format = atoi((char*)tvb_get_ephemeral_string(tvb, offset, tokenlen)); - if (media_format >= SDP_NO_OF_PT) { - return; /* Invalid */ - } + media_format_item = proto_tree_add_item(sdp_media_attribute_tree, + hf_media_format, tvb, offset, + tokenlen, ENC_ASCII|ENC_NA); + media_format = atoi((char*)tvb_get_ephemeral_string(tvb, offset, tokenlen)); + if (media_format >= SDP_NO_OF_PT) { + return; /* Invalid */ + } - /* Append encoding name to format if known */ - proto_item_append_text(media_format_item, " [%s]", - transport_info->encoding_name[media_format]); + /* Append encoding name to format if known */ + proto_item_append_text(media_format_item, " [%s]", + transport_info->encoding_name[media_format]); - /*??payload_type = tvb_get_ephemeral_string(tvb, offset, tokenlen);*/ - /* Move offset past the payload type */ - offset = next_offset + 1; +#if 0 /* XXX: ?? */ + payload_type = tvb_get_ephemeral_string(tvb, offset, tokenlen); +#endif + /* Move offset past the payload type */ + offset = next_offset + 1; - while(has_more_pars==TRUE){ - next_offset = tvb_find_guint8(tvb,offset,-1,';'); - offset = tvb_skip_wsp(tvb,offset,tvb_length_remaining(tvb,offset)); + while (has_more_pars == TRUE) { + next_offset = tvb_find_guint8(tvb, offset, -1, ';'); + offset = tvb_skip_wsp(tvb, offset, tvb_length_remaining(tvb, offset)); - if(next_offset == -1){ - has_more_pars = FALSE; - next_offset= tvb_length(tvb); - } + if (next_offset == -1) { + has_more_pars = FALSE; + next_offset= tvb_length(tvb); + } - /* There are at least 2 - add the first parameter */ - tokenlen = next_offset - offset; - fmtp_item = proto_tree_add_item(sdp_media_attribute_tree, - hf_media_format_specific_parameter, tvb, - offset, tokenlen, ENC_ASCII|ENC_NA); + /* There are at least 2 - add the first parameter */ + tokenlen = next_offset - offset; + fmtp_item = proto_tree_add_item(sdp_media_attribute_tree, + hf_media_format_specific_parameter, tvb, + offset, tokenlen, ENC_ASCII|ENC_NA); - fmtp_tree = proto_item_add_subtree(fmtp_item, ett_sdp_fmtp); + fmtp_tree = proto_item_add_subtree(fmtp_item, ett_sdp_fmtp); - decode_sdp_fmtp(fmtp_tree, tvb, pinfo, offset, tokenlen, - transport_info->encoding_name[media_format]); + decode_sdp_fmtp(fmtp_tree, tvb, pinfo, offset, tokenlen, + transport_info->encoding_name[media_format]); - /* Move offset past "; " and onto firts char */ - offset = next_offset + 1; - } + /* Move offset past "; " and onto firts char */ + offset = next_offset + 1; + } + } + break; + case SDP_PATH: + /* msrp attributes that contain address needed for conversation */ + /* RFC 4975 + * path = path-label ":" path-list + * path-label = "path" + * path-list= MSRP-URI *(SP MSRP-URI) + * MSRP-URI = msrp-scheme "://" authority + * ["/" session-id] ";" transport *( ";" URI-parameter) + * ; authority as defined in RFC3986 + * + * msrp-scheme = "msrp" / "msrps" + * RFC 3986 + * The authority component is preceded by a double slash ("//") and is terminated by + * the next slash ("/"), question mark ("?"), or number sign ("#") character, or by + * the end of the URI. + */ + + /* Check for "msrp://" */ + if (strncmp((char*)attribute_value, msrp_res, strlen(msrp_res)) == 0) { + int address_offset, port_offset, port_end_offset; + + /* Address starts here */ + address_offset = offset + (int)strlen(msrp_res); + + /* Port is after next ':' */ + port_offset = tvb_find_guint8(tvb, address_offset, -1, ':'); + /* Check if port is present if not skipp */ + if (port_offset!= -1) { + /* Port ends with '/' */ + port_end_offset = tvb_find_guint8(tvb, port_offset, -1, '/'); + + /* Attempt to convert address */ + if (inet_pton(AF_INET, + (char*)tvb_get_ephemeral_string(tvb, address_offset, port_offset-address_offset), + &msrp_ipaddr) > 0) { + /* Get port number */ + msrp_port_number = atoi((char*)tvb_get_ephemeral_string(tvb, port_offset + 1, port_end_offset - port_offset - 1)); + /* Set flag so this info can be used */ + msrp_transport_address_set = TRUE; } + } + } + break; + case SDP_H248_ITEM: + /* Decode h248 item ITU-T Rec. H.248.12 (2001)/Amd.1 (11/2002)*/ + if (strncmp((char*)attribute_value, h324ext_h223lcparm, strlen(msrp_res)) == 0) { + /* A.5.1.3 H.223 Logical channel parameters + * This property indicates the H.245 + * H223LogicalChannelsParameters structure encoded by applying the PER specified in + * ITU-T Rec. X.691. Value encoded as per A.5.1.2. For text encoding the mechanism defined + * in ITU-T Rec. H.248.15 is used. + */ + gint len; + asn1_ctx_t actx; + + len = (gint)strlen(attribute_value); + h245_tvb = ascii_bytes_to_tvb(tvb, pinfo, len, attribute_value); + /* arbitrary maximum length */ + /* should go through a handle, however, the two h245 entry + points are different, one is over tpkt and the other is raw + */ + if (h245_tvb) { + asn1_ctx_init(&actx, ASN1_ENC_PER, TRUE, pinfo); + dissect_h245_H223LogicalChannelParameters(h245_tvb, 0, &actx, + sdp_media_attribute_tree, + hf_SDPh223LogicalChannelParameters); + } + } + break; + case SDP_CRYPTO: + /* http://tools.ietf.org/html/rfc4568 + * 9.1. Generic "Crypto" Attribute Grammar + * + * The ABNF grammar for the crypto attribute is defined below: + * + * "a=crypto:" tag 1*WSP crypto-suite 1*WSP key-params + * *(1*WSP session-param) + * + * tag = 1*9DIGIT + * crypto-suite = 1*(ALPHA / DIGIT / "_") + * + * key-params = key-param *(";" key-param) + * key-param = key-method ":" key-info + * key-method = "inline" / key-method-ext + * key-method-ext = 1*(ALPHA / DIGIT / "_") + * key-info = 1*(%x21-3A / %x3C-7E) ; visible (printing) chars + * ; except semi-colon + * session-param = 1*(VCHAR) ; visible (printing) characters + * + * where WSP, ALPHA, DIGIT, and VCHAR are defined in [RFC4234]. + * + */ + + /* We are at the first colon */ + /* tag */ + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + tokenlen = next_offset - offset; + proto_tree_add_uint(sdp_media_attribute_tree, hf_sdp_crypto_tag, tvb, offset, tokenlen, + atoi((char*)tvb_get_ephemeral_string(tvb, offset, tokenlen))); + offset = next_offset + 1; + + /* crypto-suite */ + next_offset = tvb_find_guint8(tvb, offset, -1, ' '); + tokenlen = next_offset - offset; + proto_tree_add_item(sdp_media_attribute_tree, hf_sdp_crypto_crypto_suite, + tvb, offset, tokenlen, ENC_ASCII|ENC_NA); + if (tvb_strncaseeql(tvb, offset, "AES_CM_128_HMAC_SHA1_80", tokenlen) == 0) { + + /* XXX This may only work in simple cases */ + if (transport_info->encryption_algorithm == SRTP_ENC_ALG_NOT_SET) { + transport_info->encryption_algorithm = SRTP_ENC_ALG_AES_CM; + transport_info->auth_algorithm = SRTP_AUTH_ALG_HMAC_SHA1; + /* number of octets used for the Auth Tag in the RTP payload */ + transport_info->auth_tag_len = 10; + } + master_key_length = 16; /* 128 bits = 16 octets */ + master_salt_length = 14; /* 112 bits = 14 octets */ + } else if (tvb_strncaseeql(tvb, offset, "AES_CM_128_HMAC_SHA1_32", tokenlen) == 0) { + /* XXX This may only work in simple cases */ + if (transport_info->encryption_algorithm == SRTP_ENC_ALG_NOT_SET) { + transport_info->encryption_algorithm = SRTP_ENC_ALG_AES_CM; + transport_info->auth_algorithm = SRTP_AUTH_ALG_HMAC_SHA1; + /* number of octets used for the Auth Tag in the RTP payload */ + transport_info->auth_tag_len = 4; + } + master_key_length = 16; /* 128 bits = 16 octets */ + master_salt_length = 14; /* 112 bits = 14 octets */ + } else if (tvb_strncaseeql(tvb, offset, "F8_128_HMAC_SHA1_80", tokenlen) == 0) { + if (transport_info->encryption_algorithm == SRTP_ENC_ALG_NOT_SET) { + /* XXX This may only work in simple cases */ + transport_info->encryption_algorithm = SRTP_ENC_ALG_AES_F8; + transport_info->auth_algorithm = SRTP_AUTH_ALG_HMAC_SHA1; + /* number of octets used for the Auth Tag in the RTP payload */ + transport_info->auth_tag_len = 10; + } + master_key_length = 16; /* 128 bits = 16 octets */ + master_salt_length = 14; /* 112 bits = 14 octets */ + } + offset = next_offset + 1; + + /* key-params */ + while (has_more_pars == TRUE) { + int param_end_offset; + tvbuff_t *key_salt_tvb; + gchar *data_p = NULL; + + param_end_offset = tvb_find_guint8(tvb, offset, -1, ';'); + if (param_end_offset == -1) { + has_more_pars = FALSE; + param_end_offset = tvb_length(tvb); + } + parameter_item = proto_tree_add_text(sdp_media_attribute_tree, + tvb, offset, param_end_offset-offset, "Key parameters"); + parameter_tree = proto_item_add_subtree(parameter_item, ett_sdp_crypto_key_parameters); + + /* key-method or key-method-ext */ + next_offset = tvb_find_guint8(tvb, offset, -1, ':'); + if (next_offset == -1) { + expert_add_info_format(pinfo, parameter_item, PI_MALFORMED, PI_NOTE, + "Invalid key-param (no ':' delimiter)"); break; - case SDP_PATH: - /* msrp attributes that contain address needed for conversation */ - /* RFC 4975 - * path = path-label ":" path-list - * path-label = "path" - * path-list= MSRP-URI *(SP MSRP-URI) - * MSRP-URI = msrp-scheme "://" authority - * ["/" session-id] ";" transport *( ";" URI-parameter) - * ; authority as defined in RFC3986 - * - * msrp-scheme = "msrp" / "msrps" - * RFC 3986 - * The authority component is preceded by a double slash ("//") and is terminated by - * the next slash ("/"), question mark ("?"), or number sign ("#") character, or by - * the end of the URI. - */ - - /* Check for "msrp://" */ - if (strncmp((char*)attribute_value, msrp_res, strlen(msrp_res)) == 0){ - int address_offset, port_offset, port_end_offset; - - /* Address starts here */ - address_offset = offset + (int)strlen(msrp_res); - - /* Port is after next ':' */ - port_offset = tvb_find_guint8(tvb, address_offset, -1, ':'); - /* Check if port is present if not skipp */ - if(port_offset!= -1){ - /* Port ends with '/' */ - port_end_offset = tvb_find_guint8(tvb, port_offset, -1, '/'); - - /* Attempt to convert address */ - if (inet_pton(AF_INET, (char*)tvb_get_ephemeral_string(tvb, address_offset, port_offset-address_offset), &msrp_ipaddr) > 0) { - /* Get port number */ - msrp_port_number = atoi((char*)tvb_get_ephemeral_string(tvb, port_offset+1, port_end_offset-port_offset-1)); - /* Set flag so this info can be used */ - msrp_transport_address_set = TRUE; - } - } + } + if (tvb_strncaseeql(tvb, offset, "inline", next_offset-offset) == 0) { + /* XXX only for SRTP? */ + /* srtp-key-info = key-salt ["|" lifetime] ["|" mki] */ + offset = next_offset +1; + next_offset = tvb_find_guint8(tvb, offset, -1, '|'); + if (next_offset == -1) { + tokenlen = param_end_offset - offset; + } else { + tokenlen = next_offset - offset; } - break; - case SDP_H248_ITEM: - /* Decode h248 item ITU-T Rec. H.248.12 (2001)/Amd.1 (11/2002)*/ - if (strncmp((char*)attribute_value, h324ext_h223lcparm, strlen(msrp_res)) == 0){ - /* A.5.1.3 H.223 Logical channel parameters - * This property indicates the H.245 - * H223LogicalChannelsParameters structure encoded by applying the PER specified in - * ITU-T Rec. X.691. Value encoded as per A.5.1.2. For text encoding the mechanism defined - * in ITU-T Rec. H.248.15 is used. - */ - gint len; - asn1_ctx_t actx; - - len = (gint)strlen(attribute_value); - h245_tvb = ascii_bytes_to_tvb(tvb, pinfo, len, attribute_value); - /* arbitrary maximum length */ - /* should go through a handle, however, the two h245 entry - points are different, one is over tpkt and the other is raw - */ - if (h245_tvb){ - asn1_ctx_init(&actx, ASN1_ENC_PER, TRUE, pinfo); - dissect_h245_H223LogicalChannelParameters(h245_tvb, 0, &actx, sdp_media_attribute_tree, hf_SDPh223LogicalChannelParameters); - } + data_p = tvb_get_ephemeral_string(tvb, offset, tokenlen); + key_salt_tvb = base64_to_tvb(tvb, data_p); + add_new_data_source(pinfo, key_salt_tvb, "Key_Salt_tvb"); + if (master_key_length != 0) { + proto_tree_add_text(parameter_tree, tvb, offset, tokenlen, "Key and Salt"); + proto_tree_add_item(parameter_tree, hf_sdp_crypto_master_key, + key_salt_tvb, 0, master_key_length, ENC_ASCII|ENC_NA); + proto_tree_add_item(parameter_tree, hf_sdp_crypto_master_salt, + key_salt_tvb, master_key_length, master_salt_length, ENC_ASCII|ENC_NA); + } else { + proto_tree_add_text(parameter_tree, key_salt_tvb, 0, -1, "Key and Salt"); } - break; - case SDP_CRYPTO: - /* http://tools.ietf.org/html/rfc4568 - * 9.1. Generic "Crypto" Attribute Grammar - * - * The ABNF grammar for the crypto attribute is defined below: - * - * "a=crypto:" tag 1*WSP crypto-suite 1*WSP key-params - * *(1*WSP session-param) - * - * tag = 1*9DIGIT - * crypto-suite = 1*(ALPHA / DIGIT / "_") - * - * key-params = key-param *(";" key-param) - * key-param = key-method ":" key-info - * key-method = "inline" / key-method-ext - * key-method-ext = 1*(ALPHA / DIGIT / "_") - * key-info = 1*(%x21-3A / %x3C-7E) ; visible (printing) chars - * ; except semi-colon - * session-param = 1*(VCHAR) ; visible (printing) characters - * - * where WSP, ALPHA, DIGIT, and VCHAR are defined in [RFC4234]. - * - */ - - /* We are at the first colon */ - /* tag */ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - tokenlen = next_offset - offset; - proto_tree_add_uint(sdp_media_attribute_tree, hf_sdp_crypto_tag, tvb, offset, tokenlen, - atoi((char*)tvb_get_ephemeral_string(tvb, offset, tokenlen))); - offset=next_offset+1; - /* crypto-suite */ - next_offset = tvb_find_guint8(tvb,offset,-1,' '); - tokenlen = next_offset - offset; - proto_tree_add_item(sdp_media_attribute_tree, hf_sdp_crypto_crypto_suite, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - if(tvb_strncaseeql(tvb, offset, "AES_CM_128_HMAC_SHA1_80",tokenlen) == 0){ - - /* XXX This may only work in simple cases */ - if(transport_info->encryption_algorithm == SRTP_ENC_ALG_NOT_SET){ - transport_info->encryption_algorithm = SRTP_ENC_ALG_AES_CM; - transport_info->auth_algorithm = SRTP_AUTH_ALG_HMAC_SHA1; - /* number of octets used for the Auth Tag in the RTP payload */ - transport_info->auth_tag_len = 10; - } - master_key_length = 16; /* 128 bits = 16 octets */ - master_salt_length = 14; /* 112 bits = 14 octets */ - }else if(tvb_strncaseeql(tvb, offset, "AES_CM_128_HMAC_SHA1_32",tokenlen) == 0){ - /* XXX This may only work in simple cases */ - if(transport_info->encryption_algorithm == SRTP_ENC_ALG_NOT_SET){ - transport_info->encryption_algorithm = SRTP_ENC_ALG_AES_CM; - transport_info->auth_algorithm = SRTP_AUTH_ALG_HMAC_SHA1; - /* number of octets used for the Auth Tag in the RTP payload */ - transport_info->auth_tag_len = 4; - } - master_key_length = 16; /* 128 bits = 16 octets */ - master_salt_length = 14; /* 112 bits = 14 octets */ - }else if(tvb_strncaseeql(tvb, offset, "F8_128_HMAC_SHA1_80",tokenlen) == 0){ - if(transport_info->encryption_algorithm == SRTP_ENC_ALG_NOT_SET){ - /* XXX This may only work in simple cases */ - transport_info->encryption_algorithm = SRTP_ENC_ALG_AES_F8; - transport_info->auth_algorithm = SRTP_AUTH_ALG_HMAC_SHA1; - /* number of octets used for the Auth Tag in the RTP payload */ - transport_info->auth_tag_len = 10; - } - master_key_length = 16; /* 128 bits = 16 octets */ - master_salt_length = 14; /* 112 bits = 14 octets */ - } - offset=next_offset+1; - - /* key-params */ - while(has_more_pars==TRUE){ - int param_end_offset; - tvbuff_t *key_salt_tvb; - gchar *data_p = NULL; - - param_end_offset = tvb_find_guint8(tvb,offset,-1,';'); - if(param_end_offset == -1){ - has_more_pars = FALSE; - param_end_offset = tvb_length(tvb); - } - parameter_item = proto_tree_add_text(sdp_media_attribute_tree, tvb, offset, param_end_offset-offset, "Key parameters"); - parameter_tree = proto_item_add_subtree(parameter_item, ett_sdp_crypto_key_parameters); - - /* key-method or key-method-ext */ - next_offset = tvb_find_guint8(tvb,offset,-1,':'); - if(next_offset == -1){ - expert_add_info_format(pinfo, parameter_item, PI_MALFORMED, PI_NOTE, - "Invalid key-param (no ':' delimiter)"); - break; - } - if(tvb_strncaseeql(tvb, offset, "inline", next_offset-offset) == 0){ - /* XXX only for SRTP? */ - /* srtp-key-info = key-salt ["|" lifetime] ["|" mki] */ - offset = next_offset +1; - next_offset = tvb_find_guint8(tvb,offset,-1,'|'); - if(next_offset == -1){ - tokenlen = param_end_offset - offset; - }else{ - tokenlen = next_offset - offset; - } - data_p = tvb_get_ephemeral_string(tvb, offset, tokenlen); - key_salt_tvb = base64_to_tvb(tvb, data_p); - add_new_data_source(pinfo, key_salt_tvb, "Key_Salt_tvb"); - if(master_key_length !=0){ - proto_tree_add_text(parameter_tree, tvb, offset, tokenlen, "Key and Salt"); - proto_tree_add_item(parameter_tree, hf_sdp_crypto_master_key, key_salt_tvb, 0, master_key_length, ENC_ASCII|ENC_NA); - proto_tree_add_item(parameter_tree, hf_sdp_crypto_master_salt, key_salt_tvb, master_key_length, master_salt_length, ENC_ASCII|ENC_NA); - }else{ - proto_tree_add_text(parameter_tree, key_salt_tvb, 0, -1, "Key and Salt"); - } - - /* ["|" lifetime] ["|" mki] are optional */ - if(next_offset != -1){ - offset = next_offset + 1; - next_offset = tvb_find_guint8(tvb,offset,-1,'|'); - if(next_offset != -1){ - /*lifetime = ["2^"] 1*(DIGIT) ; see section 6.1 for "2^" */ - tokenlen = next_offset - offset; - proto_tree_add_item(parameter_tree, hf_sdp_crypto_lifetime, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - offset = next_offset + 1; - } - /* mki = mki-value ":" mki-length - * - * mki-value = 1*DIGIT - */ - next_offset = tvb_find_guint8(tvb,offset,-1,':'); - tokenlen = next_offset - offset; - proto_tree_add_item(parameter_tree, hf_sdp_crypto_mki, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - offset = next_offset + 1; - - /* mki-length = 1*3DIGIT ; range 1..128. */ - next_offset = param_end_offset; - tokenlen = next_offset - offset; - - /* This will not work if more than one parameter */ - /* number of octets used for the MKI in the RTP payload */ - transport_info->mki_len = atoi((char*)tvb_get_ephemeral_string(tvb, offset, tokenlen)); - proto_tree_add_item(parameter_tree, hf_sdp_crypto_mki_length, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - } - offset = param_end_offset; - }else{ - tokenlen = param_end_offset - next_offset+1; - proto_tree_add_text(parameter_tree, tvb, next_offset+1, tokenlen, "%s", tvb_get_ephemeral_string(tvb, next_offset+1, tokenlen)); - offset = param_end_offset; - } + /* ["|" lifetime] ["|" mki] are optional */ + if (next_offset != -1) { + offset = next_offset + 1; + next_offset = tvb_find_guint8(tvb, offset, -1, '|'); + if (next_offset != -1) { + /*lifetime = ["2^"] 1*(DIGIT) ; see section 6.1 for "2^" */ + tokenlen = next_offset - offset; + proto_tree_add_item(parameter_tree, hf_sdp_crypto_lifetime, + tvb, offset, tokenlen, ENC_ASCII|ENC_NA); + offset = next_offset + 1; + } + /* mki = mki-value ":" mki-length + * + * mki-value = 1*DIGIT + */ + next_offset = tvb_find_guint8(tvb, offset, -1, ':'); + tokenlen = next_offset - offset; + proto_tree_add_item(parameter_tree, hf_sdp_crypto_mki, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); + offset = next_offset + 1; + + /* mki-length = 1*3DIGIT ; range 1..128. */ + next_offset = param_end_offset; + tokenlen = next_offset - offset; + + /* This will not work if more than one parameter */ + /* number of octets used for the MKI in the RTP payload */ + transport_info->mki_len = atoi((char*)tvb_get_ephemeral_string(tvb, offset, tokenlen)); + proto_tree_add_item(parameter_tree, hf_sdp_crypto_mki_length, + tvb, offset, tokenlen, ENC_ASCII|ENC_NA); } - - break; - default: - /* No special treatment for values of this attribute type, just add as one item. */ - proto_tree_add_item(sdp_media_attribute_tree, hf_media_attribute_value, - tvb, offset, -1, ENC_ASCII|ENC_NA); - break; + offset = param_end_offset; + } else { + tokenlen = param_end_offset - next_offset + 1; + proto_tree_add_text(parameter_tree, tvb, next_offset + 1, tokenlen, + "%s", tvb_get_ephemeral_string(tvb, next_offset + 1, tokenlen)); + offset = param_end_offset; + } } + + break; + default: + /* No special treatment for values of this attribute type, just add as one item. */ + proto_tree_add_item(sdp_media_attribute_tree, hf_media_attribute_value, + tvb, offset, -1, ENC_ASCII|ENC_NA); + break; + } } void @@ -1948,285 +1960,355 @@ proto_register_sdp(void) { static hf_register_info hf[] = { { &hf_protocol_version, - { "Session Description Protocol Version (v)", - "sdp.version", FT_STRING, BASE_NONE,NULL,0x0, - NULL, HFILL }}, + { "Session Description Protocol Version (v)", "sdp.version", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_owner, { "Owner/Creator, Session Id (o)", - "sdp.owner", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL}}, + "sdp.owner", FT_STRING, BASE_NONE, NULL, + 0x0, NULL, HFILL} + }, { &hf_session_name, - { "Session Name (s)", - "sdp.session_name", FT_STRING, BASE_NONE,NULL, 0x0, - NULL, HFILL }}, + { "Session Name (s)", "sdp.session_name", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_session_info, - { "Session Information (i)", - "sdp.session_info", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Session Information (i)", "sdp.session_info", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_uri, - { "URI of Description (u)", - "sdp.uri", FT_STRING, BASE_NONE,NULL, 0x0, - NULL, HFILL }}, + { "URI of Description (u)", "sdp.uri", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_email, - { "E-mail Address (e)", - "sdp.email", FT_STRING, BASE_NONE, NULL, 0x0, - "E-mail Address", HFILL }}, + { "E-mail Address (e)", "sdp.email", + FT_STRING, BASE_NONE, NULL, 0x0, + "E-mail Address", HFILL } + }, { &hf_phone, - { "Phone Number (p)", - "sdp.phone", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Phone Number (p)", "sdp.phone", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_connection_info, - { "Connection Information (c)", - "sdp.connection_info", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Connection Information (c)", "sdp.connection_info", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_bandwidth, - { "Bandwidth Information (b)", - "sdp.bandwidth", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Bandwidth Information (b)", "sdp.bandwidth", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_timezone, - { "Time Zone Adjustments (z)", - "sdp.timezone", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Time Zone Adjustments (z)", "sdp.timezone", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_encryption_key, - { "Encryption Key (k)", - "sdp.encryption_key", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Encryption Key (k)", "sdp.encryption_key", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_session_attribute, - { "Session Attribute (a)", - "sdp.session_attr", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Session Attribute (a)", "sdp.session_attr", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_media_attribute, - { "Media Attribute (a)", - "sdp.media_attr", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Media Attribute (a)", "sdp.media_attr", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_time, { "Time Description, active time (t)", - "sdp.time", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + "sdp.time", FT_STRING, BASE_NONE, NULL, + 0x0, NULL, HFILL } + }, { &hf_repeat_time, - { "Repeat Time (r)", - "sdp.repeat_time", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Repeat Time (r)", "sdp.repeat_time", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_media, { "Media Description, name and address (m)", - "sdp.media", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + "sdp.media", FT_STRING, BASE_NONE, NULL, + 0x0, NULL, HFILL } + }, { &hf_media_title, - { "Media Title (i)", - "sdp.media_title",FT_STRING, BASE_NONE, NULL, 0x0, - "Media Title", HFILL }}, + { "Media Title (i)", "sdp.media_title", + FT_STRING, BASE_NONE, NULL, 0x0, + "Media Title", HFILL } + }, { &hf_unknown, - { "Unknown", - "sdp.unknown",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Unknown", "sdp.unknown", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_invalid, - { "Invalid line", - "sdp.invalid",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Invalid line", "sdp.invalid", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_owner_username, - { "Owner Username", - "sdp.owner.username",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Owner Username", "sdp.owner.username", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_owner_sessionid, - { "Session ID", - "sdp.owner.sessionid",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Session ID", "sdp.owner.sessionid", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_owner_version, - { "Session Version", - "sdp.owner.version",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Session Version", "sdp.owner.version", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_owner_network_type, - { "Owner Network Type", - "sdp.owner.network_type",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Owner Network Type", "sdp.owner.network_type", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_owner_address_type, - { "Owner Address Type", - "sdp.owner.address_type",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Owner Address Type", "sdp.owner.address_type", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_owner_address, - { "Owner Address", - "sdp.owner.address",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Owner Address", "sdp.owner.address", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_connection_info_network_type, - { "Connection Network Type", - "sdp.connection_info.network_type",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Connection Network Type", "sdp.connection_info.network_type", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_connection_info_address_type, - { "Connection Address Type", - "sdp.connection_info.address_type",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Connection Address Type", "sdp.connection_info.address_type", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_connection_info_connection_address, - { "Connection Address", - "sdp.connection_info.address",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Connection Address", "sdp.connection_info.address", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_connection_info_ttl, - { "Connection TTL", - "sdp.connection_info.ttl",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Connection TTL", "sdp.connection_info.ttl", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_connection_info_num_addr, - { "Connection Number of Addresses", - "sdp.connection_info.num_addr",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Connection Number of Addresses", "sdp.connection_info.num_addr", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_bandwidth_modifier, - { "Bandwidth Modifier", - "sdp.bandwidth.modifier",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Bandwidth Modifier", "sdp.bandwidth.modifier", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_bandwidth_value, - { "Bandwidth Value", - "sdp.bandwidth.value",FT_STRING, BASE_NONE, NULL, 0x0, - "Bandwidth Value (in kbits/s)", HFILL }}, + { "Bandwidth Value", "sdp.bandwidth.value", + FT_STRING, BASE_NONE, NULL, 0x0, + "Bandwidth Value (in kbits/s)", HFILL } + }, { &hf_time_start, - { "Session Start Time", - "sdp.time.start",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Session Start Time", "sdp.time.start", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_time_stop, - { "Session Stop Time", - "sdp.time.stop",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Session Stop Time", "sdp.time.stop", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_repeat_time_interval, - { "Repeat Interval", - "sdp.repeat_time.interval",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Repeat Interval", "sdp.repeat_time.interval", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_repeat_time_duration, - { "Repeat Duration", - "sdp.repeat_time.duration",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Repeat Duration", "sdp.repeat_time.duration", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_repeat_time_offset, - { "Repeat Offset", - "sdp.repeat_time.offset",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Repeat Offset", "sdp.repeat_time.offset", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_timezone_time, - { "Timezone Time", - "sdp.timezone.time",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Timezone Time", "sdp.timezone.time", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_timezone_offset, - { "Timezone Offset", - "sdp.timezone.offset",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Timezone Offset", "sdp.timezone.offset", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_encryption_key_type, - { "Key Type", - "sdp.encryption_key.type",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Key Type", "sdp.encryption_key.type", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_encryption_key_data, - { "Key Data", - "sdp.encryption_key.data",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Key Data", "sdp.encryption_key.data", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_session_attribute_field, - { "Session Attribute Fieldname", - "sdp.session_attr.field",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Session Attribute Fieldname", "sdp.session_attr.field", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_session_attribute_value, - { "Session Attribute Value", - "sdp.session_attr.value",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Session Attribute Value", "sdp.session_attr.value", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_media_media, - { "Media Type", - "sdp.media.media",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Media Type", "sdp.media.media", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_media_port, - { "Media Port", - "sdp.media.port",FT_UINT16, BASE_DEC, NULL, 0x0, - NULL, HFILL }}, + { "Media Port", "sdp.media.port", + FT_UINT16, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, { &hf_media_portcount, - { "Media Port Count", - "sdp.media.portcount",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Media Port Count", "sdp.media.portcount", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_media_proto, - { "Media Protocol", - "sdp.media.proto",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Media Protocol", "sdp.media.proto", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_media_format, - { "Media Format", - "sdp.media.format",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Media Format", "sdp.media.format", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_media_attribute_field, - { "Media Attribute Fieldname", - "sdp.media_attribute.field",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Media Attribute Fieldname", "sdp.media_attribute.field", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_media_attribute_value, - { "Media Attribute Value", - "sdp.media_attribute.value",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Media Attribute Value", "sdp.media_attribute.value", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_media_encoding_name, - { "MIME Type", - "sdp.mime.type",FT_STRING, BASE_NONE, NULL, 0x0, - "SDP MIME Type", HFILL }}, + { "MIME Type", "sdp.mime.type", + FT_STRING, BASE_NONE, NULL, 0x0, + "SDP MIME Type", HFILL } + }, { &hf_media_sample_rate, - { "Sample Rate", - "sdp.sample_rate",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Sample Rate", "sdp.sample_rate", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_media_format_specific_parameter, - { "Media format specific parameters", - "sdp.fmtp.parameter",FT_STRING, BASE_NONE, NULL, 0x0, - "Format specific parameter(fmtp)", HFILL }}, + { "Media format specific parameters", "sdp.fmtp.parameter", + FT_STRING, BASE_NONE, NULL, 0x0, + "Format specific parameter(fmtp)", HFILL } + }, { &hf_ipbcp_version, - { "IPBCP Protocol Version", - "ipbcp.version",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "IPBCP Protocol Version", "ipbcp.version", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_ipbcp_type, - { "IPBCP Command Type", - "ipbcp.command",FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "IPBCP Command Type", "ipbcp.command", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, {&hf_sdp_fmtp_mpeg4_profile_level_id, - { "Level Code", - "sdp.fmtp.profile_level_id",FT_UINT32, BASE_DEC,VALS(mp4ves_level_indication_vals), 0x0, - NULL, HFILL }}, + { "Level Code", "sdp.fmtp.profile_level_id", + FT_UINT32, BASE_DEC, VALS(mp4ves_level_indication_vals), 0x0, + NULL, HFILL } + }, { &hf_sdp_fmtp_h263_profile, - { "Profile", - "sdp.fmtp.h263profile",FT_UINT32, BASE_DEC,VALS(h263_profile_vals), 0x0, - NULL, HFILL }}, + { "Profile", "sdp.fmtp.h263profile", + FT_UINT32, BASE_DEC, VALS(h263_profile_vals), 0x0, + NULL, HFILL } + }, { &hf_sdp_fmtp_h263_level, - { "Level", - "sdp.fmtp.h263level",FT_UINT32, BASE_DEC,VALS(h263_level_vals), 0x0, - NULL, HFILL }}, + { "Level", "sdp.fmtp.h263level", + FT_UINT32, BASE_DEC, VALS(h263_level_vals), 0x0, + NULL, HFILL } + }, { &hf_sdp_h264_packetization_mode, - { "Packetization mode", - "sdp.fmtp.h264_packetization_mode",FT_UINT32, BASE_DEC,VALS(h264_packetization_mode_vals), 0x0, - NULL, HFILL }}, + { "Packetization mode", "sdp.fmtp.h264_packetization_mode", + FT_UINT32, BASE_DEC, VALS(h264_packetization_mode_vals), 0x0, + NULL, HFILL } + }, { &hf_SDPh223LogicalChannelParameters, { "h223LogicalChannelParameters", "sdp.h223LogicalChannelParameters", FT_NONE, BASE_NONE, NULL, 0, - NULL, HFILL }}, + NULL, HFILL } + }, { &hf_key_mgmt_att_value, - { "Key Management", - "sdp.key_mgmt", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Key Management", "sdp.key_mgmt", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_key_mgmt_prtcl_id, - { "Key Management Protocol (kmpid)", - "sdp.key_mgmt.kmpid", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Key Management Protocol (kmpid)", "sdp.key_mgmt.kmpid", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_key_mgmt_data, - { "Key Management Data", - "sdp.key_mgmt.data", FT_BYTES, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Key Management Data", "sdp.key_mgmt.data", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_sdp_crypto_tag, - { "tag", - "sdp.crypto.tag", FT_UINT32, BASE_DEC, NULL, 0x0, - NULL, HFILL }}, + { "tag", "sdp.crypto.tag", + FT_UINT32, BASE_DEC, NULL, 0x0, + NULL, HFILL } + }, { &hf_sdp_crypto_crypto_suite, - { "Crypto suite", - "sdp.crypto.crypto_suite", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Crypto suite", "sdp.crypto.crypto_suite", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_sdp_crypto_master_key, - { "Master Key", - "sdp.crypto.master_key", FT_BYTES, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Master Key", "sdp.crypto.master_key", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_sdp_crypto_master_salt, - { "Mater salt", - "sdp.crypto.master_salt", FT_BYTES, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Mater salt", "sdp.crypto.master_salt", + FT_BYTES, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_sdp_crypto_lifetime, - { "Lifetime", - "sdp.crypto.lifetime", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "Lifetime", "sdp.crypto.lifetime", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_sdp_crypto_mki, - { "mki-value", - "sdp.crypto.mki-valu", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "mki-value", "sdp.crypto.mki-valu", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, { &hf_sdp_crypto_mki_length, - { "mki_length", - "sdp.crypto.mki_length", FT_STRING, BASE_NONE, NULL, 0x0, - NULL, HFILL }}, + { "mki_length", "sdp.crypto.mki_length", + FT_STRING, BASE_NONE, NULL, 0x0, + NULL, HFILL } + }, }; static gint *ett[] = { &ett_sdp, @@ -2258,12 +2340,12 @@ proto_register_sdp(void) /* * Preferences registration */ - sdp_module = prefs_register_protocol(proto_sdp, NULL); - prefs_register_bool_preference(sdp_module, "establish_conversation", - "Establish Media Conversation", - "Specifies that RTP/RTCP/T.38/MSRP/etc streams are decoded based " - "upon port numbers found in SDP payload", - &global_sdp_establish_conversation); + sdp_module = prefs_register_protocol(proto_sdp, NULL); + prefs_register_bool_preference(sdp_module, "establish_conversation", + "Establish Media Conversation", + "Specifies that RTP/RTCP/T.38/MSRP/etc streams are decoded based " + "upon port numbers found in SDP payload", + &global_sdp_establish_conversation); /* * Register the dissector by name, so other dissectors can @@ -2280,11 +2362,11 @@ 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"); - t38_handle = find_dissector("t38"); - h264_handle = find_dissector("h264"); + rtp_handle = find_dissector("rtp"); + rtcp_handle = find_dissector("rtcp"); + msrp_handle = find_dissector("msrp"); + t38_handle = find_dissector("t38"); + h264_handle = find_dissector("h264"); mp4ves_handle = find_dissector("mp4ves"); sdp_handle = find_dissector("sdp"); |