diff --git a/src/Makefile b/src/Makefile index dc001c4fc8868681db04b8db9443cc126a69e633..ff679580e50aefd39f53d11b42c52d259b2fd8a5 100644 --- a/src/Makefile +++ b/src/Makefile @@ -28,8 +28,7 @@ AGENT_OBJS = \ LIBS = -lubus -lubox -ljson-c -lblobmsg_json -luci -lwifi-6 -leasy -pthread LIBS += -I/usr/include/libnl3 -lnl-3 -lnl-route-3 LIBS += -rdynamic -ldl -LIBS += -lmaputils -LIBS += -lwsc +LIBS += -li1905 -lmaputil plugin_subdirs ?= $(wildcard plugins/*) plugin_sofile = $(wildcard $(d)/*.so) diff --git a/src/core/agent.c b/src/core/agent.c index 8091f0713db9a456572d9485413a8ac3c325b281..9b42537bb375ac2679a6289dce37a8e861eb033d 100644 --- a/src/core/agent.c +++ b/src/core/agent.c @@ -32,18 +32,19 @@ #include <pthread.h> -#include <map1905/map2.h> -#include <map1905/maputils.h> +#include <timer_impl.h> +#include <cmdu.h> +#include <1905_tlvs.h> #include <easy/easy.h> #include <wifi.h> -#include <wsc.h> +#include <i1905_wsc.h> #include <uci.h> - +#include <map_module22.h> #include "utils/utils.h" -#include "map_module.h" +//#include "map_module.h" #include "utils.h" #include "debug.h" #include "liblist.h" @@ -1272,7 +1273,7 @@ static int wifi_send_sta_report(struct agent *a, const char *vif, uint8_t *macaddr, uint32_t status, uint8_t *bssid) { uint8_t src_bssid[6] = { 0 }; - char ifname[IFNAMESIZE] = {0}; + char ifname[16] = {0}; uint8_t origin[6] = { 0 }; uint8_t ret = 0; struct netif_fh *ifptr; @@ -1434,11 +1435,11 @@ static int wifi_del_sta(struct agent *a, const char *vif, return -2; } -int wifi_topology_notification (struct agent *agent, uint8_t *mac, char *ifname, uint8_t assoc_event) +int wifi_topology_notification(struct agent *agent, uint8_t *mac, char *ifname, uint8_t assoc_event) { trace("%s: --->\n", __func__); struct agent *a = (struct agent *) agent; - struct cmdu_cstruct *cmdu; + struct cmdu_buff *cmdu; struct netif_fh *fh; fh = get_netif_by_name(a, ifname); if (!fh) @@ -1451,18 +1452,18 @@ int wifi_topology_notification (struct agent *agent, uint8_t *mac, char *ifname, // Send cmdu agent_send_cmdu(a, cmdu); - map_free_cmdu(cmdu); + cmdu_free(cmdu); if (!assoc_event) { cmdu = agent_gen_client_disassoc(a, mac, fh->bssid); if (!cmdu) goto error; agent_send_cmdu(a, cmdu); - map_free_cmdu(cmdu); + cmdu_free(cmdu); } return 0; error: - map_free_cmdu(cmdu); + cmdu_free(cmdu); return -1; } @@ -2147,13 +2148,13 @@ static void agent_schedule_cntlr_start(struct agent *a, int secs) static void agent_trigger_vendor_specific(struct uloop_timeout *t) { struct agent *a = container_of(t, struct agent, loop_detection_dispatcher); - struct cmdu_cstruct *cmdu; + struct cmdu_buff *cmdu; uint8_t origin[6] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x13}; cmdu = agent_gen_vendor_specific_cmdu(a, origin, a->depth); if (cmdu) { a->loop_detection.tx_mid = agent_send_cmdu(a, cmdu); - map_free_cmdu(cmdu); + cmdu_free(cmdu); } } @@ -2198,7 +2199,7 @@ static void wifi_bsta_event_handler(void *agent, struct blob_attr *msg) struct netif_bk *bk; struct tlv_backhaul_steer_resp *p; uint8_t bssid[6] = {0}; - struct cmdu_cstruct *cmdu; + struct cmdu_buff *cmdu; bool add, del; blobmsg_parse(ev_attr, 3, tb, blob_data(msg), blob_len(msg)); @@ -2272,50 +2273,50 @@ static void wifi_bsta_event_handler(void *agent, struct blob_attr *msg) wifi_mod_bridge(a, ifname, "remove"); } - cmdu = bk->bsta_steer.cmdu; - if (!cmdu) - goto fail_cmdu; - - p = (struct tlv_backhaul_steer_resp *) extract_tlv_by_type(cmdu, - MAP_TLV_BACKHAUL_STEERING_RESPONSE); - if (!p) - goto fail_cmdu; - - /** - * if event bssid and tlv target bssid differ, that means steering - * failed, add an error TLV prior to sending response - */ - //TODO: move to if(add)? - if (memcmp(bssid, p->bssid, 6)) { - struct tlv_error_code *p1; - uint8_t **tlvs; - - p->res_code = 0x01; - p1 = (struct tlv_error_code *) calloc(1, - sizeof(struct tlv_error_code)); - if (!p1) - goto fail_cmdu; - - p1->tlv_type = MAP_TLV_ERROR_CODE; - p1->reason_code = 0x05; - - cmdu->num_tlvs++; - - tlvs = (uint8_t **)realloc(cmdu->tlvs, - cmdu->num_tlvs * sizeof(uint8_t *)); - if (!tlvs) { - free(p1); - goto fail_cmdu; - } - cmdu->tlvs = tlvs; - cmdu->tlvs[cmdu->num_tlvs - 1] = (uint8_t *) p1; - } - - uloop_timeout_cancel(&bk->connect_timer); - agent_send_cmdu(a, cmdu); -fail_cmdu: - map_free_cmdu(cmdu); - bk->bsta_steer.cmdu = NULL; +// cmdu = bk->bsta_steer.cmdu; +// if (!cmdu) +// goto fail_cmdu; +// +// p = (struct tlv_backhaul_steer_resp *) extract_tlv_by_type(cmdu, +// MAP_TLV_BACKHAUL_STEERING_RESPONSE); +// if (!p) +// goto fail_cmdu; +// +// /** +// * if event bssid and tlv target bssid differ, that means steering +// * failed, add an error TLV prior to sending response +// */ +// //TODO: move to if(add)? +// if (memcmp(bssid, p->bssid, 6)) { +// struct tlv_error_code *p1; +// uint8_t **tlvs; +// +// p->res_code = 0x01; +// p1 = (struct tlv_error_code *) calloc(1, +// sizeof(struct tlv_error_code)); +// if (!p1) +// goto fail_cmdu; +// +// p1->tlv_type = MAP_TLV_ERROR_CODE; +// p1->reason_code = 0x05; +// +// cmdu->num_tlvs++; +// +// tlvs = (uint8_t **)realloc(cmdu->tlvs, +// cmdu->num_tlvs * sizeof(uint8_t *)); +// if (!tlvs) { +// free(p1); +// goto fail_cmdu; +// } +// cmdu->tlvs = tlvs; +// cmdu->tlvs[cmdu->num_tlvs - 1] = (uint8_t *) p1; +// } +// +// uloop_timeout_cancel(&bk->connect_timer); +// agent_send_cmdu(a, cmdu); +//fail_cmdu: +// map_free_cmdu(cmdu); +// bk->bsta_steer.cmdu = NULL; } static void wifi_wps_creds_event_handler(void *c, struct blob_attr *msg) @@ -2416,43 +2417,44 @@ static void ubus_wifi_event_handler(struct ubus_context *ctx, static void ieee1905_cmdu_event_handler(void *c, struct blob_attr *msg) { struct agent *a = (struct agent *)c; - //uint8_t tlvlist[MAX_TLV_BUF] = { 0 }; char *tlvstr = NULL; uint8_t *tlv = NULL; char in_ifname[16] = {0}; - //struct blob_attr *attr; char src[18] = { 0 }; uint8_t srcmac[6]; - //int pos = 0; int len = 0; uint16_t type; uint16_t mid = 0; struct blob_attr *tb[5]; - static const struct blobmsg_policy cmdu_attrs[5] = { - [0] = { .name = "type", .type = BLOBMSG_TYPE_INT32 }, - [1] = { .name = "mid", .type = BLOBMSG_TYPE_INT32 }, - [2] = { .name = "ingress", .type = BLOBMSG_TYPE_STRING }, + char *data_str; + int data_strlen; + uint8_t *data; + int data_len; + + + static const struct blobmsg_policy unish_cmdu_attrs[5] = { + [0] = { .name = "type", .type = BLOBMSG_TYPE_INT16 }, + [1] = { .name = "mid", .type = BLOBMSG_TYPE_INT16 }, + [2] = { .name = "ifname", .type = BLOBMSG_TYPE_STRING }, [3] = { .name = "source", .type = BLOBMSG_TYPE_STRING }, - // TODO, what if tlvs is an array? - [4] = { .name = "tlvs", .type = BLOBMSG_TYPE_STRING }, + [4] = { .name = "cmdu", .type = BLOBMSG_TYPE_STRING }, }; + blobmsg_parse(unish_cmdu_attrs, 5, tb, blob_data(msg), blob_len(msg)); trace("%s: --->\n", __func__); - blobmsg_parse(cmdu_attrs, 5, tb, blob_data(msg), blob_len(msg)); - if (!tb[0] || !tb[1]) return; if (tb[0]) { - type = (uint16_t)blobmsg_get_u32(tb[0]); + type = (uint16_t)blobmsg_get_u16(tb[0]); if (type < 0 || !is_cmdu_for_us(a, type)) return; } if (tb[1]) - mid = (uint16_t)blobmsg_get_u32(tb[1]); + mid = (uint16_t)blobmsg_get_u16(tb[1]); if (tb[2]) strncpy(in_ifname, blobmsg_data(tb[2]), 15); @@ -2463,12 +2465,12 @@ static void ieee1905_cmdu_event_handler(void *c, struct blob_attr *msg) } if (tb[4]) { - len = blobmsg_data_len(tb[4]); + len = blobmsg_data_len(tb[4]) - 16; tlvstr = calloc(len + 1, sizeof(char)); if (!tlvstr) return; - strncpy(tlvstr, blobmsg_data(tb[4]), len); + strncpy(tlvstr, blobmsg_data(tb[4]) + 16, len); len = (len - 1) / 2; tlv = calloc(len, sizeof(uint8_t)); if (!tlv) { @@ -2479,68 +2481,13 @@ static void ieee1905_cmdu_event_handler(void *c, struct blob_attr *msg) strtob(tlvstr, len, tlv); free(tlvstr); - } -#if 0 - if (tb[4]) { - int rem; - int len; - - blobmsg_for_each_attr(attr, tb[4], rem) { - char tlvstr[513] = { 0 }; /* FIXME: size */ - uint8_t tlv[256] = { 0 }; - - if (blobmsg_type(attr) != BLOBMSG_TYPE_STRING) - continue; - - len = blobmsg_data_len(attr); - memcpy(tlvstr, blobmsg_data(attr), len); - - len = (len - 1) / 2; - if (pos + len > MAX_TLV_BUF) - break; - - strtob(tlvstr, len, tlv); - memcpy(&tlvlist[pos], tlv, len); - pos += len; - } } -#endif agent_handle_map_event(a, type, mid, in_ifname, srcmac, tlv, len); free(tlv); } -static void ubus_1905_event_handler(struct ubus_context *ctx, - struct ubus_event_handler *ev, - const char *type, - struct blob_attr *msg) -{ - int i; - char *str; - struct agent *a = container_of(ev, struct agent, ieee1905_evh); - struct wifi_ev_handler { - const char *ev_type; - void (*handler)(void *ctx, struct blob_attr *ev_data); - } evs[] = { {"ieee1905.cmdu", ieee1905_cmdu_event_handler} }; - - str = blobmsg_format_json(msg, true); - if (!str) - return; - - info("[ &agent = %p ] Received [event = %s] [val = %s]\n", - a, type, str); - - for (i = 0; i < ARRAY_SIZE(evs); i++) { - if (!strcmp(type, evs[i].ev_type)) { - evs[i].handler(a, msg); - break; - } - } - - free(str); -} - static int delete_neighbor_entry(struct netif_fh *vif, unsigned char *macaddr, bool cntlr_cmd) { @@ -2889,7 +2836,6 @@ static int run_agent(struct agent *a) struct netif_fh *fh; int i = 0; - fprintf(stderr, "%s: %d\n", __func__, __LINE__); return 0; // TODO: remove if (a->cfg.runfreq == AGENT_RUN_OFF) return 0; @@ -3892,7 +3838,7 @@ static void agent_steering_opp_timeout(struct uloop_timeout *t) trace("agent: %s: --->\n", __func__); struct agent *a = container_of(t, struct agent, sta_steer_req_timer); uint8_t src_bssid[6] = { 0 }; - char ifname[IFNAMESIZE] = { 0 }; + char ifname[16] = { 0 }; uint8_t origin[6] = { 0 }; strncpy(ifname, a->cfg.al_bridge, sizeof(ifname)); @@ -4001,6 +3947,8 @@ static void agent_dispatch_autoconfig(struct uloop_timeout *t) int i; trace("|%s:%d| Triggering AP-Autoconfig Search\n", __func__, __LINE__); + //trace("NOT SENDING AUTOCONFIG SEARCH!\n"); + //return; agent_ensure_controller_running(a); @@ -4031,7 +3979,7 @@ static void agent_dispatch_autoconfig(struct uloop_timeout *t) } for (i = 0; i < a->num_radios; i++) { - struct cmdu_cstruct *cmdu; + struct cmdu_buff *cmdu; struct wifi_radio_element *radio = &a->radios[i]; int mid; @@ -4042,6 +3990,7 @@ static void agent_dispatch_autoconfig(struct uloop_timeout *t) continue; } #endif +#if 0 cmdu = agent_gen_ap_autoconfig_search(a, radio, NULL, 0x02); if (!cmdu) continue; @@ -4053,6 +4002,15 @@ static void agent_dispatch_autoconfig(struct uloop_timeout *t) if (mid >= 0) radio->mid = mid; map_free_cmdu(cmdu); +#endif + cmdu = agent_gen_ap_autoconfig_search(a, radio, NULL, 0x02); + if (!cmdu) + continue; + + radio->mid = agent_send_cmdu(a, cmdu); + + cmdu_free(cmdu); + } a->acs_interval = a->cntlr_select.probe_int; @@ -4153,6 +4111,138 @@ void clear_fhlist(struct agent *a) } } + +#define map_plugin "i1905.map" + + +static void mapclient_sub_remove_cb(struct ubus_context *ctx, + struct ubus_subscriber *sub, + uint32_t obj) +{ + trace("Object 0x%x no longer present\n", obj); +} + +static int mapclient_sub_cb(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *type, + struct blob_attr *msg) +{ + struct ubus_subscriber *s = container_of(obj, struct ubus_subscriber, obj); + struct agent *priv = container_of(s, struct agent, sub); + char *str; + + str = blobmsg_format_json(msg, true); + trace("Received notification '%s': %s\n", type, str); + + ieee1905_cmdu_event_handler(priv, msg); + + free(str); + + return 0; +} + +static int mapclient_subscribe(struct agent *a, uint32_t oid) +{ + int ret; + + /* register mapclient as a subscriber with ubus */ + a->sub.cb = mapclient_sub_cb; + a->sub.remove_cb = mapclient_sub_remove_cb; + + ret = ubus_register_subscriber(a->ubus_ctx, &a->sub); + if (ret) + trace("Failed to register sub: %s\n", ubus_strerror(ret)); + + + /* now subscribe to events from map plugin over passed oid */ + ret = ubus_subscribe(a->ubus_ctx, &a->sub, oid); + if (ret) + trace("Failed to subscribe: %s\n", ubus_strerror(ret)); + + return 0; +} + +typedef uint32_t mapmodule_object_t; + +struct map_module_unish { + mapmodule_object_t id; + uint32_t cmdu_mask; + char process_cmdu_funcname[64]; +}; + + +static void register_cb(struct ubus_request *req, int type, struct blob_attr *msg) +{ + struct agent *priv = (struct agent *)req->priv; + const struct blobmsg_policy pol[1] = { + [0] = { .name = "oid", .type = BLOBMSG_TYPE_INT32 }, + }; + struct blob_attr *tb[1]; + + + blobmsg_parse(pol, 1, tb, blob_data(msg), blob_len(msg)); + + if (tb[0]) { + uint32_t oid = blobmsg_get_u32(tb[0]); + + trace("Response ID: %u\n", oid); + mapclient_subscribe(priv, oid); + } +} + +#ifndef BITx +#define BITx(n) (1U << (n)) +#endif + +static void mapclient_subscribe_for_cmdus(struct agent *a) +{ + char data[2 * sizeof(struct map_module) + 1] = {0}; + int ret; + uint32_t map_id; + struct blob_buf bb = {}; + struct map_module m = { + .id = 0x11111111, + .process_cmdu_funcname = "mapclient_process_cmdu", + }; + + map_prepare_cmdu_mask(m.cmdu_mask, + CMDU_TYPE_TOPOLOGY_DISCOVERY, + CMDU_TYPE_TOPOLOGY_NOTIFICATION, + CMDU_TYPE_TOPOLOGY_QUERY, + CMDU_TYPE_TOPOLOGY_RESPONSE, + CMDU_TYPE_VENDOR_SPECIFIC, + CMDU_TYPE_AP_AUTOCONFIGURATION_SEARCH, + CMDU_TYPE_AP_AUTOCONFIGURATION_RESPONSE, + CMDU_TYPE_AP_AUTOCONFIGURATION_WSC); + + trace("<----------------------------------- %s\n", __func__); + + //trace("cmdu-mask = 0x%x\n", i1905cmdus_mask); + ret = ubus_lookup_id(a->ubus_ctx, map_plugin, &map_id); + if (ret) { + trace("plugin '%s' lookup failed. %s\n", + map_plugin, ubus_strerror(ret)); + return; + } + + a->map_oid = map_id; + + /* register as client to the map module */ + blob_buf_init(&bb, 0); + blobmsg_add_string(&bb, "module", "mapagent"); + btostr((unsigned char *)&m, sizeof(struct map_module), data); + blobmsg_add_string(&bb, "data", data); + ret = ubus_invoke(a->ubus_ctx, a->map_oid, "register", bb.head, register_cb, + a, 1000); + if (ret) { + trace("Failed to 'register' with %s (err = %s)\n", + map_plugin, ubus_strerror(ret)); + } + + blob_buf_free(&bb); + + return; +} + int start_agent(void) { struct agent *w; @@ -4195,7 +4285,7 @@ int start_agent(void) } w->ubus_ctx = ctx; w->wifi_evh.cb = ubus_wifi_event_handler; - w->ieee1905_evh.cb = ubus_1905_event_handler; + //w->ieee1905_evh.cb = ubus_1905_event_handler; ubus_add_uloop(ctx); @@ -4264,7 +4354,6 @@ int start_agent(void) ubus_register_event_handler(ctx, &w->wifi_evh, "ethport"); ubus_register_event_handler(ctx, &w->wifi_evh, "wifi.*"); ubus_register_event_handler(ctx, &w->wifi_evh, "wps_credentials"); - ubus_register_event_handler(ctx, &w->ieee1905_evh, "ieee1905.*"); w->autocfg_dispatcher.cb = agent_dispatch_autoconfig; w->loop_detection_dispatcher.cb = agent_trigger_vendor_specific; @@ -4289,11 +4378,13 @@ int start_agent(void) uloop_timeout_set(&w->autocfg_dispatcher, 0 * 1000); + mapclient_subscribe_for_cmdus(w); + uloop_run(); /* out_and_exit: */ worker_exit(&w->cmd_dispatcher); - ubus_unregister_event_handler(ctx, &w->ieee1905_evh); + //ubus_unregister_event_handler(ctx, &w->ieee1905_evh); ubus_unregister_event_handler(ctx, &w->wifi_evh); warn("Error!! exit ...\n"); agent_remove_object(w); @@ -4362,7 +4453,7 @@ void stop_agent(struct agent *w) stop_test_logging(); worker_exit(&w->cmd_dispatcher); ubus_unregister_event_handler(w->ubus_ctx, &w->wifi_evh); - ubus_unregister_event_handler(w->ubus_ctx, &w->ieee1905_evh); + //ubus_unregister_event_handler(w->ubus_ctx, &w->ieee1905_evh); plugins_unload(&w->pluginlist); agent_remove_object(w); ubus_free(w->ubus_ctx); diff --git a/src/core/agent.h b/src/core/agent.h index 640689ac949c9a0a2a8b37e22104165a48c167b1..2260111381ee90e60edca95e4757f60ab759a6f5 100644 --- a/src/core/agent.h +++ b/src/core/agent.h @@ -348,6 +348,12 @@ struct wifi_unassoc_sta_element { uint8_t rssi; }; +struct wsc_key { + uint8_t *key; + uint32_t key_len; + uint8_t mac[6]; +}; + struct wsc_data { uint8_t *m1_frame; uint16_t m1_size; @@ -490,6 +496,8 @@ struct agent { int ignore_scan_finished_event; struct uloop_timeout available_scan_timer; /* 5 minutes available for scan */ time_t last_scan_time; /* minimum scan interval */ + uint32_t map_oid; + struct ubus_subscriber sub; }; struct netif_bk *find_bkhaul_by_bssid(struct agent *a, uint8_t *bssid); diff --git a/src/core/agent_cmdu_generator.c b/src/core/agent_cmdu_generator.c index cc1e4455a9277f1533c5d1e39b94ff31bd596566..af13848bdfcb9f1fee544bc427eac12f213c4077 100644 --- a/src/core/agent_cmdu_generator.c +++ b/src/core/agent_cmdu_generator.c @@ -26,9 +26,12 @@ #include <libubox/utils.h> #include <libubus.h> -#include <map1905/map2.h> -#include <map1905/maputils.h> -#include <wsc.h> +#include <timer_impl.h> +#include <cmdu.h> +#include <1905_tlvs.h> +#include <map22.h> +#include <i1905_wsc.h> +#include <map_module22.h> #include <uci.h> @@ -42,921 +45,987 @@ #include "msgqueue.h" #include "worker.h" #include "agent.h" -//#include "platform_interfaces.h" + #include "agent_tlv_generator.h" #include "agent_cmdu_generator.h" -struct cmdu_cstruct *agent_gen_ap_autoconfig_search(struct agent *a, +struct cmdu_buff *agent_gen_ap_autoconfig_search(struct agent *a, struct wifi_radio_element *radio, char *intf_name, uint8_t profile) { - struct cmdu_cstruct *cmdu; - struct tlv_supp_service *p = NULL; - struct tlv_searched_service *p1; - struct tlv_map_profile *p2; - struct tlv_al_mac *p3; - struct tlv_autoconf_freq_band *p4; - struct tlv_searched_role *p5; - int i, tlv_index = 0; + struct cmdu_buff *frm = NULL; + struct tlv *t; + int ret = 0; uint8_t band = 0; + uint16_t mid = 0; - cmdu = (struct cmdu_cstruct *)calloc(1, sizeof(struct cmdu_cstruct)); - if (!cmdu) { - fprintf(stderr, "failed to malloc cmdu\n"); + frm = cmdu_alloc_simple(CMDU_TYPE_AP_AUTOCONFIGURATION_SEARCH, &mid); + if (!frm) { + dbg("%s: -ENOMEM\n", __func__); return NULL; } - memcpy(cmdu->origin, "\x01\x80\xc2\x00\x00\x13", 6); - if (intf_name) - strncpy(cmdu->intf_name, intf_name, - sizeof(cmdu->intf_name) - 1); - else - strncpy(cmdu->intf_name, a->cfg.al_bridge, sizeof(cmdu->intf_name) - 1); - - cmdu->message_type = CMDU_TYPE_AP_AUTOCONFIGURATION_SEARCH; - - p = calloc(1, sizeof(struct tlv_supp_service)); - if (!p) - goto fail_cmdu; - - cmdu->num_tlvs++; - p->tlv_type = MAP_TLV_SUPPORTED_SERVICE; - p->supported_services_list = 1; - p->supported_services = calloc(p->supported_services_list, - sizeof(*p->supported_services)); - if (!p->supported_services) - goto fail_p; - - for (i = 0; i < p->supported_services_list; i++) - p->supported_services[i].service = - SUPPORTED_SERVICE_MULTIAP_AGENT; - - p1 = calloc(1, sizeof(struct tlv_searched_service)); - if (!p1) - goto fail_p; - - cmdu->num_tlvs++; - p1->tlv_type = MAP_TLV_SEARCHED_SERVICE; - p1->searched_services_list = 1; - p1->service = calloc(p1->searched_services_list, sizeof(*p1->service)); - if (!p1->service) - goto fail_p1; - - for (i = 0; i < p1->searched_services_list; i++) - p1->service[i] = SEARCHED_SERVICE_MULTIAP_CONTROLLER; - - p2 = calloc(1, sizeof(struct tlv_map_profile)); - if (!p2) - goto fail_p1; + CMDU_SET_RELAY_MCAST(frm->cdata); - cmdu->num_tlvs++; - p2->tlv_type = MAP_TLV_MULTIAP_PROFILE; - p2->profile = profile; + ret = agent_gen_al_mac(a, frm, a->almac); + if (ret) { + cmdu_free(frm); + return NULL; + } - p3 = agent_gen_al_mac(a, a->almac); - if (!p3) - goto fail_p2; - cmdu->num_tlvs++; + ret = agent_gen_searched_role(a, frm, IEEE80211_ROLE_REGISTRAR); + if (ret) { + cmdu_free(frm); + return NULL; + } band = wifi_band_to_ieee1905band(radio->band); trace("radio band = %d, band = %d\n", radio->band, band); - p4 = agent_gen_autoconf_freq_band(a, band); - if (!p4) - goto fail_p3; - cmdu->num_tlvs++; - - p5 = agent_gen_searched_role(a, 0x00); /* registrar */ - if (!p5) - goto fail_p4; - cmdu->num_tlvs++; - - cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, - sizeof(uint8_t *)); - if (!cmdu->tlvs) - goto fail_p5; - cmdu->tlvs[tlv_index++] = (uint8_t *)p; - cmdu->tlvs[tlv_index++] = (uint8_t *)p1; - cmdu->tlvs[tlv_index++] = (uint8_t *)p2; - cmdu->tlvs[tlv_index++] = (uint8_t *)p3; - cmdu->tlvs[tlv_index++] = (uint8_t *)p4; - cmdu->tlvs[tlv_index++] = (uint8_t *)p5; - - return cmdu; -fail_p5: - map_free_tlv_cstruct((uint8_t *) p5); -fail_p4: - map_free_tlv_cstruct((uint8_t *) p4); -fail_p3: - map_free_tlv_cstruct((uint8_t *) p3); -fail_p2: - map_free_tlv_cstruct((uint8_t *) p2); -fail_p1: - map_free_tlv_cstruct((uint8_t *) p1); -fail_p: - map_free_tlv_cstruct((uint8_t *) p); -fail_cmdu: - free(cmdu); - return NULL; -} - -struct cmdu_cstruct *agent_gen_ap_metrics_response(struct agent *a, - struct cmdu_cstruct *rec_cmdu) -{ - int i, j; - int tlv_index = 0; - uint8_t *tmp; - struct cmdu_cstruct *cmdu; - - cmdu = calloc(1, sizeof(struct cmdu_cstruct)); - if (!cmdu) { - dbg("Out of memory.!\n"); + ret = agent_gen_autoconf_freq_band(a, frm, band); + if (ret) { + cmdu_free(frm); return NULL; } - cmdu->message_type = CMDU_AP_METRICS_RESPONSE; - memcpy(cmdu->origin, rec_cmdu->origin, 6); - strncpy(cmdu->intf_name, rec_cmdu->intf_name, IFNAMESIZE - 1); - cmdu->message_id = rec_cmdu->message_id; - - /* Calculate number of TLVs required for the response - * based on the received CMDU - */ - for (i = 0; i < rec_cmdu->num_tlvs; i++) { - tmp = (uint8_t *)rec_cmdu->tlvs[i]; - - switch (*tmp) { - case MAP_TLV_AP_RADIO_IDENTIFIER: - { - int radio_index; - struct tlv_ap_radio_identifier *p = - (struct tlv_ap_radio_identifier *)tmp; - - radio_index = get_radio_index(a, p->radio_id); - if (radio_index != -1) { -// #ifdef PROFILE2 - /* Radio Metrics TLV */ - cmdu->num_tlvs++; -// #endif - } - break; - } - - case MAP_TLV_AP_METRIC_QUERY: - { - struct tlv_ap_metric_query *p = - (struct tlv_ap_metric_query *)tmp; - - for (j = 0; j < p->bssid_nr; j++) { - int num_sta = 0; - struct sta *s; - uint8_t bssid[6] = { 0 }; - struct netif_fh *fh; - - memcpy(bssid, p->ap_metric_query_bssid[j].bssid, 6); - fh = wifi_get_netif_by_bssid(a, bssid); - if (!fh) - continue; - - /* AP Metrics TLV */ - cmdu->num_tlvs++; -// #ifdef PROFILE2 - /* AP Extended Metrics TLV */ - cmdu->num_tlvs++; -// #endif - - list_for_each_entry(s, &fh->stalist, list) - num_sta++; - - if (fh->cfg->include_sta_stats) { - /* Associated STA Traffic Stats TLV */ - cmdu->num_tlvs += num_sta; - } - - if (fh->cfg->include_sta_metric) { - /* Associated STA Link Metrics TLV */ - cmdu->num_tlvs += num_sta; - -// #ifdef PROFILE2 - /* Associated STA Extended Link Metrics TLV */ - cmdu->num_tlvs += num_sta; -// #endif - } - - } - break; - } - - default: - dbg("Unsupported tlv in cmdu:%s\n", - map_stringify_cmdu_type(rec_cmdu->message_type)); - break; - } + ret = agent_gen_supported_service(a, frm, SUPPORTED_SERVICE_MULTIAP_AGENT); + if (ret) { + cmdu_free(frm); + return NULL; } - cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); - if (!cmdu->tlvs) { - cmdu->num_tlvs = 0; - goto error; + ret = agent_gen_searched_service(a, frm, SEARCHED_SERVICE_MULTIAP_CONTROLLER); + if (ret) { + cmdu_free(frm); + return NULL; } - /* Process response based on received CMDU */ - for (i = 0; i < rec_cmdu->num_tlvs; i++) { - tmp = (uint8_t *)rec_cmdu->tlvs[i]; - - switch (*tmp) { - case MAP_TLV_AP_RADIO_IDENTIFIER: - { - int radio_index; - struct tlv_radio_metrics *p1; - struct tlv_ap_radio_identifier *p = - (struct tlv_ap_radio_identifier *)tmp; - - radio_index = get_radio_index(a, p->radio_id); - if (radio_index != -1) { -// #ifdef PROFILE2 - /* Radio Metrics TLV */ - p1 = agent_gen_radio_metrics(a, - radio_index); - if (!p1) - goto error; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p1; -// #endif - } - break; - } - - case MAP_TLV_AP_METRIC_QUERY: - { - struct wifi_radio_element *radio; - struct wifi_bss_element *bss; - struct tlv_ap_metrics *p2; - struct tlv_ap_ext_metrics *p3; - struct tlv_ap_metric_query *p = - (struct tlv_ap_metric_query *)tmp; - - for (j = 0; j < p->bssid_nr; j++) { - int radio_index; - int bss_index; - struct sta *s; - struct netif_fh *fh; - - bss_index = get_radio_and_bss_index(a, - p->ap_metric_query_bssid[j].bssid, - &radio_index); - - if (bss_index == -1) - continue; - - radio = a->radios + radio_index; - bss = radio->bsslist + bss_index; - /* AP Metrics TLV */ - p2 = agent_gen_ap_metrics(a, - radio_index, bss_index); - if (!p2) - goto error; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p2; -// #ifdef PROFILE2 - /* AP Extended Metrics TLV */ - p3 = agent_gen_ap_ext_metrics(a, - radio_index, bss_index); - if (!p3) - goto error; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p3; -// #endif - - fh = wifi_get_netif_by_bssid(a, bss->bssid); - if (fh == NULL) - continue; - - list_for_each_entry(s, &fh->stalist, list) { - if (fh->cfg->include_sta_stats) { - /* Associated STA Traffic Stats TLV */ - struct tlv_assoc_sta_traffic_stats *p4; - - p4 = agent_gen_assoc_sta_traffic_stats(a, s); - if (!p4) - goto error; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p4; - } - - if (fh->cfg->include_sta_metric) { - struct tlv_assoc_sta_link_metrics *p5; - struct tlv_assoc_sta_ext_link_metric *p6; - - p5 = agent_gen_assoc_sta_link_metrics(a, s, bss->bssid); - if (!p5) - goto error; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p5; - -// #ifdef PROFILE2 - p6 = agent_gen_assoc_sta_ext_link_metric(a, s, bss->bssid); - if (!p6) - goto error; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p6; -// #endif - } - - } - } - break; - } - } + ret = agent_gen_map_profile(a, frm, MULTIAP_PROFILE_2); + if (ret) { + cmdu_free(frm); + return NULL; } - /* if tlv_index is zero, - * means no valid data is found - * free the allocated memory for tlvs - */ - if (tlv_index == 0) - goto error; - - return cmdu; + cmdu_put_eom(frm); -error: - map_free_cmdu(cmdu); + dbg("%s:%d: radio = %s\n", __func__, __LINE__, radio->name); + return frm; +out: + cmdu_free(frm); return NULL; } -struct cmdu_cstruct *agent_gen_assoc_sta_metric_response_per_intf( - struct agent *a, char *ifname) +struct cmdu_buff *agent_gen_ap_autoconfig_wsc(struct agent *a, struct cmdu_buff *rec_cmdu, + struct wifi_radio_element *radio, uint16_t mid) { - int i; - int tlv_index = 0; - struct cmdu_cstruct *cmdu; - struct wifi_radio_element *radio; - struct wifi_bss_element *bss; + trace("agent: %s: --->\n", __func__); + struct cmdu_buff *frm = NULL; + struct tlv *t; + int ret = 0; + uint8_t band = 0; - cmdu = calloc(1, sizeof(struct cmdu_cstruct)); - if (!cmdu) + frm = cmdu_alloc_simple(CMDU_TYPE_AP_AUTOCONFIGURATION_WSC, &mid); + if (!frm) { + dbg("%s: -ENOMEM\n", __func__); return NULL; - - cmdu->message_type = CMDU_ASSOC_STA_LINK_METRICS_RESPONSE; - memcpy(cmdu->origin, a->cntlr_almac, 6); - strncpy(cmdu->intf_name, a->cfg.al_bridge, IFNAMESIZE - 1); - - radio = wifi_ifname_to_radio_element(a, ifname); - if (!radio) - goto error; - - /* Calculate number of TLVs required for the response - */ - for (i = 0; i < radio->num_bss; i++) { - struct netif_fh *fh; - int num_sta = 0; - struct sta *s; - - bss = radio->bsslist + i; - fh = wifi_get_netif_by_bssid(a, bss->bssid); - if (!fh) - continue; - - list_for_each_entry(s, &fh->stalist, list) - num_sta++; - - /* Associated STA Link Metrics TLV */ - cmdu->num_tlvs += num_sta; -// #ifdef PROFILE2 - /* Associated STA Extended Link Metrics TLV */ - cmdu->num_tlvs += num_sta; -// #endif - } - - if (cmdu->num_tlvs > 0) - cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); - else { - /* no sta is for this radio interface - * free the cmdu */ - goto error; - } - - if (!cmdu->tlvs) { - cmdu->num_tlvs = 0; - goto error; } - for (i = 0; i < radio->num_bss; i++) { - struct sta *s; - struct netif_fh *fh; - - bss = radio->bsslist + i; - fh = wifi_get_netif_by_bssid(a, bss->bssid); - if (!fh) - continue; + memcpy(frm->origin, rec_cmdu->origin, 6); - list_for_each_entry(s, &fh->stalist, list) { - struct tlv_assoc_sta_link_metrics *p1; - struct tlv_assoc_sta_ext_link_metric *p2; + ret = agent_gen_ap_radio_basic_cap(a, frm, radio); + if (ret) + goto out; - p1 = agent_gen_assoc_sta_link_metrics(a, s, bss->bssid); - if (!p1) - goto error; + ret = agent_gen_profile2_ap_cap(a, frm); + if (ret) + goto out; - cmdu->tlvs[tlv_index++] = (uint8_t *)p1; + ret = agent_gen_ap_radio_adv_cap(a, frm, radio); + if (ret) + goto out; -// #ifdef PROFILE2 - p2 = agent_gen_assoc_sta_ext_link_metric(a, s, bss->bssid); - if (!p2) - goto error; + ret = agent_gen_wsc(a, frm, radio); + if (ret) + goto out; - cmdu->tlvs[tlv_index++] = (uint8_t *)p2; -// #endif - } - - } - - return cmdu; - -error: - map_free_cmdu(cmdu); + trace("build ap autoconfig wsc!\n"); + cmdu_put_eom(frm); + return frm; +out: + cmdu_free(frm); return NULL; +// struct agent *a = (struct agent *) agent; +// struct cmdu_buff *cmdu; +// struct tlv_ap_radio_basic_cap *p; +// struct tlv_profile2_ap_cap *p1; +// struct tlv_ap_radio_adv_cap *p2; +// struct tlv_wsc *p3; +// int tlv_index = 0; +// +// /* don't trigger autoconfig for bSTA radios */ +// //if (radio->onboarded) +// // return -1; +// +// cmdu = (struct cmdu_buff *)calloc(1, sizeof(struct cmdu_buff)); +// if (!cmdu) { +// fprintf(stderr, "failed to malloc cmdu\n"); +// return -1; +// } +// +// memcpy(cmdu->origin, rec_cmdu->origin, 6); +// cmdu->message_type = CMDU_TYPE_AP_AUTOCONFIGURATION_WSC; +// strncpy(cmdu->intf_name, rec_cmdu->intf_name, +// sizeof(cmdu->intf_name) - 1); +// +// p = agent_gen_ap_radio_basic_cap(a, cmdu, radio); +// if (!p) +// goto fail_cmdu; +// cmdu->num_tlvs++; +// +// p1 = agent_gen_profile2_ap_cap(a); +// if (!p1) +// goto fail_p; +// cmdu->num_tlvs++; +// +// p2 = agent_gen_ap_radio_adv_cap(a, cmdu, radio); +// if (!p2) +// goto fail_p1; +// cmdu->num_tlvs++; +// +// p3 = agent_gen_wsc(a, cmdu, radio); +// if (!p3) +// goto fail_p2; +// cmdu->num_tlvs++; +// +// cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); +// if (!cmdu->tlvs) +// goto fail_p3; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p; +// cmdu->tlvs[tlv_index++] = (uint8_t *)p1; +// cmdu->tlvs[tlv_index++] = (uint8_t *)p2; +// cmdu->tlvs[tlv_index++] = (uint8_t *)p3; +// // TODO: ff:ff:ff:ff:ff:ff = send to all agents +// +// agent_send_cmdu(a, cmdu); +// map_free_cmdu(cmdu); +// return 0; +//fail_p3: +// map_free_tlv_cstruct((uint8_t *) p3); +//fail_p2: +// map_free_tlv_cstruct((uint8_t *) p2); +//fail_p1: +// map_free_tlv_cstruct((uint8_t *) p1); +//fail_p: +// map_free_tlv_cstruct((uint8_t *) p); +//fail_cmdu: +// free(cmdu); +// return -1; } -struct cmdu_cstruct *agent_gen_assoc_sta_metric_response( - struct agent *a, struct cmdu_cstruct *rec_cmdu) +struct cmdu_buff *agent_gen_ap_metrics_response(struct agent *a, + struct cmdu_buff *rec_cmdu) { - struct cmdu_cstruct *cmdu; - struct tlv_sta_mac *query; - struct netif_fh *fh; - struct sta *s; - struct tlv_assoc_sta_link_metrics *p1; - struct tlv_assoc_sta_ext_link_metric *p2; - struct tlv_error_code *p3; - uint8_t *tmp; - uint8_t reason_code; - int tlv_index = 0; - bool is_sta_found = false; - - if (!rec_cmdu) - return NULL; - - cmdu = calloc(1, sizeof(struct cmdu_cstruct)); - if (!cmdu) { - fprintf(stderr, "failed to malloc cmdu\n"); - return NULL; - } - - cmdu->message_type = CMDU_ASSOC_STA_LINK_METRICS_RESPONSE; - memcpy(cmdu->origin, rec_cmdu->origin, 6); - strncpy(cmdu->intf_name, rec_cmdu->intf_name, IFNAMESIZE - 1); - cmdu->message_id = rec_cmdu->message_id; - - if (!rec_cmdu->num_tlvs || (rec_cmdu->num_tlvs > 1)) - goto error; - - tmp = (uint8_t *)rec_cmdu->tlvs[0]; - if (*tmp != MAP_TLV_STA_MAC_ADDRESS) - goto error; - - query = (struct tlv_sta_mac *)tmp; - list_for_each_entry(fh, &a->fhlist, list) { - list_for_each_entry(s, &fh->stalist, list) { - if (hwaddr_equal(query->addr, s->macaddr)) { - is_sta_found = true; - break; - } - } - if (is_sta_found) - break; - } - - /* Associated STA Link Metrics TLV */ - cmdu->num_tlvs = 1; - if (is_sta_found) { -// #ifdef PROFILE2 - /* Associated STA Extended Link Metrics TLV */ - cmdu->num_tlvs++; -// #endif - } else - cmdu->num_tlvs++; /* Error Code TLV*/ - - cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); - if (!cmdu->tlvs) { - cmdu->num_tlvs = 0; - goto error; - } - - if (is_sta_found) { - /* Associated STA Link Metrics TLV */ - p1 = agent_gen_assoc_sta_link_metrics(a, s, fh->bssid); - if (!p1) - goto error; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p1; - -// #ifdef PROFILE2 - /* Associated STA Extended Link Metrics TLV */ - p2 = agent_gen_assoc_sta_ext_link_metric(a, s, fh->bssid); - if (!p2) - goto error; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p2; -// #endif - - } else { - /* Associated STA Link Metrics TLV */ - p1 = calloc(1, sizeof(*p1)); - if (!p1) - goto error; - - p1->tlv_type = MAP_TLV_ASSOCIATED_STA_LINK_METRICS; - memcpy(p1->addr, query->addr, 6); - /* Reported BSS for STA */ - p1->bssid_nr = 0; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p1; - - /* Error Code TLV */ - reason_code = 0x02; /* STA not associated with any BSS */ - p3 = agent_gen_tlv_error_code(a, NULL, query->addr, reason_code); - if (!p3) - goto error; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p3; - } - - return cmdu; + return NULL; +// int i, j; +// int tlv_index = 0; +// uint8_t *tmp; +// struct cmdu_cstruct *cmdu; +// +// cmdu = calloc(1, sizeof(struct cmdu_cstruct)); +// if (!cmdu) { +// dbg("Out of memory.!\n"); +// return NULL; +// } +// +// cmdu->message_type = CMDU_AP_METRICS_RESPONSE; +// memcpy(cmdu->origin, rec_cmdu->origin, 6); +// strncpy(cmdu->intf_name, rec_cmdu->intf_name, IFNAMESIZE - 1); +// cmdu->message_id = rec_cmdu->message_id; +// +// /* Calculate number of TLVs required for the response +// * based on the received CMDU +// */ +// for (i = 0; i < rec_cmdu->num_tlvs; i++) { +// tmp = (uint8_t *)rec_cmdu->tlvs[i]; +// +// switch (*tmp) { +// case MAP_TLV_AP_RADIO_IDENTIFIER: +// { +// int radio_index; +// struct tlv_ap_radio_identifier *p = +// (struct tlv_ap_radio_identifier *)tmp; +// +// radio_index = get_radio_index(a, p->radio_id); +// if (radio_index != -1) { +//// #ifdef PROFILE2 +// /* Radio Metrics TLV */ +// cmdu->num_tlvs++; +//// #endif +// } +// break; +// } +// +// case MAP_TLV_AP_METRIC_QUERY: +// { +// struct tlv_ap_metric_query *p = +// (struct tlv_ap_metric_query *)tmp; +// +// for (j = 0; j < p->bssid_nr; j++) { +// int num_sta = 0; +// struct sta *s; +// uint8_t bssid[6] = { 0 }; +// struct netif_fh *fh; +// +// memcpy(bssid, p->ap_metric_query_bssid[j].bssid, 6); +// fh = wifi_get_netif_by_bssid(a, bssid); +// if (!fh) +// continue; +// +// /* AP Metrics TLV */ +// cmdu->num_tlvs++; +//// #ifdef PROFILE2 +// /* AP Extended Metrics TLV */ +// cmdu->num_tlvs++; +//// #endif +// +// list_for_each_entry(s, &fh->stalist, list) +// num_sta++; +// +// if (fh->cfg->include_sta_stats) { +// /* Associated STA Traffic Stats TLV */ +// cmdu->num_tlvs += num_sta; +// } +// +// if (fh->cfg->include_sta_metric) { +// /* Associated STA Link Metrics TLV */ +// cmdu->num_tlvs += num_sta; +// +//// #ifdef PROFILE2 +// /* Associated STA Extended Link Metrics TLV */ +// cmdu->num_tlvs += num_sta; +//// #endif +// } +// +// } +// break; +// } +// +// default: +// dbg("Unsupported tlv in cmdu:%s\n", +// map_stringify_cmdu_type(rec_cmdu->message_type)); +// break; +// } +// } +// +// cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); +// if (!cmdu->tlvs) { +// cmdu->num_tlvs = 0; +// goto error; +// } +// +// /* Process response based on received CMDU */ +// for (i = 0; i < rec_cmdu->num_tlvs; i++) { +// tmp = (uint8_t *)rec_cmdu->tlvs[i]; +// +// switch (*tmp) { +// case MAP_TLV_AP_RADIO_IDENTIFIER: +// { +// int radio_index; +// struct tlv_radio_metrics *p1; +// struct tlv_ap_radio_identifier *p = +// (struct tlv_ap_radio_identifier *)tmp; +// +// radio_index = get_radio_index(a, p->radio_id); +// if (radio_index != -1) { +//// #ifdef PROFILE2 +// /* Radio Metrics TLV */ +// p1 = agent_gen_radio_metrics(a, +// radio_index); +// if (!p1) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p1; +//// #endif +// } +// break; +// } +// +// case MAP_TLV_AP_METRIC_QUERY: +// { +// struct wifi_radio_element *radio; +// struct wifi_bss_element *bss; +// struct tlv_ap_metrics *p2; +// struct tlv_ap_ext_metrics *p3; +// struct tlv_ap_metric_query *p = +// (struct tlv_ap_metric_query *)tmp; +// +// for (j = 0; j < p->bssid_nr; j++) { +// int radio_index; +// int bss_index; +// struct sta *s; +// struct netif_fh *fh; +// +// bss_index = get_radio_and_bss_index(a, +// p->ap_metric_query_bssid[j].bssid, +// &radio_index); +// +// if (bss_index == -1) +// continue; +// +// radio = a->radios + radio_index; +// bss = radio->bsslist + bss_index; +// /* AP Metrics TLV */ +// p2 = agent_gen_ap_metrics(a, +// radio_index, bss_index); +// if (!p2) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p2; +//// #ifdef PROFILE2 +// /* AP Extended Metrics TLV */ +// p3 = agent_gen_ap_ext_metrics(a, +// radio_index, bss_index); +// if (!p3) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p3; +//// #endif +// +// fh = wifi_get_netif_by_bssid(a, bss->bssid); +// if (fh == NULL) +// continue; +// +// list_for_each_entry(s, &fh->stalist, list) { +// if (fh->cfg->include_sta_stats) { +// /* Associated STA Traffic Stats TLV */ +// struct tlv_assoc_sta_traffic_stats *p4; +// +// p4 = agent_gen_assoc_sta_traffic_stats(a, s); +// if (!p4) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p4; +// } +// +// if (fh->cfg->include_sta_metric) { +// struct tlv_assoc_sta_link_metrics *p5; +// struct tlv_assoc_sta_ext_link_metric *p6; +// +// p5 = agent_gen_assoc_sta_link_metrics(a, s, bss->bssid); +// if (!p5) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p5; +// +//// #ifdef PROFILE2 +// p6 = agent_gen_assoc_sta_ext_link_metric(a, s, bss->bssid); +// if (!p6) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p6; +//// #endif +// } +// +// } +// } +// break; +// } +// } +// } +// +// /* if tlv_index is zero, +// * means no valid data is found +// * free the allocated memory for tlvs +// */ +// if (tlv_index == 0) +// goto error; +// +// return cmdu; +// +//error: +// map_free_cmdu(cmdu); +// return NULL; +} -error: - map_free_cmdu(cmdu); +struct cmdu_buff *agent_gen_assoc_sta_metric_response_per_intf( + struct agent *a, char *ifname) +{ + return NULL; +// int i; +// int tlv_index = 0; +// struct cmdu_cstruct *cmdu; +// struct wifi_radio_element *radio; +// struct wifi_bss_element *bss; +// +// cmdu = calloc(1, sizeof(struct cmdu_cstruct)); +// if (!cmdu) +// return NULL; +// +// cmdu->message_type = CMDU_ASSOC_STA_LINK_METRICS_RESPONSE; +// memcpy(cmdu->origin, a->cntlr_almac, 6); +// /* TODO/FIXME: interface name +// * hardcoded: br-lan +// */ +// strncpy(cmdu->intf_name, "br-lan", IFNAMESIZE - 1); +// +// radio = wifi_ifname_to_radio_element(a, ifname); +// if (!radio) +// goto error; +// +// /* Calculate number of TLVs required for the response +// */ +// for (i = 0; i < radio->num_bss; i++) { +// struct netif_fh *fh; +// int num_sta = 0; +// struct sta *s; +// +// bss = radio->bsslist + i; +// fh = wifi_get_netif_by_bssid(a, bss->bssid); +// if (!fh) +// continue; +// +// list_for_each_entry(s, &fh->stalist, list) +// num_sta++; +// +// /* Associated STA Link Metrics TLV */ +// cmdu->num_tlvs += num_sta; +//// #ifdef PROFILE2 +// /* Associated STA Extended Link Metrics TLV */ +// cmdu->num_tlvs += num_sta; +//// #endif +// } +// +// cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); +// if (!cmdu->tlvs) { +// cmdu->num_tlvs = 0; +// goto error; +// } +// +// for (i = 0; i < radio->num_bss; i++) { +// struct sta *s; +// struct netif_fh *fh; +// +// bss = radio->bsslist + i; +// fh = wifi_get_netif_by_bssid(a, bss->bssid); +// if (!fh) +// continue; +// +// list_for_each_entry(s, &fh->stalist, list) { +// struct tlv_assoc_sta_link_metrics *p1; +// struct tlv_assoc_sta_ext_link_metric *p2; +// +// p1 = agent_gen_assoc_sta_link_metrics(a, s, bss->bssid); +// if (!p1) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p1; +// +//// #ifdef PROFILE2 +// p2 = agent_gen_assoc_sta_ext_link_metric(a, s, bss->bssid); +// if (!p2) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p2; +//// #endif +// } +// +// } +// +// return cmdu; +// +//error: +// map_free_cmdu(cmdu); +// +// return NULL; +} +struct cmdu_buff *agent_gen_assoc_sta_metric_response( + struct agent *a, struct cmdu_buff *rec_cmdu) +{ return NULL; +// struct cmdu_cstruct *cmdu; +// struct tlv_sta_mac *query; +// struct netif_fh *fh; +// struct sta *s; +// struct tlv_assoc_sta_link_metrics *p1; +// struct tlv_assoc_sta_ext_link_metric *p2; +// struct tlv_error_code *p3; +// uint8_t *tmp; +// uint8_t reason_code; +// int tlv_index = 0; +// bool is_sta_found = false; +// +// if (!rec_cmdu) +// return NULL; +// +// cmdu = calloc(1, sizeof(struct cmdu_cstruct)); +// if (!cmdu) { +// fprintf(stderr, "failed to malloc cmdu\n"); +// return NULL; +// } +// +// cmdu->message_type = CMDU_ASSOC_STA_LINK_METRICS_RESPONSE; +// memcpy(cmdu->origin, rec_cmdu->origin, 6); +// strncpy(cmdu->intf_name, rec_cmdu->intf_name, IFNAMESIZE - 1); +// cmdu->message_id = rec_cmdu->message_id; +// +// if (!rec_cmdu->num_tlvs || (rec_cmdu->num_tlvs > 1)) +// goto error; +// +// tmp = (uint8_t *)rec_cmdu->tlvs[0]; +// if (*tmp != MAP_TLV_STA_MAC_ADDRESS) +// goto error; +// +// query = (struct tlv_sta_mac *)tmp; +// list_for_each_entry(fh, &a->fhlist, list) { +// list_for_each_entry(s, &fh->stalist, list) { +// if (hwaddr_equal(query->addr, s->macaddr)) { +// is_sta_found = true; +// break; +// } +// } +// if (is_sta_found) +// break; +// } +// +// /* Associated STA Link Metrics TLV */ +// cmdu->num_tlvs = 1; +// if (is_sta_found) { +//// #ifdef PROFILE2 +// /* Associated STA Extended Link Metrics TLV */ +// cmdu->num_tlvs++; +//// #endif +// } else +// cmdu->num_tlvs++; /* Error Code TLV*/ +// +// cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); +// if (!cmdu->tlvs) { +// cmdu->num_tlvs = 0; +// goto error; +// } +// +// if (is_sta_found) { +// /* Associated STA Link Metrics TLV */ +// p1 = agent_gen_assoc_sta_link_metrics(a, s, fh->bssid); +// if (!p1) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p1; +// +//// #ifdef PROFILE2 +// /* Associated STA Extended Link Metrics TLV */ +// p2 = agent_gen_assoc_sta_ext_link_metric(a, s, fh->bssid); +// if (!p2) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p2; +//// #endif +// +// } else { +// /* Associated STA Link Metrics TLV */ +// p1 = calloc(1, sizeof(*p1)); +// if (!p1) +// goto error; +// +// p1->tlv_type = MAP_TLV_ASSOCIATED_STA_LINK_METRICS; +// memcpy(p1->addr, query->addr, 6); +// /* Reported BSS for STA */ +// p1->bssid_nr = 0; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p1; +// +// /* Error Code TLV */ +// reason_code = 0x02; /* STA not associated with any BSS */ +// p3 = agent_gen_tlv_error_code(a, NULL, query->addr, reason_code); +// if (!p3) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p3; +// } +// +// return cmdu; +// +//error: +// map_free_cmdu(cmdu); +// +// return NULL; } -struct cmdu_cstruct *agent_gen_tunneled_msg(struct agent *a, uint8_t protocol, +struct cmdu_buff *agent_gen_tunneled_msg(struct agent *a, uint8_t protocol, uint8_t *sta, int frame_len, uint8_t *frame_body) { - struct cmdu_cstruct *cmdu; - struct tlv_source_info *p1; - struct tlv_tunnel_msg_type *p2; - struct tlv_tunneled *p3; - int tlv_index = 0; - - /* TODO: check profile type - * return NULL,in case of PROFILE-1 - * #ifdef PROFILE1 - * return NULL; - * #endif - */ - - if (!sta && !frame_body) - return NULL; - - cmdu = calloc(1, sizeof(struct cmdu_cstruct)); - if (!cmdu) - return NULL; - - cmdu->message_type = CMDU_TUNNELED; - memcpy(cmdu->origin, a->cntlr_almac, 6); - strncpy(cmdu->intf_name, a->cfg.al_bridge, IFNAMESIZE - 1); - - cmdu->num_tlvs = 3; - cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, - sizeof(uint8_t *)); - if (!cmdu->tlvs) { - cmdu->num_tlvs = 0; - goto error; - } - - /* Source Info TLV */ - p1 = agent_gen_source_info(a, sta); - if (!p1) - goto error; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p1; - - /* Tunneled message type TLV */ - p2 = agent_gen_tunnel_msg_type(a, protocol); - if (!p2) - goto error; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p2; - - /* Tunneled TLV */ - p3 = agent_gen_tunneled(a, frame_len, frame_body); - if (!p3) - goto error; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p3; - - return cmdu; - -error: - map_free_cmdu(cmdu); - return NULL; +// struct cmdu_cstruct *cmdu; +// struct tlv_source_info *p1; +// struct tlv_tunnel_msg_type *p2; +// struct tlv_tunneled *p3; +// int tlv_index = 0; +// +// /* TODO: check profile type +// * return NULL,in case of PROFILE-1 +// * #ifdef PROFILE1 +// * return NULL; +// * #endif +// */ +// +// if (!sta && !frame_body) +// return NULL; +// +// cmdu = calloc(1, sizeof(struct cmdu_cstruct)); +// if (!cmdu) +// return NULL; +// +// cmdu->message_type = CMDU_TUNNELED; +// memcpy(cmdu->origin, a->cntlr_almac, 6); +// /* TODO/FIXME: interface name +// * hardcoded: br-lan +// */ +// strncpy(cmdu->intf_name, "br-lan", IFNAMESIZE - 1); +// +// cmdu->num_tlvs = 3; +// cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, +// sizeof(uint8_t *)); +// if (!cmdu->tlvs) { +// cmdu->num_tlvs = 0; +// goto error; +// } +// +// /* Source Info TLV */ +// p1 = agent_gen_source_info(a, sta); +// if (!p1) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p1; +// +// /* Tunneled message type TLV */ +// p2 = agent_gen_tunnel_msg_type(a, protocol); +// if (!p2) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p2; +// +// /* Tunneled TLV */ +// p3 = agent_gen_tunneled(a, frame_len, frame_body); +// if (!p3) +// goto error; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p3; +// +// return cmdu; +// +//error: +// map_free_cmdu(cmdu); +// +// return NULL; } -struct cmdu_cstruct *agent_gen_vendor_specific_cmdu(struct agent *a, +struct cmdu_buff *agent_gen_vendor_specific_cmdu(struct agent *a, uint8_t *origin, uint8_t depth) { - struct tlv_vendor_specific *p; - struct cmdu_cstruct *cmdu; - int tlv_index = 0; - - cmdu = calloc(1, sizeof(struct cmdu_cstruct)); - if (!cmdu) - return NULL; - - cmdu->message_type = CMDU_TYPE_VENDOR_SPECIFIC; - memcpy(cmdu->origin, origin, 6); - strncpy(cmdu->intf_name, a->cfg.al_bridge, IFNAMESIZE - 1); - - p = agent_gen_vendor_specific_tlv(a, depth); - if (!p) - goto error; - - cmdu->num_tlvs++; - cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, - sizeof(uint8_t *)); - cmdu->tlvs[tlv_index++] = (uint8_t *)p; - return cmdu; -error: - map_free_cmdu(cmdu); return NULL; +// struct tlv_vendor_specific *p; +// struct cmdu_cstruct *cmdu; +// int tlv_index = 0; +// +// cmdu = calloc(1, sizeof(struct cmdu_cstruct)); +// if (!cmdu) +// return NULL; +// +// cmdu->message_type = CMDU_TYPE_VENDOR_SPECIFIC; +// memcpy(cmdu->origin, origin, 6); +// strncpy(cmdu->intf_name, a->cfg.al_bridge, IFNAMESIZE - 1); +// +// p = agent_gen_vendor_specific_tlv(a, depth); +// if (!p) +// goto error; +// +// cmdu->num_tlvs++; +// cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, +// sizeof(uint8_t *)); +// cmdu->tlvs[tlv_index++] = (uint8_t *)p; +// return cmdu; +//error: +// map_free_cmdu(cmdu); +// return NULL; } -struct cmdu_cstruct *agent_gen_ch_scan_response(struct agent *a, - struct cmdu_cstruct *cmdu) +struct cmdu_buff *agent_gen_ch_scan_response(struct agent *a, + struct cmdu_buff *cmdu) { trace("%s --->\n", __func__); - struct wifi_radio_element *radio = a->radios; - uint16_t tlv_index = 0; - uint32_t i, j, k, m; - int radio_index, opclass_index, channel_index; - struct cmdu_cstruct *cmdu_data = NULL; /* The response cmdu */ - struct tlv_timestamp *p; /* Timestamp TLV */ - struct tlv_ch_scan_res *p1; /* Channel Scan Response TLV */ - uint8_t query_channel; /* The current channel from the request TLV */ - uint8_t *tmp = NULL; /* The received TLV */ - - tmp = cmdu->tlvs[0]; - if (*tmp != MAP_TLV_CHANNEL_SCAN_REQ) { - dbg("Wrong received TLV type!\n"); - return NULL; - } - struct tlv_ch_scan_req *query = (struct tlv_ch_scan_req *)tmp; - - /* Allocate the cmdu */ - cmdu_data = (struct cmdu_cstruct *)calloc(1, sizeof(struct cmdu_cstruct)); - if (!cmdu_data) { - dbg("Out of memory!\n"); - return NULL; - } - - /* Define the cmdu */ - cmdu_data->message_type = CMDU_CHANNEL_SCAN_REPORT; - cmdu_data->message_id = cmdu->message_id; - strcpy(cmdu_data->intf_name, cmdu->intf_name); - memcpy(cmdu_data->origin, cmdu->origin, 6); - cmdu_data->num_tlvs = 1; // timestamp tlv - for (m = 0; m < query->nbr_radios; m++) { - if (query->radio_data[m].nbr_op_class == 0 || query->radio_data[m].op_class_data->nbr_ch == 0) { // all_ch_scan - radio_index = wifi_get_radio_index_by_mac(a, query->radio_data[m].radio_id); - for (i = 0; i < radio[radio_index].scanlist->num_opclass_scanned; i++) { - if (radio[radio_index].scanlist->opclass_scanlist[i].bandwidth == 20) { - for (j = 0; j < radio[radio_index].scanlist->opclass_scanlist[i].num_channels_scanned; j++) - cmdu_data->num_tlvs++; - } - } - } else // specified channels - cmdu_data->num_tlvs += query->radio_data[m].op_class_data->nbr_ch; // ch scan res tlvs - } - trace("Number of tlvs: %d\n", cmdu_data->num_tlvs); - - // Allocate the TLVs - cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, sizeof(uint8_t *)); - if (!cmdu_data->tlvs) { - goto error; - } - // Define the TLVs - /* Timestamp */ - p = agent_gen_timestamp_tlv(a); - if (!p) - goto error; - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; - trace("|%s:%d| Added %s\n", __func__, __LINE__, map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1])); - - /* Channel scan result */ - for (m = 0; m < query->nbr_radios; m++) { - // dbg("\tMID: %d Radio_id in %d iteration: - // " MACFMT "\n", cmdu->message_id, m, MAC2STR(query->radio_data[m].radio_id)); - radio_index = wifi_get_radio_index_by_mac(a, query->radio_data[m].radio_id); - /* Success scan */ - if (a->status_code == CH_SCAN_STATUS_SUCCESS) { - /* All channels scan */ - if (query->radio_data[m].nbr_op_class == 0 || query->radio_data[m].op_class_data->nbr_ch == 0) { - for (i = 0; i < radio[radio_index].scanlist->num_opclass_scanned; i++) { - if (radio[radio_index].scanlist->opclass_scanlist[i].bandwidth == 20) { - for (j = 0; j < radio[radio_index].scanlist->opclass_scanlist[i].num_channels_scanned; j++) { - opclass_index = i; - channel_index = j; - p1 = agent_gen_ch_scan_respons_tlv(a, radio_index, opclass_index, channel_index); - if (!p1) - goto error; - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p1; - trace("|%s:%d| Added %s for channel %d\n", __func__, __LINE__, map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1]), - radio[radio_index].scanlist->opclass_scanlist[i].channel_scanlist[j].channel); - } - } - } - /* Specified channels */ - } else { - for (k = 0; k < query->radio_data[m].op_class_data->nbr_ch; k++) { - query_channel = query->radio_data[m].op_class_data->ch[k]; - for (i = 0; i < radio[radio_index].scanlist->num_opclass_scanned; i++) { - for (j = 0; j < radio[radio_index].scanlist->opclass_scanlist[i].num_channels_scanned; j++) { - if (radio[radio_index].scanlist->opclass_scanlist[i].channel_scanlist[j].channel == query_channel) { - opclass_index = i; - channel_index = j; - p1 = agent_gen_ch_scan_respons_tlv(a, radio_index, opclass_index, channel_index); - if (!p1) - goto error; - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p1; - trace("|%s:%d| Added %s for channel %d\n", __func__, __LINE__, map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1]), - radio[radio_index].scanlist->opclass_scanlist[i].channel_scanlist[j].channel); - goto found; - } - } - } -found: - continue; - } - } - /* Non-success scan */ - } else { - for (k = 0; k < query->radio_data[m].op_class_data->nbr_ch; k++) { - query_channel = query->radio_data[m].op_class_data->ch[k]; - p1 = agent_gen_non_success_ch_scan_respons_tlv(a, radio_index, 0, query_channel); - if (!p1) - goto error; - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p1; - trace("|%s:%d| Added %s for channel %d\n", __func__, __LINE__, map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1]), - query_channel); - } - } - } - return cmdu_data; -error: - dbg("|%s:%d| out of memory!\n", __func__, __LINE__); - map_free_cmdu(cmdu_data); return NULL; +// struct wifi_radio_element *radio = a->radios; +// uint16_t tlv_index = 0; +// uint32_t i, j, k, m; +// int radio_index, opclass_index, channel_index; +// struct cmdu_cstruct *cmdu_data = NULL; /* The response cmdu */ +// struct tlv_timestamp *p; /* Timestamp TLV */ +// struct tlv_ch_scan_res *p1; /* Channel Scan Response TLV */ +// uint8_t query_channel; /* The current channel from the request TLV */ +// uint8_t *tmp = NULL; /* The received TLV */ +// +// tmp = cmdu->tlvs[0]; +// if (*tmp != MAP_TLV_CHANNEL_SCAN_REQ) { +// dbg("Wrong received TLV type!\n"); +// return NULL; +// } +// struct tlv_ch_scan_req *query = (struct tlv_ch_scan_req *)tmp; +// +// /* Allocate the cmdu */ +// cmdu_data = (struct cmdu_cstruct *)calloc(1, sizeof(struct cmdu_cstruct)); +// if (!cmdu_data) { +// dbg("Out of memory!\n"); +// return NULL; +// } +// +// /* Define the cmdu */ +// cmdu_data->message_type = CMDU_CHANNEL_SCAN_REPORT; +// cmdu_data->message_id = cmdu->message_id; +// strcpy(cmdu_data->intf_name, cmdu->intf_name); +// memcpy(cmdu_data->origin, cmdu->origin, 6); +// cmdu_data->num_tlvs = 1; // timestamp tlv +// for (m = 0; m < query->nbr_radios; m++) { +// if (query->radio_data[m].nbr_op_class == 0 || query->radio_data[m].op_class_data->nbr_ch == 0) { // all_ch_scan +// radio_index = wifi_get_radio_index_by_mac(a, query->radio_data[m].radio_id); +// for (i = 0; i < radio[radio_index].scanlist->num_opclass_scanned; i++) { +// if (radio[radio_index].scanlist->opclass_scanlist[i].bandwidth == 20) { +// for (j = 0; j < radio[radio_index].scanlist->opclass_scanlist[i].num_channels_scanned; j++) +// cmdu_data->num_tlvs++; +// } +// } +// } else // specified channels +// cmdu_data->num_tlvs += query->radio_data[m].op_class_data->nbr_ch; // ch scan res tlvs +// } +// trace("Number of tlvs: %d\n", cmdu_data->num_tlvs); +// +// // Allocate the TLVs +// cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, sizeof(uint8_t *)); +// if (!cmdu_data->tlvs) { +// goto error; +// } +// // Define the TLVs +// /* Timestamp */ +// p = agent_gen_timestamp_tlv(a); +// if (!p) +// goto error; +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; +// trace("|%s:%d| Added %s\n", __func__, __LINE__, map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1])); +// +// /* Channel scan result */ +// for (m = 0; m < query->nbr_radios; m++) { +// // dbg("\tMID: %d Radio_id in %d iteration: +// // " MACFMT "\n", cmdu->message_id, m, MAC2STR(query->radio_data[m].radio_id)); +// radio_index = wifi_get_radio_index_by_mac(a, query->radio_data[m].radio_id); +// /* Success scan */ +// if (a->status_code == CH_SCAN_STATUS_SUCCESS) { +// /* All channels scan */ +// if (query->radio_data[m].nbr_op_class == 0 || query->radio_data[m].op_class_data->nbr_ch == 0) { +// for (i = 0; i < radio[radio_index].scanlist->num_opclass_scanned; i++) { +// if (radio[radio_index].scanlist->opclass_scanlist[i].bandwidth == 20) { +// for (j = 0; j < radio[radio_index].scanlist->opclass_scanlist[i].num_channels_scanned; j++) { +// opclass_index = i; +// channel_index = j; +// p1 = agent_gen_ch_scan_respons_tlv(a, radio_index, opclass_index, channel_index); +// if (!p1) +// goto error; +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p1; +// trace("|%s:%d| Added %s for channel %d\n", __func__, __LINE__, map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1]), +// radio[radio_index].scanlist->opclass_scanlist[i].channel_scanlist[j].channel); +// } +// } +// } +// /* Specified channels */ +// } else { +// for (k = 0; k < query->radio_data[m].op_class_data->nbr_ch; k++) { +// query_channel = query->radio_data[m].op_class_data->ch[k]; +// for (i = 0; i < radio[radio_index].scanlist->num_opclass_scanned; i++) { +// for (j = 0; j < radio[radio_index].scanlist->opclass_scanlist[i].num_channels_scanned; j++) { +// if (radio[radio_index].scanlist->opclass_scanlist[i].channel_scanlist[j].channel == query_channel) { +// opclass_index = i; +// channel_index = j; +// p1 = agent_gen_ch_scan_respons_tlv(a, radio_index, opclass_index, channel_index); +// if (!p1) +// goto error; +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p1; +// trace("|%s:%d| Added %s for channel %d\n", __func__, __LINE__, map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1]), +// radio[radio_index].scanlist->opclass_scanlist[i].channel_scanlist[j].channel); +// goto found; +// } +// } +// } +//found: +// continue; +// } +// } +// /* Non-success scan */ +// } else { +// for (k = 0; k < query->radio_data[m].op_class_data->nbr_ch; k++) { +// query_channel = query->radio_data[m].op_class_data->ch[k]; +// p1 = agent_gen_non_success_ch_scan_respons_tlv(a, radio_index, 0, query_channel); +// if (!p1) +// goto error; +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p1; +// trace("|%s:%d| Added %s for channel %d\n", __func__, __LINE__, map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1]), +// query_channel); +// } +// } +// } +// return cmdu_data; +//error: +// dbg("|%s:%d| out of memory!\n", __func__, __LINE__); +// map_free_cmdu(cmdu_data); +// return NULL; } - - - -struct cmdu_cstruct *agent_gen_bk_caps_response(struct agent *a, - struct cmdu_cstruct *cmdu) +struct cmdu_buff *agent_gen_bk_caps_response(struct agent *a, + struct cmdu_buff *cmdu) { - struct cmdu_cstruct *cmdu_data; - struct tlv_backhaul_sta_radio_cap *p; - uint16_t tlv_index = 0; - uint32_t i; - - // Allocate the cmdu - cmdu_data = (struct cmdu_cstruct *)calloc(1, - sizeof(struct cmdu_cstruct)); - if (!cmdu_data) { - dbg("Out of memory!\n"); - return NULL; - } - // Define the cmdu - cmdu_data->message_type = CMDU_BACKHAUL_STA_CAPABILITY_REPORT; - cmdu_data->message_id = cmdu->message_id; - strcpy(cmdu_data->intf_name, cmdu->intf_name); - memcpy(cmdu_data->origin, cmdu->origin, 6); - cmdu_data->num_tlvs = a->num_radios; - trace("Number of tlvs: %d\n", cmdu_data->num_tlvs); - - // Allocate the TLVs - cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, sizeof(uint8_t *)); - if (!cmdu_data->tlvs) - goto error; - - // Define the TLVs - for (i = 0; i < a->num_radios; i++) { - /* Backhaul STA radio capabilities TLV */ - p = agent_gen_bk_sta_radio_cap_tlv(a, i); - if (!p) - goto error; - - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; - trace("|%s:%d| Added %s\n", __func__, __LINE__, - map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1])); - } - return cmdu_data; -error: - map_free_cmdu(cmdu_data); return NULL; +// struct cmdu_cstruct *cmdu_data; +// struct tlv_backhaul_sta_radio_cap *p; +// uint16_t tlv_index = 0; +// uint32_t i; +// +// // Allocate the cmdu +// cmdu_data = (struct cmdu_cstruct *)calloc(1, +// sizeof(struct cmdu_cstruct)); +// if (!cmdu_data) { +// dbg("Out of memory!\n"); +// return NULL; +// } +// // Define the cmdu +// cmdu_data->message_type = CMDU_BACKHAUL_STA_CAPABILITY_REPORT; +// cmdu_data->message_id = cmdu->message_id; +// strcpy(cmdu_data->intf_name, cmdu->intf_name); +// memcpy(cmdu_data->origin, cmdu->origin, 6); +// cmdu_data->num_tlvs = a->num_radios; +// trace("Number of tlvs: %d\n", cmdu_data->num_tlvs); +// +// // Allocate the TLVs +// cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, sizeof(uint8_t *)); +// if (!cmdu_data->tlvs) +// goto error; +// +// // Define the TLVs +// for (i = 0; i < a->num_radios; i++) { +// /* Backhaul STA radio capabilities TLV */ +// p = agent_gen_bk_sta_radio_cap_tlv(a, i); +// if (!p) +// goto error; +// +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; +// trace("|%s:%d| Added %s\n", __func__, __LINE__, +// map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1])); +// } +// return cmdu_data; +//error: +// map_free_cmdu(cmdu_data); +// return NULL; } -struct cmdu_cstruct *agent_gen_topology_notification (struct agent *agent, +struct cmdu_buff *agent_gen_topology_notification (struct agent *agent, uint8_t *mac, uint8_t *bssid, uint8_t assoc_event) { - struct cmdu_cstruct *cmdu_data; - struct agent *a = (struct agent *) agent; - struct tlv_client_assoc_event *p; - uint8_t mcast[6] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x13}; - - - // Allocate the cmdu - cmdu_data = (struct cmdu_cstruct *)calloc(1, - sizeof(struct cmdu_cstruct)); - if (!cmdu_data) { - dbg("Out of memory!\n"); - return NULL; - } - // Define the cmdu - cmdu_data->message_type = CMDU_TYPE_TOPOLOGY_NOTIFICATION; - strcpy(cmdu_data->intf_name, agent->cfg.al_bridge); - memcpy(cmdu_data->origin, mcast, 6); - cmdu_data->num_tlvs = 1; - trace("Number of tlvs: %d\n", cmdu_data->num_tlvs); - - // Allocate the TLVs - cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, sizeof(uint8_t *)); - if (!cmdu_data->tlvs) - goto error; - - // Define the TLVs - /* Client Association Event TLV */ - p = agent_gen_client_assoc_event_tlv(a, mac, bssid, assoc_event); - if (!p) - goto error; - cmdu_data->tlvs[0] = (uint8_t *)p; - trace("|%s:%d| Added %s\n", __func__, __LINE__, - map_stringify_tlv_type(*cmdu_data->tlvs[0])); - return cmdu_data; - -error: - map_free_cmdu(cmdu_data); return NULL; +// struct cmdu_cstruct *cmdu_data; +// struct agent *a = (struct agent *) agent; +// struct tlv_client_assoc_event *p; +// uint8_t mcast[6] = {0x01, 0x80, 0xc2, 0x00, 0x00, 0x13}; +// +// +// // Allocate the cmdu +// cmdu_data = (struct cmdu_cstruct *)calloc(1, +// sizeof(struct cmdu_cstruct)); +// if (!cmdu_data) { +// dbg("Out of memory!\n"); +// return NULL; +// } +// // Define the cmdu +// cmdu_data->message_type = CMDU_TYPE_TOPOLOGY_NOTIFICATION; +// strcpy(cmdu_data->intf_name, agent->cfg.al_bridge); +// memcpy(cmdu_data->origin, mcast, 6); +// cmdu_data->num_tlvs = 1; +// trace("Number of tlvs: %d\n", cmdu_data->num_tlvs); +// +// // Allocate the TLVs +// cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, sizeof(uint8_t *)); +// if (!cmdu_data->tlvs) +// goto error; +// +// // Define the TLVs +// /* Client Association Event TLV */ +// p = agent_gen_client_assoc_event_tlv(a, mac, bssid, assoc_event); +// if (!p) +// goto error; +// cmdu_data->tlvs[0] = (uint8_t *)p; +// trace("|%s:%d| Added %s\n", __func__, __LINE__, +// map_stringify_tlv_type(*cmdu_data->tlvs[0])); +// return cmdu_data; +// +//error: +// map_free_cmdu(cmdu_data); +// return NULL; } -struct cmdu_cstruct *agent_gen_client_disassoc(struct agent *a, +struct cmdu_buff *agent_gen_client_disassoc(struct agent *a, uint8_t *mac, uint8_t *bssid) { - struct cmdu_cstruct *cmdu_data; - struct tlv_sta_mac *p; - struct tlv_reason_code *p1; - struct tlv_assoc_sta_traffic_stats *p2; - uint16_t tlv_index = 0; - - // Allocate the cmdu - cmdu_data = (struct cmdu_cstruct *)calloc(1, - sizeof(struct cmdu_cstruct)); - if (!cmdu_data) { - dbg("Out of memory!\n"); - return NULL; - } - // Define the cmdu - cmdu_data->message_type = CMDU_CLIENT_DISASSOCIATION_STATS; - strcpy(cmdu_data->intf_name, a->cfg.al_bridge); - memcpy(cmdu_data->origin, a->cntlr_almac, 6); - cmdu_data->num_tlvs = 3; - trace("Number of tlvs: %d\n", cmdu_data->num_tlvs); - - // Allocate the TLVs - cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, sizeof(uint8_t *)); - if (!cmdu_data->tlvs) - goto error; - - // Define the TLVs - /* STA MAC Address TLV */ - p = agent_gen_sta_mac_tlv(a, mac); - if (!p) - goto error; - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; - trace("|%s:%d| Added %s\n", __func__, __LINE__, - map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1])); - /* Reason Code TLV */ - p1 = agent_gen_reason_code_tlv(a); - if (!p1) - goto error; - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p1; - trace("|%s:%d| Added %s\n", __func__, __LINE__, - map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1])); - /* Associated STA Traffic Stats TLV */ - p2 = agent_gen_assoc_sta_traffic_stats_tlv(a, mac); - if (!p2) - goto error; - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p2; - trace("|%s:%d| Added %s\n", __func__, __LINE__, - map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1])); - return cmdu_data; - -error: - map_free_cmdu(cmdu_data); return NULL; +// struct cmdu_cstruct *cmdu_data; +// struct tlv_sta_mac *p; +// struct tlv_reason_code *p1; +// struct tlv_assoc_sta_traffic_stats *p2; +// uint16_t tlv_index = 0; +// +// // Allocate the cmdu +// cmdu_data = (struct cmdu_cstruct *)calloc(1, +// sizeof(struct cmdu_cstruct)); +// if (!cmdu_data) { +// dbg("Out of memory!\n"); +// return NULL; +// } +// // Define the cmdu +// cmdu_data->message_type = CMDU_CLIENT_DISASSOCIATION_STATS; +// strcpy(cmdu_data->intf_name, a->cfg.al_bridge); +// memcpy(cmdu_data->origin, a->cntlr_almac, 6); +// cmdu_data->num_tlvs = 3; +// trace("Number of tlvs: %d\n", cmdu_data->num_tlvs); +// +// // Allocate the TLVs +// cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, sizeof(uint8_t *)); +// if (!cmdu_data->tlvs) +// goto error; +// +// // Define the TLVs +// /* STA MAC Address TLV */ +// p = agent_gen_sta_mac_tlv(a, mac); +// if (!p) +// goto error; +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; +// trace("|%s:%d| Added %s\n", __func__, __LINE__, +// map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1])); +// /* Reason Code TLV */ +// p1 = agent_gen_reason_code_tlv(a); +// if (!p1) +// goto error; +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p1; +// trace("|%s:%d| Added %s\n", __func__, __LINE__, +// map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1])); +// /* Associated STA Traffic Stats TLV */ +// p2 = agent_gen_assoc_sta_traffic_stats_tlv(a, mac); +// if (!p2) +// goto error; +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p2; +// trace("|%s:%d| Added %s\n", __func__, __LINE__, +// map_stringify_tlv_type(*cmdu_data->tlvs[tlv_index-1])); +// return cmdu_data; +// +//error: +// map_free_cmdu(cmdu_data); +// return NULL; } /* TODO: This function should not be needed once extension is hooked into new diff --git a/src/core/agent_cmdu_generator.h b/src/core/agent_cmdu_generator.h index ef819f8c0a9047e32ea722bdc1d8def0c49b41a5..8e614ab6277e95bbf80ee68d2b5c3f01040779a5 100644 --- a/src/core/agent_cmdu_generator.h +++ b/src/core/agent_cmdu_generator.h @@ -10,23 +10,24 @@ #ifndef AGENT_CMDU_GEN_H #define AGENT_CMDU_GEN_H -struct cmdu_cstruct *agent_gen_ap_autoconfig_search(struct agent *a, +struct cmdu_buff *agent_gen_ap_autoconfig_search(struct agent *a, struct wifi_radio_element *radio, char *intf_name, uint8_t profile); -struct cmdu_cstruct *agent_gen_ap_metrics_response(struct agent *a, - struct cmdu_cstruct *rec_cmdu); -struct cmdu_cstruct *agent_gen_assoc_sta_metric_response_per_intf( +struct cmdu_buff *agent_gen_ap_metrics_response(struct agent *a, + struct cmdu_buff *rec_cmdu); +struct cmdu_buff *agent_gen_assoc_sta_metric_response_per_intf( struct agent *a, char *ifname); -struct cmdu_cstruct *agent_gen_assoc_sta_metric_response( - struct agent *a, struct cmdu_cstruct *rec_cmdu); -struct cmdu_cstruct *agent_gen_tunneled_msg(struct agent *a, uint8_t protocol, +struct cmdu_buff *agent_gen_assoc_sta_metric_response( + struct agent *a, struct cmdu_buff *rec_cmdu); +struct cmdu_buff *agent_gen_tunneled_msg(struct agent *a, uint8_t protocol, uint8_t *sta, int frame_len, uint8_t *frame_body); -struct cmdu_cstruct *agent_gen_vendor_specific_cmdu(struct agent *a, uint8_t *origin, uint8_t depth); -struct cmdu_cstruct *agent_gen_ch_scan_response(struct agent *a, - struct cmdu_cstruct *cmdu); -struct cmdu_cstruct *agent_gen_bk_caps_response(struct agent *a, - struct cmdu_cstruct *cmdu); -struct cmdu_cstruct *agent_gen_topology_notification (struct agent *agent, +struct cmdu_buff *agent_gen_vendor_specific_cmdu(struct agent *a, uint8_t *origin, uint8_t depth); +struct cmdu_buff *agent_gen_ch_scan_response(struct agent *a, + struct cmdu_buff *cmdu); +struct cmdu_buff *agent_gen_bk_caps_response(struct agent *a, + struct cmdu_buff *cmdu); +struct cmdu_buff *agent_gen_topology_notification (struct agent *agent, uint8_t *mac, uint8_t *bssid, uint8_t assoc_event); - +struct cmdu_buff *agent_gen_ap_autoconfig_wsc(struct agent *a, struct cmdu_buff *rec_cmdu, + struct wifi_radio_element *radio, uint16_t mid); #endif diff --git a/src/core/agent_map.c b/src/core/agent_map.c index 17c5e3d8ed538b151b9c6f8c0d64f4523537e52c..c7cc8680972aa9c41ae46dd1595f2819bac4c00e 100644 --- a/src/core/agent_map.c +++ b/src/core/agent_map.c @@ -37,7 +37,15 @@ #include <uci.h> -#include "map_module.h" +#include <i1905_wsc.h> +#include <timer_impl.h> +#include <cmdu.h> +#include <1905_tlvs.h> +#include <map22.h> +#include <easy/easy.h> +#include <map_module22.h> + +//#include "map_module.h" #include "utils.h" #include "debug.h" #include "liblist.h" @@ -47,15 +55,10 @@ #include "msgqueue.h" #include "worker.h" #include "agent.h" -//#include "platform_interfaces.h" -#include <map1905/map2.h> -#include <map1905/maputils.h> -#include <wsc.h> - -#include "agent_tlv_generator.h" #include "agent_cmdu_generator.h" + #define UBUS_TIMEOUT 1000 /* TODO/FIXME: hardcoded 5 sec */ @@ -74,37 +77,16 @@ struct sta_error_response { uint8_t response; }; -#define for_each_tlv(e, _buf, _len) \ -for ((e) = (struct tlv *)(_buf); \ - (e)->len && (_buf) + (_len) - (uint8_t *)(e) - 3 - (e)->len >= 0; \ - (e) = (struct tlv *)(_buf + 3 + (e)->len)) - -struct tlv { - uint8_t type; - uint16_t len; - uint8_t value[]; -} __attribute__ ((packed)); - +typedef int (*map_cmdu_handler_t)(void *agent, struct cmdu_buff *cmdu); +typedef int (*map_cmdu_sendfunc_t)(void *agent, struct cmdu_buff *cmdu); -typedef int (*map_cmdu_handler_t)(void *agent, struct cmdu_cstruct *cmdu); -typedef int (*map_cmdu_sendfunc_t)(void *agent, struct cmdu_cstruct *cmdu); - -uint16_t agent_send_cmdu(struct agent *a, struct cmdu_cstruct *cmdu); -int agent_transition_sta(struct agent *a, struct tlv_steer_Req *p, struct netif_fh *fh, +uint16_t agent_send_cmdu(struct agent *a, struct cmdu_buff *cmdu); +int agent_transition_sta(struct agent *a, uint8_t *p, struct netif_fh *fh, int l, int m); -uint8_t *extract_tlv_by_type(struct cmdu_cstruct *cmdu, uint8_t tlv_type) +uint8_t *extract_tlv_by_type(struct cmdu_buff *cmdu, uint8_t tlv_type) { - uint8_t *tlv; - int i; - - for (i = 0; i < cmdu->num_tlvs; i++) { - tlv = cmdu->tlvs[i]; - if (*tlv == tlv_type) - return tlv; - } - - return NULL; + return 0; } @@ -123,208 +105,208 @@ static struct netif_fh *get_netif_by_bssid(struct agent *a, uint8_t *bssid) return NULL; } -int build_ap_autoconfig_wsc(void *agent, struct cmdu_cstruct *rec_cmdu, +int build_ap_autoconfig_wsc(void *agent, struct cmdu_buff *rx_cmdu, struct wifi_radio_element *radio, int idx) { - struct agent *a = (struct agent *) agent; - struct cmdu_cstruct *cmdu; - struct tlv_ap_radio_basic_cap *p; - struct tlv_profile2_ap_cap *p1; - struct tlv_ap_radio_adv_cap *p2; - struct tlv_wsc *p3; - int tlv_index = 0; - uint16_t wsc_mid; - - /* don't trigger autoconfig for bSTA radios */ - //if (radio->onboarded) - // return -1; - - cmdu = (struct cmdu_cstruct *)calloc(1, sizeof(struct cmdu_cstruct)); - if (!cmdu) { - fprintf(stderr, "failed to malloc cmdu\n"); - return -1; - } - - memcpy(cmdu->origin, rec_cmdu->origin, 6); - cmdu->message_type = CMDU_TYPE_AP_AUTOCONFIGURATION_WSC; - strncpy(cmdu->intf_name, rec_cmdu->intf_name, - sizeof(cmdu->intf_name) - 1); - - p = agent_gen_ap_radio_basic_cap(a, cmdu, radio); - if (!p) - goto fail_cmdu; - cmdu->num_tlvs++; - - p1 = agent_gen_profile2_ap_cap(a); - if (!p1) - goto fail_p; - cmdu->num_tlvs++; - - p2 = agent_gen_ap_radio_adv_cap(a, cmdu, radio); - if (!p2) - goto fail_p1; - cmdu->num_tlvs++; - - p3 = agent_gen_wsc(a, cmdu, radio); - if (!p3) - goto fail_p2; - cmdu->num_tlvs++; - - cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); - if (!cmdu->tlvs) - goto fail_p3; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p; - cmdu->tlvs[tlv_index++] = (uint8_t *)p1; - cmdu->tlvs[tlv_index++] = (uint8_t *)p2; - cmdu->tlvs[tlv_index++] = (uint8_t *)p3; - // TODO: ff:ff:ff:ff:ff:ff = send to all agents - - agent_send_cmdu(a, cmdu); - wsc_mid = agent_send_cmdu(a, cmdu); - if (wsc_mid >= 0) - radio->wsc_mid = wsc_mid; - map_free_cmdu(cmdu); - return 0; -fail_p3: - map_free_tlv_cstruct((uint8_t *) p3); -fail_p2: - map_free_tlv_cstruct((uint8_t *) p2); -fail_p1: - map_free_tlv_cstruct((uint8_t *) p1); -fail_p: - map_free_tlv_cstruct((uint8_t *) p); -fail_cmdu: - free(cmdu); - return -1; -} - -int send_topology_notification(void *agent, struct cmdu_cstruct *cmdu) + trace("agent: %s: --->\n", __func__); + return 0; +// struct agent *a = (struct agent *) agent; +// struct cmdu_buff *cmdu; +// struct tlv_ap_radio_basic_cap *p; +// struct tlv_profile2_ap_cap *p1; +// struct tlv_ap_radio_adv_cap *p2; +// struct tlv_wsc *p3; +// int tlv_index = 0; +// +// /* don't trigger autoconfig for bSTA radios */ +// //if (radio->onboarded) +// // return -1; +// +// cmdu = (struct cmdu_buff *)calloc(1, sizeof(struct cmdu_buff)); +// if (!cmdu) { +// fprintf(stderr, "failed to malloc cmdu\n"); +// return -1; +// } +// +// memcpy(cmdu->origin, rx_cmdu->origin, 6); +// cmdu->message_type = CMDU_TYPE_AP_AUTOCONFIGURATION_WSC; +// strncpy(cmdu->intf_name, rx_cmdu->intf_name, +// sizeof(cmdu->intf_name) - 1); +// +// p = agent_gen_ap_radio_basic_cap(a, cmdu, radio); +// if (!p) +// goto fail_cmdu; +// cmdu->num_tlvs++; +// +// p1 = agent_gen_profile2_ap_cap(a); +// if (!p1) +// goto fail_p; +// cmdu->num_tlvs++; +// +// p2 = agent_gen_ap_radio_adv_cap(a, cmdu, radio); +// if (!p2) +// goto fail_p1; +// cmdu->num_tlvs++; +// +// p3 = agent_gen_wsc(a, cmdu, radio); +// if (!p3) +// goto fail_p2; +// cmdu->num_tlvs++; +// +// cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); +// if (!cmdu->tlvs) +// goto fail_p3; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p; +// cmdu->tlvs[tlv_index++] = (uint8_t *)p1; +// cmdu->tlvs[tlv_index++] = (uint8_t *)p2; +// cmdu->tlvs[tlv_index++] = (uint8_t *)p3; +// // TODO: ff:ff:ff:ff:ff:ff = send to all agents +// +// agent_send_cmdu(a, cmdu); +// map_free_cmdu(cmdu); +// return 0; +//fail_p3: +// map_free_tlv_cstruct((uint8_t *) p3); +//fail_p2: +// map_free_tlv_cstruct((uint8_t *) p2); +//fail_p1: +// map_free_tlv_cstruct((uint8_t *) p1); +//fail_p: +// map_free_tlv_cstruct((uint8_t *) p); +//fail_cmdu: +// free(cmdu); +// return -1; +} + +int send_topology_notification(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_topology_query(void *agent, struct cmdu_cstruct *cmdu) +int send_topology_query(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_topology_response(void *agent, struct cmdu_cstruct *cmdu) +int send_topology_response(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_ap_autoconfig_search(void *agent, struct cmdu_cstruct *cmdu) +int send_ap_autoconfig_search(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_ap_autoconfig_response(void *agent, struct cmdu_cstruct *cmdu) +int send_ap_autoconfig_response(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_ap_autoconfig_wsc(void *agent, struct cmdu_cstruct *cmdu) +int send_ap_autoconfig_wsc(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_1905_ack(void *agent, struct cmdu_cstruct *cmdu) +int send_1905_ack(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_ap_caps_report(void *agent, struct cmdu_cstruct *cmdu) +int send_ap_caps_report(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_channel_pref_report(void *agent, struct cmdu_cstruct *cmdu) +int send_channel_pref_report(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_oper_channel_report(void *agent, struct cmdu_cstruct *rec_cmdu) +int send_oper_channel_report(void *agent, struct cmdu_buff *rx_cmdu) { trace("agent: %s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - uint16_t tlv_index = 0; - uint32_t j; - struct cmdu_cstruct *cmdu_data; - int ret = 0; - - cmdu_data = (struct cmdu_cstruct *)calloc(1, - sizeof(struct cmdu_cstruct)); - - if (!cmdu_data) { - fprintf(stderr, "Out of memory!\n"); - return -1; - } - - cmdu_data->message_type = CMDU_OPERATING_CHANNEL_REPORT; - memcpy(cmdu_data->origin, rec_cmdu->origin, 6); - cmdu_data->message_id = 10; - strcpy(cmdu_data->intf_name, rec_cmdu->intf_name); - - cmdu_data->num_tlvs = 1 * a->num_radios; /* (Operating Channel report) */ - cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, - sizeof(uint8_t *)); - if (!cmdu_data->tlvs) { - map_free_cmdu(cmdu_data); - return -1; - } - - /* Operating Channel Report TLV 17.2.17 */ - for (j = 0; j < a->num_radios; j++) { - struct tlv_oper_ch_report *p = - p = agent_gen_operate_channel_report(a, rec_cmdu, j); - if (!p) - continue; - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; - } - - ret = agent_send_cmdu(a, cmdu_data); - map_free_cmdu(cmdu_data); - - return ret; + return 0; +// struct agent *a = (struct agent *) agent; +// uint16_t tlv_index = 0; +// uint32_t j; +// struct cmdu_cstruct *cmdu_data; +// int ret = 0; +// +// cmdu_data = (struct cmdu_cstruct *)calloc(1, +// sizeof(struct cmdu_cstruct)); +// +// if (!cmdu_data) { +// fprintf(stderr, "Out of memory!\n"); +// return -1; +// } +// +// cmdu_data->message_type = CMDU_OPERATING_CHANNEL_REPORT; +// memcpy(cmdu_data->origin, rx_cmdu->origin, 6); +// cmdu_data->message_id = 10; +// strcpy(cmdu_data->intf_name, rx_cmdu->intf_name); +// +// cmdu_data->num_tlvs = 1 * a->num_radios; /* (Operating Channel report) */ +// cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, +// sizeof(uint8_t *)); +// if (!cmdu_data->tlvs) { +// map_free_cmdu(cmdu_data); +// return -1; +// } +// +// /* Operating Channel Report TLV 17.2.17 */ +// for (j = 0; j < a->num_radios; j++) { +// struct tlv_oper_ch_report *p = +// p = agent_gen_operate_channel_report(a, rx_cmdu, j); +// if (!p) +// continue; +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; +// } +// +// ret = agent_send_cmdu(a, cmdu_data); +// map_free_cmdu(cmdu_data); +// +// return ret; } int send_sta_steer_complete(void *agent, uint8_t *origin, const char *intf_name) { trace("agent: %s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - struct cmdu_cstruct *cmdu_data; - int ret = 0; - - cmdu_data = (struct cmdu_cstruct *)calloc(1, - sizeof(struct cmdu_cstruct)); - if (!cmdu_data) { - fprintf(stderr, "Out of memory!\n"); - return -1; - } - - cmdu_data->message_type = CMDU_STEERING_COMPLETED; - memcpy(cmdu_data->origin, origin, 6); - //cmdu_data->message_id = 19; - strcpy(cmdu_data->intf_name, intf_name); - - cmdu_data->num_tlvs = 0; /* (No TLVs) */ - if (a->is_sta_steer_start) { - /** - * Here we are sending the steering completed message - * so we need to reset all the values of the - * steering opportunity - */ - a->is_sta_steer_start = 0; - a->sta_steerlist_count = 0; - memset(a->sta_steer_list, 0, sizeof(a->sta_steer_list)); - /* stop the timer if it is running */ - uloop_timeout_cancel(&a->sta_steer_req_timer); - } - - agent_send_cmdu(a, cmdu_data); - map_free_cmdu(cmdu_data); - return ret; + return 0; +// struct agent *a = (struct agent *) agent; +// struct cmdu_cstruct *cmdu_data; +// int ret = 0; +// +// cmdu_data = (struct cmdu_cstruct *)calloc(1, +// sizeof(struct cmdu_cstruct)); +// if (!cmdu_data) { +// fprintf(stderr, "Out of memory!\n"); +// return -1; +// } +// +// cmdu_data->message_type = CMDU_STEERING_COMPLETED; +// memcpy(cmdu_data->origin, origin, 6); +// //cmdu_data->message_id = 19; +// strcpy(cmdu_data->intf_name, intf_name); +// +// cmdu_data->num_tlvs = 0; /* (No TLVs) */ +// if (a->is_sta_steer_start) { +// /** +// * Here we are sending the steering completed message +// * so we need to reset all the values of the +// * steering opportunity +// */ +// a->is_sta_steer_start = 0; +// a->sta_steerlist_count = 0; +// memset(a->sta_steer_list, 0, sizeof(a->sta_steer_list)); +// /* stop the timer if it is running */ +// uloop_timeout_cancel(&a->sta_steer_req_timer); +// } +// +// agent_send_cmdu(a, cmdu_data); +// map_free_cmdu(cmdu_data); +// return ret; } int send_steer_btm_report(void *agent, uint8_t *origin, const char *intf_name, @@ -333,144 +315,145 @@ int send_steer_btm_report(void *agent, uint8_t *origin, const char *intf_name, { trace("agent: %s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - uint16_t tlv_index = 0; - struct cmdu_cstruct *cmdu_data; - int ret = 0, all_complete = 1; - - cmdu_data = (struct cmdu_cstruct *)calloc(1, - sizeof(struct cmdu_cstruct)); - - if (!cmdu_data) { - fprintf(stderr, "Out of memory!\n"); - return -1; - } - - cmdu_data->message_type = CMDU_CLIENT_STEERING_BTM_REPORT; - memcpy(cmdu_data->origin, origin, 6); - //cmdu_data->message_id = 15; - strcpy(cmdu_data->intf_name, intf_name); - - cmdu_data->num_tlvs = 1; /* (Steering BTM report) */ - cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, - sizeof(uint8_t *)); - - if (!cmdu_data->tlvs) { - map_free_cmdu(cmdu_data); - return -1; - } - - /* Clent Steering BTM Report TLV 17.2.30 */ - struct tlv_steer_btm_report *p = - p = agent_gen_steer_btm_report(a, target_bssid, - src_bssid, sta, status_code); - if (!p) { - map_free_cmdu(cmdu_data); - return -1; - } - - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; - - ret = agent_send_cmdu(a, cmdu_data); - map_free_cmdu(cmdu_data); - - trace("is_steer is %d steer count %d\n", - a->is_sta_steer_start, a->sta_steerlist_count); - - /** - * Check that the report is sent for a steering opportunity. - * Here we store the status in the sta list and check - * if the steering completed message can be sent - */ - if (a->is_sta_steer_start) { - int i; - - /* iterate list of clients attempted to be steered */ - for (i = 0; i < a->sta_steerlist_count; i++) { - - /* mark all steered clients as completed */ - ret = memcmp(sta, a->sta_steer_list[i].sta_mac, 6); - if (ret == 0) - a->sta_steer_list[i].complete = 1; - } - - /** - * Now we need to check if the steering completed - * message can be sent - */ - for (i = 0; i < a->sta_steerlist_count; i++) { - if (a->sta_steer_list[i].complete != 1) { - all_complete = 0; - break; - } - } - - if (all_complete) { - /* Here we need to send the steering completed CMDU */ - send_sta_steer_complete(agent, origin, intf_name); - } - } - - return ret; -} - -int send_sta_caps_report(void *agent, struct cmdu_cstruct *cmdu) + return 0; +// struct agent *a = (struct agent *) agent; +// uint16_t tlv_index = 0; +// struct cmdu_cstruct *cmdu_data; +// int ret = 0, all_complete = 1; +// +// cmdu_data = (struct cmdu_cstruct *)calloc(1, +// sizeof(struct cmdu_cstruct)); +// +// if (!cmdu_data) { +// fprintf(stderr, "Out of memory!\n"); +// return -1; +// } +// +// cmdu_data->message_type = CMDU_CLIENT_STEERING_BTM_REPORT; +// memcpy(cmdu_data->origin, origin, 6); +// //cmdu_data->message_id = 15; +// strcpy(cmdu_data->intf_name, intf_name); +// +// cmdu_data->num_tlvs = 1; /* (Steering BTM report) */ +// cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, +// sizeof(uint8_t *)); +// +// if (!cmdu_data->tlvs) { +// map_free_cmdu(cmdu_data); +// return -1; +// } +// +// /* Clent Steering BTM Report TLV 17.2.30 */ +// struct tlv_steer_btm_report *p = +// p = agent_gen_steer_btm_report(a, target_bssid, +// src_bssid, sta, status_code); +// if (!p) { +// map_free_cmdu(cmdu_data); +// return -1; +// } +// +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; +// +// ret = agent_send_cmdu(a, cmdu_data); +// map_free_cmdu(cmdu_data); +// +// trace("is_steer is %d steer count %d\n", +// a->is_sta_steer_start, a->sta_steerlist_count); +// +// /** +// * Check that the report is sent for a steering opportunity. +// * Here we store the status in the sta list and check +// * if the steering completed message can be sent +// */ +// if (a->is_sta_steer_start) { +// int i; +// +// /* iterate list of clients attempted to be steered */ +// for (i = 0; i < a->sta_steerlist_count; i++) { +// +// /* mark all steered clients as completed */ +// ret = memcmp(sta, a->sta_steer_list[i].sta_mac, 6); +// if (ret == 0) +// a->sta_steer_list[i].complete = 1; +// } +// +// /** +// * Now we need to check if the steering completed +// * message can be sent +// */ +// for (i = 0; i < a->sta_steerlist_count; i++) { +// if (a->sta_steer_list[i].complete != 1) { +// all_complete = 0; +// break; +// } +// } +// +// if (all_complete) { +// /* Here we need to send the steering completed CMDU */ +// send_sta_steer_complete(agent, origin, intf_name); +// } +// } +// +// return ret; +} + +int send_sta_caps_report(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_ap_metrics_response(void *agent, struct cmdu_cstruct *cmdu) +int send_ap_metrics_response(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_sta_link_metrics_response(void *agent, struct cmdu_cstruct *cmdu) +int send_sta_link_metrics_response(void *agent, struct cmdu_buff *cmdu) { return 0; } int send_unassoc_sta_link_metrics_response(void *agent, - struct cmdu_cstruct *cmdu) + struct cmdu_buff *cmdu) { return 0; } -int send_beacon_metrics_response(void *agent, struct cmdu_cstruct *cmdu) +int send_beacon_metrics_response(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_backhaul_sta_steer_response(void *agent, struct cmdu_cstruct *cmdu) +int send_backhaul_sta_steer_response(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_channel_scan_report(void *agent, struct cmdu_cstruct *cmdu) +int send_channel_scan_report(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_sta_disassoc_stats(void *agent, struct cmdu_cstruct *cmdu) +int send_sta_disassoc_stats(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_assoc_status_notification(void *agent, struct cmdu_cstruct *cmdu) +int send_assoc_status_notification(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_tunneled_message(void *agent, struct cmdu_cstruct *cmdu) +int send_tunneled_message(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_backhaul_sta_caps_report(void *agent, struct cmdu_cstruct *cmdu) +int send_backhaul_sta_caps_report(void *agent, struct cmdu_buff *cmdu) { return 0; } -int send_failed_connection_msg(void *agent, struct cmdu_cstruct *cmdu) +int send_failed_connection_msg(void *agent, struct cmdu_buff *cmdu) { return 0; } @@ -507,7 +490,7 @@ static const map_cmdu_sendfunc_t agent_maptxftable[] = { }; -int handle_topology_discovery(void *agent, struct cmdu_cstruct *cmdu) +int handle_topology_discovery(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); struct agent *a = (struct agent *) agent; @@ -524,13 +507,13 @@ int handle_topology_discovery(void *agent, struct cmdu_cstruct *cmdu) return 0; } -int handle_topology_notification(void *agent, struct cmdu_cstruct *cmdu) +int handle_topology_notification(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); return 0; } -int handle_topology_query(void *agent, struct cmdu_cstruct *cmdu) +int handle_topology_query(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); struct cmdu_cstruct *response; @@ -549,14 +532,14 @@ int handle_topology_query(void *agent, struct cmdu_cstruct *cmdu) return 0; } -int handle_topology_response(void *agent, struct cmdu_cstruct *cmdu) +int handle_topology_response(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); return 0; } -int handle_vendor_specific(void *agent, struct cmdu_cstruct *rec_cmdu) +int handle_vendor_specific(void *agent, struct cmdu_buff *rx_cmdu) { trace("%s: --->\n", __func__); #if 0 @@ -627,7 +610,7 @@ int handle_vendor_specific(void *agent, struct cmdu_cstruct *rec_cmdu) #define CTRL_MAC_OLD 0 #define CTRL_MAC_NEW 1 -static int agent_update_controller_data(struct agent *a, struct cmdu_cstruct *cmdu) +static int agent_update_controller_data(struct agent *a, struct cmdu_buff *cmdu) { int ret = CTRL_MAC_OLD; char mac_str[18] = {0}; @@ -700,7 +683,7 @@ static void agent_trigger_immediate_acs(struct agent *a) } } -int handle_ap_autoconfig_search(void *agent, struct cmdu_cstruct *cmdu) +int handle_ap_autoconfig_search(void *agent, struct cmdu_buff *cmdu) { struct agent *a = (struct agent *) agent; struct tlv_supp_service *supp_serv; @@ -782,50 +765,75 @@ static void agent_reschedule_heartbeat_acs(struct agent *a) (a->acs_interval - elapsed) * 1000); } -int handle_ap_autoconfig_response(void *agent, struct cmdu_cstruct *cmdu) +int handle_ap_autoconfig_response(void *agent, struct cmdu_buff *rx_cmdu) { trace("agent: %s: --->\n", __func__); struct agent *a = (struct agent *) agent; + struct tlv_policy a_policy[] = { + [0] = { .type = TLV_TYPE_SUPPORTED_ROLE, .present = TLV_PRESENT_ONE }, + [1] = { .type = MAP_TLV_SUPPORTED_SERVICE, .present = TLV_PRESENT_ONE }, + [2] = { .type = MAP_TLV_MULTIAP_PROFILE, .present = TLV_PRESENT_ONE }, + [3] = { .type = TLV_TYPE_SUPPORTED_FREQ_BAND, .present = TLV_PRESENT_ONE } + }; struct wifi_radio_element *radio = NULL; - struct tlv_supp_service *supp_serv; - struct tlv_supported_freq_band *supp_freq; + struct tlv *tv[4][16] = {0}; + char mac_str[18] = {0}; bool cntlr = false; uint8_t band; - int i; + int i, ret; + + ret = cmdu_parse_tlvs(rx_cmdu, tv, a_policy, 4); - trace("%s %d mid = %d\n", __func__, __LINE__, cmdu->message_id); + if (!tv[0][0] || !tv[1][0] || !tv[2][0] || !tv[3][0]) + return -1; /* If MID is not the one we sent, discard response */ for (i = 0; i < a->num_radios; i++) { trace("radio %s has mid %d\n", a->radios[i].name, a->radios[i].mid); - if (a->radios[i].mid != cmdu->message_id) + if (a->radios[i].mid != cmdu_get_mid(rx_cmdu)) continue; radio = &a->radios[i]; break; } - if (!radio) + if (!radio) { + dbg("autoconfig response mid did not match!\n"); return -1; + } - supp_serv = (struct tlv_supp_service *) extract_tlv_by_type(cmdu, - MAP_TLV_SUPPORTED_SERVICE); - if (!supp_serv) - return -1; + if (tv[1][0]->data[0] > 0) { + int i; - for (i = 0; i < supp_serv->supported_services_list; i++) { - if (supp_serv->supported_services[i].service == SUPPORTED_SERVICE_MULTIAP_CONTROLLER) { - cntlr = true; - break; + for (i = 0; i < tv[1][0]->data[0]; i++) { + if (tv[1][0]->data[(i+1)] == SUPPORTED_SERVICE_MULTIAP_CONTROLLER) { + cntlr = true; + break; + } } } - if (!cntlr) { - trace("agent: Autoconfig response was not from controller\n"); + dbg("autoconfig response does not support controller!\n"); return -1; } /* ACS answered - increase ACS interval if needed */ agent_reschedule_heartbeat_acs(a); + dbg("cntlr_almac " MACFMT " origin " MACFMT "\n", + MAC2STR(a->cntlr_almac), MAC2STR(rx_cmdu->origin)); + + if (hwaddr_is_zero(rx_cmdu->origin)) + memcpy(rx_cmdu->origin, a->almac, 6); + + /* if it is a new controller, update cntlr_almac and uci */ + if (memcmp(a->cntlr_almac, rx_cmdu->origin, 6)) { + dbg("%s %d\n", __func__, __LINE__); + memcpy(a->cntlr_almac, rx_cmdu->origin, 6); + if (!hwaddr_ntoa(a->cntlr_almac, mac_str)) + return -1; + dbg("%s %d\n", __func__, __LINE__); + /* set self as root node, used for loop detection */ + if (!memcmp(a->cntlr_almac, a->almac, 6)) + a->depth = 0; if (agent_update_controller_data(a, cmdu) == CTRL_MAC_NEW) { dbg("|%s:%d| new controller found! Activate ACS configuration"\ @@ -839,23 +847,29 @@ int handle_ap_autoconfig_response(void *agent, struct cmdu_cstruct *cmdu) } if (radio->state == ACS_ACTIVE) { + struct cmdu_buff *resp; + struct tlv_supported_band *data; + if (a->cntlr_select.local == true && memcmp(cmdu->origin, a->almac, 6)) /* local cntlr enforced: don't WSC with non-local one */ return -1; - supp_freq = (struct tlv_supported_freq_band *) extract_tlv_by_type(cmdu, - TLV_TYPE_SUPPORTED_FREQ_BAND); - if (!supp_freq) - return -1; + data = (struct tlv_supported_band *) tv[1][0]->data; band = wifi_band_to_ieee1905band(radio->band); - if (band != supp_freq->freq_band) + if (band != data->band) return -1; dbg("|%s:%d| generate wsc for radio %s\n", __func__, __LINE__, radio->name); - build_ap_autoconfig_wsc(a, cmdu, radio, i); + + resp = agent_gen_ap_autoconfig_wsc(a, rx_cmdu, radio, cmdu_get_mid(rx_cmdu)); + if (!resp) + return -1; + + agent_send_cmdu(a, resp); + cmdu_free(resp); } else if (radio->state == ACS_HEARTBEAT) { /* heartbeat from controller - no activity */ dbg("|%s:%d| Received ACS response from controller during"\ @@ -863,6 +877,88 @@ int handle_ap_autoconfig_response(void *agent, struct cmdu_cstruct *cmdu) } return 0; +// struct agent *a = (struct agent *) agent; +// struct wifi_radio_element *radio = NULL; +// struct tlv_supp_service *supp_serv; +// struct tlv_supported_freq_band *supp_freq; +// char mac_str[18] = {0}; +// bool cntlr = false; +// uint8_t band; +// int i; +// +// trace("%s %d mid = %d\n", __func__, __LINE__, cmdu->message_id); +// +// /* If MID is not the one we sent, discard response */ +// for (i = 0; i < a->num_radios; i++) { +// trace("radio %s has mid %d\n", a->radios[i].name, a->radios[i].mid); +// if (a->radios[i].mid != cmdu->message_id) +// continue; +// +// radio = &a->radios[i]; +// break; +// } +// if (!radio) +// return -1; +// +// supp_serv = (struct tlv_supp_service *) extract_tlv_by_type(cmdu, +// MAP_TLV_SUPPORTED_SERVICE); +// if (!supp_serv) +// return -1; +// +// for (i = 0; i < supp_serv->supported_services_list; i++) { +// if (supp_serv->supported_services[i].service == SUPPORTED_SERVICE_MULTIAP_CONTROLLER) { +// cntlr = true; +// break; +// } +// } +// +// if (!cntlr) { +// trace("agent: Autoconfig response was not from controller\n"); +// return -1; +// } +// +// dbg("cntlr_almac " MACFMT " origin " MACFMT "\n", +// MAC2STR(a->cntlr_almac), MAC2STR(cmdu->origin)); +// +// /* if it is a new controller, update cntlr_almac and uci */ +// if (memcmp(a->cntlr_almac, cmdu->origin, 6)) { +// memcpy(a->cntlr_almac, cmdu->origin, 6); +// if (!hwaddr_ntoa(a->cntlr_almac, mac_str)) +// return -1; +// +// /* set self as root node, used for loop detection */ +// if (!memcmp(a->cntlr_almac, a->almac, 6)) +// a->depth = 0; +// +// set_value_by_string("mapagent", "agent", "controller_mac", mac_str, +// UCI_TYPE_STRING); +// dbg("|%s:%d| new controller found! Activate ACS configuration"\ +// " for all radios\n", __func__, __LINE__); +// for (i = 0; i < a->num_radios; i++) +// a->radios[i].state = ACS_ACTIVE; +// } +// +// /* return if it was just heartbeat and no activity */ +// if (radio->state == ACS_HEARTBEAT) { +// /** TODO: active own controller if no controller has been +// * observed for certain time period +// */ +// } else if (radio->state == ACS_ACTIVE) { +// supp_freq = (struct tlv_supported_freq_band *) extract_tlv_by_type(cmdu, +// TLV_TYPE_SUPPORTED_FREQ_BAND); +// if (!supp_freq) +// return -1; +// +// band = wifi_band_to_ieee1905band(radio->band); +// if (band != supp_freq->freq_band) +// return -1; +// +// dbg("|%s:%d| generate wsc for radio %s\n", __func__, __LINE__, +// radio->name); +// build_ap_autoconfig_wsc(a, cmdu, radio, i); +// } +// +// return 0; } static struct wifi_radio_element *wifi_get_radio_by_mac(struct agent *a, @@ -1056,23 +1152,29 @@ char *wifi_gen_first_ifname(struct agent *a, char *device, char *ifname) return NULL; } -int handle_ap_autoconfig_wsc(void *agent, struct cmdu_cstruct *cmdu) +int handle_ap_autoconfig_wsc(void *agent, struct cmdu_buff *rx_cmdu) { struct agent *a = (struct agent *) agent; + struct tlv_policy a_policy[] = { + [0] = { .type = MAP_TLV_DEFAULT_8021Q_SETTINGS, .present = TLV_PRESENT_ONE }, + [1] = { .type = MAP_TLV_TRAFFIC_SEPARATION_POLICY, .present = TLV_PRESENT_ONE }, + [2] = { .type = MAP_TLV_AP_RADIO_IDENTIFIER, .present = TLV_PRESENT_ONE }, + [3] = { .type = TLV_TYPE_WSC, .present = TLV_PRESENT_NUM } + }; uint8_t bssid[6]; - int i; - uint8_t *tlv = NULL; + struct tlv *tlv = NULL; struct wifi_radio_element *radio; - struct tlv_ap_radio_identifier *id_tlv; + struct tlv *tv[4][16] = {0}; + bool agent_found; + int ret = 0, num = 0, i; + trace("%s: --->\n", __func__); - trace("%s %d mid = %d\n", __func__, __LINE__, cmdu->message_id); + ret = cmdu_parse_tlvs(rx_cmdu, tv, a_policy, 4); - id_tlv = (struct tlv_ap_radio_identifier *) extract_tlv_by_type(cmdu, - MAP_TLV_AP_RADIO_IDENTIFIER); - if (!id_tlv) + if (!tv[0][0] || !tv[1][0] || !tv[2][0] || !tv[3][0]) return -1; - memcpy(bssid, id_tlv->radio_id, 6); + memcpy(bssid, tv[2][0]->data, 6); radio = wifi_get_radio_by_mac(a, bssid); if (!radio) @@ -1086,80 +1188,54 @@ int handle_ap_autoconfig_wsc(void *agent, struct cmdu_cstruct *cmdu) wifi_teardown_map_ifaces_by_radio(a, radio->name); - /* iterate every TLV_TYPE_WSC, may be multiple */ - for (i = 0; i < cmdu->num_tlvs; i++) { - tlv = cmdu->tlvs[i]; - switch (*tlv) { - case TLV_TYPE_WSC: { - struct mdata out; - struct tlv_wsc *m2; - char ifname[IFNAMSIZ] = {0}; - int rv; - - m2 = (struct tlv_wsc *) tlv; - - if (!wifi_gen_first_ifname(a, radio->name, ifname)) { - err("Failed to find valid interface name, "\ - "probably maximum number of "\ - "interfaces have been reached\n", - MACFMT "!\n", MAC2STR(bssid)); - return -1; - } + while (tv[3][num]) { + struct wps_credential out = {0}; + char ifname[IFNAMSIZ] = {0}; + int rv; - rv = wscProcessM2((void *) radio->autconfig.key, - radio->autconfig.m1_frame, - radio->autconfig.m1_size, - m2->wsc_frame, - m2->wsc_frame_size, &out, ifname); - if (!rv) { - err("Failed to process M2 target for interface "\ - MACFMT "!\n", MAC2STR(bssid)); - - wifi_teardown_map_ifaces_by_radio(a, - radio->name); - /* Return rather than freeing because it may - * belong to an updated frame - */ - return -1; - } + if (!wifi_gen_first_ifname(a, radio->name, ifname)) { + err("Failed to find valid interface name, probably "\ + "maximum number of interfaces have "\ + "been reached\n", MACFMT "!\n", + MAC2STR(bssid)); + return -1; + } - if (BIT(4, out.output.mapie)) { - err("MAP Extension had teardown bit set, "\ - "tearing down all MAP interfaces"\ - " for bssid" MACFMT "\n", - MAC2STR(bssid)); - wifi_teardown_map_ifaces_by_radio(a, - radio->name); - uci_set_wireless_interface_option("mapagent", - "wifi-radio", "device", - radio->name, "configured", "0"); - goto teardown; - } + ret = wsc_process_m2(radio->autconfig.m1_frame, radio->autconfig.m1_size, + radio->autconfig.key, tv[3][num]->data, tlv_length(tv[3][num]), + &out); + if (ret) { + err("Failed to process M2 target for interface "\ + MACFMT "!\n", MAC2STR(bssid)); - rv = uci_apply_m2(&a->cfg, ifname, radio->name, - out.output.ssid, out.output.auth_types, - out.output.encryption_types, - out.output.network_key, - out.output.mapie, radio->band, - out.output.bridge, out.output.proto, - out.output.vid, out.output.br_ip, - out.output.bk_ssid, out.output.bk_key, - radio->onboarded); - if (rv) { - err("Failure to process M2, tearing down all "\ - " MAP interfaces"\ - " for bssid" MACFMT "\n", - MAC2STR(bssid)); - wifi_teardown_map_ifaces_by_radio(a, - radio->name); - goto teardown; - } + wifi_teardown_map_ifaces_by_radio(a, radio->name); + /* Return rather than freeing because it may belong to + * an updated frame + */ + return -1; + } - break; + if (BIT(4, out.mapie)) { + err("MAP Extension had teardown bit set, tearing down "\ + "all MAP interfaces for bssid " MACFMT \ + "\n", MAC2STR(bssid)); + wifi_teardown_map_ifaces_by_radio(a, radio->name); + uci_set_wireless_interface_option("mapagent", + "wifi-radio", "device", + radio->name, "configured", "0"); + goto teardown; } - default: - break; + + ret = uci_apply_m2(&a->cfg, ifname, radio->name, &out, + radio->onboarded); + if (ret) { + err("Failure to process M2, tearing down all MAP "\ + " interfaces for bssid " MACFMT "\n", + MAC2STR(bssid)); + wifi_teardown_map_ifaces_by_radio(a, radio->name); + goto teardown; } + num++; } uci_set_wireless_interface_option("mapagent", "wifi-radio", "device", @@ -1182,7 +1258,7 @@ teardown: return 0; } -int handle_ap_autoconfig_renew(void *agent, struct cmdu_cstruct *cmdu) +int handle_ap_autoconfig_renew(void *agent, struct cmdu_buff *cmdu) { trace("agent: %s: --->\n", __func__); struct agent *a = (struct agent *) agent; @@ -1194,11 +1270,11 @@ int handle_ap_autoconfig_renew(void *agent, struct cmdu_cstruct *cmdu) /* local cntlr enforced: accept renew from self only */ return -1; - for (i = 0; i < a->num_radios; i++) { - radio = a->radios + i; - build_ap_autoconfig_wsc(a, cmdu, radio, i); - } - +// for (i = 0; i < a->num_radios; i++) { +// radio = a->radios + i; +// build_ap_autoconfig_wsc(a, cmdu, radio, i); +// } +// return 0; } int get_radio_index(struct agent *a, uint8_t *mac) @@ -1245,298 +1321,288 @@ int get_radio_and_bss_index(struct agent *a, uint8_t *bssid, /* ifname: interface name, prepare the query for that specific interface; * ifname: NULL, include all the interface. */ -static struct cmdu_cstruct *prepare_ap_metrics_query( +static struct cmdu_buff *prepare_ap_metrics_query( void *agent, char *ifname) { - trace("%s --->\n", __func__); - int total_bss = 0; - int i, j, k; - int tlv_index = 0; - struct agent *a = (struct agent *)agent; - struct wifi_radio_element *radio; - struct wifi_bss_element *bss; - struct tlv_ap_metric_query *p1; - struct cmdu_cstruct *cmdu; - - cmdu = calloc(1, sizeof(struct cmdu_cstruct)); - if (!cmdu) - return NULL; - - cmdu->message_type = CMDU_AP_METRICS_QUERY; - memcpy(cmdu->origin, a->cntlr_almac, 6); - strncpy(cmdu->intf_name, "br-lan", IFNAMESIZE - 1); - - if (ifname == NULL) { - /* AP Metrics Query TLV */ - cmdu->num_tlvs++; -// #ifdef PROFILE2 - /* AP Radio Identifier TLV */ - cmdu->num_tlvs += a->num_radios; -// #endif - - for (i = 0; i < a->num_radios; i++) - total_bss += a->radios[i].num_bss; - - } else if (ifname && (ifname[0] != '\0')) { - /* AP Metrics Query TLV */ - cmdu->num_tlvs++; -// #ifdef PROFILE2 - /* AP Radio Identifier TLV */ - cmdu->num_tlvs++; -// #endif - - radio = wifi_ifname_to_radio_element(a, ifname); - if (!radio) { - cmdu->num_tlvs = 0; - goto error; - } - - total_bss = radio->num_bss; - } - - cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); - if (!cmdu->tlvs) { - cmdu->num_tlvs = 0; - goto error; - } - - - p1 = calloc(1, sizeof(*p1)); - if (!p1) - goto error; - - p1->tlv_type = MAP_TLV_AP_METRIC_QUERY; - p1->bssid_nr = total_bss; - p1->ap_metric_query_bssid = calloc(p1->bssid_nr, - sizeof(*p1->ap_metric_query_bssid)); - if (!p1->ap_metric_query_bssid) { - free(p1); - goto error; - } - - if (ifname == NULL) { - struct tlv_ap_radio_identifier *p2; - - k = 0; - for (i = 0; i < a->num_radios; i++) { - radio = a->radios + i; -// #ifdef PROFILE2 - p2 = agent_gen_ap_radio_identifier(a, radio->macaddr); - if (p2) - cmdu->tlvs[tlv_index++] = (uint8_t *)p2; -// #endif - - for (j = 0; j < radio->num_bss; j++) { - bss = radio->bsslist + j; - memcpy(p1->ap_metric_query_bssid[k].bssid, - bss->bssid, 6); - k++; - } - } - - } else if (ifname && (ifname[0] != '\0')) { - struct tlv_ap_radio_identifier *p2; - - k = 0; - radio = wifi_ifname_to_radio_element(a, ifname); - if (!radio) { - map_free_tlv_cstruct((uint8_t *)p1); - goto error; - } - -// #ifdef PROFILE2 - p2 = agent_gen_ap_radio_identifier(a, radio->macaddr); - if (p2) - cmdu->tlvs[tlv_index++] = (uint8_t *)p2; -// #endif - - for (i = 0; i < radio->num_bss; i++) { - bss = radio->bsslist + i; - memcpy(p1->ap_metric_query_bssid[k].bssid, - bss->bssid, 6); - k++; - } - - } - - cmdu->tlvs[tlv_index] = (uint8_t *)p1; - - return cmdu; -error: - map_free_cmdu(cmdu); - return NULL; + return 0; +// int total_bss = 0; +// int i, j, k; +// int tlv_index = 0; +// struct agent *a = (struct agent *)agent; +// struct wifi_radio_element *radio; +// struct wifi_bss_element *bss; +// struct tlv_ap_metric_query *p1; +// struct cmdu_cstruct *cmdu; +// +// cmdu = calloc(1, sizeof(struct cmdu_cstruct)); +// if (!cmdu) +// return NULL; +// +// cmdu->message_type = CMDU_AP_METRICS_QUERY; +// memcpy(cmdu->origin, a->cntlr_almac, 6); +// strncpy(cmdu->intf_name, "br-lan", IFNAMESIZE - 1); +// +// if (ifname == NULL) { +// /* AP Metrics Query TLV */ +// cmdu->num_tlvs++; +//// #ifdef PROFILE2 +// /* AP Radio Identifier TLV */ +// cmdu->num_tlvs += a->num_radios; +//// #endif +// +// for (i = 0; i < a->num_radios; i++) +// total_bss += a->radios[i].num_bss; +// +// } else if (ifname && (ifname[0] != '\0')) { +// /* AP Metrics Query TLV */ +// cmdu->num_tlvs++; +//// #ifdef PROFILE2 +// /* AP Radio Identifier TLV */ +// cmdu->num_tlvs++; +//// #endif +// +// radio = wifi_ifname_to_radio_element(a, ifname); +// if (!radio) { +// cmdu->num_tlvs = 0; +// goto error; +// } +// +// total_bss = radio->num_bss; +// } +// +// cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); +// if (!cmdu->tlvs) { +// cmdu->num_tlvs = 0; +// goto error; +// } +// +// +// p1 = calloc(1, sizeof(*p1)); +// if (!p1) +// goto error; +// +// p1->tlv_type = MAP_TLV_AP_METRIC_QUERY; +// p1->bssid_nr = total_bss; +// p1->ap_metric_query_bssid = calloc(p1->bssid_nr, +// sizeof(*p1->ap_metric_query_bssid)); +// if (!p1->ap_metric_query_bssid) { +// free(p1); +// goto error; +// } +// +// if (ifname == NULL) { +// struct tlv_ap_radio_identifier *p2; +// +// k = 0; +// for (i = 0; i < a->num_radios; i++) { +// radio = a->radios + i; +//// #ifdef PROFILE2 +// p2 = agent_gen_ap_radio_identifier(a, radio->macaddr); +// if (p2) +// cmdu->tlvs[tlv_index++] = (uint8_t *)p2; +//// #endif +// +// for (j = 0; j < radio->num_bss; j++) { +// bss = radio->bsslist + j; +// memcpy(p1->ap_metric_query_bssid[k].bssid, +// bss->bssid, 6); +// k++; +// } +// } +// +// } else if (ifname && (ifname[0] != '\0')) { +// struct tlv_ap_radio_identifier *p2; +// +// k = 0; +// radio = wifi_ifname_to_radio_element(a, ifname); +// if (!radio) { +// map_free_tlv_cstruct((uint8_t *)p1); +// goto error; +// } +// +//// #ifdef PROFILE2 +// p2 = agent_gen_ap_radio_identifier(a, radio->macaddr); +// if (p2) +// cmdu->tlvs[tlv_index++] = (uint8_t *)p2; +//// #endif +// +// for (i = 0; i < radio->num_bss; i++) { +// bss = radio->bsslist + i; +// memcpy(p1->ap_metric_query_bssid[k].bssid, +// bss->bssid, 6); +// k++; +// } +// +// } +// +// cmdu->tlvs[tlv_index] = (uint8_t *)p1; +// +// return cmdu; +//error: +// map_free_cmdu(cmdu); +// return NULL; } static int prepare_ap_metrics_response(void *agent, - struct cmdu_cstruct *rec_cmdu) + struct cmdu_buff *rx_cmdu) { trace("%s: --->\n", __func__); - struct cmdu_cstruct *cmdu; - struct agent *a = (struct agent *)agent; - - cmdu = agent_gen_ap_metrics_response(a, rec_cmdu); - if (!cmdu) - return -1; - - agent_send_cmdu(a, cmdu); - map_free_cmdu(cmdu); - return 0; +// struct cmdu_cstruct *cmdu; +// struct agent *a = (struct agent *)agent; +// +// cmdu = agent_gen_ap_metrics_response(a, rx_cmdu); +// if (!cmdu) +// return -1; +// +// agent_send_cmdu(a, cmdu); +// map_free_cmdu(cmdu); +// +// return 0; } static int prepare_assoc_sta_metric_response(void *agent, char *ifname) { trace("%s: --->\n", __func__); - struct cmdu_cstruct *cmdu; - struct agent *a = (struct agent *)agent; - - cmdu = agent_gen_assoc_sta_metric_response_per_intf(a, ifname); - if (!cmdu) - return -1; - - agent_send_cmdu(a, cmdu); - map_free_cmdu(cmdu); - return 0; - +// struct cmdu_cstruct *cmdu; +// struct agent *a = (struct agent *)agent; +// +// cmdu = agent_gen_assoc_sta_metric_response_per_intf(a, ifname); +// if (!cmdu) +// return -1; +// +// agent_send_cmdu(a, cmdu); +// map_free_cmdu(cmdu); +// +// return 0; } -int handle_1905_ack(void *agent, struct cmdu_cstruct *cmdu) +int handle_1905_ack(void *agent, struct cmdu_buff *cmdu) { trace("agent: %s: --->\n", __func__); return 0; } -int handle_ap_caps_query(void *agent, struct cmdu_cstruct *rec_cmdu) -{ - trace("agent: %s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - uint16_t tlv_index = 0; - uint32_t i; - struct cmdu_cstruct *cmdu; - struct tlv_ap_cap *p2; - struct tlv_ch_scan_cap *p5; - struct tlv_cac_cap *p6; - struct tlv_profile2_ap_cap *p7; - struct tlv_metric_collection_interval *p8; - int ret; - - cmdu = (struct cmdu_cstruct *)calloc(1, - sizeof(struct cmdu_cstruct)); - if (!cmdu) { - fprintf(stderr, "Out of memory!\n"); - return -1; - } - - cmdu->message_type = CMDU_AP_CAPABILITY_REPORT; - memcpy(cmdu->origin, rec_cmdu->origin, 6); - cmdu->message_id = rec_cmdu->message_id; - strcpy(cmdu->intf_name, rec_cmdu->intf_name); - - cmdu->num_tlvs = 3 * a->num_radios + 1; /* (Radio basic, HT, VHT capability per radio) */ - -//#ifdef PROFILE2 - cmdu->num_tlvs += 1 + 1 + 1 + 1; /* Channel scan, CAC, profile-2 AP capabilities and metric collection interval TLV */ -//#endif PROFILE2 - - cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); - if (!cmdu->tlvs) { - map_free_cmdu(cmdu); - return -1; - } - - /* AP basic Radio Capability TLV*/ - for (i = 0; i < a->num_radios; i++) { - struct tlv_ap_radio_basic_cap *p; - - p = agent_gen_ap_radio_basic_cap(a, cmdu, &a->radios[i]); - if (!p) - continue; - //cmdu->num_tlvs++; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p; - } - - /* AP capability TLV */ - p2 = agent_gen_ap_caps(a, cmdu); - if (!p2) - goto fail; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p2; - - /* HT Capability */ - for (i = 0; i < a->num_radios; i++) { - struct tlv_ap_ht_cap *p3; - - p3 = agent_gen_ap_ht_caps(a, cmdu, i); - if (!p3) - continue; - //cmdu->num_tlvs++; - - - cmdu->tlvs[tlv_index++] = (uint8_t *)p3; - } - - /* VHT Capability */ - for (i = 0; i < a->num_radios; i++) { - struct tlv_ap_vht_cap *p4; - - p4 = agent_gen_ap_vht_caps(a, cmdu, i); - if (!p4) - continue; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p4; - } - -//#ifdef PROFILE2 - /* Channel Scan Capability */ - p5 = agent_gen_ch_scan_cap(a); - if (!p5) - goto fail; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p5; - - /* CAC Capability */ - p6 = agent_gen_cac_cap(a); - if (!p6) - goto fail; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p6; - - /* Profile Capability */ - p7 = agent_gen_profile2_ap_cap(a); - if (!p7) - goto fail; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p7; - - /* Metric Collection Interval */ - p8 = agent_gen_metric_collection_interval(a); - if (!p8) - goto fail; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p8; -//#endif PROFILE2 - - ret = agent_send_cmdu(a, cmdu); - map_free_cmdu(cmdu); - - return ret; -fail: - map_free_cmdu(cmdu); - return -1; -} - -uint8_t rssi_to_rcpi(int rssi) +int handle_ap_caps_query(void *agent, struct cmdu_buff *rx_cmdu) { - if (!rssi) - return 255; - else if (rssi < -110) - return 0; - else if (rssi > 0) - return 220; - else - return (rssi + 110) * 2; + return 0; +// trace("agent: %s: --->\n", __func__); +// struct agent *a = (struct agent *) agent; +// uint16_t tlv_index = 0; +// uint32_t i; +// struct cmdu_cstruct *cmdu; +// struct tlv_ap_cap *p2; +// struct tlv_ch_scan_cap *p5; +// struct tlv_cac_cap *p6; +// struct tlv_profile2_ap_cap *p7; +// struct tlv_metric_collection_interval *p8; +// int ret; +// +// cmdu = (struct cmdu_cstruct *)calloc(1, +// sizeof(struct cmdu_cstruct)); +// if (!cmdu) { +// fprintf(stderr, "Out of memory!\n"); +// return -1; +// } +// +// cmdu->message_type = CMDU_AP_CAPABILITY_REPORT; +// memcpy(cmdu->origin, rx_cmdu->origin, 6); +// cmdu->message_id = rx_cmdu->message_id; +// strcpy(cmdu->intf_name, rx_cmdu->intf_name); +// +// cmdu->num_tlvs = 3 * a->num_radios + 1; /* (Radio basic, HT, VHT capability per radio) */ +// +////#ifdef PROFILE2 +// cmdu->num_tlvs += 1 + 1 + 1 + 1; /* Channel scan, CAC, profile-2 AP capabilities and metric collection interval TLV */ +////#endif PROFILE2 +// +// cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); +// if (!cmdu->tlvs) { +// map_free_cmdu(cmdu); +// return -1; +// } +// +// /* AP basic Radio Capability TLV*/ +// for (i = 0; i < a->num_radios; i++) { +// struct tlv_ap_radio_basic_cap *p; +// +// p = agent_gen_ap_radio_basic_cap(a, cmdu, &a->radios[i]); +// if (!p) +// continue; +// //cmdu->num_tlvs++; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p; +// } +// +// /* AP capability TLV */ +// p2 = agent_gen_ap_caps(a, cmdu); +// if (!p2) +// goto fail; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p2; +// +// /* HT Capability */ +// for (i = 0; i < a->num_radios; i++) { +// struct tlv_ap_ht_cap *p3; +// +// p3 = agent_gen_ap_ht_caps(a, cmdu, i); +// if (!p3) +// continue; +// //cmdu->num_tlvs++; +// +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p3; +// } +// +// /* VHT Capability */ +// for (i = 0; i < a->num_radios; i++) { +// struct tlv_ap_vht_cap *p4; +// +// p4 = agent_gen_ap_vht_caps(a, cmdu, i); +// if (!p4) +// continue; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p4; +// } +// +////#ifdef PROFILE2 +// /* Channel Scan Capability */ +// p5 = agent_gen_ch_scan_cap(a); +// if (!p5) +// goto fail; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p5; +// +// /* CAC Capability */ +// p6 = agent_gen_cac_cap(a); +// if (!p6) +// goto fail; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p6; +// +// /* Profile Capability */ +// p7 = agent_gen_profile2_ap_cap(a); +// if (!p7) +// goto fail; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p7; +// +// /* Metric Collection Interval */ +// p8 = agent_gen_metric_collection_interval(a); +// if (!p8) +// goto fail; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p8; +////#endif PROFILE2 +// +// ret = agent_send_cmdu(a, cmdu); +// map_free_cmdu(cmdu); +// +// return ret; +//fail: +// map_free_cmdu(cmdu); +// return -1; } static uint8_t calculate_radio_util(struct agent *a, char *ifname) @@ -1552,420 +1618,428 @@ static uint8_t calculate_radio_util(struct agent *a, char *ifname) static uint8_t calculate_radio_rcpi(struct agent *a, char *ifname) { - int j, k; - struct wifi_radio_element *radio; - struct wifi_bss_element *bss; - struct wifi_sta_element *sta; - int8_t rssi = 0; - uint8_t rcpi = 0; - - radio = wifi_ifname_to_radio_element(a, ifname); - if (!radio) - return 0; - - for (j = 0; j < radio->num_bss; j++) { - bss = radio->bsslist + j; - for (k = 0; k < bss->num_stations; k++) { - sta = bss->stalist + k; - rssi += sta->rssi; - } - } - - rcpi = rssi_to_rcpi(rssi); - - return rcpi; + return 0; +// int j, k; +// struct wifi_radio_element *radio; +// struct wifi_bss_element *bss; +// struct wifi_sta_element *sta; +// int8_t rssi = 0; +// uint8_t rcpi = 0; +// +// radio = wifi_ifname_to_radio_element(a, ifname); +// if (!radio) +// return 0; +// +// for (j = 0; j < radio->num_bss; j++) { +// bss = radio->bsslist + j; +// for (k = 0; k < bss->num_stations; k++) { +// sta = bss->stalist + k; +// rssi += sta->rssi; +// } +// } +// +// rcpi = rssi_to_rcpi(rssi); +// +// return rcpi; } static void agent_metric_report_timer_cb(struct uloop_timeout *t) { - struct agent_config *cfg = - container_of(t, struct agent_config, metric_report_timer); - struct agent *a = container_of(cfg, struct agent, cfg); - struct cmdu_cstruct *cmdu; - char *ifname = NULL; - - cmdu = prepare_ap_metrics_query((void *)a, ifname); - if (!cmdu) - goto refresh_interval; - - prepare_ap_metrics_response(a, cmdu); - map_free_cmdu(cmdu); - -refresh_interval: - uloop_timeout_set(&cfg->metric_report_timer, - cfg->pcfg->report_interval * 1000); + return; +// struct agent_config *cfg = +// container_of(t, struct agent_config, metric_report_timer); +// struct agent *a = container_of(cfg, struct agent, cfg); +// struct cmdu_cstruct *cmdu; +// char *ifname = NULL; +// +// cmdu = prepare_ap_metrics_query((void *)a, ifname); +// if (!cmdu) +// goto refresh_interval; +// +// prepare_ap_metrics_response(a, cmdu); +// map_free_cmdu(cmdu); +// +//refresh_interval: +// uloop_timeout_set(&cfg->metric_report_timer, +// cfg->pcfg->report_interval * 1000); } static void agent_util_threshold_timer_cb(struct uloop_timeout *t) { - struct netif_fh *p = container_of(t, struct netif_fh, - util_threshold_timer); - struct agent *a = p->agent; - struct cmdu_cstruct *cmdu; - uint8_t curr_util = 0; - uint8_t prev_util; - - curr_util = calculate_radio_util(a, p->name); - prev_util = p->prev_util; - if (((prev_util > p->cfg->util_threshold) && - (curr_util > p->cfg->util_threshold)) || - ((prev_util < p->cfg->util_threshold) && - (curr_util < p->cfg->util_threshold))) - goto refresh_interval; - - cmdu = prepare_ap_metrics_query((void *)a, p->name); - if (!cmdu) - goto refresh_interval; - - prepare_ap_metrics_response(a, cmdu); - map_free_cmdu(cmdu); - -refresh_interval: - p->prev_util = curr_util; - uloop_timeout_set(&p->util_threshold_timer, UTIL_THRESHOLD_TIMER); + return; +// struct netif_fh *p = container_of(t, struct netif_fh, +// util_threshold_timer); +// struct agent *a = p->agent; +// struct cmdu_cstruct *cmdu; +// uint8_t curr_util = 0; +// uint8_t prev_util; +// +// curr_util = calculate_radio_util(a, p->name); +// prev_util = p->prev_util; +// if (((prev_util > p->cfg->util_threshold) && +// (curr_util > p->cfg->util_threshold)) || +// ((prev_util < p->cfg->util_threshold) && +// (curr_util < p->cfg->util_threshold))) +// goto refresh_interval; +// +// cmdu = prepare_ap_metrics_query((void *)a, p->name); +// if (!cmdu) +// goto refresh_interval; +// +// prepare_ap_metrics_response(a, cmdu); +// map_free_cmdu(cmdu); +// +//refresh_interval: +// p->prev_util = curr_util; +// uloop_timeout_set(&p->util_threshold_timer, UTIL_THRESHOLD_TIMER); } static void agent_rcpi_thresold_timer_cb(struct uloop_timeout *t) { - struct netif_fh *p = container_of(t, struct netif_fh, - rcpi_threshold_timer); - struct agent *a = p->agent; - uint8_t curr_rcpi = 0; - uint8_t prev_rcpi; - - curr_rcpi = calculate_radio_rcpi(a, p->name); - prev_rcpi = p->prev_rcpi; - if (((prev_rcpi > p->cfg->rcpi_threshold) && - (curr_rcpi > p->cfg->rcpi_threshold)) || - ((prev_rcpi < p->cfg->rcpi_threshold) && - (curr_rcpi < p->cfg->rcpi_threshold))) - goto refresh_interval; - - prepare_assoc_sta_metric_response(a, p->name); - -refresh_interval: - p->prev_rcpi = curr_rcpi; - uloop_timeout_set(&p->rcpi_threshold_timer, RCPI_THRESHOLD_TIMER); + return; +// struct netif_fh *p = container_of(t, struct netif_fh, +// rcpi_threshold_timer); +// struct agent *a = p->agent; +// uint8_t curr_rcpi = 0; +// uint8_t prev_rcpi; +// +// curr_rcpi = calculate_radio_rcpi(a, p->name); +// prev_rcpi = p->prev_rcpi; +// if (((prev_rcpi > p->cfg->rcpi_threshold) && +// (curr_rcpi > p->cfg->rcpi_threshold)) || +// ((prev_rcpi < p->cfg->rcpi_threshold) && +// (curr_rcpi < p->cfg->rcpi_threshold))) +// goto refresh_interval; +// +// prepare_assoc_sta_metric_response(a, p->name); +// +//refresh_interval: +// p->prev_rcpi = curr_rcpi; +// uloop_timeout_set(&p->rcpi_threshold_timer, RCPI_THRESHOLD_TIMER); } static int agent_process_policy_config(struct agent *a) { trace("%s: --->\n", __func__); - int i; - struct agent_config *cfg = &a->cfg; - struct policy_cfg *c = cfg->pcfg; - - /* timer cleanup */ - if (cfg->metric_report_timer.cb) { - uloop_timeout_cancel(&cfg->metric_report_timer); - cfg->metric_report_timer.cb = NULL; - } - - - if (c && (c->report_interval > 0)) { - cfg->metric_report_timer.cb = agent_metric_report_timer_cb; - uloop_timeout_set(&cfg->metric_report_timer, - c->report_interval * 1000); - } - - for (i = 0; i < a->num_radios; i++) { - struct netif_fh *p; - - p = wifi_radio_to_ap(a, a->radios[i].name); - if (!p) - continue; - - /* timers cleanup fh specific */ - if (p->util_threshold_timer.cb) { - uloop_timeout_cancel(&p->util_threshold_timer); - p->util_threshold_timer.cb = NULL; - } - - if (p->rcpi_threshold_timer.cb) { - uloop_timeout_cancel(&p->rcpi_threshold_timer); - p->rcpi_threshold_timer.cb = NULL; - } - - if (p->cfg->util_threshold > 0) { - p->util_threshold_timer.cb = - agent_util_threshold_timer_cb; - uloop_timeout_set(&p->util_threshold_timer, - UTIL_THRESHOLD_TIMER); - } - - if (p->cfg->rcpi_threshold > 0) { - p->rcpi_threshold_timer.cb = - agent_rcpi_thresold_timer_cb; - uloop_timeout_set(&p->rcpi_threshold_timer, - RCPI_THRESHOLD_TIMER); - } - } - - /* TODO: - * 17.2.37: report independent channel scan, - * will be useful while extending channel scan response - * - * 17.2.66: Backhaul configuration - * 17.2.49, 17.2.50: Will be used in traffic seperation - * - * 17.2.58: report unsuccesful association, - * Sta events should be checked & reported accordingly - */ - - return 0; -} - -int handle_map_policy_config(void *agent, struct cmdu_cstruct *cmdu) -{ - trace("%s: --->\n", __func__); - int i; - uint8_t *tlv; - struct agent *a = (struct agent *)agent; - struct uci_context *ctx; - struct uci_package *pkg; - - /* send the 1905 ack message to controller */ - // handle_1905_ack(a, cmdu); - - ctx = uci_alloc_context(); - if (!ctx) - return -1; - - if (uci_load(ctx, "mapagent", &pkg)) { - uci_free_context(ctx); - return -1; - } - - for (i = 0; i < cmdu->num_tlvs; i++) { - tlv = (uint8_t *)cmdu->tlvs[i]; - fprintf(stderr, "TLV: %s\n", map_stringify_tlv_type(*tlv)); - - switch (*tlv) { - case MAP_TLV_STEERING_POLICY: - { - struct tlv_steering_policy *p = - (struct tlv_steering_policy *)tlv; - - agent_fill_steering_policy(a, p, ctx, pkg); - - break; - } - - case MAP_TLV_METRIC_REPORTING_POLICY: - { - struct tlv_metric_report_policy *p = - (struct tlv_metric_report_policy *)tlv; - - agent_fill_metric_report_policy(a, p, ctx, pkg); - - break; - } - - case MAP_TLV_DEFAULT_8021Q_SETTINGS: - { - struct tlv_default_8021q_settings *p = - (struct tlv_default_8021q_settings *)tlv; - - agent_fill_8021q_setting(a, p, ctx, pkg); - break; - } - - case MAP_TLV_TRAFFIC_SEPARATION_POLICY: - { - struct tlv_traffic_sep_policy *p = - (struct tlv_traffic_sep_policy *)tlv; - - agent_fill_traffic_sep_policy(a, p, ctx, pkg); - break; - } - - case MAP_TLV_CHANNEL_SCAN_REPORTING_POLICY: - { - struct tlv_ch_scan_rep_policy *p = - (struct tlv_ch_scan_rep_policy *)tlv; - - agent_fill_ch_scan_rep_policy(a, p, ctx, pkg); - break; - } - - case MAP_TLV_UNSUCCESS_ASSOCIATION_POLICY: - { - struct tlv_unsuccess_assoc_policy *p = - (struct tlv_unsuccess_assoc_policy *)tlv; - - agent_fill_unsuccess_assoc_policy(a, p, ctx, pkg); - break; - } - - case MAP_TLV_BACKHAUL_BSS_CONFIG: - { - uint8_t generic_id[6] = {0xff, 0x0ff, 0xff, 0xff, 0xff, 0xff}; - struct tlv_backhaul_bss_config *p = - (struct tlv_backhaul_bss_config *)tlv; - - if (!memcmp(p->bssid, generic_id, 6)) { - agent_fill_backhaul_bss_config_all(a, p, ctx, pkg); - } else - agent_fill_backhaul_bss_config(a, p, ctx, pkg); - - break; - } - } - } - - /* update agent config file */ - uci_commit(ctx, &pkg, false); - uci_unload(ctx, pkg); - uci_free_context(ctx); - - /* Reload agent config */ - agent_config_reload(&a->cfg); - - agent_process_policy_config(a); - - return 0; -} - -int handle_channel_pref_query(void *agent, struct cmdu_cstruct *rec_cmdu) -{ - trace("%s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - uint16_t tlv_index = 0; - uint32_t j; - struct cmdu_cstruct *cmdu_data; - int ret = 0; - - cmdu_data = (struct cmdu_cstruct *)calloc(1, - sizeof(struct cmdu_cstruct)); - if (!cmdu_data) { - fprintf(stderr, "Out of memory!\n"); - return -1; - } - - cmdu_data->message_type = CMDU_CHANNEL_PREFERENCE_REPORT; - memcpy(cmdu_data->origin, rec_cmdu->origin, 6); - cmdu_data->message_id = rec_cmdu->message_id; - strcpy(cmdu_data->intf_name, rec_cmdu->intf_name); - - cmdu_data->num_tlvs = 2 * a->num_radios + 1 + 1; /* (Preference TLV + Restriction TLV)+(CAC status + CAC_report) */ - cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, - sizeof(uint8_t *)); - if (!cmdu_data->tlvs) { - map_free_cmdu(cmdu_data); - return -1; - } - - /* Channel Preference TLV 17.2.13 */ - for (j = 0; j < a->num_radios; j++) { - struct tlv_channel_pref *p = - (struct tlv_channel_pref *)calloc(1, - sizeof(struct tlv_channel_pref)); - if (p) { - p->tlv_type = MAP_TLV_CHANNEL_PREFERENCE; - agent_gen_radio_channel_preference(a, p, j); - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; - } - } - - /* Radio Operation Restriction TLV 17.2.14*/ - for (j = 0; j < a->num_radios; j++) { - struct tlv_radio_oper_restrict *p1 = - (struct tlv_radio_oper_restrict *)calloc(1, - sizeof(struct tlv_radio_oper_restrict)); - if (p1) { - p1->tlv_type = MAP_TLV_RADIO_OPERATION_RESTRICTION; - agent_gen_radio_restrict_channel(a, p1, j); - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p1; - } - } - - -//#ifdef profile2 - /*TODO CAC Completion Report TLV (section 17.2.44). [Profile-2]*/ - struct tlv_cac_comp_report *p2 = - (struct tlv_cac_comp_report *)calloc(1, - sizeof(struct tlv_cac_comp_report)); - if (p2) { - p2->tlv_type = MAP_TLV_CAC_COMPLETION_REPORT; - agent_gen_cac_comp_report(a, p2); - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p2; - } - - /*TODO CAC Status Report TLV (section 17.2.45). [Profile-2]*/ - struct tlv_cac_status_report *p3 = - (struct tlv_cac_status_report *)calloc(1, - sizeof(struct tlv_cac_status_report)); - if (p3) { - p3->tlv_type = MAP_TLV_CAC_STATUS_REPORT; - p3->nbr_available_ch = 0; //TODO dummy value - p3->ch_data = NULL; //TODO dummy value - p3->nbr_pairs_duration = 0; //TODO dummy value - p3->duration_pair_data = NULL; //TODO dummy value - p3->nbr_pairs_coundown = 0; //TODO dummy value - p3->count_pair_data = NULL; //TODO dummy value - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p3; - } -//#endif - ret = agent_send_cmdu(a, cmdu_data); - map_free_cmdu(cmdu_data); - - return ret; -} - -int send_channel_sel_response(void *agent, struct cmdu_cstruct *rec_cmdu, - struct channel_response *channel_resp, - uint32_t channel_response_nr) -{ - trace("agent: %s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - uint16_t tlv_index = 0; - uint32_t j, ret = 0; - struct cmdu_cstruct *cmdu_data; - - cmdu_data = (struct cmdu_cstruct *)calloc(1, - sizeof(struct cmdu_cstruct)); - - if (!cmdu_data) { - fprintf(stderr, "Out of memory!\n"); - return -1; - } - - cmdu_data->message_type = CMDU_CHANNEL_SELECTION_RESPONSE; - memcpy(cmdu_data->origin, rec_cmdu->origin, 6); - cmdu_data->message_id = rec_cmdu->message_id; - strcpy(cmdu_data->intf_name, rec_cmdu->intf_name); - - cmdu_data->num_tlvs = 1 * channel_response_nr; /* (channel selection response) */ - cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, - sizeof(uint8_t *)); - - if (!cmdu_data->tlvs) { - map_free_cmdu(cmdu_data); - return -1; - } - - /* Operating Channel Response TLV 17.2.16 */ - for (j = 0; j < channel_response_nr; j++) { - struct tlv_ch_selection_resp *p = NULL; - /* Here we need to check that the radio - *response is for the radio for which we get request - */ - p = agent_gen_operate_channel_response(a, rec_cmdu, - channel_resp[j].radio_id, channel_resp[j].response); - if (!p) - continue; - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; - } - ret = agent_send_cmdu(a, cmdu_data); - map_free_cmdu(cmdu_data); - - /* TODO send a report message for each radio. This will be - * sent not here but on receiving of the event when the - * actually radio channel poreference have been changed - */ - send_oper_channel_report(agent, rec_cmdu); - return ret; -} + return 0; +// int i; +// struct agent_config *cfg = &a->cfg; +// struct policy_cfg *c = cfg->pcfg; +// +// /* timer cleanup */ +// if (cfg->metric_report_timer.cb) { +// uloop_timeout_cancel(&cfg->metric_report_timer); +// cfg->metric_report_timer.cb = NULL; +// } +// +// +// if (c && (c->report_interval > 0)) { +// cfg->metric_report_timer.cb = agent_metric_report_timer_cb; +// uloop_timeout_set(&cfg->metric_report_timer, +// c->report_interval * 1000); +// } +// +// for (i = 0; i < a->num_radios; i++) { +// struct netif_fh *p; +// +// p = wifi_radio_to_ap(a, a->radios[i].name); +// if (!p) +// continue; +// +// /* timers cleanup fh specific */ +// if (p->util_threshold_timer.cb) { +// uloop_timeout_cancel(&p->util_threshold_timer); +// p->util_threshold_timer.cb = NULL; +// } +// +// if (p->rcpi_threshold_timer.cb) { +// uloop_timeout_cancel(&p->rcpi_threshold_timer); +// p->rcpi_threshold_timer.cb = NULL; +// } +// +// if (p->cfg->util_threshold > 0) { +// p->util_threshold_timer.cb = +// agent_util_threshold_timer_cb; +// uloop_timeout_set(&p->util_threshold_timer, +// UTIL_THRESHOLD_TIMER); +// } +// +// if (p->cfg->rcpi_threshold > 0) { +// p->rcpi_threshold_timer.cb = +// agent_rcpi_thresold_timer_cb; +// uloop_timeout_set(&p->rcpi_threshold_timer, +// RCPI_THRESHOLD_TIMER); +// } +// } +// +// /* TODO: +// * 17.2.37: report independent channel scan, +// * will be useful while extending channel scan response +// * +// * 17.2.66: Backhaul configuration +// * 17.2.49, 17.2.50: Will be used in traffic seperation +// * +// * 17.2.58: report unsuccesful association, +// * Sta events should be checked & reported accordingly +// */ +// +// return 0; +} + +int handle_map_policy_config(void *agent, struct cmdu_buff *cmdu) +{ + trace("%s: --->\n", __func__); + return 0; +// int i; +// uint8_t *tlv; +// struct agent *a = (struct agent *)agent; +// struct uci_context *ctx; +// struct uci_package *pkg; +// +// /* send the 1905 ack message to controller */ +// // handle_1905_ack(a, cmdu); +// +// ctx = uci_alloc_context(); +// if (!ctx) +// return -1; +// +// if (uci_load(ctx, "mapagent", &pkg)) { +// uci_free_context(ctx); +// return -1; +// } +// +// for (i = 0; i < cmdu->num_tlvs; i++) { +// tlv = (uint8_t *)cmdu->tlvs[i]; +// fprintf(stderr, "TLV: %s\n", map_stringify_tlv_type(*tlv)); +// +// switch (*tlv) { +// case MAP_TLV_STEERING_POLICY: +// { +// struct tlv_steering_policy *p = +// (struct tlv_steering_policy *)tlv; +// +// agent_fill_steering_policy(a, p, ctx, pkg); +// +// break; +// } +// +// case MAP_TLV_METRIC_REPORTING_POLICY: +// { +// struct tlv_metric_report_policy *p = +// (struct tlv_metric_report_policy *)tlv; +// +// agent_fill_metric_report_policy(a, p, ctx, pkg); +// +// break; +// } +// +// case MAP_TLV_DEFAULT_8021Q_SETTINGS: +// { +// struct tlv_default_8021q_settings *p = +// (struct tlv_default_8021q_settings *)tlv; +// +// agent_fill_8021q_setting(a, p, ctx, pkg); +// break; +// } +// +// case MAP_TLV_TRAFFIC_SEPARATION_POLICY: +// { +// struct tlv_traffic_sep_policy *p = +// (struct tlv_traffic_sep_policy *)tlv; +// +// agent_fill_traffic_sep_policy(a, p, ctx, pkg); +// break; +// } +// +// case MAP_TLV_CHANNEL_SCAN_REPORTING_POLICY: +// { +// struct tlv_ch_scan_rep_policy *p = +// (struct tlv_ch_scan_rep_policy *)tlv; +// +// agent_fill_ch_scan_rep_policy(a, p, ctx, pkg); +// break; +// } +// +// case MAP_TLV_UNSUCCESS_ASSOCIATION_POLICY: +// { +// struct tlv_unsuccess_assoc_policy *p = +// (struct tlv_unsuccess_assoc_policy *)tlv; +// +// agent_fill_unsuccess_assoc_policy(a, p, ctx, pkg); +// break; +// } +// +// case MAP_TLV_BACKHAUL_BSS_CONFIG: +// { +// uint8_t generic_id[6] = {0xff, 0x0ff, 0xff, 0xff, 0xff, 0xff}; +// struct tlv_backhaul_bss_config *p = +// (struct tlv_backhaul_bss_config *)tlv; +// +// if (!memcmp(p->bssid, generic_id, 6)) { +// agent_fill_backhaul_bss_config_all(a, p, ctx, pkg); +// } else +// agent_fill_backhaul_bss_config(a, p, ctx, pkg); +// +// break; +// } +// } +// } +// +// /* update agent config file */ +// uci_commit(ctx, &pkg, false); +// uci_unload(ctx, pkg); +// uci_free_context(ctx); +// +// /* Reload agent config */ +// agent_config_reload(&a->cfg); +// +// agent_process_policy_config(a); +// +// return 0; +} + +int handle_channel_pref_query(void *agent, struct cmdu_buff *rx_cmdu) +{ + trace("%s: --->\n", __func__); + return 0; +// struct agent *a = (struct agent *) agent; +// uint16_t tlv_index = 0; +// uint32_t j; +// struct cmdu_cstruct *cmdu_data; +// int ret = 0; +// +// cmdu_data = (struct cmdu_cstruct *)calloc(1, +// sizeof(struct cmdu_cstruct)); +// if (!cmdu_data) { +// fprintf(stderr, "Out of memory!\n"); +// return -1; +// } +// +// cmdu_data->message_type = CMDU_CHANNEL_PREFERENCE_REPORT; +// memcpy(cmdu_data->origin, rx_cmdu->origin, 6); +// cmdu_data->message_id = rx_cmdu->message_id; +// strcpy(cmdu_data->intf_name, rx_cmdu->intf_name); +// +// cmdu_data->num_tlvs = 2 * a->num_radios + 1 + 1; /* (Preference TLV + Restriction TLV)+(CAC status + CAC_report) */ +// cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, +// sizeof(uint8_t *)); +// if (!cmdu_data->tlvs) { +// map_free_cmdu(cmdu_data); +// return -1; +// } +// +// /* Channel Preference TLV 17.2.13 */ +// for (j = 0; j < a->num_radios; j++) { +// struct tlv_channel_pref *p = +// (struct tlv_channel_pref *)calloc(1, +// sizeof(struct tlv_channel_pref)); +// if (p) { +// p->tlv_type = MAP_TLV_CHANNEL_PREFERENCE; +// agent_gen_radio_channel_preference(a, p, j); +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; +// } +// } +// +// /* Radio Operation Restriction TLV 17.2.14*/ +// for (j = 0; j < a->num_radios; j++) { +// struct tlv_radio_oper_restrict *p1 = +// (struct tlv_radio_oper_restrict *)calloc(1, +// sizeof(struct tlv_radio_oper_restrict)); +// if (p1) { +// p1->tlv_type = MAP_TLV_RADIO_OPERATION_RESTRICTION; +// agent_gen_radio_restrict_channel(a, p1, j); +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p1; +// } +// } +// +// +////#ifdef profile2 +// /*TODO CAC Completion Report TLV (section 17.2.44). [Profile-2]*/ +// struct tlv_cac_comp_report *p2 = +// (struct tlv_cac_comp_report *)calloc(1, +// sizeof(struct tlv_cac_comp_report)); +// if (p2) { +// p2->tlv_type = MAP_TLV_CAC_COMPLETION_REPORT; +// agent_gen_cac_comp_report(a, p2); +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p2; +// } +// +// /*TODO CAC Status Report TLV (section 17.2.45). [Profile-2]*/ +// struct tlv_cac_status_report *p3 = +// (struct tlv_cac_status_report *)calloc(1, +// sizeof(struct tlv_cac_status_report)); +// if (p3) { +// p3->tlv_type = MAP_TLV_CAC_STATUS_REPORT; +// p3->nbr_available_ch = 0; //TODO dummy value +// p3->ch_data = NULL; //TODO dummy value +// p3->nbr_pairs_duration = 0; //TODO dummy value +// p3->duration_pair_data = NULL; //TODO dummy value +// p3->nbr_pairs_coundown = 0; //TODO dummy value +// p3->count_pair_data = NULL; //TODO dummy value +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p3; +// } +////#endif +// ret = agent_send_cmdu(a, cmdu_data); +// map_free_cmdu(cmdu_data); +// +// return ret; +} + +int send_channel_sel_response(void *agent, struct cmdu_buff *rx_cmdu, + struct channel_response *channel_resp, + uint32_t channel_response_nr) +{ + trace("agent: %s: --->\n", __func__); + return 0; +// struct agent *a = (struct agent *) agent; +// uint16_t tlv_index = 0; +// uint32_t j, ret = 0; +// struct cmdu_cstruct *cmdu_data; +// +// cmdu_data = (struct cmdu_cstruct *)calloc(1, +// sizeof(struct cmdu_cstruct)); +// +// if (!cmdu_data) { +// fprintf(stderr, "Out of memory!\n"); +// return -1; +// } +// +// cmdu_data->message_type = CMDU_CHANNEL_SELECTION_RESPONSE; +// memcpy(cmdu_data->origin, rx_cmdu->origin, 6); +// cmdu_data->message_id = rx_cmdu->message_id; +// strcpy(cmdu_data->intf_name, rx_cmdu->intf_name); +// +// cmdu_data->num_tlvs = 1 * channel_response_nr; /* (channel selection response) */ +// cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, +// sizeof(uint8_t *)); +// +// if (!cmdu_data->tlvs) { +// map_free_cmdu(cmdu_data); +// return -1; +// } +// +// /* Operating Channel Response TLV 17.2.16 */ +// for (j = 0; j < channel_response_nr; j++) { +// struct tlv_ch_selection_resp *p = NULL; +// /* Here we need to check that the radio +// *response is for the radio for which we get request +// */ +// p = agent_gen_operate_channel_response(a, rx_cmdu, +// channel_resp[j].radio_id, channel_resp[j].response); +// if (!p) +// continue; +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; +// } +// ret = agent_send_cmdu(a, cmdu_data); +// map_free_cmdu(cmdu_data); +// +// /* TODO send a report message for each radio. This will be +// * sent not here but on receiving of the event when the +// * actually radio channel poreference have been changed +// */ +// send_oper_channel_report(agent, rx_cmdu); +// return ret; +} int agent_fill_radio_max_preference(void *agent, struct channel_response *channel_resp, @@ -1993,333 +2067,337 @@ int agent_fill_radio_max_preference(void *agent, return 0; } -int agent_process_channel_pref_tlv(void *agent, struct tlv_channel_pref *p, +int agent_process_channel_pref_tlv(void *agent, uint8_t *p, struct channel_response *channel_resp, uint32_t *channel_resp_nr) { trace("agent: %s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - int ret = 0; - uint32_t match = 0, found = 0; - int j, l; - struct wifi_radio_element *radio; - - trace("\tradio_id: " MACFMT "\n", MAC2STR(p->radio_id)); - for (l = 0; l < a->num_radios; l++) { - radio = a->radios + l; - match = memcmp(radio->macaddr, p->radio_id, 6); - if (match == 0) { - found = 1; - memcpy(channel_resp[*channel_resp_nr].radio_id, - radio->macaddr, 6); - channel_resp[*channel_resp_nr].response = 0x00; - break; - } - } - if (found == 0) { - memcpy(channel_resp[*channel_resp_nr].radio_id, - p->radio_id, 6); - /* Here response code is a Reserved code - * to decline the request - */ - channel_resp[*channel_resp_nr].response = 0x04; - *channel_resp_nr = *channel_resp_nr + 1; - return ret; - } - trace("ch_preference_op_class_nr: %d\n", p->ch_preference_op_class_nr); - - for (j = 0; j < p->ch_preference_op_class_nr; j++) { - /* Here we need to search the operating class in the radio */ - for (l = 0; l < radio->num_supp_opclass; l++) { - if (radio->supp_opclass[l].id == p->op_class[j].op_class) { - int k; - - /* Here we reset all the channels preferences - * in the operating class as 15 highest - * preference - */ - trace("op_class : %d channel_nr %d\n", - p->op_class[j].op_class, - p->op_class[j].channel_nr); - - for (k = 0; k < - radio->supp_opclass[l].num_supported_channels; - k++) - radio->supp_opclass[l]. - supp_chanlist[k].pref = 0xff; - - for (k = 0; k < p->op_class[j].channel_nr; k++) { - int m; - - for (m = 0; m < - radio->supp_opclass[l]. - num_supported_channels ; m++) { - trace("channel %d\n", - p->op_class[j].channel_list[k]); - if (p->op_class[j].channel_list[k] == - radio->supp_opclass[l]. - supp_chanlist[m].channel) { - radio->supp_opclass[l]. - supp_chanlist[m].pref = - p->op_class[j].preference; - - trace("channel pref is %d\n", - p->op_class[j].preference); - } - } - } - break; - } - } - } - *channel_resp_nr = *channel_resp_nr + 1; - return ret; -} - -int handle_channel_sel_request(void *agent, struct cmdu_cstruct *cmdu) + return 0; +// struct agent *a = (struct agent *) agent; +// int ret = 0; +// uint32_t match = 0, found = 0; +// int j, l; +// struct wifi_radio_element *radio; +// +// trace("\tradio_id: " MACFMT "\n", MAC2STR(p->radio_id)); +// for (l = 0; l < a->num_radios; l++) { +// radio = a->radios + l; +// match = memcmp(radio->macaddr, p->radio_id, 6); +// if (match == 0) { +// found = 1; +// memcpy(channel_resp[*channel_resp_nr].radio_id, +// radio->macaddr, 6); +// channel_resp[*channel_resp_nr].response = 0x00; +// break; +// } +// } +// if (found == 0) { +// memcpy(channel_resp[*channel_resp_nr].radio_id, +// p->radio_id, 6); +// /* Here response code is a Reserved code +// * to decline the request +// */ +// channel_resp[*channel_resp_nr].response = 0x04; +// *channel_resp_nr = *channel_resp_nr + 1; +// return ret; +// } +// trace("ch_preference_op_class_nr: %d\n", p->ch_preference_op_class_nr); +// +// for (j = 0; j < p->ch_preference_op_class_nr; j++) { +// /* Here we need to search the operating class in the radio */ +// for (l = 0; l < radio->num_supp_opclass; l++) { +// if (radio->supp_opclass[l].id == p->op_class[j].op_class) { +// int k; +// +// /* Here we reset all the channels preferences +// * in the operating class as 15 highest +// * preference +// */ +// trace("op_class : %d channel_nr %d\n", +// p->op_class[j].op_class, +// p->op_class[j].channel_nr); +// +// for (k = 0; k < +// radio->supp_opclass[l].num_supported_channels; +// k++) +// radio->supp_opclass[l]. +// supp_chanlist[k].pref = 0xff; +// +// for (k = 0; k < p->op_class[j].channel_nr; k++) { +// int m; +// +// for (m = 0; m < +// radio->supp_opclass[l]. +// num_supported_channels ; m++) { +// trace("channel %d\n", +// p->op_class[j].channel_list[k]); +// if (p->op_class[j].channel_list[k] == +// radio->supp_opclass[l]. +// supp_chanlist[m].channel) { +// radio->supp_opclass[l]. +// supp_chanlist[m].pref = +// p->op_class[j].preference; +// +// trace("channel pref is %d\n", +// p->op_class[j].preference); +// } +// } +// } +// break; +// } +// } +// } +// *channel_resp_nr = *channel_resp_nr + 1; +// return ret; +} + +int handle_channel_sel_request(void *agent, struct cmdu_buff *cmdu) { trace("agent: %s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - int ret = 0; - struct channel_response channel_resp[MAX_RADIO]; - uint32_t channel_resp_nr = 0, match = 0; - int i; - uint8_t *tlv = NULL; - struct wifi_radio_element *radio; - uint32_t pref_tlv_present = 0; - - /* Here we first need to update the channel preference values - * from the channel selection request - * then send the CMDU for channel selection response - */ - if (cmdu->num_tlvs != 0) { - for (i = 0; i < cmdu->num_tlvs; i++) { - tlv = (uint8_t *) cmdu->tlvs[i]; - switch (*tlv) { - case MAP_TLV_CHANNEL_PREFERENCE: - { - struct tlv_channel_pref *p = - (struct tlv_channel_pref *)tlv; - pref_tlv_present = 1; - - ret = agent_process_channel_pref_tlv - (agent, p, channel_resp, - &channel_resp_nr); - } - case MAP_TLV_TRANSMIT_POWER_LIMIT: - { - struct tlv_tx_power_limit *p = - (struct tlv_tx_power_limit *)tlv; - int l; - - trace("tlv radio_id: " MACFMT "\n", - MAC2STR(p->radio_id)); - for (l = 0; l < a->num_radios; l++) { - radio = a->radios + l; - match = memcmp(radio->macaddr, p->radio_id, 6); - if (match == 0) { - /* Here we set the - * transmit_power_limit - * of the radio - */ - radio->transmit_power_limit = - p->tx_power_limit; - trace("transmit power %d\n", - p->tx_power_limit); - break; - } - } - } - default: - break; - } - } - } - - if (cmdu->num_tlvs == 0 || pref_tlv_present == 0) { - /* Here the condition is that the - * channel selection request have no tlvs or only transmit power tlv - * so we need to set all the prefernce in all radios to max 15 - */ - agent_fill_radio_max_preference(agent, - channel_resp, &channel_resp_nr); - } - - ret = send_channel_sel_response(agent, cmdu, - channel_resp, channel_resp_nr); - - return ret; -} - -int handle_sta_caps_query(void *agent, struct cmdu_cstruct *rec_cmdu) + return 0; +// struct agent *a = (struct agent *) agent; +// int ret = 0; +// struct channel_response channel_resp[MAX_RADIO]; +// uint32_t channel_resp_nr = 0, match = 0; +// int i; +// uint8_t *tlv = NULL; +// struct wifi_radio_element *radio; +// uint32_t pref_tlv_present = 0; +// +// /* Here we first need to update the channel preference values +// * from the channel selection request +// * then send the CMDU for channel selection response +// */ +// if (cmdu->num_tlvs != 0) { +// for (i = 0; i < cmdu->num_tlvs; i++) { +// tlv = (uint8_t *) cmdu->tlvs[i]; +// switch (*tlv) { +// case MAP_TLV_CHANNEL_PREFERENCE: +// { +// struct tlv_channel_pref *p = +// (struct tlv_channel_pref *)tlv; +// pref_tlv_present = 1; +// +// ret = agent_process_channel_pref_tlv +// (agent, p, channel_resp, +// &channel_resp_nr); +// } +// case MAP_TLV_TRANSMIT_POWER_LIMIT: +// { +// struct tlv_tx_power_limit *p = +// (struct tlv_tx_power_limit *)tlv; +// int l; +// +// trace("tlv radio_id: " MACFMT "\n", +// MAC2STR(p->radio_id)); +// for (l = 0; l < a->num_radios; l++) { +// radio = a->radios + l; +// match = memcmp(radio->macaddr, p->radio_id, 6); +// if (match == 0) { +// /* Here we set the +// * transmit_power_limit +// * of the radio +// */ +// radio->transmit_power_limit = +// p->tx_power_limit; +// trace("transmit power %d\n", +// p->tx_power_limit); +// break; +// } +// } +// } +// default: +// break; +// } +// } +// } +// +// if (cmdu->num_tlvs == 0 || pref_tlv_present == 0) { +// /* Here the condition is that the +// * channel selection request have no tlvs or only transmit power tlv +// * so we need to set all the prefernce in all radios to max 15 +// */ +// agent_fill_radio_max_preference(agent, +// channel_resp, &channel_resp_nr); +// } +// +// ret = send_channel_sel_response(agent, cmdu, +// channel_resp, channel_resp_nr); +// +// return ret; +} + +int handle_sta_caps_query(void *agent, struct cmdu_buff *rx_cmdu) { - struct agent *a = (struct agent *) agent; - struct cmdu_cstruct *cmdu; - struct tlv_client_info *p = NULL, *query; - struct tlv_client_cap_report *p1 = NULL; - struct tlv_error_code *p2 = NULL; - struct netif_fh *fh; - uint16_t tlv_index = 0, len; - // frame ctrl + duration/id + addr1 + addr2 + addr3 + sequence control - uint16_t offset = 2 + 2 + 6 + 6 + 6 + 2; - int rv = -1; - struct sta *s; - bool found = false; - uint8_t *body; - - if (rec_cmdu->num_tlvs == 0) - return -1; - - query = (struct tlv_client_info *) rec_cmdu->tlvs[0]; - if (query->tlv_type != MAP_TLV_CLIENT_INFO) - return -1; - - cmdu = (struct cmdu_cstruct *)calloc(1, sizeof(struct cmdu_cstruct)); - if (!cmdu) { - dbg("Out of memory!\n"); - return -1; - } - - cmdu->message_type = CMDU_CLIENT_CAPABILITY_REPORT; - cmdu->message_id = rec_cmdu->message_id; - cmdu->num_tlvs = 3; - - memcpy(cmdu->origin, rec_cmdu->origin, 6); - strcpy(cmdu->intf_name, rec_cmdu->intf_name); - p = (struct tlv_client_info *)calloc(1, sizeof(struct tlv_client_info)); - if (!p) - goto fail_cmdu; - - p->tlv_type = MAP_TLV_CLIENT_INFO; - memcpy(p->bssid, query->bssid, 6); - memcpy(p->client_addr, query->client_addr, 6); - p1 = (struct tlv_client_cap_report *) calloc(1, - sizeof(struct tlv_client_cap_report)); - if (!p1) - goto fail_cmdu; - - p1->result_code = 0x01; - p1->tlv_type = MAP_TLV_CLIENT_CAPABILITY_REPORT; - - p2 = (struct tlv_error_code *) calloc(1, sizeof(struct tlv_error_code)); - if (!p2) - goto fail_cmdu; - - p2->reason_code = 0x03; - p2->tlv_type = MAP_TLV_ERROR_CODE; - memcpy(p2->addr, query->client_addr, 6); - - fh = get_netif_by_bssid(a, query->bssid); - if (!fh) { - dbg("BSS not found!\n"); - goto send_cmdu; - } - - list_for_each_entry(s, &fh->stalist, list) - if (!memcmp(s->macaddr, query->client_addr, 6)) { - found = true; - break; - } - if (!found || !s) { - p2->reason_code = 0x02; - dbg("Missing client!\n"); - goto send_cmdu; - } - - if (!s->assoc_frame) { - dbg("Missing assoc frame!\n"); - goto send_cmdu; - } - - /* if bit is set, HT Control section is included and - * should be skipped - */ - if (!(s->assoc_frame->frame[0] & 0x80)) - offset += 4; - - body = s->assoc_frame->frame + offset; - /* subtract 4 from remaining len to not include FCS section */ - len = s->assoc_frame->len - offset - 4; - - cmdu->num_tlvs--; - p1->result_code = 0x00; - p1->frame_body = calloc(len, sizeof(uint8_t)); - if (!p1->frame_body) - goto fail_cmdu; - - /* first byte annotates length of frame */ - *(p1->frame_body) = (1 + len); - - memcpy(p1->frame_body + 1, body, len); - p2->reason_code = 0x00; - -send_cmdu: - cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); - if (!cmdu->tlvs) - goto fail_cmdu; - - cmdu->tlvs[tlv_index++] = (uint8_t *)p; - cmdu->tlvs[tlv_index++] = (uint8_t *)p1; - if (p2->reason_code) - cmdu->tlvs[tlv_index++] = (uint8_t *)p2; - - rv = agent_send_cmdu(a, cmdu); - -fail_cmdu: - map_free_cmdu(cmdu); - return rv; -} - -int handle_ap_metrics_query(void *agent, struct cmdu_cstruct *cmdu) + return 0; +// struct agent *a = (struct agent *) agent; +// struct cmdu_cstruct *cmdu; +// struct tlv_client_info *p = NULL, *query; +// struct tlv_client_cap_report *p1 = NULL; +// struct tlv_error_code *p2 = NULL; +// struct netif_fh *fh; +// uint16_t tlv_index = 0, len; +// // frame ctrl + duration/id + addr1 + addr2 + addr3 + sequence control +// uint16_t offset = 2 + 2 + 6 + 6 + 6 + 2; +// int rv = -1; +// struct sta *s; +// bool found = false; +// uint8_t *body; +// +// if (rx_cmdu->num_tlvs == 0) +// return -1; +// +// query = (struct tlv_client_info *) rx_cmdu->tlvs[0]; +// if (query->tlv_type != MAP_TLV_CLIENT_INFO) +// return -1; +// +// cmdu = (struct cmdu_cstruct *)calloc(1, sizeof(struct cmdu_cstruct)); +// if (!cmdu) { +// dbg("Out of memory!\n"); +// return -1; +// } +// +// cmdu->message_type = CMDU_CLIENT_CAPABILITY_REPORT; +// cmdu->message_id = rx_cmdu->message_id; +// cmdu->num_tlvs = 3; +// +// memcpy(cmdu->origin, rx_cmdu->origin, 6); +// strcpy(cmdu->intf_name, rx_cmdu->intf_name); +// p = (struct tlv_client_info *)calloc(1, sizeof(struct tlv_client_info)); +// if (!p) +// goto fail_cmdu; +// +// p->tlv_type = MAP_TLV_CLIENT_INFO; +// memcpy(p->bssid, query->bssid, 6); +// memcpy(p->client_addr, query->client_addr, 6); +// p1 = (struct tlv_client_cap_report *) calloc(1, +// sizeof(struct tlv_client_cap_report)); +// if (!p1) +// goto fail_cmdu; +// +// p1->result_code = 0x01; +// p1->tlv_type = MAP_TLV_CLIENT_CAPABILITY_REPORT; +// +// p2 = (struct tlv_error_code *) calloc(1, sizeof(struct tlv_error_code)); +// if (!p2) +// goto fail_cmdu; +// +// p2->reason_code = 0x03; +// p2->tlv_type = MAP_TLV_ERROR_CODE; +// memcpy(p2->addr, query->client_addr, 6); +// +// fh = get_netif_by_bssid(a, query->bssid); +// if (!fh) { +// dbg("BSS not found!\n"); +// goto send_cmdu; +// } +// +// list_for_each_entry(s, &fh->stalist, list) +// if (!memcmp(s->macaddr, query->client_addr, 6)) { +// found = true; +// break; +// } +// if (!found || !s) { +// p2->reason_code = 0x02; +// dbg("Missing client!\n"); +// goto send_cmdu; +// } +// +// if (!s->assoc_frame) { +// dbg("Missing assoc frame!\n"); +// goto send_cmdu; +// } +// +// /* if bit is set, HT Control section is included and +// * should be skipped +// */ +// if (!(s->assoc_frame->frame[0] & 0x80)) +// offset += 4; +// +// body = s->assoc_frame->frame + offset; +// /* subtract 4 from remaining len to not include FCS section */ +// len = s->assoc_frame->len - offset - 4; +// +// cmdu->num_tlvs--; +// p1->result_code = 0x00; +// p1->frame_body = calloc(len, sizeof(uint8_t)); +// if (!p1->frame_body) +// goto fail_cmdu; +// +// /* first byte annotates length of frame */ +// *(p1->frame_body) = (1 + len); +// +// memcpy(p1->frame_body + 1, body, len); +// p2->reason_code = 0x00; +// +//send_cmdu: +// cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); +// if (!cmdu->tlvs) +// goto fail_cmdu; +// +// cmdu->tlvs[tlv_index++] = (uint8_t *)p; +// cmdu->tlvs[tlv_index++] = (uint8_t *)p1; +// if (p2->reason_code) +// cmdu->tlvs[tlv_index++] = (uint8_t *)p2; +// +// rv = agent_send_cmdu(a, cmdu); +// +//fail_cmdu: +// map_free_cmdu(cmdu); +// return rv; +} + +int handle_ap_metrics_query(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); - prepare_ap_metrics_response(agent, cmdu); +// prepare_ap_metrics_response(agent, cmdu); return 0; } -int handle_sta_link_metrics_query(void *agent, struct cmdu_cstruct *rec_cmdu) +int handle_sta_link_metrics_query(void *agent, struct cmdu_buff *rx_cmdu) { trace("%s: --->\n", __func__); - struct cmdu_cstruct *cmdu; - struct agent *a = (struct agent *)agent; - - cmdu = agent_gen_assoc_sta_metric_response(a, rec_cmdu); - if (!cmdu) - return -1; - - agent_send_cmdu(a, cmdu); - map_free_cmdu(cmdu); - return 0; +// struct cmdu_cstruct *cmdu; +// struct agent *a = (struct agent *)agent; +// +// cmdu = agent_gen_assoc_sta_metric_response(a, rx_cmdu); +// if (!cmdu) +// return -1; +// +// agent_send_cmdu(a, cmdu); +// map_free_cmdu(cmdu); +// +// return 0; } int handle_unassoc_sta_link_metrics_query(void *agent, - struct cmdu_cstruct *cmdu) + struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); return 0; } int handle_unassoc_sta_link_metrics_response(void *agent, - struct cmdu_cstruct *cmdu) + struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); return 0; } -int handle_beacon_metrics_query(void *agent, struct cmdu_cstruct *cmdu) +int handle_beacon_metrics_query(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); return 0; } -int handle_beacon_metrics_response(void *agent, struct cmdu_cstruct *cmdu) +int handle_beacon_metrics_response(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); return 0; } -int handle_combined_infra_metrics(void *agent, struct cmdu_cstruct *cmdu) +int handle_combined_infra_metrics(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); return 0; @@ -2337,43 +2415,44 @@ bool agent_rcpi_steer(void) return false; } -int validate_sta_bssid_assoc(struct netif_fh *fh, struct tlv_steer_Req *p, +int validate_sta_bssid_assoc(struct netif_fh *fh, uint8_t *p, struct sta_error_response *sta_resp, uint32_t *cnt, struct agent *a) { - int l = 0; - struct sta *s; - uint32_t count = 0; - uint32_t res = 0, found = 0; - - for (l = 0; l < p->sta_list_cnt; l++) { - list_for_each_entry(s, &fh->stalist, list) { - trace("stalist :" MACFMT "\n", - MAC2STR(s->macaddr)); - res = memcmp(s->macaddr, p->steering_req_macs[l].addr, 6); - if (res == 0) { - found = 1; - /** - * Here as the sta is present check that in this case - * for steering opportunity put that in the array - */ - if (p->request_mode == 0x00) { - memcpy(a->sta_steer_list[a->sta_steerlist_count].sta_mac, - p->steering_req_macs[l].addr, 6); - a->sta_steerlist_count = a->sta_steerlist_count + 1; - } - break; - } - } - if (found == 0 || !s) { - dbg("Missing STA client!\n"); - memcpy(sta_resp[count].sta_mac, p->steering_req_macs[l].addr, 6); - sta_resp[count].response = 0x02; - count++; - } - } - *cnt += count; return 0; +// int l = 0; +// struct sta *s; +// uint32_t count = 0; +// uint32_t res = 0, found = 0; +// +// for (l = 0; l < p->sta_list_cnt; l++) { +// list_for_each_entry(s, &fh->stalist, list) { +// trace("stalist :" MACFMT "\n", +// MAC2STR(s->macaddr)); +// res = memcmp(s->macaddr, p->steering_req_macs[l].addr, 6); +// if (res == 0) { +// found = 1; +// /** +// * Here as the sta is present check that in this case +// * for steering opportunity put that in the array +// */ +// if (p->request_mode == 0x00) { +// memcpy(a->sta_steer_list[a->sta_steerlist_count].sta_mac, +// p->steering_req_macs[l].addr, 6); +// a->sta_steerlist_count = a->sta_steerlist_count + 1; +// } +// break; +// } +// } +// if (found == 0 || !s) { +// dbg("Missing STA client!\n"); +// memcpy(sta_resp[count].sta_mac, p->steering_req_macs[l].addr, 6); +// sta_resp[count].response = 0x02; +// count++; +// } +// } +// *cnt += count; +// return 0; } int agent_send_request_transition(void *agent, uint8_t *client_sta, @@ -2441,54 +2520,55 @@ int agent_search_bssid_for_sta(struct agent *a, uint8_t *sta, uint8_t *bssid, } int send_1905_acknowledge(void *agent, - struct cmdu_cstruct *rec_cmdu, + struct cmdu_buff *rx_cmdu, struct sta_error_response *sta_resp, uint32_t sta_count) { - struct agent *a = (struct agent *) agent; - uint16_t tlv_index = 0; - uint32_t j; - struct cmdu_cstruct *cmdu_data; - int ret = 0; - - trace("agent: %s: --->\n", __func__); - cmdu_data = (struct cmdu_cstruct *)calloc(1, - sizeof(struct cmdu_cstruct)); - - if (!cmdu_data) { - fprintf(stderr, "Out of memory!\n"); - return -1; - } - - cmdu_data->message_type = CMDU_1905_ACK; - memcpy(cmdu_data->origin, rec_cmdu->origin, 6); - //cmdu_data->message_id = 11; - strcpy(cmdu_data->intf_name, rec_cmdu->intf_name); - - cmdu_data->num_tlvs = sta_count; /* (TLV for error) */ - cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, - sizeof(uint8_t *)); - - if (!cmdu_data->tlvs) { - map_free_cmdu(cmdu_data); - return -1; - } - - /* Error Code TLV 17.2.36 */ - for (j = 0; j < sta_count; j++) { - struct tlv_error_code *p = NULL; - /** - * Here we need to check that the sta error - * response - */ - p = agent_gen_tlv_error_code(a, rec_cmdu, - sta_resp[j].sta_mac, sta_resp[j].response); - if (!p) - continue; - cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; - } - ret = agent_send_cmdu(a, cmdu_data); - map_free_cmdu(cmdu_data); - return ret; + return 0; +// struct agent *a = (struct agent *) agent; +// uint16_t tlv_index = 0; +// uint32_t j; +// struct cmdu_cstruct *cmdu_data; +// int ret = 0; +// +// trace("agent: %s: --->\n", __func__); +// cmdu_data = (struct cmdu_cstruct *)calloc(1, +// sizeof(struct cmdu_cstruct)); +// +// if (!cmdu_data) { +// fprintf(stderr, "Out of memory!\n"); +// return -1; +// } +// +// cmdu_data->message_type = CMDU_1905_ACK; +// memcpy(cmdu_data->origin, rx_cmdu->origin, 6); +// //cmdu_data->message_id = 11; +// strcpy(cmdu_data->intf_name, rx_cmdu->intf_name); +// +// cmdu_data->num_tlvs = sta_count; /* (TLV for error) */ +// cmdu_data->tlvs = (uint8_t **)calloc(cmdu_data->num_tlvs, +// sizeof(uint8_t *)); +// +// if (!cmdu_data->tlvs) { +// map_free_cmdu(cmdu_data); +// return -1; +// } +// +// /* Error Code TLV 17.2.36 */ +// for (j = 0; j < sta_count; j++) { +// struct tlv_error_code *p = NULL; +// /** +// * Here we need to check that the sta error +// * response +// */ +// p = agent_gen_tlv_error_code(a, rx_cmdu, +// sta_resp[j].sta_mac, sta_resp[j].response); +// if (!p) +// continue; +// cmdu_data->tlvs[tlv_index++] = (uint8_t *)p; +// } +// ret = agent_send_cmdu(a, cmdu_data); +// map_free_cmdu(cmdu_data); +// return ret; } int agent_send_restrict_sta(void *agent, uint32_t count_sta, @@ -2583,913 +2663,924 @@ int agent_check_start_validity_tmr(uint16_t validity_period, list_add_tail(&ss->list, &fh->restrict_stalist); } } - return 0; -} - -int agent_check_stop_validity_tmr(uint32_t sta_count, uint8_t stalist[][6], - struct netif_fh *fh) -{ - uint32_t i = 0; - struct restrict_sta_entry *s = NULL, *tmp = NULL; - - trace("agent: %s: --->\n", __func__); - if (stalist == NULL) - return -1; - - for (i = 0; i < sta_count; i++) { - // check if the sta is already running a timer - // delete the timer - list_for_each_entry_safe(s, tmp, &fh->restrict_stalist, list) { - if (s != NULL) { - if (!memcmp(s->sta, stalist[i], 6)) { - uloop_timeout_cancel(&s->restrict_timer); - list_del(&s->list); - free(s); - } - } - } - } - return 0; -} - -int agent_process_assoc_cntl_tlv(void *agent, - struct tlv_client_assoc_control_req *p, - struct cmdu_cstruct *cmdu) -{ - trace("agent: %s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - int ret = 0, result = 0; - uint32_t match = 0, found = 0; - int i, j, k, l, m; - struct netif_fh *fh; - struct sta *s; - struct sta_error_response sta_resp[MAX_STA]; - uint32_t count = 0; - uint32_t res = 0, present = 0; - uint8_t sta_list[30][6]; - - for (m = 0; m < p->sta_list_cnt; m++) - memcpy(sta_list[m], p->client_assoc_ctrl_req_stas[m].addr, 6); - - fh = get_netif_by_bssid(a, p->bssid); - if (!fh) { - trace("[%s:%d] Error BSSID not present", __func__, __LINE__); - return -1; - } - - /*Here we first validate that the STA has been sent for - * blocking */ - if (p->assoc_control == 0x00) { - - /*Check if the validity timer value is not zero*/ - if (p->validity_period == 0) { - trace("[%s:%d] Error validity period is invalid\n", __func__, __LINE__); - return -1; - } - - /* Here we validate if the sta is associated with the bssid - * then we need to send an error TLV as the STA should not - * be associated with the bssid for which the blocking mode is - * set */ - - for (l = 0; l < p->sta_list_cnt; l++) { - list_for_each_entry(s, &fh->stalist, list) { - trace("stalist :" MACFMT "\n", - MAC2STR(s->macaddr)); - res = memcmp(s->macaddr, p->client_assoc_ctrl_req_stas[l].addr, 6); - if (res == 0) { - found = 1; - break; - } - } - if (found == 1) { - dbg("STA client already associated with the bssid!\n"); - memcpy(sta_resp[count].sta_mac, p->client_assoc_ctrl_req_stas[l].addr, 6); - sta_resp[count].response = 0x01; - count++; - } - } - /*Here we need the logic to block the STA*/ - ret = agent_send_restrict_sta(agent, p->sta_list_cnt, - sta_list, fh, p->assoc_control); - if (ret != 0) { - trace("[%s:%d] Error in agent_send_restrict_sta\n", __func__, __LINE__); - return -1; - } - /* Here we need to start the timer for which the sta is blocked as - * per the validity period also need to check if the sta is all - * in the blocking list */ - ret = agent_check_start_validity_tmr(p->validity_period, p->sta_list_cnt, sta_list, fh); - if (ret != 0) { - trace("[%s:%d] Error in start validity tmr\n", __func__, __LINE__); - return -1; - } - } else if (p->assoc_control == 0x01) { - - /*Here we will ignore the validity timer value in the request - * as the validity timer value is ignored in the unblock case */ - /*Here we need to check if the validity timer is already running - * in that case we need to stop the validity timer */ - ret = agent_check_stop_validity_tmr(p->sta_list_cnt, sta_list, fh); - if (ret != 0) { - trace("[%s:%d] Error in stop validity tmr\n", __func__, __LINE__); - return -1; - } - /*Here we need the logic to unblock the STA */ - ret = agent_send_restrict_sta(agent, p->sta_list_cnt, - sta_list, fh, p->assoc_control); - if (ret != 0) { - trace("[%s:%d] Error in agent_send_restrict_sta\n", __func__, __LINE__); - return -1; - } - } else { - trace("[%s:%d] Reserved mode is called", __func__, __LINE__); - } - -send_ack: - send_1905_acknowledge(agent, cmdu, sta_resp, count); - return ret; -} - -int agent_process_steer_request_tlv(void *agent, struct tlv_steer_Req *p, - struct cmdu_cstruct *cmdu) -{ - trace("agent: %s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - int ret = 0, result = 0; - int l, m; - struct netif_fh *fh; - struct sta *s; - struct sta_error_response sta_resp[MAX_STA]; - uint32_t count = 0; - char wildcard_str[18] = { 0x0 }; - uint8_t wildcard[6]; - uint8_t wildcard_bssid[6]; - uint32_t res = 0, present = 0; - - snprintf(wildcard_str, 18, "FF:FF:FF:FF:FF:FF"); - hwaddr_aton(wildcard_str, wildcard); - - trace("request_mode: %d\n", - p->request_mode); - - if (p->request_mode == 0x00) { - /* Here we start the steer opportunity timer */ - if (a->is_sta_steer_start == 1) { - trace("Error steering opportunity timer already running\n"); - return 1; - } - - /** - * Here we need to check the three conditions that needs to be - * satisfied according to section 11.2 - */ - if (p->steer_opp_window == 0) { - trace("Error steering opportunity timer value is zero\n"); - return 1; - } - - /** - * TODO check that the sta mac address is not included - * in the Local Steering Disallowed STA List in the Steering - * Policy TLV - */ - a->is_sta_steer_start = 1; - a->sta_steerlist_count = 0; - uloop_timeout_set(&a->sta_steer_req_timer, p->steer_opp_window * 1000); - - } else if (p->request_mode != 0x01) { - trace("Invalid request mode"); - return 1; - } - - /* TODO check the rcpi based steering rule section 11.3*/ - agent_rcpi_steer(); - - /** - * The src bssid is with which the STA is associated so - * Here we need to check that the STA is associated with the - * src_bssid according to section 11.1 of the steer mandate - * Here we trace the values - */ - trace("btm_disassoc_imminent: %d\n", - p->btm_disassoc_imminent); - trace("btm_abridged: %d\n", - p->btm_abridged); - trace("reserved: %d\n", - p->reserved); - trace("steer_opp_window: %d\n", - p->steer_opp_window); - trace("btm_disassoc_timer: %d\n", - p->btm_disassoc_timer); - trace("sta_list_cnt: %d\n", - p->sta_list_cnt); - trace("target_bssid_list_cnt: %d\n", - p->target_bssid_list_cnt); - trace("src_bssid: " MACFMT "\n", - MAC2STR(p->bssid)); - - /* Here we validate if the sta is associated with the src bssid */ - fh = get_netif_by_bssid(a, p->bssid); - if (!fh) { - trace("[%s:%d] Error BSSID not present", __func__, __LINE__); - for (l = 0; l < p->sta_list_cnt; l++) { - memcpy(sta_resp[count].sta_mac, p->steering_req_macs[l].addr, 6); - sta_resp[count].response = 0x02; - count++; - goto send_ack; - } - } - - ret = validate_sta_bssid_assoc(fh, p, sta_resp, &count, a); - if (ret == -1) - goto send_ack; - - /* Number of STAs and BSSIDs are equal, map STA to BSSID */ - if (p->sta_list_cnt > 0 && p->sta_list_cnt == p->target_bssid_list_cnt) { - for (l = 0; l < p->sta_list_cnt; l++) { - trace("sta_addr: " MACFMT "\n", - MAC2STR(p->steering_req_macs[l].addr)); - trace("target bssid: " MACFMT "\n", - MAC2STR(p->steering_req_target_bssids[l].bssid)); - trace("op_class: %d\n", - p->steering_req_target_bssids[l].op_class); - trace("channel: %d\n", - p->steering_req_target_bssids[l].channel); - /** - * Here we need to check that the STA is associated with the - * src bssid or not - */ - present = 0; - trace("count of error code sta %d\n", count); - for (m = 0; m < count; m++) { - trace("steer mac: " MACFMT "\n", - MAC2STR(p->steering_req_macs[l].addr)); - trace("sta error mac: " MACFMT "\n", - MAC2STR(sta_resp[m].sta_mac)); - res = memcmp(p->steering_req_macs[l].addr, - sta_resp[m].sta_mac, 6); - if (res == 0) { - present = 1; - break; - } - } - if (present != 1) { - /*Here we call for transition of sta*/ - ret = agent_transition_sta(a, p, fh, l, l); - } - } - } - /* Multiple STAs and single BSSID, send all STAs to same BSSID */ - else if (p->sta_list_cnt > 0 && p->target_bssid_list_cnt == 1) { - trace("target bssid: " MACFMT "\n", - MAC2STR(p->steering_req_target_bssids[0].bssid)); - trace("op_class: %d\n", - p->steering_req_target_bssids[0].op_class); - trace("channel: %d\n", - p->steering_req_target_bssids[0].channel); - - for (l = 0; l < p->sta_list_cnt; l++) { - /* Here we need to call the ubus method */ - trace("sta_addr: " MACFMT "\n", - MAC2STR(p->steering_req_macs[l].addr)); - /** - * Here we need to check that the STA is associated with - * the src bssid or not - */ - present = 0; - for (m = 0; m < count; m++) { - res = memcmp(p->steering_req_macs[l].addr, - sta_resp[m].sta_mac, 6); - if (res == 0) { - present = 1; - break; - } - } - if (present != 1) { - /*Here we call for transition of sta*/ - ret = agent_transition_sta(a, p, fh, l, 0); - } - } - } - /** - * No STA provided, Steering request applies to all associated STAs - * in the BSS, per policy setting. - */ - else if (p->sta_list_cnt == 0 && p->target_bssid_list_cnt == 1) { - result = memcmp(p->steering_req_target_bssids[0].bssid, wildcard, 6); - if (result == 0) { - trace("[%s:%d] bssid id wildcard", __func__, __LINE__); - ret = agent_search_bssid_for_sta(a, - p->steering_req_macs[l].addr, wildcard_bssid, p->bssid); - if (ret != 0) { - list_for_each_entry(s, &fh->stalist, list) { - ret = agent_send_request_transition( - agent, s->macaddr, - fh, wildcard_bssid, 0); - } - } - } else { - list_for_each_entry(s, &fh->stalist, list) { - ret = agent_send_request_transition( - agent, s->macaddr, - fh, p->steering_req_target_bssids[0].bssid, 0); - } - } - } - /* No BSSID specified for the STAs */ - else if (p->sta_list_cnt > 0 && p->target_bssid_list_cnt == 0) { - if (p->request_mode != 0x00) { - trace("[%s:%d]Error steer mandate target BSSID not present\n", - __func__, __LINE__); - return 1; - } - trace("[%s:%d] target BSSID not present\n", __func__, __LINE__); - for (l = 0; l < p->sta_list_cnt; l++) { - trace("sta_addr: " MACFMT "\n", - MAC2STR(p->steering_req_macs[l].addr)); - /** - * Here we need to check that the STA is associated with the - * src bssid or not - */ - present = 0; - for (m = 0; m < count; m++) { - res = memcmp(p->steering_req_macs[l].addr, sta_resp[m].sta_mac, 6); - if (res == 0) { - present = 1; - break; - } - } - if (present != 1) { - /** - * Here we need to get the bssids that are best - * for the STAs in case of steering opportunity - */ - ret = agent_search_bssid_for_sta(a, - p->steering_req_macs[l].addr, - wildcard_bssid, p->bssid); - if (ret != 0) - ret = agent_send_request_transition( - agent, p->steering_req_macs[l].addr, - fh, wildcard_bssid, 0); - } - } - } - /* No BSSID or STAs */ - else if (p->sta_list_cnt == 0 && p->target_bssid_list_cnt == 0) { - trace("[%s:%d] Error No STA and target BSSID present\n", __func__, __LINE__); - return 1; - } else { - trace("[%s:%d] Error condition\n", __func__, __LINE__); - return 1; - } - -send_ack: - send_1905_acknowledge(agent, cmdu, sta_resp, count); - return ret; -} - -int handle_sta_steer_request(void *agent, struct cmdu_cstruct *cmdu) -{ - trace("%s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - int ret = 0; - int i; - uint8_t *tlv = NULL; - - /* Here we first parse the steer request */ - if (cmdu->num_tlvs != 0) { - for (i = 0; i < cmdu->num_tlvs; i++) { - tlv = (uint8_t *) cmdu->tlvs[i]; - switch (*tlv) { - case MAP_TLV_STEERING_REQUEST: - { - struct tlv_steer_Req *p = - (struct tlv_steer_Req *)tlv; - - ret = agent_process_steer_request_tlv(agent, - p, cmdu); - break; - } -//#ifdef profile2 - case MAP_TLV_PROFILE2_STEERING_REQ: - { - //TODO here we need to call the request transmission for the - //STAs are Agile Multiband capable - struct tlv_profile2_steer_req *p = - (struct tlv_profile2_steer_req *)tlv; - - break; - } -//#endif - default: - break; - } - } - } - return ret; + return 0; } -int agent_transition_sta(struct agent *a, struct tlv_steer_Req *p, struct netif_fh *fh, - int l, int m) +int agent_check_stop_validity_tmr(uint32_t sta_count, uint8_t stalist[][6], + struct netif_fh *fh) { - uint8_t wildcard[6]; - uint8_t wildcard_bssid[6]; - int result = 0; - char wildcard_str[18] = { 0x0 }; - int ret = 0; + uint32_t i = 0; + struct restrict_sta_entry *s = NULL, *tmp = NULL; trace("agent: %s: --->\n", __func__); - snprintf(wildcard_str, 18, "FF:FF:FF:FF:FF:FF"); - hwaddr_aton(wildcard_str, wildcard); - - result = memcmp(p->steering_req_target_bssids[l].bssid, wildcard, 6); - if (result == 0) { - /** - * code to search bssid as the bssid is a - * wildcard - */ - trace("[%s:%d] bssid id wildcard\n", - __func__, __LINE__); - ret = agent_search_bssid_for_sta(a, - p->steering_req_macs[l].addr, - wildcard_bssid, p->bssid); - if (ret == 0) - ret = agent_send_request_transition(a, - p->steering_req_macs[l].addr, - fh, wildcard_bssid, 0); - } else { - ret = agent_send_request_transition(a, - p->steering_req_macs[l].addr, - fh, p->steering_req_target_bssids[m].bssid, 0); - } - return 0; -} + if (stalist == NULL) + return -1; -int handle_sta_assoc_control_request(void *agent, struct cmdu_cstruct *cmdu) -{ - trace("%s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - int ret = 0; - int i; - uint8_t *tlv = NULL; - - /* Here we first parse the steer request */ - if (cmdu->num_tlvs != 0) { - for (i = 0; i < cmdu->num_tlvs; i++) { - tlv = (uint8_t *) cmdu->tlvs[i]; - switch (*tlv) { - case MAP_TLV_CLIENT_ASSOCIATION_CONTROL_REQUEST: - { - struct tlv_client_assoc_control_req *p = - (struct tlv_client_assoc_control_req *)tlv; - - ret = agent_process_assoc_cntl_tlv(agent, - p, cmdu); + for (i = 0; i < sta_count; i++) { + // check if the sta is already running a timer + // delete the timer + list_for_each_entry_safe(s, tmp, &fh->restrict_stalist, list) { + if (s != NULL) { + if (!memcmp(s->sta, stalist[i], 6)) { + uloop_timeout_cancel(&s->restrict_timer); + list_del(&s->list); + free(s); } - default: - break; } } } - return ret; + return 0; } -int handle_hld_message(void *agent, struct cmdu_cstruct *cmdu) +int agent_process_assoc_cntl_tlv(void *agent, + struct tlv_client_assoc_control_req *p, + struct cmdu_buff *cmdu) +{ + return 0; + trace("agent: %s: --->\n", __func__); +// struct agent *a = (struct agent *) agent; +// int ret = 0, result = 0; +// uint32_t match = 0, found = 0; +// int i, j, k, l, m; +// struct netif_fh *fh; +// struct sta *s; +// struct sta_error_response sta_resp[MAX_STA]; +// uint32_t count = 0; +// uint32_t res = 0, present = 0; +// uint8_t sta_list[30][6]; +// +// for (m = 0; m < p->sta_list_cnt; m++) +// memcpy(sta_list[m], p->client_assoc_ctrl_req_stas[m].addr, 6); +// +// fh = get_netif_by_bssid(a, p->bssid); +// if (!fh) { +// trace("[%s:%d] Error BSSID not present", __func__, __LINE__); +// return -1; +// } +// +// /*Here we first validate that the STA has been sent for +// * blocking */ +// if (p->assoc_control == 0x00) { +// +// /*Check if the validity timer value is not zero*/ +// if (p->validity_period == 0) { +// trace("[%s:%d] Error validity period is invalid\n", __func__, __LINE__); +// return -1; +// } +// +// /* Here we validate if the sta is associated with the bssid +// * then we need to send an error TLV as the STA should not +// * be associated with the bssid for which the blocking mode is +// * set */ +// +// for (l = 0; l < p->sta_list_cnt; l++) { +// list_for_each_entry(s, &fh->stalist, list) { +// trace("stalist :" MACFMT "\n", +// MAC2STR(s->macaddr)); +// res = memcmp(s->macaddr, p->client_assoc_ctrl_req_stas[l].addr, 6); +// if (res == 0) { +// found = 1; +// break; +// } +// } +// if (found == 1) { +// dbg("STA client already associated with the bssid!\n"); +// memcpy(sta_resp[count].sta_mac, p->client_assoc_ctrl_req_stas[l].addr, 6); +// sta_resp[count].response = 0x01; +// count++; +// } +// } +// /*Here we need the logic to block the STA*/ +// ret = agent_send_restrict_sta(agent, p->sta_list_cnt, +// sta_list, fh, p->assoc_control); +// if (ret != 0) { +// trace("[%s:%d] Error in agent_send_restrict_sta\n", __func__, __LINE__); +// return -1; +// } +// /* Here we need to start the timer for which the sta is blocked as +// * per the validity period also need to check if the sta is all +// * in the blocking list */ +// ret = agent_check_start_validity_tmr(p->validity_period, p->sta_list_cnt, sta_list, fh); +// if (ret != 0) { +// trace("[%s:%d] Error in start validity tmr\n", __func__, __LINE__); +// return -1; +// } +// } else if (p->assoc_control == 0x01) { +// +// /*Here we will ignore the validity timer value in the request +// * as the validity timer value is ignored in the unblock case */ +// /*Here we need to check if the validity timer is already running +// * in that case we need to stop the validity timer */ +// ret = agent_check_stop_validity_tmr(p->sta_list_cnt, sta_list, fh); +// if (ret != 0) { +// trace("[%s:%d] Error in stop validity tmr\n", __func__, __LINE__); +// return -1; +// } +// /*Here we need the logic to unblock the STA */ +// ret = agent_send_restrict_sta(agent, p->sta_list_cnt, +// sta_list, fh, p->assoc_control); +// if (ret != 0) { +// trace("[%s:%d] Error in agent_send_restrict_sta\n", __func__, __LINE__); +// return -1; +// } +// } else { +// trace("[%s:%d] Reserved mode is called", __func__, __LINE__); +// } +// +//send_ack: +// send_1905_acknowledge(agent, cmdu, sta_resp, count); +// return ret; +} + +int agent_process_steer_request_tlv(void *agent, uint8_t *p, + struct cmdu_buff *cmdu) +{ + trace("agent: %s: --->\n", __func__); + return 0; +// struct agent *a = (struct agent *) agent; +// int ret = 0, result = 0; +// int l, m; +// struct netif_fh *fh; +// struct sta *s; +// struct sta_error_response sta_resp[MAX_STA]; +// uint32_t count = 0; +// char wildcard_str[18] = { 0x0 }; +// uint8_t wildcard[6]; +// uint8_t wildcard_bssid[6]; +// uint32_t res = 0, present = 0; +// +// snprintf(wildcard_str, 18, "FF:FF:FF:FF:FF:FF"); +// hwaddr_aton(wildcard_str, wildcard); +// +// trace("request_mode: %d\n", +// p->request_mode); +// +// if (p->request_mode == 0x00) { +// /* Here we start the steer opportunity timer */ +// if (a->is_sta_steer_start == 1) { +// trace("Error steering opportunity timer already running\n"); +// return 1; +// } +// +// /** +// * Here we need to check the three conditions that needs to be +// * satisfied according to section 11.2 +// */ +// if (p->steer_opp_window == 0) { +// trace("Error steering opportunity timer value is zero\n"); +// return 1; +// } +// +// /** +// * TODO check that the sta mac address is not included +// * in the Local Steering Disallowed STA List in the Steering +// * Policy TLV +// */ +// a->is_sta_steer_start = 1; +// a->sta_steerlist_count = 0; +// uloop_timeout_set(&a->sta_steer_req_timer, p->steer_opp_window * 1000); +// +// } else if (p->request_mode != 0x01) { +// trace("Invalid request mode"); +// return 1; +// } +// +// /* TODO check the rcpi based steering rule section 11.3*/ +// agent_rcpi_steer(); +// +// /** +// * The src bssid is with which the STA is associated so +// * Here we need to check that the STA is associated with the +// * src_bssid according to section 11.1 of the steer mandate +// * Here we trace the values +// */ +// trace("btm_disassoc_imminent: %d\n", +// p->btm_disassoc_imminent); +// trace("btm_abridged: %d\n", +// p->btm_abridged); +// trace("reserved: %d\n", +// p->reserved); +// trace("steer_opp_window: %d\n", +// p->steer_opp_window); +// trace("btm_disassoc_timer: %d\n", +// p->btm_disassoc_timer); +// trace("sta_list_cnt: %d\n", +// p->sta_list_cnt); +// trace("target_bssid_list_cnt: %d\n", +// p->target_bssid_list_cnt); +// trace("src_bssid: " MACFMT "\n", +// MAC2STR(p->bssid)); +// +// /* Here we validate if the sta is associated with the src bssid */ +// fh = get_netif_by_bssid(a, p->bssid); +// if (!fh) { +// trace("[%s:%d] Error BSSID not present", __func__, __LINE__); +// for (l = 0; l < p->sta_list_cnt; l++) { +// memcpy(sta_resp[count].sta_mac, p->steering_req_macs[l].addr, 6); +// sta_resp[count].response = 0x02; +// count++; +// goto send_ack; +// } +// } +// +// ret = validate_sta_bssid_assoc(fh, p, sta_resp, &count, a); +// if (ret == -1) +// goto send_ack; +// +// /* Number of STAs and BSSIDs are equal, map STA to BSSID */ +// if (p->sta_list_cnt > 0 && p->sta_list_cnt == p->target_bssid_list_cnt) { +// for (l = 0; l < p->sta_list_cnt; l++) { +// trace("sta_addr: " MACFMT "\n", +// MAC2STR(p->steering_req_macs[l].addr)); +// trace("target bssid: " MACFMT "\n", +// MAC2STR(p->steering_req_target_bssids[l].bssid)); +// trace("op_class: %d\n", +// p->steering_req_target_bssids[l].op_class); +// trace("channel: %d\n", +// p->steering_req_target_bssids[l].channel); +// /** +// * Here we need to check that the STA is associated with the +// * src bssid or not +// */ +// present = 0; +// trace("count of error code sta %d\n", count); +// for (m = 0; m < count; m++) { +// trace("steer mac: " MACFMT "\n", +// MAC2STR(p->steering_req_macs[l].addr)); +// trace("sta error mac: " MACFMT "\n", +// MAC2STR(sta_resp[m].sta_mac)); +// res = memcmp(p->steering_req_macs[l].addr, +// sta_resp[m].sta_mac, 6); +// if (res == 0) { +// present = 1; +// break; +// } +// } +// if (present != 1) { +// /*Here we call for transition of sta*/ +// ret = agent_transition_sta(a, p, fh, l, l); +// } +// } +// } +// /* Multiple STAs and single BSSID, send all STAs to same BSSID */ +// else if (p->sta_list_cnt > 0 && p->target_bssid_list_cnt == 1) { +// trace("target bssid: " MACFMT "\n", +// MAC2STR(p->steering_req_target_bssids[0].bssid)); +// trace("op_class: %d\n", +// p->steering_req_target_bssids[0].op_class); +// trace("channel: %d\n", +// p->steering_req_target_bssids[0].channel); +// +// for (l = 0; l < p->sta_list_cnt; l++) { +// /* Here we need to call the ubus method */ +// trace("sta_addr: " MACFMT "\n", +// MAC2STR(p->steering_req_macs[l].addr)); +// /** +// * Here we need to check that the STA is associated with +// * the src bssid or not +// */ +// present = 0; +// for (m = 0; m < count; m++) { +// res = memcmp(p->steering_req_macs[l].addr, +// sta_resp[m].sta_mac, 6); +// if (res == 0) { +// present = 1; +// break; +// } +// } +// if (present != 1) { +// /*Here we call for transition of sta*/ +// ret = agent_transition_sta(a, p, fh, l, 0); +// } +// } +// } +// /** +// * No STA provided, Steering request applies to all associated STAs +// * in the BSS, per policy setting. +// */ +// else if (p->sta_list_cnt == 0 && p->target_bssid_list_cnt == 1) { +// result = memcmp(p->steering_req_target_bssids[0].bssid, wildcard, 6); +// if (result == 0) { +// trace("[%s:%d] bssid id wildcard", __func__, __LINE__); +// ret = agent_search_bssid_for_sta(a, +// p->steering_req_macs[l].addr, wildcard_bssid, p->bssid); +// if (ret != 0) { +// list_for_each_entry(s, &fh->stalist, list) { +// ret = agent_send_request_transition( +// agent, s->macaddr, +// fh, wildcard_bssid, 0); +// } +// } +// } else { +// list_for_each_entry(s, &fh->stalist, list) { +// ret = agent_send_request_transition( +// agent, s->macaddr, +// fh, p->steering_req_target_bssids[0].bssid, 0); +// } +// } +// } +// /* No BSSID specified for the STAs */ +// else if (p->sta_list_cnt > 0 && p->target_bssid_list_cnt == 0) { +// if (p->request_mode != 0x00) { +// trace("[%s:%d]Error steer mandate target BSSID not present\n", +// __func__, __LINE__); +// return 1; +// } +// trace("[%s:%d] target BSSID not present\n", __func__, __LINE__); +// for (l = 0; l < p->sta_list_cnt; l++) { +// trace("sta_addr: " MACFMT "\n", +// MAC2STR(p->steering_req_macs[l].addr)); +// /** +// * Here we need to check that the STA is associated with the +// * src bssid or not +// */ +// present = 0; +// for (m = 0; m < count; m++) { +// res = memcmp(p->steering_req_macs[l].addr, sta_resp[m].sta_mac, 6); +// if (res == 0) { +// present = 1; +// break; +// } +// } +// if (present != 1) { +// /** +// * Here we need to get the bssids that are best +// * for the STAs in case of steering opportunity +// */ +// ret = agent_search_bssid_for_sta(a, +// p->steering_req_macs[l].addr, +// wildcard_bssid, p->bssid); +// if (ret != 0) +// ret = agent_send_request_transition( +// agent, p->steering_req_macs[l].addr, +// fh, wildcard_bssid, 0); +// } +// } +// } +// /* No BSSID or STAs */ +// else if (p->sta_list_cnt == 0 && p->target_bssid_list_cnt == 0) { +// trace("[%s:%d] Error No STA and target BSSID present\n", __func__, __LINE__); +// return 1; +// } else { +// trace("[%s:%d] Error condition\n", __func__, __LINE__); +// return 1; +// } +// +//send_ack: +// send_1905_acknowledge(agent, cmdu, sta_resp, count); +// return ret; +} + +int handle_sta_steer_request(void *agent, struct cmdu_buff *cmdu) +{ + trace("%s: --->\n", __func__); + return 0; +// struct agent *a = (struct agent *) agent; +// int ret = 0; +// int i; +// uint8_t *tlv = NULL; +// +// /* Here we first parse the steer request */ +// if (cmdu->num_tlvs != 0) { +// for (i = 0; i < cmdu->num_tlvs; i++) { +// tlv = (uint8_t *) cmdu->tlvs[i]; +// switch (*tlv) { +// case MAP_TLV_STEERING_REQUEST: +// { +// struct tlv_steer_Req *p = +// (struct tlv_steer_Req *)tlv; +// +// ret = agent_process_steer_request_tlv(agent, +// p, cmdu); +// break; +// } +////#ifdef profile2 +// case MAP_TLV_PROFILE2_STEERING_REQ: +// { +// //TODO here we need to call the request transmission for the +// //STAs are Agile Multiband capable +// struct tlv_profile2_steer_req *p = +// (struct tlv_profile2_steer_req *)tlv; +// +// break; +// } +////#endif +// default: +// break; +// } +// } +// } +// return ret; +} + +int agent_transition_sta(struct agent *a, uint8_t *p, struct netif_fh *fh, + int l, int m) +{ + return 0; +// uint8_t wildcard[6]; +// uint8_t wildcard_bssid[6]; +// int result = 0; +// char wildcard_str[18] = { 0x0 }; +// int ret = 0; +// +// trace("agent: %s: --->\n", __func__); +// snprintf(wildcard_str, 18, "FF:FF:FF:FF:FF:FF"); +// hwaddr_aton(wildcard_str, wildcard); +// +// result = memcmp(p->steering_req_target_bssids[l].bssid, wildcard, 6); +// if (result == 0) { +// /** +// * code to search bssid as the bssid is a +// * wildcard +// */ +// trace("[%s:%d] bssid id wildcard\n", +// __func__, __LINE__); +// ret = agent_search_bssid_for_sta(a, +// p->steering_req_macs[l].addr, +// wildcard_bssid, p->bssid); +// if (ret == 0) +// ret = agent_send_request_transition(a, +// p->steering_req_macs[l].addr, +// fh, wildcard_bssid, 0); +// } else { +// ret = agent_send_request_transition(a, +// p->steering_req_macs[l].addr, +// fh, p->steering_req_target_bssids[m].bssid, 0); +// } +// return 0; +} + +int handle_sta_assoc_control_request(void *agent, struct cmdu_buff *cmdu) +{ + trace("%s: --->\n", __func__); + return 0; +// struct agent *a = (struct agent *) agent; +// int ret = 0; +// int i; +// uint8_t *tlv = NULL; +// +// /* Here we first parse the steer request */ +// if (cmdu->num_tlvs != 0) { +// for (i = 0; i < cmdu->num_tlvs; i++) { +// tlv = (uint8_t *) cmdu->tlvs[i]; +// switch (*tlv) { +// case MAP_TLV_CLIENT_ASSOCIATION_CONTROL_REQUEST: +// { +// struct tlv_client_assoc_control_req *p = +// (struct tlv_client_assoc_control_req *)tlv; +// +// ret = agent_process_assoc_cntl_tlv(agent, +// p, cmdu); +// } +// default: +// break; +// } +// } +// } +// return ret; +} + +int handle_hld_message(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); return 0; } int handle_backhaul_sta_steer_request(void *agent, - struct cmdu_cstruct *rec_cmdu) + struct cmdu_buff *rx_cmdu) { trace("%s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - struct tlv_backhaul_steer_resp *p; - struct tlv_backhaul_steer_req *req; - struct cmdu_cstruct *cmdu; - struct netif_bk *bk; - - req = (struct tlv_backhaul_steer_req *) extract_tlv_by_type(rec_cmdu, - MAP_TLV_BACKHAUL_STEERING_REQUEST); - if (!req) - return -1; - - bk = find_bkhaul_by_bssid(a, req->addr); - if (!bk) - return -1; - - cmdu = (struct cmdu_cstruct *)calloc(1, - sizeof(struct cmdu_cstruct)); - if (!cmdu) { - fprintf(stderr, "Out of memory!\n"); - return -1; - } - - cmdu->message_type = CMDU_BACKHAUL_STEER_RESPONSE; - memcpy(cmdu->origin, rec_cmdu->origin, 6); - cmdu->message_id = rec_cmdu->message_id; - strncpy(cmdu->intf_name, rec_cmdu->intf_name, sizeof(cmdu->intf_name)); - - p = calloc(1, sizeof(struct tlv_backhaul_steer_resp)); - if (!p) - goto out_cmdu; - - p->tlv_type = MAP_TLV_BACKHAUL_STEERING_RESPONSE; - memcpy(p->bssid, req->bssid, 6); - memcpy(p->addr, req->addr, 6); - - cmdu->num_tlvs++; - cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); - if (!cmdu->tlvs) - goto out_p; - - cmdu->tlvs[0] = (uint8_t *) p; - - if (bk->bsta_steer.cmdu) - map_free_cmdu(bk->bsta_steer.cmdu); - bk->bsta_steer.cmdu = cmdu; - - wifi_set_iface_bssid(bk->name, req->bssid); - uloop_timeout_set(&bk->connect_timer, BSTA_STEER_TIMEOUT); return 0; -out_p: - free(p); -out_cmdu: - free(cmdu); - return -1; +// struct agent *a = (struct agent *) agent; +// struct tlv_backhaul_steer_resp *p; +// struct tlv_backhaul_steer_req *req; +// struct cmdu_cstruct *cmdu; +// struct netif_bk *bk; +// +// req = (struct tlv_backhaul_steer_req *) extract_tlv_by_type(rx_cmdu, +// MAP_TLV_BACKHAUL_STEERING_REQUEST); +// if (!req) +// return -1; +// +// bk = find_bkhaul_by_bssid(a, req->addr); +// if (!bk) +// return -1; +// +// cmdu = (struct cmdu_cstruct *)calloc(1, +// sizeof(struct cmdu_cstruct)); +// if (!cmdu) { +// fprintf(stderr, "Out of memory!\n"); +// return -1; +// } +// +// cmdu->message_type = CMDU_BACKHAUL_STEER_RESPONSE; +// memcpy(cmdu->origin, rx_cmdu->origin, 6); +// cmdu->message_id = rx_cmdu->message_id; +// strncpy(cmdu->intf_name, rx_cmdu->intf_name, sizeof(cmdu->intf_name)); +// +// p = calloc(1, sizeof(struct tlv_backhaul_steer_resp)); +// if (!p) +// goto out_cmdu; +// +// p->tlv_type = MAP_TLV_BACKHAUL_STEERING_RESPONSE; +// memcpy(p->bssid, req->bssid, 6); +// memcpy(p->addr, req->addr, 6); +// +// cmdu->num_tlvs++; +// cmdu->tlvs = (uint8_t **)calloc(cmdu->num_tlvs, sizeof(uint8_t *)); +// if (!cmdu->tlvs) +// goto out_p; +// +// cmdu->tlvs[0] = (uint8_t *) p; +// +// if (bk->bsta_steer.cmdu) +// map_free_cmdu(bk->bsta_steer.cmdu); +// bk->bsta_steer.cmdu = cmdu; +// +// wifi_set_iface_bssid(bk->name, req->bssid); +// uloop_timeout_set(&bk->connect_timer, BSTA_STEER_TIMEOUT); +// return 0; +//out_p: +// free(p); +//out_cmdu: +// free(cmdu); +// return -1; } void free_scanresults_neighbors(struct wifi_radio_element *re) { - struct wifi_scanres_element *scanres_el; - int j; - - scanres_el = re->scanlist; - if (!scanres_el) - return; - - for (j = 0; j < scanres_el->num_opclass_scanned; j++) { - int k; - struct wifi_scanres_opclass_element *opclass = &scanres_el->opclass_scanlist[j]; - - for (k = 0; k < opclass->num_channels_scanned; k++) { - struct wifi_scanres_channel_element *ch_el = &opclass->channel_scanlist[k]; - - if (ch_el->nbrlist) - free(ch_el->nbrlist); - ch_el->nbrlist = NULL; - ch_el->num_neighbors = 0; - } - } +// struct wifi_scanres_element *scanres_el; +// int j; +// +// scanres_el = re->scanlist; +// if (!scanres_el) +// return; +// +// for (j = 0; j < scanres_el->num_opclass_scanned; j++) { +// int k; +// struct wifi_scanres_opclass_element *opclass = &scanres_el->opclass_scanlist[j]; +// +// for (k = 0; k < opclass->num_channels_scanned; k++) { +// struct wifi_scanres_channel_element *ch_el = &opclass->channel_scanlist[k]; +// +// if (ch_el->nbrlist) +// free(ch_el->nbrlist); +// ch_el->nbrlist = NULL; +// ch_el->num_neighbors = 0; +// } +// } } bool scan_supported(struct agent *a, struct tlv_ch_scan_req *query) { - struct tlv_ch_scan_cap *p = agent_gen_ch_scan_cap(a); - /* m for numeration of radios in query */ - /* ri for numeration of radios in agent */ - int m, ri, ch, i, j; - uint8_t query_channel; - for (m = 0; m < query->nbr_radios; m++) { - ri = wifi_get_radio_index_by_mac(a, query->radio_data[m].radio_id); - if (query->radio_data[m].op_class_data->nbr_ch == 0) - return 1; - - query_channel = query->radio_data[m].op_class_data->ch[0]; - /* the same radio and all op_class/ch in cap */ - for (i = 0; i < p->radio[ri].nbr_op_classes; i++) { - for (j = 0; j < p->radio[ri].op_class[i].nbr_ch; j++) - if (p->radio[ri].op_class[i].ch[j] == query_channel) - break; /* found the op class with index i */ - break; - } - - if (j == p->radio[ri].op_class[i].nbr_ch) - return 0; - - /* the rest of the channels */ - for (ch = 1; ch < query->radio_data[m].op_class_data->nbr_ch; ch++) { - query_channel = query->radio_data[m].op_class_data->ch[ch]; - for (j = 0; j < p->radio[ri].op_class[i].nbr_ch; j++) - if (p->radio[ri].op_class[i].ch[j] == query_channel) - goto next_ch; - return 0; -next_ch: - continue; - } - } - return 1; + return -1; +// struct tlv_ch_scan_cap *p = agent_gen_ch_scan_cap(a); +// /* m for numeration of radios in query */ +// /* ri for numeration of radios in agent */ +// int m, ri, ch, i, j; +// uint8_t query_channel; +// for (m = 0; m < query->nbr_radios; m++) { +// ri = wifi_get_radio_index_by_mac(a, query->radio_data[m].radio_id); +// if (query->radio_data[m].op_class_data->nbr_ch == 0) +// return 1; +// +// query_channel = query->radio_data[m].op_class_data->ch[0]; +// /* the same radio and all op_class/ch in cap */ +// for (i = 0; i < p->radio[ri].nbr_op_classes; i++) { +// for (j = 0; j < p->radio[ri].op_class[i].nbr_ch; j++) +// if (p->radio[ri].op_class[i].ch[j] == query_channel) +// break; /* found the op class with index i */ +// break; +// } +// +// if (j == p->radio[ri].op_class[i].nbr_ch) +// return 0; +// +// /* the rest of the channels */ +// for (ch = 1; ch < query->radio_data[m].op_class_data->nbr_ch; ch++) { +// query_channel = query->radio_data[m].op_class_data->ch[ch]; +// for (j = 0; j < p->radio[ri].op_class[i].nbr_ch; j++) +// if (p->radio[ri].op_class[i].ch[j] == query_channel) +// goto next_ch; +// return 0; +//next_ch: +// continue; +// } +// } +// return 1; } bool scan_too_soon(struct agent *a, struct tlv_ch_scan_req *query) { - int i, ri; - struct tlv_ch_scan_cap *p = agent_gen_ch_scan_cap(a); - time_t now; - - time(&now); - for (i = 0; i < query->nbr_radios; i++) { - ri = wifi_get_radio_index_by_mac(a, query->radio_data[i].radio_id); - if (difftime(now, a->last_scan_time) < p->radio[ri].min_scan_interval) - return 1; - } - return 0; + return 1; +// int i, ri; +// struct tlv_ch_scan_cap *p = agent_gen_ch_scan_cap(a); +// time_t now; +// +// time(&now); +// for (i = 0; i < query->nbr_radios; i++) { +// ri = wifi_get_radio_index_by_mac(a, query->radio_data[i].radio_id); +// if (difftime(now, a->last_scan_time) < p->radio[ri].min_scan_interval) +// return 1; +// } +// return 0; } void deep_copy_cmdu_for_agent(void *agent, struct cmdu_cstruct *cmdu) { trace("%s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - struct cmdu_cstruct *cmdu_copy = NULL; - uint8_t *ss = NULL; /* binary cmdu->tlvs */ - char *tlv_str = NULL; /* string cmdu->tlvs */ - uint8_t *tlvs = NULL; /* binary resulting tlvs */ - char endtlvstr[7] = "000000"; /* end_of_mes tlv string */ - char *restlvstr = NULL; /* string resulting tlvs */ - uint16_t len, leng; - - /* Get the string value of cmdu->tlvs */ - if (cmdu->num_tlvs > 0) { - len = 0; - ss = map_put_tlv_cstruct(cmdu->tlvs[0], &len); - if (!ss) - return; - tlv_str = (char *)calloc((2 * len) + 1, - sizeof(char)); - if (!tlv_str) { - dbg("|%s:%d| out of memory!\n", __func__, __LINE__); - goto fail_tlv_str; - } - btostr(ss, len, tlv_str); - } - - /* Get resulting tlvs string */ - const size_t len1 = strlen(tlv_str); - const size_t len2 = strlen(endtlvstr); - restlvstr = malloc(len1 + len2 + 1); - if (!restlvstr) { - dbg("|%s:%d| out of memory!\n", __func__, __LINE__); - goto fail_restlvstr; - } - memcpy(restlvstr, tlv_str, len1); - memcpy(restlvstr + len1, endtlvstr, len2 + 1); - - /* Resulting tlvs string to binary value */ - leng = len1 + len2; - leng = (leng - 1) / 2; - tlvs = calloc(leng, sizeof(uint8_t)); - if (!tlvs) { - dbg("|%s:%d| out of memory!\n", __func__, __LINE__); - goto fail_tlvs; - } - strtob(restlvstr, leng, tlvs); - - /* Deep copy of cmdu */ - cmdu_copy = map_build_cmdu(cmdu->message_type, - cmdu->message_id, cmdu->intf_name, cmdu->origin, tlvs); - if (cmdu_copy) { - fprintf(stderr, "agent: %s: map_build_cmdu() successful!\n", __func__); - } else { - fprintf(stderr, "agent: %s: map_build_cmdu() failed!\n", __func__); - goto fail_cmdu_copy; - } - - /* Saving the cmdu with the agent */ - a->req_channel_scan_cmdu = cmdu_copy; - // dbg("DONE ADDING CMDU TO AGENT\n"); - -fail_cmdu_copy: - free(tlvs); -fail_tlvs: - free(restlvstr); -fail_restlvstr: - free(tlv_str); -fail_tlv_str: - free(ss); +// struct agent *a = (struct agent *) agent; +// struct cmdu_cstruct *cmdu_copy = NULL; +// uint8_t *ss = NULL; /* binary cmdu->tlvs */ +// char *tlv_str = NULL; /* string cmdu->tlvs */ +// uint8_t *tlvs = NULL; /* binary resulting tlvs */ +// char endtlvstr[7] = "000000"; /* end_of_mes tlv string */ +// char *restlvstr = NULL; /* string resulting tlvs */ +// uint16_t len, leng; +// +// /* Get the string value of cmdu->tlvs */ +// if (cmdu->num_tlvs > 0) { +// len = 0; +// ss = map_put_tlv_cstruct(cmdu->tlvs[0], &len); +// if (!ss) +// return; +// tlv_str = (char *)calloc((2 * len) + 1, +// sizeof(char)); +// if (!tlv_str) { +// dbg("|%s:%d| out of memory!\n", __func__, __LINE__); +// goto fail_tlv_str; +// } +// btostr(ss, len, tlv_str); +// } +// +// /* Get resulting tlvs string */ +// const size_t len1 = strlen(tlv_str); +// const size_t len2 = strlen(endtlvstr); +// restlvstr = malloc(len1 + len2 + 1); +// if (!restlvstr) { +// dbg("|%s:%d| out of memory!\n", __func__, __LINE__); +// goto fail_restlvstr; +// } +// memcpy(restlvstr, tlv_str, len1); +// memcpy(restlvstr + len1, endtlvstr, len2 + 1); +// +// /* Resulting tlvs string to binary value */ +// leng = len1 + len2; +// leng = (leng - 1) / 2; +// tlvs = calloc(leng, sizeof(uint8_t)); +// if (!tlvs) { +// dbg("|%s:%d| out of memory!\n", __func__, __LINE__); +// goto fail_tlvs; +// } +// strtob(restlvstr, leng, tlvs); +// +// /* Deep copy of cmdu */ +// cmdu_copy = map_build_cmdu(cmdu->message_type, +// cmdu->message_id, cmdu->intf_name, cmdu->origin, tlvs); +// if (cmdu_copy) { +// fprintf(stderr, "agent: %s: map_build_cmdu() successful!\n", __func__); +// } else { +// fprintf(stderr, "agent: %s: map_build_cmdu() failed!\n", __func__); +// goto fail_cmdu_copy; +// } +// +// /* Saving the cmdu with the agent */ +// a->req_channel_scan_cmdu = cmdu_copy; +// // dbg("DONE ADDING CMDU TO AGENT\n"); +// +//fail_cmdu_copy: +// free(tlvs); +//fail_tlvs: +// free(restlvstr); +//fail_restlvstr: +// free(tlv_str); +//fail_tlv_str: +// free(ss); } int handle_channel_scan_request(void *agent, struct cmdu_cstruct *cmdu) { trace("%s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - uint16_t tlv_index = 0; - int i, ri; - /* The response cmdu */ - struct cmdu_cstruct *cmdu_data = NULL; - /* For calling the ubus method scan */ - char r_objname[32] = {0}; - const char *r_fmt = "wifi.radio.%s"; - char *radio_name; - wifi_object_t r_wobj = WIFI_OBJECT_INVALID; - - /* The received TLV */ - uint8_t *tmp = NULL; - - tmp = cmdu->tlvs[0]; - if (*tmp != MAP_TLV_CHANNEL_SCAN_REQ) { - dbg("Wrong received TLV type!\n"); - time(&a->last_scan_time); - return -1; - } - struct tlv_ch_scan_req *query = (struct tlv_ch_scan_req *)tmp; - - if (a->req_channel_scan_cmdu != NULL) { - /* Cancel the timer of available time (5min) */ - uloop_timeout_cancel(&a->available_scan_timer); - dbg("[Status code] ONGOING SCAN ABORTED\n\n"); - a->status_code = CH_SCAN_STATUS_SCAN_ABORTED; // 0x05 // - /* Generate the response cmdu */ - cmdu_data = agent_gen_ch_scan_response(a, a->req_channel_scan_cmdu); - if (!cmdu_data) - return -1; - /* Send the response cmdu */ - agent_send_cmdu(a, cmdu_data); - map_free_cmdu(cmdu_data); - a->req_channel_scan_cmdu = NULL; - map_free_cmdu(a->req_channel_scan_cmdu); - a->ignore_scan_finished_event = query->nbr_radios; - } - - if (!scan_supported(a, query)) { - dbg("[Status code] SCAN NOT SUPPORTED\n\n"); - a->status_code = CH_SCAN_STATUS_SCAN_NOT_SUPPORTED; // 0x01 // - /* Generate the response cmdu */ - cmdu_data = agent_gen_ch_scan_response(a, cmdu); - if (!cmdu_data) { - time(&a->last_scan_time); - return -1; - } - /* Send the response cmdu */ - agent_send_cmdu(a, cmdu_data); - map_free_cmdu(cmdu_data); - a->status_code = CH_SCAN_STATUS_SUCCESS; - time(&a->last_scan_time); - return 0; - } - - if (scan_too_soon(a, query)) { - dbg("[Status code] SCAN TOO SOON\n\n"); - a->status_code = CH_SCAN_STATUS_TOO_SOON; // 0x02 // - /* Generate the response cmdu */ - cmdu_data = agent_gen_ch_scan_response(a, cmdu); - if (!cmdu_data) { - time(&a->last_scan_time); - return -1; - } - /* Send the response cmdu */ - agent_send_cmdu(a, cmdu_data); - map_free_cmdu(cmdu_data); - a->status_code = CH_SCAN_STATUS_SUCCESS; - time(&a->last_scan_time); - return 0; - } - time(&a->last_scan_time); - - /* Requested channel scan */ - for (i = 0; i < query->nbr_radios; i++) { - radio_name = wifi_get_radio_by_mac(a, query->radio_data[i].radio_id); - if (!radio_name) - continue; - - snprintf(r_objname, 31, r_fmt, radio_name); - r_wobj = ubus_get_object(a->ubus_ctx, r_objname); - if (r_wobj == WIFI_OBJECT_INVALID) - continue; - - ri = wifi_get_radio_index_by_mac(a, query->radio_data[i].radio_id); - - free_scanresults_neighbors(&a->radios[ri]); - trace("Scaning radio %s neighbors...on the request of mid: %d\n", - wifi_get_radio_by_mac(a, query->radio_data[i].radio_id), cmdu->message_id); - if (!ubus_call_object(a, r_wobj, "scan", NULL, &a->radios[ri])) { - uloop_timeout_set(&a->available_scan_timer, 300000); // (5 min) // 0x04 // - trace("Scaning started successfully.\n"); - deep_copy_cmdu_for_agent(a, cmdu); - } else { - /* If the reason is an ongoing scan */ - if (a->status_code == CH_SCAN_STATUS_SCAN_ABORTED) { - /* Reset the timer of available time (5min) */ - uloop_timeout_set(&a->available_scan_timer, 300000); - dbg("[Status code] ONGOING SCAN ABORTED\n\n"); - a->ignore_scan_finished_event = 0; - deep_copy_cmdu_for_agent(a, cmdu); - a->status_code = CH_SCAN_STATUS_SUCCESS; - break; - } else { - dbg("[Status code] RADIO BUSY\n\n"); - a->status_code = CH_SCAN_STATUS_TOO_BUSY; // 0x03 // - /* Generate the response cmdu */ - cmdu_data = agent_gen_ch_scan_response(a, cmdu); - if (!cmdu_data) { - return -1; - } - /* Send the response cmdu */ - agent_send_cmdu(a, cmdu_data); - map_free_cmdu(cmdu_data); - a->status_code = CH_SCAN_STATUS_SUCCESS; - break; - } - } - } return 0; +// struct agent *a = (struct agent *) agent; +// uint16_t tlv_index = 0; +// int i, ri; +// /* The response cmdu */ +// struct cmdu_cstruct *cmdu_data = NULL; +// /* For calling the ubus method scan */ +// char r_objname[32] = {0}; +// const char *r_fmt = "wifi.radio.%s"; +// char *radio_name; +// wifi_object_t r_wobj = WIFI_OBJECT_INVALID; +// +// /* The received TLV */ +// uint8_t *tmp = NULL; +// +// tmp = cmdu->tlvs[0]; +// if (*tmp != MAP_TLV_CHANNEL_SCAN_REQ) { +// dbg("Wrong received TLV type!\n"); +// time(&a->last_scan_time); +// return -1; +// } +// struct tlv_ch_scan_req *query = (struct tlv_ch_scan_req *)tmp; +// +// if (a->req_channel_scan_cmdu != NULL) { +// /* Cancel the timer of available time (5min) */ +// uloop_timeout_cancel(&a->available_scan_timer); +// dbg("[Status code] ONGOING SCAN ABORTED\n\n"); +// a->status_code = CH_SCAN_STATUS_SCAN_ABORTED; // 0x05 // +// /* Generate the response cmdu */ +// cmdu_data = agent_gen_ch_scan_response(a, a->req_channel_scan_cmdu); +// if (!cmdu_data) +// return -1; +// /* Send the response cmdu */ +// agent_send_cmdu(a, cmdu_data); +// map_free_cmdu(cmdu_data); +// a->req_channel_scan_cmdu = NULL; +// map_free_cmdu(a->req_channel_scan_cmdu); +// a->ignore_scan_finished_event = query->nbr_radios; +// } +// +// if (!scan_supported(a, query)) { +// dbg("[Status code] SCAN NOT SUPPORTED\n\n"); +// a->status_code = CH_SCAN_STATUS_SCAN_NOT_SUPPORTED; // 0x01 // +// /* Generate the response cmdu */ +// cmdu_data = agent_gen_ch_scan_response(a, cmdu); +// if (!cmdu_data) { +// time(&a->last_scan_time); +// return -1; +// } +// /* Send the response cmdu */ +// agent_send_cmdu(a, cmdu_data); +// map_free_cmdu(cmdu_data); +// a->status_code = CH_SCAN_STATUS_SUCCESS; +// time(&a->last_scan_time); +// return 0; +// } +// +// if (scan_too_soon(a, query)) { +// dbg("[Status code] SCAN TOO SOON\n\n"); +// a->status_code = CH_SCAN_STATUS_TOO_SOON; // 0x02 // +// /* Generate the response cmdu */ +// cmdu_data = agent_gen_ch_scan_response(a, cmdu); +// if (!cmdu_data) { +// time(&a->last_scan_time); +// return -1; +// } +// /* Send the response cmdu */ +// agent_send_cmdu(a, cmdu_data); +// map_free_cmdu(cmdu_data); +// a->status_code = CH_SCAN_STATUS_SUCCESS; +// time(&a->last_scan_time); +// return 0; +// } +// time(&a->last_scan_time); +// +// /* Requested channel scan */ +// for (i = 0; i < query->nbr_radios; i++) { +// radio_name = wifi_get_radio_by_mac(a, query->radio_data[i].radio_id); +// if (!radio_name) +// continue; +// +// snprintf(r_objname, 31, r_fmt, radio_name); +// r_wobj = ubus_get_object(a->ubus_ctx, r_objname); +// if (r_wobj == WIFI_OBJECT_INVALID) +// continue; +// +// ri = wifi_get_radio_index_by_mac(a, query->radio_data[i].radio_id); +// +// free_scanresults_neighbors(&a->radios[ri]); +// trace("Scaning radio %s neighbors...on the request of mid: %d\n", +// wifi_get_radio_by_mac(a, query->radio_data[i].radio_id), cmdu->message_id); +// if (!ubus_call_object(a, r_wobj, "scan", NULL, &a->radios[ri])) { +// uloop_timeout_set(&a->available_scan_timer, 300000); // (5 min) // 0x04 // +// trace("Scaning started successfully.\n"); +// deep_copy_cmdu_for_agent(a, cmdu); +// } else { +// /* If the reason is an ongoing scan */ +// if (a->status_code == CH_SCAN_STATUS_SCAN_ABORTED) { +// /* Reset the timer of available time (5min) */ +// uloop_timeout_set(&a->available_scan_timer, 300000); +// dbg("[Status code] ONGOING SCAN ABORTED\n\n"); +// a->ignore_scan_finished_event = 0; +// deep_copy_cmdu_for_agent(a, cmdu); +// a->status_code = CH_SCAN_STATUS_SUCCESS; +// break; +// } else { +// dbg("[Status code] RADIO BUSY\n\n"); +// a->status_code = CH_SCAN_STATUS_TOO_BUSY; // 0x03 // +// /* Generate the response cmdu */ +// cmdu_data = agent_gen_ch_scan_response(a, cmdu); +// if (!cmdu_data) { +// return -1; +// } +// /* Send the response cmdu */ +// agent_send_cmdu(a, cmdu_data); +// map_free_cmdu(cmdu_data); +// a->status_code = CH_SCAN_STATUS_SUCCESS; +// break; +// } +// } +// } +// return 0; } bool all_channel_scanned(struct agent *a, struct tlv_ch_scan_req *query) { - int ri, i; - for (i = 0; i < query->nbr_radios; i++) { - ri = wifi_get_radio_index_by_mac(a, query->radio_data[i].radio_id); - if (!a->radios[ri].scanned) - return 0; - } - return 1; + return 0; +// int ri, i; +// for (i = 0; i < query->nbr_radios; i++) { +// ri = wifi_get_radio_index_by_mac(a, query->radio_data[i].radio_id); +// if (!a->radios[ri].scanned) +// return 0; +// } +// return 1; } int handle_wifi_radio_scan_finished(void *agent) { - // If the scan was not complited in available time (0x04) - struct agent *a = (struct agent *) agent; - int ret, ri, i; - if (a->ignore_scan_finished_event) { - for (i = 0; i < WIFI_DEVICE_MAX_NUM; i++) - a->radios[i].scanned = 0; - a->ignore_scan_finished_event--; - return -1; - } - - trace("%s ---> scan_finished\n", __func__); - uloop_timeout_cancel(&a->available_scan_timer); - - /* The received (request) cmdu */ - struct cmdu_cstruct *cmdu = a->req_channel_scan_cmdu; - /* The response cmdu */ - struct cmdu_cstruct *cmdu_data = NULL; - /* For parsing the ubus method scanresults */ - char r_objname[32] = {0}; - const char *r_fmt = "wifi.radio.%s"; - wifi_object_t r_wobj = WIFI_OBJECT_INVALID; - - /* The received TLV */ - uint8_t *tmp = NULL; - - tmp = cmdu->tlvs[0]; - if (*tmp != MAP_TLV_CHANNEL_SCAN_REQ) { - dbg("Wrong received TLV type!\n"); - return -1; - } - struct tlv_ch_scan_req *query = (struct tlv_ch_scan_req *)tmp; - - /* Response only when all channels are scanned */ - if (!all_channel_scanned(a, query)) { - dbg("Not all radios have been scanned.\n"); - return -1; - } - dbg("All radios have been scanned! mid: %d\n", a->req_channel_scan_cmdu->message_id); - - /* Parse channel scanresults */ - for (i = 0; i < query->nbr_radios; i++) { - snprintf(r_objname, 31, r_fmt, wifi_get_radio_by_mac(a, query->radio_data[i].radio_id)); - r_wobj = ubus_get_object(a->ubus_ctx, r_objname); - if (r_wobj == WIFI_OBJECT_INVALID) - continue; - - ri = wifi_get_radio_index_by_mac(a, query->radio_data[i].radio_id); - - trace("...done scanning radio %s neighbors.\n", - wifi_get_radio_by_mac(a, query->radio_data[i].radio_id)); - ubus_call_object(a, r_wobj, "scanresults", parse_scanresults, &a->radios[ri]); - a->radios[ri].scanned = 0; - } - - /* Generate cmdu */ - cmdu_data = agent_gen_ch_scan_response(a, cmdu); - if (!cmdu_data) - return -1; - - /* Send cmdu */ - ret = agent_send_cmdu(a, cmdu_data); - map_free_cmdu(cmdu_data); - map_free_cmdu(a->req_channel_scan_cmdu); - a->req_channel_scan_cmdu = NULL; - return ret; -} - - -int handle_cac_request(void *agent, struct cmdu_cstruct *cmdu) + return -1; +// // If the scan was not complited in available time (0x04) +// struct agent *a = (struct agent *) agent; +// int ret, ri, i; +// if (a->ignore_scan_finished_event) { +// for (i = 0; i < WIFI_DEVICE_MAX_NUM; i++) +// a->radios[i].scanned = 0; +// a->ignore_scan_finished_event--; +// return -1; +// } +// +// trace("%s ---> scan_finished\n", __func__); +// uloop_timeout_cancel(&a->available_scan_timer); +// +// /* The received (request) cmdu */ +// struct cmdu_cstruct *cmdu = a->req_channel_scan_cmdu; +// /* The response cmdu */ +// struct cmdu_cstruct *cmdu_data = NULL; +// /* For parsing the ubus method scanresults */ +// char r_objname[32] = {0}; +// const char *r_fmt = "wifi.radio.%s"; +// wifi_object_t r_wobj = WIFI_OBJECT_INVALID; +// +// /* The received TLV */ +// uint8_t *tmp = NULL; +// +// tmp = cmdu->tlvs[0]; +// if (*tmp != MAP_TLV_CHANNEL_SCAN_REQ) { +// dbg("Wrong received TLV type!\n"); +// return -1; +// } +// struct tlv_ch_scan_req *query = (struct tlv_ch_scan_req *)tmp; +// +// /* Response only when all channels are scanned */ +// if (!all_channel_scanned(a, query)) { +// dbg("Not all radios have been scanned.\n"); +// return -1; +// } +// dbg("All radios have been scanned! mid: %d\n", a->req_channel_scan_cmdu->message_id); +// +// /* Parse channel scanresults */ +// for (i = 0; i < query->nbr_radios; i++) { +// snprintf(r_objname, 31, r_fmt, wifi_get_radio_by_mac(a, query->radio_data[i].radio_id)); +// r_wobj = ubus_get_object(a->ubus_ctx, r_objname); +// if (r_wobj == WIFI_OBJECT_INVALID) +// continue; +// +// ri = wifi_get_radio_index_by_mac(a, query->radio_data[i].radio_id); +// +// trace("...done scanning radio %s neighbors.\n", +// wifi_get_radio_by_mac(a, query->radio_data[i].radio_id)); +// ubus_call_object(a, r_wobj, "scanresults", parse_scanresults, &a->radios[ri]); +// a->radios[ri].scanned = 0; +// } +// +// /* Generate cmdu */ +// cmdu_data = agent_gen_ch_scan_response(a, cmdu); +// if (!cmdu_data) +// return -1; +// +// /* Send cmdu */ +// ret = agent_send_cmdu(a, cmdu_data); +// map_free_cmdu(cmdu_data); +// map_free_cmdu(a->req_channel_scan_cmdu); +// a->req_channel_scan_cmdu = NULL; +// return ret; +} + + +int handle_cac_request(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); return 0; } -int handle_cac_stop(void *agent, struct cmdu_cstruct *cmdu) +int handle_cac_stop(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); return 0; } -int handle_error_response(void *agent, struct cmdu_cstruct *cmdu) +int handle_error_response(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); return 0; @@ -3499,71 +3590,74 @@ int prepare_tunneled_message(void *agent, uint8_t protocol, const char *framestr) { trace("%s: --->\n", __func__); - struct agent *a = (struct agent *)agent; - struct cmdu_cstruct *cmdu; - uint8_t *frame; - uint8_t sta_mac[6] = { 0 }; - int len; - int index; - - if (!framestr) - return -1; - - /* TODO/FIXME: add other protocol - * checking (BTM/WNM/ANQP) - * as of now checking assoc/reassoc - * type only. - */ - if ((protocol != 0x00) && (protocol != 0x01)) - return -1; - - len = strlen(framestr); - len = (len - 1) / 2; - frame = calloc(len, sizeof(uint8_t)); - if (!frame) - return -1; - - if (!strtob((char *)framestr, len, frame)) - goto error; - - index = 2 + 2 + 6; /* sta mac index */ - memcpy(sta_mac, frame + index, 6); - - cmdu = agent_gen_tunneled_msg(a, protocol, sta_mac, - len, frame); - if (!cmdu) - goto error; - - agent_send_cmdu(a, cmdu); - map_free_cmdu(cmdu); - free(frame); - return 0; - -error: - free(frame); - - return -1; -} - -int handle_backhaul_sta_caps_query(void *agent, struct cmdu_cstruct *cmdu) +// struct agent *a = (struct agent *)agent; +// struct cmdu_cstruct *cmdu; +// uint8_t *frame; +// uint8_t sta_mac[6] = { 0 }; +// int len; +// int index; +// +// if (!framestr) +// return -1; +// +// /* TODO/FIXME: add other protocol +// * checking (BTM/WNM/ANQP) +// * as of now checking assoc/reassoc +// * type only. +// */ +// if ((protocol != 0x00) && (protocol != 0x01)) +// return -1; +// +// len = strlen(framestr); +// len = (len - 1) / 2; +// frame = calloc(len, sizeof(uint8_t)); +// if (!frame) +// return -1; +// +// if (!strtob((char *)framestr, len, frame)) +// goto error; +// +// index = 2 + 2 + 6; /* sta mac index */ +// memcpy(sta_mac, frame + index, 6); +// +// cmdu = agent_gen_tunneled_msg(a, protocol, sta_mac, +// len, frame); +// if (!cmdu) +// goto error; +// +// agent_send_cmdu(a, cmdu); +// map_free_cmdu(cmdu); +// free(frame); +// +// return 0; +// +//error: +// free(frame); +// +// return -1; +} + +int handle_backhaul_sta_caps_query(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); - struct agent *a = (struct agent *) agent; - struct cmdu_cstruct *cmdu_data; - int ret; - - cmdu_data = agent_gen_bk_caps_response(a,cmdu); - if (!cmdu_data) - return -1; - - // Send cmdu - ret = agent_send_cmdu(a, cmdu_data); - map_free_cmdu(cmdu_data); - return ret; -} - -int handle_backhaul_sta_caps_report(void *agent, struct cmdu_cstruct *cmdu) + return 0; +// trace("%s: --->\n", __func__); +// struct agent *a = (struct agent *) agent; +// struct cmdu_cstruct *cmdu_data; +// int ret; +// +// cmdu_data = agent_gen_bk_caps_response(a,cmdu); +// if (!cmdu_data) +// return -1; +// +// // Send cmdu +// ret = agent_send_cmdu(a, cmdu_data); +// map_free_cmdu(cmdu_data); +// return ret; +} + +int handle_backhaul_sta_caps_report(void *agent, struct cmdu_buff *cmdu) { trace("%s: --->\n", __func__); return 0; @@ -3766,6 +3860,7 @@ static void send_cmdu_cb(struct ubus_request *req, mid = (uint16_t *)req->priv; str = (char *)blobmsg_format_json_indent(msg, true, -1); + if (str) { jobj = json_tokener_parse(str); free(str); @@ -3782,7 +3877,45 @@ static void send_cmdu_cb(struct ubus_request *req, json_object_put(jobj); } -uint16_t agent_send_cmdu(struct agent *a, struct cmdu_cstruct *cmdu) + +int agent_handle_map_event(struct agent *a, uint16_t cmdutype, uint16_t mid, + char *rxif, uint8_t *src, uint8_t *tlvs, int len) +{ + const map_cmdu_handler_t *f; + struct cmdu_buff *cmdu = NULL; + int ret = -1; + int idx; + + trace("%s: ---> cmdu = %d\n", __func__, cmdutype); + + if (cmdutype >= CMDU_TYPE_MAP_START) { + idx = cmdutype - CMDU_TYPE_MAP_START; + f = agent_mapftable; + } else { + idx = cmdutype; + f = i1905ftable; + } + + if (f[idx]) { + dbg("mid pointer prev = %u\n", mid); + cmdu = cmdu_alloc_custom(cmdutype, &mid, rxif, src, tlvs, len); + if (cmdu) { + dbg("mid pointer post = %u\n", mid); + dbg("%s: cmdu_alloc_custom() succeeded! cmdu->cdata->hdr.mid %u\n", __func__, cmdu_get_mid(cmdu)); + //test_cmdu(cmdu); + ret = f[idx](a, cmdu); + //map_free_cmdu(cmdu); + } else { + dbg("agent: %s: cmdu_alloc_custom() failed!\n", __func__); + } + } + + //TODO: check ret + + return ret; +} + +uint16_t agent_send_cmdu(struct agent *a, struct cmdu_buff *cmdu) { char *tlv_data = NULL; uint16_t tlv_data_len = 1; @@ -3790,10 +3923,8 @@ uint16_t agent_send_cmdu(struct agent *a, struct cmdu_cstruct *cmdu) int copy_index; struct blob_buf b = { 0 }; char dst_addr[18] = { 0 }; - char *tlv_str = NULL; uint8_t *ss = NULL; uint16_t msgid = 0; - uint16_t len; int ret = 0; size_t i; uint32_t id; @@ -3803,109 +3934,57 @@ uint16_t agent_send_cmdu(struct agent *a, struct cmdu_cstruct *cmdu) memset(&b, 0, sizeof(struct blob_buf)); blob_buf_init(&b, 0); - blobmsg_add_u32(&b, "type", cmdu->message_type); - blobmsg_add_string(&b, "egress", cmdu->intf_name); - if (cmdu->message_id) - blobmsg_add_u32(&b, "mid", cmdu->message_id); - - hwaddr_ntoa(cmdu->origin, dst_addr); - blobmsg_add_string(&b, "dst_macaddr", dst_addr); - - trace("|%s:%d|cmdu:%s|egress:%s|dst:%s|\n", __func__, __LINE__, - map_stringify_cmdu_type(cmdu->message_type), - cmdu->intf_name, dst_addr); - if (cmdu->num_tlvs > 0) { - for (i = 0; i < cmdu->num_tlvs; i++) { - len = 0; - ss = map_put_tlv_cstruct(cmdu->tlvs[i], &len); - if (ss) { - tlv_str = (char *)calloc((2 * len) + 1, - sizeof(char)); - if (!tlv_str) { - free(ss); - goto out; - } - - btostr(ss, len, tlv_str); - tlv_str_len = 2 * len; - tlv_data_len += tlv_str_len; - tlv_data = realloc(tlv_data, - tlv_data_len * sizeof(char)); - if (!tlv_data) { - fprintf(stderr, "%s:%d out of memory.!\n", - __func__, __LINE__); - free(ss); - free(tlv_str); - goto out; - } + blobmsg_add_u32(&b, "type", cmdu_get_type(cmdu)); - copy_index = tlv_data_len - tlv_str_len - 1; - memcpy(tlv_data + copy_index, tlv_str, - tlv_str_len); - free(ss); - free(tlv_str); - } - } + if (hwaddr_is_zero(cmdu->origin)) + hwaddr_ntoa("\x01\x80\xC2\x00\x00\x13", dst_addr); + else + hwaddr_ntoa(cmdu->origin, dst_addr); - if (tlv_data) { - tlv_data[tlv_data_len - 1] = '\0'; - blobmsg_add_string(&b, "data", tlv_data); - free(tlv_data); - } - } + blobmsg_add_string(&b, "dst", dst_addr); + blobmsg_add_u32(&b, "mid", (uint32_t)cmdu_get_mid(cmdu)); - if (ubus_lookup_id(a->ubus_ctx, "map.1905", &id)) { - trace("[%s:%d] not present", __func__, __LINE__); - goto out; - } + trace("|%s:%d|cmdu:%d|egress:%s|dst:%s|mid:%u|\n", __func__, __LINE__, + cmdu_get_type(cmdu), + "TODO", dst_addr, cmdu_get_mid(cmdu)); - ret = ubus_invoke(a->ubus_ctx, id, "send", - b.head, send_cmdu_cb, - (void *)&msgid, - UBUS_TIMEOUT); - if (ret) { - trace("[%s:%d] ubus call failed for |map.1905 send|", - __func__, __LINE__); - goto out; - } + if (cmdu->datalen) { + char *tlv_str = NULL; + uint16_t len = 0; - ret = msgid; -out: - blob_buf_free(&b); + //char tlv_str[1500] = {0}; - return ret; -} + len = (cmdu->datalen * 2) + 1; -int agent_handle_map_event(struct agent *a, uint16_t cmdutype, uint16_t mid, - char *rxif, uint8_t *src, uint8_t *tlvs, int len) -{ - const map_cmdu_handler_t *f; - struct cmdu_cstruct *cmdu = NULL; - int ret = -1; - int idx; + tlv_str = (char *)calloc(1, len); + if (!tlv_str) + goto out; + btostr(cmdu->data, cmdu->datalen, tlv_str); - trace("%s: ---> cmdu = %d\n", __func__, cmdutype); + tlv_str[len-1] = '\0'; - if (cmdutype >= CMDU_TYPE_MAP_START) { - idx = cmdutype - CMDU_TYPE_MAP_START; - f = agent_mapftable; - } else { - idx = cmdutype; - f = i1905ftable; + blobmsg_add_string(&b, "data", tlv_str); + trace("|%s:%d|data:%s|\n", __func__, __LINE__, tlv_str); + free(tlv_str); } - if (f[idx]) { - cmdu = map_build_cmdu(cmdutype, mid, rxif, src, tlvs); - if (cmdu) { - test_cmdu(cmdu); - ret = f[idx](a, cmdu); - map_free_cmdu(cmdu); - } else { - dbg("agent: %s: map_build_cmdu() failed!\n", __func__); - } + + if (ubus_lookup_id(a->ubus_ctx, "i1905.al.eth1", &id)) { + trace("[%s:%d] not present i1905.al.eth1", __func__, __LINE__); + goto out; } - //TODO: check ret + ret = ubus_invoke(a->ubus_ctx, id, "cmdu", b.head, send_cmdu_cb, + &msgid, UBUS_TIMEOUT); + if (ret) { + trace("[%s:%d] ubus call failed for |i1905.al.eth1 send| rc: %d\n", + __func__, __LINE__, ret); + goto out; + } + trace("|%s:%d| msgid = %d\n", __func__, __LINE__, msgid); + ret = msgid; +out: + blob_buf_free(&b); return ret; } diff --git a/src/core/agent_map.h b/src/core/agent_map.h index 77db8aebebb41ffde98ffe71b42be3deb26e3c9f..1e9f2b41fec7fe03f929e1bc04853fde8dfcb920 100644 --- a/src/core/agent_map.h +++ b/src/core/agent_map.h @@ -4,21 +4,20 @@ struct channel_response; -uint8_t *extract_tlv_by_type(struct cmdu_cstruct *cmdu, uint8_t tlv_type); +uint8_t *extract_tlv_by_type(struct cmdu_buff *cmdu, uint8_t tlv_type); extern bool is_cmdu_for_us(struct agent *a, uint16_t type); extern int agent_handle_map_cmd(struct agent *a, char *data, int len); -extern int agent_handle_map_event(struct agent *a, uint16_t cmdutype, - uint16_t mid, char *rxif, uint8_t *src, - uint8_t *tlvs, int len); +int agent_handle_map_event(struct agent *a, uint16_t cmdutype, uint16_t mid, + char *rxif, uint8_t *src, uint8_t *tlvs, int len); extern int handle_wifi_radio_scan_finished(void *agent); int build_ap_autoconfig_wsc(void *agent, uint8_t *hwaddr, struct wifi_radio_element *radio, int idx); -uint16_t agent_send_cmdu(struct agent *a, struct cmdu_cstruct *cmdu); -int send_channel_sel_response(void *agent, struct cmdu_cstruct *cmdu, +uint16_t agent_send_cmdu(struct agent *a, struct cmdu_buff *cmdu); +int send_channel_sel_response(void *agent, struct cmdu_buff *cmdu, struct channel_response *rec_cmdu, uint32_t channel_response_nr); int agent_fill_radio_max_preference(void *agent, struct channel_response *channel_resp, uint32_t *channel_response_nr); @@ -29,5 +28,6 @@ int send_steer_btm_report(void *agent, uint8_t *origin, const char *intf_name, uint8_t *target_bssid, uint8_t *src_bssid, uint8_t *sta, uint8_t status_code); int send_sta_steer_complete(void *agent, uint8_t *origin, const char *intf_name); +uint16_t agent_send_cmdu_unish(struct agent *a, struct cmdu_buff *cmdu); #endif /* AGENT_MAP_H */ diff --git a/src/core/agent_tlv_generator.c b/src/core/agent_tlv_generator.c index 36929c4aafe6e0d8cd097ced8b178c38f5e3b77c..ea6688929f894b938193f703a9052d311497b571 100644 --- a/src/core/agent_tlv_generator.c +++ b/src/core/agent_tlv_generator.c @@ -26,13 +26,17 @@ #include <libubox/utils.h> #include <libubus.h> -#include <map1905/map2.h> -#include <map1905/maputils.h> -#include <wsc.h> +#include <timer_impl.h> +#include <cmdu.h> +#include <1905_tlvs.h> +#include <i1905_wsc.h> +#include <map22.h> + #include <uci.h> +#include <map_module22.h> -#include "map_module.h" +//#include "map_module.h" #include "utils.h" #include "debug.h" #include "liblist.h" @@ -48,638 +52,890 @@ #define AP_COLLECTION_INTERVAL (10 * 1000) struct tlv_ap_ht_cap *agent_gen_ap_ht_caps(struct agent *a, - struct cmdu_cstruct *cmdu, uint32_t radio_index) + struct cmdu_buff *cmdu, uint32_t radio_index) { - struct tlv_ap_ht_cap *p; - struct wifi_radio_element *radio; - struct netif_fh *fh; - - radio = a->radios + radio_index; - - p = (struct tlv_ap_ht_cap *)calloc(1, - sizeof(struct tlv_ap_ht_cap)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_AP_HT_CAPABILITIES; - - fh = wifi_radio_to_ap(a, radio->name); - if (!fh) { - free(p); - return NULL; - } - - memcpy(p->radio_id, radio->macaddr, 6); - p->max_tx_streams_supported = (radio->tx_streams - 1) & 0xff; - p->max_rx_streams_supported = (radio->rx_streams - 1) & 0xff; - p->gi_20_support = fh->caps.ht & (1 << 3) ? 1 : 0; - p->gi_40_support = fh->caps.ht & (1 << 2) ? 1 : 0; - p->ht_40_support = fh->caps.ht & (1 << 1) ? 1 : 0; - - return p; + return NULL; +// struct tlv_ap_ht_cap *p; +// struct wifi_radio_element *radio; +// struct netif_fh *fh; +// +// radio = a->radios + radio_index; +// +// p = (struct tlv_ap_ht_cap *)calloc(1, +// sizeof(struct tlv_ap_ht_cap)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_AP_HT_CAPABILITIES; +// +// fh = wifi_radio_to_ap(a, radio->name); +// if (!fh) { +// free(p); +// return NULL; +// } +// +// memcpy(p->radio_id, radio->macaddr, 6); +// p->max_tx_streams_supported = (radio->tx_streams - 1) & 0xff; +// p->max_rx_streams_supported = (radio->rx_streams - 1) & 0xff; +// p->gi_20_support = fh->caps.ht & (1 << 3) ? 1 : 0; +// p->gi_40_support = fh->caps.ht & (1 << 2) ? 1 : 0; +// p->ht_40_support = fh->caps.ht & (1 << 1) ? 1 : 0; +// +// return p; } struct tlv_ap_cap *agent_gen_ap_caps(struct agent *a, - struct cmdu_cstruct *cmdu) + struct cmdu_buff *cmdu) { - struct tlv_ap_cap *p; - - p = (struct tlv_ap_cap *)calloc(1, - sizeof(struct tlv_ap_cap)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_AP_CAPABILITY; - p->op_ch_metric_reporting = 0; - p->non_op_ch_metric_reporting = 0; - p->agent_init_rcpi_steering = 1; - - return p; + return NULL; +// struct tlv_ap_cap *p; +// +// p = (struct tlv_ap_cap *)calloc(1, +// sizeof(struct tlv_ap_cap)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_AP_CAPABILITY; +// p->op_ch_metric_reporting = 0; +// p->non_op_ch_metric_reporting = 0; +// p->agent_init_rcpi_steering = 1; +// +// return p; } -struct tlv_ap_radio_basic_cap *agent_gen_ap_radio_basic_cap(struct agent *a, - struct cmdu_cstruct *cmdu, struct wifi_radio_element *radio) +int agent_gen_ap_radio_basic_cap(struct agent *a, + struct cmdu_buff *frm, struct wifi_radio_element *radio) { - uint32_t j; - struct tlv_ap_radio_basic_cap *p; + struct tlv *t; + struct tlv_ap_radio_basic_cap *data; + int i; + + t = cmdu_reserve_tlv(frm, 256); + if (!t) + return -1; - p = (struct tlv_ap_radio_basic_cap *)calloc(1, - sizeof(struct tlv_ap_radio_basic_cap)); + t->type = MAP_TLV_AP_RADIO_BASIC_CAPABILITIES; + t->len = 6 + 1 + 1; - p->tlv_type = MAP_TLV_AP_RADIO_BASIC_CAPABILITIES; - memcpy(p->radio_id, radio->macaddr, 6); - p->max_bss_nr = 4; /* Max BSS per Radio */ - p->operating_classes_nr = radio->num_supp_opclass; - - if (p->operating_classes_nr > 0) - p->operating_class = calloc(p->operating_classes_nr, - sizeof(*p->operating_class)); - if (!p->operating_class) { - fprintf(stderr, "|%s:%d| out of memory!\n", __func__, __LINE__); - p->operating_classes_nr = 0; - return p; - } + data = (struct tlv_ap_radio_basic_cap *) t->data; - for (j = 0; j < p->operating_classes_nr; j++) { - p->operating_class[j].op_class = radio->supp_opclass[j].id; - p->operating_class[j].max_tx_power = radio->supp_opclass[j].max_txpower; - p->operating_class[j].non_op_ch_nr = radio->supp_opclass[j].num_exclude_channels; - if (p->operating_class[j].non_op_ch_nr > 0) { - p->operating_class[j].channel = - (uint8_t *)calloc(p->operating_class[j].non_op_ch_nr, - sizeof(uint8_t)); - if (p->operating_class[j].channel) { - memcpy(p->operating_class[j].channel, radio->supp_opclass[j].exclude_chanlist, - p->operating_class[j].non_op_ch_nr); - } + data->max_bssnum = 16; /* TODO: dummy: max BSS per radio */ + data->num_opclass = radio->num_supp_opclass; + + for (i = 0; i < data->num_opclass; i++) { + t->len += 3; + data->opclass[i].classid = radio->supp_opclass[i].id; + data->opclass[i].max_txpower = radio->supp_opclass[i].max_txpower; + data->opclass[i].num_nonop_channel = radio->supp_opclass[i].num_exclude_channels; + if (data->opclass[i].num_nonop_channel > 0) { + t->len += data->opclass[i].num_nonop_channel; + memcpy(data->opclass[i].nonop_channel, radio->supp_opclass[i].exclude_chanlist, + data->opclass[i].num_nonop_channel); } } + if (cmdu_put_tlv(frm, t)) { + dbg("%s: error: cmdu_put_tlv()\n", __func__); + return -1; + } - return p; + return 0; +// uint32_t j; +// struct tlv_ap_radio_basic_cap *p; +// +// p = (struct tlv_ap_radio_basic_cap *)calloc(1, +// sizeof(struct tlv_ap_radio_basic_cap)); +// +// p->tlv_type = MAP_TLV_AP_RADIO_BASIC_CAPABILITIES; +// memcpy(p->radio_id, radio->macaddr, 6); +// p->max_bss_nr = 4; /* Max BSS per Radio */ +// p->operating_classes_nr = radio->num_supp_opclass; +// +// if (p->operating_classes_nr > 0) +// p->operating_class = calloc(p->operating_classes_nr, +// sizeof(*p->operating_class)); +// if (!p->operating_class) { +// fprintf(stderr, "|%s:%d| out of memory!\n", __func__, __LINE__); +// p->operating_classes_nr = 0; +// return p; +// } +// +// for (j = 0; j < p->operating_classes_nr; j++) { +// p->operating_class[j].op_class = radio->supp_opclass[j].id; +// p->operating_class[j].max_tx_power = radio->supp_opclass[j].max_txpower; +// p->operating_class[j].non_op_ch_nr = radio->supp_opclass[j].num_exclude_channels; +// if (p->operating_class[j].non_op_ch_nr > 0) { +// p->operating_class[j].channel = +// (uint8_t *)calloc(p->operating_class[j].non_op_ch_nr, +// sizeof(uint8_t)); +// if (p->operating_class[j].channel) { +// memcpy(p->operating_class[j].channel, radio->supp_opclass[j].exclude_chanlist, +// p->operating_class[j].non_op_ch_nr); +// } +// } +// } +// +// return p; } struct tlv_ap_vht_cap *agent_gen_ap_vht_caps(struct agent *a, - struct cmdu_cstruct *cmdu, uint32_t radio_index) + struct cmdu_buff *cmdu, uint32_t radio_index) { - struct tlv_ap_vht_cap *p; - struct wifi_radio_element *radio; - struct netif_fh *fh; - - radio = a->radios + radio_index; - - fh = wifi_radio_to_ap(a, radio->name); - if (!fh) - return NULL; - - p = (struct tlv_ap_vht_cap *)calloc(1, - sizeof(struct tlv_ap_vht_cap)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_AP_VHT_CAPABILITIES; - memcpy(p->radio_id, radio->macaddr, 6); - memcpy(&p->vht_tx_mcs_supported, &fh->caps.mcs.vht_mcs_txmap, 2); - memcpy(&p->vht_rx_mcs_supported, &fh->caps.mcs.vht_mcs_rxmap, 2); - p->max_tx_streams_supported = (fh->tx_spatial_streams - 1); - p->max_rx_streams_supported = (fh->rx_spatial_streams - 1); - p->gi_80_support = fh->caps.vht[4] & (1 << 1) ? 1 : 0; - p->gi_160_support = fh->caps.vht[4] & (1 << 0) ? 1 : 0; - p->vht_8080_support = fh->caps.vht[5] & (1 << 7) ? 1 : 0; - p->vht_160_support = fh->caps.vht[5] & (1 << 6) ? 1 : 0; - p->su_beamformer_capable = fh->caps.vht[5] & (1 << 5) ? 1 : 0; - p->mu_beamformer_capable = fh->caps.vht[5] & (1 << 4) ? 1 : 0; - - return p; + return NULL; +// struct tlv_ap_vht_cap *p; +// struct wifi_radio_element *radio; +// struct netif_fh *fh; +// +// radio = a->radios + radio_index; +// +// fh = wifi_radio_to_ap(a, radio->name); +// if (!fh) +// return NULL; +// +// p = (struct tlv_ap_vht_cap *)calloc(1, +// sizeof(struct tlv_ap_vht_cap)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_AP_VHT_CAPABILITIES; +// memcpy(p->radio_id, radio->macaddr, 6); +// memcpy(&p->vht_tx_mcs_supported, &fh->caps.mcs.vht_mcs_txmap, 2); +// memcpy(&p->vht_rx_mcs_supported, &fh->caps.mcs.vht_mcs_rxmap, 2); +// p->max_tx_streams_supported = (fh->tx_spatial_streams - 1); +// p->max_rx_streams_supported = (fh->rx_spatial_streams - 1); +// p->gi_80_support = fh->caps.vht[4] & (1 << 1) ? 1 : 0; +// p->gi_160_support = fh->caps.vht[4] & (1 << 0) ? 1 : 0; +// p->vht_8080_support = fh->caps.vht[5] & (1 << 7) ? 1 : 0; +// p->vht_160_support = fh->caps.vht[5] & (1 << 6) ? 1 : 0; +// p->su_beamformer_capable = fh->caps.vht[5] & (1 << 5) ? 1 : 0; +// p->mu_beamformer_capable = fh->caps.vht[5] & (1 << 4) ? 1 : 0; +// +// return p; } -struct tlv_profile2_ap_cap *agent_gen_profile2_ap_cap(struct agent *a) +int agent_gen_profile2_ap_cap(struct agent *a, struct cmdu_buff *frm) { - struct tlv_profile2_ap_cap *p; - - p = (struct tlv_profile2_ap_cap *)calloc(1, sizeof(*p)); - if (!p) - return NULL; + struct tlv *t; + struct tlv_profile2_ap_cap *data; - p->tlv_type = MAP_TLV_PROFILE2_AP_CAPABILITY; - p->byte_counter = 0; - p->max_vids = (uint8_t)255; - - return p; -} + t = cmdu_reserve_tlv(frm, 256); + if (!t) + return -1; -struct tlv_ap_radio_adv_cap *agent_gen_ap_radio_adv_cap(struct agent *a, - struct cmdu_cstruct *cmdu, struct wifi_radio_element *radio) -{ - struct tlv_ap_radio_adv_cap *p; + t->type = MAP_TLV_PROFILE2_AP_CAPABILITY; + t->len = 4; - p = (struct tlv_ap_radio_adv_cap *) calloc(1, sizeof(*p)); - if (!p) - return NULL; + data = (struct tlv_profile2_ap_cap *) t->data; + data->unit = STATS_UNIT_BYTE; + data->max_vids = (uint8_t) 255; - p->tlv_type = MAP_TLV_AP_RADIO_ADV_CAPABILITY; - memcpy(p->radio_id, radio->macaddr, 6); - p->combined_front_back = 0; - p->combined_p1_p2 = (a->cfg.profile == 0x02); + if (cmdu_put_tlv(frm, t)) { + dbg("%s: error: cmdu_put_tlv()\n", __func__); + return -1; + } - return p; + return 0; +// struct tlv_profile2_ap_cap *p; +// +// p = (struct tlv_profile2_ap_cap *)calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_PROFILE2_AP_CAPABILITY; +// p->byte_counter = 0; +// p->max_vids = (uint8_t)255; +// +// return p; } -struct tlv_wsc *agent_gen_wsc(struct agent *a, struct cmdu_cstruct *cmdu, - struct wifi_radio_element *radio) +int agent_gen_ap_radio_adv_cap(struct agent *a, + struct cmdu_buff *frm, struct wifi_radio_element *radio) { - struct tlv_wsc *p; - struct wsc_key *key; - int rv; - uint16_t len = 0; - - p = (struct tlv_wsc *) calloc(1, sizeof(*p)); - if (!p) - return NULL; + struct tlv *t; + struct tlv_ap_radio_adv_cap *data; - p->tlv_type = TLV_TYPE_WSC; - - // TODO: auth_type uses dummy value (WPA2PSK) - rv = wscBuildM1(radio->name, &p->wsc_frame, &len, (void **)&key, - a->almac, radio->band, 0x0020, 0); - if (!rv) - goto fail_p; + t = cmdu_reserve_tlv(frm, 256); + if (!t) + return -1; - p->wsc_frame_size = len; - radio->autconfig.m1_size = len; + t->type = MAP_TLV_AP_RADIO_ADV_CAPABILITY; + t->len = 7; - /* discard previous frame if it has not been used */ - if (radio->autconfig.m1_frame) - free(radio->autconfig.m1_frame); - radio->autconfig.m1_frame = calloc(1, len); - if (!radio->autconfig.m1_frame) - goto fail_key; + data = (struct tlv_ap_radio_adv_cap *) t->data; + memcpy(data->radio, radio->macaddr, 6); + if (a->cfg.profile == 0x02) + data->cap |= RADIO_CAP_COMBINED_P1P2; /* TODO: dummy: assume p2 implies p1 support */ - memcpy(radio->autconfig.m1_frame, p->wsc_frame, len); + if (!hwaddr_is_zero(radio->bksta.macaddr) && radio->num_bss > 0) + data->cap |= RADIO_CAP_COMBINED_FHBK; - /* discard previous key if it has not been used */ - if (radio->autconfig.key) { - free(radio->autconfig.key->key); - free(radio->autconfig.key); + if (cmdu_put_tlv(frm, t)) { + dbg("%s: error: cmdu_put_tlv()\n", __func__); + return -1; } - radio->autconfig.key = key; - return p; -fail_key: - free(key); -fail_p: - map_free_tlv_cstruct((uint8_t *) p); - return NULL; + return 0; +// struct tlv_ap_radio_adv_cap *p; +// +// p = (struct tlv_ap_radio_adv_cap *) calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_AP_RADIO_ADV_CAPABILITY; +// memcpy(p->radio_id, radio->macaddr, 6); +// p->combined_front_back = 0; +// p->combined_p1_p2 = (a->cfg.profile == 0x02); +// +// return p; } -struct tlv_ch_scan_cap *agent_gen_ch_scan_cap(struct agent *a) +int agent_gen_wsc(struct agent *a, struct cmdu_buff *frm, + struct wifi_radio_element *radio) { - struct tlv_ch_scan_cap *p; - int i; - - if (a->num_radios <= 0) - return NULL; - - p = (struct tlv_ch_scan_cap *) calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_CHANNEL_SCAN_CAPABILITY; - p->nbr_radios = a->num_radios; - - p->radio = calloc(p->nbr_radios, sizeof(*p->radio)); - if (!p->radio) - goto fail_p; - - for (i = 0; i < p->nbr_radios; i++) { - struct wifi_radio_element *radio; - struct wifi_opclass_supported_element *opclass; - int j; + struct tlv *t; + uint8_t *m1; + uint16_t m1_size = 0; + void *key; + struct wps_credential wps = {0}; + int ret; - radio = a->radios + i; + wps.band = radio->band; + memcpy(wps.macaddr, radio->macaddr, 6); - memcpy(p->radio[i].radio_id, radio->macaddr, 6); - p->radio[i].on_boot = 0; // TODO: Dummy values - p->radio[i].scan_impact = 0x03; // TODO: Dummy values - p->radio[i].min_scan_interval = 30; // TODO: Dummy values - p->radio[i].nbr_op_classes = radio->num_supp_opclass; - if (p->radio[i].nbr_op_classes <= 0) - continue; + ret = wsc_build_m1(&wps, &m1, &m1_size, &key); + if (ret) + return -1; - p->radio[i].op_class = calloc(p->radio[i].nbr_op_classes, - sizeof(*p->radio[i].op_class)); - if (!p->radio[i].op_class) - continue; + t = cmdu_reserve_tlv(frm, 1024); + if (!t) { + cmdu_free(frm); + return -1; + } - for (j = 0; j < p->radio[i].nbr_op_classes; j++) { - int k; + t->type = TLV_TYPE_WSC; + t->len = m1_size; + memcpy(t->data, m1, m1_size); - opclass = radio->supp_opclass + j; - p->radio[i].op_class[j].op_class = opclass->id; - p->radio[i].op_class[j].nbr_ch = opclass->num_supported_channels; // Scan on all channels + ret = cmdu_put_tlv(frm, t); + if (ret) { + fprintf(stderr, "%s: error: cmdu_put_tlv()\n", __func__); + cmdu_free(frm); + return -1; + } - if (p->radio[i].op_class[j].nbr_ch <= 0) - continue; + radio->autconfig.m1_frame = m1; + radio->autconfig.m1_size = m1_size; + radio->autconfig.key = key; - p->radio[i].op_class[j].ch = calloc(p->radio[i].op_class[j].nbr_ch, - sizeof(*p->radio[i].op_class[j].ch)); - if (!p->radio[i].op_class[j].ch) - continue; + dbg("size = %d\n", m1_size); - for (k = 0; k < p->radio[i].op_class[j].nbr_ch; k++) - p->radio[i].op_class[j].ch[k] = opclass->supp_chanlist[k].channel; - } - } + return 0; +// struct tlv_wsc *p; +// struct wsc_key *key; +// int rv; +// uint16_t len = 0; +// +// p = (struct tlv_wsc *) calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = TLV_TYPE_WSC; +// +// // TODO: auth_type uses dummy value (WPA2PSK) +// rv = wscBuildM1(radio->name, &p->wsc_frame, &len, (void **)&key, +// a->almac, radio->band, 0x0020, 0); +// if (!rv) +// goto fail_p; +// +// p->wsc_frame_size = len; +// radio->autconfig.m1_size = len; +// +// /* discard previous frame if it has not been used */ +// if (radio->autconfig.m1_frame) +// free(radio->autconfig.m1_frame); +// radio->autconfig.m1_frame = calloc(1, len); +// if (!radio->autconfig.m1_frame) +// goto fail_key; +// +// memcpy(radio->autconfig.m1_frame, p->wsc_frame, len); +// +// /* discard previous key if it has not been used */ +// if (radio->autconfig.key) { +// free(radio->autconfig.key->key); +// free(radio->autconfig.key); +// } +// radio->autconfig.key = key; +// +// return p; +//fail_key: +// free(key); +//fail_p: +// map_free_tlv_cstruct((uint8_t *) p); +// return NULL; +} - return p; -fail_p: - map_free_tlv_cstruct((uint8_t *) p); +struct tlv_ch_scan_cap *agent_gen_ch_scan_cap(struct agent *a) +{ return NULL; + +/* TODO: README: @Lejla merge conflict when rebasing for prj-unish ---- please have a look */ +// struct tlv_ch_scan_cap *p; +// int i; +// +// if (a->num_radios <= 0) +// return NULL; +// +// p = (struct tlv_ch_scan_cap *) calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_CHANNEL_SCAN_CAPABILITY; +// p->nbr_radios = a->num_radios; +// +// p->radio = calloc(p->nbr_radios, sizeof(*p->radio)); +// if (!p->radio) +// goto fail_p; +// +// for (i = 0; i < p->nbr_radios; i++) { +// struct wifi_radio_element *radio; +// struct wifi_opclass_supported_element *opclass; +// int j; +// +// radio = a->radios + i; +// +// memcpy(p->radio[i].radio_id, radio->macaddr, 6); +// p->radio[i].on_boot = 0; // TODO: Dummy values +// p->radio[i].scan_impact = 0x03; // TODO: Dummy values +// p->radio[i].min_scan_interval = 30; // TODO: Dummy values +// p->radio[i].nbr_op_classes = radio->num_supp_opclass; +// if (p->radio[i].nbr_op_classes <= 0) +// continue; +// +// p->radio[i].op_class = calloc(p->radio[i].nbr_op_classes, +// sizeof(*p->radio[i].op_class)); +// if (!p->radio[i].op_class) +// continue; +// +// for (j = 0; j < p->radio[i].nbr_op_classes; j++) { +// int k; + +/* README: TODO: @Lejla prior to rebase below */ +// struct tlv_ch_scan_cap *p; +// int i; +// +// if (a->num_radios <= 0) +// return NULL; +// +// p = (struct tlv_ch_scan_cap *) calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_CHANNEL_SCAN_CAPABILITY; +// p->nbr_radios = a->num_radios; +// +// p->radio = calloc(p->nbr_radios, sizeof(*p->radio)); +// if (!p->radio) +// goto fail_p; +// +// for (i = 0; i < p->nbr_radios; i++) { +// struct wifi_radio_element *radio; +// struct wifi_opclass_supported_element *opclass; +// int j; +// +// radio = a->radios + i; +// +// memcpy(p->radio[i].radio_id, radio->macaddr, 6); +// p->radio[i].on_boot = 0; // TODO: Dummy values +// p->radio[i].scan_impact = 0x03; // TODO: Dummy values +// p->radio[i].min_scan_interval = 30; // TODO: Dummy values +// p->radio[i].nbr_op_classes = radio->num_supp_opclass; +// +// if (p->radio[i].nbr_op_classes <= 0) +// continue; +// +// p->radio[i].op_class = calloc(p->radio[i].nbr_op_classes, +// sizeof(*p->radio[i].op_class)); +// if (!p->radio[i].op_class) +// continue; +// +// for (j = 0; j < p->radio[i].nbr_op_classes; j++) { +// int k; +// +// opclass = radio->supp_opclass + j; +// p->radio[i].op_class[j].op_class = opclass->id; +// p->radio[i].op_class[j].nbr_ch = opclass->num_supported_channels; // Scan on all channels +// +// if (p->radio[i].op_class[j].nbr_ch <= 0) +// continue; +// +// p->radio[i].op_class[j].ch = calloc(p->radio[i].op_class[j].nbr_ch, +// sizeof(*p->radio[i].op_class[j].ch)); +// if (!p->radio[i].op_class[j].ch) +// continue; +// +// for (k = 0; k < p->radio[i].op_class[j].nbr_ch; k++) +// p->radio[i].op_class[j].ch[k] = opclass->supp_chanlist[k].channel; +// } +// } +// +// return p; +//fail_p: +// map_free_tlv_cstruct((uint8_t *) p); +// return NULL; } struct tlv_cac_cap *agent_gen_cac_cap(struct agent *a) { - struct tlv_cac_cap *p; - int i; - - p = (struct tlv_cac_cap *) calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_CAC_CAPABILITY; - memcpy(p->country_code, a->radios[0].country_code, 2); - p->nbr_radios = a->num_radios; - - p->radio_data = calloc(p->nbr_radios, sizeof(*p->radio_data)); - if (!p->radio_data) - goto fail_p; - - for (i = 0; i < p->nbr_radios; i++) { - struct wifi_radio_element *radio; - struct wifi_opclass_supported_element *opclass; - int j; - - radio = a->radios + i; - - memcpy(p->radio_data[i].radio_id, radio->macaddr, 6); - p->radio_data[i].nbr_cac_types = 1; - - if (p->radio_data[i].nbr_cac_types <= 0) - continue; - - p->radio_data[i].cac_data = calloc(p->radio_data[i].nbr_cac_types, - sizeof(*p->radio_data[i].cac_data)); - if (!p->radio_data[i].cac_data) - continue; - - for (j = 0; j < p->radio_data[i].nbr_cac_types; j++) { - int k; - - p->radio_data[i].cac_data[j].cac_method_supported = CAC_CAP_METHOD_CONTI_CAC; - p->radio_data[i].cac_data[j].duration = 60; /* Default duration is 60, 600 for channels (120, 124 & 128) */ - // TODO: Assumption, All the supporting op_class supported continuous CAC method, - // Currently no parmaeter/method to classify the same. - p->radio_data[i].cac_data[j].nbr_op_classes = radio->num_supp_opclass; - - if (p->radio_data[i].cac_data[j].nbr_op_classes <= 0) - continue; - - p->radio_data[i].cac_data[j].op_class_data = - calloc(radio->num_supp_opclass, - sizeof(*p->radio_data[i].cac_data[j].op_class_data)); - - if (!p->radio_data[i].cac_data[j].op_class_data) - continue; - - for (k = 0; k < radio->num_supp_opclass; k++) { - int l; - - opclass = radio->supp_opclass + k; - p->radio_data[i].cac_data[j].op_class_data[k].op_class = opclass->id; - p->radio_data[i].cac_data[j].op_class_data[k].nbr_ch = opclass->num_supported_channels; - - if (opclass->num_supported_channels <= 0) - continue; - - p->radio_data[i].cac_data[j].op_class_data[k].ch = - calloc(opclass->num_supported_channels, sizeof(struct supp_channel)); - - if (!p->radio_data[i].cac_data[j].op_class_data[k].ch) - continue; - - for (l = 0; l < opclass->num_supported_channels; l++) { - uint8_t ch; - - p->radio_data[i].cac_data[j].op_class_data[k].ch[l] = opclass->supp_chanlist[l].channel; - - ch = p->radio_data[i].cac_data[j].op_class_data[k].ch[l]; - if (ch == 120 || ch == 124 || ch == 128) - p->radio_data[i].cac_data[j].duration = 600; - } - } - } - } - return p; -fail_p: - map_free_tlv_cstruct((uint8_t *) p); return NULL; +// struct tlv_cac_cap *p; +// int i; +// +// p = (struct tlv_cac_cap *) calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_CAC_CAPABILITY; +// memcpy(p->country_code, a->radios[0].country_code, 2); +// p->nbr_radios = a->num_radios; +// +// p->radio_data = calloc(p->nbr_radios, sizeof(*p->radio_data)); +// if (!p->radio_data) +// goto fail_p; +// +// for (i = 0; i < p->nbr_radios; i++) { +// struct wifi_radio_element *radio; +// struct wifi_opclass_supported_element *opclass; +// int j; +// +// radio = a->radios + i; +// +// memcpy(p->radio_data[i].radio_id, radio->macaddr, 6); +// p->radio_data[i].nbr_cac_types = 1; +// +// if (p->radio_data[i].nbr_cac_types <= 0) +// continue; +// +// p->radio_data[i].cac_data = calloc(p->radio_data[i].nbr_cac_types, +// sizeof(*p->radio_data[i].cac_data)); +// if (!p->radio_data[i].cac_data) +// continue; +// +// for (j = 0; j < p->radio_data[i].nbr_cac_types; j++) { +// int k; +// +// p->radio_data[i].cac_data[j].cac_method_supported = CAC_CAP_METHOD_CONTI_CAC; +// p->radio_data[i].cac_data[j].duration = 60; /* Default duration is 60, 600 for channels (120, 124 & 128) */ +// // TODO: Assumption, All the supporting op_class supported continuous CAC method, +// // Currently no parmaeter/method to classify the same. +// p->radio_data[i].cac_data[j].nbr_op_classes = radio->num_supp_opclass; +// +// if (p->radio_data[i].cac_data[j].nbr_op_classes <= 0) +// continue; +// +// p->radio_data[i].cac_data[j].op_class_data = +// calloc(radio->num_supp_opclass, +// sizeof(*p->radio_data[i].cac_data[j].op_class_data)); +// +// if (!p->radio_data[i].cac_data[j].op_class_data) +// continue; +// +// for (k = 0; k < radio->num_supp_opclass; k++) { +// int l; +// +// opclass = radio->supp_opclass + k; +// p->radio_data[i].cac_data[j].op_class_data[k].op_class = opclass->id; +// p->radio_data[i].cac_data[j].op_class_data[k].nbr_ch = opclass->num_supported_channels; +// +// if (opclass->num_supported_channels <= 0) +// continue; +// +// p->radio_data[i].cac_data[j].op_class_data[k].ch = +// calloc(opclass->num_supported_channels, sizeof(struct supp_channel)); +// +// if (!p->radio_data[i].cac_data[j].op_class_data[k].ch) +// continue; +// +// for (l = 0; l < opclass->num_supported_channels; l++) { +// uint8_t ch; +// +// p->radio_data[i].cac_data[j].op_class_data[k].ch[l] = opclass->supp_chanlist[l].channel; +// +// ch = p->radio_data[i].cac_data[j].op_class_data[k].ch[l]; +// if (ch == 120 || ch == 124 || ch == 128) +// p->radio_data[i].cac_data[j].duration = 600; +// } +// } +// } +// } +// return p; +//fail_p: +// map_free_tlv_cstruct((uint8_t *) p); +// return NULL; } struct tlv_metric_collection_interval *agent_gen_metric_collection_interval(struct agent *a) { - struct tlv_metric_collection_interval *p; - - p = (struct tlv_metric_collection_interval *) calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_METRIC_COLLECTION_INTERVAL; - p->collection_interval = AP_COLLECTION_INTERVAL; - - return p; + return NULL; +// struct tlv_metric_collection_interval *p; +// +// p = (struct tlv_metric_collection_interval *) calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_METRIC_COLLECTION_INTERVAL; +// p->collection_interval = AP_COLLECTION_INTERVAL; +// +// return p; } struct tlv_oper_ch_report *agent_gen_operate_channel_report(struct agent *a, - struct cmdu_cstruct *cmdu, uint32_t radio_index) + struct cmdu_buff *cmdu, uint32_t radio_index) { - struct tlv_oper_ch_report *p; - struct wifi_radio_element *radio; - uint32_t j = 0; - - radio = a->radios + radio_index; - - p = (struct tlv_oper_ch_report *)calloc(1, - sizeof(struct tlv_oper_ch_report)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_OPERATING_CHANNEL_REPORT; - memcpy(p->radio_id, radio->macaddr, 6); - p->op_ch_op_class_nr = 1; - - if (p->op_ch_op_class_nr > 0) - p->op_ch_op_class = calloc(p->op_ch_op_class_nr, - sizeof(*p->op_ch_op_class)); - - if (!p->op_ch_op_class) { - fprintf(stderr, "|%s:%d| out of memory!\n", __func__, __LINE__); - p->op_ch_op_class_nr = 0; - return NULL; - } - - for (j = 0; j < p->op_ch_op_class_nr; j++) { - p->op_ch_op_class[j].op_class = radio->current_opclass; - p->op_ch_op_class[j].channel = radio->current_channel; - } - - /* current transmit power is the (operating class tx power) * - * (current_tx_power_percent)/100 - */ - for (j = 0; j < radio->num_supp_opclass; j++) { - if (radio->supp_opclass[j].id == radio->current_opclass) - p->curr_tx_power = - radio->supp_opclass[j].max_txpower * - ((radio->current_txpower_percent)/100); - } - return p; + return NULL; +// struct tlv_oper_ch_report *p; +// struct wifi_radio_element *radio; +// uint32_t j = 0; +// +// radio = a->radios + radio_index; +// +// p = (struct tlv_oper_ch_report *)calloc(1, +// sizeof(struct tlv_oper_ch_report)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_OPERATING_CHANNEL_REPORT; +// memcpy(p->radio_id, radio->macaddr, 6); +// p->op_ch_op_class_nr = 1; +// +// if (p->op_ch_op_class_nr > 0) +// p->op_ch_op_class = calloc(p->op_ch_op_class_nr, +// sizeof(*p->op_ch_op_class)); +// +// if (!p->op_ch_op_class) { +// fprintf(stderr, "|%s:%d| out of memory!\n", __func__, __LINE__); +// p->op_ch_op_class_nr = 0; +// return NULL; +// } +// +// for (j = 0; j < p->op_ch_op_class_nr; j++) { +// p->op_ch_op_class[j].op_class = radio->current_opclass; +// p->op_ch_op_class[j].channel = radio->current_channel; +// } +// +// /* current transmit power is the (operating class tx power) * +// * (current_tx_power_percent)/100 +// */ +// for (j = 0; j < radio->num_supp_opclass; j++) { +// if (radio->supp_opclass[j].id == radio->current_opclass) +// p->curr_tx_power = +// radio->supp_opclass[j].max_txpower * +// ((radio->current_txpower_percent)/100); +// } +// return p; } struct tlv_ch_selection_resp *agent_gen_operate_channel_response(struct agent *a, - struct cmdu_cstruct *cmdu, uint8_t *radio_recvd, uint8_t reason_code) + struct cmdu_buff *cmdu, uint8_t *radio_recvd, uint8_t reason_code) { - struct tlv_ch_selection_resp *p; - - p = (struct tlv_ch_selection_resp *)calloc(1, - sizeof(struct tlv_ch_selection_resp)); - - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_CHANNEL_SELECTION_RESPONSE; - memcpy(p->radio_id, radio_recvd, 6); - p->response_code = reason_code; - - return p; + return NULL; +// struct tlv_ch_selection_resp *p; +// +// p = (struct tlv_ch_selection_resp *)calloc(1, +// sizeof(struct tlv_ch_selection_resp)); +// +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_CHANNEL_SELECTION_RESPONSE; +// memcpy(p->radio_id, radio_recvd, 6); +// p->response_code = reason_code; +// +// return p; } void agent_gen_radio_channel_preference(struct agent *a, struct tlv_channel_pref *p, uint32_t radio_index) { - uint32_t j = 0, k = 0, count = 0, l = 0; - struct wifi_radio_element *radio = a->radios + radio_index; - - trace("%s -----> parsing radio %s\n", __func__, radio->name); - - memcpy(p->radio_id, radio->macaddr, 6); - p->ch_preference_op_class_nr = radio->num_supp_opclass; - - if (p->ch_preference_op_class_nr > 0) - p->op_class = calloc(p->ch_preference_op_class_nr, - sizeof(*p->op_class)); - if (!p->op_class) { - fprintf(stderr, "|%s:%d| out of memory!\n", __func__, __LINE__); - p->ch_preference_op_class_nr = 0; - return; - } - - for (j = 0; j < p->ch_preference_op_class_nr; j++) { - - p->op_class[j].op_class = radio->supp_opclass[j].id; - count = 0; - - /* Here we fill all the channels that are not having max preference 15 */ - for (k = 0; k < radio->supp_opclass[j].num_supported_channels; k++) { - if (radio->supp_opclass[j].supp_chanlist[k].pref != 0xff) - count++; - } - p->op_class[j].channel_nr = count; - - if (p->op_class[j].channel_nr > 0) { - p->op_class[j].channel_list = calloc(p->op_class[j].channel_nr, - sizeof(*p->op_class[j].channel_list)); - - if (!p->op_class[j].channel_list) { - fprintf(stderr, "|%s:%d| out of memory!\n", - __func__, __LINE__); - p->op_class[j].channel_nr = 0; - return; - } - l = 0; - - for (k = 0; k < radio->supp_opclass[j].num_supported_channels; k++) { - if (radio->supp_opclass[j].supp_chanlist[k].pref != 0xff) { - p->op_class[j].channel_list[l] = - radio->supp_opclass[j].supp_chanlist[k].channel; - p->op_class[j].preference = - radio->supp_opclass[j].supp_chanlist[k].pref; - l++; - } - } - - p->op_class[j].preference_reason = 0x00; - } else { - p->op_class[j].channel_list = NULL; - p->op_class[j].preference = 0xff; - p->op_class[j].preference_reason = 0x00; - } - } + return; +// uint32_t j = 0, k = 0, count = 0, l = 0; +// struct wifi_radio_element *radio = a->radios + radio_index; +// +// trace("%s -----> parsing radio %s\n", __func__, radio->name); +// +// memcpy(p->radio_id, radio->macaddr, 6); +// p->ch_preference_op_class_nr = radio->num_supp_opclass; +// +// if (p->ch_preference_op_class_nr > 0) +// p->op_class = calloc(p->ch_preference_op_class_nr, +// sizeof(*p->op_class)); +// if (!p->op_class) { +// fprintf(stderr, "|%s:%d| out of memory!\n", __func__, __LINE__); +// p->ch_preference_op_class_nr = 0; +// return; +// } +// +// for (j = 0; j < p->ch_preference_op_class_nr; j++) { +// +// p->op_class[j].op_class = radio->supp_opclass[j].id; +// count = 0; +// +// /* Here we fill all the channels that are not having max preference 15 */ +// for (k = 0; k < radio->supp_opclass[j].num_supported_channels; k++) { +// if (radio->supp_opclass[j].supp_chanlist[k].pref != 0xff) +// count++; +// } +// p->op_class[j].channel_nr = count; +// +// if (p->op_class[j].channel_nr > 0) { +// p->op_class[j].channel_list = calloc(p->op_class[j].channel_nr, +// sizeof(*p->op_class[j].channel_list)); +// +// if (!p->op_class[j].channel_list) { +// fprintf(stderr, "|%s:%d| out of memory!\n", +// __func__, __LINE__); +// p->op_class[j].channel_nr = 0; +// return; +// } +// l = 0; +// +// for (k = 0; k < radio->supp_opclass[j].num_supported_channels; k++) { +// if (radio->supp_opclass[j].supp_chanlist[k].pref != 0xff) { +// p->op_class[j].channel_list[l] = +// radio->supp_opclass[j].supp_chanlist[k].channel; +// p->op_class[j].preference = +// radio->supp_opclass[j].supp_chanlist[k].pref; +// l++; +// } +// } +// +// p->op_class[j].preference_reason = 0x00; +// } else { +// p->op_class[j].channel_list = NULL; +// p->op_class[j].preference = 0xff; +// p->op_class[j].preference_reason = 0x00; +// } +// } } void agent_gen_radio_restrict_channel(struct agent *a, struct tlv_radio_oper_restrict *p, uint32_t radio_index) { - uint32_t j, k, l, m; - struct wifi_radio_element *radio = a->radios + radio_index; - - trace("%s -----> parsing radio %s\n", __func__, radio->name); - - memcpy(p->radio_id, radio->macaddr, 6); - p->op_restricted_op_class_nr = 1; - - if (p->op_restricted_op_class_nr > 0) - p->restricted_op_class = calloc(p->op_restricted_op_class_nr, - sizeof(*p->restricted_op_class)); - if (!p->restricted_op_class) { - fprintf(stderr, "|%s:%d| out of memory!\n", __func__, __LINE__); - p->op_restricted_op_class_nr = 0; - return; - } - - for (j = 0, m = 0; j < radio->num_supp_opclass; j++) { - if (radio->supp_opclass[j].id != radio->current_opclass) - continue; - p->restricted_op_class[m].op_class = radio->current_opclass; - p->restricted_op_class[m].channel_nr = (radio->supp_opclass[j].num_supported_channels) - 1; - - if (p->restricted_op_class[m].channel_nr > 0) - p->restricted_op_class[m].restricted_channels = - calloc(p->restricted_op_class[j].channel_nr, - sizeof(*p->restricted_op_class[m].restricted_channels)); - - if (!p->restricted_op_class[m].restricted_channels) { - fprintf(stderr, "|%s:%d| out of memory!\n", __func__, __LINE__); - p->restricted_op_class[m].channel_nr = 0; - return; - } - - for (k = 0, l = 0; k < radio->supp_opclass[j].num_supported_channels; k++) { - if (radio->supp_opclass[j].supp_chanlist[k].channel == radio->current_channel) - continue; - p->restricted_op_class[m].restricted_channels[l].channel = - radio->supp_opclass[j].supp_chanlist[k].channel; - p->restricted_op_class[m].restricted_channels[l].min_freq_sep = 0; //TODO dummy value - l++; - } - m++; - } + return NULL; +// uint32_t j, k, l, m; +// struct wifi_radio_element *radio = a->radios + radio_index; +// +// trace("%s -----> parsing radio %s\n", __func__, radio->name); +// +// memcpy(p->radio_id, radio->macaddr, 6); +// p->op_restricted_op_class_nr = 1; +// +// if (p->op_restricted_op_class_nr > 0) +// p->restricted_op_class = calloc(p->op_restricted_op_class_nr, +// sizeof(*p->restricted_op_class)); +// if (!p->restricted_op_class) { +// fprintf(stderr, "|%s:%d| out of memory!\n", __func__, __LINE__); +// p->op_restricted_op_class_nr = 0; +// return; +// } +// +// for (j = 0, m = 0; j < radio->num_supp_opclass; j++) { +// if (radio->supp_opclass[j].id != radio->current_opclass) +// continue; +// p->restricted_op_class[m].op_class = radio->current_opclass; +// p->restricted_op_class[m].channel_nr = (radio->supp_opclass[j].num_supported_channels) - 1; +// +// if (p->restricted_op_class[m].channel_nr > 0) +// p->restricted_op_class[m].restricted_channels = +// calloc(p->restricted_op_class[j].channel_nr, +// sizeof(*p->restricted_op_class[m].restricted_channels)); +// +// if (!p->restricted_op_class[m].restricted_channels) { +// fprintf(stderr, "|%s:%d| out of memory!\n", __func__, __LINE__); +// p->restricted_op_class[m].channel_nr = 0; +// return; +// } +// +// for (k = 0, l = 0; k < radio->supp_opclass[j].num_supported_channels; k++) { +// if (radio->supp_opclass[j].supp_chanlist[k].channel == radio->current_channel) +// continue; +// p->restricted_op_class[m].restricted_channels[l].channel = +// radio->supp_opclass[j].supp_chanlist[k].channel; +// p->restricted_op_class[m].restricted_channels[l].min_freq_sep = 0; //TODO dummy value +// l++; +// } +// m++; +// } } void agent_gen_cac_comp_report(struct agent *a, - struct tlv_cac_comp_report *p) + struct tlv_cac_complete_report *p) { - uint32_t j; - struct wifi_radio_element *radio = NULL; + return; +// uint32_t j; +// struct wifi_radio_element *radio = NULL; +// +// trace("%s -----> Inside\n", __func__); +// p->nbr_radios = a->num_radios; +// +// if (p->nbr_radios > 0) +// p->radio_data = calloc(p->nbr_radios, +// sizeof(*p->radio_data)); +// +// if (!p->radio_data) { +// fprintf(stderr, "|%s:%d| out of memory!\n", __func__, __LINE__); +// p->nbr_radios = 0; +// return; +// } +// +// for (j = 0; j < a->num_radios; j++) { +// radio = a->radios + j; +// memcpy(p->radio_data[j].radio_id, radio->macaddr, 6); +// +// p->radio_data[j].op_class = 0x01; //dummy value TODO +// p->radio_data[j].ch = 0x01; // dummy value TODO +// +// p->radio_data[j].completion_status = 0x05;// dummy value TODO +// p->radio_data[j].nbr_pairs = 0; //dummy value TODO +// } +} - trace("%s -----> Inside\n", __func__); - p->nbr_radios = a->num_radios; +struct tlv_error_code *agent_gen_tlv_error_code(struct agent *a, + struct cmdu_buff *cmdu, uint8_t *sta_mac, uint8_t reason_code) +{ + return NULL; +// struct tlv_error_code *p; +// +// p = (struct tlv_error_code *)calloc(1, +// sizeof(struct tlv_error_code)); +// +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_ERROR_CODE; +// p->reason_code = reason_code; +// memcpy(p->addr, sta_mac, 6); +// +// return p; +} - if (p->nbr_radios > 0) - p->radio_data = calloc(p->nbr_radios, - sizeof(*p->radio_data)); +int agent_gen_al_mac(struct agent *a, struct cmdu_buff *frm, uint8_t *hwaddr) +{ + struct tlv *t; + struct tlv_aladdr *data; - if (!p->radio_data) { - fprintf(stderr, "|%s:%d| out of memory!\n", __func__, __LINE__); - p->nbr_radios = 0; - return; - } + t = cmdu_reserve_tlv(frm, 256); + if (!t) + return -1; - for (j = 0; j < a->num_radios; j++) { - radio = a->radios + j; - memcpy(p->radio_data[j].radio_id, radio->macaddr, 6); + t->type = TLV_TYPE_AL_MAC_ADDRESS_TYPE; + t->len = 6; - p->radio_data[j].op_class = 0x01; //dummy value TODO - p->radio_data[j].ch = 0x01; // dummy value TODO + data = (struct tlv_aladdr *) t->data; + memcpy(data->macaddr, a->almac, 6); - p->radio_data[j].completion_status = 0x05;// dummy value TODO - p->radio_data[j].nbr_pairs = 0; //dummy value TODO + if (cmdu_put_tlv(frm, t)) { + dbg("%s: error: cmdu_put_tlv()\n", __func__); + return -1; } + + return 0; } -struct tlv_error_code *agent_gen_tlv_error_code(struct agent *a, - struct cmdu_cstruct *cmdu, uint8_t *sta_mac, uint8_t reason_code) + +int agent_gen_supported_service(struct agent *a, struct cmdu_buff *frm, uint8_t service) { - struct tlv_error_code *p; + struct tlv *t; + int ret; - p = (struct tlv_error_code *)calloc(1, - sizeof(struct tlv_error_code)); + t = cmdu_reserve_tlv(frm, 256); + if (!t) + return -1; - if (!p) - return NULL; + t->type = MAP_TLV_SUPPORTED_SERVICE; + t->len = 2; + t->data[0] = 0x1; + t->data[1] = service; - p->tlv_type = MAP_TLV_ERROR_CODE; - p->reason_code = reason_code; - memcpy(p->addr, sta_mac, 6); + ret = cmdu_put_tlv(frm, t); + if (ret) { + dbg("%s: error: cmdu_put_tlv()\n", __func__); + return -1; + } - return p; + return 0; } -struct tlv_al_mac *agent_gen_al_mac(struct agent *a, uint8_t *hwaddr) +int agent_gen_searched_service(struct agent *a, struct cmdu_buff *frm, uint8_t service) { - struct tlv_al_mac *p; + struct tlv *t; + int ret; - p = calloc(1, sizeof(struct tlv_al_mac)); - if (!p) - return NULL; + t = cmdu_reserve_tlv(frm, 256); + if (!t) + return -1; - p->tlv_type = TLV_TYPE_AL_MAC_ADDRESS_TYPE; - memcpy(p->al_mac_address, hwaddr, 6); + t->type = MAP_TLV_SEARCHED_SERVICE; + t->len = 2; + t->data[0] = 0x1; + t->data[1] = service; - return p; + ret = cmdu_put_tlv(frm, t); + if (ret) { + dbg("%s: error: cmdu_put_tlv()\n", __func__); + return -1; + } + + return 0; } -struct tlv_steer_btm_report *agent_gen_steer_btm_report(struct agent *a, - uint8_t *target_bssid, uint8_t *src_bssid, - uint8_t *sta, uint8_t status_code) +int agent_gen_map_profile(struct agent *a, struct cmdu_buff *frm, uint8_t profile) { - struct tlv_steer_btm_report *p; - - p = (struct tlv_steer_btm_report *)calloc(1, - sizeof(struct tlv_steer_btm_report)); + struct tlv *t; + struct tlv_map_profile *data; + int ret; - if (!p) - return NULL; + t = cmdu_reserve_tlv(frm, 256); + if (!t) + return -1; - p->tlv_type = MAP_TLV_STEERING_BTM_REPORT; - memcpy(p->bssid, src_bssid, 6); - p->status_code = status_code; + t->type = MAP_TLV_MULTIAP_PROFILE; + t->len = 1; + data = (struct tlv_map_profile *) t->data; + data->profile = profile; - if (p->status_code == 0x00) - memcpy(p->target_bssid, target_bssid, 6); + ret = cmdu_put_tlv(frm, t); + if (ret) { + dbg("%s: error: cmdu_put_tlv()\n", __func__); + return -1; + } - memcpy(p->sta_mac_addr, sta, 6); + return 0; +} - return p; +struct tlv_steer_btm_report *agent_gen_steer_btm_report(struct agent *a, + uint8_t *target_bssid, uint8_t *src_bssid, + uint8_t *sta, uint8_t status_code) +{ + return NULL; +// struct tlv_steer_btm_report *p; +// +// p = (struct tlv_steer_btm_report *)calloc(1, +// sizeof(struct tlv_steer_btm_report)); +// +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_STEERING_BTM_REPORT; +// memcpy(p->bssid, src_bssid, 6); +// p->status_code = status_code; +// +// if (p->status_code == 0x00) +// memcpy(p->target_bssid, target_bssid, 6); +// +// memcpy(p->sta_mac_addr, sta, 6); +// +// return p; } /** @@ -688,362 +944,389 @@ struct tlv_steer_btm_report *agent_gen_steer_btm_report(struct agent *a, * 0x01 5GHz * 0x02 60GHz */ -struct tlv_autoconf_freq_band *agent_gen_autoconf_freq_band(struct agent *a, +int agent_gen_autoconf_freq_band(struct agent *a, struct cmdu_buff *frm, uint8_t band) { - struct tlv_autoconf_freq_band *p; + struct tlv *t; + struct tlv_autoconfig_band *data; + int ret; - p = calloc(1, sizeof(struct tlv_autoconf_freq_band)); - if (!p) - return NULL; + t = cmdu_reserve_tlv(frm, 256); + if (!t) + return -1; - p->tlv_type = TLV_TYPE_AUTOCONFIG_FREQ_BAND; - p->freq_band = band; + t->type = TLV_TYPE_AUTOCONFIG_FREQ_BAND; + t->len = 1; + data = (struct tlv_autoconfig_band *) t->data; + data->band = band; - return p; + ret = cmdu_put_tlv(frm, t); + if (ret) { + dbg("%s: error: cmdu_put_tlv()\n", __func__); + return -1; + } + + return 0; } -/** - * role - - * 0x00 registrar - */ -struct tlv_searched_role *agent_gen_searched_role(struct agent *a, +int agent_gen_searched_role(struct agent *a, struct cmdu_buff *frm, uint8_t role) { - struct tlv_searched_role *p; - - p = calloc(1, sizeof(struct tlv_searched_role)); - if (!p) - return NULL; + struct tlv *t; + struct tlv_searched_role *data; + int ret; - p->tlv_type = TLV_TYPE_SEARCHED_ROLE; - p->role = role; + t = cmdu_reserve_tlv(frm, 256); + if (!t) + return -1; - return p; -} + t->type = TLV_TYPE_SEARCHED_ROLE; + t->len = 1; + data = (struct tlv_searched_role *) t->data; + data->role = role; + + ret = cmdu_put_tlv(frm, t); + if (ret) { + dbg("%s: error: cmdu_put_tlv()\n", __func__); + return -1; + } + + return 0; +} struct tlv_radio_metrics *agent_gen_radio_metrics(struct agent *a, int radio_index) { - struct tlv_radio_metrics *p; - struct wifi_radio_element *radio = a->radios + radio_index; - - p = (struct tlv_radio_metrics *)calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_RADIO_METRICS; - memcpy(p->radio_id, radio->macaddr, 6); - p->noise = rssi_to_rcpi(radio->anpi); - p->transmit = radio->tx_utilization; - p->receive_self = radio->rx_utilization; - p->receive_other = radio->other_utilization; - - return p; + return NULL; +// struct tlv_radio_metrics *p; +// struct wifi_radio_element *radio = a->radios + radio_index; +// +// p = (struct tlv_radio_metrics *)calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_RADIO_METRICS; +// memcpy(p->radio_id, radio->macaddr, 6); +// p->noise = rssi_to_rcpi(radio->anpi); +// p->transmit = radio->tx_utilization; +// p->receive_self = radio->rx_utilization; +// p->receive_other = radio->other_utilization; +// +// return p; } struct tlv_ap_metrics *agent_gen_ap_metrics(struct agent *a, int radio_index, int bss_index) { - struct tlv_ap_metrics *p; - struct wifi_radio_element *radio = a->radios + radio_index; - struct wifi_bss_element *bss = radio->bsslist + bss_index; - - p = (struct tlv_ap_metrics *)calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_AP_METRICS; - memcpy(p->bssid, bss->bssid, 6); - if (bss->is_ac_be) { - p->is_ac_be = bss->is_ac_be; - memcpy(p->service_param_info_be, bss->est_wmm_be, 3); - } - if (bss->is_ac_bk) { - p->is_ac_bk = bss->is_ac_bk; - memcpy(p->service_param_info_bk, bss->est_wmm_bk, 3); - } - if (bss->is_ac_vo) { - p->is_ac_vo = bss->is_ac_vo; - memcpy(p->service_param_info_vo, bss->est_wmm_vo, 3); - } - if (bss->is_ac_vi) { - p->is_ac_vi = bss->is_ac_vi; - memcpy(p->service_param_info_vi, bss->est_wmm_vi, 3); - } - - return p; + return NULL; +// struct tlv_ap_metrics *p; +// struct wifi_radio_element *radio = a->radios + radio_index; +// struct wifi_bss_element *bss = radio->bsslist + bss_index; +// +// p = (struct tlv_ap_metrics *)calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_AP_METRICS; +// memcpy(p->bssid, bss->bssid, 6); +// if (bss->is_ac_be) { +// p->is_ac_be = bss->is_ac_be; +// memcpy(p->service_param_info_be, bss->est_wmm_be, 3); +// } +// if (bss->is_ac_bk) { +// p->is_ac_bk = bss->is_ac_bk; +// memcpy(p->service_param_info_bk, bss->est_wmm_bk, 3); +// } +// if (bss->is_ac_vo) { +// p->is_ac_vo = bss->is_ac_vo; +// memcpy(p->service_param_info_vo, bss->est_wmm_vo, 3); +// } +// if (bss->is_ac_vi) { +// p->is_ac_vi = bss->is_ac_vi; +// memcpy(p->service_param_info_vi, bss->est_wmm_vi, 3); +// } +// +// return p; } struct tlv_ap_ext_metrics *agent_gen_ap_ext_metrics(struct agent *a, int radio_index, int bss_index) { - struct tlv_ap_ext_metrics *p; - struct wifi_radio_element *radio = a->radios + radio_index; - struct wifi_bss_element *bss = radio->bsslist + bss_index; - - p = (struct tlv_ap_ext_metrics *)calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_AP_EXTENDED_METRICS; - memcpy(p->bssid, bss->bssid, 6); - p->uni_bytes_sent = bss->tx_ucast_bytes; - p->uni_bytes_recv = bss->rx_ucast_bytes; - p->multi_bytes_sent = bss->tx_mcast_bytes; - p->multi_bytes_recv = bss->rx_mcast_bytes; - p->bro_bytes_sent = bss->tx_bcast_bytes; - p->bro_bytes_recv = bss->rx_bcast_bytes; - - return p; + return NULL; +// struct tlv_ap_ext_metrics *p; +// struct wifi_radio_element *radio = a->radios + radio_index; +// struct wifi_bss_element *bss = radio->bsslist + bss_index; +// +// p = (struct tlv_ap_ext_metrics *)calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_AP_EXTENDED_METRICS; +// memcpy(p->bssid, bss->bssid, 6); +// p->uni_bytes_sent = bss->tx_ucast_bytes; +// p->uni_bytes_recv = bss->rx_ucast_bytes; +// p->multi_bytes_sent = bss->tx_mcast_bytes; +// p->multi_bytes_recv = bss->rx_mcast_bytes; +// p->bro_bytes_sent = bss->tx_bcast_bytes; +// p->bro_bytes_recv = bss->rx_bcast_bytes; +// +// return p; } struct tlv_assoc_sta_traffic_stats *agent_gen_assoc_sta_traffic_stats( struct agent *a, struct sta *s) { - struct tlv_assoc_sta_traffic_stats *p; - - p = (struct tlv_assoc_sta_traffic_stats *)calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_ASSOCIATED_STA_TRAFFIC_STATS; - memcpy(p->addr, s->macaddr, 6); - p->bytes_sent = s->tx_bytes; - p->bytes_received = s->rx_bytes; - p->packets_sent = s->tx_pkts; - p->packets_received = s->rx_pkts; - p->tx_packets_err = s->tx_fail_pkts; - p->rx_packets_err = s->rx_fail_pkts; - - return p; + return NULL; +// struct tlv_assoc_sta_traffic_stats *p; +// +// p = (struct tlv_assoc_sta_traffic_stats *)calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_ASSOCIATED_STA_TRAFFIC_STATS; +// memcpy(p->addr, s->macaddr, 6); +// p->bytes_sent = s->tx_bytes; +// p->bytes_received = s->rx_bytes; +// p->packets_sent = s->tx_pkts; +// p->packets_received = s->rx_pkts; +// p->tx_packets_err = s->tx_fail_pkts; +// p->rx_packets_err = s->rx_fail_pkts; +// +// return p; } struct tlv_assoc_sta_link_metrics *agent_gen_assoc_sta_link_metrics( struct agent *a, struct sta *s, uint8_t *bssid) { - int i; - struct tlv_assoc_sta_link_metrics *p; - - p = (struct tlv_assoc_sta_link_metrics *)calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_ASSOCIATED_STA_LINK_METRICS; - memcpy(p->addr, s->macaddr, 6); - /* Reported BSS for specific STA */ - p->bssid_nr = 1; - p->sta_link_metrics_bssid = calloc(p->bssid_nr, sizeof(*p->sta_link_metrics_bssid)); - if (p->sta_link_metrics_bssid) { - for (i = 0; i < p->bssid_nr; i++) { - memcpy(p->sta_link_metrics_bssid[i].bssid, bssid, 6); - p->sta_link_metrics_bssid[i].time_delta = s->connected_ms; - p->sta_link_metrics_bssid[i].dl_mac_data_rate = s->rx_thput; - p->sta_link_metrics_bssid[i].ul_mac_data_rate = s->tx_thput; - p->sta_link_metrics_bssid[i].ul_rcpi = s->rssi[0]; - } - } - - return p; + return NULL; +// int i; +// struct tlv_assoc_sta_link_metrics *p; +// +// p = (struct tlv_assoc_sta_link_metrics *)calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_ASSOCIATED_STA_LINK_METRICS; +// memcpy(p->addr, s->macaddr, 6); +// /* Reported BSS for specific STA */ +// p->bssid_nr = 1; +// p->sta_link_metrics_bssid = calloc(p->bssid_nr, sizeof(*p->sta_link_metrics_bssid)); +// if (p->sta_link_metrics_bssid) { +// for (i = 0; i < p->bssid_nr; i++) { +// memcpy(p->sta_link_metrics_bssid[i].bssid, bssid, 6); +// p->sta_link_metrics_bssid[i].time_delta = s->connected_ms; +// p->sta_link_metrics_bssid[i].dl_mac_data_rate = s->rx_thput; +// p->sta_link_metrics_bssid[i].ul_mac_data_rate = s->tx_thput; +// p->sta_link_metrics_bssid[i].ul_rcpi = s->rssi[0]; +// } +// } +// +// return p; } struct tlv_assoc_sta_ext_link_metric *agent_gen_assoc_sta_ext_link_metric( struct agent *a, struct sta *s, uint8_t *bssid) { - int i; - struct tlv_assoc_sta_ext_link_metric *p; - - p = (struct tlv_assoc_sta_ext_link_metric *)calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_ASSOCIATED_STA_EXT_LINK_METRICS; - memcpy(p->mac, s->macaddr, 6); - /* Reported BSS for specific STA */ - p->nbr_bssid = 1; - p->data = calloc(p->nbr_bssid, sizeof(*p->data)); - if (p->data) { - for (i = 0; i < p->nbr_bssid; i++) { - memcpy(p->data[i].bssid, bssid, 6); - p->data[i].last_data_dwn_rate = s->rx_rate; - p->data[i].last_data_up_rate = s->tx_rate; - p->data[i].uti_recv = s->rx_airtime; - p->data[i].uti_transmit = s->tx_airtime; - } - } - - return p; + return NULL; +// int i; +// struct tlv_assoc_sta_ext_link_metric *p; +// +// p = (struct tlv_assoc_sta_ext_link_metric *)calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_ASSOCIATED_STA_EXT_LINK_METRICS; +// memcpy(p->mac, s->macaddr, 6); +// /* Reported BSS for specific STA */ +// p->nbr_bssid = 1; +// p->data = calloc(p->nbr_bssid, sizeof(*p->data)); +// if (p->data) { +// for (i = 0; i < p->nbr_bssid; i++) { +// memcpy(p->data[i].bssid, bssid, 6); +// p->data[i].last_data_dwn_rate = s->rx_rate; +// p->data[i].last_data_up_rate = s->tx_rate; +// p->data[i].uti_recv = s->rx_airtime; +// p->data[i].uti_transmit = s->tx_airtime; +// } +// } +// +// return p; } struct tlv_ap_radio_identifier *agent_gen_ap_radio_identifier( struct agent *a, uint8_t *radio_id) { - struct tlv_ap_radio_identifier *p; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_AP_RADIO_IDENTIFIER; - memcpy(p->radio_id, radio_id, 6); - - return p; + return NULL; +// struct tlv_ap_radio_identifier *p; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_AP_RADIO_IDENTIFIER; +// memcpy(p->radio_id, radio_id, 6); +// +// return p; } struct tlv_source_info *agent_gen_source_info( struct agent *a, uint8_t *mac) { - struct tlv_source_info *p; - - if (!mac) - return NULL; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_SOURCE_INFO; - memcpy(p->mac, mac, 6); - return p; + return NULL; +// struct tlv_source_info *p; +// +// if (!mac) +// return NULL; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_SOURCE_INFO; +// memcpy(p->mac, mac, 6); +// return p; } struct tlv_tunnel_msg_type *agent_gen_tunnel_msg_type( struct agent *a, uint8_t protocol) { - struct tlv_tunnel_msg_type *p; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_TUNNELED_MSG_TYPE; - p->tunnel_protocol_type = protocol; - return p; + return NULL; +// struct tlv_tunnel_msg_type *p; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_TUNNELED_MSG_TYPE; +// p->tunnel_protocol_type = protocol; +// return p; } struct tlv_tunneled *agent_gen_tunneled(struct agent *a, int frame_len, uint8_t *frame_body) { - struct tlv_tunneled *p; - - if ((!frame_body) || (frame_len <= 0)) - return NULL; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_TUNNELED; - p->tlv_len = frame_len; - p->frame_body = calloc(frame_len, sizeof(uint8_t)); - if (!p->frame_body) { - free(p); - return NULL; - } - - memcpy(p->frame_body, frame_body, frame_len); - return p; + return NULL; +// struct tlv_tunneled *p; +// +// if ((!frame_body) || (frame_len <= 0)) +// return NULL; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_TUNNELED; +// p->tlv_len = frame_len; +// p->frame_body = calloc(frame_len, sizeof(uint8_t)); +// if (!p->frame_body) { +// free(p); +// return NULL; +// } +// +// memcpy(p->frame_body, frame_body, frame_len); +// return p; } int fill_steering_policy_from_tlv(struct agent *a, struct tlv_steering_policy *p, struct uci_context *ctx, struct uci_package *pkg) { - int ret, i; - struct uci_element *e; - struct uci_ptr ptr; - char buf[64] = {0}; - - for (i = 0; i < p->control_policy_radio_nr; i++) { - int j, k; - int radio_index; - struct wifi_radio_element *radio; - int ifs_index = -1; - - radio_index = get_radio_index(a, p->control_policy[i].radio_id); - if (radio_index == -1) - continue; - - radio = a->radios + radio_index; - for (j = 0; j < WIFI_DEVICE_MAX_NUM; j++) { - if (!strcmp(a->ifs[j].radio, radio->name)) { - ifs_index = j; - break; - } - } - - if (ifs_index == -1) - continue; - - /* add the configuration in each iface section for specific radio */ - for (k = 0; k < WIFI_DEVICE_MAX_NUM; k++) { - uci_foreach_element(&pkg->sections, e) { - char iface_name[16] = {0}; - struct uci_section *s = uci_to_section(e); - struct uci_element *e1; - - if (strcmp(s->type, "fh-iface")) - continue; - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%s.%s.ifname", - pkg->e.name, s->e.name); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ptr.value && (ret != UCI_OK)) { - fprintf(stderr, "value not found\n"); - continue; - } - - e1 = ptr.last; - if (e1->type == UCI_TYPE_OPTION) - strncpy(iface_name, ptr.o->v.string, 15); - - if (strcmp(iface_name, a->ifs[ifs_index].iface[k].name)) - continue; - - /* Add the policy config params */ - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.policy=%d", - pkg->e.name, s->e.name, - p->control_policy[i].steering_policy); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.util_threshold=%d", - pkg->e.name, s->e.name, - p->control_policy[i].channel_utilization_thres); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.rcpi_threshold=%d", - pkg->e.name, s->e.name, - p->control_policy[i].rcpi_steering_thres); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - break; - } - } - } - return 0; +// int ret, i; +// struct uci_element *e; +// struct uci_ptr ptr; +// char buf[64] = {0}; +// +// for (i = 0; i < p->control_policy_radio_nr; i++) { +// int j, k; +// int radio_index; +// struct wifi_radio_element *radio; +// int ifs_index = -1; +// +// radio_index = get_radio_index(a, p->control_policy[i].radio_id); +// if (radio_index == -1) +// continue; +// +// radio = a->radios + radio_index; +// for (j = 0; j < WIFI_DEVICE_MAX_NUM; j++) { +// if (!strcmp(a->ifs[j].radio, radio->name)) { +// ifs_index = j; +// break; +// } +// } +// +// if (ifs_index == -1) +// continue; +// +// /* add the configuration in each iface section for specific radio */ +// for (k = 0; k < WIFI_DEVICE_MAX_NUM; k++) { +// uci_foreach_element(&pkg->sections, e) { +// char iface_name[16] = {0}; +// struct uci_section *s = uci_to_section(e); +// struct uci_element *e1; +// +// if (strcmp(s->type, "fh-iface")) +// continue; +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, "%s.%s.ifname", +// pkg->e.name, s->e.name); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ptr.value && (ret != UCI_OK)) { +// fprintf(stderr, "value not found\n"); +// continue; +// } +// +// e1 = ptr.last; +// if (e1->type == UCI_TYPE_OPTION) +// strncpy(iface_name, ptr.o->v.string, 15); +// +// if (strcmp(iface_name, a->ifs[ifs_index].iface[k].name)) +// continue; +// +// /* Add the policy config params */ +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.policy=%d", +// pkg->e.name, s->e.name, +// p->control_policy[i].steering_policy); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.util_threshold=%d", +// pkg->e.name, s->e.name, +// p->control_policy[i].channel_utilization_thres); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.rcpi_threshold=%d", +// pkg->e.name, s->e.name, +// p->control_policy[i].rcpi_steering_thres); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// break; +// } +// } +// } +// +// return 0; } /* for tlv_steering_policy: @@ -1054,302 +1337,305 @@ int fill_steering_policy_all(struct agent *a, struct tlv_steering_policy *p, struct uci_context *ctx, struct uci_package *pkg) { - int ret, i; - struct uci_element *e; - struct uci_ptr ptr; - char buf[64] = {0}; - - /* add the configuration in each iface section */ - i = 0; - uci_foreach_element(&pkg->sections, e) { - struct uci_section *s = uci_to_section(e); - - if (strcmp(s->type, "fh-iface")) - continue; - - /* Add the policy config params */ - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.policy=%d", - pkg->e.name, s->e.name, - p->control_policy[i].steering_policy); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.util_threshold=%d", - pkg->e.name, s->e.name, - p->control_policy[i].channel_utilization_thres); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.rcpi_threshold=%d", - pkg->e.name, s->e.name, - p->control_policy[i].rcpi_steering_thres); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - } - return 0; +// int ret, i; +// struct uci_element *e; +// struct uci_ptr ptr; +// char buf[64] = {0}; +// +// /* add the configuration in each iface section */ +// i = 0; +// uci_foreach_element(&pkg->sections, e) { +// struct uci_section *s = uci_to_section(e); +// +// if (strcmp(s->type, "fh-iface")) +// continue; +// +// /* Add the policy config params */ +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.policy=%d", +// pkg->e.name, s->e.name, +// p->control_policy[i].steering_policy); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.util_threshold=%d", +// pkg->e.name, s->e.name, +// p->control_policy[i].channel_utilization_thres); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.rcpi_threshold=%d", +// pkg->e.name, s->e.name, +// p->control_policy[i].rcpi_steering_thres); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// } +// +// return 0; } int agent_fill_steering_policy(struct agent *a, struct tlv_steering_policy *p, struct uci_context *ctx, struct uci_package *pkg) { - int ret, i; - struct uci_element *e; - struct uci_ptr ptr; - char buf[64] = {0}; - char addr[18] = {0}; - uint8_t generic_id[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - /* Add exclude list & btm exclude list in 'agent' section */ - uci_foreach_element(&pkg->sections, e) { - struct uci_section *s = uci_to_section(e); - - if (strcmp(s->type, "agent")) - continue; - - for (i = 0; i < p->local_disallowed_sta_nr; i++) { - bool is_entry = false; - struct uci_element *e1; - struct uci_option *o; - - memset(addr, 0, sizeof(addr)); - hwaddr_ntoa(p->local_disallowed_sta_macs[i].addr, addr); - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.%s", pkg->e.name, - s->e.name, "steer_exclude"); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - o = ptr.o; - if ((ptr.flags & UCI_LOOKUP_COMPLETE) && - (o->type == UCI_TYPE_LIST)) { - uci_foreach_element(&o->v.list, e1) { - if (!strncmp(e1->name, addr, sizeof(addr) - 1)) { - is_entry = true; - break; - } - } - } - - /* skip, entry already available */ - if (is_entry) - continue; - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.steer_exclude=%s", - pkg->e.name, s->e.name, addr); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_add_list(ctx, &ptr); - uci_save(ctx, ptr.p); - } - - for (i = 0; i < p->btm_disallowed_sta_nr; i++) { - bool is_entry = false; - struct uci_element *e1; - struct uci_option *o; - - memset(addr, 0, sizeof(addr)); - hwaddr_ntoa(p->btm_disallowed_sta_macs[i].addr, addr); - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.%s", pkg->e.name, - s->e.name, "steer_exclude_btm"); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - o = ptr.o; - if ((ptr.flags & UCI_LOOKUP_COMPLETE) && - (o->type == UCI_TYPE_LIST)) { - uci_foreach_element(&o->v.list, e1) { - if (!strncmp(e1->name, addr, sizeof(addr) - 1)) { - is_entry = true; - break; - } - } - } - - /* skip, entry already available */ - if (is_entry) - continue; - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.steer_exclude_btm=%s", - pkg->e.name, s->e.name, addr); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_add_list(ctx, &ptr); - uci_save(ctx, ptr.p); - } - - break; - } - - if ((p->control_policy_radio_nr == 1) && - !memcmp(p->control_policy[0].radio_id, generic_id, 6)) { - fill_steering_policy_all(a, p, ctx, pkg); - } else - fill_steering_policy_from_tlv(a, p, ctx, pkg); - return 0; +// int ret, i; +// struct uci_element *e; +// struct uci_ptr ptr; +// char buf[64] = {0}; +// char addr[18] = {0}; +// uint8_t generic_id[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; +// +// /* Add exclude list & btm exclude list in 'agent' section */ +// uci_foreach_element(&pkg->sections, e) { +// struct uci_section *s = uci_to_section(e); +// +// if (strcmp(s->type, "agent")) +// continue; +// +// for (i = 0; i < p->local_disallowed_sta_nr; i++) { +// bool is_entry = false; +// struct uci_element *e1; +// struct uci_option *o; +// +// memset(addr, 0, sizeof(addr)); +// hwaddr_ntoa(p->local_disallowed_sta_macs[i].addr, addr); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.%s", pkg->e.name, +// s->e.name, "steer_exclude"); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// o = ptr.o; +// if ((ptr.flags & UCI_LOOKUP_COMPLETE) && +// (o->type == UCI_TYPE_LIST)) { +// uci_foreach_element(&o->v.list, e1) { +// if (!strncmp(e1->name, addr, sizeof(addr) - 1)) { +// is_entry = true; +// break; +// } +// } +// } +// +// /* skip, entry already available */ +// if (is_entry) +// continue; +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.steer_exclude=%s", +// pkg->e.name, s->e.name, addr); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_add_list(ctx, &ptr); +// uci_save(ctx, ptr.p); +// } +// +// for (i = 0; i < p->btm_disallowed_sta_nr; i++) { +// bool is_entry = false; +// struct uci_element *e1; +// struct uci_option *o; +// +// memset(addr, 0, sizeof(addr)); +// hwaddr_ntoa(p->btm_disallowed_sta_macs[i].addr, addr); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.%s", pkg->e.name, +// s->e.name, "steer_exclude_btm"); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// o = ptr.o; +// if ((ptr.flags & UCI_LOOKUP_COMPLETE) && +// (o->type == UCI_TYPE_LIST)) { +// uci_foreach_element(&o->v.list, e1) { +// if (!strncmp(e1->name, addr, sizeof(addr) - 1)) { +// is_entry = true; +// break; +// } +// } +// } +// +// /* skip, entry already available */ +// if (is_entry) +// continue; +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.steer_exclude_btm=%s", +// pkg->e.name, s->e.name, addr); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_add_list(ctx, &ptr); +// uci_save(ctx, ptr.p); +// } +// +// break; +// } +// +// if ((p->control_policy_radio_nr == 1) && +// !memcmp(p->control_policy[0].radio_id, generic_id, 6)) { +// fill_steering_policy_all(a, p, ctx, pkg); +// } else +// fill_steering_policy_from_tlv(a, p, ctx, pkg); +// +// return 0; } int fill_metric_report_policy_from_tlv(struct agent *a, struct tlv_metric_report_policy *p, struct uci_context *ctx, struct uci_package *pkg) { - int ret, i; - struct uci_element *e; - struct uci_ptr ptr; - char buf[64] = {0}; - - /* Add radio specific params in fh-iface section */ - for (i = 0; i < p->metric_reporting_policy_radio_nr; i++) { - int j, k; - int ifs_index = -1; - int radio_index; - struct wifi_radio_element *radio; - - radio_index = get_radio_index(a, - p->metric_reporting_policy[i].radio_id); - if (radio_index == -1) - continue; - - radio = a->radios + radio_index; - for (j = 0; j < WIFI_DEVICE_MAX_NUM; j++) { - if (!strcmp(a->ifs[j].radio, radio->name)) { - ifs_index = j; - break; - } - } - - if (ifs_index == -1) - continue; - - /* add configuration in each iface section for specific radio */ - for (k = 0; k < WIFI_DEVICE_MAX_NUM; k++) { - uci_foreach_element(&pkg->sections, e) { - char iface_name[16] = {0}; - struct uci_section *s = uci_to_section(e); - struct uci_element *e1; - - if (strcmp(s->type, "fh-iface")) - continue; - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%s.%s.ifname", - pkg->e.name, s->e.name); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ptr.value && (ret != UCI_OK)) { - fprintf(stderr, "value not found\n"); - continue; - } - - e1 = ptr.last; - if (e1->type == UCI_TYPE_OPTION) - strncpy(iface_name, ptr.o->v.string, 15); - - if (strcmp(iface_name, a->ifs[ifs_index].iface[k].name)) - continue; - - /* Add the policy config params */ - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.report_rcpi_threshold=%d", - pkg->e.name, s->e.name, - p->metric_reporting_policy[i].rcpi_thres); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.rcpi_hysteresis_margin=%d", - pkg->e.name, s->e.name, - p->metric_reporting_policy[i].rcpi_hysteresis_margin); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.report_util_threshold=%d", - pkg->e.name, s->e.name, - p->metric_reporting_policy[i].channel_utilization_thres); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.include_sta_stats=%d", - pkg->e.name, s->e.name, - p->metric_reporting_policy[i].is_assoc_sta_traffic_stats); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.include_sta_metric=%d", - pkg->e.name, s->e.name, - p->metric_reporting_policy[i].is_assoc_sta_link_metrics); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - break; - } - } - - } - return 0; +// int ret, i; +// struct uci_element *e; +// struct uci_ptr ptr; +// char buf[64] = {0}; +// +// /* Add radio specific params in fh-iface section */ +// for (i = 0; i < p->metric_reporting_policy_radio_nr; i++) { +// int j, k; +// int ifs_index = -1; +// int radio_index; +// struct wifi_radio_element *radio; +// +// radio_index = get_radio_index(a, +// p->metric_reporting_policy[i].radio_id); +// if (radio_index == -1) +// continue; +// +// radio = a->radios + radio_index; +// for (j = 0; j < WIFI_DEVICE_MAX_NUM; j++) { +// if (!strcmp(a->ifs[j].radio, radio->name)) { +// ifs_index = j; +// break; +// } +// } +// +// if (ifs_index == -1) +// continue; +// +// /* add configuration in each iface section for specific radio */ +// for (k = 0; k < WIFI_DEVICE_MAX_NUM; k++) { +// uci_foreach_element(&pkg->sections, e) { +// char iface_name[16] = {0}; +// struct uci_section *s = uci_to_section(e); +// struct uci_element *e1; +// +// if (strcmp(s->type, "fh-iface")) +// continue; +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, "%s.%s.ifname", +// pkg->e.name, s->e.name); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ptr.value && (ret != UCI_OK)) { +// fprintf(stderr, "value not found\n"); +// continue; +// } +// +// e1 = ptr.last; +// if (e1->type == UCI_TYPE_OPTION) +// strncpy(iface_name, ptr.o->v.string, 15); +// +// if (strcmp(iface_name, a->ifs[ifs_index].iface[k].name)) +// continue; +// +// /* Add the policy config params */ +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.report_rcpi_threshold=%d", +// pkg->e.name, s->e.name, +// p->metric_reporting_policy[i].rcpi_thres); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.rcpi_hysteresis_margin=%d", +// pkg->e.name, s->e.name, +// p->metric_reporting_policy[i].rcpi_hysteresis_margin); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.report_util_threshold=%d", +// pkg->e.name, s->e.name, +// p->metric_reporting_policy[i].channel_utilization_thres); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.include_sta_stats=%d", +// pkg->e.name, s->e.name, +// p->metric_reporting_policy[i].is_assoc_sta_traffic_stats); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.include_sta_metric=%d", +// pkg->e.name, s->e.name, +// p->metric_reporting_policy[i].is_assoc_sta_link_metrics); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// break; +// } +// } +// +// } +// +// return 0; } /* for metric_reporting_policy_tlv: @@ -1428,314 +1714,42 @@ int fill_metric_report_policy_all(struct agent *a, pkg->e.name, s->e.name, p->metric_reporting_policy[i].is_assoc_sta_link_metrics); ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - } - - return 0; -} - - -int agent_fill_metric_report_policy(struct agent *a, - struct tlv_metric_report_policy *p, struct uci_context *ctx, - struct uci_package *pkg) -{ - int ret; - struct uci_element *e; - struct uci_ptr ptr; - char buf[64] = {0}; - bool is_section_found = false; - struct uci_section *s; - uint8_t generic_id[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - uci_foreach_element(&pkg->sections, e) { - s = uci_to_section(e); - - if (!strcmp(s->type, "policy")) { - is_section_found = true; - break; - } - } - - if (!is_section_found) { - /* add a new section 'policy' */ - ret = uci_add_section(ctx, pkg, "policy", &s); - if (ret != UCI_OK) - return -1; - - uci_save(ctx, pkg); - } - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.report_interval=%d", - pkg->e.name, s->e.name, p->interval); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - if ((p->metric_reporting_policy_radio_nr == 1) && - !memcmp(p->metric_reporting_policy[0].radio_id, generic_id, 6)) { - fill_metric_report_policy_all(a, p, ctx, pkg); - } else - fill_metric_report_policy_from_tlv(a, p, ctx, pkg); - - return 0; -} - -int agent_fill_8021q_setting(struct agent *a, - struct tlv_default_8021q_settings *p, struct uci_context *ctx, - struct uci_package *pkg) -{ - int ret; - struct uci_element *e; - struct uci_ptr ptr; - char buf[64] = {0}; - struct uci_section *s; - bool is_section_found = false; - - uci_foreach_element(&pkg->sections, e) { - s = uci_to_section(e); - - if (!strcmp(s->type, "policy")) { - is_section_found = true; - break; - } - } - - if (!is_section_found) { - /* add a new section 'policy' */ - ret = uci_add_section(ctx, pkg, "policy", &s); - if (ret != UCI_OK) - return -1; - - uci_save(ctx, pkg); - } - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%s.%s.pvid=%d", - pkg->e.name, s->e.name, - p->primary_vid); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%s.%s.pcp_default=%d", - pkg->e.name, s->e.name, p->pcp); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - return 0; -} - -int agent_fill_traffic_sep_policy(struct agent *a, - struct tlv_traffic_sep_policy *p, struct uci_context *ctx, - struct uci_package *pkg) -{ - int ret, i; - struct uci_element *e; - struct uci_ptr ptr; - char buf[64]; - - for (i = 0; i < p->nbr_ssid; i++) { - uci_foreach_element(&pkg->sections, e) { - struct uci_element *e1; - struct uci_section *s = uci_to_section(e); - char section_ssid[32] = {0}; - - if (strcmp(s->type, "fh-iface") && - strcmp(s->type, "bk-iface")) - continue; - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%s.%s.ssid", - pkg->e.name, s->e.name); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - - e1 = ptr.last; - if (e1->type == UCI_TYPE_OPTION) - strncpy(section_ssid, ptr.o->v.string, 31); - - if (strcmp(section_ssid, p->data[i].ssid)) - continue; - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%s.%s.vid=%d", - pkg->e.name, s->e.name, - p->data[i].vid); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - break; - } - } - - return 0; -} - -int agent_fill_ch_scan_rep_policy(struct agent *a, - struct tlv_ch_scan_rep_policy *p, struct uci_context *ctx, - struct uci_package *pkg) -{ - int ret; - struct uci_element *e; - struct uci_ptr ptr; - char buf[64] = {0}; - bool is_section_found = false; - struct uci_section *s; - - uci_foreach_element(&pkg->sections, e) { - s = uci_to_section(e); - - if (!strcmp(s->type, "policy")) { - is_section_found = true; - break; - } - } - - if (!is_section_found) { - /* add a new section 'policy' */ - ret = uci_add_section(ctx, pkg, "policy", &s); - if (ret != UCI_OK) - return -1; - - uci_save(ctx, pkg); - } - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%s.%s.report_scan=%d", - pkg->e.name, s->e.name, - p->ch_scans); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); - - return 0; -} - -int agent_fill_unsuccess_assoc_policy(struct agent *a, - struct tlv_unsuccess_assoc_policy *p, struct uci_context *ctx, - struct uci_package *pkg) -{ - int ret; - struct uci_element *e; - struct uci_ptr ptr; - char buf[64] = {0}; - bool is_section_found = false; - struct uci_section *s; - - uci_foreach_element(&pkg->sections, e) { - s = uci_to_section(e); - - if (!strcmp(s->type, "policy")) { - is_section_found = true; - break; - } - } - - if (!is_section_found) { - /* add a new section 'policy' */ - ret = uci_add_section(ctx, pkg, "policy", &s); - if (ret != UCI_OK) - return -1; - - uci_save(ctx, pkg); - } - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.report_sta_assocfails=%d", - pkg->e.name, s->e.name, p->report); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; - - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); + if (ret != UCI_OK) + return -1; - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.report_sta_assocfails_rate=%d", - pkg->e.name, s->e.name, - p->max_reporting_rate); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; + uci_set(ctx, &ptr); + uci_save(ctx, ptr.p); - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); + } return 0; } -int agent_fill_backhaul_bss_config(struct agent *a, - struct tlv_backhaul_bss_config *p, struct uci_context *ctx, + +int agent_fill_metric_report_policy(struct agent *a, + struct tlv_metric_report_policy *p, struct uci_context *ctx, struct uci_package *pkg) { - struct netif_fh *fh; + int ret; struct uci_element *e; struct uci_ptr ptr; - int ret; - bool is_bksec_found = false; - struct uci_section *s; char buf[64] = {0}; - - fh = wifi_get_netif_by_bssid(a, p->bssid); - if (fh == NULL) - return -1; + bool is_section_found = false; + struct uci_section *s; + uint8_t generic_id[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; uci_foreach_element(&pkg->sections, e) { - struct uci_element *e1; - char section_ifname[16] = {0}; - s = uci_to_section(e); - if (strcmp(s->type, "bk-iface")) - continue; - - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%s.%s.ifname", - pkg->e.name, s->e.name); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ptr.value && (ret != UCI_OK)) - return -1; - - e1 = ptr.last; - if (e1->type == UCI_TYPE_OPTION) - strncpy(section_ifname, ptr.o->v.string, 15); - if (!strcmp(section_ifname, fh->name)) { - is_bksec_found = true; + if (!strcmp(s->type, "policy")) { + is_section_found = true; break; } } - if (!is_bksec_found) { - /* Add a new 'bk-iface section' */ - ret = uci_add_section(ctx, pkg, "bk-iface", &s); + if (!is_section_found) { + /* add a new section 'policy' */ + ret = uci_add_section(ctx, pkg, "policy", &s); if (ret != UCI_OK) return -1; @@ -1743,8 +1757,9 @@ int agent_fill_backhaul_bss_config(struct agent *a, } memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, "%s.%s.ifname=%s", - pkg->e.name, s->e.name, fh->name); + snprintf(buf, sizeof(buf) - 1, + "%s.%s.report_interval=%d", + pkg->e.name, s->e.name, p->interval); ret = uci_lookup_ptr(ctx, &ptr, buf, true); if (ret != UCI_OK) return -1; @@ -1752,29 +1767,305 @@ int agent_fill_backhaul_bss_config(struct agent *a, uci_set(ctx, &ptr); uci_save(ctx, ptr.p); - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.disallow_bsta_p1=%d", - pkg->e.name, s->e.name, p->p1); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; + if ((p->metric_reporting_policy_radio_nr == 1) && + !memcmp(p->metric_reporting_policy[0].radio_id, generic_id, 6)) { + fill_metric_report_policy_all(a, p, ctx, pkg); + } else + fill_metric_report_policy_from_tlv(a, p, ctx, pkg); - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); + return 0; +} - memset(buf, 0, sizeof(buf)); - snprintf(buf, sizeof(buf) - 1, - "%s.%s.disallow_bsta_p2=%d", - pkg->e.name, s->e.name, p->p2); - ret = uci_lookup_ptr(ctx, &ptr, buf, true); - if (ret != UCI_OK) - return -1; +int agent_fill_8021q_setting(struct agent *a, + struct tlv_default_8021q_settings *p, struct uci_context *ctx, + struct uci_package *pkg) +{ + return 0; +// int ret; +// struct uci_element *e; +// struct uci_ptr ptr; +// char buf[64] = {0}; +// struct uci_section *s; +// bool is_section_found = false; +// +// uci_foreach_element(&pkg->sections, e) { +// s = uci_to_section(e); +// +// if (!strcmp(s->type, "policy")) { +// is_section_found = true; +// break; +// } +// } +// +// if (!is_section_found) { +// /* add a new section 'policy' */ +// ret = uci_add_section(ctx, pkg, "policy", &s); +// if (ret != UCI_OK) +// return -1; +// +// uci_save(ctx, pkg); +// } +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, "%s.%s.pvid=%d", +// pkg->e.name, s->e.name, +// p->primary_vid); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, "%s.%s.pcp_default=%d", +// pkg->e.name, s->e.name, p->pcp); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// return 0; +} - uci_set(ctx, &ptr); - uci_save(ctx, ptr.p); +int agent_fill_traffic_sep_policy(struct agent *a, + struct tlv_traffic_sep_policy *p, struct uci_context *ctx, + struct uci_package *pkg) +{ + return 0; +// int ret, i; +// struct uci_element *e; +// struct uci_ptr ptr; +// char buf[64]; +// +// for (i = 0; i < p->nbr_ssid; i++) { +// uci_foreach_element(&pkg->sections, e) { +// struct uci_element *e1; +// struct uci_section *s = uci_to_section(e); +// char section_ssid[32] = {0}; +// +// if (strcmp(s->type, "fh-iface") && +// strcmp(s->type, "bk-iface")) +// continue; +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, "%s.%s.ssid", +// pkg->e.name, s->e.name); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// +// e1 = ptr.last; +// if (e1->type == UCI_TYPE_OPTION) +// strncpy(section_ssid, ptr.o->v.string, 31); +// +// if (strcmp(section_ssid, p->data[i].ssid)) +// continue; +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, "%s.%s.vid=%d", +// pkg->e.name, s->e.name, +// p->data[i].vid); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// break; +// } +// } +// +// return 0; +} + +int agent_fill_ch_scan_rep_policy(struct agent *a, + struct tlv_channel_scan_report_policy *p, struct uci_context *ctx, + struct uci_package *pkg) +{ + return 0; +// int ret; +// struct uci_element *e; +// struct uci_ptr ptr; +// char buf[64] = {0}; +// bool is_section_found = false; +// struct uci_section *s; +// +// uci_foreach_element(&pkg->sections, e) { +// s = uci_to_section(e); +// +// if (!strcmp(s->type, "policy")) { +// is_section_found = true; +// break; +// } +// } +// +// if (!is_section_found) { +// /* add a new section 'policy' */ +// ret = uci_add_section(ctx, pkg, "policy", &s); +// if (ret != UCI_OK) +// return -1; +// +// uci_save(ctx, pkg); +// } +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, "%s.%s.report_scan=%d", +// pkg->e.name, s->e.name, +// p->ch_scans); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// return 0; +} + +int agent_fill_unsuccess_assoc_policy(struct agent *a, + struct tlv_unsuccess_assoc_policy *p, struct uci_context *ctx, + struct uci_package *pkg) +{ + return 0; +// int ret; +// struct uci_element *e; +// struct uci_ptr ptr; +// char buf[64] = {0}; +// bool is_section_found = false; +// struct uci_section *s; +// +// uci_foreach_element(&pkg->sections, e) { +// s = uci_to_section(e); +// +// if (!strcmp(s->type, "policy")) { +// is_section_found = true; +// break; +// } +// } +// +// if (!is_section_found) { +// /* add a new section 'policy' */ +// ret = uci_add_section(ctx, pkg, "policy", &s); +// if (ret != UCI_OK) +// return -1; +// +// uci_save(ctx, pkg); +// } +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.report_sta_assocfails=%d", +// pkg->e.name, s->e.name, p->report); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.report_sta_assocfails_rate=%d", +// pkg->e.name, s->e.name, +// p->max_reporting_rate); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// return 0; +} +int agent_fill_backhaul_bss_config(struct agent *a, + struct tlv_bbss_config *p, struct uci_context *ctx, + struct uci_package *pkg) +{ return 0; +// struct netif_fh *fh; +// struct uci_element *e; +// struct uci_ptr ptr; +// int ret; +// bool is_bksec_found = false; +// struct uci_section *s; +// char buf[64] = {0}; +// +// fh = wifi_get_netif_by_bssid(a, p->bssid); +// if (fh == NULL) +// return -1; +// +// uci_foreach_element(&pkg->sections, e) { +// struct uci_element *e1; +// char section_ifname[16] = {0}; +// +// s = uci_to_section(e); +// if (strcmp(s->type, "bk-iface")) +// continue; +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, "%s.%s.ifname", +// pkg->e.name, s->e.name); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ptr.value && (ret != UCI_OK)) +// return -1; +// +// e1 = ptr.last; +// if (e1->type == UCI_TYPE_OPTION) +// strncpy(section_ifname, ptr.o->v.string, 15); +// +// if (!strcmp(section_ifname, fh->name)) { +// is_bksec_found = true; +// break; +// } +// } +// +// if (!is_bksec_found) { +// /* Add a new 'bk-iface section' */ +// ret = uci_add_section(ctx, pkg, "bk-iface", &s); +// if (ret != UCI_OK) +// return -1; +// +// uci_save(ctx, pkg); +// } +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, "%s.%s.ifname=%s", +// pkg->e.name, s->e.name, fh->name); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.disallow_bsta_p1=%d", +// pkg->e.name, s->e.name, p->p1); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// memset(buf, 0, sizeof(buf)); +// snprintf(buf, sizeof(buf) - 1, +// "%s.%s.disallow_bsta_p2=%d", +// pkg->e.name, s->e.name, p->p2); +// ret = uci_lookup_ptr(ctx, &ptr, buf, true); +// if (ret != UCI_OK) +// return -1; +// +// uci_set(ctx, &ptr); +// uci_save(ctx, ptr.p); +// +// return 0; } /* for backhaul_bss_config_tlv: @@ -1830,32 +2121,33 @@ int agent_fill_backhaul_bss_config_all(struct agent *a, struct tlv_vendor_specific *agent_gen_vendor_specific_tlv(struct agent *a, uint8_t depth) { - struct tlv_vendor_specific *p; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = TLV_TYPE_VENDOR_SPECIFIC; - /* IOPSYS vendor oui */ - p->vendor_oui[0] = 0x00; - p->vendor_oui[1] = 0x22; - p->vendor_oui[2] = 0x07; - - p->m_nr = 1 + 1 + 2 + 1; // number of tlvs, type, len, val - p->m = calloc(1, p->m_nr); - if (!p->m) - goto error; - - p->m[0] = 0x01; - p->m[1] = VENDOR_SPECIFIC_TYPE_DEPTH; - p->m[3] = 1; - p->m[4] = depth; - - return p; -error: - free(p); return NULL; +// struct tlv_vendor_specific *p; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = TLV_TYPE_VENDOR_SPECIFIC; +// /* IOPSYS vendor oui */ +// p->vendor_oui[0] = 0x00; +// p->vendor_oui[1] = 0x22; +// p->vendor_oui[2] = 0x07; +// +// p->m_nr = 1 + 1 + 2 + 1; // number of tlvs, type, len, val +// p->m = calloc(1, p->m_nr); +// if (!p->m) +// goto error; +// +// p->m[0] = 0x01; +// p->m[1] = VENDOR_SPECIFIC_TYPE_DEPTH; +// p->m[3] = 1; +// p->m[4] = depth; +// +// return p; +//error: +// free(p); +// return NULL; } char *get_timestamp(time_t *t, char **tbuf) @@ -1976,103 +2268,108 @@ struct tlv_ch_scan_res *agent_gen_non_success_ch_scan_respons_tlv(struct agent * struct tlv_backhaul_sta_radio_cap *agent_gen_bk_sta_radio_cap_tlv(struct agent *a, uint32_t radio_index) { - struct wifi_radio_element *radio = a->radios + radio_index; - struct tlv_backhaul_sta_radio_cap *p; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_BACKHAUL_STA_RADIO_CAPABILITY; - memcpy(p->radio_id, radio->macaddr, 6); - p->mac_include = 0; - struct netif_bk *bk; - struct wifi_radio_element *bk_radio; - - list_for_each_entry(bk, &a->bklist, list) { - dbg("bk ifname: %s\n", bk->cfg->name); - bk_radio = wifi_ifname_to_radio_element(a, - bk->cfg->name); - if (!bk_radio) - return NULL; - - dbg("bk radio name: %s\n", bk_radio->name); - dbg("bk radio mac: " MACFMT "\n", - MAC2STR(bk_radio->macaddr)); - if (!strcmp(radio->name, bk_radio->name)) { - memcpy(p->mac, bk->bssid, 6); - p->mac_include = 1; - } - dbg("mac_included: %d", p->mac_include); - } - return p; + return NULL; +// struct wifi_radio_element *radio = a->radios + radio_index; +// struct tlv_backhaul_sta_radio_cap *p; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_BACKHAUL_STA_RADIO_CAPABILITY; +// memcpy(p->radio_id, radio->macaddr, 6); +// p->mac_include = 0; +// struct netif_bk *bk; +// struct wifi_radio_element *bk_radio; +// +// list_for_each_entry(bk, &a->bklist, list) { +// dbg("bk ifname: %s\n", bk->cfg->name); +// bk_radio = wifi_ifname_to_radio_element(a, +// bk->cfg->name); +// if (!bk_radio) +// return NULL; +// +// dbg("bk radio name: %s\n", bk_radio->name); +// dbg("bk radio mac: " MACFMT "\n", +// MAC2STR(bk_radio->macaddr)); +// if (!strcmp(radio->name, bk_radio->name)) { +// memcpy(p->mac, bk->bssid, 6); +// p->mac_include = 1; +// } +// dbg("mac_included: %d", p->mac_include); +// } +// return p; } struct tlv_client_assoc_event *agent_gen_client_assoc_event_tlv(struct agent *agent, uint8_t *mac, uint8_t *bssid, uint8_t assoc_event) { - struct tlv_client_assoc_event *p; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_CLIENT_ASSOCIATION_EVENT; - memcpy(p->client_addr, mac, 6); - memcpy(p->bssid, bssid, 6); - p->assoc_event = assoc_event; - - return p; + return NULL; +// struct tlv_client_assoc_event *p; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_CLIENT_ASSOCIATION_EVENT; +// memcpy(p->client_addr, mac, 6); +// memcpy(p->bssid, bssid, 6); +// p->assoc_event = assoc_event; +// +// return p; } struct tlv_sta_mac *agent_gen_sta_mac_tlv(struct agent *agent, uint8_t *mac) { - struct tlv_sta_mac *p; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_STA_MAC_ADDRESS; - memcpy(p->addr, mac, 6); - - return p; + return NULL; +// struct tlv_sta_mac *p; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_STA_MAC_ADDRESS; +// memcpy(p->addr, mac, 6); +// +// return p; } struct tlv_reason_code *agent_gen_reason_code_tlv(struct agent *agent) { - struct tlv_reason_code *p; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_REASON_CODE; - p->reason_code = 1; // dummy ? - - return p; + return NULL; +// struct tlv_reason_code *p; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_REASON_CODE; +// p->reason_code = 1; // dummy ? +// +// return p; } struct tlv_assoc_sta_traffic_stats *agent_gen_assoc_sta_traffic_stats_tlv(struct agent *a, uint8_t *mac) { - struct tlv_assoc_sta_traffic_stats *p; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_ASSOCIATED_STA_TRAFFIC_STATS; - memcpy(p->addr, mac, 6); - p->bytes_sent = 0; // dummy ? - p->bytes_received = 0; - p->packets_sent = 0; - p->packets_received = 0; - p->tx_packets_err = 0; - p->rx_packets_err = 0; - p->retransmission_cnt = 0; - - return p; + return NULL; +// struct tlv_assoc_sta_traffic_stats *p; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_ASSOCIATED_STA_TRAFFIC_STATS; +// memcpy(p->addr, mac, 6); +// p->bytes_sent = 0; // dummy ? +// p->bytes_received = 0; +// p->packets_sent = 0; +// p->packets_received = 0; +// p->tx_packets_err = 0; +// p->rx_packets_err = 0; +// p->retransmission_cnt = 0; +// +// return p; } /******************************************************** @@ -2082,386 +2379,397 @@ struct tlv_assoc_sta_traffic_stats *agent_gen_assoc_sta_traffic_stats_tlv(struct static void parse_eth_devices(struct ubus_request *req, int type, struct blob_attr *msg) { - struct tlv_device_info *p = (struct tlv_device_info *)req->priv; - struct blob_attr *cur; - void *tmp; - int rem; - - blobmsg_for_each_attr(cur, msg, rem) { - struct blob_attr *tb[2]; - static const struct blobmsg_policy attr[2] = { - [0] = { .name = "macaddr", .type = BLOBMSG_TYPE_STRING }, - [1] = { .name = "link-supported", .type = BLOBMSG_TYPE_STRING }, - }; - int idx = p->local_interfaces_nr; - - blobmsg_parse(attr, 2, tb, blob_data(cur), blob_len(cur)); - - if (!tb[0] || !tb[1]) - continue; - - tmp = realloc(p->local_interfaces, - (idx + 1) * sizeof(*p->local_interfaces)); - if (!tmp) - break; - - p->local_interfaces = tmp; - p->local_interfaces_nr++; - - memcpy(p->local_interfaces[idx].mac_address, - blobmsg_data(tb[0]), - sizeof(p->local_interfaces[idx].mac_address)); - - p->local_interfaces[idx].media_type = - strstr(blobmsg_data(tb[1]), "1000baseT") ? 0x0001 : 0x0000; - } + return; +// struct tlv_device_info *p = (struct tlv_device_info *)req->priv; +// struct blob_attr *cur; +// void *tmp; +// int rem; +// +// blobmsg_for_each_attr(cur, msg, rem) { +// struct blob_attr *tb[2]; +// static const struct blobmsg_policy attr[2] = { +// [0] = { .name = "macaddr", .type = BLOBMSG_TYPE_STRING }, +// [1] = { .name = "link-supported", .type = BLOBMSG_TYPE_STRING }, +// }; +// int idx = p->local_interfaces_nr; +// +// blobmsg_parse(attr, 2, tb, blob_data(cur), blob_len(cur)); +// +// if (!tb[0] || !tb[1]) +// continue; +// +// tmp = realloc(p->local_interfaces, +// (idx + 1) * sizeof(*p->local_interfaces)); +// if (!tmp) +// break; +// +// p->local_interfaces = tmp; +// p->local_interfaces_nr++; +// +// memcpy(p->local_interfaces[idx].mac_address, +// blobmsg_data(tb[0]), +// sizeof(p->local_interfaces[idx].mac_address)); +// +// p->local_interfaces[idx].media_type = +// strstr(blobmsg_data(tb[1]), "1000baseT") ? 0x0001 : 0x0000; +// } } static uint16_t get_wifi_media_type(struct agent *a, int radio_idx, int bss_idx) { - struct netif_fh *fh; - char *standard = NULL, *p1, *p2; - uint16_t ret = 0xFFFF; - - // get standard from fhlist - list_for_each_entry(fh, &a->fhlist, list) { - if (hwaddr_equal(fh->bssid, - a->radios[radio_idx].bsslist[bss_idx].bssid)) - standard = strdup(fh->standard); - } - - if (!standard || !strncmp(standard, "802.11", strlen("802.11"))) - goto end; - - // parse standard to 1905 media type - p1 = standard + strlen("802.11"); -again: - p2 = strrchr(p1, '/'); - if (!p2) - p2 = p1; - - // TODO: add sanity checks for band? - if (!strcasecmp(p2, "b")) - ret = 0x0100; - else if (!strcasecmp(p2, "g")) - ret = 0x0101; - else if (!strcasecmp(p2, "a")) - ret = 0x0102; - else if (!strcasecmp(p2, "n")) - if (a->radios[radio_idx].band == BAND_2) - ret = 0x0103; - else - ret = 0x0104; - else if (!strcasecmp(p2, "ac")) - ret = 0x0105; - else if (!strcasecmp(p2, "ad")) - ret = 0x0106; - else if (!strcasecmp(p2, "af")) - ret = 0x0107; - else - // if we don't know this one, check the next one if there is one - if (p2 != p1) - goto again; -end: - free(standard); - return ret; + return 0; +// struct netif_fh *fh; +// char *standard = NULL, *p1, *p2; +// uint16_t ret = 0xFFFF; +// +// // get standard from fhlist +// list_for_each_entry(fh, &a->fhlist, list) { +// if (hwaddr_equal(fh->bssid, +// a->radios[radio_idx].bsslist[bss_idx].bssid)) +// standard = strdup(fh->standard); +// } +// +// if (!standard || !strncmp(standard, "802.11", strlen("802.11"))) +// goto end; +// +// // parse standard to 1905 media type +// p1 = standard + strlen("802.11"); +//again: +// p2 = strrchr(p1, '/'); +// if (!p2) +// p2 = p1; +// +// // TODO: add sanity checks for band? +// if (!strcasecmp(p2, "b")) +// ret = 0x0100; +// else if (!strcasecmp(p2, "g")) +// ret = 0x0101; +// else if (!strcasecmp(p2, "a")) +// ret = 0x0102; +// else if (!strcasecmp(p2, "n")) +// if (a->radios[radio_idx].band == BAND_2) +// ret = 0x0103; +// else +// ret = 0x0104; +// else if (!strcasecmp(p2, "ac")) +// ret = 0x0105; +// else if (!strcasecmp(p2, "ad")) +// ret = 0x0106; +// else if (!strcasecmp(p2, "af")) +// ret = 0x0107; +// else +// // if we don't know this one, check the next one if there is one +// if (p2 != p1) +// goto again; +//end: +// free(standard); +// return ret; } static void add_wifi_media_specific_data(struct tlv_device_info *p, int int_idx, struct agent *a, int radio_idx, int bss_idx) { - struct netif_fh *fh; - - p->local_interfaces[int_idx].media_specific_data_size = 10; - - memcpy(p->local_interfaces[int_idx].media_specific_data.ieee80211.network_membership, - a->radios[radio_idx].bsslist[bss_idx].bssid, - sizeof(p->local_interfaces[int_idx].media_specific_data.ieee80211.network_membership)); - - // TODO: separate backhaul STA as well - p->local_interfaces[int_idx].media_specific_data.ieee80211.role = - IEEE80211_SPECIFIC_INFO_ROLE_AP; - - // get media specific data from fhlist - list_for_each_entry(fh, &a->fhlist, list) { - if (hwaddr_equal(fh->bssid, - a->radios[radio_idx].bsslist[bss_idx].bssid)) - break; - } - - p->local_interfaces[int_idx].media_specific_data.ieee80211.ap_channel_band = - fh->bandwidth; - p->local_interfaces[int_idx].media_specific_data.ieee80211.ap_ch_freq_1 = - fh->channel; - /* TODO: this is only needed for 80+80 - p->local_interfaces[int_idx].media_specific_data.ieee80211.ap_ch_freq_2 = - */ + return; +// struct netif_fh *fh; +// +// p->local_interfaces[int_idx].media_specific_data_size = 10; +// +// memcpy(p->local_interfaces[int_idx].media_specific_data.ieee80211.network_membership, +// a->radios[radio_idx].bsslist[bss_idx].bssid, +// sizeof(p->local_interfaces[int_idx].media_specific_data.ieee80211.network_membership)); +// +// // TODO: separate backhaul STA as well +// p->local_interfaces[int_idx].media_specific_data.ieee80211.role = +// IEEE80211_SPECIFIC_INFO_ROLE_AP; +// +// // get media specific data from fhlist +// list_for_each_entry(fh, &a->fhlist, list) { +// if (hwaddr_equal(fh->bssid, +// a->radios[radio_idx].bsslist[bss_idx].bssid)) +// break; +// } +// +// p->local_interfaces[int_idx].media_specific_data.ieee80211.ap_channel_band = +// fh->bandwidth; +// p->local_interfaces[int_idx].media_specific_data.ieee80211.ap_ch_freq_1 = +// fh->channel; +// /* TODO: this is only needed for 80+80 +// p->local_interfaces[int_idx].media_specific_data.ieee80211.ap_ch_freq_2 = +// */ } struct tlv_device_info *agent_gen_device_info(struct agent *a) { - struct tlv_device_info *p; - uint32_t ubus_obj; - void *tmp; - int i, j; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = TLV_TYPE_DEVICE_INFORMATION_TYPE; - - memcpy(p->al_mac_address, a->almac, sizeof(p->al_mac_address)); - -#if 0 - /* local interfaces */ - // get eth devices from ubus network.device if available - ubus_obj = ubus_get_object(a->ubus_ctx, "network.device"); - if (ubus_obj != WIFI_OBJECT_INVALID) { - ubus_call_object(a, ubus_obj, "status", parse_eth_devices, p); - } - // get bss info same as AP Operational BSS - for (i = 0; i < a->num_radios; i++) { - for (j = 0; j < a->radios[i].num_bss; j++) { - /* only report BSS in PWR_ON or PWR_SAVE mode */ - if (a->radios[i].bsslist[j].enabled) { - int idx = p->local_interfaces_nr; - tmp = realloc(p->local_interfaces, - (idx + 1) * sizeof(*p->local_interfaces)); - if (!tmp) - return NULL; - - p->local_interfaces = tmp; - p->local_interfaces_nr++; - - memcpy(p->local_interfaces[idx].mac_address, - a->radios[i].bsslist[j].bssid, - sizeof(p->local_interfaces[idx].mac_address)); - - p->local_interfaces[idx].media_type = - get_wifi_media_type(a, i, j); - - if (p->local_interfaces[idx].media_type == 0xFFFF) - continue; - - add_wifi_media_specific_data(p, idx, a, i, j); - } - } - } -#endif - return p; + return NULL; +// struct tlv_device_info *p; +// uint32_t ubus_obj; +// void *tmp; +// int i, j; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = TLV_TYPE_DEVICE_INFORMATION_TYPE; +// +// memcpy(p->al_mac_address, a->almac, sizeof(p->al_mac_address)); +// +//#if 0 +// /* local interfaces */ +// // get eth devices from ubus network.device if available +// ubus_obj = ubus_get_object(a->ubus_ctx, "network.device"); +// if (ubus_obj != WIFI_OBJECT_INVALID) { +// ubus_call_object(a, ubus_obj, "status", parse_eth_devices, p); +// } +// // get bss info same as AP Operational BSS +// for (i = 0; i < a->num_radios; i++) { +// for (j = 0; j < a->radios[i].num_bss; j++) { +// /* only report BSS in PWR_ON or PWR_SAVE mode */ +// if (a->radios[i].bsslist[j].enabled) { +// int idx = p->local_interfaces_nr; +// tmp = realloc(p->local_interfaces, +// (idx + 1) * sizeof(*p->local_interfaces)); +// if (!tmp) +// return NULL; +// +// p->local_interfaces = tmp; +// p->local_interfaces_nr++; +// +// memcpy(p->local_interfaces[idx].mac_address, +// a->radios[i].bsslist[j].bssid, +// sizeof(p->local_interfaces[idx].mac_address)); +// +// p->local_interfaces[idx].media_type = +// get_wifi_media_type(a, i, j); +// +// if (p->local_interfaces[idx].media_type == 0xFFFF) +// continue; +// +// add_wifi_media_specific_data(p, idx, a, i, j); +// } +// } +// } +//#endif +// return p; } struct tlv_device_bridge_cap *agent_gen_device_bridge_cap(struct agent *a) { - struct tlv_device_bridge_cap *p; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = TLV_TYPE_DEVICE_BRIDGING_CAPABILITIES; - - return p; + return NULL; +// struct tlv_device_bridge_cap *p; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = TLV_TYPE_DEVICE_BRIDGING_CAPABILITIES; +// +// return p; } struct tlv_non1905_neighbor *agent_gen_non1905_neighbor(struct agent *a) { - struct tlv_non1905_neighbor *p; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = TLV_TYPE_NON_1905_NEIGHBOR_DEVICE_LIST; - - return p; + return NULL; +// struct tlv_non1905_neighbor *p; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = TLV_TYPE_NON_1905_NEIGHBOR_DEVICE_LIST; +// +// return p; } struct tlv_neighbor_device *agent_gen_neighbor_device(struct agent *a) { - struct tlv_neighbor_device *p; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = TLV_TYPE_NEIGHBOR_DEVICE_LIST; - - return p; + return NULL; +// struct tlv_neighbor_device *p; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = TLV_TYPE_NEIGHBOR_DEVICE_LIST; +// +// return p; } /* Topology Response Extension TLVs */ struct tlv_supp_service *agent_gen_supp_service_tlv(struct agent *a) { - struct tlv_supp_service *p; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_SUPPORTED_SERVICE; - - p->supported_services_list = 1; - p->supported_services = calloc(p->supported_services_list, - sizeof(*p->supported_services)); - if (!p->supported_services) - return NULL; - - p->supported_services[0].service = SUPPORTED_SERVICE_MULTIAP_AGENT; - - return p; + return NULL; +// struct tlv_supp_service *p; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_SUPPORTED_SERVICE; +// +// p->supported_services_list = 1; +// p->supported_services = calloc(p->supported_services_list, +// sizeof(*p->supported_services)); +// if (!p->supported_services) +// return NULL; +// +// p->supported_services[0].service = SUPPORTED_SERVICE_MULTIAP_AGENT; +// +// return p; } struct tlv_ap_oper_bss *agent_gen_ap_oper_bss_tlv(struct agent *a) { - struct tlv_ap_oper_bss *p; - void *tmp; - int i, j; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_AP_OPERATIONAL_BSS; - - p->radios_nr = a->num_radios; - p->radio = calloc(p->radios_nr, sizeof(*p->radio)); - if (!p->radio) - return NULL; - - for (i = 0; i < p->radios_nr; i++) { - memcpy(p->radio[i].radio_id, a->radios[i].macaddr, 6); - - for (j = 0; j < a->radios[i].num_bss; j++) { - /* only report BSS in PWR_ON or PWR_SAVE mode */ - if (a->radios[i].bsslist[j].enabled) { - int idx = p->radio[i].bss_nr; - tmp = realloc(p->radio[i].bss, - (idx + 1) * sizeof(*p->radio[i].bss)); - if (!tmp) - return NULL; - - p->radio[i].bss = tmp; - p->radio[i].bss_nr++; - - memcpy(p->radio[i].bss[idx].bssid, - a->radios[i].bsslist[j].bssid, - sizeof(p->radio[i].bss[idx].bssid)); - p->radio[i].bss[idx].ssid_len = - strlen(a->radios[i].bsslist[j].ssid); - memcpy(p->radio[i].bss[idx].ssid, - a->radios[i].bsslist[j].ssid, - sizeof(p->radio[i].bss[idx].ssid)); - } - } - } - - return p; + return NULL; +// struct tlv_ap_oper_bss *p; +// void *tmp; +// int i, j; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_AP_OPERATIONAL_BSS; +// +// p->radios_nr = a->num_radios; +// p->radio = calloc(p->radios_nr, sizeof(*p->radio)); +// if (!p->radio) +// return NULL; +// +// for (i = 0; i < p->radios_nr; i++) { +// memcpy(p->radio[i].radio_id, a->radios[i].macaddr, 6); +// +// for (j = 0; j < a->radios[i].num_bss; j++) { +// /* only report BSS in PWR_ON or PWR_SAVE mode */ +// if (a->radios[i].bsslist[j].enabled) { +// int idx = p->radio[i].bss_nr; +// tmp = realloc(p->radio[i].bss, +// (idx + 1) * sizeof(*p->radio[i].bss)); +// if (!tmp) +// return NULL; +// +// p->radio[i].bss = tmp; +// p->radio[i].bss_nr++; +// +// memcpy(p->radio[i].bss[idx].bssid, +// a->radios[i].bsslist[j].bssid, +// sizeof(p->radio[i].bss[idx].bssid)); +// p->radio[i].bss[idx].ssid_len = +// strlen(a->radios[i].bsslist[j].ssid); +// memcpy(p->radio[i].bss[idx].ssid, +// a->radios[i].bsslist[j].ssid, +// sizeof(p->radio[i].bss[idx].ssid)); +// } +// } +// } +// +// return p; } struct tlv_assoc_client *agent_gen_assoc_client_tlv(struct agent *a) { - struct tlv_assoc_client *p; - void *tmp; - int i, j, k; - - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_ASSOCIATED_CLIENTS; - - for (i = 0; i < a->num_radios; i++) { - int idx = p->bss_nr; - tmp = realloc(p->bss, - (p->bss_nr + a->radios[i].num_bss) * sizeof(*p->bss)); - if (!tmp) - return NULL; - - p->bss = tmp; - p->bss_nr += a->radios[i].num_bss; - - for (j = 0; j < a->radios[i].num_bss; j++) { - memcpy(p->bss[idx + j].bssid, - a->radios[i].bsslist[j].bssid, - sizeof(p->bss[idx + j].bssid)); - -#if 1 - /* TODO: replace with stalist when ready for use */ - { - struct netif_fh *fh; - struct sta *s; - int num_sta = 0; - - fh = wifi_get_netif_by_bssid(a, a->radios[i].bsslist[j].bssid); - if (!fh) - continue; - - list_for_each_entry(s, &fh->stalist, list) - num_sta++; - - p->bss[idx + j].clients = - calloc(num_sta, sizeof(*p->bss[idx + j].clients)); - if (!p->bss[idx + j].clients) - return NULL; - - p->bss[idx + j].assoc_clients_nr = num_sta; - - k = 0; - list_for_each_entry(s, &fh->stalist, list) { - memcpy(p->bss[idx + j].clients[k].client_addr, - s->macaddr, - sizeof(p->bss[idx + j].clients[k].client_addr)); - - p->bss[idx + j].clients[k].uptime = - ((s->connected_ms / 1000) > 0xFFFF) - ? 0xFFFF - : (s->connected_ms / 1000) & 0xFFFF; - k++; - } - } -#else - p->bss[idx + j].clients = - calloc(a->radios[i].bsslist[j].num_stations, - sizeof(*p->bss[idx + j].clients)); - if (!p->bss[idx + j].clients) - return NULL; - - p->bss[idx + j].assoc_clients_nr = - a->radios[i].bsslist[j].num_stations; - - for (k = 0; k < p->bss[idx + j].assoc_clients_nr; k++) { - memcpy(p->bss[idx + j].clients[k].client_addr, - a->radios[i].bsslist[j].stalist[k].macaddr, - sizeof(p->bss[idx + j].clients[k].client_addr)); - - /* Note: cap at 0xFFFF, see above */ - p->bss[idx + j].clients[k].uptime = - a->radios[i].bsslist[j].stalist[k].conn_time; - } -#endif - } - } - - return p; + return NULL; +// struct tlv_assoc_client *p; +// void *tmp; +// int i, j, k; +// +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_ASSOCIATED_CLIENTS; +// +// for (i = 0; i < a->num_radios; i++) { +// int idx = p->bss_nr; +// tmp = realloc(p->bss, +// (p->bss_nr + a->radios[i].num_bss) * sizeof(*p->bss)); +// if (!tmp) +// return NULL; +// +// p->bss = tmp; +// p->bss_nr += a->radios[i].num_bss; +// +// for (j = 0; j < a->radios[i].num_bss; j++) { +// memcpy(p->bss[idx + j].bssid, +// a->radios[i].bsslist[j].bssid, +// sizeof(p->bss[idx + j].bssid)); +// +//#if 1 +// /* TODO: replace with stalist when ready for use */ +// { +// struct netif_fh *fh; +// struct sta *s; +// int num_sta = 0; +// +// fh = wifi_get_netif_by_bssid(a, a->radios[i].bsslist[j].bssid); +// if (!fh) +// continue; +// +// list_for_each_entry(s, &fh->stalist, list) +// num_sta++; +// +// p->bss[idx + j].clients = +// calloc(num_sta, sizeof(*p->bss[idx + j].clients)); +// if (!p->bss[idx + j].clients) +// return NULL; +// +// p->bss[idx + j].assoc_clients_nr = num_sta; +// +// k = 0; +// list_for_each_entry(s, &fh->stalist, list) { +// memcpy(p->bss[idx + j].clients[k].client_addr, +// s->macaddr, +// sizeof(p->bss[idx + j].clients[k].client_addr)); +// +// p->bss[idx + j].clients[k].uptime = +// ((s->connected_ms / 1000) > 0xFFFF) +// ? 0xFFFF +// : (s->connected_ms / 1000) & 0xFFFF; +// k++; +// } +// } +//#else +// p->bss[idx + j].clients = +// calloc(a->radios[i].bsslist[j].num_stations, +// sizeof(*p->bss[idx + j].clients)); +// if (!p->bss[idx + j].clients) +// return NULL; +// +// p->bss[idx + j].assoc_clients_nr = +// a->radios[i].bsslist[j].num_stations; +// +// for (k = 0; k < p->bss[idx + j].assoc_clients_nr; k++) { +// memcpy(p->bss[idx + j].clients[k].client_addr, +// a->radios[i].bsslist[j].stalist[k].macaddr, +// sizeof(p->bss[idx + j].clients[k].client_addr)); +// +// /* Note: cap at 0xFFFF, see above */ +// p->bss[idx + j].clients[k].uptime = +// a->radios[i].bsslist[j].stalist[k].conn_time; +// } +//#endif +// } +// } +// +// return p; } struct tlv_map_profile *agent_gen_map_profile_tlv(struct agent *a) { - struct tlv_map_profile *p = NULL; - - if (a->cfg.profile == MAP_PROFILE_2) { - p = calloc(1, sizeof(*p)); - if (!p) - return NULL; - - p->tlv_type = MAP_TLV_MULTIAP_PROFILE; - - p->profile = MAP_PROFILE_2; - } - - return p; + return NULL; +// struct tlv_map_profile *p = NULL; +// +// if (a->cfg.profile == MAP_PROFILE_2) { +// p = calloc(1, sizeof(*p)); +// if (!p) +// return NULL; +// +// p->tlv_type = MAP_TLV_MULTIAP_PROFILE; +// +// p->profile = MAP_PROFILE_2; +// } +// +// return p; } diff --git a/src/core/agent_tlv_generator.h b/src/core/agent_tlv_generator.h index c5f18daaaad8eb3b2812691eb748c049f7f8c7a4..aaf398888552258f7352f8d5d8e1673d12868afa 100644 --- a/src/core/agent_tlv_generator.h +++ b/src/core/agent_tlv_generator.h @@ -19,25 +19,25 @@ uint8_t rssi_to_rcpi(int rssi); struct netif_fh *wifi_get_netif_by_bssid(struct agent *a, uint8_t *bssid); struct tlv_ap_ht_cap *agent_gen_ap_ht_caps(struct agent *a, - struct cmdu_cstruct *cmdu, uint32_t radio_index); + struct cmdu_buff *cmdu, uint32_t radio_index); struct tlv_ap_cap *agent_gen_ap_caps(struct agent *a, - struct cmdu_cstruct *cmdu); -struct tlv_ap_radio_basic_cap *agent_gen_ap_radio_basic_cap(struct agent *a, - struct cmdu_cstruct *cmdu, struct wifi_radio_element *radio); + struct cmdu_buff *cmdu); +int agent_gen_ap_radio_basic_cap(struct agent *a, + struct cmdu_buff *frm, struct wifi_radio_element *radio); struct tlv_ap_vht_cap *agent_gen_ap_vht_caps(struct agent *a, - struct cmdu_cstruct *cmdu, uint32_t radio_index); -struct tlv_profile2_ap_cap *agent_gen_profile2_ap_cap(struct agent *a); -struct tlv_ap_radio_adv_cap *agent_gen_ap_radio_adv_cap(struct agent *a, - struct cmdu_cstruct *cmdu, struct wifi_radio_element *radio); -struct tlv_wsc *agent_gen_wsc(struct agent *a, struct cmdu_cstruct *cmdu, + struct cmdu_buff *cmdu, uint32_t radio_index); +int agent_gen_profile2_ap_cap(struct agent *a, struct cmdu_buff *frm); +int agent_gen_ap_radio_adv_cap(struct agent *a, + struct cmdu_buff *cmdu, struct wifi_radio_element *radio); +int agent_gen_wsc(struct agent *a, struct cmdu_buff *cmdu, struct wifi_radio_element *radio); struct tlv_ch_scan_cap *agent_gen_ch_scan_cap(struct agent *a); struct tlv_cac_cap *agent_gen_cac_cap(struct agent *a); struct tlv_metric_collection_interval *agent_gen_metric_collection_interval(struct agent *a); struct tlv_oper_ch_report *agent_gen_operate_channel_report(struct agent *a, - struct cmdu_cstruct *cmdu, uint32_t radio_index); + struct cmdu_buff *cmdu, uint32_t radio_index); struct tlv_ch_selection_resp *agent_gen_operate_channel_response(struct agent *a, - struct cmdu_cstruct *cmdu, uint8_t *radio_recvd, uint8_t reason_code); + struct cmdu_buff *cmdu, uint8_t *radio_recvd, uint8_t reason_code); void agent_gen_radio_channel_preference(struct agent *a, struct tlv_channel_pref *p, uint32_t radio_index); @@ -45,16 +45,19 @@ void agent_gen_radio_restrict_channel(struct agent *a, struct tlv_radio_oper_restrict *p, uint32_t radio_index); void agent_gen_cac_comp_report(struct agent *a, - struct tlv_cac_comp_report *p); + struct tlv_cac_complete_report *p); struct tlv_error_code *agent_gen_tlv_error_code(struct agent *a, - struct cmdu_cstruct *cmdu, uint8_t *sta_mac, uint8_t reason_code); + struct cmdu_buff *cmdu, uint8_t *sta_mac, uint8_t reason_code); struct tlv_steer_btm_report *agent_gen_steer_btm_report(struct agent *a, uint8_t *target_bssid, uint8_t *src_bssid, uint8_t *sta, uint8_t status_code); -struct tlv_al_mac *agent_gen_al_mac(struct agent *a, uint8_t *hwaddr); -struct tlv_autoconf_freq_band *agent_gen_autoconf_freq_band(struct agent *a, +int agent_gen_al_mac(struct agent *a, struct cmdu_buff *frm, uint8_t *hwaddr); +int agent_gen_supported_service(struct agent *a, struct cmdu_buff *frm, uint8_t service); +int agent_gen_searched_service(struct agent *a, struct cmdu_buff *frm, uint8_t service); +int agent_gen_map_profile(struct agent *a, struct cmdu_buff *frm, uint8_t profile); +int agent_gen_autoconf_freq_band(struct agent *a, struct cmdu_buff *frm, uint8_t band); -struct tlv_searched_role *agent_gen_searched_role(struct agent *a, +int agent_gen_searched_role(struct agent *a, struct cmdu_buff *frm, uint8_t role); struct tlv_radio_metrics *agent_gen_radio_metrics(struct agent *a, int radio_index); @@ -106,13 +109,13 @@ int agent_fill_traffic_sep_policy(struct agent *a, struct tlv_traffic_sep_policy *p, struct uci_context *ctx, struct uci_package *pkg); int agent_fill_ch_scan_rep_policy(struct agent *a, - struct tlv_ch_scan_rep_policy *p, + struct tlv_channel_scan_report_policy *p, struct uci_context *ctx, struct uci_package *pkg); int agent_fill_unsuccess_assoc_policy(struct agent *a, struct tlv_unsuccess_assoc_policy *p, struct uci_context *ctx, struct uci_package *pkg); int agent_fill_backhaul_bss_config(struct agent *a, - struct tlv_backhaul_bss_config *p, + struct tlv_bbss_config *p, struct uci_context *ctx, struct uci_package *pkg); int agent_fill_backhaul_bss_config_all(struct agent *a, struct tlv_backhaul_bss_config *p, diff --git a/src/core/agent_ubus.c b/src/core/agent_ubus.c index c2af82fba523fc225f0840d50cfd1ddb45c3210c..a2363f9d3d4b74a0779ced4a928456c6fbfcf175 100644 --- a/src/core/agent_ubus.c +++ b/src/core/agent_ubus.c @@ -16,11 +16,14 @@ #include <libubus.h> #include <uci.h> -#include <map1905/map2.h> -#include <map1905/maputils.h> +#include <timer_impl.h> +#include <cmdu.h> +#include <1905_tlvs.h> #include <easy/easy.h> #include <wifi.h> +#include <map_module22.h> + #include "utils.h" #include "debug.h" #include "config.h" @@ -378,91 +381,91 @@ static int agent_config_ap(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) { - struct agent *a = container_of(obj, struct agent, obj); - struct blob_attr *tb[__CFG_POLICY_MAX]; - char agent[18] = {0}, bssidstr[18] = {0}; - struct wifi_radio_element *radio, *found = NULL; - uint8_t hwaddr[6] = {0}, bssid[6] = {0}; - int i; - - blobmsg_parse(config_policy_params, __CFG_POLICY_MAX, tb, - blob_data(msg), blob_len(msg)); - - if (!tb[CFG_POLICY_AGENT] || !tb[CFG_POLICY_BSSID]) { - fprintf(stderr, "STA Capability Query: provide BSSID " \ - "address in format 11:22:33...\n"); - return UBUS_STATUS_INVALID_ARGUMENT; - } - - strncpy(agent, blobmsg_data(tb[CFG_POLICY_AGENT]), sizeof(agent) - 1); - if (!hwaddr_aton(agent, hwaddr)) - return UBUS_STATUS_UNKNOWN_ERROR; - - strncpy(bssidstr, blobmsg_data(tb[CFG_POLICY_BSSID]), - sizeof(bssidstr) - 1); - if (!hwaddr_aton(bssidstr, bssid)) - return UBUS_STATUS_UNKNOWN_ERROR; - - for (i = 0; i < a->num_radios; i++) { - radio = a->radios + i; - - if (memcmp(radio->macaddr, bssid, 6)) - continue; - found = radio; - } - if (!found) - return UBUS_STATUS_UNKNOWN_ERROR; - - build_ap_autoconfig_wsc(a, hwaddr, radio, i); - - return 0; +// struct agent *a = container_of(obj, struct agent, obj); +// struct blob_attr *tb[__CFG_POLICY_MAX]; +// char agent[18] = {0}, bssidstr[18] = {0}; +// struct wifi_radio_element *radio, *found = NULL; +// uint8_t hwaddr[6] = {0}, bssid[6] = {0}; +// int i; +// +// blobmsg_parse(config_policy_params, __CFG_POLICY_MAX, tb, +// blob_data(msg), blob_len(msg)); +// +// if (!tb[CFG_POLICY_AGENT] || !tb[CFG_POLICY_BSSID]) { +// fprintf(stderr, "STA Capability Query: provide BSSID " \ +// "address in format 11:22:33...\n"); +// return UBUS_STATUS_INVALID_ARGUMENT; +// } +// +// strncpy(agent, blobmsg_data(tb[CFG_POLICY_AGENT]), sizeof(agent) - 1); +// if (!hwaddr_aton(agent, hwaddr)) +// return UBUS_STATUS_UNKNOWN_ERROR; +// +// strncpy(bssidstr, blobmsg_data(tb[CFG_POLICY_BSSID]), +// sizeof(bssidstr) - 1); +// if (!hwaddr_aton(bssidstr, bssid)) +// return UBUS_STATUS_UNKNOWN_ERROR; +// +// for (i = 0; i < a->num_radios; i++) { +// radio = a->radios + i; +// +// if (memcmp(radio->macaddr, bssid, 6)) +// continue; +// found = radio; +// } +// if (!found) +// return UBUS_STATUS_UNKNOWN_ERROR; +// +// build_ap_autoconfig_wsc(a, hwaddr, radio, i); +// +// return 0; } static int agent_ap_search(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) { - struct agent *a = container_of(obj, struct agent, obj); - struct blob_attr *tb[__SEARCH_POLICY_MAX]; - int i, band = 0; - - blobmsg_parse(search_policy_params, __SEARCH_POLICY_MAX, tb, - blob_data(msg), blob_len(msg)); - - if (tb[SEARCH_POLICY_BAND]) { - band = blobmsg_get_u32(tb[SEARCH_POLICY_BAND]); - - if (band == 2) - band = BAND_2; - else if (band == 5) - band = BAND_5; - else { - trace("|%s:%d| Please provide band as '2', '5' or N/A\n", - __func__, __LINE__); - return UBUS_STATUS_UNKNOWN_ERROR; - } - } - - for (i = 0; i < a->num_radios; i++) { - struct cmdu_cstruct *cmdu; - struct wifi_radio_element *radio = &a->radios[i]; - - if (tb[SEARCH_POLICY_BAND]) - if (band != radio->band) - continue; - - cmdu = agent_gen_ap_autoconfig_search(a, radio, NULL, 0x02); - if (!cmdu) - continue; - - trace("|%s:%d| Sending Autoconfig Search for radio %s(%s)\n", - __func__, __LINE__, radio->name, - (radio->band == BAND_2 ? "2.4GHz" : "5GHz")); - agent_send_cmdu(a, cmdu); - map_free_cmdu(cmdu); - } - - return 0; +// struct agent *a = container_of(obj, struct agent, obj); +// struct blob_attr *tb[__SEARCH_POLICY_MAX]; +// int i, band = 0; +// +// blobmsg_parse(search_policy_params, __SEARCH_POLICY_MAX, tb, +// blob_data(msg), blob_len(msg)); +// +// if (tb[SEARCH_POLICY_BAND]) { +// band = blobmsg_get_u32(tb[SEARCH_POLICY_BAND]); +// +// if (band == 2) +// band = BAND_2; +// else if (band == 5) +// band = BAND_5; +// else { +// trace("|%s:%d| Please provide band as '2', '5' or N/A\n", +// __func__, __LINE__); +// return UBUS_STATUS_UNKNOWN_ERROR; +// } +// } +// +// for (i = 0; i < a->num_radios; i++) { +// struct cmdu_cstruct *cmdu; +// struct wifi_radio_element *radio = &a->radios[i]; +// +// if (tb[SEARCH_POLICY_BAND]) +// if (band != radio->band) +// continue; +// +// cmdu = agent_gen_ap_autoconfig_search(a, radio, NULL, 0x02); +// if (!cmdu) +// continue; +// +// trace("|%s:%d| Sending Autoconfig Search for radio %s(%s)\n", +// __func__, __LINE__, radio->name, +// (radio->band == BAND_2 ? "2.4GHz" : "5GHz")); +// agent_send_cmdu(a, cmdu); +// map_free_cmdu(cmdu); +// } +// +// return 0; } int agent_publish_object(struct agent *a, const char *objname) @@ -486,13 +489,8 @@ int agent_publish_object(struct agent *a, const char *objname) int ret; #define agent_sign "f6dfa346957f45cb8d82dc6b77e2df61" uint8_t agent_sig[16]; - char data[2 * sizeof(struct map_module) + 1] = {0}; uint32_t map_id; struct blob_buf bb = {}; - struct map_module mm = { - .role = MAP_ROLE_AGENT, - .profile = MAP_PROFILE_2, - }; const char *map_plugin = "map.1905"; obj = &a->obj; @@ -529,31 +527,6 @@ int agent_publish_object(struct agent *a, const char *objname) info("Published '%s' object\n", objname); - strtob(agent_sign, strlen(agent_sign) / 2, agent_sig); - memcpy(&mm.sign, agent_sig, 16); - - /* register with 1905-map plugin */ - ret = ubus_lookup_id(a->ubus_ctx, map_plugin, &map_id); - if (ret) { - /* TODO: if map plugin is not installed, retry - * after some time. - */ - dbg("plugin '%s' lookup failed. %s\n", map_plugin, - ubus_strerror(ret)); - return ret; - } - - blob_buf_init(&bb, 0); - blobmsg_add_u32(&bb, "module", obj->id); - btostr((unsigned char *)&mm, sizeof(struct map_module), data); - blobmsg_add_string(&bb, "data", data); - ret = ubus_invoke(a->ubus_ctx, map_id, "register", bb.head, NULL, 0, - 3000); - if (ret) { - warn("Failed to 'register' with %s (err = %s)\n", - map_plugin, ubus_strerror(ret)); - } - blob_buf_free(&bb); return ret; diff --git a/src/core/config.c b/src/core/config.c index 85350c234693b77d770f47917390d92579f9a84f..99e752a95331a5bf01e9ba7c3a20f47be532f6be 100644 --- a/src/core/config.c +++ b/src/core/config.c @@ -28,7 +28,7 @@ #include <libubus.h> #include <uci.h> -#include <wsc.h> +#include <i1905_wsc.h> #include <easy/easy.h> @@ -713,10 +713,7 @@ int uci_apply_wps_credentials(struct agent_config *cfg, enum wifi_band band) /* TODO: batch the changes arther than commit oneby one */ int uci_apply_m2(struct agent_config *cfg, char *interface_name, char *device, - uint8_t *ssid, uint16_t auth_type, uint16_t encryption_type, - uint8_t *network_key, uint8_t mapie, uint8_t band, - uint8_t *bridge, uint8_t *proto, uint8_t vid, uint32_t br_ip, - uint8_t *bk_ssid, uint8_t *bk_key, bool onboarded) + struct wps_credential *out, bool onboarded) { bool ret; char auth_type_str[20] = {0}; @@ -725,44 +722,60 @@ int uci_apply_m2(struct agent_config *cfg, char *interface_name, char *device, char band_str[2] = {0}; char agent_section[16] = {0}; char ipaddr_str[INET_ADDRSTRLEN] = {0}; - + char ssid[33] = {0}, network_key[65] = {0}, bridge_buf[16] = {0}, *bridge; /* step past br- prefix if present*/ + + bridge = bridge_buf; if (!strncmp("br-", bridge, 3)) bridge += 3; - inet_ntop(AF_INET, &br_ip, ipaddr_str, INET_ADDRSTRLEN); + dbg("%s %d band = %d\n", __func__, __LINE__, out->band); + if (out->band == BAND_5) + strncpy(band_str, "5", 1); + else if (out->band == BAND_2) + strncpy(band_str, "2", 1); + else /* TODO: 60 */ + return M2_PROCESS_ERROR; + + memcpy(ssid, out->ssid, out->ssidlen); + memcpy(network_key, out->key, out->keylen); + memcpy(bridge, out->bridge, 15); + + inet_ntop(AF_INET, &out->br_ip, ipaddr_str, INET_ADDRSTRLEN); dbg("Applying WSC configuration (%s):\n", interface_name); dbg(" - SSID : %s\n", ssid); - dbg(" - AUTH_TYPE : 0x%04x\n", auth_type); - dbg(" - ENCRYPTION_TYPE : 0x%04x\n", encryption_type); + dbg(" - AUTH_TYPE : 0x%04x\n", out->auth_type); + dbg(" - ENCRYPTION_TYPE : 0x%04x\n", out->enc_type); dbg(" - NETWORK_KEY : %s\n", network_key); - dbg(" - MAPIE_EXTENSION : 0x%02x\n", mapie); + dbg(" - MAPIE_EXTENSION : 0x%02x\n", out->mapie); dbg(" - BRIDGE : %s\n", bridge); - dbg(" - PROTO : %s\n", proto); - dbg(" - VID : 0x%02x\n", vid); + dbg(" - PROTO : %s\n", out->proto); + dbg(" - VID : 0x%02x\n", out->vid); dbg(" - BR_IP : %s\n", ipaddr_str); - dbg(" - BK_SSID : %s\n", bk_ssid); - dbg(" - BK_KEY : %s\n", bk_key); + dbg(" - BK_SSID : %s\n", out->bk_ssid); + dbg(" - BK_KEY : %s\n", out->bk_key); + dbg(" - BAND : %s\n", band_str); + // if teardown bit is set, return - if (BIT(4, mapie)) + if (BIT(4, out->mapie)) return M2_PROCESS_TEARDOWN; - multi_ap |= (BIT(5, mapie) << 1); - multi_ap |= BIT(6, mapie); + multi_ap |= (BIT(5, out->mapie) << 1); + multi_ap |= BIT(6, out->mapie); snprintf(multiap_str, sizeof(multiap_str), "%d", multi_ap); //snprintf(ipaddr_str, sizeof(ipaddr_str), "%d.%d.%d.%d", br_ip[0], // br_ip[1], br_ip[2], br_ip[3]); - if (!get_encryption_value(auth_type, encryption_type, + if (!get_encryption_value(out->auth_type, out->enc_type, auth_type_str, 20)) { info("Unsupported encryption or cipher received!!\n"); return M2_PROCESS_ERROR; } - ret = uci_set_bridge("network", bridge, proto, ipaddr_str); + ret = uci_set_bridge("network", bridge, out->proto, ipaddr_str); if (ret) { info("Error seting up bridge from M2!\n"); return M2_PROCESS_ERROR; @@ -780,13 +793,6 @@ int uci_apply_m2(struct agent_config *cfg, char *interface_name, char *device, return M2_PROCESS_ERROR; } - if (band == BAND_5) - strncpy(band_str, "5", 1); - else if (band == BAND_2) - strncpy(band_str, "2", 1); - else /* TODO: 60 */ - return M2_PROCESS_ERROR; - uci_set_wireless_interface_option(UCI_AGENT, agent_section, "ifname", interface_name, "band", band_str); uci_set_wireless_interface_option(UCI_AGENT, agent_section, "ifname", @@ -801,7 +807,7 @@ int uci_apply_m2(struct agent_config *cfg, char *interface_name, char *device, char disallow_str[2] = {0}; snprintf(disallow_str, sizeof(disallow_str), "%d", - ((mapie >> 2) & 0x03)); + ((out->mapie >> 2) & 0x03)); uci_set_wireless_interface_option(UCI_AGENT, agent_section, "ifname", interface_name, @@ -837,9 +843,9 @@ int uci_apply_m2(struct agent_config *cfg, char *interface_name, char *device, uci_set_wireless_interface_option(UCI_WIRELESS, UCI_WLAN_IFACE, "ifname", interface_name, "multi_ap", multiap_str); uci_set_wireless_interface_option(UCI_WIRELESS, UCI_WLAN_IFACE, "ifname", - interface_name, "multi_ap_backhaul_key", bk_key); + interface_name, "multi_ap_backhaul_key", out->bk_key); uci_set_wireless_interface_option(UCI_WIRELESS, UCI_WLAN_IFACE, "ifname", - interface_name, "multi_ap_backhaul_ssid", bk_ssid); + interface_name, "multi_ap_backhaul_ssid", out->bk_ssid); uci_set_wireless_interface_option(UCI_WIRELESS, UCI_WLAN_IFACE, "ifname", interface_name, "ieee80211k", "1"); uci_set_wireless_interface_option(UCI_WIRELESS, UCI_WLAN_IFACE, "ifname", diff --git a/src/core/config.h b/src/core/config.h index 43e6dedc8d9bb9ddb78aa0d0131077bb540cedc7..04e132a986c1383ce407f66d2455c254f0219d06 100644 --- a/src/core/config.h +++ b/src/core/config.h @@ -257,10 +257,7 @@ void clean_fh(struct netif_fhcfg *p); int clean_all_fh(struct agent_config *cfg); int uci_apply_m2(struct agent_config *cfg, char *interface_name, char *device, - uint8_t *ssid, uint16_t auth_type, uint16_t encryption_type, - uint8_t *network_key, uint8_t mapie, uint8_t band, - uint8_t *bridge, uint8_t *proto, uint8_t vid, uint32_t br_ip, - uint8_t *bk_ssid, uint8_t *bk_key, bool onboaded); + struct wps_credential *out, bool onboarded); int uci_apply_wps_credentials(struct agent_config *cfg, enum wifi_band band); int wifi_reorder_interfaces_by_device(struct agent_config *ac, struct uci_context *ctx, struct uci_package *pkg, char *device); diff --git a/src/utils/debug.c b/src/utils/debug.c index 061df0a5785187ce36f6c08849b1318874349ebc..ce64d69bed72e2e7bb477a158a6b52fe1361c599 100644 --- a/src/utils/debug.c +++ b/src/utils/debug.c @@ -21,8 +21,6 @@ #include "utils.h" #include "debug.h" -#include <map1905/map2.h> -#include <map1905/maputils.h> static int ffd, tfd; extern const char *outfile_path; @@ -142,82 +140,86 @@ void dump(unsigned char *buf, int len, char *label) // TODO: duplicate of start_logging void start_test_logging(void) { - if (!testfile) { - if (testfile_path) { - if (usefifo) { - struct stat st; - int rfd; - - if (stat(testfile_path, &st)) - unlink(testfile_path); - - mkfifo(testfile_path, 0600); - if (stat(testfile_path, &st) == -1 || - !S_ISFIFO(st.st_mode)) - return; - - rfd = open(testfile_path, - O_RDONLY | O_NONBLOCK); - if (rfd) { - tfd = open(testfile_path, - O_WRONLY | O_NONBLOCK); - close(rfd); - } - } else { - testfile = fopen(testfile_path, "w+"); - } - } else { - testfile = stderr; - } - } + return; +// if (!testfile) { +// if (testfile_path) { +// if (usefifo) { +// struct stat st; +// int rfd; +// +// if (stat(testfile_path, &st)) +// unlink(testfile_path); +// +// mkfifo(testfile_path, 0600); +// if (stat(testfile_path, &st) == -1 || +// !S_ISFIFO(st.st_mode)) +// return; +// +// rfd = open(testfile_path, +// O_RDONLY | O_NONBLOCK); +// if (rfd) { +// tfd = open(testfile_path, +// O_WRONLY | O_NONBLOCK); +// close(rfd); +// } +// } else { +// testfile = fopen(testfile_path, "w+"); +// } +// } else { +// testfile = stderr; +// } +// } } void stop_test_logging(void) { - if (testfile) - fclose(testfile); - - if (tfd) { - close(tfd); - unlink(testfile_path); - } + return; +// if (testfile) +// fclose(testfile); +// +// if (tfd) { +// close(tfd); +// unlink(testfile_path); +// } } void log_test(int level, void *var, int len) { - char *bstr; - - if (level > verbose) - return; - - bstr = calloc(1, (len * 2) + 1); - if (!bstr) - return; - - btostr(var, len, bstr); - - fprintf(testfile, "%s\n", bstr); - fflush(testfile); - free(bstr); + return; +// char *bstr; +// +// if (level > verbose) +// return; +// +// bstr = calloc(1, (len * 2) + 1); +// if (!bstr) +// return; +// +// btostr(var, len, bstr); +// +// fprintf(testfile, "%s\n", bstr); +// fflush(testfile); +// free(bstr); } void log_cmdu(int level, void *var) { - struct cmdu_cstruct *cmdu = (struct cmdu_cstruct *) var; - int i; - - if (level > verbose) - return; - - for (i = 0; i < cmdu->num_tlvs; i++) { - uint16_t len; - uint8_t *btlv; - - btlv = map_put_tlv_cstruct(cmdu->tlvs[i], &len); - if (!btlv) - continue; - - log_test(level, btlv, len); - free(btlv); - } + return; +// struct cmdu_cstruct *cmdu = (struct cmdu_cstruct *) var; +// int i; +// +// if (level > verbose) +// return; +// +// for (i = 0; i < cmdu->num_tlvs; i++) { +// uint16_t len; +// uint8_t *btlv; +// +// btlv = map_put_tlv_cstruct(cmdu->tlvs[i], &len); +// if (!btlv) +// continue; +// +// log_test(level, btlv, len); +// free(btlv); +// } }