diff --git a/src/agent.c b/src/agent.c index 539e91f8a55cbebb71241347d7b7699a0eec4f74..6a7ca49caccbabe0bff3946ac65d419cff9a580f 100644 --- a/src/agent.c +++ b/src/agent.c @@ -95,7 +95,6 @@ static int agent_req_btm_steer(struct agent *a, const char *ifname, uint32_t validity_int); static void netif_free(struct netif_ap *ap); static void netif_reset(struct netif_ap *ap); -void agent_clear_bsta_mld(struct agent *a); static void bsta_steer_cb(atimer_t *t) { @@ -1462,10 +1461,10 @@ static void wifi_sta_periodic_run(atimer_t *t) { struct sta *s = container_of(t, struct sta, sta_timer); struct pref_neighbor *pref_nbr = NULL; - struct netif_ap *ap; + struct agent *a = s->agent; struct wifi_sta sta = {}; + struct netif_ap *ap; unsigned int reason; - struct agent *a = s->agent; int ret = 0; ap = agent_get_ap(a, s->bssid); @@ -1497,12 +1496,8 @@ static void wifi_sta_periodic_run(atimer_t *t) #if (EASYMESH_VERSION >= 6) } else { struct wifi_mlsta mlsta = {0}; - uint8_t *mld_macaddr = NULL; - if (s->mld) - mld_macaddr = s->mld->macaddr; - - ret = wifi_get_mld_station(ap, mld_macaddr, s->macaddr, &mlsta); + ret = wifi_get_mld_station(ap, s->mld_macaddr, s->macaddr, &mlsta); if (ret) goto rearm_periodic; @@ -1516,17 +1511,10 @@ static void wifi_sta_periodic_run(atimer_t *t) return; } - - //err("%s: mac:"MACFMT" linkbssid:"MACFMT" mlo_link_id:%d\n", - // __func__, MAC2STR(s->macaddr), - // MAC2STR(mlsta.sta[0].bssid), - // mlsta.sta[0].mlo_link_id); - - if (mlsta.mlo_capable == true - && !hwaddr_is_zero(mlsta.sta[0].bssid) - && ap->mld) { + if (mlsta.mlo_capable == true && + !hwaddr_is_zero(mlsta.sta[0].bssid)) mlsta_update_sta_mld(a, ap, &mlsta, s); - } + update_sta_entry(a, ap, &(mlsta.sta[0])); } #endif @@ -2281,6 +2269,7 @@ static uint16_t wifi_process_pvid_assoc_frame(struct agent *a, uint8_t *frame, } #define ASSOC_TIMEOUT 60 +/* TODO: add dedicated handler for each event type */ static void wifi_sta_event_handler(void *c, struct blob_attr *msg) { struct agent *a = (struct agent *)c; @@ -2341,10 +2330,8 @@ static void wifi_sta_event_handler(void *c, struct blob_attr *msg) return; ap = agent_get_ap(a, bssid); - if (!ap) { - /* could also do link-id check here? */ + if (!ap) return; - } strncpy(ifname, ap->ifname, sizeof(ifname) - 1); } #endif @@ -2354,20 +2341,21 @@ static void wifi_sta_event_handler(void *c, struct blob_attr *msg) s = wifi_add_sta(a, ifname, macaddr); else s = agent_get_sta(a, macaddr); +#else + s = agent_get_sta(a, macaddr); +#endif if (!s) { dbg("%s: Failed to add STA or STA has already disconnected\n", __func__); return; } -#endif - #if (EASYMESH_VERSION >= 6) /* Affiliated STA MAC in-case of MLO client*/ if (add && data[2] && data[3] && data[4]) { - uint8_t linkid = 0; + uint8_t mlo_link_id = 0; - linkid = (uint8_t) blobmsg_get_u32(data[4]); + mlo_link_id = (uint8_t) blobmsg_get_u32(data[4]); - if (ap && ap->mld) { + if (ap) { uint8_t mlo_bssid[6] = {0}; struct sta_mld *mld; int num_sta = 0; @@ -2378,7 +2366,13 @@ static void wifi_sta_event_handler(void *c, struct blob_attr *msg) return; mld = agent_get_stamld(a, mlo_macaddr); if (!mld) { - mld = agent_alloc_stamld(a, ap->mld, mlo_macaddr); + struct netif_mld *apmld; + + apmld = agent_get_apmld(a, ap->mld_macaddr); + if(!apmld) + return; + + mld = agent_alloc_stamld(a, apmld, mlo_macaddr); if (!mld) { err("%s: Failed to allocate MLD:"MACFMT"\n", __func__, MAC2STR(mlo_macaddr)); return; @@ -2390,13 +2384,13 @@ static void wifi_sta_event_handler(void *c, struct blob_attr *msg) /* TODO: code is copy pasted from mlsta_update_sta_mld() */ num_sta = mld->num_affiliated_sta; - s->mld = mld; + memcpy(s->mld_macaddr, mld->macaddr, 6); s->is_affiliated_sta = true; - s->mlo_link_id = linkid; + s->mlo_link_id = mlo_link_id; - if (!agent_is_sta_in_sta_mld(a, mld, macaddr) && + if (!mld_contains_sta(a, mld, macaddr) && num_sta < MAX_AFFILIATED_STA_LINKS_NUM) { - mld->affiliated_sta[num_sta] = s; + memcpy(mld->affiliated_sta[num_sta], s->macaddr, 6); mld->num_affiliated_sta++; } @@ -4490,7 +4484,7 @@ static void agent_event_handler(struct ubus_context *ctx, #endif #endif #if (EASYMESH_VERSION >= 6) - { "wifi.mld", wifi_mld_event_handler }, + { "wifi.mld", mld_event_handler }, #endif }; @@ -5546,7 +5540,7 @@ static void parse_ap(struct ubus_request *req, int type, } if (tb[12]) - ap->linkid = blobmsg_get_u32(tb[12]); + ap->mlo_link_id = blobmsg_get_u32(tb[12]); #endif if (tb[13]) { @@ -5788,7 +5782,7 @@ int agent_init_interfaces(struct agent *a) ap->enabled = false; #if (EASYMESH_VERSIN >= 6) if (ap->is_affiliated_ap) - wifi_mld_del_ap(ap); + mld_del_ap(ap); #endif } } @@ -5855,7 +5849,7 @@ int agent_init_interfaces(struct agent *a) f->mld_id); if (mldcred) { snprintf(objname, 31, "wifi.apmld.%s", mldcred->ifname); - fn_parser = parse_apmld; + fn_parser = apmld_parse; band = band_to_int(re->band); } } @@ -5886,7 +5880,7 @@ int agent_init_interfaces(struct agent *a) blob_buf_init(&bb, 0); #if (EASYMESH_VERSION >= 6) - if (band) + if (f->mld_id) blobmsg_add_u32(&bb, "band", band); #endif ubus_call_object_args(a, uobj_id, &bb, "stats", parse_ap_stats, bss); @@ -5895,7 +5889,7 @@ int agent_init_interfaces(struct agent *a) } /** if AP is gone from config free it altogether - * if AP is disabled, cancel all timers/data + * if AP is disabled, cancel all timers and clear data */ list_for_each_entry(re, &a->radiolist, list) { struct netif_ap *ap, *tmp; @@ -5947,7 +5941,7 @@ int agent_init_interfaces(struct agent *a) b->mld_id); if (mldcred) { snprintf(objname, 31, "wifi.bstamld.%s", mldcred->ifname); - bk_parser = parse_bstamld; + bk_parser = bstamld_parse; } } #endif @@ -5978,9 +5972,9 @@ int agent_init_interfaces(struct agent *a) } if (a->has_bstamld) { - /* if bsta config has gone away free bstamld */ + /* if bsta config has gone away clear bstamld */ if (!agent_get_bsta_mld_credential(&a->cfg)) - agent_clear_bsta_mld(a); + bstamld_free(a); } #endif @@ -6491,7 +6485,7 @@ void clear_sta(struct sta *s) } #if (EASYMESH_VERSION >= 6) if (s->is_affiliated_sta) - wifi_sta_mld_del_sta(s->agent, s); + mld_del_sta(s->agent, s); #endif free(s); } @@ -6547,7 +6541,7 @@ static void netif_reset(struct netif_ap *ap) #if (EASYMESH_VERSION >= 6) if (ap->is_affiliated_ap) - wifi_mld_del_ap(ap); + mld_del_ap(ap); #endif } @@ -6598,7 +6592,7 @@ void clear_bk(struct agent *a, struct netif_bk *bk) { #if (EASYMESH_VERSION >= 6) if (bk->is_affiliated_sta) - wifi_sta_mld_del_bsta(a, bk); + mld_del_bsta(a, bk); #endif memset(bk, 0, sizeof(*bk)); } @@ -7002,7 +6996,7 @@ void run_agent(void) qos_rule_free_all(&w->qos_rules); #endif #if (EASYMESH_VERSION >= 6) - agent_clear_bsta_mld(w); + bstamld_free(w); clear_apmldlist(w); #endif ubus_unregister_event_handler(ctx, &w->evh); @@ -7194,7 +7188,6 @@ int wifiagent_get_status(struct ubus_context *ctx, { struct agent *agent = this_agent; struct wifi_radio_element *re; - struct netif_ap *p = NULL; struct neighbor *n; struct blob_buf bb; void *a, *b, *c, *d, *t; @@ -7204,6 +7197,8 @@ int wifiagent_get_status(struct ubus_context *ctx, a = blobmsg_open_array(&bb, "radios"); list_for_each_entry(re, &agent->radiolist, list) { + struct netif_ap *ap = NULL; + t = blobmsg_open_table(&bb, ""); blobmsg_add_string(&bb, "name", re->name); blobmsg_add_macaddr(&bb, "macaddr", re->macaddr); @@ -7220,37 +7215,42 @@ int wifiagent_get_status(struct ubus_context *ctx, blobmsg_close_table(&bb, b); d = blobmsg_open_array(&bb, "fronthaul"); - list_for_each_entry(p, &re->aplist, list) { + list_for_each_entry(ap, &re->aplist, list) { struct sta *s; void *tt; - if (!p->cfg) + if (!ap->cfg) continue; tt = blobmsg_open_table(&bb, ""); - blobmsg_add_string(&bb, "name", p->ifname); + blobmsg_add_string(&bb, "name", ap->ifname); #if (EASYMESH_VERSION >= 6) - blobmsg_add_u8(&bb, "is_affiliated_ap", p->is_affiliated_ap); - if (p->is_affiliated_ap && p->mld) { - blobmsg_add_string(&bb, "mld_ifname", p->mld->ifname); - blobmsg_add_u32(&bb, "mlo_linkid", p->linkid); + blobmsg_add_u8(&bb, "is_affiliated_ap", ap->is_affiliated_ap); + if (ap->is_affiliated_ap) { + struct netif_mld *apmld; + + apmld = agent_get_apmld(a, ap->mld_macaddr); + if (apmld) { + blobmsg_add_string(&bb, "mld_ifname", apmld->ifname); + blobmsg_add_u32(&bb, "mlo_link_id", ap->mlo_link_id); + } } #endif - if (p->band == BAND_2) + if (ap->band == BAND_2) blobmsg_add_string(&bb, "band", "2.4GHz"); - else if (p->band == BAND_5) + else if (ap->band == BAND_5) blobmsg_add_string(&bb, "band", "5GHz"); - else if (p->band == BAND_6) + else if (ap->band == BAND_6) blobmsg_add_string(&bb, "band", "6GHz"); else blobmsg_add_string(&bb, "band", "Unknown"); - blobmsg_add_u8(&bb, "enabled", p->enabled); - blobmsg_add_macaddr(&bb, "bssid", p->bssid); - blobmsg_add_string(&bb, "ssid", p->ssid); - blobmsg_add_u32(&bb, "channel", p->channel); - blobmsg_add_u32(&bb, "load", p->bssload); - blobmsg_add_u32(&bb, "num_sta", p->num_sta); + blobmsg_add_u8(&bb, "enabled", ap->enabled); + blobmsg_add_macaddr(&bb, "bssid", ap->bssid); + blobmsg_add_string(&bb, "ssid", ap->ssid); + blobmsg_add_u32(&bb, "channel", ap->channel); + blobmsg_add_u32(&bb, "load", ap->bssload); + blobmsg_add_u32(&bb, "num_sta", ap->num_sta); b = blobmsg_open_array(&bb, "neighbor"); list_for_each_entry(n, &p->nbrlist, list) { diff --git a/src/agent.h b/src/agent.h index ba5174f9fc5228885cfc7451b46eb6cac7e5c93e..8f9b458f142eed2c0f3b97c7e9d1abcac9cecab7 100644 --- a/src/agent.h +++ b/src/agent.h @@ -318,8 +318,8 @@ struct netif_ap { #if (EASYMESH_VERSION >= 6) bool is_affiliated_ap; char mld_ifname[16]; - uint32_t linkid; - struct netif_mld *mld; + uint32_t mlo_link_id; + uint8_t mld_macaddr[6]; #endif struct wifi_bss_element bss; @@ -351,9 +351,9 @@ struct netif_bk { #if (EASYMESH_VERSION >= 6) bool is_affiliated_sta; char mld_ifname[16]; - uint32_t linkid; - struct bsta_mld *mld; - bool is_mld_netdev; + uint32_t mlo_link_id; + //struct bsta_mld *mld; + uint8_t mld_macaddr[6]; #endif /* enum netif_type iftype; */ struct agent *agent; @@ -386,7 +386,8 @@ struct sta { #if (EASYMESH_VERSION >= 6) bool is_affiliated_sta; uint8_t mlo_link_id; - struct sta_mld *mld; + //struct sta_mld *mld; + uint8_t mld_macaddr[6]; uint8_t ruid[6]; #endif uint32_t caps; /** capability bitmap */ @@ -763,7 +764,6 @@ struct wifi_sta_steer_list { #if (EASYMESH_VERSION >= 6) /* TODO: FIXME!! MUST BE MOVED TO MLD.H */ struct bsta_mld { -#define MAX_AFFILIATED_BSTA_LINKS_NUM 14 uint8_t macaddr[6]; uint8_t bssid[6]; char ifname[16]; @@ -776,7 +776,9 @@ struct bsta_mld { bool emlmr_enabled; int num_affiliated_bsta; - struct netif_bk *affiliated_bsta[MAX_AFFILIATED_BSTA_LINKS_NUM]; + //struct netif_bk *affiliated_bsta[MAX_AFFILIATED_BSTA_LINKS_NUM]; +#define MAX_AFFILIATED_BSTA_LINKS_NUM 14 + uint8_t affiliated_bsta[MAX_AFFILIATED_BSTA_LINKS_NUM][6]; struct list_head list; }; diff --git a/src/agent_map.c b/src/agent_map.c index 4eb3de3e438799358e502f32057b61d2c55235e0..0af4c2a9b6108c620633f2e3b7144a5b2576566e 100644 --- a/src/agent_map.c +++ b/src/agent_map.c @@ -2224,7 +2224,7 @@ static int mlo_process_ap_mld_config(struct agent *a, uint8_t *tlv_data) if (apcfg->mld_id) { struct netif_ap *ap; - mlo_update_id_in_configs(apcfg->name, 0); + mld_set_config_id(apcfg->name, 0); apcfg->mld_id = 0; ap = agent_get_ap_by_ifname(a, apcfg->name); if (ap) @@ -2380,7 +2380,7 @@ static int mlo_process_ap_mld_config(struct agent *a, uint8_t *tlv_data) mld_complete = true; /* Set mld_id/mld in ap/wifi-iface sections of cfg files */ - mlo_update_id_in_configs(apcfg->name, id); + mld_set_config_id(apcfg->name, id); apcfg->mld_id = id; } } @@ -2800,7 +2800,7 @@ int handle_ap_autoconfig_wsc(void *agent, struct cmdu_buff *rx_cmdu, ret = mlo_process_bsta_mld_config(a, tv[AP_AUTOCONFIGURATION_WSC_M2_BACKHAUL_STA_MLD_CONFIG_IDX][0]->data); if (ret) - wifi_teardown_map_bsta_mld(a, radio->band); + bstamld_teardown_band(a, radio->band); update_tlv_hash(a, tv[AP_AUTOCONFIGURATION_WSC_M2_BACKHAUL_STA_MLD_CONFIG_IDX][0], a->bsta_mld_cfg_sha256); a->reconfig_reason |= AGENT_RECONFIG_REASON_MLD_ID; @@ -2808,7 +2808,7 @@ int handle_ap_autoconfig_wsc(void *agent, struct cmdu_buff *rx_cmdu, } else { dbg("%s: Missing BSTA MLD config TLV, teardown\n", __func__); - wifi_teardown_map_bsta_mld(a, radio->band); + bstamld_teardown_band(a, radio->band); } #endif @@ -6697,7 +6697,7 @@ int handle_bsta_mld_config_request(void *agent, struct cmdu_buff *cmdu, struct n if (ret) { uint32_t band_all = BAND_2 | BAND_5 | BAND_6; - wifi_teardown_map_bsta_mld(a, band_all); + bstamld_teardown_band(a, band_all); } else { /* re-do all MLD configuration in case TLV has changed */ dbg("%s: MLD configuration changed, schedule reconfig\n", diff --git a/src/agent_tlv.c b/src/agent_tlv.c index 6ea3380a90465a515db61f809e37a6af9de1fcb6..66a59ddcef5c100117ae83a47b7033beac83f03c 100644 --- a/src/agent_tlv.c +++ b/src/agent_tlv.c @@ -4798,7 +4798,7 @@ int agent_gen_affiliated_ap_metrics(struct agent *a, struct cmdu_buff *frm, struct tlv *t; int ret; - if (!wifi_is_affiliated_ap(a, bss->bssid)) + if (!is_affiliated_ap(a, bss->bssid)) return 0; t = cmdu_reserve_tlv(frm, sizeof(*data)); diff --git a/src/mld.c b/src/mld.c index 961383c3838a97b3888417388f32461706ac343d..ca6253ba2f705dd5665db1430e4e921319b14f7e 100644 --- a/src/mld.c +++ b/src/mld.c @@ -6,9 +6,40 @@ #include "utils/debug.h" #include "utils/utils.h" #include "backhaul.h" -#include "agent.h" +#include "agent.h +" +void stamld_update(struct agent *a, ) +{ + mld = agent_get_stamld(a, mlsta->macaddr); + if (!mld) { + struct netif_mld *apmld; + + apmld = agent_get_apmld(a, ap->mld_macaddr); + if (!apmld) + return; + + mld = agent_alloc_stamld(a, apmld, mlsta->macaddr); + if (!mld) + return; + } + + memcpy(mld->bssid, mlsta->bssid, 6); + num_sta = mld->num_affiliated_sta; + + memcpy(s->mld_macaddr, mld->macaddr); + s->is_affiliated_sta = true; + s->mlo_link_id = mlsta->sta[0].mlo_link_id; + + if (!mld_contains_sta(a, mld, mlsta->sta[0].macaddr) && + num_sta < MAX_AFFILIATED_STA_LINKS_NUM) { + memcpy(mld->affiliated_sta[num_sta], s->macaddr, 6); + mld->num_affiliated_sta++; + } + +} + void mlsta_update_sta_mld(struct agent *a, struct netif_ap *ap, - struct wifi_mlsta *mlsta, struct sta *s) + struct wifi_mlsta *mlsta, struct sta *s) { struct sta_mld *mld; int num_sta = 0; @@ -22,7 +53,13 @@ void mlsta_update_sta_mld(struct agent *a, struct netif_ap *ap, mld = agent_get_stamld(a, mlsta->macaddr); if (!mld) { - mld = agent_alloc_stamld(a, ap->mld, mlsta->macaddr); + struct netif_mld *apmld; + + apmld = agent_get_apmld(a, ap->mld_macaddr); + if (!apmld) + return; + + mld = agent_alloc_stamld(a, apmld, mlsta->macaddr); if (!mld) return; } @@ -30,13 +67,13 @@ void mlsta_update_sta_mld(struct agent *a, struct netif_ap *ap, memcpy(mld->bssid, mlsta->bssid, 6); num_sta = mld->num_affiliated_sta; - s->mld = mld; + memcpy(s->mld_macaddr, mld->macaddr); s->is_affiliated_sta = true; s->mlo_link_id = mlsta->sta[0].mlo_link_id; - if (!agent_is_sta_in_sta_mld(a, mld, mlsta->sta[0].macaddr) && + if (!mld_contains_sta(a, mld, mlsta->sta[0].macaddr) && num_sta < MAX_AFFILIATED_STA_LINKS_NUM) { - mld->affiliated_sta[num_sta] = s; + memcpy(mld->affiliated_sta[num_sta], s->macaddr, 6); mld->num_affiliated_sta++; } @@ -46,15 +83,15 @@ void mlsta_update_sta_mld(struct agent *a, struct netif_ap *ap, } /* remove passed affiliated STA from mld */ -int wifi_sta_mld_del_sta(struct agent *a, struct sta *s) +int mld_del_sta(struct agent *a, struct sta *s) { struct sta_mld *mld; int i; - if (!s->mld) + mld = agent_get_stamld(a, s->mld_macaddr); + if (!mld) return -1; - mld = s->mld; for (i = 0; i < mld->num_affiliated_sta; i++) { int j; @@ -64,8 +101,9 @@ int wifi_sta_mld_del_sta(struct agent *a, struct sta *s) for (j = (i + 1); j < mld->num_affiliated_sta; j++) mld->affiliated_sta[j-1] = mld->affiliated_sta[j]; - mld->affiliated_sta[j] = NULL; + memset(mld->affiliated_sta[j], 0, 6) mld->num_affiliated_sta--; + break; } if (mld->num_affiliated_sta == 0) { @@ -77,38 +115,32 @@ int wifi_sta_mld_del_sta(struct agent *a, struct sta *s) } /* remove passed affiliated backhaul STA from mld */ -int wifi_sta_mld_del_bsta(struct agent *a, struct netif_bk *bk) +int mld_del_bsta(struct agent *a, struct netif_bk *bk) { struct bsta_mld *mld; int i, j; - /* bk->mld may be NULL if bSTAMLD is not connected (Eth backhaul) */ - if (!bk || bk->cfg->is_mld_netdev || !bk->mld) + if (!a->has_bstamld || bk->cfg->is_mld_netdev) return -1; - mld = bk->mld; + mld = &a->bstamld; for (i = 0; i < mld->num_affiliated_bsta; i++) { - if (!memcmp(mld->affiliated_bsta[i]->macaddr, bk->macaddr, 6)) - break; - } - - if (i == mld->num_affiliated_bsta) - return -1; + if (memcmp(mld->affiliated_bsta[i]->macaddr, bk->macaddr, 6)) + continue; - for (j = (i + 1); j < mld->num_affiliated_bsta; j++) - mld->affiliated_bsta[j-1] = mld->affiliated_bsta[j]; + for (j = (i + 1); j < mld->num_affiliated_bsta; j++) + mld->affiliated_bsta[j-1] = mld->affiliated_bsta[j]; - mld->affiliated_bsta[j] = NULL; - mld->num_affiliated_bsta--; + memset(mld->affiliated_bsta[j], 0, 6) + mld->num_affiliated_bsta--; + } - bk->mld = NULL; bk->is_affiliated_sta = false; - return 0; } /* remove passed affiliated AP from mld */ -int wifi_mld_del_ap(struct netif_ap *ap) +int mld_del_ap(struct agent *a, struct netif_ap *ap) { struct netif_mld *mld; int i; @@ -116,13 +148,9 @@ int wifi_mld_del_ap(struct netif_ap *ap) if (!ap->is_affiliated_ap) return -1; - if (!ap->mld) { - warn("|%s:%d| MLD for given netif is not assigned!\n", - __func__, __LINE__); + mld = agent_get_apmld(a, ap->mld_macaddr); + if (!mld) return -1; - } - - mld = ap->mld; for (i = 0; i < mld->num_affiliated_ap; i++) { int j; @@ -133,12 +161,11 @@ int wifi_mld_del_ap(struct netif_ap *ap) for (j = (i + 1); j < mld->num_affiliated_ap; j++) mld->affiliated_ap[j-1] = mld->affiliated_ap[j]; - mld->affiliated_ap[j] = NULL; + memset(mld->affiliated_bsta[j], 0, 6) mld->num_affiliated_ap--; } - ap->mld = NULL; - ap->is_affiliated_ap = false; + ap->is_affiliated_ap = false; return 0; } @@ -221,7 +248,7 @@ int wifi_process_ml_ie(struct agent *a, struct sta_mld *stamld, return 0; } -void wifi_mld_event_handler(void *agent, struct blob_attr *msg) +void mld_event_handler(void *agent, struct blob_attr *msg) { char ifname[16] = {0}, event[16] = {0}; struct agent *a = (struct agent *) agent; @@ -255,7 +282,7 @@ void wifi_mld_event_handler(void *agent, struct blob_attr *msg) } } -int parse_affiliated_ap(struct ubus_request *req, int type, +int mld_parse_affiliated_ap(struct ubus_request *req, int type, struct blob_attr *msg) { struct netif_ap *ap = (struct netif_ap *) req->priv; @@ -312,7 +339,7 @@ int parse_affiliated_ap(struct ubus_request *req, int type, return 0; } -void parse_apmld(struct ubus_request *req, int type, +void apmld_parse(struct ubus_request *req, int type, struct blob_attr *msg) { static const struct blobmsg_policy ap_attr[] = { @@ -383,17 +410,18 @@ void parse_apmld(struct ubus_request *req, int type, continue; } - ret = parse_affiliated_ap(req, type, link); + ret = mld_parse_affiliated_ap(req, type, link); if (ret) continue; strncpy(ap->mld_ifname, ifname, sizeof(ap->mld_ifname) - 1); + memcmpy(ap->mld_macaddr, mld->macaddr, 6); ap->is_affiliated_ap = true; strncpy(ap->ssid, ssid, sizeof(ap->ssid)); ap->enabled = true; num_ap = mld->num_affiliated_ap; - if (!agent_is_ap_in_mld(a, mld, ap->bssid) && + if (!mld_contains_ap(a, mld, ap->bssid) && num_ap < MAX_AFFILIATED_AP_LINKS_NUM) { mld->affiliated_ap[num_ap] = ap; mld->num_affiliated_ap++; @@ -417,7 +445,6 @@ void parse_apmld(struct ubus_request *req, int type, mld->ap_emlmr_enabled = true; } } - ap->mld = mld; break; } @@ -429,7 +456,7 @@ void parse_apmld(struct ubus_request *req, int type, } } -void parse_affiliated_bsta(struct agent *a, struct bsta_mld *mld, +void mld_parse_affiliated_bsta(struct agent *a, struct bsta_mld *mld, struct netif_bk *bk, int type, struct blob_attr *msg) { @@ -469,11 +496,11 @@ void parse_affiliated_bsta(struct agent *a, struct bsta_mld *mld, hwaddr_aton(blobmsg_data(data[2]), bk->bssid); num_sta = mld->num_affiliated_bsta; - bk->mld = mld; + memcpy(bk->mld_macaddr, mld->macaddr, 6); bk->is_affiliated_sta = true; - bk->linkid = link_id; + bk->mlo_link_id = link_id; - if (!agent_is_sta_in_bsta_mld(a, mld, bk->macaddr) && + if (!mld_contains_bsta(a, mld, bk->macaddr) && num_sta < MAX_AFFILIATED_STA_LINKS_NUM) { mld->affiliated_bsta[num_sta] = bk; mld->num_affiliated_bsta++; @@ -483,7 +510,7 @@ void parse_affiliated_bsta(struct agent *a, struct bsta_mld *mld, } } -void parse_bstamld(struct ubus_request *req, int type, +void bstamld_parse(struct ubus_request *req, int type, struct blob_attr *msg) { static const struct blobmsg_policy ap_attr[] = { @@ -543,7 +570,7 @@ void parse_bstamld(struct ubus_request *req, int type, memcpy(mld->bssid, bssid, 6); if (bk->cfg->is_mld_netdev && !hwaddr_is_zero(bssid)) { - bk->mld = mld; + memcpy(bk->mld_macaddr, mld->macaddr, 6); memcpy(bk->macaddr, macaddr, 6); memcpy(bk->bssid, bssid, 6); } @@ -558,13 +585,13 @@ void parse_bstamld(struct ubus_request *req, int type, continue; } - parse_affiliated_bsta(a, mld, bk, type, link); + mld_parse_affiliated_bsta(a, mld, bk, type, link); strncpy(bk->mld_ifname, ifname, sizeof(bk->mld_ifname) - 1); + memcpy(bk->mld_macaddr, mld->macaddr, 6); bk->is_affiliated_sta = true; if (ssid) strncpy(bk->ssid, ssid, sizeof(bk->ssid)); bk->enabled = true; - bk->mld = mld; } } @@ -572,6 +599,18 @@ void parse_bstamld(struct ubus_request *req, int type, bk_toggle(a, bk, bssid, 0); } +struct netif_mld *agent_get_apmld(struct agent *a, uint8_t *macaddr) +{ + struct netif_mld *mld = NULL; + + list_for_each_entry(mld, &a->apmldlist, list) { + if (!memcmp(macaddr, mld->macaddr, 6)) + return mld; + } + + return NULL; +} + struct netif_mld *agent_get_mld_by_ifname(struct agent *a, const char *ifname) { struct netif_mld *mld = NULL; @@ -609,7 +648,7 @@ struct netif_mld *agent_alloc_mld(struct agent *a, const char *ifname) } -bool agent_is_ap_in_mld(struct agent *a, struct netif_mld *mld, +bool mld_contains_ap(struct agent *a, struct netif_mld *mld, uint8_t *macaddr) { int i; @@ -622,7 +661,7 @@ bool agent_is_ap_in_mld(struct agent *a, struct netif_mld *mld, return false; } -bool agent_is_sta_in_sta_mld(struct agent *a, struct sta_mld *mld, +bool mld_contains_sta(struct agent *a, struct sta_mld *mld, uint8_t *macaddr) { int i; @@ -636,7 +675,7 @@ bool agent_is_sta_in_sta_mld(struct agent *a, struct sta_mld *mld, } -bool agent_is_sta_in_bsta_mld(struct agent *a, struct bsta_mld *mld, +bool mld_contains_bsta(struct agent *a, struct bsta_mld *mld, uint8_t *macaddr) { int i; @@ -700,7 +739,7 @@ struct bsta_mld *agent_init_bstamld(struct agent *a, char *ifname, return bsta; } -void agent_clean_affiliated_sta_mld(struct sta_mld *mld) +void stamld_clean(struct sta_mld *mld) { int i; @@ -710,7 +749,7 @@ void agent_clean_affiliated_sta_mld(struct sta_mld *mld) if (!s) continue; - s->mld = NULL; + memset(s->mld_macaddr, 0, 6); s->is_affiliated_sta = false; mld->affiliated_sta[i] = NULL; } @@ -719,9 +758,9 @@ void agent_clean_affiliated_sta_mld(struct sta_mld *mld) } -void agent_free_sta_mld(struct sta_mld *mld) +void stamld_free(struct sta_mld *mld) { - agent_clean_affiliated_sta_mld(mld); + stamld_clean(mld); list_del(&mld->list); free(mld); @@ -736,12 +775,12 @@ void clear_stamldlist(struct agent *a) struct sta_mld *smld = NULL, *tmp; list_for_each_entry_safe(smld, tmp, &mld->stamldlist, list) - agent_free_sta_mld(mld); + stamld_free(mld); } } */ -void agent_clean_affiliated_bsta_mld(struct bsta_mld *mld) +void bstamld_clean(struct bsta_mld *mld) { int i; @@ -751,7 +790,7 @@ void agent_clean_affiliated_bsta_mld(struct bsta_mld *mld) if (!bk) continue; - bk->mld = NULL; + memset(bk->mld_macaddr, 0, 6); bk->is_affiliated_sta = false; mld->affiliated_bsta[i] = NULL; } @@ -764,12 +803,12 @@ void agent_clear_bsta_mld(struct agent *a) { struct bsta_mld *mld = &a->bstamld; - agent_clean_affiliated_bsta_mld(mld); + bstamld_clean(mld); a->has_bstamld = false; } -void agent_clean_affiliated_ap_mld(struct netif_mld *mld) +void apmld_clean(struct netif_mld *mld) { int i; @@ -779,7 +818,7 @@ void agent_clean_affiliated_ap_mld(struct netif_mld *mld) if (!ap) continue; - ap->mld = NULL; + memset(ap->mld_macaddr, 0, 6); ap->is_affiliated_ap = false; mld->affiliated_ap[i] = NULL; } @@ -787,39 +826,31 @@ void agent_clean_affiliated_ap_mld(struct netif_mld *mld) mld->num_affiliated_ap = 0; } - -void agent_free_ap_mld(struct netif_mld *mld) -{ - agent_clean_affiliated_ap_mld(mld); - - list_del(&mld->list); - free(mld); -} - -/* TODO: fix mld free funcs... too many and they are all different */ - -void clear_apmld(struct netif_mld *mld) +void apmld_free(struct netif_mld *mld) { struct sta_mld *smld = NULL, *stmp; list_for_each_entry_safe(smld, stmp, &mld->stamldlist, list) - agent_free_sta_mld(smld); + stamld_free(smld); - agent_free_ap_mld(mld); + apmld_clean(mld); + + list_del(&mld->list); + free(mld); } -void clear_apmldlist(struct agent *a) +void apmld_free_all(struct agent *a) { struct netif_mld *mld = NULL, *tmp; list_for_each_entry_safe(mld, tmp, &a->apmldlist, list) { - clear_apmld(mld); + apmld_free(mld); } a->num_ap_mld = 0; } -bool wifi_is_affiliated_ap(struct agent *a, uint8_t *bssid) +bool is_affiliated_ap(struct agent *a, uint8_t *bssid) { struct netif_ap *ap; @@ -831,7 +862,7 @@ bool wifi_is_affiliated_ap(struct agent *a, uint8_t *bssid) } -bool agent_radio_support_ap_wifi7(struct wifi7_radio_capabilities *wifi7_caps) +bool agent_radio_support_ap_mlo(struct wifi7_radio_capabilities *wifi7_caps) { if (wifi7_caps->ap_str_support || wifi7_caps->ap_nstr_support || wifi7_caps->ap_emlsr_support || wifi7_caps->ap_emlmr_support) @@ -840,7 +871,7 @@ bool agent_radio_support_ap_wifi7(struct wifi7_radio_capabilities *wifi7_caps) return false; } -bool agent_radio_support_bsta_wifi7(struct wifi7_radio_capabilities *wifi7_caps) +bool agent_radio_support_bsta_mlo(struct wifi7_radio_capabilities *wifi7_caps) { if (wifi7_caps->bsta_str_support || wifi7_caps->bsta_nstr_support || wifi7_caps->bsta_emlsr_support || wifi7_caps->bsta_emlmr_support) @@ -850,7 +881,7 @@ bool agent_radio_support_bsta_wifi7(struct wifi7_radio_capabilities *wifi7_caps) } -int wifi_teardown_map_bsta_mld(struct agent *a, uint32_t band) +int bstamld_teardown_band(struct agent *a, uint32_t band) { struct wifi_radio_element *re; char fmt[128] = {0}; @@ -885,7 +916,7 @@ int wifi_teardown_map_bsta_mld(struct agent *a, uint32_t band) return 0; } -void mlo_update_id_in_configs(char *ifname, uint8_t mld_id) +void mld_set_config_id(char *ifname, uint8_t mld_id) { char mldname[16] = {0}; char idstr[4] = {0}; diff --git a/src/mld.h b/src/mld.h index da3356d85fe9559264dde1a5b990597dbf5797dc..c8bb720e0e60b06d2161a94979dca604cf82e6ff 100644 --- a/src/mld.h +++ b/src/mld.h @@ -16,6 +16,7 @@ struct wifi7_radio_capabilities; struct netif_bk; struct netif_ap; struct bsta_mld; +struct sta; /* multi-link device */ struct netif_mld { @@ -40,7 +41,7 @@ struct netif_mld { int num_affiliated_ap; #define MAX_AFFILIATED_AP_LINKS_NUM 14 - struct netif_ap *affiliated_ap[MAX_AFFILIATED_AP_LINKS_NUM]; + uint8_t affliated_ap[MAX_AFFILIATED_AP_LINKS_NUM][6]; struct list_head list; }; @@ -48,7 +49,6 @@ struct netif_mld { // struct used for client MLO STAs and own MLO bSTAs struct sta_mld { -#define MAX_AFFILIATED_STA_LINKS_NUM 14 uint8_t macaddr[6]; uint8_t bssid[6]; @@ -58,7 +58,8 @@ struct sta_mld { bool emlmr_enabled; int num_affiliated_sta; - struct sta *affiliated_sta[MAX_AFFILIATED_STA_LINKS_NUM]; +#define MAX_AFFILIATED_STA_LINKS_NUM 14 + uint8_t affiliated_sta[MAX_AFFILIATED_STA_LINKS_NUM][6]; struct list_head list; }; @@ -67,46 +68,47 @@ struct sta_mld { void mlsta_update_sta_mld(struct agent *a, struct netif_ap *ap, struct wifi_mlsta *mlsta, struct sta *s); -int wifi_sta_mld_del_sta(struct agent *a, struct sta *s); -int wifi_sta_mld_del_bsta(struct agent *a, struct netif_bk *bk); -int wifi_mld_del_ap(struct netif_ap *ap); +int mld_del_sta(struct agent *a, struct sta *s); +int mld_del_bsta(struct agent *a, struct netif_bk *bk); +int mld_del_ap(struct netif_ap *ap); int wifi_process_ml_ie(struct agent *a, struct sta_mld *stamld, uint8_t *assocframe, int framelen); -void wifi_mld_event_handler(void *agent, struct blob_attr *msg); -int parse_affiliated_ap(struct ubus_request *req, int type, +void mld_event_handler(void *agent, struct blob_attr *msg); +int mld_parse_affiliated_ap(struct ubus_request *req, int type, struct blob_attr *msg); -void parse_apmld(struct ubus_request *req, int type, +void apmld_parse(struct ubus_request *req, int type, struct blob_attr *msg); -void parse_affiliated_bsta(struct agent *a, struct bsta_mld *mld, +void mld_parse_affiliated_bsta(struct agent *a, struct bsta_mld *mld, struct netif_bk *bk, int type, struct blob_attr *msg); -void parse_bstamld(struct ubus_request *req, int type, +void bstamld_parse(struct ubus_request *req, int type, struct blob_attr *msg); -struct netif_mld *agent_get_mld_by_ifname(struct agent *a, const char *ifname); -struct netif_mld *agent_alloc_mld(struct agent *a, const char *ifname); -bool agent_is_ap_in_mld(struct agent *a, struct netif_mld *mld, +struct netif_mld *agent_get_apmld(struct agent *a, uint8_t *macaddr); +struct netif_mld *agent_get_apmld_by_ifname(struct agent *a, const char *ifname); +struct netif_mld *agent_alloc_apmld(struct agent *a, const char *ifname); +bool mld_contains_ap(struct agent *a, struct netif_mld *mld, uint8_t *macaddr); -bool agent_is_sta_in_sta_mld(struct agent *a, struct sta_mld *mld, +bool mld_contains_sta(struct agent *a, struct sta_mld *mld, uint8_t *macaddr); -bool agent_is_sta_in_bsta_mld(struct agent *a, struct bsta_mld *mld, +bool mld_contains_bsta(struct agent *a, struct bsta_mld *mld, uint8_t *macaddr); struct sta_mld *agent_get_stamld(struct agent *a, uint8_t *macaddr); struct sta_mld *agent_alloc_stamld(struct agent *a, struct netif_mld *mld, uint8_t *macaddr); struct bsta_mld *agent_init_bstamld(struct agent *a, char *ifname, struct wifi7_radio_capabilities *caps); -void agent_clean_affiliated_sta_mld(struct sta_mld *mld); -void agent_free_sta_mld(struct sta_mld *mld); -void agent_clean_affiliated_bsta_mld(struct bsta_mld *mld); -void agent_clear_bsta_mld(struct agent *a); -void agent_clean_affiliated_ap_mld(struct netif_mld *mld); -void agent_free_ap_mld(struct netif_mld *mld); +void stamld_clean(struct sta_mld *mld); +void stamld_free(struct sta_mld *mld); +void bstamld_clean(struct bsta_mld *mld); +void bstamld_free(struct agent *a); +void apmld_clean(struct netif_mld *mld); +void apmld_free(struct netif_mld *mld); void clear_apmld(struct netif_mld *mld); void clear_apmldlist(struct agent *a); -bool wifi_is_affiliated_ap(struct agent *a, uint8_t *bssid); -bool agent_radio_support_ap_wifi7(struct wifi7_radio_capabilities *wifi7_caps); -bool agent_radio_support_bsta_wifi7(struct wifi7_radio_capabilities *wifi7_caps); -int wifi_teardown_map_bsta_mld(struct agent *a, uint32_t band); -void mlo_update_id_in_configs(char *ifname, uint8_t mld_id); +bool is_affiliated_ap(struct agent *a, uint8_t *bssid); +bool agent_radio_support_ap_mlo(struct wifi7_radio_capabilities *wifi7_caps); +bool agent_radio_support_bsta_mlo(struct wifi7_radio_capabilities *wifi7_caps); +int bstamld_teardown_band(struct agent *a, uint32_t band); +void mld_set_config_id(char *ifname, uint8_t mld_id); #endif #endif \ No newline at end of file diff --git a/src/wifi_ubus.c b/src/wifi_ubus.c index 7248f59974bad0c7124d87b211cedc5b412c475b..d8c9702f2ec0f45daef7d351fc3970ff08148457 100644 --- a/src/wifi_ubus.c +++ b/src/wifi_ubus.c @@ -2137,7 +2137,6 @@ static int wifi_ubus_get_mld_sta_links(struct ubus_context *ubus_ctx, struct net .status = -1, }; struct blob_buf bb = {}; - char mld_addr_str[18] = {}; char name[256] = {}; uint32_t id; int ret; @@ -2153,7 +2152,9 @@ static int wifi_ubus_get_mld_sta_links(struct ubus_context *ubus_ctx, struct net blob_buf_init(&bb, 0); - if (mld_addr) { + if (mld_addr && !hwaddr_is_zero(mld_addr)) { + char mld_addr_str[18] = {}; + hwaddr_ntoa(mld_addr, mld_addr_str); blobmsg_add_string(&bb, "sta", mld_addr_str); ctx.mld_macaddr = mld_addr;