Commit 6d71117a authored by Johannes Berg's avatar Johannes Berg

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: default avatarJohannes Berg <johannes.berg@intel.com>
parent f142c6b9
...@@ -1241,6 +1241,10 @@ struct ieee80211_tx_control { ...@@ -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 { ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment