|
|
|
@ -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); |
|
|
|
|