summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2013-02-21 20:49:19 +0000
committerNanang Izzuddin <nanang@teluu.com>2013-02-21 20:49:19 +0000
commitc1fac09695b25a676f33024cde2a8d956bb4166e (patch)
tree4a845923fc7e0d6eaddadc16f05af13e82d3b746
parentae3b76891da4b6e3793cc7f0c2896de92b8a7d46 (diff)
Close #1625: Introduced new API pjmedia_sdp_validate2() for allowing SDP media without c= line when port is zero, currently it is only applied in validating remote SDP.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4367 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjmedia/include/pjmedia/sdp.h17
-rw-r--r--pjmedia/src/pjmedia/sdp.c12
-rw-r--r--pjmedia/src/pjmedia/sdp_neg.c2
-rw-r--r--pjsip/src/pjsip-ua/sip_inv.c2
4 files changed, 30 insertions, 3 deletions
diff --git a/pjmedia/include/pjmedia/sdp.h b/pjmedia/include/pjmedia/sdp.h
index c3f67823..ddcbc704 100644
--- a/pjmedia/include/pjmedia/sdp.h
+++ b/pjmedia/include/pjmedia/sdp.h
@@ -686,6 +686,23 @@ PJ_DECL(pj_status_t) pjmedia_sdp_validate(const pjmedia_sdp_session *sdp);
/**
+ * Perform semantic validation for the specified SDP session descriptor.
+ * This function perform validation beyond just syntactic verification,
+ * such as to verify the value of network type and address type, check
+ * the connection line, and verify that \a rtpmap attribute is present
+ * when dynamic payload type is used.
+ *
+ * @param sdp The SDP session descriptor to validate.
+ * @param strict Flag whether the check should be strict, i.e: allow
+ * media without connection line when port is zero.
+ *
+ * @return PJ_SUCCESS on success.
+ */
+PJ_DECL(pj_status_t) pjmedia_sdp_validate2(const pjmedia_sdp_session *sdp,
+ pj_bool_t strict);
+
+
+/**
* Clone SDP session descriptor.
*
* @param pool The pool used to clone the session.
diff --git a/pjmedia/src/pjmedia/sdp.c b/pjmedia/src/pjmedia/sdp.c
index 629500c7..0d6b4f3c 100644
--- a/pjmedia/src/pjmedia/sdp.c
+++ b/pjmedia/src/pjmedia/sdp.c
@@ -1423,6 +1423,14 @@ static pj_status_t validate_sdp_conn(const pjmedia_sdp_conn *c)
/* Validate SDP session descriptor. */
PJ_DEF(pj_status_t) pjmedia_sdp_validate(const pjmedia_sdp_session *sdp)
{
+ return pjmedia_sdp_validate2(sdp, PJ_TRUE);
+}
+
+
+/* Validate SDP session descriptor. */
+PJ_DEF(pj_status_t) pjmedia_sdp_validate2(const pjmedia_sdp_session *sdp,
+ pj_bool_t strict)
+{
unsigned i;
const pj_str_t STR_RTPMAP = { "rtpmap", 6 };
@@ -1471,7 +1479,8 @@ PJ_DEF(pj_status_t) pjmedia_sdp_validate(const pjmedia_sdp_session *sdp)
*/
if (m->conn == NULL) {
if (sdp->conn == NULL)
- return PJMEDIA_SDP_EMISSINGCONN;
+ if (strict || m->desc.port != 0)
+ return PJMEDIA_SDP_EMISSINGCONN;
}
/* Verify payload type. */
@@ -1505,6 +1514,7 @@ PJ_DEF(pj_status_t) pjmedia_sdp_validate(const pjmedia_sdp_session *sdp)
return PJ_SUCCESS;
}
+
PJ_DEF(pj_status_t) pjmedia_sdp_transport_cmp( const pj_str_t *t1,
const pj_str_t *t2)
{
diff --git a/pjmedia/src/pjmedia/sdp_neg.c b/pjmedia/src/pjmedia/sdp_neg.c
index 09b893ef..217bd176 100644
--- a/pjmedia/src/pjmedia/sdp_neg.c
+++ b/pjmedia/src/pjmedia/sdp_neg.c
@@ -138,7 +138,7 @@ PJ_DEF(pj_status_t) pjmedia_sdp_neg_create_w_remote_offer(pj_pool_t *pool,
*p_neg = NULL;
/* Validate remote offer and initial answer */
- status = pjmedia_sdp_validate(remote);
+ status = pjmedia_sdp_validate2(remote, PJ_FALSE);
if (status != PJ_SUCCESS)
return status;
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c
index 2241db13..62764977 100644
--- a/pjsip/src/pjsip-ua/sip_inv.c
+++ b/pjsip/src/pjsip-ua/sip_inv.c
@@ -829,7 +829,7 @@ PJ_DEF(pjsip_rdata_sdp_info*) pjsip_rdata_get_sdp_info(pjsip_rx_data *rdata)
sdp_info->body.slen,
&sdp_info->sdp);
if (status == PJ_SUCCESS)
- status = pjmedia_sdp_validate(sdp_info->sdp);
+ status = pjmedia_sdp_validate2(sdp_info->sdp, PJ_FALSE);
if (status != PJ_SUCCESS) {
sdp_info->sdp = NULL;