Bug 896429 - Signaling: dynamically create SDP config r=abr
authorEthan Hugg <ethanhugg@gmail.com>
Tue, 23 Jul 2013 14:01:17 -0700
changeset 152182 38e2b972e33fae8c7b67480365f21ae7bfd50ffb
parent 152181 b0590e3d0c4de66791f078e3da407ca9c5ff76f5
child 152183 a016adf011fef97c215a55cc2d59eeacd41f8a44
push id2859
push userakeybl@mozilla.com
push dateMon, 16 Sep 2013 19:14:59 +0000
treeherdermozilla-beta@87d3c51cd2bf [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersabr
bugs896429
milestone25.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 896429 - Signaling: dynamically create SDP config r=abr
media/webrtc/signaling/src/sipcc/core/sdp/sdp.h
media/webrtc/signaling/src/sipcc/core/sdp/sdp_config.c
media/webrtc/signaling/src/sipcc/core/sdp/sdp_main.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_core.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_sdp.c
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_sdp.h
--- a/media/webrtc/signaling/src/sipcc/core/sdp/sdp.h
+++ b/media/webrtc/signaling/src/sipcc/core/sdp/sdp.h
@@ -1129,17 +1129,16 @@ extern void sdp_allow_choose(void *confi
                              tinybool choose_allowed);
 
 /* sdp_main.c */
 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);
 
 
 /* sdp_access.c */
 extern tinybool sdp_version_valid(void *sdp_p);
--- a/media/webrtc/signaling/src/sipcc/core/sdp/sdp_config.c
+++ b/media/webrtc/signaling/src/sipcc/core/sdp/sdp_config.c
@@ -36,23 +36,27 @@ tinybool sdp_verify_conf_ptr (sdp_conf_o
  *              All token lines required per RFC2327.
  *              No media types supported.
  *              No network types supported.
  *              No address types supported.
  *              No transport types supported.
  * Parameters:	None.
  * Returns:	A handle for the configuration as a void ptr.
  */
-sdp_conf_options_t sdp_config_options;
 void *sdp_init_config ()
 {
     int i;
     sdp_conf_options_t *conf_p;
 
-    conf_p = & sdp_config_options;
+    conf_p = SDP_MALLOC(sizeof(sdp_conf_options_t));
+
+    if (!conf_p) {
+        CSFLogError(logTag, "SDP: could not allocate configuration object.");
+        return NULL;
+    }
 
     /* Initialize magic number. */
     conf_p->magic_num = SDP_MAGIC_NUM;
 
     /* Set default debug flags. */
     conf_p->debug_flag[SDP_DEBUG_TRACE]    = FALSE;
     conf_p->debug_flag[SDP_DEBUG_WARNINGS] = FALSE;
     conf_p->debug_flag[SDP_DEBUG_ERRORS]   = FALSE;
@@ -98,17 +102,16 @@ void *sdp_init_config ()
     conf_p->num_no_resource         = 0;
 
     CSFLogInfo(logTag, "SDP: Initialized config pointer: %p (magic=0x%X)",
                 conf_p, conf_p ? conf_p->magic_num : 0);
 
     return (conf_p);
 }
 
-
 /* Function:    void sdp_appl_debug(void *config_p, sdp_debug_e debug_type,
  *                                  tinybool my_bool);
  * Description:	Define the default type of debug for the application.
  *              Valid debug types are ERRORS, WARNINGS, and TRACE.  Each
  *              debug type can be turned on/off individually.  The
  *              default debug level can be redefined at any time.
  * Parameters:	conf_p     The config handle returned by sdp_init_config.
  *              debug_type Specifies the debug type being enabled/disabled.
--- a/media/webrtc/signaling/src/sipcc/core/sdp/sdp_main.c
+++ b/media/webrtc/signaling/src/sipcc/core/sdp/sdp_main.c
@@ -1187,236 +1187,16 @@ sdp_result_e sdp_build (sdp_t *sdp_p, fl
                 /* ok not to check buffer space (yet) as the for() checks it */
             }
         }
     }
 
     return (result);
 }
 
