Skip to content

Commit 7f2b856

Browse files
ying-xuedavem330
authored andcommitted
net: nl80211: __dev_get_by_index instead of dev_get_by_index to find interface
As __cfg80211_rdev_from_attrs(), nl80211_dump_wiphy_parse() and nl80211_set_wiphy() are all under rtnl_lock protection, __dev_get_by_index() instead of dev_get_by_index() should be used to find interface handler in them allowing us to avoid to change interface reference counter. Cc: Johannes Berg <[email protected]> Signed-off-by: Ying Xue <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 5af28de commit 7f2b856

File tree

1 file changed

+37
-65
lines changed

1 file changed

+37
-65
lines changed

net/wireless/nl80211.c

Lines changed: 37 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -165,16 +165,14 @@ __cfg80211_rdev_from_attrs(struct net *netns, struct nlattr **attrs)
165165

166166
if (attrs[NL80211_ATTR_IFINDEX]) {
167167
int ifindex = nla_get_u32(attrs[NL80211_ATTR_IFINDEX]);
168-
netdev = dev_get_by_index(netns, ifindex);
168+
netdev = __dev_get_by_index(netns, ifindex);
169169
if (netdev) {
170170
if (netdev->ieee80211_ptr)
171171
tmp = wiphy_to_dev(
172172
netdev->ieee80211_ptr->wiphy);
173173
else
174174
tmp = NULL;
175175

176-
dev_put(netdev);
177-
178176
/* not wireless device -- return error */
179177
if (!tmp)
180178
return ERR_PTR(-EINVAL);
@@ -1656,15 +1654,14 @@ static int nl80211_dump_wiphy_parse(struct sk_buff *skb,
16561654
struct cfg80211_registered_device *rdev;
16571655
int ifidx = nla_get_u32(tb[NL80211_ATTR_IFINDEX]);
16581656

1659-
netdev = dev_get_by_index(sock_net(skb->sk), ifidx);
1657+
netdev = __dev_get_by_index(sock_net(skb->sk), ifidx);
16601658
if (!netdev)
16611659
return -ENODEV;
16621660
if (netdev->ieee80211_ptr) {
16631661
rdev = wiphy_to_dev(
16641662
netdev->ieee80211_ptr->wiphy);
16651663
state->filter_wiphy = rdev->wiphy_idx;
16661664
}
1667-
dev_put(netdev);
16681665
}
16691666

16701667
return 0;
@@ -1987,7 +1984,7 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
19871984
if (info->attrs[NL80211_ATTR_IFINDEX]) {
19881985
int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
19891986

1990-
netdev = dev_get_by_index(genl_info_net(info), ifindex);
1987+
netdev = __dev_get_by_index(genl_info_net(info), ifindex);
19911988
if (netdev && netdev->ieee80211_ptr)
19921989
rdev = wiphy_to_dev(netdev->ieee80211_ptr->wiphy);
19931990
else
@@ -2015,32 +2012,24 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
20152012
rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
20162013

20172014
if (result)
2018-
goto bad_res;
2015+
return result;
20192016

20202017
if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
20212018
struct ieee80211_txq_params txq_params;
20222019
struct nlattr *tb[NL80211_TXQ_ATTR_MAX + 1];
20232020

2024-
if (!rdev->ops->set_txq_params) {
2025-
result = -EOPNOTSUPP;
2026-
goto bad_res;
2027-
}
2021+
if (!rdev->ops->set_txq_params)
2022+
return -EOPNOTSUPP;
20282023

2029-
if (!netdev) {
2030-
result = -EINVAL;
2031-
goto bad_res;
2032-
}
2024+
if (!netdev)
2025+
return -EINVAL;
20332026

20342027
if (netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
2035-
netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) {
2036-
result = -EINVAL;
2037-
goto bad_res;
2038-
}
2028+
netdev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
2029+
return -EINVAL;
20392030

2040-
if (!netif_running(netdev)) {
2041-
result = -ENETDOWN;
2042-
goto bad_res;
2043-
}
2031+
if (!netif_running(netdev))
2032+
return -ENETDOWN;
20442033

20452034
nla_for_each_nested(nl_txq_params,
20462035
info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
@@ -2051,12 +2040,12 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
20512040
txq_params_policy);
20522041
result = parse_txq_params(tb, &txq_params);
20532042
if (result)
2054-
goto bad_res;
2043+
return result;
20552044

20562045
result = rdev_set_txq_params(rdev, netdev,
20572046
&txq_params);
20582047
if (result)
2059-
goto bad_res;
2048+
return result;
20602049
}
20612050
}
20622051

@@ -2065,7 +2054,7 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
20652054
nl80211_can_set_dev_channel(wdev) ? wdev : NULL,
20662055
info);
20672056
if (result)
2068-
goto bad_res;
2057+
return result;
20692058
}
20702059

