From 09b9303eac6e4380185905e6dc866af35c88fd8b Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 28 Apr 2014 10:37:11 -0400 Subject: [PATCH] fix ICE priority calculation --- daemon/sdp.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/daemon/sdp.c b/daemon/sdp.c index 0bbfa275d..568249fc0 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -1437,20 +1437,24 @@ strip: return 0; } -static unsigned long prio_calc(unsigned int pref) { - return (1 << 24) * 126 + (1 << 8) * pref + 256 * 1; +INLINE unsigned long prio_calc(unsigned int pref, unsigned int tpref) { + return (1 << 24) * tpref + (1 << 8) * pref + 256 * 1; } -static unsigned long new_priority(struct sdp_media *media) { +static unsigned long new_priority(struct sdp_media *media, int relay) { int id; GQueue *cands; - unsigned int pref; - unsigned long prio; + int pref; + unsigned long prio, tpref; GList *l; + struct sdp_attribute *a; struct attribute_candidate *c; + tpref = 126; + if (relay) + tpref = 0; pref = 65535; - prio = prio_calc(pref); + prio = prio_calc(pref, tpref); if (!media) goto out; @@ -1461,10 +1465,11 @@ static unsigned long new_priority(struct sdp_media *media) { goto out; for (l = cands->head; l; l = l->next) { - c = l->data; - while (c->priority >= prio) { + a = l->data; + c = &a->u.candidate; + while (c->priority >= prio && pref >= 1) { pref--; - prio = prio_calc(pref); + prio = prio_calc(pref, tpref); } } @@ -1773,7 +1778,10 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu } if (!flags->ice_remove) { - priority = new_priority(flags->ice_force ? NULL : sdp_media); + priority = new_priority( + (flags->ice_force || flags->ice_force_relay) ? NULL : sdp_media, + flags->ice_force_relay + ); insert_candidates(chop, ps, ps_rtcp, priority, sdp_media, flags->ice_force_relay);