diff options
author | Matthew Jordan <mjordan@digium.com> | 2012-02-24 15:10:35 +0000 |
---|---|---|
committer | Matthew Jordan <mjordan@digium.com> | 2012-02-24 15:10:35 +0000 |
commit | 670797e5da08808716ce1eafc9fc2b9bec8f1d58 (patch) | |
tree | ecf457e27a685df76cbf894337c030c7d0bd3380 /main | |
parent | ebaf59a656ef94e19332c08e0d0562b8cbe59f65 (diff) |
Allow SRTP policies to be reloaded
Currently, when using res_srtp, once the SRTP policy has been added to the
current session the policy is locked into place. Any attempt to replace an
existing policy, which would be needed if the remote endpoint negotiated a new
cryptographic key, is instead rejected in res_srtp. This happens in particular
in transfer scenarios, where the endpoint that Asterisk is communicating with
changes but uses the same RTP session.
This patch modifies res_srtp to allow remote and local policies to be reloaded
in the underlying SRTP library. From the perspective of users of the SRTP API,
the only change is that the adding of remote and local policies are now added
in a single method call, whereas they previously were added separately. This
was changed to account for the differences in handling remote and local
policies in libsrtp.
Review: https://reviewboard.asterisk.org/r/1741/
(closes issue ASTERISK-19253)
Reported by: Thomas Arimont
Tested by: Thomas Arimont
Patches:
srtp_renew_keys_2012_02_22.diff uploaded by Matt Jordan (license 6283)
(with some small modifications for this check-in)
........
Merged revisions 356604 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 356605 from http://svn.asterisk.org/svn/asterisk/branches/10
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@356606 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r-- | main/rtp_engine.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/main/rtp_engine.c b/main/rtp_engine.c index 80f154f36..d60790c41 100644 --- a/main/rtp_engine.c +++ b/main/rtp_engine.c @@ -1856,17 +1856,24 @@ int ast_rtp_engine_srtp_is_registered(void) return res_srtp && res_srtp_policy; } -int ast_rtp_instance_add_srtp_policy(struct ast_rtp_instance *instance, struct ast_srtp_policy *policy) +int ast_rtp_instance_add_srtp_policy(struct ast_rtp_instance *instance, struct ast_srtp_policy *remote_policy, struct ast_srtp_policy *local_policy) { + int res = 0; + if (!res_srtp) { return -1; } if (!instance->srtp) { - return res_srtp->create(&instance->srtp, instance, policy); + res = res_srtp->create(&instance->srtp, instance, remote_policy); } else { - return res_srtp->add_stream(instance->srtp, policy); + res = res_srtp->replace(&instance->srtp, instance, remote_policy); + } + if (!res) { + res = res_srtp->add_stream(instance->srtp, local_policy); } + + return res; } struct ast_srtp *ast_rtp_instance_get_srtp(struct ast_rtp_instance *instance) |