diff options
Diffstat (limited to 'ctrl/facemgr/src/interfaces')
4 files changed, 211 insertions, 14 deletions
diff --git a/ctrl/facemgr/src/interfaces/android_utility/android_utility.c b/ctrl/facemgr/src/interfaces/android_utility/android_utility.c index 55468baf8..d8e20659a 100644 --- a/ctrl/facemgr/src/interfaces/android_utility/android_utility.c +++ b/ctrl/facemgr/src/interfaces/android_utility/android_utility.c @@ -20,15 +20,15 @@ #include <assert.h> -#include <hicn/face.h> #include <hicn/facemgr.h> +#include <hicn/ctrl/face.h> #include <hicn/util/log.h> #include "../../common.h" #include "../../interface.h" #include "android_utility.h" -#define FACEMGR_ANDROID_UTILITY_CLASS "com/cisco/hicn/forwarder/supportlibrary/AndroidUtility" +#define FACEMGR_UTILITY_CLASS "com/cisco/hicn/facemgrlibrary/supportlibrary/FacemgrUtility" #define AU_INTERFACE_TYPE_UNDEFINED 0 @@ -89,7 +89,7 @@ int au_on_event(interface_t * interface, facelet_t * facelet) JNIEnv *env; JavaVM *jvm = data->cfg.jvm; (*jvm)->AttachCurrentThread(jvm, &env, NULL); - jclass cls = (*env)->FindClass(env, FACEMGR_ANDROID_UTILITY_CLASS); + jclass cls = (*env)->FindClass(env, FACEMGR_UTILITY_CLASS); jmethodID getNetworkType = (*env)->GetStaticMethodID(env, cls, "getNetworkType", "(Ljava/lang/String;)I"); jint interface_type = (*env)->CallStaticIntMethod(env, cls, getNetworkType, diff --git a/ctrl/facemgr/src/interfaces/hicn_light/hicn_light.c b/ctrl/facemgr/src/interfaces/hicn_light/hicn_light.c index 508c0713b..8d3e18cdb 100644 --- a/ctrl/facemgr/src/interfaces/hicn_light/hicn_light.c +++ b/ctrl/facemgr/src/interfaces/hicn_light/hicn_light.c @@ -327,13 +327,12 @@ int hl_on_event(interface_t * interface, facelet_t * facelet) switch(facelet_get_event(facelet)) { case FACELET_EVENT_CREATE: - - /* Create face */ { + /* Create face */ char buf[MAXSZ_FACELET]; facelet_snprintf(buf, MAXSZ_FACELET, facelet); DEBUG("Create facelet %s", buf); - } + hc_face.face = *face; rc = hc_face_create(data->s, &hc_face); if (rc < 0) { @@ -341,7 +340,8 @@ int hl_on_event(interface_t * interface, facelet_t * facelet) ret = -FACELET_ERROR_REASON_UNSPECIFIED_ERROR; goto ERR; } - INFO("Created face id=%d", hc_face.id); + INFO("Created face id=%d - %s", hc_face.id, buf); + } hicn_route_t ** route_array; int n = facelet_get_route_array(facelet, &route_array); @@ -413,7 +413,6 @@ int hl_on_event(interface_t * interface, facelet_t * facelet) case FACELET_EVENT_DELETE: /* Removing a face should also remove associated routes */ - /* Create face */ hc_face.face = *face; rc = hc_face_delete(data->s, &hc_face); if (rc < 0) { @@ -421,6 +420,11 @@ int hl_on_event(interface_t * interface, facelet_t * facelet) ret = -FACELET_ERROR_REASON_UNSPECIFIED_ERROR; goto ERR; } + + char buf[MAXSZ_FACELET]; + facelet_snprintf(buf, MAXSZ_FACELET, facelet); + INFO("Deleted face id=%d", hc_face.id); + break; case FACELET_EVENT_UPDATE: @@ -457,7 +461,8 @@ int hl_on_event(interface_t * interface, facelet_t * facelet) goto ERR; } facelet_set_admin_state_status(facelet, FACELET_ATTR_STATUS_CLEAN); - INFO("Admin state updated"); + INFO("Updated face id=%d - admin_state=%s", hc_face.id, + face_state_str(admin_state)); } #ifdef WITH_POLICY if (facelet_get_netdevice_type_status(facelet) == FACELET_ATTR_STATUS_DIRTY) { @@ -517,7 +522,8 @@ int hl_on_event(interface_t * interface, facelet_t * facelet) goto ERR; } facelet_set_netdevice_type_status(facelet, FACELET_ATTR_STATUS_CLEAN); - INFO("Tags updated"); + INFO("Updated face id=%d - netdevice_type=%s", hc_face.id, + netdevice_type_str(netdevice_type)); } if (facelet_get_priority_status(facelet) == FACELET_ATTR_STATUS_DIRTY) { INFO("Updating priority..."); @@ -549,7 +555,8 @@ int hl_on_event(interface_t * interface, facelet_t * facelet) goto ERR; } facelet_set_priority_status(facelet, FACELET_ATTR_STATUS_CLEAN); - INFO("Priority updated"); + + INFO("Updated face id=%d - priority=%d", hc_face.id, priority); } #endif /* WITH_POLICY */ break; @@ -642,6 +649,11 @@ int hl_callback(interface_t * interface, int fd, void * unused) /* We can ignore faces on localhost */ facelet_t * facelet = facelet_create_from_face(&f->face); + if (!facelet) { + ERROR("[hl_callback] Could not create facelet... skipping"); + continue; + } + foreach_route(r, data->polled_routes) { if (r->face_id != f->id) continue; diff --git a/ctrl/facemgr/src/interfaces/priority_controller/priority_controller.c b/ctrl/facemgr/src/interfaces/priority_controller/priority_controller.c index 76538185f..67edc5e39 100644 --- a/ctrl/facemgr/src/interfaces/priority_controller/priority_controller.c +++ b/ctrl/facemgr/src/interfaces/priority_controller/priority_controller.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 Cisco and/or its affiliates. + * Copyright (c) 2017-2020 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: @@ -27,19 +27,110 @@ #include <hicn/facemgr.h> +#include "priority_controller.h" #include "../../common.h" #include "../../interface.h" #define PC_DEFAULT_PORT 9533 typedef struct { + priority_controller_cfg_t cfg; int fd; +#ifdef PRIORITY_CONTROLLER_INTERNAL + unsigned state; + JNIEnv * env; + jclass cls; + jmethodID mid; +#endif /* PRIORITY_CONTROLLER_INTERNAL */ } pc_data_t; +#ifdef PRIORITY_CONTROLLER_INTERNAL +#include <jni.h> + +#define ERR_STR_JAVA "Java VM parameters are required in the interface configuration." + +#define PREFER_CELLULAR 0 +#define PREFER_WIFI 1 +#define PREFER_BOTH 2 + +#define INTERVAL_MS 500 + +const char * prefer_str[] = { "Cellular", "WiFi", "both" }; + +jclass find_class_global(JNIEnv* env, const char *name){ + jclass c = (*env)->FindClass(env, name); + jclass c_global = 0; + if (c){ + c_global = (jclass)(*env)->NewGlobalRef(env, c); + (*env)->DeleteLocalRef(env, c); + } + return c_global; +} + + +int priority_controller_tick(interface_t * interface, int fd, void * unused) +{ + pc_data_t * data = (pc_data_t*)interface->data; + unsigned new_state = PREFER_BOTH; + + jint rssi = (*data->env)->CallStaticIntMethod(data->env, data->cls, data->mid); + DEBUG("[priority_controller_tick] rssi=%d\n", rssi); + if (rssi > -67) { + new_state = PREFER_WIFI; + +#if 0 + } else if ((rssi < -67) && (rssi > -70)) { + new_state = PREFER_BOTH; +#endif + + } else { /* rssi < -70 */ + new_state = PREFER_CELLULAR; + } + + if (new_state == data->state) + return 0; + + ERROR("[priority_controller_tick] Setting priority to %s", prefer_str[new_state]); + + /* XXX Factor this */ + + facelet_t * facelet_w = facelet_create(); + facelet_t * facelet_c = facelet_create(); + facelet_set_netdevice_type(facelet_w, NETDEVICE_TYPE_WIFI); + facelet_set_netdevice_type(facelet_c, NETDEVICE_TYPE_CELLULAR); + facelet_set_attr_clean(facelet_w); + facelet_set_attr_clean(facelet_c); + + switch(new_state) { + case PREFER_CELLULAR: + facelet_set_priority(facelet_w, 0); + facelet_set_priority(facelet_c, 10); + break; + case PREFER_WIFI: + facelet_set_priority(facelet_w, 10); + facelet_set_priority(facelet_c, 0); + break; + case PREFER_BOTH: + facelet_set_priority(facelet_w, 0); + facelet_set_priority(facelet_c, 0); + break; + } + + facelet_set_event(facelet_w, FACELET_EVENT_UPDATE); + facelet_set_event(facelet_c, FACELET_EVENT_UPDATE); + + interface_raise_event(interface, facelet_w); + interface_raise_event(interface, facelet_c); + + data->state = new_state; + + return 0; +} +#endif /* PRIORITY_CONTROLLER_INTERNAL */ + int priority_controller_initialize(interface_t * interface, void * cfg) { INFO("Initializing priority controller"); - struct sockaddr_in addr; pc_data_t * data = malloc(sizeof(pc_data_t)); if (!data) { @@ -49,6 +140,33 @@ int priority_controller_initialize(interface_t * interface, void * cfg) interface->data = data; + data->cfg = * (priority_controller_cfg_t *) cfg; + +#ifdef PRIORITY_CONTROLLER_INTERNAL + + if (!cfg) { + ERROR(ERR_STR_JAVA); + goto ERR_CFG; + } + + /* Retrieve RSSI information from SDK through AndroidUtility class */ + (*data->cfg.jvm)->AttachCurrentThread(data->cfg.jvm, &data->env, NULL); + data->cls = find_class_global(data->env, FACEMGR_ANDROID_UTILITY_CLASS); + if (data->cls == 0) + goto ERR_JAVA; + data->mid = (*data->env)->GetStaticMethodID(data->env, data->cls, "getWifiRSSI", "()I"); + + data->fd = interface_register_timer(interface, INTERVAL_MS, + priority_controller_tick, interface); + if (data->fd < 0) { + ERROR("[priority_controller_initialize] Could not initialize timer"); + goto ERR_FD; + } + data->state = PREFER_BOTH; + +#else /* PRIORITY_CONTROLLER_INTERNAL */ + struct sockaddr_in addr; + data->fd = socket(AF_INET, SOCK_DGRAM, 0); //data->fd = socket(AF_INET, SOCK_STREAM, 0); if (data->fd < 0) { @@ -67,18 +185,28 @@ int priority_controller_initialize(interface_t * interface, void * cfg) perror("bind error"); goto ERR_BIND; } + + DEBUG("[priority_controller_initialize] register fd"); if (interface_register_fd(interface, data->fd, NULL) < 0) { ERROR("[priority_controller_initialize] Error registering fd"); goto ERR_FD; } +#endif /* PRIORITY_CONTROLLER_INTERNAL */ + INFO("Priority controller successfully initialized"); return 0; +#ifdef PRIORITY_CONTROLLER_INTERNAL +ERR_CFG: +ERR_JAVA: +#endif /* PRIORITY_CONTROLLER_INTERNAL */ ERR_FD: +#ifndef PRIORITY_CONTROLLER_INTERNAL ERR_BIND: close(data->fd); ERR_SOCKET: +#endif /* ! PRIORITY_CONTROLLER_INTERNAL */ free(data); ERR_MALLOC: return -1; @@ -88,12 +216,21 @@ int priority_controller_finalize(interface_t * interface) { pc_data_t * data = (pc_data_t*)interface->data; - if (data->fd > 0) {close(data->fd);} +#ifdef PRIORITY_CONTROLLER_INTERNAL + DEBUG("[priority_controller_finalize] unregister timer"); + interface_unregister_timer(interface, data->fd); +#else + if (data->fd > 0) { + interface_unregister_fd(interface, data->fd); + close(data->fd); + } free(data); +#endif /* PRIORITY_CONTROLLER_INTERNAL */ return 0; } +#ifndef PRIORITY_CONTROLLER_INTERNAL int priority_controller_callback(interface_t * interface, int fd, void * unused) { pc_data_t * data = (pc_data_t*)interface->data; @@ -148,10 +285,13 @@ int priority_controller_callback(interface_t * interface, int fd, void * unused) return 0; } +#endif /* ! PRIORITY_CONTROLLER_INTERNAL */ interface_ops_t priority_controller_ops = { .type = "priority_controller", .initialize = priority_controller_initialize, .finalize = priority_controller_finalize, +#ifndef PRIORITY_CONTROLLER_INTERNAL .callback = priority_controller_callback, +#endif /* ! PRIORITY_CONTROLLER_INTERNAL */ }; diff --git a/ctrl/facemgr/src/interfaces/priority_controller/priority_controller.h b/ctrl/facemgr/src/interfaces/priority_controller/priority_controller.h new file mode 100644 index 000000000..247fc3c57 --- /dev/null +++ b/ctrl/facemgr/src/interfaces/priority_controller/priority_controller.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2017-2020 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * \file priority_controller.h + * \brief Priority Controller interface + */ + +#ifndef FACEMGR_INTERFACE_PRIORITY_CONTROLLER +#define FACEMGR_INTERFACE_PRIORITY_CONTROLLER + +#define FACEMGR_UTILITY_CLASS "com/cisco/hicn/facemgrlibrary/supportlibrary/FacemgrUtility" + +/* + * Uncomment this line to use a Priority controller interface internal to the + * face manager (only available in Android). + */ +// #define PRIORITY_CONTROLLER_INTERNAL + +#ifdef __ANDROID__ +#include <jni.h> +#endif /* __ANDROID__ */ + +typedef struct { +#ifdef __ANDROID__ +#ifdef PRIORITY_CONTROLLER_INTERNAL + JavaVM * jvm; +#endif /* PRIORITY_CONTROLLER_INTERNAL */ +#endif /* __ANDROID__ */ +} priority_controller_cfg_t; + + +#endif /* FACEMGR_INTERFACE_PRIORITY_CONTROLLER */ |