> -bool ieee80211_beacon_cntdwn_is_complete(struct ieee80211_vif *vif) > +bool ieee80211_beacon_cntdwn_is_complete(struct ieee80211_vif *vif, > + unsigned int link_id) > { > struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); > + struct ieee80211_link_data *link; > struct beacon_data *beacon = NULL; > u8 *beacon_data; > size_t beacon_data_len; > @@ -5106,9 +5108,17 @@ bool ieee80211_beacon_cntdwn_is_complete(struct ieee80211_vif *vif) > if (!ieee80211_sdata_running(sdata)) > return false; > > + if (WARN_ON(link_id >= IEEE80211_MLD_MAX_NUM_LINKS)) > + return 0; > + > rcu_read_lock(); > + > + link = rcu_dereference(sdata->link[link_id]); > + if (!link) > + goto out; > Maybe that should be a warning too? Not sure I see any case where the driver can/should call it with a link that's not even there? Oh ... and maybe it should check if the link is active? We had the sdata_running() check before, but that doesn't mean much for MLO? Though then again we have the check below anyway: > if (vif->type == NL80211_IFTYPE_AP) { > - beacon = rcu_dereference(sdata->deflink.u.ap.beacon); > + beacon = rcu_dereference(link->u.ap.beacon); > if (WARN_ON(!beacon || !beacon->tail)) > goto out; > So that will just be NULL if it's not active... so I guess that's fine. johannes