20712060
if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
@@ -2076,19 +2065,15 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
20762065
if (!(rdev->wiphy.features & NL80211_FEATURE_VIF_TXPOWER))
20772066
txp_wdev = NULL;
20782067

2079-
if (!rdev->ops->set_tx_power) {
2080-
result = -EOPNOTSUPP;
2081-
goto bad_res;
2082-
}
2068+
if (!rdev->ops->set_tx_power)
2069+
return -EOPNOTSUPP;
20832070

20842071
idx = NL80211_ATTR_WIPHY_TX_POWER_SETTING;
20852072
type = nla_get_u32(info->attrs[idx]);
20862073

20872074
if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
2088-
(type != NL80211_TX_POWER_AUTOMATIC)) {
2089-
result = -EINVAL;
2090-
goto bad_res;
2091-
}
2075+
(type != NL80211_TX_POWER_AUTOMATIC))
2076+
return -EINVAL;
20922077

20932078
if (type != NL80211_TX_POWER_AUTOMATIC) {
20942079
idx = NL80211_ATTR_WIPHY_TX_POWER_LEVEL;
@@ -2097,67 +2082,60 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
20972082

20982083
result = rdev_set_tx_power(rdev, txp_wdev, type, mbm);
20992084
if (result)
2100-
goto bad_res;
2085+
return result;
21012086
}
21022087

21032088
if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
21042089
info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
21052090
u32 tx_ant, rx_ant;
21062091
if ((!rdev->wiphy.available_antennas_tx &&
21072092
!rdev->wiphy.available_antennas_rx) ||
2108-
!rdev->ops->set_antenna) {
2109-
result = -EOPNOTSUPP;
2110-
goto bad_res;
2111-
}
2093+
!rdev->ops->set_antenna)
2094+
return -EOPNOTSUPP;
21122095

21132096
tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
21142097
rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
21152098

21162099
/* reject antenna configurations which don't match the
21172100
* available antenna masks, except for the "all" mask */
21182101
if ((~tx_ant && (tx_ant & ~rdev->wiphy.available_antennas_tx)) ||
2119-
(~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx))) {
2120-
result = -EINVAL;
2121-
goto bad_res;
2122-
}
2102+
(~rx_ant && (rx_ant & ~rdev->wiphy.available_antennas_rx)))
2103+
return -EINVAL;
21232104

21242105
tx_ant = tx_ant & rdev->wiphy.available_antennas_tx;
21252106
rx_ant = rx_ant & rdev->wiphy.available_antennas_rx;
21262107

21272108
result = rdev_set_antenna(rdev, tx_ant, rx_ant);
21282109
if (result)
2129-
goto bad_res;
2110+
return result;
21302111
}
21312112

21322113
changed = 0;
21332114

21342115
if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
21352116
retry_short = nla_get_u8(
21362117
info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
2137-
if (retry_short == 0) {
2138-
result = -EINVAL;
2139-
goto bad_res;
2140-
}
2118+
if (retry_short == 0)
2119+
return -EINVAL;
2120+
21412121
changed |= WIPHY_PARAM_RETRY_SHORT;
21422122
}
21432123

21442124
if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
21452125
retry_long = nla_get_u8(
21462126
info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
2147-
if (retry_long == 0) {
2148-
result = -EINVAL;
2149-
goto bad_res;
2150-
}
2127+
if (retry_long == 0)
2128+
return -EINVAL;
2129+
21512130
changed |= WIPHY_PARAM_RETRY_LONG;
21522131
}
21532132

21542133
if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
21552134
frag_threshold = nla_get_u32(
21562135
info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
2157-
if (frag_threshold < 256) {
2158-
result = -EINVAL;
2159-
goto bad_res;
2160-
}
2136+
if (frag_threshold < 256)
2137+
return -EINVAL;
2138+
21612139
if (frag_threshold != (u32) -1) {
21622140
/*
21632141
* Fragments (apart from the last one) are required to
@@ -2187,10 +2165,8 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
21872165
u32 old_frag_threshold, old_rts_threshold;
21882166
u8 old_coverage_class;
21892167

2190-
if (!rdev->ops->set_wiphy_params) {
2191-
result = -EOPNOTSUPP;
2192-
goto bad_res;
2193-
}
2168+
if (!rdev->ops->set_wiphy_params)
2169+
return -EOPNOTSUPP;
21942170

21952171
old_retry_short = rdev->wiphy.retry_short;
21962172
old_retry_long = rdev->wiphy.retry_long;
@@ -2218,11 +2194,7 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
22182194
rdev->wiphy.coverage_class = old_coverage_class;
22192195
}
22202196
}
2221-
2222-
bad_res:
2223-
if (netdev)
2224-
dev_put(netdev);
2225-
return result;
2197+
return 0;
22262198
}
22272199

22282200
static inline u64 wdev_id(struct wireless_dev *wdev)

0 commit comments

Comments
 (0)