|
|
|
@ -797,7 +797,9 @@ static void create_random_string(struct call *call, str *s, int len) { |
|
|
|
call_str_cpy_len(call, s, buf, len); |
|
|
|
} |
|
|
|
|
|
|
|
static int process_session_attributes(struct sdp_chopper *chop, struct sdp_attributes *attrs, struct sdp_ng_flags *flags) { |
|
|
|
static int process_session_attributes(struct sdp_chopper *chop, struct sdp_attributes *attrs, |
|
|
|
struct sdp_ng_flags *flags) |
|
|
|
{ |
|
|
|
GList *l; |
|
|
|
struct sdp_attribute *attr; |
|
|
|
|
|
|
|
@ -827,7 +829,8 @@ strip: |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
static int process_media_attributes(struct sdp_chopper *chop, struct sdp_attributes *attrs, struct sdp_ng_flags *flags) |
|
|
|
static int process_media_attributes(struct sdp_chopper *chop, struct sdp_attributes *attrs, |
|
|
|
struct sdp_ng_flags *flags) |
|
|
|
{ |
|
|
|
GList *l; |
|
|
|
struct sdp_attribute *attr; |
|
|
|
@ -948,19 +951,45 @@ static void insert_candidates_alt(struct sdp_chopper *chop, struct streamrelay * |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
static int has_ice(GQueue *sessions) { |
|
|
|
GList *l, *m; |
|
|
|
struct sdp_session *session; |
|
|
|
struct sdp_media *media; |
|
|
|
str s; |
|
|
|
|
|
|
|
str_init(&s, "ice-ufrag"); |
|
|
|
|
|
|
|
for (l = sessions->head; l; l = l->next) { |
|
|
|
session = l->data; |
|
|
|
|
|
|
|
if (g_hash_table_lookup(session->attributes.hash, &s)) |
|
|
|
return 1; |
|
|
|
|
|
|
|
for (m = session->media_streams.head; m; m = m->next) { |
|
|
|
media = m->data; |
|
|
|
|
|
|
|
if (g_hash_table_lookup(media->attributes.hash, &s)) |
|
|
|
return 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call *call, |
|
|
|
enum call_opmode opmode, struct sdp_ng_flags *flags, GHashTable *streamhash) |
|
|
|
{ |
|
|
|
struct sdp_session *session; |
|
|
|
struct sdp_media *media; |
|
|
|
GList *l, *k, *m; |
|
|
|
int off; |
|
|
|
int off, do_ice; |
|
|
|
struct stream_input si, *sip; |
|
|
|
struct streamrelay *rtp, *rtcp; |
|
|
|
unsigned long priority; |
|
|
|
|
|
|
|
off = opmode; |
|
|
|
m = call->callstreams->head; |
|
|
|
do_ice = (flags->ice_force || (!has_ice(sessions) && !flags->ice_remove)) ? 1 : 0; |
|
|
|
|
|
|
|
for (l = sessions->head; l; l = l->next) { |
|
|
|
session = l->data; |
|
|
|
@ -979,17 +1008,9 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call *call, |
|
|
|
if (process_session_attributes(chop, &session->attributes, flags)) |
|
|
|
goto error; |
|
|
|
|
|
|
|
if (flags->ice_force) { |
|
|
|
/* XXX locking here? */ |
|
|
|
create_random_string(call, &rtp->up->ice_ufrag, 8); |
|
|
|
create_random_string(call, &rtp->up->ice_pwd, 28); |
|
|
|
|
|
|
|
if (do_ice) { |
|
|
|
copy_up_to_end_of(chop, &session->s); |
|
|
|
chopper_append_c(chop, "a=ice-lite\r\na=ice-ufrag:"); |
|
|
|
chopper_append_str(chop, &rtp->up->ice_ufrag); |
|
|
|
chopper_append_c(chop, "\r\na=ice-pwd:"); |
|
|
|
chopper_append_str(chop, &rtp->up->ice_pwd); |
|
|
|
chopper_append_c(chop, "\r\n"); |
|
|
|
chopper_append_c(chop, "a=ice-lite\r\n"); |
|
|
|
} |
|
|
|
|
|
|
|
for (k = session->media_streams.head; k; k = k->next) { |
|
|
|
@ -1027,14 +1048,24 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call *call, |
|
|
|
chopper_append_c(chop, "\r\n"); |
|
|
|
} |
|
|
|
|
|
|
|
if (!flags->ice_remove) { |
|
|
|
if (flags->ice_force) { |
|
|
|
priority = new_priority(NULL); |
|
|
|
rtp->stun = 1; |
|
|
|
rtcp->stun = 1; |
|
|
|
if (do_ice) { |
|
|
|
/* XXX locking here? */ |
|
|
|
if (!rtp->up->ice_ufrag.s) { |
|
|
|
create_random_string(call, &rtp->up->ice_ufrag, 8); |
|
|
|
create_random_string(call, &rtp->up->ice_pwd, 28); |
|
|
|
} |
|
|
|
else |
|
|
|
priority = new_priority(media); |
|
|
|
|
|
|
|
chopper_append_c(chop, "a=ice-ufrag:"); |
|
|
|
chopper_append_str(chop, &rtp->up->ice_ufrag); |
|
|
|
chopper_append_c(chop, "\r\na=ice-pwd:"); |
|
|
|
chopper_append_str(chop, &rtp->up->ice_pwd); |
|
|
|
chopper_append_c(chop, "\r\n"); |
|
|
|
rtp->stun = 1; |
|
|
|
rtcp->stun = 1; |
|
|
|
} |
|
|
|
|
|
|
|
if (!flags->ice_remove) { |
|
|
|
priority = new_priority(flags->ice_force ? NULL : media); |
|
|
|
|
|
|
|
insert_candidates(chop, rtp, rtcp, priority, session, media); |
|
|
|
|
|
|
|
|