-/* Function:    sdp_copy
- * Description: Create a new SDP structure that is an exact copy of the
- *              one passed in.
- * 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.
-*/
-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_timespec_t     *cur_time_p = NULL;
-    sdp_timespec_t     *orig_time_p = NULL;
-    sdp_mca_t          *orig_mca_p = NULL;
-    sdp_mca_t          *new_mca_p = NULL;
-    sdp_mca_t          *dst_mca_p = NULL;
-    sdp_media_profiles_t *src_media_profile_p;
-    sdp_media_profiles_t *dst_media_profile_p;
-
-    if (orig_sdp_p->debug_flag[SDP_DEBUG_TRACE]) {
-        SDP_PRINT("%s Copy SDP:", orig_sdp_p->debug_str);
-    }
-
-    if (sdp_verify_sdp_ptr(orig_sdp_p) == FALSE) {
-        return (NULL);
-    }
-
-    new_sdp_p = (sdp_t *)SDP_MALLOC(sizeof(sdp_t));
-    if (new_sdp_p == NULL) {
-        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;
-
-    new_sdp_p->conf_p             = orig_sdp_p->conf_p;
-    new_sdp_p->version            = orig_sdp_p->version;
-    sstrncpy(new_sdp_p->owner_name, orig_sdp_p->owner_name,
-             SDP_MAX_LINE_LEN+1);
-    sstrncpy(new_sdp_p->owner_sessid, orig_sdp_p->owner_sessid,
-             SDP_MAX_LINE_LEN+1);
-    sstrncpy(new_sdp_p->owner_version, orig_sdp_p->owner_version,
-             SDP_MAX_LINE_LEN+1);
-    new_sdp_p->owner_network_type = orig_sdp_p->owner_network_type;
-    new_sdp_p->owner_addr_type    = orig_sdp_p->owner_addr_type;
-    sstrncpy(new_sdp_p->owner_addr, orig_sdp_p->owner_addr,
-             SDP_MAX_LINE_LEN+1);
-    sstrncpy(new_sdp_p->sessname, orig_sdp_p->sessname,
-             SDP_MAX_LINE_LEN+1);
-    new_sdp_p->sessinfo_found     = orig_sdp_p->sessinfo_found;
-    new_sdp_p->uri_found          = orig_sdp_p->uri_found;
-
-    new_sdp_p->default_conn.nettype      = orig_sdp_p->default_conn.nettype;
-    new_sdp_p->default_conn.addrtype     = orig_sdp_p->default_conn.addrtype;
-    sstrncpy(new_sdp_p->default_conn.conn_addr,
-             orig_sdp_p->default_conn.conn_addr,
-             SDP_MAX_LINE_LEN+1);
-
-    new_sdp_p->default_conn.is_multicast =
-        orig_sdp_p->default_conn.is_multicast;
-    new_sdp_p->default_conn.ttl      = orig_sdp_p->default_conn.ttl;
-    new_sdp_p->default_conn.num_of_addresses
-        = orig_sdp_p->default_conn.num_of_addresses;
-    new_sdp_p->encrypt.encrypt_type = orig_sdp_p->encrypt.encrypt_type;
-    sstrncpy(new_sdp_p->encrypt.encrypt_key,
-             orig_sdp_p->encrypt.encrypt_key, SDP_MAX_LINE_LEN+1);
-
-    /* Copy all session level bw lines. */
-    rc = sdp_copy_all_bw_lines(orig_sdp_p, new_sdp_p,
-                               SDP_SESSION_LEVEL, SDP_SESSION_LEVEL);
-    if (rc != SDP_SUCCESS) {
-        sdp_free_description(new_sdp_p);
-        return (NULL);
-    }
-
-    /* Copy timespec structures. */
-    orig_time_p = orig_sdp_p->timespec_p;
-    while (orig_time_p != NULL) {
-        if (cur_time_p == NULL) {
-            new_sdp_p->timespec_p = \
-                (sdp_timespec_t *)SDP_MALLOC(sizeof(sdp_timespec_t));
-            cur_time_p = new_sdp_p->timespec_p;
-        } else {
-            cur_time_p->next_p = \
-                (sdp_timespec_t *)SDP_MALLOC(sizeof(sdp_timespec_t));
-            cur_time_p = cur_time_p->next_p;
-        }
-        if (cur_time_p == NULL) {
-            sdp_free_description(new_sdp_p);
-            return (NULL);
-        }
-        sstrncpy(cur_time_p->start_time, orig_time_p->start_time,
-                 SDP_MAX_LINE_LEN+1);
-        sstrncpy(cur_time_p->stop_time, orig_time_p->stop_time,
-                 SDP_MAX_LINE_LEN+1);
-        cur_time_p->next_p = NULL;
-
-        /* Move to next time structure. */
-        orig_time_p = orig_time_p->next_p;
-    }
-
-    /* Copy all session attributes. */
-    rc = sdp_copy_all_attrs(orig_sdp_p, new_sdp_p,
-                            SDP_SESSION_LEVEL, SDP_SESSION_LEVEL);
-    if (rc != SDP_SUCCESS) {
-        sdp_free_description(new_sdp_p);
-        return (NULL);
-    }
-
-
-    /* Now copy each media level with its parameters and all
-     * corresponding attrs. */
-    orig_mca_p = orig_sdp_p->mca_p;
-    new_mca_p = NULL;
-    cur_level = 0;
-    while (orig_mca_p != NULL) {
-        cur_level++;
-
-        /* Allocate and link in a new media level. */
-        new_mca_p = sdp_alloc_mca();
-        if (new_mca_p == NULL) {
-            sdp_free_description(new_sdp_p);
-            return (NULL);
-        }
-        if (dst_mca_p == NULL) {
-            new_sdp_p->mca_p = new_mca_p;
-        } else {
-            dst_mca_p->next_p = new_mca_p;
-        }
-        dst_mca_p = new_mca_p;
-        new_sdp_p->mca_count++;
-
-        /* Copy all the media level parameters. */
-        dst_mca_p->media         = orig_mca_p->media;
-        dst_mca_p->conn.nettype  = orig_mca_p->conn.nettype;
-        dst_mca_p->conn.addrtype = orig_mca_p->conn.addrtype;
-        sstrncpy(dst_mca_p->conn.conn_addr, orig_mca_p->conn.conn_addr,
-                 SDP_MAX_LINE_LEN+1);
-
-        dst_mca_p->conn.is_multicast = orig_mca_p->conn.is_multicast;
-        dst_mca_p->conn.ttl      = orig_mca_p->conn.ttl;
-        dst_mca_p->conn.num_of_addresses = orig_mca_p->conn.num_of_addresses;
-
-        dst_mca_p->transport     = orig_mca_p->transport;
-        dst_mca_p->port_format   = orig_mca_p->port_format;
-        dst_mca_p->port          = orig_mca_p->port;
-        dst_mca_p->num_ports     = orig_mca_p->num_ports;
-        dst_mca_p->vpi           = orig_mca_p->vpi;
-        dst_mca_p->vci           = orig_mca_p->vci;
-        dst_mca_p->vcci          = orig_mca_p->vcci;
-        dst_mca_p->cid           = orig_mca_p->cid;
-        dst_mca_p->num_payloads  = orig_mca_p->num_payloads;
-
-        for (i=0; i < SDP_MAX_PAYLOAD_TYPES; i++) {
-            dst_mca_p->payload_indicator[i] = orig_mca_p->payload_indicator[i];
-            dst_mca_p->payload_type[i] = orig_mca_p->payload_type[i];
-        }
-
-        dst_mca_p->sessinfo_found = orig_mca_p->sessinfo_found;
-        dst_mca_p->encrypt.encrypt_type = orig_mca_p->encrypt.encrypt_type;
-        sstrncpy(dst_mca_p->encrypt.encrypt_key,
-                 orig_mca_p->encrypt.encrypt_key, SDP_MAX_LINE_LEN+1);
-        dst_mca_p->media_direction = orig_mca_p->media_direction;
-
-        /* Now copy all the media level bw lines over. */
-        rc = sdp_copy_all_bw_lines(orig_sdp_p, new_sdp_p, cur_level, cur_level);
-        if (rc != SDP_SUCCESS) {
-            sdp_free_description(new_sdp_p);
-            return (NULL);
-        }
-
-        dst_mca_p->mid = orig_mca_p->mid;
-
-        if (orig_mca_p->media_profiles_p != NULL) {
-            src_media_profile_p = orig_mca_p->media_profiles_p;
-            dst_mca_p->media_profiles_p = (sdp_media_profiles_t *)
-                SDP_MALLOC(sizeof(sdp_media_profiles_t));
-            dst_media_profile_p = dst_mca_p->media_profiles_p;
-            if (dst_media_profile_p == NULL) {
-                sdp_free_description(new_sdp_p);
-                return (NULL);
-            }
-
-            dst_media_profile_p->num_profiles =
-                src_media_profile_p->num_profiles;
-            for (i=0; i < SDP_MAX_PROFILES; i++) {
-                dst_media_profile_p->profile[i] =
-                    src_media_profile_p->profile[i];
-                dst_media_profile_p->num_payloads[i] =
-                    src_media_profile_p->num_payloads[i];
-                for (j=0; j < SDP_MAX_PAYLOAD_TYPES; j++) {
-                    dst_media_profile_p->payload_indicator[i][j] =
-                        src_media_profile_p->payload_indicator[i][j];
-                    dst_media_profile_p->payload_type[i][j] =
-                        src_media_profile_p->payload_type[i][j];
-
-                }
-            }
-        }
-
-        /* Now copy all the media level attrs over. */
-        (void)sdp_copy_all_attrs(orig_sdp_p, new_sdp_p, cur_level, cur_level);
-
-        /* Now move to the next media level. */
-        orig_mca_p = orig_mca_p->next_p;
-    }
-
-
-    /* Set default debug flags from application config. */
-    for (i=0; i < SDP_MAX_DEBUG_TYPES; i++) {
-        new_sdp_p->debug_flag[i] = orig_sdp_p->debug_flag[i];
-    }
-
-    return (new_sdp_p);
-}
-
 /* Function:    sdp_free_description
  * Description:	Free an SDP description and all memory associated with it.
  * 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 (sdp_t *sdp_p)
@@ -1426,16 +1206,21 @@ sdp_result_e sdp_free_description (sdp_t
     sdp_mca_t       *mca_p, *next_mca_p;
     sdp_bw_t        *bw_p;
     sdp_bw_data_t   *bw_data_p;
 
     if (sdp_verify_sdp_ptr(sdp_p) == FALSE) {
         return (SDP_INVALID_SDP_PTR);
     }
 
+    /* Free the config structure */
+    if (sdp_p->conf_p) {
+        SDP_FREE(sdp_p->conf_p);
+    }
+
     /* Free any timespec structures - should be only one since
      * this is all we currently support.
      */
     time_p = sdp_p->timespec_p;
     while (time_p != NULL) {
 	next_time_p = time_p->next_p;
 	SDP_FREE(time_p);
 	time_p = next_time_p;
--- a/media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_core.c
+++ b/media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_core.c
@@ -7212,22 +7212,16 @@ sip_sm_init (void)
 
         /* Initialize Subscription Manager */
         if (sip_subsManager_init() != SIP_OK) {
             return SIP_ERROR;
         }
 
     }
 
