diff options
author | John W. Linville <linville@tuxdriver.com> | 2013-06-12 14:35:23 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-06-12 14:35:23 -0400 |
commit | 861bca265e7808e2493590843b8585f6943af16f (patch) | |
tree | f9c6d3beee927191856479888bc845859cd135cf /net/mac80211 | |
parent | 8b3e7be437a6b62118d0485ad971e724afe23fdf (diff) | |
parent | e0e29b683d6784ef59bbc914eac85a04b650e63c (diff) | |
download | linux-861bca265e7808e2493590843b8585f6943af16f.tar.bz2 |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
Conflicts:
drivers/net/wireless/ath/ath9k/Kconfig
net/mac80211/iface.c
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/iface.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 7cabaf261fed..a2a8250e2f84 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -159,10 +159,11 @@ static int ieee80211_change_mtu(struct net_device *dev, int new_mtu) return 0; } -static int ieee80211_verify_mac(struct ieee80211_local *local, u8 *addr, +static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr, bool check_dup) { - struct ieee80211_sub_if_data *sdata; + struct ieee80211_local *local = sdata->local; + struct ieee80211_sub_if_data *iter; u64 new, mask, tmp; u8 *m; int ret = 0; @@ -184,12 +185,15 @@ static int ieee80211_verify_mac(struct ieee80211_local *local, u8 *addr, return ret; mutex_lock(&local->iflist_mtx); - list_for_each_entry(sdata, &local->interfaces, list) { - if (sdata->vif.type == NL80211_IFTYPE_MONITOR && - !(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE)) + list_for_each_entry(iter, &local->interfaces, list) { + if (iter == sdata) continue; - m = sdata->vif.addr; + if (iter->vif.type == NL80211_IFTYPE_MONITOR && + !(iter->u.mntr_flags & MONITOR_FLAG_ACTIVE)) + continue; + + m = iter->vif.addr; tmp = ((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) | ((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) | ((u64)m[4] << 1*8) | ((u64)m[5] << 0*8); @@ -218,7 +222,7 @@ static int ieee80211_change_mac(struct net_device *dev, void *addr) !(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE)) check_dup = false; - ret = ieee80211_verify_mac(sdata->local, sa->sa_data, check_dup); + ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup); if (ret) return ret; @@ -1503,7 +1507,17 @@ static void ieee80211_assign_perm_addr(struct ieee80211_local *local, break; } + /* + * Pick address of existing interface in case user changed + * MAC address manually, default to perm_addr. + */ m = local->hw.wiphy->perm_addr; + list_for_each_entry(sdata, &local->interfaces, list) { + if (sdata->vif.type == NL80211_IFTYPE_MONITOR) + continue; + m = sdata->vif.addr; + break; + } start = ((u64)m[0] << 5*8) | ((u64)m[1] << 4*8) | ((u64)m[2] << 3*8) | ((u64)m[3] << 2*8) | ((u64)m[4] << 1*8) | ((u64)m[5] << 0*8); |