From 67c757c4d22a9983d4a87a4ce2476d00c464fc72 Mon Sep 17 00:00:00 2001 From: Jordan Augé Date: Tue, 21 Jan 2020 13:47:18 +0100 Subject: [HICN-481] Add APIs to trigger MAP-Me updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I6faefcdcbd6a0e5786b57ca5403804a8fe31dd0d Signed-off-by: Jordan Augé --- hicn-light/src/hicn/core/mapme.c | 42 +++++++++++++++++--------------- hicn-light/src/hicn/core/mapme.h | 10 ++++++++ hicn-light/src/hicn/processor/fibEntry.c | 2 +- hicn-light/src/hicn/processor/fibEntry.h | 2 +- 4 files changed, 35 insertions(+), 21 deletions(-) diff --git a/hicn-light/src/hicn/core/mapme.c b/hicn-light/src/hicn/core/mapme.c index e426e7575..93a01bb0d 100644 --- a/hicn-light/src/hicn/core/mapme.c +++ b/hicn-light/src/hicn/core/mapme.c @@ -480,29 +480,16 @@ static bool mapme_hasLocalNextHops(const MapMe *mapme, } void -mapme_reconsiderFibEntry(const MapMe *mapme, FibEntry * fibEntry) +mapme_send_updates(const MapMe * mapme, FibEntry * fibEntry, const NumberSet * nexthops) { - /* - * Skip entries that do not correspond to a producer ( / have a locally - * served prefix / have no local connection as next hop) - */ - if (!mapme_hasLocalNextHops(mapme, fibEntry)) - return; - - /* Apply the policy of the fibEntry over all neighbours */ - NumberSet * available_nexthops = fibEntry_GetAvailableNextHops(fibEntry, ~0); - NumberSet * previous_nexthops = fibEntry_GetPreviousNextHops(fibEntry); - /* Detect change */ - if (numberSet_Equals(available_nexthops, previous_nexthops)) { - numberSet_Release(&available_nexthops); + NumberSet * previous_nexthops = fibEntry_GetPreviousNextHops(fibEntry); + if (numberSet_Equals(nexthops, previous_nexthops)) { INFO(mapme, "[MAP-Me] No change in nexthops"); return; } - fibEntry_SetPreviousNextHops(fibEntry, available_nexthops); - + fibEntry_SetPreviousNextHops(fibEntry, nexthops); - /* Advertise prefix on all available next hops */ if (!TFIB(fibEntry)) /* Create TFIB associated to FIB entry */ mapme_CreateTFIB(fibEntry); TFIB(fibEntry)->seq++; @@ -510,14 +497,31 @@ mapme_reconsiderFibEntry(const MapMe *mapme, FibEntry * fibEntry) const Name *name = fibEntry_GetPrefix(fibEntry); char *name_str = name_ToString(name); bool clear_tfib = true; - for (size_t j = 0; j < numberSet_Length(available_nexthops); j++) { - unsigned nexthop_id = numberSet_GetItem(available_nexthops, j); + for (size_t j = 0; j < numberSet_Length(nexthops); j++) { + unsigned nexthop_id = numberSet_GetItem(nexthops, j); INFO(mapme, "[MAP-Me] sending IU/IN for name %s on connection %d", name_str, nexthop_id); mapme_setFacePending(mapme, name, fibEntry, nexthop_id, true, true, clear_tfib, 0); clear_tfib = false; } free(name_str); +} + +void +mapme_reconsiderFibEntry(const MapMe *mapme, FibEntry * fibEntry) +{ + /* + * Skip entries that do not correspond to a producer ( / have a locally + * served prefix / have no local connection as next hop) + */ + if (!mapme_hasLocalNextHops(mapme, fibEntry)) + return; + + /* Apply the policy of the fibEntry over all neighbours */ + NumberSet * available_nexthops = fibEntry_GetAvailableNextHops(fibEntry, ~0); + + /* Advertise prefix on all available next hops (if needed) */ + mapme_send_updates(mapme, fibEntry, available_nexthops); numberSet_Release(&available_nexthops); } diff --git a/hicn-light/src/hicn/core/mapme.h b/hicn-light/src/hicn/core/mapme.h index 81977ab2e..503b22568 100644 --- a/hicn-light/src/hicn/core/mapme.h +++ b/hicn-light/src/hicn/core/mapme.h @@ -68,6 +68,16 @@ bool mapme_isMapMe(const uint8_t *msgBuffer); void mapme_Process(const MapMe *mapme, const uint8_t *msgBuffer, unsigned conn_id); +/** + * @function mapme_send_updates + * @abstract Trigger the update for specified FIB entry and nexthops + * @param [in] mapme - Pointer to the MAP-Me data structure. + * @param [in] fibEntry - The FIB entry to consider + * @param [in] nexthops - NumberSet holding the next hops on which to send the + * update. + */ +void mapme_send_updates(const MapMe * mapme, FibEntry * fibEntry, const NumberSet * nexthops); + /** * @function mapme_reconsiderFibEntry * @abstract Process a fib entry for changes that might trigger new updates diff --git a/hicn-light/src/hicn/processor/fibEntry.c b/hicn-light/src/hicn/processor/fibEntry.c index be7278987..2c41f1c7b 100644 --- a/hicn-light/src/hicn/processor/fibEntry.c +++ b/hicn-light/src/hicn/processor/fibEntry.c @@ -478,7 +478,7 @@ fibEntry_GetPreviousNextHops(const FibEntry *fibEntry) #endif /* WITH_POLICY */ void -fibEntry_SetPreviousNextHops(FibEntry *fibEntry, NumberSet * nexthops) +fibEntry_SetPreviousNextHops(FibEntry *fibEntry, const NumberSet * nexthops) { if (fibEntry->previous_nexthops) numberSet_Release(&fibEntry->previous_nexthops); diff --git a/hicn-light/src/hicn/processor/fibEntry.h b/hicn-light/src/hicn/processor/fibEntry.h index 1bd917bc2..13f002eb9 100644 --- a/hicn-light/src/hicn/processor/fibEntry.h +++ b/hicn-light/src/hicn/processor/fibEntry.h @@ -121,7 +121,7 @@ void fibEntry_SetPolicy(FibEntry *fibEntry, policy_t policy); void fibEntry_UpdateStats(FibEntry *fibEntry, uint64_t now); NumberSet * fibEntry_GetAvailableNextHops(const FibEntry *fibEntry, unsigned in_connection); NumberSet * fibEntry_GetPreviousNextHops(const FibEntry *fibEntry); -void fibEntry_SetPreviousNextHops(FibEntry *fibEntry, NumberSet * nexthops); +void fibEntry_SetPreviousNextHops(FibEntry *fibEntry, const NumberSet * nexthops); void fibEntry_OnTimeout(FibEntry *fibEntry, const NumberSet *egressId); const NumberSet *fibEntry_GetNexthopsFromForwardingStrategy( -- cgit 1.2.3-korg