Commit 73c7da3d authored by Arend Van Spriel's avatar Arend Van Spriel Committed by Johannes Berg

cfg80211: add generic helper to check interface is running

Add a helper using wdev to check if interface is running. This
deals with both non-netdev and netdev interfaces. In struct
wireless_dev replace 'p2p_started' and 'nan_started' by
'is_running' as those are mutually exclusive anyway, and unify
all the code to use wdev_running().
Signed-off-by: default avatarArend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 8f205423
...@@ -3781,8 +3781,8 @@ struct cfg80211_cached_keys; ...@@ -3781,8 +3781,8 @@ struct cfg80211_cached_keys;
* @beacon_interval: beacon interval used on this device for transmitting * @beacon_interval: beacon interval used on this device for transmitting
* beacons, 0 when not valid * beacons, 0 when not valid
* @address: The address for this device, valid only if @netdev is %NULL * @address: The address for this device, valid only if @netdev is %NULL
* @p2p_started: true if this is a P2P Device that has been started * @is_running: true if this is a non-netdev device that has been started, e.g.
* @nan_started: true if this is a NAN interface that has been started * the P2P Device.
* @cac_started: true if DFS channel availability check has been started * @cac_started: true if DFS channel availability check has been started
* @cac_start_time: timestamp (jiffies) when the dfs state was entered. * @cac_start_time: timestamp (jiffies) when the dfs state was entered.
* @cac_time_ms: CAC time in ms * @cac_time_ms: CAC time in ms
...@@ -3814,7 +3814,7 @@ struct wireless_dev { ...@@ -3814,7 +3814,7 @@ struct wireless_dev {
struct mutex mtx; struct mutex mtx;
bool use_4addr, p2p_started, nan_started; bool use_4addr, is_running;
u8 address[ETH_ALEN] __aligned(sizeof(u16)); u8 address[ETH_ALEN] __aligned(sizeof(u16));
...@@ -3871,6 +3871,13 @@ static inline u8 *wdev_address(struct wireless_dev *wdev) ...@@ -3871,6 +3871,13 @@ static inline u8 *wdev_address(struct wireless_dev *wdev)
return wdev->address; return wdev->address;
} }
static inline bool wdev_running(struct wireless_dev *wdev)
{
if (wdev->netdev)
return netif_running(wdev->netdev);
return wdev->is_running;
}
/** /**
* wdev_priv - return wiphy priv from wireless_dev * wdev_priv - return wiphy priv from wireless_dev
* *
......
...@@ -210,11 +210,11 @@ void cfg80211_stop_p2p_device(struct cfg80211_registered_device *rdev, ...@@ -210,11 +210,11 @@ void cfg80211_stop_p2p_device(struct cfg80211_registered_device *rdev,
if (WARN_ON(wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)) if (WARN_ON(wdev->iftype != NL80211_IFTYPE_P2P_DEVICE))
return; return;
if (!wdev->p2p_started) if (!wdev_running(wdev))
return; return;
rdev_stop_p2p_device(rdev, wdev); rdev_stop_p2p_device(rdev, wdev);
wdev->p2p_started = false; wdev->is_running = false;
rdev->opencount--; rdev->opencount--;
...@@ -233,11 +233,11 @@ void cfg80211_stop_nan(struct cfg80211_registered_device *rdev, ...@@ -233,11 +233,11 @@ void cfg80211_stop_nan(struct cfg80211_registered_device *rdev,
if (WARN_ON(wdev->iftype != NL80211_IFTYPE_NAN)) if (WARN_ON(wdev->iftype != NL80211_IFTYPE_NAN))
return; return;
if (!wdev->nan_started) if (!wdev_running(wdev))
return; return;
rdev_stop_nan(rdev, wdev); rdev_stop_nan(rdev, wdev);
wdev->nan_started = false; wdev->is_running = false;
rdev->opencount--; rdev->opencount--;
} }
......
...@@ -10528,7 +10528,7 @@ static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info) ...@@ -10528,7 +10528,7 @@ static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE) if (wdev->iftype != NL80211_IFTYPE_P2P_DEVICE)
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (wdev->p2p_started) if (wdev_running(wdev))
return 0; return 0;
if (rfkill_blocked(rdev->rfkill)) if (rfkill_blocked(rdev->rfkill))
...@@ -10538,7 +10538,7 @@ static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info) ...@@ -10538,7 +10538,7 @@ static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
if (err) if (err)
return err; return err;
wdev->p2p_started = true; wdev->is_running = true;
rdev->opencount++; rdev->opencount++;
return 0; return 0;
...@@ -10570,7 +10570,7 @@ static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info) ...@@ -10570,7 +10570,7 @@ static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info)
if (wdev->iftype != NL80211_IFTYPE_NAN) if (wdev->iftype != NL80211_IFTYPE_NAN)
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (wdev->nan_started) if (!wdev_running(wdev))
return -EEXIST; return -EEXIST;
if (rfkill_blocked(rdev->rfkill)) if (rfkill_blocked(rdev->rfkill))
...@@ -10593,7 +10593,7 @@ static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info) ...@@ -10593,7 +10593,7 @@ static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info)
if (err) if (err)
return err; return err;
wdev->nan_started = true; wdev->is_running = true;
rdev->opencount++; rdev->opencount++;
return 0; return 0;
...@@ -10678,7 +10678,7 @@ static int nl80211_nan_add_func(struct sk_buff *skb, ...@@ -10678,7 +10678,7 @@ static int nl80211_nan_add_func(struct sk_buff *skb,
if (wdev->iftype != NL80211_IFTYPE_NAN) if (wdev->iftype != NL80211_IFTYPE_NAN)
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (!wdev->nan_started) if (!wdev_running(wdev))
return -ENOTCONN; return -ENOTCONN;
if (!info->attrs[NL80211_ATTR_NAN_FUNC]) if (!info->attrs[NL80211_ATTR_NAN_FUNC])
...@@ -10915,7 +10915,7 @@ static int nl80211_nan_del_func(struct sk_buff *skb, ...@@ -10915,7 +10915,7 @@ static int nl80211_nan_del_func(struct sk_buff *skb,
if (wdev->iftype != NL80211_IFTYPE_NAN) if (wdev->iftype != NL80211_IFTYPE_NAN)
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (!wdev->nan_started) if (!wdev_running(wdev))
return -ENOTCONN; return -ENOTCONN;
if (!info->attrs[NL80211_ATTR_COOKIE]) if (!info->attrs[NL80211_ATTR_COOKIE])
...@@ -10943,7 +10943,7 @@ static int nl80211_nan_change_config(struct sk_buff *skb, ...@@ -10943,7 +10943,7 @@ static int nl80211_nan_change_config(struct sk_buff *skb,
if (wdev->iftype != NL80211_IFTYPE_NAN) if (wdev->iftype != NL80211_IFTYPE_NAN)
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (!wdev->nan_started) if (!wdev_running(wdev))
return -ENOTCONN; return -ENOTCONN;
if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) { if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) {
...@@ -11255,11 +11255,7 @@ static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info) ...@@ -11255,11 +11255,7 @@ static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
return -EINVAL; return -EINVAL;
if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
if (wdev->netdev && if (!wdev_running(wdev))
!netif_running(wdev->netdev))
return -ENETDOWN;
if (!wdev->netdev && !wdev->p2p_started &&
!wdev->nan_started)
return -ENETDOWN; return -ENETDOWN;
} }
...@@ -11422,10 +11418,7 @@ static int nl80211_vendor_cmd_dump(struct sk_buff *skb, ...@@ -11422,10 +11418,7 @@ static int nl80211_vendor_cmd_dump(struct sk_buff *skb,
return -EINVAL; return -EINVAL;
if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) {
if (wdev->netdev && if (!wdev_running(wdev))
!netif_running(wdev->netdev))
return -ENETDOWN;
if (!wdev->netdev && !wdev->p2p_started)
return -ENETDOWN; return -ENETDOWN;
} }
} }
...@@ -11796,29 +11789,15 @@ static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb, ...@@ -11796,29 +11789,15 @@ static int nl80211_pre_doit(const struct genl_ops *ops, struct sk_buff *skb,
info->user_ptr[1] = wdev; info->user_ptr[1] = wdev;
} }
if (dev) {
if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP &&
!netif_running(dev)) { !wdev_running(wdev)) {
if (rtnl) if (rtnl)
rtnl_unlock(); rtnl_unlock();
return -ENETDOWN; return -ENETDOWN;
} }
if (dev)
dev_hold(dev); dev_hold(dev);
} else if (ops->internal_flags & NL80211_FLAG_CHECK_NETDEV_UP) {
if (wdev->iftype == NL80211_IFTYPE_P2P_DEVICE &&
!wdev->p2p_started) {
if (rtnl)
rtnl_unlock();
return -ENETDOWN;
}
if (wdev->iftype == NL80211_IFTYPE_NAN &&
!wdev->nan_started) {
if (rtnl)
rtnl_unlock();
return -ENETDOWN;
}
}
info->user_ptr[0] = rdev; info->user_ptr[0] = rdev;
} }
......
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