mac80211: add IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF
Some devices like the current iwlwifi implementation require that the P2P interface address match the P2P Device address (only one P2P interface is supported.) Add the HW flag IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF that allows drivers to request that P2P Interfaces added while a P2P Device is active get the same MAC address by default. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
f142c6b906
commit
6d71117a27
|
@ -1241,6 +1241,10 @@ struct ieee80211_tx_control {
|
||||||
* queue mapping in order to use different queues (not just one per AC)
|
* queue mapping in order to use different queues (not just one per AC)
|
||||||
* for different virtual interfaces. See the doc section on HW queue
|
* for different virtual interfaces. See the doc section on HW queue
|
||||||
* control for more details.
|
* control for more details.
|
||||||
|
*
|
||||||
|
* @IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF: Use the P2P Device address for any
|
||||||
|
* P2P Interface. This will be honoured even if more than one interface
|
||||||
|
* is supported.
|
||||||
*/
|
*/
|
||||||
enum ieee80211_hw_flags {
|
enum ieee80211_hw_flags {
|
||||||
IEEE80211_HW_HAS_RATE_CONTROL = 1<<0,
|
IEEE80211_HW_HAS_RATE_CONTROL = 1<<0,
|
||||||
|
@ -1268,6 +1272,7 @@ enum ieee80211_hw_flags {
|
||||||
IEEE80211_HW_AP_LINK_PS = 1<<22,
|
IEEE80211_HW_AP_LINK_PS = 1<<22,
|
||||||
IEEE80211_HW_TX_AMPDU_SETUP_IN_HW = 1<<23,
|
IEEE80211_HW_TX_AMPDU_SETUP_IN_HW = 1<<23,
|
||||||
IEEE80211_HW_SCAN_WHILE_IDLE = 1<<24,
|
IEEE80211_HW_SCAN_WHILE_IDLE = 1<<24,
|
||||||
|
IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF = 1<<25,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1313,7 +1313,6 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
|
||||||
local->hw.wiphy->n_addresses <= 1)
|
local->hw.wiphy->n_addresses <= 1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
||||||
mutex_lock(&local->iflist_mtx);
|
mutex_lock(&local->iflist_mtx);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
@ -1331,6 +1330,19 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
|
||||||
}
|
}
|
||||||
/* keep default if no AP interface present */
|
/* keep default if no AP interface present */
|
||||||
break;
|
break;
|
||||||
|
case NL80211_IFTYPE_P2P_CLIENT:
|
||||||
|
case NL80211_IFTYPE_P2P_GO:
|
||||||
|
if (local->hw.flags & IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF) {
|
||||||
|
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||||
|
if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE)
|
||||||
|
continue;
|
||||||
|
if (!ieee80211_sdata_running(sdata))
|
||||||
|
continue;
|
||||||
|
memcpy(perm_addr, sdata->vif.addr, ETH_ALEN);
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* otherwise fall through */
|
||||||
default:
|
default:
|
||||||
/* assign a new address if possible -- try n_addresses first */
|
/* assign a new address if possible -- try n_addresses first */
|
||||||
for (i = 0; i < local->hw.wiphy->n_addresses; i++) {
|
for (i = 0; i < local->hw.wiphy->n_addresses; i++) {
|
||||||
|
@ -1405,6 +1417,7 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out_unlock:
|
||||||
mutex_unlock(&local->iflist_mtx);
|
mutex_unlock(&local->iflist_mtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue