diff --git a/daemon/call.c b/daemon/call.c index 36c98fab0..7f0031640 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2082,6 +2082,43 @@ get: } } + +static void __dtls_logic(const struct sdp_ng_flags *flags, struct call_media *media, + struct call_media *other_media, struct stream_params *sp) +{ + unsigned int tmp; + + /* active and passive are from our POV */ + tmp = other_media->media_flags; + bf_copy(&other_media->media_flags, MEDIA_FLAG_SETUP_PASSIVE, + &sp->sp_flags, SP_FLAG_SETUP_ACTIVE); + bf_copy(&other_media->media_flags, MEDIA_FLAG_SETUP_ACTIVE, + &sp->sp_flags, SP_FLAG_SETUP_PASSIVE); + + if (flags) { + /* Special case: if this is an offer and actpass is being offered (as it should), + * we would normally choose to be active. However, if this is a reinvite and we + * were passive previously, we should retain this role. */ + if (flags && flags->opmode == OP_OFFER && MEDIA_ISSET(other_media, SETUP_ACTIVE) + && MEDIA_ISSET(other_media, SETUP_PASSIVE) + && (tmp & (MEDIA_FLAG_SETUP_ACTIVE | MEDIA_FLAG_SETUP_PASSIVE)) + == MEDIA_FLAG_SETUP_PASSIVE) + MEDIA_CLEAR(other_media, SETUP_ACTIVE); + /* if passive mode is requested, honour it if we can */ + if (flags && flags->dtls_passive && MEDIA_ISSET(other_media, SETUP_PASSIVE)) + MEDIA_CLEAR(other_media, SETUP_ACTIVE); + } + + if (memcmp(&other_media->fingerprint, &sp->fingerprint, sizeof(sp->fingerprint))) { + __fingerprint_changed(other_media); + other_media->fingerprint = sp->fingerprint; + } + MEDIA_CLEAR(other_media, DTLS); + if ((MEDIA_ISSET(other_media, SETUP_PASSIVE) || MEDIA_ISSET(other_media, SETUP_ACTIVE)) + && other_media->fingerprint.hash_func) + MEDIA_SET(other_media, DTLS); +} + /* called with call->master_lock held in W */ int monologue_offer_answer(struct call_monologue *other_ml, GQueue *streams, const struct sdp_ng_flags *flags) @@ -2089,7 +2126,7 @@ int monologue_offer_answer(struct call_monologue *other_ml, GQueue *streams, struct stream_params *sp; GList *media_iter, *ml_media, *other_ml_media; struct call_media *media, *other_media; - unsigned int num_ports, tmp; + unsigned int num_ports; struct call_monologue *monologue = other_ml->active_dialogue; struct endpoint_map *em; struct call *call; @@ -2155,32 +2192,8 @@ int monologue_offer_answer(struct call_monologue *other_ml, GQueue *streams, bf_copy(&other_media->media_flags, MEDIA_FLAG_RECV, &sp->sp_flags, SP_FLAG_SEND); bf_copy(&other_media->media_flags, MEDIA_FLAG_SEND, &sp->sp_flags, SP_FLAG_RECV); - /* active and passive are also from our POV */ - tmp = other_media->media_flags; - bf_copy(&other_media->media_flags, MEDIA_FLAG_SETUP_PASSIVE, - &sp->sp_flags, SP_FLAG_SETUP_ACTIVE); - bf_copy(&other_media->media_flags, MEDIA_FLAG_SETUP_ACTIVE, - &sp->sp_flags, SP_FLAG_SETUP_PASSIVE); - /* Special case: if this is an offer and actpass is being offered (as it should), - * we would normally choose to be active. However, if this is a reinvite and we - * were passive previously, we should retain this role. */ - if (flags && flags->opmode == OP_OFFER && MEDIA_ISSET(other_media, SETUP_ACTIVE) - && MEDIA_ISSET(other_media, SETUP_PASSIVE) - && (tmp & (MEDIA_FLAG_SETUP_ACTIVE | MEDIA_FLAG_SETUP_PASSIVE)) - == MEDIA_FLAG_SETUP_PASSIVE) - MEDIA_CLEAR(other_media, SETUP_ACTIVE); - /* if passive mode is requested, honour it if we can */ - if (flags && flags->dtls_passive && MEDIA_ISSET(other_media, SETUP_PASSIVE)) - MEDIA_CLEAR(other_media, SETUP_ACTIVE); - - if (memcmp(&other_media->fingerprint, &sp->fingerprint, sizeof(sp->fingerprint))) { - __fingerprint_changed(other_media); - other_media->fingerprint = sp->fingerprint; - } - MEDIA_CLEAR(other_media, DTLS); - if ((MEDIA_ISSET(other_media, SETUP_PASSIVE) || MEDIA_ISSET(other_media, SETUP_ACTIVE)) - && other_media->fingerprint.hash_func) - MEDIA_SET(other_media, DTLS); + /* DTLS stuff */ + __dtls_logic(flags, media, other_media, sp); /* ICE negotiation */ __ice_offer(flags, media, other_media);