summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2010-06-24 08:46:12 +0000
committerNanang Izzuddin <nanang@teluu.com>2010-06-24 08:46:12 +0000
commit70d7dcc89eba4bfa7dedd9a187bb2bb15e07ba5a (patch)
treeae7f7326a6d58017c44713adc8cd1a7ea179ff29
parent20b6925d7dd16c7e8a5371179b81599ea22e28ea (diff)
Fix #1075:
- Fixed SRTP transport to only (re)start the SRTP state when the SRTP crypto settings are updated. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3221 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjmedia/src/pjmedia/transport_srtp.c36
1 files changed, 33 insertions, 3 deletions
diff --git a/pjmedia/src/pjmedia/transport_srtp.c b/pjmedia/src/pjmedia/transport_srtp.c
index d8f41a95..46d87271 100644
--- a/pjmedia/src/pjmedia/transport_srtp.c
+++ b/pjmedia/src/pjmedia/transport_srtp.c
@@ -312,6 +312,7 @@ static void pjmedia_srtp_deinit_lib(void)
libsrtp_initialized = PJ_FALSE;
}
+
static int get_crypto_idx(const pj_str_t* crypto_name)
{
int i;
@@ -329,6 +330,24 @@ static int get_crypto_idx(const pj_str_t* crypto_name)
return -1;
}
+
+static int srtp_crypto_cmp(const pjmedia_srtp_crypto* c1,
+ const pjmedia_srtp_crypto* c2)
+{
+ int r;
+
+ r = pj_strcmp(&c1->key, &c2->key);
+ if (r != 0)
+ return r;
+
+ r = pj_stricmp(&c1->name, &c2->name);
+ if (r != 0)
+ return r;
+
+ return (c1->flags != c2->flags);
+}
+
+
PJ_DEF(void) pjmedia_srtp_setting_default(pjmedia_srtp_setting *opt)
{
unsigned i;
@@ -1490,9 +1509,20 @@ static pj_status_t transport_media_start(pjmedia_transport *tp,
srtp->probation_cnt = PROBATION_CNT_INIT;
/* Got policy_local & policy_remote, let's initalize the SRTP */
- status = pjmedia_transport_srtp_start(tp, &srtp->tx_policy_neg, &srtp->rx_policy_neg);
- if (status != PJ_SUCCESS)
- return status;
+
+ /* Ticket #1075: media_start() is called whenever media description
+ * gets updated, e.g: call hold, however we should restart SRTP only
+ * when the SRTP policy settings are updated.
+ */
+ if (srtp_crypto_cmp(&srtp->tx_policy_neg, &srtp->tx_policy) ||
+ srtp_crypto_cmp(&srtp->rx_policy_neg, &srtp->rx_policy))
+ {
+ status = pjmedia_transport_srtp_start(tp,
+ &srtp->tx_policy_neg,
+ &srtp->rx_policy_neg);
+ if (status != PJ_SUCCESS)
+ return status;
+ }
goto PROPAGATE_MEDIA_START;