-    /* Initialize SDP Parser */
-    if (!sip_sdp_init()) {
-        /* Error initialize the SDP error */
-        return (SIP_ERROR);
-    }
-
     return SIP_OK;
 }
 
 void
 ccsip_handle_sip_shutdown ()
 {
     const char     *fname = "handle_sip_shutdown";
     ccsipCCB_t     *ccb = NULL;
--- a/media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_sdp.c
+++ b/media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_sdp.c
@@ -52,75 +52,78 @@
 #include "cpr_memory.h"
 #include "sdp.h"
 #include "text_strings.h"
 #include "ccsip_sdp.h"
 #include "ccsip_core.h"
 #include "phone_debug.h"
 
 
-
-static void *ccsip_sdp_config = NULL; /* SDP parser/builder configuration */
-
 /*
  * sip_sdp_init
  *
  * This function initializes SDP parser with SIP-specific parameters.
  * This includes supported media, network types, address types,
  * transports and codecs.
  *
  * The function must be called once.
  *
- * Returns TRUE  - successful
- *         FALSE - failed
+ * Returns a pointer to the SDP configuration profile, or NULL on failure.
  */
-boolean
+static void *
 sip_sdp_init (void)
 {
-    ccsip_sdp_config = sdp_init_config();
-    if (!ccsip_sdp_config) {
-        CCSIP_ERR_MSG("sdp_init_config() failure");
-        return FALSE;
+    void *sdp_config;
+
+    sdp_config = sdp_init_config();
+
+    if (sdp_config) {
+        sdp_media_supported(sdp_config, SDP_MEDIA_AUDIO, TRUE);
+        sdp_media_supported(sdp_config, SDP_MEDIA_VIDEO, TRUE);
+        sdp_media_supported(sdp_config, SDP_MEDIA_APPLICATION, TRUE);
+        sdp_media_supported(sdp_config, SDP_MEDIA_DATA, TRUE);
+        sdp_media_supported(sdp_config, SDP_MEDIA_CONTROL, TRUE);
+        sdp_media_supported(sdp_config, SDP_MEDIA_NAS_RADIUS, TRUE);
+        sdp_media_supported(sdp_config, SDP_MEDIA_NAS_TACACS, TRUE);
+        sdp_media_supported(sdp_config, SDP_MEDIA_NAS_DIAMETER, TRUE);
+        sdp_media_supported(sdp_config, SDP_MEDIA_NAS_L2TP, TRUE);
+        sdp_media_supported(sdp_config, SDP_MEDIA_NAS_LOGIN, TRUE);
+        sdp_media_supported(sdp_config, SDP_MEDIA_NAS_NONE, TRUE);
+        sdp_media_supported(sdp_config, SDP_MEDIA_IMAGE, TRUE);
+        sdp_media_supported(sdp_config, SDP_MEDIA_TEXT, TRUE);
+        sdp_nettype_supported(sdp_config, SDP_NT_INTERNET, TRUE);
+        sdp_addrtype_supported(sdp_config, SDP_AT_IP4, TRUE);
+        sdp_addrtype_supported(sdp_config, SDP_AT_IP6, TRUE);
+        sdp_transport_supported(sdp_config, SDP_TRANSPORT_RTPAVP, TRUE);
+        sdp_transport_supported(sdp_config, SDP_TRANSPORT_UDPTL, TRUE);
+        sdp_require_session_name(sdp_config, FALSE);
     }
 
-    sdp_media_supported(ccsip_sdp_config, SDP_MEDIA_AUDIO, TRUE);
-    sdp_media_supported(ccsip_sdp_config, SDP_MEDIA_VIDEO, TRUE);
-    sdp_media_supported(ccsip_sdp_config, SDP_MEDIA_APPLICATION, TRUE);
-    sdp_media_supported(ccsip_sdp_config, SDP_MEDIA_DATA, TRUE);
-    sdp_media_supported(ccsip_sdp_config, SDP_MEDIA_CONTROL, TRUE);
-    sdp_media_supported(ccsip_sdp_config, SDP_MEDIA_NAS_RADIUS, TRUE);
-    sdp_media_supported(ccsip_sdp_config, SDP_MEDIA_NAS_TACACS, TRUE);
-    sdp_media_supported(ccsip_sdp_config, SDP_MEDIA_NAS_DIAMETER, TRUE);
-    sdp_media_supported(ccsip_sdp_config, SDP_MEDIA_NAS_L2TP, TRUE);
-    sdp_media_supported(ccsip_sdp_config, SDP_MEDIA_NAS_LOGIN, TRUE);
-    sdp_media_supported(ccsip_sdp_config, SDP_MEDIA_NAS_NONE, TRUE);
-    sdp_media_supported(ccsip_sdp_config, SDP_MEDIA_IMAGE, TRUE);
-    sdp_media_supported(ccsip_sdp_config, SDP_MEDIA_TEXT, TRUE);
-    sdp_nettype_supported(ccsip_sdp_config, SDP_NT_INTERNET, TRUE);
-    sdp_addrtype_supported(ccsip_sdp_config, SDP_AT_IP4, TRUE);
-    sdp_addrtype_supported(ccsip_sdp_config, SDP_AT_IP6, TRUE);
-    sdp_transport_supported(ccsip_sdp_config, SDP_TRANSPORT_RTPAVP, TRUE);
-    sdp_transport_supported(ccsip_sdp_config, SDP_TRANSPORT_UDPTL, TRUE);
-    sdp_require_session_name(ccsip_sdp_config, FALSE);
-
-    return (TRUE);
+    return sdp_config;
 }
 
 /*
  * sipsdp_create()
  *
  * Allocate a standard SDP with SIP config and set debug options
  * based on ccsip debug settings
  */
 sdp_t *
 sipsdp_create (const char *peerconnection)
 {
     sdp_t *sdp;
+    void *sdp_config;
 
-    sdp = sdp_init_description(peerconnection, ccsip_sdp_config);
+    sdp_config = sip_sdp_init();
+    if (!sdp_config) {
+        CCSIP_DEBUG_ERROR(SIP_F_PREFIX"SDP config init failure", __FUNCTION__);
+        return (NULL);
+    }
+
+    sdp = sdp_init_description(peerconnection, sdp_config);
     if (!sdp) {
         CCSIP_DEBUG_ERROR(SIP_F_PREFIX"SDP allocation failure", __FUNCTION__);
         return (NULL);
     }
 
     /*
      * Map "ccsip debug events (or info)" to SDP warnings
      *     "ccsip debug errors to SDP errors
--- a/media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_sdp.h
+++ b/media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_sdp.h
@@ -15,17 +15,16 @@
 /* SDP bitmask values */
 #define CCSIP_SRC_SDP_BIT       0x1
 #define CCSIP_DEST_SDP_BIT      0x2
 
 /*
  * Create a description or a SIP SDP (sip_info) with
  * appropriate values initialized
  */
-PMH_EXTERN boolean sip_sdp_init(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(const char *peerconnection,
     uint16_t flags, cc_sdp_t **sdp_info);
 PMH_EXTERN void sipsdp_free(cc_sdp_t **sip_sdp);
 
 /*