mac80211: refactor monitor representation in sdata
Insert the u32 monitor flags variable in a new structure that represents a monitor interface. This will allow to add more configuration variables to that structure which will happen in an upcoming change. Signed-off-by: Aviya Erenfeld <aviya.erenfeld@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
5a1f044b50
commit
d82121845d
8 changed files with 23 additions and 19 deletions
|
@ -39,7 +39,7 @@ static struct wireless_dev *ieee80211_add_iface(struct wiphy *wiphy,
|
||||||
|
|
||||||
if (type == NL80211_IFTYPE_MONITOR && flags) {
|
if (type == NL80211_IFTYPE_MONITOR && flags) {
|
||||||
sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
|
||||||
sdata->u.mntr_flags = *flags;
|
sdata->u.mntr.flags = *flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
return wdev;
|
return wdev;
|
||||||
|
@ -89,11 +89,11 @@ static int ieee80211_change_iface(struct wiphy *wiphy,
|
||||||
* cooked_mntrs, monitor and all fif_* counters
|
* cooked_mntrs, monitor and all fif_* counters
|
||||||
* reconfigure hardware
|
* reconfigure hardware
|
||||||
*/
|
*/
|
||||||
if ((*flags & mask) != (sdata->u.mntr_flags & mask))
|
if ((*flags & mask) != (sdata->u.mntr.flags & mask))
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
ieee80211_adjust_monitor_flags(sdata, -1);
|
ieee80211_adjust_monitor_flags(sdata, -1);
|
||||||
sdata->u.mntr_flags = *flags;
|
sdata->u.mntr.flags = *flags;
|
||||||
ieee80211_adjust_monitor_flags(sdata, 1);
|
ieee80211_adjust_monitor_flags(sdata, 1);
|
||||||
|
|
||||||
ieee80211_configure_filter(local);
|
ieee80211_configure_filter(local);
|
||||||
|
@ -103,7 +103,7 @@ static int ieee80211_change_iface(struct wiphy *wiphy,
|
||||||
* and ieee80211_do_open take care of "everything"
|
* and ieee80211_do_open take care of "everything"
|
||||||
* mentioned in the comment above.
|
* mentioned in the comment above.
|
||||||
*/
|
*/
|
||||||
sdata->u.mntr_flags = *flags;
|
sdata->u.mntr.flags = *flags;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ int drv_add_interface(struct ieee80211_local *local,
|
||||||
if (WARN_ON(sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
|
if (WARN_ON(sdata->vif.type == NL80211_IFTYPE_AP_VLAN ||
|
||||||
(sdata->vif.type == NL80211_IFTYPE_MONITOR &&
|
(sdata->vif.type == NL80211_IFTYPE_MONITOR &&
|
||||||
!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF) &&
|
!ieee80211_hw_check(&local->hw, WANT_MONITOR_VIF) &&
|
||||||
!(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE))))
|
!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
trace_drv_add_interface(local, sdata);
|
trace_drv_add_interface(local, sdata);
|
||||||
|
|
|
@ -824,6 +824,10 @@ struct txq_info {
|
||||||
struct ieee80211_txq txq;
|
struct ieee80211_txq txq;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ieee80211_if_mntr {
|
||||||
|
u32 flags;
|
||||||
|
};
|
||||||
|
|
||||||
struct ieee80211_sub_if_data {
|
struct ieee80211_sub_if_data {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
|
|
||||||
|
@ -922,7 +926,7 @@ struct ieee80211_sub_if_data {
|
||||||
struct ieee80211_if_ibss ibss;
|
struct ieee80211_if_ibss ibss;
|
||||||
struct ieee80211_if_mesh mesh;
|
struct ieee80211_if_mesh mesh;
|
||||||
struct ieee80211_if_ocb ocb;
|
struct ieee80211_if_ocb ocb;
|
||||||
u32 mntr_flags;
|
struct ieee80211_if_mntr mntr;
|
||||||
} u;
|
} u;
|
||||||
|
|
||||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||||
|
|
|
@ -188,7 +188,7 @@ static int ieee80211_verify_mac(struct ieee80211_sub_if_data *sdata, u8 *addr,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (iter->vif.type == NL80211_IFTYPE_MONITOR &&
|
if (iter->vif.type == NL80211_IFTYPE_MONITOR &&
|
||||||
!(iter->u.mntr_flags & MONITOR_FLAG_ACTIVE))
|
!(iter->u.mntr.flags & MONITOR_FLAG_ACTIVE))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
m = iter->vif.addr;
|
m = iter->vif.addr;
|
||||||
|
@ -217,7 +217,7 @@ static int ieee80211_change_mac(struct net_device *dev, void *addr)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
if (sdata->vif.type == NL80211_IFTYPE_MONITOR &&
|
if (sdata->vif.type == NL80211_IFTYPE_MONITOR &&
|
||||||
!(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE))
|
!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
|
||||||
check_dup = false;
|
check_dup = false;
|
||||||
|
|
||||||
ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup);
|
ret = ieee80211_verify_mac(sdata, sa->sa_data, check_dup);
|
||||||
|
@ -357,7 +357,7 @@ void ieee80211_adjust_monitor_flags(struct ieee80211_sub_if_data *sdata,
|
||||||
const int offset)
|
const int offset)
|
||||||
{
|
{
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
u32 flags = sdata->u.mntr_flags;
|
u32 flags = sdata->u.mntr.flags;
|
||||||
|
|
||||||
#define ADJUST(_f, _s) do { \
|
#define ADJUST(_f, _s) do { \
|
||||||
if (flags & MONITOR_FLAG_##_f) \
|
if (flags & MONITOR_FLAG_##_f) \
|
||||||
|
@ -589,12 +589,12 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NL80211_IFTYPE_MONITOR:
|
case NL80211_IFTYPE_MONITOR:
|
||||||
if (sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) {
|
if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) {
|
||||||
local->cooked_mntrs++;
|
local->cooked_mntrs++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE) {
|
if (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) {
|
||||||
res = drv_add_interface(local, sdata);
|
res = drv_add_interface(local, sdata);
|
||||||
if (res)
|
if (res)
|
||||||
goto err_stop;
|
goto err_stop;
|
||||||
|
@ -926,7 +926,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
||||||
/* no need to tell driver */
|
/* no need to tell driver */
|
||||||
break;
|
break;
|
||||||
case NL80211_IFTYPE_MONITOR:
|
case NL80211_IFTYPE_MONITOR:
|
||||||
if (sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) {
|
if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) {
|
||||||
local->cooked_mntrs--;
|
local->cooked_mntrs--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1012,7 +1012,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
||||||
ieee80211_recalc_idle(local);
|
ieee80211_recalc_idle(local);
|
||||||
mutex_unlock(&local->mtx);
|
mutex_unlock(&local->mtx);
|
||||||
|
|
||||||
if (!(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE))
|
if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* fall through */
|
/* fall through */
|
||||||
|
@ -1444,7 +1444,7 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
|
||||||
case NL80211_IFTYPE_MONITOR:
|
case NL80211_IFTYPE_MONITOR:
|
||||||
sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP;
|
sdata->dev->type = ARPHRD_IEEE80211_RADIOTAP;
|
||||||
sdata->dev->netdev_ops = &ieee80211_monitorif_ops;
|
sdata->dev->netdev_ops = &ieee80211_monitorif_ops;
|
||||||
sdata->u.mntr_flags = MONITOR_FLAG_CONTROL |
|
sdata->u.mntr.flags = MONITOR_FLAG_CONTROL |
|
||||||
MONITOR_FLAG_OTHER_BSS;
|
MONITOR_FLAG_OTHER_BSS;
|
||||||
break;
|
break;
|
||||||
case NL80211_IFTYPE_WDS:
|
case NL80211_IFTYPE_WDS:
|
||||||
|
|
|
@ -567,7 +567,7 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb,
|
||||||
if (sdata->vif.type != NL80211_IFTYPE_MONITOR)
|
if (sdata->vif.type != NL80211_IFTYPE_MONITOR)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES)
|
if (sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!ieee80211_sdata_running(sdata))
|
if (!ieee80211_sdata_running(sdata))
|
||||||
|
@ -3147,7 +3147,7 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (sdata->vif.type != NL80211_IFTYPE_MONITOR ||
|
if (sdata->vif.type != NL80211_IFTYPE_MONITOR ||
|
||||||
!(sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES))
|
!(sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (prev_dev) {
|
if (prev_dev) {
|
||||||
|
|
|
@ -709,7 +709,7 @@ void ieee80211_tx_monitor(struct ieee80211_local *local, struct sk_buff *skb,
|
||||||
if (!ieee80211_sdata_running(sdata))
|
if (!ieee80211_sdata_running(sdata))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) &&
|
if ((sdata->u.mntr.flags & MONITOR_FLAG_COOK_FRAMES) &&
|
||||||
!send_to_cooked)
|
!send_to_cooked)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
@ -1643,7 +1643,7 @@ static bool __ieee80211_tx(struct ieee80211_local *local,
|
||||||
|
|
||||||
switch (sdata->vif.type) {
|
switch (sdata->vif.type) {
|
||||||
case NL80211_IFTYPE_MONITOR:
|
case NL80211_IFTYPE_MONITOR:
|
||||||
if (sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE) {
|
if (sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE) {
|
||||||
vif = &sdata->vif;
|
vif = &sdata->vif;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -598,7 +598,7 @@ static void __iterate_interfaces(struct ieee80211_local *local,
|
||||||
list_for_each_entry_rcu(sdata, &local->interfaces, list) {
|
list_for_each_entry_rcu(sdata, &local->interfaces, list) {
|
||||||
switch (sdata->vif.type) {
|
switch (sdata->vif.type) {
|
||||||
case NL80211_IFTYPE_MONITOR:
|
case NL80211_IFTYPE_MONITOR:
|
||||||
if (!(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE))
|
if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
|
||||||
continue;
|
continue;
|
||||||
break;
|
break;
|
||||||
case NL80211_IFTYPE_AP_VLAN:
|
case NL80211_IFTYPE_AP_VLAN:
|
||||||
|
|
Loading…
Reference in a new issue