From 2ada8954ecd3601d115a22696c4c3ab90858cec3 Mon Sep 17 00:00:00 2001 From: Jordan Augé Date: Sun, 17 Nov 2019 00:07:12 +0100 Subject: [HICN-379] Add face priority support in face manager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: If4f75d44fc66414a4a70135de7827f5082b97112 Signed-off-by: Jordan Augé --- hicn-light/src/hicn/processor/fibEntry.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'hicn-light/src/hicn/processor') diff --git a/hicn-light/src/hicn/processor/fibEntry.c b/hicn-light/src/hicn/processor/fibEntry.c index 1aaa3ace9..084be7b17 100644 --- a/hicn-light/src/hicn/processor/fibEntry.c +++ b/hicn-light/src/hicn/processor/fibEntry.c @@ -576,16 +576,39 @@ const NumberSet *fibEntry_GetNexthopsFromForwardingStrategy( if (numberSet_Length(available_nexthops) == 0) { out = numberSet_Create(); } else { + + /* Priority */ + NumberSet * priority_nexthops = numberSet_Create(); + + uint32_t max_priority = 0; + for (size_t k = 0; k < numberSet_Length(priority_nexthops); k++) { + unsigned conn_id = numberSet_GetItem(priority_nexthops, k); + const Connection * conn = connectionTable_FindById(table, conn_id); + uint32_t priority = connection_GetPriority(conn); + if (priority < max_priority) { + continue; + } else if (priority == max_priority) { + numberSet_Add(priority_nexthops, conn_id); + } else { /* priority > max_priority */ + numberSet_Release(&priority_nexthops); + priority_nexthops = numberSet_Create(); + numberSet_Add(priority_nexthops, conn_id); + max_priority = priority; + } + } + /* Multipath */ if ((policy.tags[POLICY_TAG_MULTIPATH].state != POLICY_STATE_PROHIBIT) && (policy.tags[POLICY_TAG_MULTIPATH].state != POLICY_STATE_AVOID)) { - out = fibEntry->fwdStrategy->lookupNexthop(fibEntry->fwdStrategy, available_nexthops, + out = fibEntry->fwdStrategy->lookupNexthop(fibEntry->fwdStrategy, priority_nexthops, interestMessage); } else { - unsigned nexthop = numberSet_GetItem(available_nexthops, 0); + unsigned nexthop = numberSet_GetItem(priority_nexthops, 0); out = numberSet_Create(); numberSet_Add(out, nexthop); } + + numberSet_Release(&priority_nexthops); } numberSet_Release(&available_nexthops); -- cgit 1.2.3-korg