diff --git a/src/cntlr_cmdu.c b/src/cntlr_cmdu.c index baa8a9af2bc3be904ba340edc2ce783b579e4e3e..4daa204cb54196a33f2683da2fcc334d73c69ae7 100644 --- a/src/cntlr_cmdu.c +++ b/src/cntlr_cmdu.c @@ -665,6 +665,14 @@ struct cmdu_buff *cntlr_gen_ap_autoconfig_wsc(struct controller *c, if (ret == 1) cntlr_gen_wsc(c, resp, NULL, msg, msglen, e_band, e_auth); +#if (EASYMESH_VERSION >= 6) + if (e_band == BAND_6) { + ret = cntlr_gen_eht_operations(c, b, resp); + if (ret) + goto out; + } +#endif + hwaddr_ntoa(radio_id, macstr); hwaddr_ntoa(rx_cmdu->origin, alidstr); if (e_band == BAND_2) diff --git a/src/cntlr_tlv.c b/src/cntlr_tlv.c index 23609f3fd2bd78bb0a3a856b348cb472c9c4f9f6..54102326681c8eaa0555f8a27da0cf575a3c3e79 100644 --- a/src/cntlr_tlv.c +++ b/src/cntlr_tlv.c @@ -2050,3 +2050,99 @@ int cntlr_gen_agent_list_tlv(struct controller *c, struct cmdu_buff *frm, uint8_ return 0; } #endif /* EASYMESH_VERSION > 2 */ + +#if (EASYMESH_VERSION > 5) + +int cntlr_gen_eht_operations(struct controller *c, struct node *n, + struct cmdu_buff *frm) +{ + struct tlv *t; + int offset = 0; + uint32_t precalc_len = 0; + struct netif_iface *p = NULL; + struct netif_radio *r = NULL; + + if (!n) + return -1; + + list_for_each_entry(r, &n->radiolist, list) { + precalc_len += (6 + 1 + 25) * sizeof(uint8_t); + list_for_each_entry(p, &r->iflist, list) { + precalc_len += (6 + 1 + 4 + 1 + 1 + 1 + 2 + 16) * sizeof(uint8_t); + } + } + + t = cmdu_reserve_tlv(frm, precalc_len); + if (!t) + return -1; + + t->type = MAP_TLV_EHT_OPERATIONS; + t->len = 0; + + t->data[offset] = a->num_radios; + offset += sizeof(uint8_t); + + list_for_each_entry(r, &n->radiolist, list) { + uint8_t *num_bss; + + /* radio mac */ + memcpy(&t->data[offset], r->radio_el->macaddr, 6); + offset += 6 * sizeof(uint8_t); + + num_bss = &t->data[offset]; + *num_bss = 0; + + offset += sizeof(uint8_t); + + list_for_each_entry(p, &r->iflist, list) { + (*num_bss)++; + + /* BSSID */ + memcpy(&t->data[offset], p->bss->bssid, 6); + offset += 6 * sizeof(uint8_t); + + /* flag1 */ + t->data[offset] = 0; + offset += sizeof(uint8_t); + + /* mcs_nss */ + memset(&t->data[offset], 0, 4 * sizeof(uint8_t)); + offset += 4 * sizeof(uint8_t); + + /* control */ + t->data[offset] = 0; + offset += sizeof(uint8_t); + + /* ccfs0 */ + t->data[offset] = 0; + offset += sizeof(uint8_t); + + /* ccfs1 */ + t->data[offset] = 0; + offset += sizeof(uint8_t); + + /* disabled_subchannel[0, 1] */ + t->data[offset] = 0; + t->data[offset + 1] = 0; + offset += 2 * sizeof(uint8_t); + + /* reserved for bss */ + memset(&t->data[offset], 0, 16 * sizeof(uint8_t)); + offset += 16 * sizeof(uint8_t); + } + + /* reserved for radio */ + memset(&t->data[offset], 0, 25 * sizeof(uint8_t)); + offset += 25 * sizeof(uint8_t); + } + + t->len = offset; + ret = cmdu_put_tlv(frm, t); + if (ret) { + err("%s: error: cmdu_put_tlv()\n", __func__); + return -1; + } + + return 0; +} +#endif diff --git a/src/cntlr_tlv.h b/src/cntlr_tlv.h index f0d42edcd6b1b512de2a4f757ecb9635fc394de6..e72c175b11a5f8d95bfb3fd9692a1f7bb373f697 100644 --- a/src/cntlr_tlv.h +++ b/src/cntlr_tlv.h @@ -185,4 +185,9 @@ struct cmdu_buff * cntrl_gen_channel_sel_request(struct controller *c, uint8_t *agent, uint8_t *radio_id, struct wifi_radio_opclass *opclass); +#if (EASYMESH_VERSION >= 6) +int cntlr_gen_eht_operations(struct controller *c, struct node *n, + struct cmdu_buff *frm); +#endif + #endif /* CNTLR_TLV_GEN_H */