diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2010-06-24 08:46:12 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2010-06-24 08:46:12 +0000 |
commit | 70d7dcc89eba4bfa7dedd9a187bb2bb15e07ba5a (patch) | |
tree | ae7f7326a6d58017c44713adc8cd1a7ea179ff29 | |
parent | 20b6925d7dd16c7e8a5371179b81599ea22e28ea (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.c | 36 |
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; |