Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • multi-ap/map-controller
1 result
Select Git revision
Show changes
Commits on Source (7)
......@@ -14,15 +14,10 @@ config ap
option type 'fronthaul'
config vlan 'lan'
option network 'lan'
option id '1'
option proto 'static'
option ipaddr '192.168.1.1'
config interface 'lan'
option proto 'dhcp'
config vlan 'guest'
option network 'guest'
option id '2'
config interface 'guest'
option proto 'static'
option ipaddr '10.0.1.1'
......@@ -33,6 +28,7 @@ config ap
option ssid 'map-net5'
option vid '1'
option type 'fronthaul'
option network 'lan'
config ap
option band '5'
......@@ -41,6 +37,7 @@ config ap
option ssid 'map-bkhaul-5'
option vid '1'
option type 'backhaul'
option network 'lan'
config ap
option band '2'
......@@ -49,6 +46,7 @@ config ap
option ssid 'map-backhaul-2'
option vid '2'
option type 'fronthaul'
option network 'lan'
config ap
option band '5'
......@@ -59,8 +57,9 @@ config ap
# option multi_ap_backhaul_sta '1' # possible future TODO
# option multi_ap_backhaul_key 'multiap_key123' # possible future TODO
# option multi_ap_backhaul_ssid 'MultiAP-0022077E9CD6' # possible future TODO
option disallow_bsta '1' # bitmap, 1 for disallow p1, 2 to disallow p2, 3 to disallow both (probably never applicable)
list disallow_bsta '1' # bitmap, 1 for disallow p1, 2 to disallow p2, 3 to disallow both (probably never applicable)
option vid '1'
option network 'lan'
config ap
option band '2'
......@@ -73,6 +72,7 @@ config ap
# option multi_ap_backhaul_ssid 'MultiAP-0022077E9CD6' # possible future TODO
option disallow_bsta '0' # 0 or 1 profile-1 bSTA
option vid '1'
option network 'lan'
config policy 'policy'
list steer_exclude '00:11:22:33:44:55'
......
......@@ -15,7 +15,6 @@
#include <easy/easy.h>
#include "utils.h"
#include "debug.h"
#include "hlist.h"
#include "allsta.h"
/* hash table of all active stas in the network */
......
......@@ -41,7 +41,6 @@
#include "config.h"
#include "cntlr.h"
#include "comm.h"
#include "hlist.h"
#include "allsta.h"
#include "cntlr_ubus.h"
#include "cntlr_map.h"
......
......@@ -431,11 +431,32 @@ int handle_ap_autoconfig_search(void *cntlr, struct cmdu_buff *rx_cmdu)
}
if (c->state == CNTLR_INIT) {
uint32_t uci_obj;
int ret;
trace("Disable and exit\n");
set_value_by_string("mapcontroller",
"controller",
"enabled", "0",
UCI_TYPE_STRING);
ret = ubus_lookup_id(c->ubus_ctx, "uci", &uci_obj);
if (!ret) {
struct blob_buf bb = {0};
blob_buf_init(&bb, 0);
blobmsg_add_string(&bb, "config",
"mapcontroller");
ret = ubus_invoke(c->ubus_ctx, uci_obj,
"commit", bb.head,
NULL, NULL,
2 * 1000);
if (ret)
err("Failed to get 'commit' (ret = %d), exit anyway\n",
ret);
blob_buf_free(&bb);
}
exit(0);
} else {
char data[128] = {0};
......
......@@ -31,7 +31,6 @@
#include "debug.h"
#include "config.h"
#include "cntlr.h"
#include "hlist.h"
#include "allsta.h"
#include "cntlr_map.h"
#include "cntlr_ubus.h"
......@@ -625,143 +624,140 @@ static int cntlr_client_steering(struct ubus_context *ctx, struct ubus_object *o
struct ubus_request_data *req, const char *method,
struct blob_attr *msg)
{
// struct blob_attr *tb[__STEERING_POLICY_MAX];
// struct controller *c = container_of(obj, struct controller, obj);
// char agent[18] = {0};
// char bss_id[18] = {0};
// char sta_id[30][18] = {0};
// char sta_multi_id[30][18] = {0};
// char target_bbsid[30][18] = {0};
// char target_bbsid_multi[30][18] = {0};
// char to_id[18] = {0};
// uint32_t timeout = 0;
// uint32_t sta_nr = 0, bssid_nr = 0, sta_multi_nr = 0, bssid_multi_nr = 0;
// uint32_t request_mode = 0, request_mode_present = -1;
// uint32_t sta_present = -1, sta_multi_present = -1, bssid_present = -1;
// uint32_t target_bssid_present = -1, target_bssid_multi_present = -1;
// struct blob_attr *cur;
// int rem, l = 0, ret;
// uint32_t steer_timeout = 0, btm_timeout = 0;
// struct cmdu_buff *cmdu;
// uint16_t mid = 0;
//
// cmdu = cmdu_alloc_simple(CMDU_CLIENT_STEERING_REQUEST, &mid);
// if (!cmdu) {
// dbg("%s: -ENOMEM\n", __func__);
// return UBUS_STATUS_UNKNOWN_ERROR;
// }
//
// blobmsg_parse(client_steering_policy_params, __STEERING_POLICY_MAX, tb,
// blob_data(msg), blob_len(msg));
//
// if (tb[STEERING_POLICY_AGENT]) {
// strncpy(agent, blobmsg_data(tb[STEERING_POLICY_AGENT]),
// sizeof(agent) - 1);
// if (!hwaddr_aton(agent, cmdu->origin))
// goto fail_cmdu;
// }
//
// if (tb[STEERING_POLICY_FROM_BSSID]) {
// strncpy(bss_id, blobmsg_data(tb[STEERING_POLICY_FROM_BSSID]),
// sizeof(bss_id) - 1);
// bssid_present = 1;
// }
//
// if (tb[STEERING_POLICY_STA]) {
// sta_present = 1;
// sta_nr = blobmsg_check_array(tb[STEERING_POLICY_STA],
// BLOBMSG_TYPE_STRING);
// l = 0;
// blobmsg_for_each_attr(cur, tb[STEERING_POLICY_STA], rem)
// strncpy(sta_id[l++], blobmsg_get_string(cur), 18);
// }
//
// if (tb[STEERING_POLICY_TARGET_BSSID]) {
// target_bssid_present = 1;
// bssid_nr = blobmsg_check_array(tb[STEERING_POLICY_TARGET_BSSID],
// BLOBMSG_TYPE_STRING);
// l = 0;
// blobmsg_for_each_attr(cur, tb[STEERING_POLICY_TARGET_BSSID], rem)
// strncpy(target_bbsid[l++], blobmsg_get_string(cur), 18);
// }
//
// if (tb[STEERING_POLICY_STEER_TIMEOUT])
// steer_timeout = (int) blobmsg_get_u32(
// tb[STEERING_POLICY_STEER_TIMEOUT]);
//
// if (tb[STEERING_POLICY_REQUEST_MODE]) {
// request_mode = blobmsg_get_bool(tb[STEERING_POLICY_REQUEST_MODE]);
// request_mode_present = 1;
// }
//
// if (tb[STEERING_POLICY_BTM_TIMEOUT])
// btm_timeout = (int) blobmsg_get_u32(tb[STEERING_POLICY_BTM_TIMEOUT]);
//
//#if PROFILE2
//
// if (tb[STEERING_POLICY_TARGET_BSSID_MULTIBAND]) {
// target_bssid_multi_present = 1;
// bssid_multi_nr = blobmsg_check_array(
// tb[STEERING_POLICY_TARGET_BSSID_MULTIBAND],
// BLOBMSG_TYPE_INT32);
// l = 0;
// blobmsg_for_each_attr(cur,
// tb[STEERING_POLICY_TARGET_BSSID_MULTIBAND], rem)
// strncpy(target_bbsid_multi[l++],
// blobmsg_get_string(cur), 18);
// }
//
// if (tb[STEERING_POLICY_STA_MULTIBAND]) {
// sta_multi_present = 1;
// sta_multi_nr = blobmsg_check_array(tb[STEERING_POLICY_STA_MULTIBAND],
// BLOBMSG_TYPE_INT32);
// l = 0;
// blobmsg_for_each_attr(cur, tb[STEERING_POLICY_STA_MULTIBAND], rem)
// strncpy(sta__multi_id[l++], blobmsg_get_string(cur), 18);
// }
//
//#endif
//
// if (bssid_present == 1 && request_mode_present == 1) {
// trace("values are requestmode %d timeout %d sta_cnt %d bssid_nr %d\n",
// request_mode, timeout, sta_nr,
// bssid_nr);
//
// /* Client Steering Request TLV */
// ret = cntlr_gen_steer_request(c, cmdu,
// MAP_TLV_STEERING_REQUEST, bss_id,
// steer_timeout, sta_nr, sta_id, bssid_nr,
// target_bbsid, request_mode);
// if (ret)
// goto fail_cmdu;
// }
//
//#if PROFILE2
//
// //Here we need to add tlv for 17.2.57
// if (bssid_present == 1 && request_mode_present != 1 &&
// (target_bssid_multi_present != -1 ||
// sta_multi_present != -1)) {
//
// /* Client Steering Request TLV 17.2.57 */
// ret = cntlr_gen_steer_request(c, cmdu,
// MAP_TLV_PROFILE2_STEERING_REQ, bss_id,
// steer_timeout, sta_multi_nr, sta_multi_id,
// bssid_multi_nr, target_bbsid_multi, request_mode);
// if (ret)
// goto fail_cmdu;
// }
//
//#endif
//
// cmdu_put_eom(cmdu);
// send_cmdu(c, cmdu);
// cmdu_free(cmdu);
//
// return UBUS_STATUS_OK;
//
//fail_cmdu:
// cmdu_free(cmdu);
struct blob_attr *tb[__STEERING_POLICY_MAX];
struct controller *c = container_of(obj, struct controller, obj);
uint8_t agent[6] = {0};
uint8_t bss_id[6] = {0};
uint8_t sta_id[18][6] = {0};
uint8_t sta_multi_id[18][6] = {0};
uint8_t target_bbsid[18][6] = {0};
uint8_t target_bbsid_multi[18][6] = {0};
uint32_t timeout = 0;
uint32_t sta_nr = 0, bssid_nr = 0, sta_multi_nr = 0, bssid_multi_nr = 0;
uint32_t request_mode = 0, request_mode_present = -1;
uint32_t sta_present = -1, sta_multi_present = -1, bssid_present = -1;
uint32_t target_bssid_present = -1, target_bssid_multi_present = -1;
struct blob_attr *cur;
int rem, l = 0, ret;
uint32_t steer_timeout = 0, btm_timeout = 0;
struct cmdu_buff *cmdu;
uint16_t mid = 0;
cmdu = cmdu_alloc_simple(CMDU_CLIENT_STEERING_REQUEST, &mid);
if (!cmdu) {
dbg("%s: -ENOMEM\n", __func__);
return UBUS_STATUS_UNKNOWN_ERROR;
}
blobmsg_parse(client_steering_policy_params, __STEERING_POLICY_MAX, tb,
blob_data(msg), blob_len(msg));
if (tb[STEERING_POLICY_AGENT])
hwaddr_aton(blobmsg_get_string(tb[STEERING_POLICY_AGENT]), cmdu->origin);
if (tb[STEERING_POLICY_FROM_BSSID]) {
hwaddr_aton(blobmsg_get_string(tb[STEERING_POLICY_FROM_BSSID]), bss_id);
bssid_present = 1;
}
if (tb[STEERING_POLICY_STA]) {
sta_present = 1;
sta_nr = blobmsg_check_array(tb[STEERING_POLICY_STA],
BLOBMSG_TYPE_STRING);
l = 0;
blobmsg_for_each_attr(cur, tb[STEERING_POLICY_STA], rem) {
hwaddr_aton(blobmsg_get_string(cur), sta_id[l++]);
}
}
if (tb[STEERING_POLICY_TARGET_BSSID]) {
target_bssid_present = 1;
bssid_nr = blobmsg_check_array(tb[STEERING_POLICY_TARGET_BSSID],
BLOBMSG_TYPE_STRING);
l = 0;
blobmsg_for_each_attr(cur, tb[STEERING_POLICY_TARGET_BSSID], rem) {
hwaddr_aton(blobmsg_get_string(cur), target_bbsid[l++]);
}
}
if (tb[STEERING_POLICY_STEER_TIMEOUT])
steer_timeout = (int) blobmsg_get_u32(tb[STEERING_POLICY_STEER_TIMEOUT]);
if (tb[STEERING_POLICY_REQUEST_MODE]) {
request_mode = blobmsg_get_bool(tb[STEERING_POLICY_REQUEST_MODE]);
request_mode_present = 1;
}
if (tb[STEERING_POLICY_BTM_TIMEOUT])
btm_timeout = (int) blobmsg_get_u32(tb[STEERING_POLICY_BTM_TIMEOUT]);
#if PROFILE2
if (tb[STEERING_POLICY_TARGET_BSSID_MULTIBAND]) {
target_bssid_multi_present = 1;
bssid_multi_nr = blobmsg_check_array(
tb[STEERING_POLICY_TARGET_BSSID_MULTIBAND],
BLOBMSG_TYPE_INT32);
l = 0;
blobmsg_for_each_attr(cur, tb[STEERING_POLICY_TARGET_BSSID_MULTIBAND], rem) {
hwaddr_aton(blobmsg_get_string(cur), target_bbsid_multi[l++]);
}
}
if (tb[STEERING_POLICY_STA_MULTIBAND]) {
sta_multi_present = 1;
sta_multi_nr = blobmsg_check_array(tb[STEERING_POLICY_STA_MULTIBAND],
BLOBMSG_TYPE_INT32);
l = 0;
blobmsg_for_each_attr(cur, tb[STEERING_POLICY_STA_MULTIBAND], rem) {
hwaddr_aton(blobmsg_get_string(cur), target_bbsid_multi[l++]);
}
}
#endif
dbg("bssid presne t %d req mode pres %d\n", bssid_present, request_mode_present);
if (bssid_present == 1 && request_mode_present == 1) {
trace("values are requestmode %d timeout %d sta_cnt %d bssid_nr %d\n",
request_mode, timeout, sta_nr,
bssid_nr);
/* Client Steering Request TLV */
ret = cntlr_gen_steer_request(c, cmdu,
MAP_TLV_STEERING_REQUEST, bss_id,
steer_timeout, sta_nr, sta_id, bssid_nr,
target_bbsid, request_mode);
if (ret)
goto fail_cmdu;
}
#if PROFILE2
//Here we need to add tlv for 17.2.57
if (bssid_present == 1 && request_mode_present != 1 &&
(target_bssid_multi_present != -1 ||
sta_multi_present != -1)) {
/* Client Steering Request TLV 17.2.57 */
ret = cntlr_gen_steer_request(c, cmdu,
MAP_TLV_PROFILE2_STEERING_REQ, bss_id,
steer_timeout, sta_multi_nr, sta_multi_id,
bssid_multi_nr, target_bbsid_multi, request_mode);
if (ret)
goto fail_cmdu;
}
#endif
cmdu_put_eom(cmdu);
send_cmdu(c, cmdu);
cmdu_free(cmdu);
return UBUS_STATUS_OK;
fail_cmdu:
cmdu_free(cmdu);
return UBUS_STATUS_UNKNOWN_ERROR;
}
......@@ -2180,7 +2176,7 @@ int cntlr_publish_object(struct controller *c, const char *objname)
channel_select_policy_params),
UBUS_METHOD("reconfig_ap", cntlr_reconfig_ap,
reconfig_policy_params),
UBUS_METHOD("client_steering", cntlr_client_steering,
UBUS_METHOD("steer", cntlr_client_steering,
client_steering_policy_params),
UBUS_METHOD("client_assoc_cntlr", client_assoc_cntlr,
client_assoc_cntrl_policy_config_params),
......
......@@ -598,10 +598,10 @@ static int cntlr_config_get_credentials(struct controller_config *c,
if (tb[CRED_TYPE]) {
const char *type = tb[CRED_TYPE]->v.string;
if (!strcmp(type, "fronthaul")) {
if (!strcmp(type, "backhaul")) {
cred->multi_ap = 1;
cred->mode = AP_WIFI_BBSS;
} else if (!strcmp(type, "backhaul")) {
} else if (!strcmp(type, "fronthaul")) {
cred->multi_ap = 2;
cred->mode = AP_WIFI_FBSS;
} else if (!strcmp(type, "combined")) {
......@@ -620,7 +620,7 @@ static int cntlr_config_get_credentials(struct controller_config *c,
struct uci_element *x;
uci_foreach_element(&tb[CRED_D_BSTA]->v.list, x)
cred->disallow_bsta |= atoi(tb[CRED_D_BSTA]->v.string);
cred->disallow_bsta |= atoi(x->name);
}
if (tb[CRED_ENABLED])
......
/*
* hlist.h - stripped down version of hash list implementation using
* singly linked list.
* Doubly linked list is wastage of space for big hash-tables. If cost of
* iterating a hash list is significant, it means the hash function is NOT
* formulated well and should be revisited.
*
* Copyright (C) 2019 IOPSYS Software Solutions AB. All rights reserved.
*
* Author: anjan.chanda@iopsys.eu
*
*/
#ifndef _HLIST_H
#define _HLIST_H
struct hlist_node {
struct hlist_node *next;
};
struct hlist_head {
struct hlist_node *first;
};
#define HLIST_HEAD_INIT(name) { &(name) }
#define HLIST_HEAD(name) struct hlist_head name = HLIST_HEAD_INIT(name)
static inline void INIT_HLIST_HEAD(struct hlist_head *h)
{
h->first = NULL;
}
static inline void INIT_HLIST_NODE(struct hlist_node *n)
{
n->next = NULL;
}
static inline int hlist_empty(const struct hlist_head *h)
{
return !h->first;
}
static inline void __hlist_del(struct hlist_node *prev, struct hlist_node *n)
{
prev->next = n->next;
n->next = NULL;
}
static inline void hlist_del(struct hlist_node *n, struct hlist_head *h)
{
struct hlist_node *p;
if (h->first == n) {
h->first = NULL;
n->next = NULL;
return;
}
for (p = h->first; p; p = p->next) {
if (p->next == n)
__hlist_del(p, n);
}
}
static inline void _hlist_add(struct hlist_node *_new, struct hlist_head *h)
{
_new->next = h->first;
h->first = _new;
}
static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
{
_hlist_add(n, h);
}
#define hlist_for_each(pos, head) \
for (pos = (head)->first; pos ; pos = pos->next)
#define hlist_for_each_safe(pos, n, head) \
for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \
pos = n)
#define hlist_entry(ptr, type, member) container_of(ptr, type, member)
#define hlist_entry_safe(ptr, type, member) \
({ typeof(ptr) ____ptr = (ptr); \
____ptr ? hlist_entry(____ptr, type, member) : NULL; \
})
#define hlist_for_each_entry(pos, head, member) \
for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member); \
pos; \
pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))
#define hlist_for_each_entry_safe(pos, n, head, member) \
for (pos = hlist_entry_safe((head)->first, typeof(*pos), member); \
pos && ({ n = pos->member.next; 1; }); \
pos = hlist_entry_safe(n, typeof(*pos), member))
#endif /* _HLIST_H */