diff --git a/src/core/cntlr_cmdu_generator.c b/src/core/cntlr_cmdu_generator.c index 4f4d5a6f1a13c13020ce8d7a3f8b9f988fc24183..a3c608425b7ba4ce0848e25cbaa02b81b8b40a70 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 07475bf176df1b9e1c88dd14ed09335380754c0d..42943f66395f71e72298f2fc249594dcf4e214ae 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 984ce596767190bf3f3611d764f3e6d83647960c..c3e184a676e313e70bd48b9d6fc5ff9aa41cb3ff 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 3b11b5240f382f4cb2cae08b9584f5a1c74e628f..1ea1919e5cadafd6b72e42a9ffc21fe8899f669b 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 74574a7512495bc71d4bc8509fbfaab238fe120e..5f64225c0daa39243194e24436d39862559588c2 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);