diff options
author | Jordan Augé <jordan.auge+fdio@cisco.com> | 2019-12-10 23:57:37 +0100 |
---|---|---|
committer | Jordan Augé <jordan.auge+fdio@cisco.com> | 2019-12-10 23:59:48 +0100 |
commit | 2f8f60f943b71e1caab14856c6a03c81e5ba6c9c (patch) | |
tree | bfe69da25a7b8b27f67d4206e5ba17a2fb4a1497 | |
parent | a40a23b0d7fc5ebecbb97a5213646add5eeadc5b (diff) |
[HICN-438] facemgr should allow face creation with physical interface down
Change-Id: I6487fbec0607464a625daa01455ddac8fdd75ee2
Signed-off-by: Jordan Augé <jordan.auge+fdio@cisco.com>
-rw-r--r-- | ctrl/facemgr/includes/hicn/facemgr/facelet.h | 2 | ||||
-rw-r--r-- | ctrl/facemgr/src/api.c | 75 | ||||
-rw-r--r-- | ctrl/facemgr/src/facelet.c | 25 | ||||
-rw-r--r-- | ctrl/facemgr/src/interfaces/hicn_light/hicn_light.c | 4 | ||||
-rw-r--r-- | lib/includes/hicn/util/set.h | 28 |
5 files changed, 91 insertions, 43 deletions
diff --git a/ctrl/facemgr/includes/hicn/facemgr/facelet.h b/ctrl/facemgr/includes/hicn/facemgr/facelet.h index a963c50a7..cfdc5540e 100644 --- a/ctrl/facemgr/includes/hicn/facemgr/facelet.h +++ b/ctrl/facemgr/includes/hicn/facemgr/facelet.h @@ -226,6 +226,7 @@ facelet_t * facelet_create(); facelet_t * facelet_create_from_netdevice(netdevice_t * netdevice); +unsigned facelet_get_id(facelet_t * facelet); void facelet_set_id(facelet_t * facelet, unsigned id); int facelet_validate_face(const facelet_t * facelet); @@ -288,6 +289,7 @@ void facelet_set_event(facelet_t * facelet, facelet_event_t event); int facelet_add_route(facelet_t * facelet, hicn_route_t * route); int facelet_remove_route(facelet_t * facelet, hicn_route_t * route, hicn_route_t ** route_removed); +int facelet_clear_routes(facelet_t * facelet); int facelet_get_route_array(const facelet_t * facelet, hicn_route_t *** route_array); int facelet_snprintf(char * buf, size_t size, const facelet_t * facelet); diff --git a/ctrl/facemgr/src/api.c b/ctrl/facemgr/src/api.c index 7fbabbe72..ac436a433 100644 --- a/ctrl/facemgr/src/api.c +++ b/ctrl/facemgr/src/api.c @@ -1088,27 +1088,33 @@ facemgr_process_facelet(facemgr_t * facemgr, facelet_t * facelet) goto ERR; } + /* Facelets created from static get deleted */ #if 0 - if (facelet_set_remove(facemgr->facelet_cache, facelet, NULL) < 0) { - ERROR("[facemgr_process_facelet] Could not remove deleted facelet from cache"); - goto ERR; - } - facelet_free(facelet); -#else - /* This works assuming the call to hicn-light is blocking */ - DEBUG("[facemgr_process_facelet] Cleaning cached data"); - facelet_unset_local_addr(facelet); - facelet_unset_local_port(facelet); - facelet_unset_remote_addr(facelet); - facelet_unset_remote_port(facelet); - facelet_unset_admin_state(facelet); - facelet_unset_state(facelet); - facelet_unset_bj_done(facelet); + if (facelet_get_id(facelet) > 0) { + if (facelet_set_remove(facemgr->facelet_cache, facelet, NULL) < 0) { + ERROR("[facemgr_process_facelet] Could not remove deleted facelet from cache"); + return -1; + } + facelet_free(facelet); + } else { +#endif + /* This works assuming the call to hicn-light is blocking */ + DEBUG("[facemgr_process_facelet] Cleaning cached data"); + facelet_unset_local_addr(facelet); + facelet_unset_local_port(facelet); + facelet_unset_remote_addr(facelet); + facelet_unset_remote_port(facelet); + facelet_unset_admin_state(facelet); + facelet_unset_state(facelet); + facelet_unset_bj_done(facelet); + facelet_clear_routes(facelet); #ifdef WITH_ANDROID_UTILITY - facelet_unset_au_done(facelet); + facelet_unset_au_done(facelet); #endif /* WITH_ANDROID_UTILITY */ - facelet_set_status(facelet, FACELET_STATUS_DELETED); + facelet_set_status(facelet, FACELET_STATUS_DELETED); +#if 0 + } #endif break; @@ -1323,6 +1329,8 @@ facemgr_consider_static_facelet(facemgr_t * facemgr, facelet_t * facelet) if (facelet_found) return 0; + facelet_set_id(static_facelet, ++facemgr->cur_static_id); + if (facelet_array_add(facemgr->static_facelets, static_facelet) < 0) { ERROR("[facemgr_consider_static_facelet] Could not add facelet to static array"); facelet_free(static_facelet); @@ -1494,9 +1502,34 @@ facemgr_process_facelet_delete(facemgr_t * facemgr, facelet_t * facelet) case FACELET_STATUS_IGNORED: case FACELET_STATUS_DOWN: case FACELET_STATUS_CREATE: - /* Face has not been created */ - facelet_unset_error(facelet); - facelet_set_status(facelet, FACELET_STATUS_DELETED); +#if 0 + /* Facelets created from static get deleted */ + if (facelet_get_id(facelet) > 0) { + if (facelet_set_remove(facemgr->facelet_cache, facelet, NULL) < 0) { + ERROR("[facemgr_process_facelet] Could not remove deleted facelet from cache"); + return -1; + } + facelet_free(facelet); + } else { +#endif + /* Face has not been created */ + DEBUG("[facemgr_process_facelet] Cleaning cached data"); + facelet_unset_local_addr(facelet); + facelet_unset_local_port(facelet); + facelet_unset_remote_addr(facelet); + facelet_unset_remote_port(facelet); + facelet_unset_admin_state(facelet); + facelet_unset_state(facelet); + facelet_unset_bj_done(facelet); + facelet_clear_routes(facelet); +#ifdef WITH_ANDROID_UTILITY + facelet_unset_au_done(facelet); +#endif /* WITH_ANDROID_UTILITY */ + facelet_unset_error(facelet); + facelet_set_status(facelet, FACELET_STATUS_DELETED); +#if 0 + } +#endif break; case FACELET_STATUS_UPDATE: @@ -1590,8 +1623,8 @@ facemgr_process_facelet_create_no_family(facemgr_t * facemgr, facelet_t * facele facelet_free(facelet_new); continue; } + facelet_set_id(facelet_new, facelet_get_id(static_facelet)); /* The id must be different than 0 */ - facelet_set_id(facelet_new, ++facemgr->cur_static_id); facelet_set_attr_clean(facelet_new); facelet_set_status(facelet, FACELET_STATUS_UNDEFINED); diff --git a/ctrl/facemgr/src/facelet.c b/ctrl/facemgr/src/facelet.c index cce7fe611..ac84f5f70 100644 --- a/ctrl/facemgr/src/facelet.c +++ b/ctrl/facemgr/src/facelet.c @@ -149,6 +149,12 @@ ERR_MALLOC: return NULL; } +unsigned +facelet_get_id(facelet_t * facelet) +{ + return facelet->id; +} + void facelet_set_id(facelet_t * facelet, unsigned id) { @@ -378,18 +384,7 @@ void facelet_free(facelet_t * facelet) { /* Free up routes */ - hicn_route_t ** route_array; - int n = route_set_get_array(facelet->routes, &route_array); - if (n < 0) { - ERROR("[facelet_free] Error getting route set associated to facelet"); - } else { - for (unsigned i = 0; i < n; i++) { - hicn_route_t * route = route_array[i]; - route_set_remove(facelet->routes, route, NULL); - hicn_route_free(route); - } - } - free(route_array); + route_set_clear(facelet->routes); route_set_free(facelet->routes); free(facelet); } @@ -1012,6 +1007,12 @@ facelet_remove_route(facelet_t * facelet, hicn_route_t * route, hicn_route_t ** } int +facelet_clear_routes(facelet_t * facelet) +{ + return route_set_clear(facelet->routes); +} + +int facelet_get_route_array(const facelet_t * facelet, hicn_route_t *** route_array) { return route_set_get_array(facelet->routes, route_array); diff --git a/ctrl/facemgr/src/interfaces/hicn_light/hicn_light.c b/ctrl/facemgr/src/interfaces/hicn_light/hicn_light.c index 71243aea1..b4e1f0695 100644 --- a/ctrl/facemgr/src/interfaces/hicn_light/hicn_light.c +++ b/ctrl/facemgr/src/interfaces/hicn_light/hicn_light.c @@ -108,6 +108,10 @@ int hl_process_state(interface_t * interface) case HL_STATE_ROUTES_SENT: case HL_STATE_FACES_SENT: + INFO("[hl_process_state] Out of sync... resetting state"); + data->state = HL_STATE_IDLE; + break; + case HL_STATE_UNDEFINED: case HL_STATE_N: ERROR("[hl_process_state] Unexpected state"); diff --git a/lib/includes/hicn/util/set.h b/lib/includes/hicn/util/set.h index c7dd7bf09..b4673a673 100644 --- a/lib/includes/hicn/util/set.h +++ b/lib/includes/hicn/util/set.h @@ -77,6 +77,8 @@ int NAME ## _add(NAME ## _t * set, const T element); \ \ int NAME ## _remove(NAME ## _t * set, const T search, T * element); \ \ +int NAME ## _clear(NAME ## _t * set); \ + \ int NAME ## _get(const NAME ## _t * set, const T search, T * element); \ \ int NAME ## _get_array(const NAME ## _t * set, T ** element); \ @@ -98,16 +100,7 @@ NAME ## _initialize(NAME ## _t * set) \ int \ NAME ## _finalize(NAME ## _t * set) \ { \ - T * array; \ - int n = NAME ## _get_array(set, &array); \ - if (n < 0) \ - return -1; \ - for (unsigned i = 0; i < n; i++) { \ - T element = array[i]; \ - NAME ## _remove(set, element, NULL); \ - } \ - free(array); \ - return 0; \ + return NAME ## _clear(set); \ } \ \ NAME ## _t * \ @@ -161,6 +154,21 @@ NAME ## _remove(NAME ## _t * set, const T search, T * element) \ } \ \ int \ +NAME ## _clear(NAME ## _t * set) \ +{ \ + T * array; \ + int n = NAME ## _get_array(set, &array); \ + if (n < 0) \ + return -1; \ + for (unsigned i = 0; i < n; i++) { \ + T element = array[i]; \ + NAME ## _remove(set, element, NULL); \ + } \ + free(array); \ + return 0; \ +} \ + \ +int \ NAME ## _get(const NAME ## _t * set, const T search, T * element) \ { \ T * found = tfind(search, &set->root, (cmp_t)CMP); \ |