From 2aae137f0e61a6ad0d0a241aacf24385fa2a32e7 Mon Sep 17 00:00:00 2001
From: Jakob Olsson <jakob.olsson@iopsys.eu>
Date: Mon, 10 May 2021 16:31:23 +0200
Subject: [PATCH] map-controller: autoconf misc fixes
---
src/core/cntlr_cmdu_generator.c | 2 +-
src/core/cntlr_map.c | 5 +-
src/core/cntlr_tlv_generator.c | 98 ++++++++++++---------------------
src/core/cntlr_tlv_generator.h | 3 +-
src/core/config.c | 2 +-
5 files changed, 41 insertions(+), 69 deletions(-)
diff --git a/src/core/cntlr_cmdu_generator.c b/src/core/cntlr_cmdu_generator.c
index 4f4d5a6f..a3c60842 100644
--- a/src/core/cntlr_cmdu_generator.c
+++ b/src/core/cntlr_cmdu_generator.c
@@ -616,7 +616,7 @@ struct cmdu_buff *cntlr_gen_ap_autoconfig_wsc(struct controller *c,
if (ret)
goto out;
- ret = cntlr_gen_traffic_sep_policy(c, resp);
+ ret = cntlr_gen_traffic_sep_policy(c, resp, e_band);
if (ret)
goto out;
diff --git a/src/core/cntlr_map.c b/src/core/cntlr_map.c
index 07475bf1..42943f66 100644
--- a/src/core/cntlr_map.c
+++ b/src/core/cntlr_map.c
@@ -49,6 +49,7 @@
#include "cntlr_ubus.h"
#include "cntlr_map_debug.h"
+#include "cntlr_cmdu_generator.h"
#include "cntlr_tlv_generator.h"
int verbose;
@@ -240,8 +241,8 @@ int handle_ap_autoconfig_search(void *cntlr, struct cmdu_buff *rec_cmdu)
if (!hwaddr_ntoa(aladdr_origin, mac_str))
return -1;
- for (i = 0; i < tv[3][0]->data[0]; i++) {
- if (tv[3][0]->data[(i+1)] != SUPPORTED_SERVICE_MULTIAP_AGENT)
+ for (i = 1; i <= tv[3][0]->data[0]; i++) {
+ if (tv[3][0]->data[i] != SUPPORTED_SERVICE_MULTIAP_AGENT)
continue;
ret = cntlr_config_add_agent(&c->cfg, mac_str);
diff --git a/src/core/cntlr_tlv_generator.c b/src/core/cntlr_tlv_generator.c
index 984ce596..c3e184a6 100644
--- a/src/core/cntlr_tlv_generator.c
+++ b/src/core/cntlr_tlv_generator.c
@@ -137,14 +137,16 @@ int cntlr_gen_8021q_settings(struct controller *c, struct cmdu_buff *frm,
// return p;
}
-int cntlr_gen_traffic_sep_policy(struct controller *c, struct cmdu_buff *frm)
+int cntlr_gen_traffic_sep_policy(struct controller *c, struct cmdu_buff *frm,
+ uint8_t *band)
{
struct tlv *t;
struct tlv_traffic_sep_policy *data;
int ret, i = 0;
struct iface_credential *cred;
+ uint8_t *ptr;
- t = cmdu_reserve_tlv(frm, 256);
+ t = cmdu_reserve_tlv(frm, 512);
if (!t)
return -1;
@@ -152,35 +154,53 @@ int cntlr_gen_traffic_sep_policy(struct controller *c, struct cmdu_buff *frm)
t->len = 1;
data = (struct tlv_traffic_sep_policy *) t->data;
- data->num_ssid = c->cfg.num_fh + c->cfg.num_bk;
+ data->num_ssid = 0;
+
+ ptr = data + 1;
list_for_each_entry(cred, &c->cfg.fhlist, list) {
- int len;
+ uint8_t len;
- t->len++; /* vlanid */
- data->ssid[i].vid = cred->vlanid;
+ if (cred->band != band)
+ continue;
t->len++; /* len */
len = strlen((char *)cred->ssid);
- data->ssid[i].info.len = len;
+ *ptr = len;
+ ptr++;
t->len += len; /* ssid */
- memcpy(data->ssid[i].info.ssid, cred->ssid, len);
+ memcpy(ptr, cred->ssid, len);
+ ptr += len;
+
+ t->len += 2; /* vid */
+ buf_put_be16(ptr, cred->vlanid);
+ ptr += 2;
+
+ data->num_ssid++;
i++;
}
list_for_each_entry(cred, &c->cfg.bklist, list) {
- int len;
+ uint8_t len;
- t->len++; /* vlanid */
- data->ssid[i].vid = cred->vlanid;
+ if (cred->band != band)
+ continue;
t->len++; /* len */
len = strlen((char *)cred->ssid);
- data->ssid[i].info.len = len;
+ *ptr = len;
+ ptr++;
t->len += len; /* ssid */
- memcpy(data->ssid[i].info.ssid, cred->ssid, len);
+ memcpy(ptr, cred->ssid, len);
+ ptr += len;
+
+ t->len += 2; /* vid */
+ buf_put_be16(ptr, cred->vlanid);
+ ptr += 2;
+
+ data->num_ssid++;
i++;
}
@@ -190,41 +210,7 @@ int cntlr_gen_traffic_sep_policy(struct controller *c, struct cmdu_buff *frm)
return -1;
}
- dbg("%s %d\n", __func__, __LINE__);
-
return 0;
-// struct tlv_traffic_sep_policy *p;
-// struct iface_credential *cred;
-// int i = 0;
-//
-// p = (struct tlv_traffic_sep_policy *) calloc(1, sizeof(*p));
-// if (!p)
-// return NULL;
-//
-// p->tlv_type = MAP_TLV_TRAFFIC_SEPARATION_POLICY;
-// p->nbr_ssid = c->cfg.num_fh;
-// p->data = calloc(p->nbr_ssid, sizeof(*(p->data)));
-// if (!p->data) {
-// map_free_tlv_cstruct((uint8_t *) p);
-// return NULL;
-// }
-//
-// list_for_each_entry(cred, &c->cfg.fhlist, list) {
-// int len;
-//
-// len = strlen((char *)cred->ssid);
-//
-// p->data[i].ssid_len = len;
-// p->data[i].vid = cred->vlanid;
-// p->data[i].ssid = calloc(1, len + 1);
-// if (!p->data[i].ssid)
-// continue;
-//
-// strncpy(p->data[i].ssid, (char *)cred->ssid, len);
-// i++;
-// }
-//
-// return p;
}
int cntlr_gen_wsc(struct controller *c, struct cmdu_buff *frm,
@@ -254,8 +240,6 @@ int cntlr_gen_wsc(struct controller *c, struct cmdu_buff *frm,
memcpy(cred.key, (char *)iface_cred->key, strlen((char *)iface_cred->key));
cred.keylen = strlen((char *)iface_cred->key);
- cred.iop_ext = true;
-
cred.mapie |= (iface_cred->multi_ap & 0x01) << 6;
cred.mapie |= (iface_cred->mode == AP_WIFI_BBSS ? (1 << 6) : 0);
/* fronthaul BSS */
@@ -266,24 +250,10 @@ int cntlr_gen_wsc(struct controller *c, struct cmdu_buff *frm,
/* teardown bit */
//cred.mapie |= 1 << 4;
- if (!iface_cred->br) {
- memcpy(cred.bridge, c->cfg.al_bridge, sizeof(c->cfg.al_bridge));
- } else {
- cred.vid = iface_cred->br->id;
- memcpy(cred.bridge, iface_cred->br->network,
- strlen(iface_cred->br->network));
- memcpy(cred.proto, iface_cred->br->proto,
- strlen(iface_cred->br->proto));
-
- if (!strcmp(cred.proto, "static"))
- cred.br_ip = iface_cred->br->ipaddr.addr.ip4.s_addr;
- }
- memcpy(cred.bk_ssid, iface_cred->bk_ssid, sizeof(iface_cred->bk_ssid));
- memcpy(cred.bk_key, iface_cred->bk_key, sizeof(iface_cred->bk_key));
-
wsc_build_vendor_extension(out, &olen, oui,
ATTR_BRIDGE, strlen(iface_cred->br->network), iface_cred->br->network,
ATTR_PROTO, strlen(iface_cred->br->proto), iface_cred->br->proto,
+ ATTR_BR_IP, 4, &iface_cred->br->ipaddr.addr.ip4.s_addr,
ATTR_VID, 2, &(iface_cred->br->id),
ATTR_BK_KEY, strlen(iface_cred->bk_key), iface_cred->bk_key,
ATTR_BK_SSID, strlen(iface_cred->bk_ssid), iface_cred->bk_ssid,
diff --git a/src/core/cntlr_tlv_generator.h b/src/core/cntlr_tlv_generator.h
index 3b11b524..1ea1919e 100644
--- a/src/core/cntlr_tlv_generator.h
+++ b/src/core/cntlr_tlv_generator.h
@@ -13,7 +13,8 @@
uint8_t *extract_tlv_by_type(struct cmdu_buff *cmdu, uint8_t tlv_type);
int cntlr_gen_8021q_settings(struct controller *c, struct cmdu_buff *frm,
struct agent_policy *a);
-int cntlr_gen_traffic_sep_policy(struct controller *c, struct cmdu_buff *frm);
+int cntlr_gen_traffic_sep_policy(struct controller *c, struct cmdu_buff *frm,
+ uint8_t *band);
int cntlr_gen_wsc(struct controller *c, struct cmdu_buff *frm,
struct iface_credential *iface_cred, uint8_t *msg, uint16_t msglen,
uint8_t band);
diff --git a/src/core/config.c b/src/core/config.c
index 74574a75..5f64225c 100644
--- a/src/core/config.c
+++ b/src/core/config.c
@@ -523,7 +523,7 @@ static int cntlr_config_get_credentials(struct controller_config *c,
strncpy((char *) cred->key, tb[CRED_KEY]->v.string, 64);
if (tb[CRED_VLAN])
- cred->vlanid = atoi(tb[CRED_VLAN]->v.string);
+ cred->vlanid = (uint16_t) atoi(tb[CRED_VLAN]->v.string);
if (tb[CRED_MAP])
cred->multi_ap = atoi(tb[CRED_MAP]->v.string);
--
GitLab