mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-24 13:21:05 +00:00
Bug 805533 Send SDP parse errors through single function for reporting r=jesup
This commit is contained in:
parent
95b4fda2c5
commit
5686d907c0
@ -74,7 +74,7 @@ typedef enum {
|
||||
|
||||
/* Forward references */
|
||||
static cc_causes_t
|
||||
gsmsdp_init_local_sdp (cc_sdp_t **sdp_pp);
|
||||
gsmsdp_init_local_sdp (const char *peerconnection, cc_sdp_t **sdp_pp);
|
||||
|
||||
static void
|
||||
gsmsdp_set_media_capability(fsmdef_media_t *media,
|
||||
@ -2242,7 +2242,7 @@ gsmsdp_update_local_sdp_media (fsmdef_dcb_t *dcb_p, cc_sdp_t *cc_sdp_p,
|
||||
|
||||
if (sdp_p == NULL) {
|
||||
|
||||
gsmsdp_init_local_sdp(&(dcb_p->sdp));
|
||||
gsmsdp_init_local_sdp(dcb_p->peerconnection, &(dcb_p->sdp));
|
||||
|
||||
cc_sdp_p = dcb_p->sdp;
|
||||
if ((cc_sdp_p == NULL) || (cc_sdp_p->src_sdp == NULL)) {
|
||||
@ -4393,6 +4393,7 @@ gsmsdp_get_offered_media_types (fsm_fcb_t *fcb_p, cc_sdp_t *sdp_p, boolean *has_
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* peerconnection - handle to peerconnection object
|
||||
* sdp_pp - Pointer to the local sdp
|
||||
*
|
||||
* returns cc_causes_t
|
||||
@ -4400,7 +4401,7 @@ gsmsdp_get_offered_media_types (fsm_fcb_t *fcb_p, cc_sdp_t *sdp_p, boolean *has_
|
||||
* CC_CAUSE_ERROR - indicates failure
|
||||
*/
|
||||
static cc_causes_t
|
||||
gsmsdp_init_local_sdp (cc_sdp_t **sdp_pp)
|
||||
gsmsdp_init_local_sdp (const char *peerconnection, cc_sdp_t **sdp_pp)
|
||||
{
|
||||
char addr_str[MAX_IPADDR_STR_LEN];
|
||||
cpr_ip_addr_t ipaddr;
|
||||
@ -4413,7 +4414,7 @@ gsmsdp_init_local_sdp (cc_sdp_t **sdp_pp)
|
||||
cpr_ip_mode_e ip_mode;
|
||||
char *strtok_state;
|
||||
|
||||
if (!sdp_pp) {
|
||||
if (!peerconnection || !sdp_pp) {
|
||||
return CC_CAUSE_ERROR;
|
||||
}
|
||||
|
||||
@ -4441,13 +4442,15 @@ gsmsdp_init_local_sdp (cc_sdp_t **sdp_pp)
|
||||
* Create the local sdp struct
|
||||
*/
|
||||
if (*sdp_pp == NULL) {
|
||||
sipsdp_src_dest_create(CCSIP_SRC_SDP_BIT, sdp_pp);
|
||||
sipsdp_src_dest_create(peerconnection,
|
||||
CCSIP_SRC_SDP_BIT, sdp_pp);
|
||||
} else {
|
||||
sdp_p = *sdp_pp;
|
||||
if (sdp_p->src_sdp != NULL) {
|
||||
sipsdp_src_dest_free(CCSIP_SRC_SDP_BIT, sdp_pp);
|
||||
}
|
||||
sipsdp_src_dest_create(CCSIP_SRC_SDP_BIT, sdp_pp);
|
||||
sipsdp_src_dest_create(peerconnection,
|
||||
CCSIP_SRC_SDP_BIT, sdp_pp);
|
||||
}
|
||||
sdp_p = *sdp_pp;
|
||||
|
||||
@ -4707,7 +4710,8 @@ gsmsdp_create_local_sdp (fsmdef_dcb_t *dcb_p, boolean force_streams_enabled,
|
||||
int sdpmode = 0;
|
||||
boolean media_enabled;
|
||||
|
||||
if ( CC_CAUSE_OK != gsmsdp_init_local_sdp(&(dcb_p->sdp)) )
|
||||
if ( CC_CAUSE_OK != gsmsdp_init_local_sdp(dcb_p->peerconnection,
|
||||
&(dcb_p->sdp)) )
|
||||
return CC_CAUSE_ERROR;
|
||||
|
||||
config_get_value(CFGID_SDPMODE, &sdpmode, sizeof(sdpmode));
|
||||
@ -4833,8 +4837,8 @@ gsmsdp_create_options_sdp (cc_sdp_t ** sdp_pp)
|
||||
{
|
||||
cc_sdp_t *sdp_p;
|
||||
|
||||
|
||||
if (gsmsdp_init_local_sdp(sdp_pp) == CC_CAUSE_ERROR) {
|
||||
/* This empty string represents to associated peerconnection object */
|
||||
if (gsmsdp_init_local_sdp("", sdp_pp) == CC_CAUSE_ERROR) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -5586,7 +5590,8 @@ gsmsdp_encode_sdp_and_update_version (fsmdef_dcb_t *dcb_p, cc_msgbody_info_t *ms
|
||||
|
||||
if ( dcb_p->sdp == NULL || dcb_p->sdp->src_sdp == NULL )
|
||||
{
|
||||
if ( CC_CAUSE_OK != gsmsdp_init_local_sdp(&(dcb_p->sdp)) )
|
||||
if ( CC_CAUSE_OK != gsmsdp_init_local_sdp(dcb_p->peerconnection,
|
||||
&(dcb_p->sdp)) )
|
||||
{
|
||||
return CC_CAUSE_ERROR;
|
||||
}
|
||||
@ -5678,7 +5683,8 @@ gsmsdp_realloc_dest_sdp (fsmdef_dcb_t *dcb_p)
|
||||
/* There are SDPs to process, prepare for parsing the SDP */
|
||||
if (dcb_p->sdp == NULL) {
|
||||
/* Create internal SDP information block with dest sdp block */
|
||||
sipsdp_src_dest_create(CCSIP_DEST_SDP_BIT, &dcb_p->sdp);
|
||||
sipsdp_src_dest_create(dcb_p->peerconnection,
|
||||
CCSIP_DEST_SDP_BIT, &dcb_p->sdp);
|
||||
} else {
|
||||
/*
|
||||
* SDP info. block exists, remove the previously received
|
||||
@ -5688,7 +5694,8 @@ gsmsdp_realloc_dest_sdp (fsmdef_dcb_t *dcb_p)
|
||||
if (dcb_p->sdp->dest_sdp) {
|
||||
sipsdp_src_dest_free(CCSIP_DEST_SDP_BIT, &dcb_p->sdp);
|
||||
}
|
||||
sipsdp_src_dest_create(CCSIP_DEST_SDP_BIT, &dcb_p->sdp);
|
||||
sipsdp_src_dest_create(dcb_p->peerconnection,
|
||||
CCSIP_DEST_SDP_BIT, &dcb_p->sdp);
|
||||
}
|
||||
|
||||
/* No SDP info block and parsed control block are available */
|
||||
@ -5887,7 +5894,7 @@ gsmsdp_process_offer_sdp (fsm_fcb_t *fcb_p,
|
||||
}
|
||||
|
||||
if (init) {
|
||||
(void)gsmsdp_init_local_sdp(&(dcb_p->sdp));
|
||||
(void)gsmsdp_init_local_sdp(dcb_p->peerconnection, &(dcb_p->sdp));
|
||||
/* Note that there should not a previous version here as well */
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,6 @@ typedef int cc_causes_t;
|
||||
#define CC_CALL_NONE CC_CALL_TYPE_NONE
|
||||
#define CC_CALL_INCOMING CC_CALL_TYPE_INCOMING
|
||||
#define SDP_SIZE 4096 /* must increase this */
|
||||
#define PC_HANDLE_SIZE 17 /* 8 random bytes in hex plus null */
|
||||
#define CANDIDATE_SIZE 150
|
||||
#define MID_SIZE 150
|
||||
|
||||
|
@ -5,6 +5,7 @@
|
||||
#ifndef _SDP_H_
|
||||
#define _SDP_H_
|
||||
|
||||
#include "cc_constants.h"
|
||||
#include "sdp_os_defs.h"
|
||||
#include "ccsdp.h"
|
||||
|
||||
@ -510,6 +511,529 @@ typedef enum sdp_srtp_crypto_suite_t_ {
|
||||
#define SDP_SRTP_F8_128_HMAC_SHA1_80_KEY_BYTES 16
|
||||
#define SDP_SRTP_F8_128_HMAC_SHA1_80_SALT_BYTES 14
|
||||
|
||||
/* SDP Defines */
|
||||
|
||||
#define SDP_MAX_STRING_LEN 256 /* Max len for SDP string */
|
||||
#define SDP_MAX_SHORT_STRING_LEN 12 /* Max len for a short SDP string */
|
||||
#define SDP_MAX_PAYLOAD_TYPES 23 /* Max payload types in m= line */
|
||||
#define SDP_TOKEN_LEN 2 /* Len of <token>= */
|
||||
#define SDP_CURRENT_VERSION 0 /* Current default SDP version */
|
||||
#define SDP_MAX_PORT_PARAMS 4 /* Max m= port params - x/x/x/x */
|
||||
#define SDP_MIN_DYNAMIC_PAYLOAD 96 /* Min dynamic payload */
|
||||
#define SDP_MAX_DYNAMIC_PAYLOAD 127 /* Max dynamic payload */
|
||||
#define SDP_MIN_CIF_VALUE 1 /* applies to all QCIF,CIF,CIF4,CIF16,SQCIF */
|
||||
#define SDP_MAX_CIF_VALUE 32 /* applies to all QCIF,CIF,CIF4,CIF16,SQCIF */
|
||||
#define SDP_MAX_SRC_ADDR_LIST 1 /* Max source addrs for which filter applies */
|
||||
|
||||
|
||||
#define SDP_DEFAULT_PACKETIZATION_MODE_VALUE 0 /* max packetization mode for H.264 */
|
||||
#define SDP_MAX_PACKETIZATION_MODE_VALUE 2 /* max packetization mode for H.264 */
|
||||
|
||||
#define SDP_MAX_LEVEL_ASYMMETRY_ALLOWED_VALUE 1 /* max level asymmetry allowed value for H.264 */
|
||||
#define SDP_DEFAULT_LEVEL_ASYMMETRY_ALLOWED_VALUE 1 /* default level asymmetry allowed value for H.264 */
|
||||
#define SDP_INVALID_LEVEL_ASYMMETRY_ALLOWED_VALUE 2 /* invalid value for level-asymmetry-allowed param for H.264 */
|
||||
|
||||
|
||||
/* Max number of stream ids that can be grouped together */
|
||||
#define SDP_MAX_GROUP_STREAM_ID 10
|
||||
|
||||
|
||||
#define SDP_MAGIC_NUM 0xabcdabcd
|
||||
|
||||
#define SDP_UNSUPPORTED "Unsupported"
|
||||
#define SDP_MAX_LINE_LEN 256 /* Max len for SDP Line */
|
||||
|
||||
#define SDP_MAX_PROFILE_VALUE 10
|
||||
#define SDP_MAX_LEVEL_VALUE 100
|
||||
#define SDP_MIN_PROFILE_LEVEL_VALUE 0
|
||||
#define SDP_MAX_TTL_VALUE 255
|
||||
#define SDP_MIN_MCAST_ADDR_HI_BIT_VAL 224
|
||||
#define SDP_MAX_MCAST_ADDR_HI_BIT_VAL 239
|
||||
|
||||
/* SDP Enum Types */
|
||||
|
||||
typedef enum {
|
||||
SDP_ERR_INVALID_CONF_PTR,
|
||||
SDP_ERR_INVALID_SDP_PTR,
|
||||
SDP_ERR_INTERNAL,
|
||||
SDP_MAX_ERR_TYPES
|
||||
} sdp_errmsg_e;
|
||||
|
||||
/* SDP Structure Definitions */
|
||||
|
||||
/* String names of varios tokens */
|
||||
typedef struct {
|
||||
char *name;
|
||||
u8 strlen;
|
||||
} sdp_namearray_t;
|
||||
|
||||
/* c= line info */
|
||||
typedef struct {
|
||||
sdp_nettype_e nettype;
|
||||
sdp_addrtype_e addrtype;
|
||||
char conn_addr[SDP_MAX_STRING_LEN+1];
|
||||
tinybool is_multicast;
|
||||
u16 ttl;
|
||||
u16 num_of_addresses;
|
||||
} sdp_conn_t;
|
||||
|
||||
/* t= line info */
|
||||
typedef struct sdp_timespec {
|
||||
char start_time[SDP_MAX_STRING_LEN+1];
|
||||
char stop_time[SDP_MAX_STRING_LEN+1];
|
||||
struct sdp_timespec *next_p;
|
||||
} sdp_timespec_t;
|
||||
|
||||
|
||||
/* k= line info */
|
||||
typedef struct sdp_encryptspec {
|
||||
sdp_encrypt_type_e encrypt_type;
|
||||
char encrypt_key[SDP_MAX_STRING_LEN+1];
|
||||
} sdp_encryptspec_t;
|
||||
|
||||
|
||||
/* FMTP attribute deals with named events in the range of 0-255 as
|
||||
* defined in RFC 2833 */
|
||||
#define SDP_MIN_NE_VALUE 0
|
||||
#define SDP_MAX_NE_VALUES 256
|
||||
#define SDP_NE_BITS_PER_WORD ( sizeof(u32) * 8 )
|
||||
#define SDP_NE_NUM_BMAP_WORDS ((SDP_MAX_NE_VALUES + SDP_NE_BITS_PER_WORD - 1)/SDP_NE_BITS_PER_WORD )
|
||||
#define SDP_NE_BIT_0 ( 0x00000001 )
|
||||
#define SDP_NE_ALL_BITS ( 0xFFFFFFFF )
|
||||
|
||||
#define SDP_DEINT_BUF_REQ_FLAG 0x1
|
||||
#define SDP_INIT_BUF_TIME_FLAG 0x2
|
||||
#define SDP_MAX_RCMD_NALU_SIZE_FLAG 0x4
|
||||
#define SDP_DEINT_BUF_CAP_FLAG 0x8
|
||||
|
||||
typedef struct sdp_fmtp {
|
||||
u16 payload_num;
|
||||
u32 maxval; /* maxval optimizes bmap search */
|
||||
u32 bmap[ SDP_NE_NUM_BMAP_WORDS ];
|
||||
sdp_fmtp_format_type_e fmtp_format; /* Gives the format type
|
||||
for FMTP attribute*/
|
||||
tinybool annexb_required;
|
||||
tinybool annexa_required;
|
||||
|
||||
tinybool annexa;
|
||||
tinybool annexb;
|
||||
u32 bitrate;
|
||||
u32 mode;
|
||||
|
||||
/* some OPUS specific fmtp params */
|
||||
u32 maxaveragebitrate;
|
||||
u16 usedtx;
|
||||
u16 stereo;
|
||||
u16 useinbandfec;
|
||||
char maxcodedaudiobandwidth[SDP_MAX_STRING_LEN+1];
|
||||
u16 cbr;
|
||||
|
||||
/* some Data Channel specific fmtp params */
|
||||
u16 streams; /* Num streams per Data Channel */
|
||||
char protocol[SDP_MAX_STRING_LEN+1];
|
||||
|
||||
/* BEGIN - All Video related FMTP parameters */
|
||||
u16 qcif;
|
||||
u16 cif;
|
||||
u16 maxbr;
|
||||
u16 sqcif;
|
||||
u16 cif4;
|
||||
u16 cif16;
|
||||
|
||||
u16 custom_x;
|
||||
u16 custom_y;
|
||||
u16 custom_mpi;
|
||||
/* CUSTOM=360,240,4 implies X-AXIS=360, Y-AXIS=240; MPI=4 */
|
||||
u16 par_width;
|
||||
u16 par_height;
|
||||
/* PAR=12:11 implies par_width=12, par_height=11 */
|
||||
|
||||
/* CPCF should be a float. IOS does not support float and so it is u16 */
|
||||
/* For portable stack, CPCF should be defined as float and the parsing should
|
||||
* be modified accordingly */
|
||||
u16 cpcf;
|
||||
u16 bpp;
|
||||
u16 hrd;
|
||||
|
||||
int16 profile;
|
||||
int16 level;
|
||||
tinybool is_interlace;
|
||||
|
||||
/* some more H.264 specific fmtp params */
|
||||
char profile_level_id[SDP_MAX_STRING_LEN+1];
|
||||
char parameter_sets[SDP_MAX_STRING_LEN+1];
|
||||
u16 packetization_mode;
|
||||
u16 level_asymmetry_allowed;
|
||||
u16 interleaving_depth;
|
||||
u32 deint_buf_req;
|
||||
u32 max_don_diff;
|
||||
u32 init_buf_time;
|
||||
|
||||
u32 max_mbps;
|
||||
u32 max_fs;
|
||||
u32 max_cpb;
|
||||
u32 max_dpb;
|
||||
u32 max_br;
|
||||
tinybool redundant_pic_cap;
|
||||
u32 deint_buf_cap;
|
||||
u32 max_rcmd_nalu_size;
|
||||
tinybool parameter_add;
|
||||
|
||||
tinybool annex_d;
|
||||
|
||||
tinybool annex_f;
|
||||
tinybool annex_i;
|
||||
tinybool annex_j;
|
||||
tinybool annex_t;
|
||||
|
||||
/* H.263 codec requires annex K,N and P to have values */
|
||||
u16 annex_k_val;
|
||||
u16 annex_n_val;
|
||||
|
||||
/* Annex P can take one or more values in the range 1-4 . e.g P=1,3 */
|
||||
u16 annex_p_val_picture_resize; /* 1 = four; 2 = sixteenth */
|
||||
u16 annex_p_val_warp; /* 3 = half; 4=sixteenth */
|
||||
|
||||
u8 flag;
|
||||
|
||||
/* END - All Video related FMTP parameters */
|
||||
|
||||
} sdp_fmtp_t;
|
||||
|
||||
/* a=qos|secure|X-pc-qos|X-qos info */
|
||||
typedef struct sdp_qos {
|
||||
sdp_qos_strength_e strength;
|
||||
sdp_qos_dir_e direction;
|
||||
tinybool confirm;
|
||||
sdp_qos_status_types_e status_type;
|
||||
} sdp_qos_t;
|
||||
|
||||
/* a=curr:qos status_type direction */
|
||||
typedef struct sdp_curr {
|
||||
sdp_curr_type_e type;
|
||||
sdp_qos_status_types_e status_type;
|
||||
sdp_qos_dir_e direction;
|
||||
} sdp_curr_t;
|
||||
|
||||
/* a=des:qos strength status_type direction */
|
||||
typedef struct sdp_des {
|
||||
sdp_des_type_e type;
|
||||
sdp_qos_strength_e strength;
|
||||
sdp_qos_status_types_e status_type;
|
||||
sdp_qos_dir_e direction;
|
||||
} sdp_des_t;
|
||||
|
||||
/* a=conf:qos status_type direction */
|
||||
typedef struct sdp_conf {
|
||||
sdp_conf_type_e type;
|
||||
sdp_qos_status_types_e status_type;
|
||||
sdp_qos_dir_e direction;
|
||||
} sdp_conf_t;
|
||||
|
||||
|
||||
/* a=rtpmap or a=sprtmap info */
|
||||
typedef struct sdp_transport_map {
|
||||
u16 payload_num;
|
||||
char encname[SDP_MAX_STRING_LEN+1];
|
||||
u32 clockrate;
|
||||
u16 num_chan;
|
||||
} sdp_transport_map_t;
|
||||
|
||||
|
||||
/* a=rtr info */
|
||||
typedef struct sdp_rtr {
|
||||
tinybool confirm;
|
||||
} sdp_rtr_t;
|
||||
|
||||
/* a=subnet info */
|
||||
typedef struct sdp_subnet {
|
||||
sdp_nettype_e nettype;
|
||||
sdp_addrtype_e addrtype;
|
||||
char addr[SDP_MAX_STRING_LEN+1];
|
||||
int32 prefix;
|
||||
} sdp_subnet_t;
|
||||
|
||||
|
||||
/* a=X-pc-codec info */
|
||||
typedef struct sdp_pccodec {
|
||||
u16 num_payloads;
|
||||
ushort payload_type[SDP_MAX_PAYLOAD_TYPES];
|
||||
} sdp_pccodec_t;
|
||||
|
||||
/* a=direction info */
|
||||
typedef struct sdp_comediadir {
|
||||
sdp_mediadir_role_e role;
|
||||
tinybool conn_info_present;
|
||||
sdp_conn_t conn_info;
|
||||
u32 src_port;
|
||||
} sdp_comediadir_t;
|
||||
|
||||
|
||||
|
||||
/* a=silenceSupp info */
|
||||
typedef struct sdp_silencesupp {
|
||||
tinybool enabled;
|
||||
tinybool timer_null;
|
||||
u16 timer;
|
||||
sdp_silencesupp_pref_e pref;
|
||||
sdp_silencesupp_siduse_e siduse;
|
||||
tinybool fxnslevel_null;
|
||||
u8 fxnslevel;
|
||||
} sdp_silencesupp_t;
|
||||
|
||||
|
||||
/*
|
||||
* a=mptime info */
|
||||
/* Note that an interval value of zero corresponds to
|
||||
* the "-" syntax on the a= line.
|
||||
*/
|
||||
typedef struct sdp_mptime {
|
||||
u16 num_intervals;
|
||||
ushort intervals[SDP_MAX_PAYLOAD_TYPES];
|
||||
} sdp_mptime_t;
|
||||
|
||||
/*
|
||||
* a=X-sidin:<val>, a=X-sidout:< val> and a=X-confid: <val>
|
||||
* Stream Id,ConfID related attributes to be used for audio/video conferencing
|
||||
*
|
||||
*/
|
||||
|
||||
typedef struct sdp_stream_data {
|
||||
char x_sidin[SDP_MAX_STRING_LEN+1];
|
||||
char x_sidout[SDP_MAX_STRING_LEN+1];
|
||||
char x_confid[SDP_MAX_STRING_LEN+1];
|
||||
sdp_group_attr_e group_attr; /* FID or LS */
|
||||
u16 num_group_id;
|
||||
u16 group_id_arr[SDP_MAX_GROUP_STREAM_ID];
|
||||
} sdp_stream_data_t;
|
||||
|
||||
/*
|
||||
* a=source-filter:<filter-mode> <filter-spec>
|
||||
* <filter-spec> = <nettype> <addrtype> <dest-addr> <src_addr><src_addr>...
|
||||
* One or more source addresses to apply filter, for one or more connection
|
||||
* address in unicast/multicast environments
|
||||
*/
|
||||
typedef struct sdp_source_filter {
|
||||
sdp_src_filter_mode_e mode;
|
||||
sdp_nettype_e nettype;
|
||||
sdp_addrtype_e addrtype;
|
||||
char dest_addr[SDP_MAX_STRING_LEN+1];
|
||||
u16 num_src_addr;
|
||||
char src_list[SDP_MAX_SRC_ADDR_LIST+1][SDP_MAX_STRING_LEN+1];
|
||||
} sdp_source_filter_t;
|
||||
|
||||
/*
|
||||
* b=<bw-modifier>:<val>
|
||||
*
|
||||
*/
|
||||
typedef struct sdp_bw_data {
|
||||
struct sdp_bw_data *next_p;
|
||||
sdp_bw_modifier_e bw_modifier;
|
||||
int bw_val;
|
||||
} sdp_bw_data_t;
|
||||
|
||||
/*
|
||||
* This structure houses a linked list of sdp_bw_data_t instances. Each
|
||||
* sdp_bw_data_t instance represents one b= line.
|
||||
*/
|
||||
typedef struct sdp_bw {
|
||||
u16 bw_data_count;
|
||||
sdp_bw_data_t *bw_data_list;
|
||||
} sdp_bw_t;
|
||||
|
||||
/* Media lines for AAL2 may have more than one transport type defined
|
||||
* each with its own payload type list. These are referred to as
|
||||
* profile types instead of transport types. This structure is used
|
||||
* to handle these multiple profile types. Note: One additional profile
|
||||
* field is needed because of the way parsing is done. This is not an
|
||||
* error. */
|
||||
typedef struct sdp_media_profiles {
|
||||
u16 num_profiles;
|
||||
sdp_transport_e profile[SDP_MAX_PROFILES+1];
|
||||
u16 num_payloads[SDP_MAX_PROFILES];
|
||||
sdp_payload_ind_e payload_indicator[SDP_MAX_PROFILES][SDP_MAX_PAYLOAD_TYPES];
|
||||
u16 payload_type[SDP_MAX_PROFILES][SDP_MAX_PAYLOAD_TYPES];
|
||||
} sdp_media_profiles_t;
|
||||
|
||||
|
||||
/*
|
||||
* sdp_srtp_crypto_context_t
|
||||
* This type is used to hold cryptographic context information.
|
||||
*
|
||||
*/
|
||||
|
||||
typedef struct sdp_srtp_crypto_context_t_ {
|
||||
int32 tag;
|
||||
unsigned long selection_flags;
|
||||
sdp_srtp_crypto_suite_t suite;
|
||||
unsigned char master_key[SDP_SRTP_MAX_KEY_SIZE_BYTES];
|
||||
unsigned char master_salt[SDP_SRTP_MAX_SALT_SIZE_BYTES];
|
||||
unsigned char master_key_size_bytes;
|
||||
unsigned char master_salt_size_bytes;
|
||||
unsigned long ssrc; /* not used */
|
||||
unsigned long roc; /* not used */
|
||||
unsigned long kdr; /* not used */
|
||||
unsigned short seq; /* not used */
|
||||
sdp_srtp_fec_order_t fec_order; /* not used */
|
||||
unsigned char master_key_lifetime[SDP_SRTP_MAX_LIFETIME_BYTES];
|
||||
unsigned char mki[SDP_SRTP_MAX_MKI_SIZE_BYTES];
|
||||
u16 mki_size_bytes;
|
||||
char* session_parameters;
|
||||
} sdp_srtp_crypto_context_t;
|
||||
|
||||
|
||||
/* m= line info and associated attribute list */
|
||||
/* Note: Most of the port parameter values are 16-bit values. We set
|
||||
* the type to int32 so we can return either a 16-bit value or the
|
||||
* choose value. */
|
||||
typedef struct sdp_mca {
|
||||
sdp_media_e media;
|
||||
sdp_conn_t conn;
|
||||
sdp_transport_e transport;
|
||||
sdp_port_format_e port_format;
|
||||
int32 port;
|
||||
int32 sctpport;
|
||||
int32 num_ports;
|
||||
int32 vpi;
|
||||
u32 vci; /* VCI needs to be 32-bit */
|
||||
int32 vcci;
|
||||
int32 cid;
|
||||
u16 num_payloads;
|
||||
sdp_payload_ind_e payload_indicator[SDP_MAX_PAYLOAD_TYPES];
|
||||
u16 payload_type[SDP_MAX_PAYLOAD_TYPES];
|
||||
sdp_media_profiles_t *media_profiles_p;
|
||||
tinybool sessinfo_found;
|
||||
sdp_encryptspec_t encrypt;
|
||||
sdp_bw_t bw;
|
||||
sdp_attr_e media_direction; /* Either INACTIVE, SENDONLY,
|
||||
RECVONLY, or SENDRECV */
|
||||
u32 mid;
|
||||
struct sdp_attr *media_attrs_p;
|
||||
struct sdp_mca *next_p;
|
||||
} sdp_mca_t;
|
||||
|
||||
|
||||
/* generic a= line info */
|
||||
typedef struct sdp_attr {
|
||||
sdp_attr_e type;
|
||||
union {
|
||||
tinybool boolean_val;
|
||||
u32 u32_val;
|
||||
char string_val[SDP_MAX_STRING_LEN+1];
|
||||
char ice_attr[SDP_MAX_STRING_LEN+1];
|
||||
sdp_fmtp_t fmtp;
|
||||
sdp_qos_t qos;
|
||||
sdp_curr_t curr;
|
||||
sdp_des_t des;
|
||||
sdp_conf_t conf;
|
||||
sdp_transport_map_t transport_map; /* A rtpmap or sprtmap */
|
||||
sdp_subnet_t subnet;
|
||||
sdp_t38_ratemgmt_e t38ratemgmt;
|
||||
sdp_t38_udpec_e t38udpec;
|
||||
sdp_pccodec_t pccodec;
|
||||
sdp_silencesupp_t silencesupp;
|
||||
sdp_mca_t *cap_p; /* A X-CAP or CDSC attribute */
|
||||
sdp_rtr_t rtr;
|
||||
sdp_comediadir_t comediadir;
|
||||
sdp_srtp_crypto_context_t srtp_context;
|
||||
sdp_mptime_t mptime;
|
||||
sdp_stream_data_t stream_data;
|
||||
char unknown[SDP_MAX_STRING_LEN+1];
|
||||
sdp_source_filter_t source_filter;
|
||||
} attr;
|
||||
struct sdp_attr *next_p;
|
||||
} sdp_attr_t;
|
||||
|
||||
typedef struct sdp_srtp_crypto_suite_list_ {
|
||||
sdp_srtp_crypto_suite_t crypto_suite_val;
|
||||
char * crypto_suite_str;
|
||||
unsigned char key_size_bytes;
|
||||
unsigned char salt_size_bytes;
|
||||
} sdp_srtp_crypto_suite_list;
|
||||
|
||||
/* Application configuration options */
|
||||
typedef struct sdp_conf_options {
|
||||
u32 magic_num;
|
||||
tinybool debug_flag[SDP_MAX_DEBUG_TYPES];
|
||||
tinybool version_reqd;
|
||||
tinybool owner_reqd;
|
||||
tinybool session_name_reqd;
|
||||
tinybool timespec_reqd;
|
||||
tinybool media_supported[SDP_MAX_MEDIA_TYPES];
|
||||
tinybool nettype_supported[SDP_MAX_NETWORK_TYPES];
|
||||
tinybool addrtype_supported[SDP_MAX_ADDR_TYPES];
|
||||
tinybool transport_supported[SDP_MAX_TRANSPORT_TYPES];
|
||||
tinybool allow_choose[SDP_MAX_CHOOSE_PARAMS];
|
||||
/* Statistics counts */
|
||||
u32 num_builds;
|
||||
u32 num_parses;
|
||||
u32 num_not_sdp_desc;
|
||||
u32 num_invalid_token_order;
|
||||
u32 num_invalid_param;
|
||||
u32 num_no_resource;
|
||||
struct sdp_conf_options *next_p;
|
||||
} sdp_conf_options_t;
|
||||
|
||||
|
||||
/* Session level SDP info with pointers to media line info. */
|
||||
/* Elements here that can only be one of are included directly. Elements */
|
||||
/* that can be more than one are pointers. */
|
||||
typedef struct {
|
||||
char peerconnection[PC_HANDLE_SIZE];
|
||||
u32 magic_num;
|
||||
sdp_conf_options_t *conf_p;
|
||||
tinybool debug_flag[SDP_MAX_DEBUG_TYPES];
|
||||
char debug_str[SDP_MAX_STRING_LEN+1];
|
||||
u32 debug_id;
|
||||
int32 version; /* version is really a u16 */
|
||||
char owner_name[SDP_MAX_STRING_LEN+1];
|
||||
char owner_sessid[SDP_MAX_STRING_LEN+1];
|
||||
char owner_version[SDP_MAX_STRING_LEN+1];
|
||||
sdp_nettype_e owner_network_type;
|
||||
sdp_addrtype_e owner_addr_type;
|
||||
char owner_addr[SDP_MAX_STRING_LEN+1];
|
||||
char sessname[SDP_MAX_STRING_LEN+1];
|
||||
tinybool sessinfo_found;
|
||||
tinybool uri_found;
|
||||
sdp_conn_t default_conn;
|
||||
sdp_timespec_t *timespec_p;
|
||||
sdp_encryptspec_t encrypt;
|
||||
sdp_bw_t bw;
|
||||
sdp_attr_t *sess_attrs_p;
|
||||
|
||||
/* Info to help with building capability attributes. */
|
||||
u16 cur_cap_num;
|
||||
sdp_mca_t *cur_cap_p;
|
||||
/* Info to help parsing X-cpar attrs. */
|
||||
u16 cap_valid;
|
||||
u16 last_cap_inst;
|
||||
/* Info to help building X-cpar/cpar attrs. */
|
||||
sdp_attr_e last_cap_type;
|
||||
|
||||
/* MCA - Media, connection, and attributes */
|
||||
sdp_mca_t *mca_p;
|
||||
ushort mca_count;
|
||||
} sdp_t;
|
||||
|
||||
|
||||
/* Token processing table. */
|
||||
typedef struct {
|
||||
char *name;
|
||||
sdp_result_e (*parse_func)(sdp_t *sdp_p, u16 level, const char *ptr);
|
||||
sdp_result_e (*build_func)(sdp_t *sdp_p, u16 level, flex_string *fs);
|
||||
} sdp_tokenarray_t;
|
||||
|
||||
|
||||
/* Attribute processing table. */
|
||||
typedef struct {
|
||||
char *name;
|
||||
u16 strlen;
|
||||
sdp_result_e (*parse_func)(sdp_t *sdp_p, sdp_attr_t *attr_p,
|
||||
const char *ptr);
|
||||
sdp_result_e (*build_func)(sdp_t *sdp_p, sdp_attr_t *attr_p,
|
||||
flex_string *fs);
|
||||
} sdp_attrarray_t;
|
||||
|
||||
|
||||
/* Prototypes */
|
||||
|
||||
@ -534,13 +1058,14 @@ extern void sdp_allow_choose(void *config_p, sdp_choose_param_e param,
|
||||
tinybool choose_allowed);
|
||||
|
||||
/* sdp_main.c */
|
||||
extern void *sdp_init_description(void *config_p);
|
||||
extern void sdp_debug(void *sdp_ptr, sdp_debug_e debug_type, tinybool debug_flag);
|
||||
extern void sdp_set_string_debug(void *sdp_ptr, char *debug_str);
|
||||
extern sdp_result_e sdp_parse(void *sdp_ptr, char **bufp, u16 len);
|
||||
extern sdp_result_e sdp_build(void *sdp_ptr, flex_string *fs);
|
||||
extern void *sdp_copy(void *sdp_ptr);
|
||||
extern sdp_result_e sdp_free_description(void *sdp_ptr);
|
||||
extern sdp_t *sdp_init_description(const char *peerconnection, void *config_p);
|
||||
extern void sdp_debug(sdp_t *sdp_ptr, sdp_debug_e debug_type, tinybool debug_flag);
|
||||
extern void sdp_set_string_debug(sdp_t *sdp_ptr, const char *debug_str);
|
||||
extern sdp_result_e sdp_parse(sdp_t *sdp_ptr, char **bufp, u16 len);
|
||||
extern sdp_result_e sdp_build(sdp_t *sdp_ptr, flex_string *fs);
|
||||
extern sdp_t *sdp_copy(sdp_t *sdp_ptr);
|
||||
extern sdp_result_e sdp_free_description(sdp_t *sdp_ptr);
|
||||
extern void sdp_parse_error(const char *peerconnection, const char *format, ...);
|
||||
|
||||
extern const char *sdp_get_result_name(sdp_result_e rc);
|
||||
|
||||
|
@ -7,6 +7,9 @@
|
||||
#include "sdp_private.h"
|
||||
#include "ccsip_sdp.h"
|
||||
#include "rtp_defs.h"
|
||||
#include "CSFLog.h"
|
||||
|
||||
static const char* logTag = "sdp_access";
|
||||
|
||||
/* Function: sdp_find_media_level
|
||||
* Description: Find and return a pointer to the specified media level,
|
||||
@ -1325,7 +1328,7 @@ int32 sdp_get_media_portnum (void *sdp_ptr, u16 level)
|
||||
(mca_p->port_format != SDP_PORT_NUM_VPI_VCI) &&
|
||||
(mca_p->port_format != SDP_PORT_NUM_VPI_VCI_CID)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Port num not valid for media line %u",
|
||||
CSFLogError(logTag, "%s Port num not valid for media line %u",
|
||||
sdp_p->debug_str, level);
|
||||
}
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
@ -1360,7 +1363,7 @@ int32 sdp_get_media_portcount (void *sdp_ptr, u16 level)
|
||||
/* Make sure port number is valid for the specified format. */
|
||||
if (mca_p->port_format != SDP_PORT_NUM_COUNT) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Port count not valid for media line %u",
|
||||
CSFLogError(logTag, "%s Port count not valid for media line %u",
|
||||
sdp_p->debug_str, level);
|
||||
}
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
@ -1397,7 +1400,7 @@ int32 sdp_get_media_vpi (void *sdp_ptr, u16 level)
|
||||
(mca_p->port_format != SDP_PORT_NUM_VPI_VCI) &&
|
||||
(mca_p->port_format != SDP_PORT_NUM_VPI_VCI_CID)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s VPI not valid for media line %u",
|
||||
CSFLogError(logTag, "%s VPI not valid for media line %u",
|
||||
sdp_p->debug_str, level);
|
||||
}
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
@ -1434,7 +1437,7 @@ u32 sdp_get_media_vci (void *sdp_ptr, u16 level)
|
||||
(mca_p->port_format != SDP_PORT_NUM_VPI_VCI) &&
|
||||
(mca_p->port_format != SDP_PORT_NUM_VPI_VCI_CID)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s VCI not valid for media line %u",
|
||||
CSFLogError(logTag, "%s VCI not valid for media line %u",
|
||||
sdp_p->debug_str, level);
|
||||
}
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
@ -1470,7 +1473,7 @@ int32 sdp_get_media_vcci (void *sdp_ptr, u16 level)
|
||||
if ((mca_p->port_format != SDP_PORT_VCCI) &&
|
||||
(mca_p->port_format != SDP_PORT_VCCI_CID)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s VCCI not valid for media line %u",
|
||||
CSFLogError(logTag, "%s VCCI not valid for media line %u",
|
||||
sdp_p->debug_str, level);
|
||||
}
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
@ -1506,7 +1509,7 @@ int32 sdp_get_media_cid (void *sdp_ptr, u16 level)
|
||||
if ((mca_p->port_format != SDP_PORT_VCCI_CID) &&
|
||||
(mca_p->port_format != SDP_PORT_NUM_VPI_VCI_CID)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s CID not valid for media line %u",
|
||||
CSFLogError(logTag, "%s CID not valid for media line %u",
|
||||
sdp_p->debug_str, level);
|
||||
}
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
@ -1822,7 +1825,7 @@ sdp_result_e sdp_insert_media_line (void *sdp_ptr, u16 level)
|
||||
|
||||
if ((level < 1) || (level > (sdp_p->mca_count+1))) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid media line (%u) to insert, max is "
|
||||
CSFLogError(logTag, "%s Invalid media line (%u) to insert, max is "
|
||||
"(%u).", sdp_p->debug_str, level, sdp_p->mca_count);
|
||||
}
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
@ -2229,7 +2232,7 @@ sdp_result_e sdp_add_media_profile (void *sdp_ptr, u16 level,
|
||||
|
||||
if (mca_p->media_profiles_p->num_profiles >= SDP_MAX_PROFILES) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Max number of media profiles already specified"
|
||||
CSFLogError(logTag, "%s Max number of media profiles already specified"
|
||||
" for media level %u", sdp_p->debug_str, level);
|
||||
}
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
@ -2272,7 +2275,7 @@ sdp_result_e sdp_add_media_payload_type (void *sdp_ptr, u16 level,
|
||||
|
||||
if (mca_p->num_payloads == SDP_MAX_PAYLOAD_TYPES) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Max number of payload types already defined "
|
||||
CSFLogError(logTag, "%s Max number of payload types already defined "
|
||||
"for media line %u", sdp_p->debug_str, level);
|
||||
}
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
@ -2317,7 +2320,7 @@ sdp_result_e sdp_add_media_profile_payload_type (void *sdp_ptr, u16 level,
|
||||
if ((prof_num < 1) ||
|
||||
(prof_num > mca_p->media_profiles_p->num_profiles)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid profile number (%u) for set profile "
|
||||
CSFLogError(logTag, "%s Invalid profile number (%u) for set profile "
|
||||
" payload type", sdp_p->debug_str, level);
|
||||
}
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
@ -2327,7 +2330,7 @@ sdp_result_e sdp_add_media_profile_payload_type (void *sdp_ptr, u16 level,
|
||||
if (mca_p->media_profiles_p->num_payloads[prof_num-1] ==
|
||||
SDP_MAX_PAYLOAD_TYPES) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Max number of profile payload types already "
|
||||
CSFLogError(logTag, "%s Max number of profile payload types already "
|
||||
"defined profile %u on media line %u",
|
||||
sdp_p->debug_str, prof_num, level);
|
||||
}
|
||||
@ -2429,7 +2432,7 @@ sdp_result_e sdp_copy_all_bw_lines (void *src_sdp_ptr, void *dst_sdp_ptr,
|
||||
mca_p = sdp_find_media_level(src_sdp_p, src_level);
|
||||
if (mca_p == NULL) {
|
||||
if (src_sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid src media level (%u) for copy all "
|
||||
CSFLogError(logTag, "%s Invalid src media level (%u) for copy all "
|
||||
"attrs ", src_sdp_p->debug_str, src_level);
|
||||
}
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
@ -2444,7 +2447,7 @@ sdp_result_e sdp_copy_all_bw_lines (void *src_sdp_ptr, void *dst_sdp_ptr,
|
||||
mca_p = sdp_find_media_level(dst_sdp_p, dst_level);
|
||||
if (mca_p == NULL) {
|
||||
if (src_sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid dst media level (%u) for copy all "
|
||||
CSFLogError(logTag, "%s Invalid dst media level (%u) for copy all "
|
||||
"attrs ", src_sdp_p->debug_str, dst_level);
|
||||
}
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
@ -2725,7 +2728,7 @@ sdp_result_e sdp_delete_bw_line (void *sdp_ptr, u16 level, u16 inst_num)
|
||||
|
||||
if (bw_data_p == NULL) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s bw line instance %d not found.",
|
||||
CSFLogError(logTag, "%s bw line instance %d not found.",
|
||||
sdp_p->debug_str, inst_num);
|
||||
}
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
@ -2772,7 +2775,7 @@ sdp_result_e sdp_set_bw (void *sdp_ptr, u16 level, u16 inst_num,
|
||||
if ((bw_modifier < SDP_BW_MODIFIER_AS) ||
|
||||
(bw_modifier >= SDP_MAX_BW_MODIFIER_VAL)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid bw modifier type: %d.",
|
||||
CSFLogError(logTag, "%s Invalid bw modifier type: %d.",
|
||||
sdp_p->debug_str, bw_modifier);
|
||||
}
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
@ -2782,7 +2785,7 @@ sdp_result_e sdp_set_bw (void *sdp_ptr, u16 level, u16 inst_num,
|
||||
bw_data_p = sdp_find_bw_line(sdp_p, level, inst_num);
|
||||
if (bw_data_p == NULL) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s The %u instance of a b= line was not found at level %u.",
|
||||
CSFLogError(logTag, "%s The %u instance of a b= line was not found at level %u.",
|
||||
sdp_p->debug_str, inst_num, level);
|
||||
}
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -5,7 +5,9 @@
|
||||
#include "sdp_os_defs.h"
|
||||
#include "sdp.h"
|
||||
#include "sdp_private.h"
|
||||
#include "CSFLog.h"
|
||||
|
||||
static const char* logTag = "sdp_config";
|
||||
|
||||
/* Function: sdp_verify_conf_ptr
|
||||
* Description: Verify the configuration pointer is valid by checking for
|
||||
@ -21,7 +23,7 @@ tinybool sdp_verify_conf_ptr (sdp_conf_options_t *conf_p)
|
||||
if ((conf_p != NULL) && (conf_p->magic_num == SDP_MAGIC_NUM)) {
|
||||
return (TRUE);
|
||||
} else {
|
||||
sdp_log_errmsg(SDP_ERR_INVALID_CONF_PTR, NULL);
|
||||
CSFLogError(logTag, "SDP: Invalid Config pointer.");
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,9 @@
|
||||
#include "sdp_os_defs.h"
|
||||
#include "sdp.h"
|
||||
#include "sdp_private.h"
|
||||
#include "CSFLog.h"
|
||||
|
||||
static const char* logTag = "sdp_main";
|
||||
|
||||
/* Note: These *must* be in the same order as the enum types. */
|
||||
const sdp_tokenarray_t sdp_token[SDP_MAX_TOKENS] =
|
||||
@ -710,7 +712,7 @@ inline tinybool sdp_verify_sdp_ptr (sdp_t *sdp_p)
|
||||
if ((sdp_p != NULL) && (sdp_p->magic_num == SDP_MAGIC_NUM)) {
|
||||
return (TRUE);
|
||||
} else {
|
||||
sdp_log_errmsg(SDP_ERR_INVALID_SDP_PTR, NULL);
|
||||
CSFLogError(logTag, "SDP: Invalid SDP pointer.");
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
@ -725,7 +727,7 @@ inline tinybool sdp_verify_sdp_ptr (sdp_t *sdp_p)
|
||||
* Parameters: config_p The config handle returned by sdp_init_config
|
||||
* Returns: A handle for a new SDP structure as a void ptr.
|
||||
*/
|
||||
void *sdp_init_description (void *config_p)
|
||||
sdp_t *sdp_init_description (const char *peerconnection, void *config_p)
|
||||
{
|
||||
int i;
|
||||
sdp_t *sdp_p;
|
||||
@ -740,6 +742,8 @@ void *sdp_init_description (void *config_p)
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
sstrncpy(sdp_p->peerconnection, peerconnection, sizeof(sdp_p->peerconnection));
|
||||
|
||||
/* Initialize magic number. */
|
||||
sdp_p->magic_num = SDP_MAGIC_NUM;
|
||||
|
||||
@ -779,7 +783,7 @@ void *sdp_init_description (void *config_p)
|
||||
}
|
||||
|
||||
|
||||
/* Function: void sdp_debug(void *sdp_p, sdp_debug_e debug_type,
|
||||
/* Function: void sdp_debug(sdp_t *sdp_p, sdp_debug_e debug_type,
|
||||
* tinybool my_bool);
|
||||
* Description: Define the type of debug for this particular SDP structure.
|
||||
* By default, each SDP description has the settings that are
|
||||
@ -792,10 +796,8 @@ void *sdp_init_description (void *config_p)
|
||||
* my_bool Defines whether the debug should be enabled or not.
|
||||
* Returns: Nothing.
|
||||
*/
|
||||
void sdp_debug (void *sdp_ptr, sdp_debug_e debug_type, tinybool debug_flag)
|
||||
void sdp_debug (sdp_t *sdp_p, sdp_debug_e debug_type, tinybool debug_flag)
|
||||
{
|
||||
sdp_t *sdp_p = (sdp_t *)sdp_ptr;
|
||||
|
||||
if (sdp_verify_sdp_ptr(sdp_p) == FALSE) {
|
||||
return;
|
||||
}
|
||||
@ -806,20 +808,18 @@ void sdp_debug (void *sdp_ptr, sdp_debug_e debug_type, tinybool debug_flag)
|
||||
}
|
||||
|
||||
|
||||
/* Function: void sdp_set_string_debug(void *sdp_p, char *debug_str)
|
||||
/* Function: void sdp_set_string_debug(sdp_t *sdp_p, char *debug_str)
|
||||
* Description: Define a string to be associated with all debug output
|
||||
* for this SDP. The string will be copied into the SDP
|
||||
* structure and so the library will not be dependent on
|
||||
* the application's memory for this string.
|
||||
* Parameters: sdp_ptr The SDP handle returned by sdp_init_description.
|
||||
* Parameters: sdp_p The SDP handle returned by sdp_init_description.
|
||||
* debug_str Pointer to a string that should be printed out
|
||||
* with every debug msg.
|
||||
* Returns: Nothing.
|
||||
*/
|
||||
void sdp_set_string_debug (void *sdp_ptr, char *debug_str)
|
||||
void sdp_set_string_debug (sdp_t *sdp_p, const char *debug_str)
|
||||
{
|
||||
sdp_t *sdp_p = (sdp_t *)sdp_ptr;
|
||||
|
||||
if (sdp_verify_sdp_ptr(sdp_p) == FALSE) {
|
||||
return;
|
||||
}
|
||||
@ -846,11 +846,10 @@ sdp_result_e sdp_validate_sdp (sdp_t *sdp_p)
|
||||
num_media_levels = sdp_get_num_media_lines((void *)sdp_p);
|
||||
for (i=1; i <= num_media_levels; i++) {
|
||||
if (sdp_connection_valid((void *)sdp_p, (unsigned short)i) == FALSE) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s c= connection line not specified for "
|
||||
"every media level, validation failed.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s c= connection line not specified for "
|
||||
"every media level, validation failed.",
|
||||
sdp_p->debug_str);
|
||||
return (SDP_FAILURE);
|
||||
}
|
||||
}
|
||||
@ -859,28 +858,25 @@ sdp_result_e sdp_validate_sdp (sdp_t *sdp_p)
|
||||
/* Validate required lines were specified */
|
||||
if ((sdp_owner_valid((void *)sdp_p) == FALSE) &&
|
||||
(sdp_p->conf_p->owner_reqd == TRUE)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s o= owner line not specified, validation "
|
||||
"failed.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s o= owner line not specified, validation failed.",
|
||||
sdp_p->debug_str);
|
||||
return (SDP_FAILURE);
|
||||
}
|
||||
|
||||
if ((sdp_session_name_valid((void *)sdp_p) == FALSE) &&
|
||||
(sdp_p->conf_p->session_name_reqd == TRUE)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s s= session name line not specified, validation "
|
||||
"failed.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s s= session name line not specified, validation failed.",
|
||||
sdp_p->debug_str);
|
||||
return (SDP_FAILURE);
|
||||
}
|
||||
|
||||
if ((sdp_timespec_valid((void *)sdp_p) == FALSE) &&
|
||||
(sdp_p->conf_p->timespec_reqd == TRUE)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s t= timespec line not specified, validation "
|
||||
"failed.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s t= timespec line not specified, validation failed.",
|
||||
sdp_p->debug_str);
|
||||
return (SDP_FAILURE);
|
||||
}
|
||||
|
||||
@ -889,7 +885,7 @@ sdp_result_e sdp_validate_sdp (sdp_t *sdp_p)
|
||||
|
||||
/* Function: sdp_parse
|
||||
* Description: Parse an SDP description in the specified buffer.
|
||||
* Parameters: sdp_ptr The SDP handle returned by sdp_init_description
|
||||
* Parameters: sdp_p The SDP handle returned by sdp_init_description
|
||||
* bufp Pointer to the buffer containing the SDP
|
||||
* description to parse.
|
||||
* len The length of the buffer.
|
||||
@ -897,7 +893,7 @@ sdp_result_e sdp_validate_sdp (sdp_t *sdp_p)
|
||||
* if not, what type of error was encountered. The
|
||||
* information from the parse is stored in the sdp_p structure.
|
||||
*/
|
||||
sdp_result_e sdp_parse (void *sdp_ptr, char **bufp, u16 len)
|
||||
sdp_result_e sdp_parse (sdp_t *sdp_p, char **bufp, u16 len)
|
||||
{
|
||||
u8 i;
|
||||
u16 cur_level = SDP_SESSION_LEVEL;
|
||||
@ -910,7 +906,6 @@ sdp_result_e sdp_parse (void *sdp_ptr, char **bufp, u16 len)
|
||||
tinybool end_found = FALSE;
|
||||
tinybool first_line = TRUE;
|
||||
tinybool unrec_token = FALSE;
|
||||
sdp_t *sdp_p = (sdp_t *)sdp_ptr;
|
||||
|
||||
if (sdp_verify_sdp_ptr(sdp_p) == FALSE) {
|
||||
return (SDP_INVALID_SDP_PTR);
|
||||
@ -942,10 +937,9 @@ sdp_result_e sdp_parse (void *sdp_ptr, char **bufp, u16 len)
|
||||
ptr = next_ptr;
|
||||
line_end = sdp_findchar(ptr, "\n");
|
||||
if (line_end >= (*bufp + len)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s End of line beyond end of buffer.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s End of line beyond end of buffer.",
|
||||
sdp_p->debug_str);
|
||||
end_found = TRUE;
|
||||
break;
|
||||
}
|
||||
@ -972,18 +966,15 @@ sdp_result_e sdp_parse (void *sdp_ptr, char **bufp, u16 len)
|
||||
unrec_token = TRUE;
|
||||
}
|
||||
if (first_line == TRUE) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Attempt to parse text not recognized as "
|
||||
"SDP text, parse fails.", sdp_p->debug_str);
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Attempt to parse text not recognized as "
|
||||
"SDP text, parse fails.", sdp_p->debug_str);
|
||||
/* If we haven't already printed out the line we
|
||||
* were trying to parse, do it now.
|
||||
*/
|
||||
if (!sdp_p->debug_flag[SDP_DEBUG_TRACE]) {
|
||||
SDP_PRINT("%s ", sdp_p->debug_str);
|
||||
|
||||
SDP_PRINT("%*s", line_end - ptr, ptr);
|
||||
|
||||
}
|
||||
if (!sdp_p->debug_flag[SDP_DEBUG_TRACE]) {
|
||||
SDP_PRINT("%s ", sdp_p->debug_str);
|
||||
SDP_PRINT("%*s", line_end - ptr, ptr);
|
||||
}
|
||||
sdp_p->conf_p->num_not_sdp_desc++;
|
||||
return (SDP_NOT_SDP_DESCRIPTION);
|
||||
@ -1018,10 +1009,9 @@ sdp_result_e sdp_parse (void *sdp_ptr, char **bufp, u16 len)
|
||||
(i != SDP_TOKEN_B) && (i != SDP_TOKEN_K) &&
|
||||
(i != SDP_TOKEN_A) && (i != SDP_TOKEN_M)) {
|
||||
sdp_p->conf_p->num_invalid_token_order++;
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: Invalid token %s found at media "
|
||||
"level", sdp_p->debug_str, sdp_token[i].name);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: Invalid token %s found at media level",
|
||||
sdp_p->debug_str, sdp_token[i].name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -1030,10 +1020,9 @@ sdp_result_e sdp_parse (void *sdp_ptr, char **bufp, u16 len)
|
||||
if (first_line == TRUE) {
|
||||
if (i != SDP_TOKEN_V) {
|
||||
if (sdp_p->conf_p->version_reqd == TRUE) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s First line not v=, parse fails",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s First line not v=, parse fails",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_token_order++;
|
||||
result = SDP_INVALID_TOKEN_ORDERING;
|
||||
parse_done = TRUE;
|
||||
@ -1047,11 +1036,10 @@ sdp_result_e sdp_parse (void *sdp_ptr, char **bufp, u16 len)
|
||||
} else {
|
||||
if (i < last_token) {
|
||||
sdp_p->conf_p->num_invalid_token_order++;
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: Invalid token ordering detected, "
|
||||
"token %s found after token %s", sdp_p->debug_str,
|
||||
sdp_token[i].name, sdp_token[last_token].name);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: Invalid token ordering detected, "
|
||||
"token %s found after token %s", sdp_p->debug_str,
|
||||
sdp_token[i].name, sdp_token[last_token].name);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1105,16 +1093,15 @@ sdp_result_e sdp_parse (void *sdp_ptr, char **bufp, u16 len)
|
||||
/* Function: sdp_build
|
||||
* Description: Build an SDP description in the specified buffer based
|
||||
* on the information in the given SDP structure.
|
||||
* Parameters: sdp_ptr The SDP handle returned by sdp_init_description
|
||||
* Parameters: sdp_p The SDP handle returned by sdp_init_description
|
||||
* fs A flex_string where the SDP description should be built.
|
||||
* Returns: A result value indicating if the build was successful and
|
||||
* if not, what type of error was encountered - e.g.,
|
||||
* description was too long for the given buffer.
|
||||
*/
|
||||
sdp_result_e sdp_build (void *sdp_ptr, flex_string *fs)
|
||||
sdp_result_e sdp_build (sdp_t *sdp_p, flex_string *fs)
|
||||
{
|
||||
int i, j;
|
||||
sdp_t *sdp_p = (sdp_t *)sdp_ptr;
|
||||
sdp_result_e result = SDP_SUCCESS;
|
||||
|
||||
if (sdp_verify_sdp_ptr(sdp_p) == FALSE) {
|
||||
@ -1164,16 +1151,15 @@ sdp_result_e sdp_build (void *sdp_ptr, flex_string *fs)
|
||||
/* Function: sdp_copy
|
||||
* Description: Create a new SDP structure that is an exact copy of the
|
||||
* one passed in.
|
||||
* Parameters: sdp_ptr The SDP handle of the SDP to be copied.
|
||||
* Parameters: orig_sdp_p The SDP handle of the SDP to be copied.
|
||||
* Returns: A handle for a new SDP structure as a void ptr.
|
||||
*/
|
||||
void *sdp_copy (void *sdp_ptr)
|
||||
sdp_t *sdp_copy (sdp_t *orig_sdp_p)
|
||||
{
|
||||
int i, j;
|
||||
u16 cur_level;
|
||||
sdp_result_e rc;
|
||||
sdp_t *new_sdp_p;
|
||||
sdp_t *orig_sdp_p = (sdp_t *)sdp_ptr;
|
||||
sdp_timespec_t *cur_time_p = NULL;
|
||||
sdp_timespec_t *orig_time_p = NULL;
|
||||
sdp_mca_t *orig_mca_p = NULL;
|
||||
@ -1195,6 +1181,9 @@ void *sdp_copy (void *sdp_ptr)
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
sstrncpy(new_sdp_p->peerconnection, orig_sdp_p->peerconnection,
|
||||
sizeof(new_sdp_p->peerconnection));
|
||||
|
||||
/* Initialize magic number. */
|
||||
new_sdp_p->magic_num = orig_sdp_p->magic_num;
|
||||
|
||||
@ -1381,14 +1370,13 @@ void *sdp_copy (void *sdp_ptr)
|
||||
|
||||
/* Function: sdp_free_description
|
||||
* Description: Free an SDP description and all memory associated with it.
|
||||
* Parameters: sdp_ptr The SDP handle returned by sdp_init_description
|
||||
* Parameters: sdp_p The SDP handle returned by sdp_init_description
|
||||
* Returns: A result value indicating if the free was successful and
|
||||
* if not, what type of error was encountered - e.g., sdp_p
|
||||
* was invalid and didn't point to an SDP structure.
|
||||
*/
|
||||
sdp_result_e sdp_free_description (void *sdp_ptr)
|
||||
sdp_result_e sdp_free_description (sdp_t *sdp_p)
|
||||
{
|
||||
sdp_t *sdp_p = (sdp_t *)sdp_ptr;
|
||||
sdp_timespec_t *time_p, *next_time_p;
|
||||
sdp_attr_t *attr_p, *next_attr_p;
|
||||
sdp_mca_t *mca_p, *next_mca_p;
|
||||
@ -1459,3 +1447,17 @@ sdp_result_e sdp_free_description (void *sdp_ptr)
|
||||
|
||||
return (SDP_SUCCESS);
|
||||
}
|
||||
|
||||
/*
|
||||
* sdp_parse_error
|
||||
* Send SDP parsing errors to log and up to peerconnection
|
||||
*/
|
||||
void sdp_parse_error(const char *peerconnection, const char *format, ...) {
|
||||
va_list ap;
|
||||
|
||||
/* TODO - report error up to PeerConnection here */
|
||||
|
||||
va_start(ap, format);
|
||||
CSFLogErrorV("SDP Parse", format, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
@ -13,8 +13,6 @@
|
||||
#include "phone_debug.h"
|
||||
|
||||
|
||||
#define SDP_ERROR buginf
|
||||
#define SDP_WARN buginf
|
||||
#define SDP_PRINT buginf
|
||||
#define SDP_MALLOC(x) cpr_calloc(1, (x))
|
||||
#define SDP_FREE cpr_free
|
||||
|
@ -8,531 +8,6 @@
|
||||
|
||||
#include "sdp.h"
|
||||
|
||||
/* SDP Defines */
|
||||
|
||||
#define SDP_MAX_STRING_LEN 256 /* Max len for SDP string */
|
||||
#define SDP_MAX_SHORT_STRING_LEN 12 /* Max len for a short SDP string */
|
||||
#define SDP_MAX_PAYLOAD_TYPES 23 /* Max payload types in m= line */
|
||||
#define SDP_TOKEN_LEN 2 /* Len of <token>= */
|
||||
#define SDP_CURRENT_VERSION 0 /* Current default SDP version */
|
||||
#define SDP_MAX_PORT_PARAMS 4 /* Max m= port params - x/x/x/x */
|
||||
#define SDP_MIN_DYNAMIC_PAYLOAD 96 /* Min dynamic payload */
|
||||
#define SDP_MAX_DYNAMIC_PAYLOAD 127 /* Max dynamic payload */
|
||||
#define SDP_MIN_CIF_VALUE 1 /* applies to all QCIF,CIF,CIF4,CIF16,SQCIF */
|
||||
#define SDP_MAX_CIF_VALUE 32 /* applies to all QCIF,CIF,CIF4,CIF16,SQCIF */
|
||||
#define SDP_MAX_SRC_ADDR_LIST 1 /* Max source addrs for which filter applies */
|
||||
|
||||
|
||||
#define SDP_DEFAULT_PACKETIZATION_MODE_VALUE 0 /* max packetization mode for H.264 */
|
||||
#define SDP_MAX_PACKETIZATION_MODE_VALUE 2 /* max packetization mode for H.264 */
|
||||
|
||||
#define SDP_MAX_LEVEL_ASYMMETRY_ALLOWED_VALUE 1 /* max level asymmetry allowed value for H.264 */
|
||||
#define SDP_DEFAULT_LEVEL_ASYMMETRY_ALLOWED_VALUE 1 /* default level asymmetry allowed value for H.264 */
|
||||
#define SDP_INVALID_LEVEL_ASYMMETRY_ALLOWED_VALUE 2 /* invalid value for level-asymmetry-allowed param for H.264 */
|
||||
|
||||
|
||||
/* Max number of stream ids that can be grouped together */
|
||||
#define SDP_MAX_GROUP_STREAM_ID 10
|
||||
|
||||
|
||||
#define SDP_MAGIC_NUM 0xabcdabcd
|
||||
|
||||
#define SDP_UNSUPPORTED "Unsupported"
|
||||
#define SDP_MAX_LINE_LEN 256 /* Max len for SDP Line */
|
||||
|
||||
#define SDP_MAX_PROFILE_VALUE 10
|
||||
#define SDP_MAX_LEVEL_VALUE 100
|
||||
#define SDP_MIN_PROFILE_LEVEL_VALUE 0
|
||||
#define SDP_MAX_TTL_VALUE 255
|
||||
#define SDP_MIN_MCAST_ADDR_HI_BIT_VAL 224
|
||||
#define SDP_MAX_MCAST_ADDR_HI_BIT_VAL 239
|
||||
|
||||
/* SDP Enum Types */
|
||||
|
||||
typedef enum {
|
||||
SDP_ERR_INVALID_CONF_PTR,
|
||||
SDP_ERR_INVALID_SDP_PTR,
|
||||
SDP_ERR_INTERNAL,
|
||||
SDP_MAX_ERR_TYPES
|
||||
} sdp_errmsg_e;
|
||||
|
||||
/* SDP Structure Definitions */
|
||||
|
||||
/* String names of varios tokens */
|
||||
typedef struct {
|
||||
char *name;
|
||||
u8 strlen;
|
||||
} sdp_namearray_t;
|
||||
|
||||
/* c= line info */
|
||||
typedef struct {
|
||||
sdp_nettype_e nettype;
|
||||
sdp_addrtype_e addrtype;
|
||||
char conn_addr[SDP_MAX_STRING_LEN+1];
|
||||
tinybool is_multicast;
|
||||
u16 ttl;
|
||||
u16 num_of_addresses;
|
||||
} sdp_conn_t;
|
||||
|
||||
/* t= line info */
|
||||
typedef struct sdp_timespec {
|
||||
char start_time[SDP_MAX_STRING_LEN+1];
|
||||
char stop_time[SDP_MAX_STRING_LEN+1];
|
||||
struct sdp_timespec *next_p;
|
||||
} sdp_timespec_t;
|
||||
|
||||
|
||||
/* k= line info */
|
||||
typedef struct sdp_encryptspec {
|
||||
sdp_encrypt_type_e encrypt_type;
|
||||
char encrypt_key[SDP_MAX_STRING_LEN+1];
|
||||
} sdp_encryptspec_t;
|
||||
|
||||
|
||||
/* FMTP attribute deals with named events in the range of 0-255 as
|
||||
* defined in RFC 2833 */
|
||||
#define SDP_MIN_NE_VALUE 0
|
||||
#define SDP_MAX_NE_VALUES 256
|
||||
#define SDP_NE_BITS_PER_WORD ( sizeof(u32) * 8 )
|
||||
#define SDP_NE_NUM_BMAP_WORDS ((SDP_MAX_NE_VALUES + SDP_NE_BITS_PER_WORD - 1)/SDP_NE_BITS_PER_WORD )
|
||||
#define SDP_NE_BIT_0 ( 0x00000001 )
|
||||
#define SDP_NE_ALL_BITS ( 0xFFFFFFFF )
|
||||
|
||||
#define SDP_DEINT_BUF_REQ_FLAG 0x1
|
||||
#define SDP_INIT_BUF_TIME_FLAG 0x2
|
||||
#define SDP_MAX_RCMD_NALU_SIZE_FLAG 0x4
|
||||
#define SDP_DEINT_BUF_CAP_FLAG 0x8
|
||||
|
||||
typedef struct sdp_fmtp {
|
||||
u16 payload_num;
|
||||
u32 maxval; /* maxval optimizes bmap search */
|
||||
u32 bmap[ SDP_NE_NUM_BMAP_WORDS ];
|
||||
sdp_fmtp_format_type_e fmtp_format; /* Gives the format type
|
||||
for FMTP attribute*/
|
||||
tinybool annexb_required;
|
||||
tinybool annexa_required;
|
||||
|
||||
tinybool annexa;
|
||||
tinybool annexb;
|
||||
u32 bitrate;
|
||||
u32 mode;
|
||||
|
||||
/* some OPUS specific fmtp params */
|
||||
u32 maxaveragebitrate;
|
||||
u16 usedtx;
|
||||
u16 stereo;
|
||||
u16 useinbandfec;
|
||||
char maxcodedaudiobandwidth[SDP_MAX_STRING_LEN+1];
|
||||
u16 cbr;
|
||||
|
||||
/* some Data Channel specific fmtp params */
|
||||
u16 streams; /* Num streams per Data Channel */
|
||||
char protocol[SDP_MAX_STRING_LEN+1];
|
||||
|
||||
/* BEGIN - All Video related FMTP parameters */
|
||||
u16 qcif;
|
||||
u16 cif;
|
||||
u16 maxbr;
|
||||
u16 sqcif;
|
||||
u16 cif4;
|
||||
u16 cif16;
|
||||
|
||||
u16 custom_x;
|
||||
u16 custom_y;
|
||||
u16 custom_mpi;
|
||||
/* CUSTOM=360,240,4 implies X-AXIS=360, Y-AXIS=240; MPI=4 */
|
||||
u16 par_width;
|
||||
u16 par_height;
|
||||
/* PAR=12:11 implies par_width=12, par_height=11 */
|
||||
|
||||
/* CPCF should be a float. IOS does not support float and so it is u16 */
|
||||
/* For portable stack, CPCF should be defined as float and the parsing should
|
||||
* be modified accordingly */
|
||||
u16 cpcf;
|
||||
u16 bpp;
|
||||
u16 hrd;
|
||||
|
||||
int16 profile;
|
||||
int16 level;
|
||||
tinybool is_interlace;
|
||||
|
||||
/* some more H.264 specific fmtp params */
|
||||
char profile_level_id[SDP_MAX_STRING_LEN+1];
|
||||
char parameter_sets[SDP_MAX_STRING_LEN+1];
|
||||
u16 packetization_mode;
|
||||
u16 level_asymmetry_allowed;
|
||||
u16 interleaving_depth;
|
||||
u32 deint_buf_req;
|
||||
u32 max_don_diff;
|
||||
u32 init_buf_time;
|
||||
|
||||
u32 max_mbps;
|
||||
u32 max_fs;
|
||||
u32 max_cpb;
|
||||
u32 max_dpb;
|
||||
u32 max_br;
|
||||
tinybool redundant_pic_cap;
|
||||
u32 deint_buf_cap;
|
||||
u32 max_rcmd_nalu_size;
|
||||
tinybool parameter_add;
|
||||
|
||||
tinybool annex_d;
|
||||
|
||||
tinybool annex_f;
|
||||
tinybool annex_i;
|
||||
tinybool annex_j;
|
||||
tinybool annex_t;
|
||||
|
||||
/* H.263 codec requires annex K,N and P to have values */
|
||||
u16 annex_k_val;
|
||||
u16 annex_n_val;
|
||||
|
||||
/* Annex P can take one or more values in the range 1-4 . e.g P=1,3 */
|
||||
u16 annex_p_val_picture_resize; /* 1 = four; 2 = sixteenth */
|
||||
u16 annex_p_val_warp; /* 3 = half; 4=sixteenth */
|
||||
|
||||
u8 flag;
|
||||
|
||||
/* END - All Video related FMTP parameters */
|
||||
|
||||
} sdp_fmtp_t;
|
||||
|
||||
/* a=qos|secure|X-pc-qos|X-qos info */
|
||||
typedef struct sdp_qos {
|
||||
sdp_qos_strength_e strength;
|
||||
sdp_qos_dir_e direction;
|
||||
tinybool confirm;
|
||||
sdp_qos_status_types_e status_type;
|
||||
} sdp_qos_t;
|
||||
|
||||
/* a=curr:qos status_type direction */
|
||||
typedef struct sdp_curr {
|
||||
sdp_curr_type_e type;
|
||||
sdp_qos_status_types_e status_type;
|
||||
sdp_qos_dir_e direction;
|
||||
} sdp_curr_t;
|
||||
|
||||
/* a=des:qos strength status_type direction */
|
||||
typedef struct sdp_des {
|
||||
sdp_des_type_e type;
|
||||
sdp_qos_strength_e strength;
|
||||
sdp_qos_status_types_e status_type;
|
||||
sdp_qos_dir_e direction;
|
||||
} sdp_des_t;
|
||||
|
||||
/* a=conf:qos status_type direction */
|
||||
typedef struct sdp_conf {
|
||||
sdp_conf_type_e type;
|
||||
sdp_qos_status_types_e status_type;
|
||||
sdp_qos_dir_e direction;
|
||||
} sdp_conf_t;
|
||||
|
||||
|
||||
/* a=rtpmap or a=sprtmap info */
|
||||
typedef struct sdp_transport_map {
|
||||
u16 payload_num;
|
||||
char encname[SDP_MAX_STRING_LEN+1];
|
||||
u32 clockrate;
|
||||
u16 num_chan;
|
||||
} sdp_transport_map_t;
|
||||
|
||||
|
||||
/* a=rtr info */
|
||||
typedef struct sdp_rtr {
|
||||
tinybool confirm;
|
||||
} sdp_rtr_t;
|
||||
|
||||
/* a=subnet info */
|
||||
typedef struct sdp_subnet {
|
||||
sdp_nettype_e nettype;
|
||||
sdp_addrtype_e addrtype;
|
||||
char addr[SDP_MAX_STRING_LEN+1];
|
||||
int32 prefix;
|
||||
} sdp_subnet_t;
|
||||
|
||||
|
||||
/* a=X-pc-codec info */
|
||||
typedef struct sdp_pccodec {
|
||||
u16 num_payloads;
|
||||
ushort payload_type[SDP_MAX_PAYLOAD_TYPES];
|
||||
} sdp_pccodec_t;
|
||||
|
||||
/* a=direction info */
|
||||
typedef struct sdp_comediadir {
|
||||
sdp_mediadir_role_e role;
|
||||
tinybool conn_info_present;
|
||||
sdp_conn_t conn_info;
|
||||
u32 src_port;
|
||||
} sdp_comediadir_t;
|
||||
|
||||
|
||||
|
||||
/* a=silenceSupp info */
|
||||
typedef struct sdp_silencesupp {
|
||||
tinybool enabled;
|
||||
tinybool timer_null;
|
||||
u16 timer;
|
||||
sdp_silencesupp_pref_e pref;
|
||||
sdp_silencesupp_siduse_e siduse;
|
||||
tinybool fxnslevel_null;
|
||||
u8 fxnslevel;
|
||||
} sdp_silencesupp_t;
|
||||
|
||||
|
||||
/*
|
||||
* a=mptime info */
|
||||
/* Note that an interval value of zero corresponds to
|
||||
* the "-" syntax on the a= line.
|
||||
*/
|
||||
typedef struct sdp_mptime {
|
||||
u16 num_intervals;
|
||||
ushort intervals[SDP_MAX_PAYLOAD_TYPES];
|
||||
} sdp_mptime_t;
|
||||
|
||||
/*
|
||||
* a=X-sidin:<val>, a=X-sidout:< val> and a=X-confid: <val>
|
||||
* Stream Id,ConfID related attributes to be used for audio/video conferencing
|
||||
*
|
||||
*/
|
||||
|
||||
typedef struct sdp_stream_data {
|
||||
char x_sidin[SDP_MAX_STRING_LEN+1];
|
||||
char x_sidout[SDP_MAX_STRING_LEN+1];
|
||||
char x_confid[SDP_MAX_STRING_LEN+1];
|
||||
sdp_group_attr_e group_attr; /* FID or LS */
|
||||
u16 num_group_id;
|
||||
u16 group_id_arr[SDP_MAX_GROUP_STREAM_ID];
|
||||
} sdp_stream_data_t;
|
||||
|
||||
/*
|
||||
* a=source-filter:<filter-mode> <filter-spec>
|
||||
* <filter-spec> = <nettype> <addrtype> <dest-addr> <src_addr><src_addr>...
|
||||
* One or more source addresses to apply filter, for one or more connection
|
||||
* address in unicast/multicast environments
|
||||
*/
|
||||
typedef struct sdp_source_filter {
|
||||
sdp_src_filter_mode_e mode;
|
||||
sdp_nettype_e nettype;
|
||||
sdp_addrtype_e addrtype;
|
||||
char dest_addr[SDP_MAX_STRING_LEN+1];
|
||||
u16 num_src_addr;
|
||||
char src_list[SDP_MAX_SRC_ADDR_LIST+1][SDP_MAX_STRING_LEN+1];
|
||||
} sdp_source_filter_t;
|
||||
|
||||
/*
|
||||
* b=<bw-modifier>:<val>
|
||||
*
|
||||
*/
|
||||
typedef struct sdp_bw_data {
|
||||
struct sdp_bw_data *next_p;
|
||||
sdp_bw_modifier_e bw_modifier;
|
||||
int bw_val;
|
||||
} sdp_bw_data_t;
|
||||
|
||||
/*
|
||||
* This structure houses a linked list of sdp_bw_data_t instances. Each
|
||||
* sdp_bw_data_t instance represents one b= line.
|
||||
*/
|
||||
typedef struct sdp_bw {
|
||||
u16 bw_data_count;
|
||||
sdp_bw_data_t *bw_data_list;
|
||||
} sdp_bw_t;
|
||||
|
||||
/* Media lines for AAL2 may have more than one transport type defined
|
||||
* each with its own payload type list. These are referred to as
|
||||
* profile types instead of transport types. This structure is used
|
||||
* to handle these multiple profile types. Note: One additional profile
|
||||
* field is needed because of the way parsing is done. This is not an
|
||||
* error. */
|
||||
typedef struct sdp_media_profiles {
|
||||
u16 num_profiles;
|
||||
sdp_transport_e profile[SDP_MAX_PROFILES+1];
|
||||
u16 num_payloads[SDP_MAX_PROFILES];
|
||||
sdp_payload_ind_e payload_indicator[SDP_MAX_PROFILES][SDP_MAX_PAYLOAD_TYPES];
|
||||
u16 payload_type[SDP_MAX_PROFILES][SDP_MAX_PAYLOAD_TYPES];
|
||||
} sdp_media_profiles_t;
|
||||
|
||||
|
||||
/*
|
||||
* sdp_srtp_crypto_context_t
|
||||
* This type is used to hold cryptographic context information.
|
||||
*
|
||||
*/
|
||||
|
||||
typedef struct sdp_srtp_crypto_context_t_ {
|
||||
int32 tag;
|
||||
unsigned long selection_flags;
|
||||
sdp_srtp_crypto_suite_t suite;
|
||||
unsigned char master_key[SDP_SRTP_MAX_KEY_SIZE_BYTES];
|
||||
unsigned char master_salt[SDP_SRTP_MAX_SALT_SIZE_BYTES];
|
||||
unsigned char master_key_size_bytes;
|
||||
unsigned char master_salt_size_bytes;
|
||||
unsigned long ssrc; /* not used */
|
||||
unsigned long roc; /* not used */
|
||||
unsigned long kdr; /* not used */
|
||||
unsigned short seq; /* not used */
|
||||
sdp_srtp_fec_order_t fec_order; /* not used */
|
||||
unsigned char master_key_lifetime[SDP_SRTP_MAX_LIFETIME_BYTES];
|
||||
unsigned char mki[SDP_SRTP_MAX_MKI_SIZE_BYTES];
|
||||
u16 mki_size_bytes;
|
||||
char* session_parameters;
|
||||
} sdp_srtp_crypto_context_t;
|
||||
|
||||
|
||||
/* m= line info and associated attribute list */
|
||||
/* Note: Most of the port parameter values are 16-bit values. We set
|
||||
* the type to int32 so we can return either a 16-bit value or the
|
||||
* choose value. */
|
||||
typedef struct sdp_mca {
|
||||
sdp_media_e media;
|
||||
sdp_conn_t conn;
|
||||
sdp_transport_e transport;
|
||||
sdp_port_format_e port_format;
|
||||
int32 port;
|
||||
int32 sctpport;
|
||||
int32 num_ports;
|
||||
int32 vpi;
|
||||
u32 vci; /* VCI needs to be 32-bit */
|
||||
int32 vcci;
|
||||
int32 cid;
|
||||
u16 num_payloads;
|
||||
sdp_payload_ind_e payload_indicator[SDP_MAX_PAYLOAD_TYPES];
|
||||
u16 payload_type[SDP_MAX_PAYLOAD_TYPES];
|
||||
sdp_media_profiles_t *media_profiles_p;
|
||||
tinybool sessinfo_found;
|
||||
sdp_encryptspec_t encrypt;
|
||||
sdp_bw_t bw;
|
||||
sdp_attr_e media_direction; /* Either INACTIVE, SENDONLY,
|
||||
RECVONLY, or SENDRECV */
|
||||
u32 mid;
|
||||
struct sdp_attr *media_attrs_p;
|
||||
struct sdp_mca *next_p;
|
||||
} sdp_mca_t;
|
||||
|
||||
|
||||
/* generic a= line info */
|
||||
typedef struct sdp_attr {
|
||||
sdp_attr_e type;
|
||||
union {
|
||||
tinybool boolean_val;
|
||||
u32 u32_val;
|
||||
char string_val[SDP_MAX_STRING_LEN+1];
|
||||
char ice_attr[SDP_MAX_STRING_LEN+1];
|
||||
sdp_fmtp_t fmtp;
|
||||
sdp_qos_t qos;
|
||||
sdp_curr_t curr;
|
||||
sdp_des_t des;
|
||||
sdp_conf_t conf;
|
||||
sdp_transport_map_t transport_map; /* A rtpmap or sprtmap */
|
||||
sdp_subnet_t subnet;
|
||||
sdp_t38_ratemgmt_e t38ratemgmt;
|
||||
sdp_t38_udpec_e t38udpec;
|
||||
sdp_pccodec_t pccodec;
|
||||
sdp_silencesupp_t silencesupp;
|
||||
sdp_mca_t *cap_p; /* A X-CAP or CDSC attribute */
|
||||
sdp_rtr_t rtr;
|
||||
sdp_comediadir_t comediadir;
|
||||
sdp_srtp_crypto_context_t srtp_context;
|
||||
sdp_mptime_t mptime;
|
||||
sdp_stream_data_t stream_data;
|
||||
char unknown[SDP_MAX_STRING_LEN+1];
|
||||
sdp_source_filter_t source_filter;
|
||||
} attr;
|
||||
struct sdp_attr *next_p;
|
||||
} sdp_attr_t;
|
||||
|
||||
typedef struct sdp_srtp_crypto_suite_list_ {
|
||||
sdp_srtp_crypto_suite_t crypto_suite_val;
|
||||
char * crypto_suite_str;
|
||||
unsigned char key_size_bytes;
|
||||
unsigned char salt_size_bytes;
|
||||
} sdp_srtp_crypto_suite_list;
|
||||
|
||||
/* Application configuration options */
|
||||
typedef struct sdp_conf_options {
|
||||
u32 magic_num;
|
||||
tinybool debug_flag[SDP_MAX_DEBUG_TYPES];
|
||||
tinybool version_reqd;
|
||||
tinybool owner_reqd;
|
||||
tinybool session_name_reqd;
|
||||
tinybool timespec_reqd;
|
||||
tinybool media_supported[SDP_MAX_MEDIA_TYPES];
|
||||
tinybool nettype_supported[SDP_MAX_NETWORK_TYPES];
|
||||
tinybool addrtype_supported[SDP_MAX_ADDR_TYPES];
|
||||
tinybool transport_supported[SDP_MAX_TRANSPORT_TYPES];
|
||||
tinybool allow_choose[SDP_MAX_CHOOSE_PARAMS];
|
||||
/* Statistics counts */
|
||||
u32 num_builds;
|
||||
u32 num_parses;
|
||||
u32 num_not_sdp_desc;
|
||||
u32 num_invalid_token_order;
|
||||
u32 num_invalid_param;
|
||||
u32 num_no_resource;
|
||||
struct sdp_conf_options *next_p;
|
||||
} sdp_conf_options_t;
|
||||
|
||||
|
||||
/* Session level SDP info with pointers to media line info. */
|
||||
/* Elements here that can only be one of are included directly. Elements */
|
||||
/* that can be more than one are pointers. */
|
||||
typedef struct {
|
||||
u32 magic_num;
|
||||
sdp_conf_options_t *conf_p;
|
||||
tinybool debug_flag[SDP_MAX_DEBUG_TYPES];
|
||||
char debug_str[SDP_MAX_STRING_LEN+1];
|
||||
u32 debug_id;
|
||||
int32 version; /* version is really a u16 */
|
||||
char owner_name[SDP_MAX_STRING_LEN+1];
|
||||
char owner_sessid[SDP_MAX_STRING_LEN+1];
|
||||
char owner_version[SDP_MAX_STRING_LEN+1];
|
||||
sdp_nettype_e owner_network_type;
|
||||
sdp_addrtype_e owner_addr_type;
|
||||
char owner_addr[SDP_MAX_STRING_LEN+1];
|
||||
char sessname[SDP_MAX_STRING_LEN+1];
|
||||
tinybool sessinfo_found;
|
||||
tinybool uri_found;
|
||||
sdp_conn_t default_conn;
|
||||
sdp_timespec_t *timespec_p;
|
||||
sdp_encryptspec_t encrypt;
|
||||
sdp_bw_t bw;
|
||||
sdp_attr_t *sess_attrs_p;
|
||||
|
||||
/* Info to help with building capability attributes. */
|
||||
u16 cur_cap_num;
|
||||
sdp_mca_t *cur_cap_p;
|
||||
/* Info to help parsing X-cpar attrs. */
|
||||
u16 cap_valid;
|
||||
u16 last_cap_inst;
|
||||
/* Info to help building X-cpar/cpar attrs. */
|
||||
sdp_attr_e last_cap_type;
|
||||
|
||||
/* MCA - Media, connection, and attributes */
|
||||
sdp_mca_t *mca_p;
|
||||
ushort mca_count;
|
||||
} sdp_t;
|
||||
|
||||
|
||||
/* Token processing table. */
|
||||
typedef struct {
|
||||
char *name;
|
||||
sdp_result_e (*parse_func)(sdp_t *sdp_p, u16 level, const char *ptr);
|
||||
sdp_result_e (*build_func)(sdp_t *sdp_p, u16 level, flex_string *fs);
|
||||
} sdp_tokenarray_t;
|
||||
|
||||
|
||||
/* Attribute processing table. */
|
||||
typedef struct {
|
||||
char *name;
|
||||
u16 strlen;
|
||||
sdp_result_e (*parse_func)(sdp_t *sdp_p, sdp_attr_t *attr_p,
|
||||
const char *ptr);
|
||||
sdp_result_e (*build_func)(sdp_t *sdp_p, sdp_attr_t *attr_p,
|
||||
flex_string *fs);
|
||||
} sdp_attrarray_t;
|
||||
|
||||
|
||||
/* Data declarations */
|
||||
|
||||
extern const sdp_attrarray_t sdp_attr[];
|
||||
extern const sdp_namearray_t sdp_media[];
|
||||
extern const sdp_namearray_t sdp_nettype[];
|
||||
@ -829,7 +304,6 @@ extern
|
||||
tinybool verify_sdescriptions_lifetime(char *buf);
|
||||
|
||||
/* sdp_services_xxx.c */
|
||||
extern void sdp_log_errmsg(sdp_errmsg_e err_msg, char *str);
|
||||
extern void sdp_dump_buffer(char *_ptr, int _size_bytes);
|
||||
|
||||
tinybool sdp_checkrange(sdp_t *sdp, char *num, ulong* lval);
|
||||
|
@ -15,6 +15,7 @@
|
||||
/* */
|
||||
/******************************************************************/
|
||||
|
||||
#if 0
|
||||
void sdp_log_errmsg (sdp_errmsg_e errmsg, char *str)
|
||||
{
|
||||
switch (errmsg) {
|
||||
@ -35,6 +36,7 @@ void sdp_log_errmsg (sdp_errmsg_e errmsg, char *str)
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* sdp_dump_buffer
|
||||
|
@ -15,6 +15,7 @@
|
||||
/* */
|
||||
/******************************************************************/
|
||||
|
||||
#if 0
|
||||
void sdp_log_errmsg (sdp_errmsg_e errmsg, char *str)
|
||||
{
|
||||
switch (errmsg) {
|
||||
@ -35,6 +36,7 @@ void sdp_log_errmsg (sdp_errmsg_e errmsg, char *str)
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* sdp_dump_buffer
|
||||
|
@ -10,6 +10,9 @@
|
||||
#include "configmgr.h"
|
||||
#include "prot_configmgr.h"
|
||||
#include "ccapi.h"
|
||||
#include "CSFLog.h"
|
||||
|
||||
static const char *logTag = "sdp_token";
|
||||
|
||||
#define MCAST_STRING_LEN 4
|
||||
|
||||
@ -20,10 +23,9 @@ sdp_result_e sdp_parse_version (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
|
||||
sdp_p->version = (u16)sdp_getnextnumtok(ptr, &ptr, " \t", &result);
|
||||
if ((result != SDP_SUCCESS) || (sdp_p->version != SDP_CURRENT_VERSION)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid version (%lu) found, parse failed.",
|
||||
sdp_p->debug_str, sdp_p->version);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Invalid version (%lu) found, parse failed.",
|
||||
sdp_p->debug_str, sdp_p->version);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -39,10 +41,8 @@ sdp_result_e sdp_build_version (sdp_t *sdp_p, u16 level, flex_string *fs)
|
||||
{
|
||||
if (sdp_p->version == SDP_INVALID_VALUE) {
|
||||
if (sdp_p->conf_p->version_reqd == TRUE) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid version for v= line, "
|
||||
"build failed.", sdp_p->debug_str);
|
||||
}
|
||||
CSFLogError(logTag, "%s Invalid version for v= line, "
|
||||
"build failed.", sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
} else {
|
||||
@ -68,19 +68,17 @@ sdp_result_e sdp_parse_owner (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
|
||||
if (sdp_p->owner_name[0] != '\0') {
|
||||
sdp_p->conf_p->num_invalid_token_order++;
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: More than one o= line specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: More than one o= line specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
|
||||
/* Find the owner name. */
|
||||
ptr = sdp_getnextstrtok(ptr, sdp_p->owner_name, sizeof(sdp_p->owner_name), " \t", &result);
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No owner name specified for o=.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No owner name specified for o=.",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -97,10 +95,9 @@ sdp_result_e sdp_parse_owner (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
(const char **)&tmpptr, " \t",&result);
|
||||
}
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid owner session id specified for o=.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Invalid owner session id specified for o=.",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -115,10 +112,9 @@ sdp_result_e sdp_parse_owner (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
(const char **)&tmpptr," \t",&result);
|
||||
}
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid owner version specified for o=.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Invalid owner version specified for o=.",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -126,10 +122,9 @@ sdp_result_e sdp_parse_owner (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
/* Find the owner network type. */
|
||||
ptr = sdp_getnextstrtok(ptr, tmp, sizeof(tmp), " \t", &result);
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No owner network type specified for o=.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No owner network type specified for o=.",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -143,10 +138,9 @@ sdp_result_e sdp_parse_owner (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
}
|
||||
}
|
||||
if (sdp_p->owner_network_type == SDP_NT_UNSUPPORTED) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Owner network type unsupported (%s)",
|
||||
sdp_p->debug_str, tmp);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Owner network type unsupported (%s)",
|
||||
sdp_p->debug_str, tmp);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -154,10 +148,9 @@ sdp_result_e sdp_parse_owner (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
/* Find the owner address type. */
|
||||
ptr = sdp_getnextstrtok(ptr, tmp, sizeof(tmp), " \t", &result);
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No owner address type specified for o=.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No owner address type specified for o=.",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -172,10 +165,9 @@ sdp_result_e sdp_parse_owner (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
}
|
||||
if ((sdp_p->owner_addr_type == SDP_AT_UNSUPPORTED) &&
|
||||
(sdp_p->owner_network_type != SDP_NT_ATM)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Owner address type unsupported (%s)",
|
||||
sdp_p->debug_str, tmp);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Owner address type unsupported (%s)",
|
||||
sdp_p->debug_str, tmp);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -183,9 +175,8 @@ sdp_result_e sdp_parse_owner (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
/* Find the owner address. */
|
||||
ptr = sdp_getnextstrtok(ptr, sdp_p->owner_addr, sizeof(sdp_p->owner_addr), " \t", &result);
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No owner address specified.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No owner address specified.", sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -219,10 +210,8 @@ sdp_result_e sdp_build_owner (sdp_t *sdp_p, u16 level, flex_string *fs)
|
||||
}
|
||||
|
||||
if (sdp_p->conf_p->owner_reqd == TRUE) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid params for o= owner line, "
|
||||
"build failed.", sdp_p->debug_str);
|
||||
}
|
||||
CSFLogError(logTag, "%s Invalid params for o= owner line, "
|
||||
"build failed.", sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
} else {
|
||||
@ -251,18 +240,16 @@ sdp_result_e sdp_parse_sessname (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
|
||||
if (sdp_p->sessname[0] != '\0') {
|
||||
sdp_p->conf_p->num_invalid_token_order++;
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: More than one s= line specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: More than one s= line specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
|
||||
endptr = sdp_findchar(ptr, "\r\n");
|
||||
if (ptr == endptr) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: No session name specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: No session name specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
str_len = MIN(endptr - ptr, SDP_MAX_STRING_LEN);
|
||||
sstrncpy(sdp_p->sessname, ptr, str_len+1);
|
||||
@ -278,10 +265,8 @@ sdp_result_e sdp_build_sessname (sdp_t *sdp_p, u16 level, flex_string *fs)
|
||||
{
|
||||
if (sdp_p->sessname[0] == '\0') {
|
||||
if (sdp_p->conf_p->session_name_reqd == TRUE) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No param defined for s= session name line, "
|
||||
"build failed.", sdp_p->debug_str);
|
||||
}
|
||||
CSFLogError(logTag, "%s No param defined for s= session name line, "
|
||||
"build failed.", sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
} else {
|
||||
@ -310,10 +295,9 @@ sdp_result_e sdp_parse_sessinfo (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
if (level == SDP_SESSION_LEVEL) {
|
||||
if (sdp_p->sessinfo_found == TRUE) {
|
||||
sdp_p->conf_p->num_invalid_token_order++;
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: More than one i= line specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: More than one i= line specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_p->sessinfo_found = TRUE;
|
||||
} else {
|
||||
@ -323,20 +307,18 @@ sdp_result_e sdp_parse_sessinfo (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
}
|
||||
if (mca_p->sessinfo_found == TRUE) {
|
||||
sdp_p->conf_p->num_invalid_token_order++;
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: More than one i= line specified"
|
||||
" for media line %d.", sdp_p->debug_str, level);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: More than one i= line specified"
|
||||
" for media line %d.", sdp_p->debug_str, level);
|
||||
}
|
||||
mca_p->sessinfo_found = TRUE;
|
||||
}
|
||||
|
||||
endptr = sdp_findchar(ptr, "\n");
|
||||
if (ptr == endptr) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: No session info specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: No session info specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) {
|
||||
@ -357,18 +339,16 @@ sdp_result_e sdp_parse_uri (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
|
||||
if (sdp_p->uri_found == TRUE) {
|
||||
sdp_p->conf_p->num_invalid_token_order++;
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: More than one u= line specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: More than one u= line specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_p->uri_found = TRUE;
|
||||
|
||||
endptr = sdp_findchar(ptr, "\n");
|
||||
if (ptr == endptr) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: No URI info specified.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: No URI info specified.", sdp_p->debug_str);
|
||||
}
|
||||
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) {
|
||||
@ -389,9 +369,8 @@ sdp_result_e sdp_parse_email (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
|
||||
endptr = sdp_findchar(ptr, "\n");
|
||||
if (ptr == endptr) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: No email info specified.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: No email info specified.", sdp_p->debug_str);
|
||||
}
|
||||
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) {
|
||||
@ -412,10 +391,9 @@ sdp_result_e sdp_parse_phonenum (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
|
||||
endptr = sdp_findchar(ptr, "\n");
|
||||
if (ptr == endptr) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: No phone number info specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: No phone number info specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) {
|
||||
@ -459,20 +437,18 @@ sdp_result_e sdp_parse_connection (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
*/
|
||||
if (conn_p->nettype != SDP_NT_INVALID) {
|
||||
sdp_p->conf_p->num_invalid_token_order++;
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s c= line specified twice at same level, "
|
||||
"parse failed.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s c= line specified twice at same level, "
|
||||
"parse failed.", sdp_p->debug_str);
|
||||
return (SDP_INVALID_TOKEN_ORDERING);
|
||||
}
|
||||
|
||||
/* Find the connection network type. */
|
||||
ptr = sdp_getnextstrtok(ptr, tmp, sizeof(tmp), " \t", &result);
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No connection network type specified for c=.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No connection network type specified for c=.",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -486,10 +462,9 @@ sdp_result_e sdp_parse_connection (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
}
|
||||
}
|
||||
if (conn_p->nettype == SDP_NT_UNSUPPORTED) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: Connection network type unsupported "
|
||||
"(%s) for c=.", sdp_p->debug_str, tmp);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: Connection network type unsupported "
|
||||
"(%s) for c=.", sdp_p->debug_str, tmp);
|
||||
}
|
||||
|
||||
/* Find the connection address type. */
|
||||
@ -503,10 +478,9 @@ sdp_result_e sdp_parse_connection (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
}
|
||||
return (SDP_SUCCESS);
|
||||
} else {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No connection address type specified for "
|
||||
"c=.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No connection address type specified for "
|
||||
"c=.", sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -521,19 +495,17 @@ sdp_result_e sdp_parse_connection (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
}
|
||||
}
|
||||
if (conn_p->addrtype == SDP_AT_UNSUPPORTED) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: Connection address type unsupported "
|
||||
"(%s) for c=.", sdp_p->debug_str, tmp);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: Connection address type unsupported "
|
||||
"(%s) for c=.", sdp_p->debug_str, tmp);
|
||||
}
|
||||
|
||||
/* Find the connection address. */
|
||||
ptr = sdp_getnextstrtok(ptr, conn_p->conn_addr, sizeof(conn_p->conn_addr), " \t", &result);
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No connection address specified for c=.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No connection address specified for c=.",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -550,10 +522,9 @@ sdp_result_e sdp_parse_connection (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
strtoul_result = strtoul(mcast_str, &strtoul_end, 10);
|
||||
|
||||
if (errno || mcast_str == strtoul_end || strtoul_result > 255) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Error parsing address %s for mcast.",
|
||||
sdp_p->debug_str, mcast_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Error parsing address %s for mcast.",
|
||||
sdp_p->debug_str, mcast_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return SDP_INVALID_PARAMETER;
|
||||
}
|
||||
@ -576,10 +547,9 @@ sdp_result_e sdp_parse_connection (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
slash_ptr++;
|
||||
slash_ptr = sdp_getnextstrtok(slash_ptr, tmp, sizeof(tmp), "/", &result);
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No ttl value specified for this multicast addr with a slash",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No ttl value specified for this multicast addr with a slash",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -588,10 +558,9 @@ sdp_result_e sdp_parse_connection (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
strtoul_result = strtoul(tmp, &strtoul_end, 10);
|
||||
|
||||
if (errno || tmp == strtoul_end || conn_p->ttl > SDP_MAX_TTL_VALUE) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid TTL: Value must be in the range 0-255 ",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Invalid TTL: Value must be in the range 0-255 ",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -613,10 +582,9 @@ sdp_result_e sdp_parse_connection (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
strtoul_result = strtoul(slash_ptr, &strtoul_end, 10);
|
||||
|
||||
if (errno || slash_ptr == strtoul_end || strtoul_result == 0) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid Num of addresses: Value must be > 0 ",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Invalid Num of addresses: Value must be > 0 ",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return SDP_INVALID_PARAMETER;
|
||||
}
|
||||
@ -635,10 +603,9 @@ sdp_result_e sdp_parse_connection (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
/* See if the address is the choose param and if it's allowed. */
|
||||
if ((sdp_p->conf_p->allow_choose[SDP_CHOOSE_CONN_ADDR] == FALSE) &&
|
||||
(strcmp(conn_p->conn_addr, "$") == 0)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: Choose parameter for connection "
|
||||
"address specified but not allowed.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: Choose parameter for connection "
|
||||
"address specified but not allowed.", sdp_p->debug_str);
|
||||
}
|
||||
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) {
|
||||
@ -750,10 +717,9 @@ sdp_result_e sdp_parse_bandwidth (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
/* Find the bw type (AS, CT or TIAS) */
|
||||
ptr = sdp_getnextstrtok(ptr, tmp, sizeof(tmp), ":", &result);
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No bandwidth type specified for b= ",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No bandwidth type specified for b= ",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -766,10 +732,9 @@ sdp_result_e sdp_parse_bandwidth (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
}
|
||||
|
||||
if (bw_modifier == SDP_BW_MODIFIER_UNSUPPORTED) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Error: BW Modifier type unsupported (%s).",
|
||||
sdp_p->debug_str, tmp);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Error: BW Modifier type unsupported (%s).",
|
||||
sdp_p->debug_str, tmp);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -782,11 +747,9 @@ sdp_result_e sdp_parse_bandwidth (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
ptr++;
|
||||
bw_val = sdp_getnextnumtok(ptr, &ptr, " \t", &result);
|
||||
if ((result != SDP_SUCCESS)) {
|
||||
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Error: No BW Value specified ",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Error: No BW Value specified ",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -892,10 +855,9 @@ sdp_result_e sdp_parse_timespec (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
(const char **)&tmpptr, " \t", &result);
|
||||
}
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid timespec start time specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Invalid timespec start time specified.",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
SDP_FREE(timespec_p);
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
@ -910,10 +872,9 @@ sdp_result_e sdp_parse_timespec (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
(const char **)&tmpptr, " \t", &result);
|
||||
}
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid timespec stop time specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Invalid timespec stop time specified.",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
SDP_FREE(timespec_p);
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
@ -942,10 +903,8 @@ sdp_result_e sdp_build_timespec (sdp_t *sdp_p, u16 level, flex_string *fs)
|
||||
(sdp_p->timespec_p->start_time == '\0') ||
|
||||
(sdp_p->timespec_p->stop_time == '\0')) {
|
||||
if (sdp_p->conf_p->timespec_reqd == TRUE) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid params for t= time spec line, "
|
||||
"build failed.", sdp_p->debug_str);
|
||||
}
|
||||
CSFLogError(logTag, "%s Invalid params for t= time spec line, "
|
||||
"build failed.", sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
} else {
|
||||
@ -970,10 +929,9 @@ sdp_result_e sdp_parse_repeat_time (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
|
||||
endptr = sdp_findchar(ptr, "\n");
|
||||
if (ptr == endptr) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: No repeat time parameters "
|
||||
"specified.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: No repeat time parameters "
|
||||
"specified.", sdp_p->debug_str);
|
||||
}
|
||||
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) {
|
||||
@ -994,10 +952,9 @@ sdp_result_e sdp_parse_timezone_adj (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
|
||||
endptr = sdp_findchar(ptr, "\n");
|
||||
if (ptr == endptr) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: No timezone parameters specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: No timezone parameters specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_TRACE]) {
|
||||
@ -1034,10 +991,9 @@ sdp_result_e sdp_parse_encryption (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
/* Find the encryption type. */
|
||||
ptr = sdp_getnextstrtok(ptr, tmp, sizeof(tmp), ":", &result);
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No encryption type specified for k=.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No encryption type specified for k=.",
|
||||
sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -1050,10 +1006,9 @@ sdp_result_e sdp_parse_encryption (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
}
|
||||
}
|
||||
if (encrypt_p->encrypt_type == SDP_ENCRYPT_UNSUPPORTED) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: Encryption type unsupported (%s).",
|
||||
sdp_p->debug_str, tmp);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: Encryption type unsupported (%s).",
|
||||
sdp_p->debug_str, tmp);
|
||||
}
|
||||
|
||||
/* Find the encryption key. */
|
||||
@ -1069,10 +1024,9 @@ sdp_result_e sdp_parse_encryption (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
((encrypt_p->encrypt_type == SDP_ENCRYPT_CLEAR) ||
|
||||
(encrypt_p->encrypt_type == SDP_ENCRYPT_BASE64) ||
|
||||
(encrypt_p->encrypt_type == SDP_ENCRYPT_URI))) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Warning: No encryption key specified "
|
||||
"as required.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: No encryption key specified "
|
||||
"as required.", sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -1149,10 +1103,9 @@ sdp_result_e sdp_parse_media (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
/* Find the media type. */
|
||||
ptr = sdp_getnextstrtok(ptr, tmp, sizeof(tmp), " \t", &result);
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No media type specified, parse failed.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No media type specified, parse failed.",
|
||||
sdp_p->debug_str);
|
||||
SDP_FREE(mca_p);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
@ -1165,10 +1118,9 @@ sdp_result_e sdp_parse_media (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
}
|
||||
}
|
||||
if (mca_p->media == SDP_MEDIA_UNSUPPORTED) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: Media type unsupported (%s).",
|
||||
sdp_p->debug_str, tmp);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: Media type unsupported (%s).",
|
||||
sdp_p->debug_str, tmp);
|
||||
}
|
||||
|
||||
/* Find the port token parameters, but don't process it until
|
||||
@ -1177,10 +1129,9 @@ sdp_result_e sdp_parse_media (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
*/
|
||||
ptr = sdp_getnextstrtok(ptr, port, sizeof(port), " \t", &result);
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No port specified in m= media line, "
|
||||
"parse failed.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No port specified in m= media line, "
|
||||
"parse failed.", sdp_p->debug_str);
|
||||
SDP_FREE(mca_p);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
@ -1202,10 +1153,9 @@ sdp_result_e sdp_parse_media (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
/* Find the transport protocol type. */
|
||||
ptr = sdp_getnextstrtok(ptr, tmp, sizeof(tmp), " \t", &result);
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No transport protocol type specified, "
|
||||
"parse failed.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No transport protocol type specified, "
|
||||
"parse failed.", sdp_p->debug_str);
|
||||
SDP_FREE(mca_p);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
@ -1223,10 +1173,9 @@ sdp_result_e sdp_parse_media (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
* just store the first num as the port.
|
||||
*/
|
||||
mca_p->port = num[0];
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: Transport protocol type unsupported "
|
||||
"(%s).", sdp_p->debug_str, tmp);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: Transport protocol type unsupported "
|
||||
"(%s).", sdp_p->debug_str, tmp);
|
||||
}
|
||||
|
||||
/* Check for each of the possible port formats according to the
|
||||
@ -1369,13 +1318,12 @@ sdp_result_e sdp_parse_media (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
break;
|
||||
}
|
||||
if (valid_param == FALSE) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid port format (%s) specified for transport "
|
||||
"protocol (%s), parse failed.", sdp_p->debug_str,
|
||||
port, sdp_get_transport_name(mca_p->transport));
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Invalid port format (%s) specified for transport "
|
||||
"protocol (%s), parse failed.", sdp_p->debug_str,
|
||||
port, sdp_get_transport_name(mca_p->transport));
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
SDP_FREE(mca_p);
|
||||
SDP_FREE(mca_p);
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
@ -1400,10 +1348,9 @@ sdp_result_e sdp_parse_media (sdp_t *sdp_p, u16 level, const char *ptr)
|
||||
if (mca_p->transport == SDP_TRANSPORT_SCTPDTLS) {
|
||||
ptr = sdp_getnextstrtok(ptr, port, sizeof(port), " \t", &result);
|
||||
if (result != SDP_SUCCESS) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s No sctp port specified in m= media line, "
|
||||
"parse failed.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s No sctp port specified in m= media line, "
|
||||
"parse failed.", sdp_p->debug_str);
|
||||
SDP_FREE(mca_p);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
@ -1506,10 +1453,8 @@ sdp_result_e sdp_build_media (sdp_t *sdp_p, u16 level, flex_string *fs)
|
||||
}
|
||||
|
||||
if (invalid_params == TRUE) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid params for m= media line, "
|
||||
"build failed.", sdp_p->debug_str);
|
||||
}
|
||||
CSFLogError(logTag, "%s Invalid params for m= media line, "
|
||||
"build failed.", sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
}
|
||||
@ -1542,10 +1487,8 @@ sdp_result_e sdp_build_media (sdp_t *sdp_p, u16 level, flex_string *fs)
|
||||
} else if ((mca_p->vcci == SDP_CHOOSE_PARAM) ||
|
||||
(mca_p->cid == SDP_CHOOSE_PARAM)) {
|
||||
/* If one is set but not the other, this is an error. */
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s Invalid params for m= port parameter, "
|
||||
"build failed.", sdp_p->debug_str);
|
||||
}
|
||||
CSFLogError(logTag, "%s Invalid params for m= port parameter, "
|
||||
"build failed.", sdp_p->debug_str);
|
||||
sdp_p->conf_p->num_invalid_param++;
|
||||
return (SDP_INVALID_PARAMETER);
|
||||
} else {
|
||||
@ -1638,13 +1581,12 @@ void sdp_parse_payload_types (sdp_t *sdp_p, sdp_mca_t *mca_p, const char *ptr)
|
||||
if (result == SDP_SUCCESS) {
|
||||
if ((mca_p->media == SDP_MEDIA_IMAGE) &&
|
||||
(mca_p->transport == SDP_TRANSPORT_UDPTL)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: Numeric payload type not "
|
||||
"valid for media %s with transport %s.",
|
||||
sdp_p->debug_str,
|
||||
sdp_get_media_name(mca_p->media),
|
||||
sdp_get_transport_name(mca_p->transport));
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: Numeric payload type not "
|
||||
"valid for media %s with transport %s.",
|
||||
sdp_p->debug_str,
|
||||
sdp_get_media_name(mca_p->media),
|
||||
sdp_get_transport_name(mca_p->transport));
|
||||
} else {
|
||||
mca_p->payload_indicator[num_payloads] = SDP_PAYLOAD_NUMERIC;
|
||||
mca_p->num_payloads++;
|
||||
@ -1685,28 +1627,25 @@ void sdp_parse_payload_types (sdp_t *sdp_p, sdp_mca_t *mca_p, const char *ptr)
|
||||
mca_p->num_payloads++;
|
||||
num_payloads++;
|
||||
} else {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: Payload type %s not valid for "
|
||||
"media %s with transport %s.",
|
||||
sdp_p->debug_str,
|
||||
sdp_get_payload_name((sdp_payload_e)i),
|
||||
sdp_get_media_name(mca_p->media),
|
||||
sdp_get_transport_name(mca_p->transport));
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: Payload type %s not valid for "
|
||||
"media %s with transport %s.",
|
||||
sdp_p->debug_str,
|
||||
sdp_get_payload_name((sdp_payload_e)i),
|
||||
sdp_get_media_name(mca_p->media),
|
||||
sdp_get_transport_name(mca_p->transport));
|
||||
}
|
||||
} else {
|
||||
/* Payload type wasn't recognized. */
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: Payload type "
|
||||
"unsupported (%s).", sdp_p->debug_str, tmp);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: Payload type "
|
||||
"unsupported (%s).", sdp_p->debug_str, tmp);
|
||||
}
|
||||
}
|
||||
if (mca_p->num_payloads == 0) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: No payload types specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: No payload types specified.",
|
||||
sdp_p->debug_str);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1786,10 +1725,9 @@ sdp_result_e sdp_parse_multiple_profile_payload_types (sdp_t *sdp_p,
|
||||
/* This token must be a payload type. Make sure there aren't
|
||||
* too many payload types. */
|
||||
if (payload >= SDP_MAX_PAYLOAD_TYPES) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: Too many payload types "
|
||||
"found, truncating.", sdp_p->debug_str);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: Too many payload types "
|
||||
"found, truncating.", sdp_p->debug_str);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1808,19 +1746,17 @@ sdp_result_e sdp_parse_multiple_profile_payload_types (sdp_t *sdp_p,
|
||||
|
||||
/* No string payload types are currently valid for the AAL2
|
||||
* transport types. This support can be added when needed. */
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: Unsupported payload type "
|
||||
"found (%s).", sdp_p->debug_str, tmp);
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: Unsupported payload type "
|
||||
"found (%s).", sdp_p->debug_str, tmp);
|
||||
}
|
||||
for (i=0; i < profile_p->num_profiles; i++) {
|
||||
/* Make sure we have payloads for each profile type. */
|
||||
if (profile_p->num_payloads[i] == 0) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_WARNINGS]) {
|
||||
SDP_WARN("%s Warning: No payload types specified "
|
||||
"for AAL2 profile %s.", sdp_p->debug_str,
|
||||
sdp_get_transport_name(profile_p->profile[i]));
|
||||
}
|
||||
sdp_parse_error(sdp_p->peerconnection,
|
||||
"%s Warning: No payload types specified "
|
||||
"for AAL2 profile %s.", sdp_p->debug_str,
|
||||
sdp_get_transport_name(profile_p->profile[i]));
|
||||
}
|
||||
}
|
||||
return (SDP_SUCCESS);
|
||||
|
@ -7,9 +7,12 @@
|
||||
#include "sdp_os_defs.h"
|
||||
#include "sdp.h"
|
||||
#include "sdp_private.h"
|
||||
#include "CSFLog.h"
|
||||
|
||||
#define MKI_BUF_LEN 4
|
||||
|
||||
static const char* logTag = "sdp_utils";
|
||||
|
||||
sdp_mca_t *sdp_alloc_mca () {
|
||||
sdp_mca_t *mca_p;
|
||||
|
||||
@ -728,7 +731,7 @@ tinybool sdp_checkrange (sdp_t *sdp_p, char *num, ulong *u_val)
|
||||
|
||||
if (*num == '-') {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s ERROR: Parameter value is a negative number: %s",
|
||||
CSFLogError(logTag, "%s ERROR: Parameter value is a negative number: %s",
|
||||
sdp_p->debug_str, num);
|
||||
}
|
||||
return FALSE;
|
||||
@ -739,7 +742,7 @@ tinybool sdp_checkrange (sdp_t *sdp_p, char *num, ulong *u_val)
|
||||
|
||||
if (l_val > 4294967295UL) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s ERROR: Parameter value: %s is greater than 4294967295",
|
||||
CSFLogError(logTag, "%s ERROR: Parameter value: %s is greater than 4294967295",
|
||||
sdp_p->debug_str, num);
|
||||
}
|
||||
return FALSE;
|
||||
@ -754,7 +757,7 @@ tinybool sdp_checkrange (sdp_t *sdp_p, char *num, ulong *u_val)
|
||||
*/
|
||||
if (strcmp("4294967295", num)) {
|
||||
if (sdp_p->debug_flag[SDP_DEBUG_ERRORS]) {
|
||||
SDP_ERROR("%s ERROR: Parameter value: %s is greater than 4294967295",
|
||||
CSFLogError(logTag, "%s ERROR: Parameter value: %s is greater than 4294967295",
|
||||
sdp_p->debug_str, num);
|
||||
}
|
||||
return FALSE;
|
||||
|
@ -964,8 +964,11 @@ sip_util_extract_sdp (ccsipCCB_t *ccb, sipMessage_t *message)
|
||||
|
||||
/*
|
||||
* Allocate a SDP buffer to work with (only destination buffer is needed).
|
||||
*
|
||||
* Here we are handing in an empty string to designate that we are not
|
||||
* in the context of a peerconnection object
|
||||
*/
|
||||
sipsdp_src_dest_create(CCSIP_DEST_SDP_BIT, &sip_msg_sdp);
|
||||
sipsdp_src_dest_create("", CCSIP_DEST_SDP_BIT, &sip_msg_sdp);
|
||||
if ((sip_msg_sdp == NULL) || (sip_msg_sdp->dest_sdp == NULL)) {
|
||||
/* Unable to get SDP */
|
||||
CCSIP_DEBUG_ERROR(get_debug_string(DEBUG_SIP_SDP_CREATE_BUF_ERROR),
|
||||
|
@ -105,21 +105,19 @@ sip_sdp_init (void)
|
||||
}
|
||||
|
||||
/*
|
||||
* sip_sdp_create()
|
||||
* sipsdp_create()
|
||||
*
|
||||
* Allocate a standard SDP with SIP config and set debug options
|
||||
* based on ccsip debug settings
|
||||
*/
|
||||
void *
|
||||
sipsdp_create (void)
|
||||
sdp_t *
|
||||
sipsdp_create (const char *peerconnection)
|
||||
{
|
||||
const char *fname = "sipsdp_create :";
|
||||
void *sdp;
|
||||
// char debug_str[80];
|
||||
sdp_t *sdp;
|
||||
|
||||
sdp = sdp_init_description(ccsip_sdp_config);
|
||||
sdp = sdp_init_description(peerconnection, ccsip_sdp_config);
|
||||
if (!sdp) {
|
||||
CCSIP_DEBUG_ERROR(SIP_F_PREFIX"SDP allocation failure\n", fname);
|
||||
CCSIP_DEBUG_ERROR(SIP_F_PREFIX"SDP allocation failure\n", __FUNCTION__);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
@ -282,7 +280,8 @@ sipsdp_src_dest_free (uint16_t flags, cc_sdp_t **sdp_info)
|
||||
* NULL - failure to allocate storage
|
||||
*/
|
||||
void
|
||||
sipsdp_src_dest_create (uint16_t flags, cc_sdp_t **sdp_info)
|
||||
sipsdp_src_dest_create (const char *peerconnection,
|
||||
uint16_t flags, cc_sdp_t **sdp_info)
|
||||
{
|
||||
|
||||
if (!(*sdp_info)) {
|
||||
@ -294,7 +293,7 @@ sipsdp_src_dest_create (uint16_t flags, cc_sdp_t **sdp_info)
|
||||
|
||||
/* Create the SRC and/or DEST SDP */
|
||||
if (flags & CCSIP_SRC_SDP_BIT) {
|
||||
(*sdp_info)->src_sdp = sipsdp_create();
|
||||
(*sdp_info)->src_sdp = sipsdp_create(peerconnection);
|
||||
if (!((*sdp_info)->src_sdp)) {
|
||||
sipsdp_src_dest_free(flags, sdp_info);
|
||||
return;
|
||||
@ -302,7 +301,7 @@ sipsdp_src_dest_create (uint16_t flags, cc_sdp_t **sdp_info)
|
||||
}
|
||||
|
||||
if (flags & CCSIP_DEST_SDP_BIT) {
|
||||
(*sdp_info)->dest_sdp = sipsdp_create();
|
||||
(*sdp_info)->dest_sdp = sipsdp_create(peerconnection);
|
||||
if (!((*sdp_info)->dest_sdp)) {
|
||||
sipsdp_src_dest_free(flags, sdp_info);
|
||||
return;
|
||||
@ -310,50 +309,6 @@ sipsdp_src_dest_create (uint16_t flags, cc_sdp_t **sdp_info)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* sipsdp_create_from_buf()
|
||||
*
|
||||
* Parse buffer into common SDP structure
|
||||
*
|
||||
* Returns: NULL if non-recoverable error encountered
|
||||
*
|
||||
*/
|
||||
cc_sdp_t *
|
||||
sipsdp_create_from_buf (char *buf, uint32_t nbytes, cc_sdp_t *sdp)
|
||||
{
|
||||
const char *fname = "sipsdp_create_from_buf";
|
||||
cc_sdp_t *sip_info = NULL;
|
||||
|
||||
if (!buf) {
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (sdp) {
|
||||
sip_info = sdp;
|
||||
} else {
|
||||
sipsdp_src_dest_create(CCSIP_DEST_SDP_BIT | CCSIP_SRC_SDP_BIT,
|
||||
&sip_info);
|
||||
}
|
||||
|
||||
if (!sip_info) {
|
||||
/*
|
||||
* make sure that the src_sdp and dest_sdp are
|
||||
* valid as well.
|
||||
*/
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
|
||||
if (sdp_parse(sip_info->dest_sdp, &buf, (uint16_t)nbytes) != SDP_SUCCESS) {
|
||||
sipsdp_src_dest_free(CCSIP_DEST_SDP_BIT | CCSIP_SRC_SDP_BIT,
|
||||
&sip_info);
|
||||
CCSIP_DEBUG_ERROR(SIP_F_PREFIX"Error parsing SDP\n", fname);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
return (sip_info);
|
||||
}
|
||||
|
||||
/*
|
||||
* sipsdp_write_to_buf()
|
||||
*
|
||||
|
@ -21,10 +21,11 @@
|
||||
* appropriate values initialized
|
||||
*/
|
||||
PMH_EXTERN boolean sip_sdp_init(void);
|
||||
PMH_EXTERN void *sipsdp_create(void);
|
||||
PMH_EXTERN sdp_t *sipsdp_create(const char *peerconnection);
|
||||
PMH_EXTERN cc_sdp_t *sipsdp_info_create(void);
|
||||
PMH_EXTERN void sipsdp_src_dest_free(uint16_t flags, cc_sdp_t **sdp_info);
|
||||
PMH_EXTERN void sipsdp_src_dest_create(uint16_t flags, cc_sdp_t **sdp_info);
|
||||
PMH_EXTERN void sipsdp_src_dest_create(const char *peerconnection,
|
||||
uint16_t flags, cc_sdp_t **sdp_info);
|
||||
PMH_EXTERN void sipsdp_free(cc_sdp_t **sip_sdp);
|
||||
|
||||
/*
|
||||
@ -38,18 +39,6 @@ PMH_EXTERN void sipsdp_free(cc_sdp_t **sip_sdp);
|
||||
|
||||
#define SIPSDP_MAX_SESSION_VERSION_LENGTH 32
|
||||
|
||||
/*
|
||||
* Create a SDP structure from a packet got from the network. This
|
||||
* also parses the message and fills in the values of address, port etc.
|
||||
* Memory is allocated. To free it properly, use sipsdp_free_internal(),
|
||||
* followed by free()
|
||||
* buf = raw message.
|
||||
* nbytes = number of bytes in buf.
|
||||
*
|
||||
*/
|
||||
PMH_EXTERN cc_sdp_t *sipsdp_create_from_buf(char *buf, uint32_t nbytes,
|
||||
cc_sdp_t *sdp);
|
||||
|
||||
/*
|
||||
* Standard session-level parameters
|
||||
*/
|
||||
|
@ -6,6 +6,8 @@
|
||||
#define _CC_CONSTANTS_H_
|
||||
#include "cc_types.h"
|
||||
|
||||
#define PC_HANDLE_SIZE 17 /* 8 random bytes in hex plus null */
|
||||
|
||||
/**
|
||||
* Max call servers
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user