Commit 4d0c8aea authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

cfg80211: properly name driver locking

Currently we call that cfg80211_put_dev(), but that is
misleading. With the new convention of using 'rdev' for
registered_device variables, also call that function
cfg80211_unlock_rdev().
Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c1e6fb1a
...@@ -171,12 +171,6 @@ cfg80211_get_dev_from_ifindex(int ifindex) ...@@ -171,12 +171,6 @@ cfg80211_get_dev_from_ifindex(int ifindex)
return drv; return drv;
} }
void cfg80211_put_dev(struct cfg80211_registered_device *drv)
{
BUG_ON(IS_ERR(drv));
mutex_unlock(&drv->mtx);
}
/* requires cfg80211_mutex to be held */ /* requires cfg80211_mutex to be held */
int cfg80211_dev_rename(struct cfg80211_registered_device *rdev, int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
char *newname) char *newname)
......
...@@ -146,7 +146,7 @@ __cfg80211_drv_from_info(struct genl_info *info); ...@@ -146,7 +146,7 @@ __cfg80211_drv_from_info(struct genl_info *info);
* If successful, it returns non-NULL and also locks * If successful, it returns non-NULL and also locks
* the driver's mutex! * the driver's mutex!
* *
* This means that you need to call cfg80211_put_dev() * This means that you need to call cfg80211_unlock_rdev()
* before being allowed to acquire &cfg80211_mutex! * before being allowed to acquire &cfg80211_mutex!
* *
* This is necessary because we need to lock the global * This is necessary because we need to lock the global
...@@ -170,7 +170,11 @@ struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx); ...@@ -170,7 +170,11 @@ struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx);
extern struct cfg80211_registered_device * extern struct cfg80211_registered_device *
cfg80211_get_dev_from_ifindex(int ifindex); cfg80211_get_dev_from_ifindex(int ifindex);
extern void cfg80211_put_dev(struct cfg80211_registered_device *drv); static inline void cfg80211_unlock_rdev(struct cfg80211_registered_device *drv)
{
BUG_ON(IS_ERR(drv) || !drv);
mutex_unlock(&drv->mtx);
}
/* free object */ /* free object */
extern void cfg80211_dev_free(struct cfg80211_registered_device *drv); extern void cfg80211_dev_free(struct cfg80211_registered_device *drv);
......
...@@ -411,14 +411,14 @@ static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info) ...@@ -411,14 +411,14 @@ static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
if (nl80211_send_wiphy(msg, info->snd_pid, info->snd_seq, 0, dev) < 0) if (nl80211_send_wiphy(msg, info->snd_pid, info->snd_seq, 0, dev) < 0)
goto out_free; goto out_free;
cfg80211_put_dev(dev); cfg80211_unlock_rdev(dev);
return genlmsg_unicast(msg, info->snd_pid); return genlmsg_unicast(msg, info->snd_pid);
out_free: out_free:
nlmsg_free(msg); nlmsg_free(msg);
out_err: out_err:
cfg80211_put_dev(dev); cfg80211_unlock_rdev(dev);
return -ENOBUFS; return -ENOBUFS;
} }
...@@ -737,7 +737,7 @@ static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info) ...@@ -737,7 +737,7 @@ static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
goto out_free; goto out_free;
dev_put(netdev); dev_put(netdev);
cfg80211_put_dev(dev); cfg80211_unlock_rdev(dev);
return genlmsg_unicast(msg, info->snd_pid); return genlmsg_unicast(msg, info->snd_pid);
...@@ -745,7 +745,7 @@ static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info) ...@@ -745,7 +745,7 @@ static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
nlmsg_free(msg); nlmsg_free(msg);
out_err: out_err:
dev_put(netdev); dev_put(netdev);
cfg80211_put_dev(dev); cfg80211_unlock_rdev(dev);
return -ENOBUFS; return -ENOBUFS;
} }
...@@ -853,7 +853,7 @@ static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info) ...@@ -853,7 +853,7 @@ static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
unlock: unlock:
dev_put(dev); dev_put(dev);
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
return err; return err;
...@@ -906,7 +906,7 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info) ...@@ -906,7 +906,7 @@ static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
type, err ? NULL : &flags, &params); type, err ? NULL : &flags, &params);
unlock: unlock:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
return err; return err;
...@@ -934,7 +934,7 @@ static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info) ...@@ -934,7 +934,7 @@ static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
err = drv->ops->del_virtual_intf(&drv->wiphy, ifindex); err = drv->ops->del_virtual_intf(&drv->wiphy, ifindex);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
return err; return err;
...@@ -1037,7 +1037,7 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info) ...@@ -1037,7 +1037,7 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
err = -ENOBUFS; err = -ENOBUFS;
nlmsg_free(msg); nlmsg_free(msg);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -1097,7 +1097,7 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info) ...@@ -1097,7 +1097,7 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
#endif #endif
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
...@@ -1163,7 +1163,7 @@ static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info) ...@@ -1163,7 +1163,7 @@ static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
err = drv->ops->add_key(&drv->wiphy, dev, key_idx, mac_addr, &params); err = drv->ops->add_key(&drv->wiphy, dev, key_idx, mac_addr, &params);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -1211,7 +1211,7 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info) ...@@ -1211,7 +1211,7 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
#endif #endif
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
...@@ -1306,7 +1306,7 @@ static int nl80211_addset_beacon(struct sk_buff *skb, struct genl_info *info) ...@@ -1306,7 +1306,7 @@ static int nl80211_addset_beacon(struct sk_buff *skb, struct genl_info *info)
err = call(&drv->wiphy, dev, &params); err = call(&drv->wiphy, dev, &params);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -1338,7 +1338,7 @@ static int nl80211_del_beacon(struct sk_buff *skb, struct genl_info *info) ...@@ -1338,7 +1338,7 @@ static int nl80211_del_beacon(struct sk_buff *skb, struct genl_info *info)
err = drv->ops->del_beacon(&drv->wiphy, dev); err = drv->ops->del_beacon(&drv->wiphy, dev);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -1572,7 +1572,7 @@ static int nl80211_dump_station(struct sk_buff *skb, ...@@ -1572,7 +1572,7 @@ static int nl80211_dump_station(struct sk_buff *skb,
cb->args[1] = sta_idx; cb->args[1] = sta_idx;
err = skb->len; err = skb->len;
out_err: out_err:
cfg80211_put_dev(dev); cfg80211_unlock_rdev(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -1624,7 +1624,7 @@ static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info) ...@@ -1624,7 +1624,7 @@ static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
out_free: out_free:
nlmsg_free(msg); nlmsg_free(msg);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -1760,7 +1760,7 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) ...@@ -1760,7 +1760,7 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
out: out:
if (params.vlan) if (params.vlan)
dev_put(params.vlan); dev_put(params.vlan);
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -1865,7 +1865,7 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) ...@@ -1865,7 +1865,7 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
out: out:
if (params.vlan) if (params.vlan)
dev_put(params.vlan); dev_put(params.vlan);
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -1904,7 +1904,7 @@ static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info) ...@@ -1904,7 +1904,7 @@ static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
err = drv->ops->del_station(&drv->wiphy, dev, mac_addr); err = drv->ops->del_station(&drv->wiphy, dev, mac_addr);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -2035,7 +2035,7 @@ static int nl80211_dump_mpath(struct sk_buff *skb, ...@@ -2035,7 +2035,7 @@ static int nl80211_dump_mpath(struct sk_buff *skb,
cb->args[1] = path_idx; cb->args[1] = path_idx;
err = skb->len; err = skb->len;
out_err: out_err:
cfg80211_put_dev(dev); cfg80211_unlock_rdev(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -2093,7 +2093,7 @@ static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info) ...@@ -2093,7 +2093,7 @@ static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info)
out_free: out_free:
nlmsg_free(msg); nlmsg_free(msg);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -2142,7 +2142,7 @@ static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info) ...@@ -2142,7 +2142,7 @@ static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info)
err = drv->ops->change_mpath(&drv->wiphy, dev, dst, next_hop); err = drv->ops->change_mpath(&drv->wiphy, dev, dst, next_hop);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -2190,7 +2190,7 @@ static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info) ...@@ -2190,7 +2190,7 @@ static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info)
err = drv->ops->add_mpath(&drv->wiphy, dev, dst, next_hop); err = drv->ops->add_mpath(&drv->wiphy, dev, dst, next_hop);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -2222,7 +2222,7 @@ static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info) ...@@ -2222,7 +2222,7 @@ static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
err = drv->ops->del_mpath(&drv->wiphy, dev, dst); err = drv->ops->del_mpath(&drv->wiphy, dev, dst);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -2278,7 +2278,7 @@ static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info) ...@@ -2278,7 +2278,7 @@ static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
err = drv->ops->change_bss(&drv->wiphy, dev, &params); err = drv->ops->change_bss(&drv->wiphy, dev, &params);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -2444,7 +2444,7 @@ static int nl80211_get_mesh_params(struct sk_buff *skb, ...@@ -2444,7 +2444,7 @@ static int nl80211_get_mesh_params(struct sk_buff *skb,
err = -EMSGSIZE; err = -EMSGSIZE;
out: out:
/* Cleanup */ /* Cleanup */
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -2550,7 +2550,7 @@ static int nl80211_set_mesh_params(struct sk_buff *skb, struct genl_info *info) ...@@ -2550,7 +2550,7 @@ static int nl80211_set_mesh_params(struct sk_buff *skb, struct genl_info *info)
out: out:
/* cleanup */ /* cleanup */
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -2890,7 +2890,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info) ...@@ -2890,7 +2890,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
kfree(request); kfree(request);
} }
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
out_rtnl: out_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -3007,7 +3007,7 @@ static int nl80211_dump_scan(struct sk_buff *skb, ...@@ -3007,7 +3007,7 @@ static int nl80211_dump_scan(struct sk_buff *skb,
cb->args[1] = idx; cb->args[1] = idx;
err = skb->len; err = skb->len;
cfg80211_put_dev(dev); cfg80211_unlock_rdev(dev);
out_put_netdev: out_put_netdev:
dev_put(netdev); dev_put(netdev);
...@@ -3112,7 +3112,7 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info) ...@@ -3112,7 +3112,7 @@ static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
ssid, ssid_len, ie, ie_len); ssid, ssid_len, ie, ie_len);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -3259,7 +3259,7 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info) ...@@ -3259,7 +3259,7 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
&crypto); &crypto);
out: out:
cfg80211_put_dev(rdev); cfg80211_unlock_rdev(rdev);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -3321,7 +3321,7 @@ static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info) ...@@ -3321,7 +3321,7 @@ static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
err = cfg80211_mlme_deauth(drv, dev, bssid, ie, ie_len, reason_code); err = cfg80211_mlme_deauth(drv, dev, bssid, ie, ie_len, reason_code);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -3383,7 +3383,7 @@ static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info) ...@@ -3383,7 +3383,7 @@ static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
err = cfg80211_mlme_disassoc(drv, dev, bssid, ie, ie_len, reason_code); err = cfg80211_mlme_disassoc(drv, dev, bssid, ie, ie_len, reason_code);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -3464,7 +3464,7 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info) ...@@ -3464,7 +3464,7 @@ static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
err = cfg80211_join_ibss(drv, dev, &ibss); err = cfg80211_join_ibss(drv, dev, &ibss);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -3501,7 +3501,7 @@ static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info) ...@@ -3501,7 +3501,7 @@ static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
err = cfg80211_leave_ibss(drv, dev, false); err = cfg80211_leave_ibss(drv, dev, false);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -3538,7 +3538,7 @@ static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) ...@@ -3538,7 +3538,7 @@ static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
rdev->testmode_info = NULL; rdev->testmode_info = NULL;
} }
cfg80211_put_dev(rdev); cfg80211_unlock_rdev(rdev);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -3707,7 +3707,7 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) ...@@ -3707,7 +3707,7 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
err = cfg80211_connect(drv, dev, &connect); err = cfg80211_connect(drv, dev, &connect);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
...@@ -3748,7 +3748,7 @@ static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info) ...@@ -3748,7 +3748,7 @@ static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
err = cfg80211_disconnect(drv, dev, reason, true); err = cfg80211_disconnect(drv, dev, reason, true);
out: out:
cfg80211_put_dev(drv); cfg80211_unlock_rdev(drv);
dev_put(dev); dev_put(dev);
unlock_rtnl: unlock_rtnl:
rtnl_unlock(); rtnl_unlock();
......
...@@ -28,8 +28,6 @@ void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted) ...@@ -28,8 +28,6 @@ void cfg80211_scan_done(struct cfg80211_scan_request *request, bool aborted)
if (!dev) if (!dev)
goto out; goto out;
WARN_ON(request != wiphy_to_dev(request->wiphy)->scan_req);
/* /*
* This must be before sending the other events! * This must be before sending the other events!
* Otherwise, wpa_supplicant gets completely confused with * Otherwise, wpa_supplicant gets completely confused with
...@@ -636,7 +634,7 @@ int cfg80211_wext_siwscan(struct net_device *dev, ...@@ -636,7 +634,7 @@ int cfg80211_wext_siwscan(struct net_device *dev,
} else } else
nl80211_send_scan_start(rdev, dev); nl80211_send_scan_start(rdev, dev);
out: out:
cfg80211_put_dev(rdev); cfg80211_unlock_rdev(rdev);
return err; return err;
} }
EXPORT_SYMBOL_GPL(cfg80211_wext_siwscan); EXPORT_SYMBOL_GPL(cfg80211_wext_siwscan);
...@@ -945,7 +943,7 @@ int cfg80211_wext_giwscan(struct net_device *dev, ...@@ -945,7 +943,7 @@ int cfg80211_wext_giwscan(struct net_device *dev,
} }
out: out:
cfg80211_put_dev(rdev); cfg80211_unlock_rdev(rdev);
return res; return res;
} }
EXPORT_SYMBOL_GPL(cfg80211_wext_giwscan); EXPORT_SYMBOL_GPL(cfg80211_wext_giwscan);
......
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