File 0013-Assign-unique-local-preferences-for-candidates-with-.patch of Package pjproject

From 0a13964065c2e4592eff07ec0880cb2af0a86ff9 Mon Sep 17 00:00:00 2001
From: Nanang Izzuddin <nanang@teluu.com>
Date: Fri, 7 Aug 2020 16:03:43 +0700
Subject: [PATCH 1/3] - Assign unique local preferences for candidates with the
 same type. - Update component's valid pair condition, instead of just higher
 priority, also consider 'nominated' flag.

---
 pjnath/src/pjnath/ice_session.c | 18 +++++++++++++++++-
 pjnath/src/pjnath/ice_strans.c  |  9 +++++----
 2 files changed, 22 insertions(+), 5 deletions(-)

Index: pjproject-2.10/pjnath/src/pjnath/ice_session.c
===================================================================
--- pjproject-2.10.orig/pjnath/src/pjnath/ice_session.c
+++ pjproject-2.10/pjnath/src/pjnath/ice_session.c
@@ -1506,7 +1506,23 @@ static void update_comp_check(pj_ice_ses
     if (comp->valid_check == NULL) {
 	comp->valid_check = check;
     } else {
-	if (CMP_CHECK_PRIO(comp->valid_check, check) < 0)
+	pj_bool_t update = PJ_FALSE;
+
+	/* Update component's valid check with conditions:
+	 * - it is the first nominated check, or
+	 * - it has higher prio, as long as nomination status is NOT degraded
+	 *   (existing is nominated -> new is not-nominated).
+	 */
+	if (!comp->nominated_check && check->nominated)
+	{
+	    update = PJ_TRUE;
+	} else if (CMP_CHECK_PRIO(comp->valid_check, check) < 0 &&
+		   (!comp->nominated_check || check->nominated))
+	{
+	    update = PJ_TRUE;
+	}
+
+	if (update)
 	    comp->valid_check = check;
     }
 
Index: pjproject-2.10/pjnath/src/pjnath/ice_strans.c
===================================================================
--- pjproject-2.10.orig/pjnath/src/pjnath/ice_strans.c
+++ pjproject-2.10/pjnath/src/pjnath/ice_strans.c
@@ -460,7 +460,7 @@ static pj_status_t add_update_turn(pj_ic
 	cand = &comp->cand_list[comp->cand_cnt];
 	cand->type = PJ_ICE_CAND_TYPE_RELAYED;
 	cand->status = PJ_EPENDING;
-	cand->local_pref = RELAY_PREF;
+	cand->local_pref = (pj_uint16_t)(RELAY_PREF - idx);
 	cand->transport_id = tp_id;
 	cand->comp_id = (pj_uint8_t) comp->comp_id;
 	new_cand = PJ_TRUE;
@@ -529,7 +529,8 @@ static pj_bool_t ice_cand_equals(pj_ice_
         || lcand->status != rcand->status
         || lcand->comp_id != rcand->comp_id
         || lcand->transport_id != rcand->transport_id
-        || lcand->local_pref != rcand->local_pref
+	// local pref is no longer a constant, so it may be different
+        //|| lcand->local_pref != rcand->local_pref
         || lcand->prio != rcand->prio
         || lcand->transport != rcand->transport
         || pj_sockaddr_cmp(&lcand->addr, &rcand->addr) != 0
@@ -705,7 +706,7 @@ static pj_status_t add_stun_and_host(pj_
     cand = &comp->cand_list[comp->cand_cnt];
     cand->type = PJ_ICE_CAND_TYPE_SRFLX;
     cand->status = PJ_EPENDING;
-    cand->local_pref = SRFLX_PREF;
+    cand->local_pref = (pj_uint16_t)(SRFLX_PREF - idx);
     cand->transport_id = CREATE_TP_ID(TP_STUN, idx);
     cand->comp_id = (pj_uint8_t) comp->comp_id;
     cand->transport = stun_cfg->conn_type == PJ_STUN_TP_UDP ?
openSUSE Build Service is sponsored by