aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-light/src/hicn/processor/fibEntry.c
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-light/src/hicn/processor/fibEntry.c')
-rw-r--r--hicn-light/src/hicn/processor/fibEntry.c103
1 files changed, 44 insertions, 59 deletions
diff --git a/hicn-light/src/hicn/processor/fibEntry.c b/hicn-light/src/hicn/processor/fibEntry.c
index 11a572c88..46917a9d2 100644
--- a/hicn-light/src/hicn/processor/fibEntry.c
+++ b/hicn-light/src/hicn/processor/fibEntry.c
@@ -61,10 +61,10 @@ struct fib_entry {
// NumberSet *available_nexthops;
#ifdef WITH_MAPME
/* In case of no multipath, this stores the previous decision taken by policy */
- unsigned previous_nexthop;
#endif /* WITH_MAPME */
#endif /* WITH_POLICY */
#ifdef WITH_MAPME
+ NumberSet * previous_nexthops;
void *userData;
void (*userDataRelease)(void **userData);
#endif /* WITH_MAPME */
@@ -122,9 +122,6 @@ FibEntry *fibEntry_Create(Name *name, strategy_type fwdStrategy) {
fibEntry->forwarder = forwarder;
fibEntry->policy = POLICY_NONE;
fibEntry->policy_counters = POLICY_COUNTERS_NONE;
-#ifdef WITH_MAPME
- fibEntry->previous_nexthop = ~0;
-#endif /* WITH_MAPME */
#endif /* WITH_POLICY */
return fibEntry;
@@ -223,12 +220,12 @@ fibEntry_GetAvailableNextHops(const FibEntry *fibEntry, unsigned in_connection)
ConnectionList * list = connectionTable_GetEntries(table);
for (size_t i = 0; i < connectionList_Length(list); i++) {
Connection *conn = connectionList_Get(list, i);
+ if (connection_IsLocal(conn))
+ continue;
if (connection_GetAdminState(conn) == CONNECTION_STATE_DOWN)
continue;
if (connection_GetState(conn) == CONNECTION_STATE_DOWN)
continue;
- if (connection_IsLocal(conn))
- continue;
numberSet_Add(nexthops, connection_GetConnectionId(conn));
}
connectionList_Destroy(&list);
@@ -445,46 +442,57 @@ fibEntry_GetAvailableNextHops(const FibEntry *fibEntry, unsigned in_connection)
numberSet_Release(&filtered_nexthops);
}
- return available_nexthops;
-}
+ /* Priority */
+ NumberSet * priority_nexthops = numberSet_Create();
-policy_t fibEntry_GetPolicy(const FibEntry *fibEntry) {
- return fibEntry->policy;
-}
-
-void fibEntry_ReconsiderPolicy(FibEntry *fibEntry) {
-#ifdef WITH_MAPME
- NumberSet * available_nexthops = fibEntry_GetAvailableNextHops(fibEntry, ~0);
-
- if (numberSet_Length(available_nexthops) == 0)
- goto END;
-
- /* Multipath */
- if ((fibEntry->policy.tags[POLICY_TAG_MULTIPATH].state != POLICY_STATE_PROHIBIT) &&
- (fibEntry->policy.tags[POLICY_TAG_MULTIPATH].state != POLICY_STATE_AVOID))
- goto END;
-
- unsigned nexthop = numberSet_GetItem(available_nexthops, 0);
- if (nexthop != fibEntry->previous_nexthop) {
- /* Policy has elected a new nexthop, signal it using MAP-Me */
- fibEntry->previous_nexthop = nexthop;
- ConnectionTable * table = forwarder_GetConnectionTable(fibEntry->forwarder);
- const Connection * conn = connectionTable_FindById(table, nexthop);
- mapme_onPolicyUpdate(forwarder_getMapmeInstance(fibEntry->forwarder), conn, fibEntry);
+ uint32_t max_priority = 0;
+ for (size_t k = 0; k < numberSet_Length(available_nexthops); k++) {
+ unsigned conn_id = numberSet_GetItem(available_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;
+ }
}
-END:
numberSet_Release(&available_nexthops);
-#endif /* WITH_MAPME */
+
+ return priority_nexthops;
+}
+
+policy_t fibEntry_GetPolicy(const FibEntry *fibEntry) {
+ return fibEntry->policy;
}
void fibEntry_SetPolicy(FibEntry *fibEntry, policy_t policy) {
fibEntry->policy = policy;
- fibEntry_ReconsiderPolicy(fibEntry);
+ mapme_reconsiderFibEntry(forwarder_getMapmeInstance(fibEntry->forwarder), fibEntry);
}
+NumberSet *
+fibEntry_GetPreviousNextHops(const FibEntry *fibEntry)
+{
+ return fibEntry->previous_nexthops;
+}
#endif /* WITH_POLICY */
+void
+fibEntry_SetPreviousNextHops(FibEntry *fibEntry, NumberSet * nexthops)
+{
+ if (fibEntry->previous_nexthops)
+ numberSet_Release(&fibEntry->previous_nexthops);
+ fibEntry->previous_nexthops = numberSet_Create();
+ numberSet_AddSet(fibEntry->previous_nexthops, nexthops);
+}
+
+
void fibEntry_AddNexthop(FibEntry *fibEntry, unsigned connectionId) {
parcAssertNotNull(fibEntry, "Parameter fibEntry must be non-null");
#ifdef WITH_POLICY
@@ -576,39 +584,16 @@ 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(available_nexthops); k++) {
- unsigned conn_id = numberSet_GetItem(available_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, priority_nexthops,
+ out = fibEntry->fwdStrategy->lookupNexthop(fibEntry->fwdStrategy, available_nexthops,
interestMessage);
} else {
- unsigned nexthop = numberSet_GetItem(priority_nexthops, 0);
+ unsigned nexthop = numberSet_GetItem(available_nexthops, 0);
out = numberSet_Create();
numberSet_Add(out, nexthop);
}
-
- numberSet_Release(&priority_nexthops);
}
numberSet_Release(&available_nexthops);