}
static int sta_link_apply_parameters(struct ieee80211_local *local,
- struct sta_info *sta,
+ struct sta_info *sta, bool new_link,
struct link_station_parameters *params)
{
int ret = 0;
return -EINVAL;
if (params->link_mac) {
- memcpy(link_sta->addr, params->link_mac, ETH_ALEN);
- memcpy(link_sta->pub->addr, params->link_mac, ETH_ALEN);
+ if (new_link) {
+ memcpy(link_sta->addr, params->link_mac, ETH_ALEN);
+ memcpy(link_sta->pub->addr, params->link_mac, ETH_ALEN);
+ } else if (!ether_addr_equal(link_sta->addr,
+ params->link_mac)) {
+ return -EINVAL;
+ }
}
if (params->txpwr_set) {
if (params->listen_interval >= 0)
sta->listen_interval = params->listen_interval;
- ret = sta_link_apply_parameters(local, sta, ¶ms->link_sta_params);
+ ret = sta_link_apply_parameters(local, sta, false,
+ ¶ms->link_sta_params);
if (ret)
return ret;
if (ret)
return ret;
- ret = sta_link_apply_parameters(local, sta, params);
+ ret = sta_link_apply_parameters(local, sta, true, params);
if (ret) {
ieee80211_sta_free_link(sta, params->link_id);
return ret;
if (!(sta->sta.valid_links & BIT(params->link_id)))
return -EINVAL;
- return sta_link_apply_parameters(local, sta, params);
+ return sta_link_apply_parameters(local, sta, false, params);
}
static int