Lines Matching defs:rdev

26 #include "rdev-ops.h"
142 static inline void bss_ref_get(struct cfg80211_registered_device *rdev,
145 lockdep_assert_held(&rdev->bss_lock);
156 static inline void bss_ref_put(struct cfg80211_registered_device *rdev,
159 lockdep_assert_held(&rdev->bss_lock);
184 static bool __cfg80211_unlink_bss(struct cfg80211_registered_device *rdev,
187 lockdep_assert_held(&rdev->bss_lock);
205 rb_erase(&bss->rbn, &rdev->bss_tree);
206 rdev->bss_entries--;
207 WARN_ONCE((rdev->bss_entries == 0) ^ list_empty(&rdev->bss_list),
208 "rdev bss entries[%d]/list[empty:%d] corruption\n",
209 rdev->bss_entries, list_empty(&rdev->bss_list));
210 bss_ref_put(rdev, bss);
479 static void __cfg80211_bss_expire(struct cfg80211_registered_device *rdev,
485 lockdep_assert_held(&rdev->bss_lock);
487 list_for_each_entry_safe(bss, tmp, &rdev->bss_list, list) {
493 if (__cfg80211_unlink_bss(rdev, bss))
498 rdev->bss_generation++;
501 static bool cfg80211_bss_expire_oldest(struct cfg80211_registered_device *rdev)
506 lockdep_assert_held(&rdev->bss_lock);
508 list_for_each_entry(bss, &rdev->bss_list, list) {
525 * The callers make sure to increase rdev->bss_generation if anything
530 ret = __cfg80211_unlink_bss(rdev, oldest);
804 static int cfg80211_scan_6ghz(struct cfg80211_registered_device *rdev)
809 struct cfg80211_scan_request *request, *rdev_req = rdev->scan_req;
816 if (!rdev->wiphy.bands[NL80211_BAND_6GHZ])
819 iftd = ieee80211_get_sband_iftype_data(rdev->wiphy.bands[NL80211_BAND_6GHZ],
824 n_channels = rdev->wiphy.bands[NL80211_BAND_6GHZ]->n_channels;
829 spin_lock_bh(&rdev->bss_lock);
830 list_for_each_entry(intbss, &rdev->bss_list, list) {
838 spin_unlock_bh(&rdev->bss_lock);
894 ieee80211_get_channel(&rdev->wiphy, ap->center_freq);
941 struct cfg80211_scan_request *old = rdev->int_scan_req;
942 rdev->int_scan_req = request;
959 rdev->int_scan_req->info = old->info;
961 err = rdev_scan(rdev, request);
963 rdev->int_scan_req = old;
976 int cfg80211_scan(struct cfg80211_registered_device *rdev)
979 struct cfg80211_scan_request *rdev_req = rdev->scan_req;
982 if (!(rdev->wiphy.flags & WIPHY_FLAG_SPLIT_SCAN_6GHZ))
983 return rdev_scan(rdev, rdev_req);
991 return cfg80211_scan_6ghz(rdev);
1007 rdev->int_scan_req = request;
1008 return rdev_scan(rdev, request);
1011 void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev,
1021 lockdep_assert_held(&rdev->wiphy.mtx);
1023 if (rdev->scan_msg) {
1024 nl80211_send_scan_msg(rdev, rdev->scan_msg);
1025 rdev->scan_msg = NULL;
1029 rdev_req = rdev->scan_req;
1034 request = rdev->int_scan_req ? rdev->int_scan_req : rdev_req;
1037 (rdev->wiphy.flags & WIPHY_FLAG_SPLIT_SCAN_6GHZ) &&
1039 !cfg80211_scan_6ghz(rdev))
1053 spin_lock_bh(&rdev->bss_lock);
1054 __cfg80211_bss_expire(rdev, request->scan_start);
1055 spin_unlock_bh(&rdev->bss_lock);
1058 msg = nl80211_build_scan_msg(rdev, wdev, request->info.aborted);
1070 kfree(rdev->int_scan_req);
1071 rdev->int_scan_req = NULL;
1073 kfree(rdev->scan_req);
1074 rdev->scan_req = NULL;
1077 rdev->scan_msg = msg;
1079 nl80211_send_scan_msg(rdev, msg);
1115 void cfg80211_add_sched_scan_req(struct cfg80211_registered_device *rdev,
1118 lockdep_assert_held(&rdev->wiphy.mtx);
1120 list_add_rcu(&req->list, &rdev->sched_scan_req_list);
1123 static void cfg80211_del_sched_scan_req(struct cfg80211_registered_device *rdev,
1126 lockdep_assert_held(&rdev->wiphy.mtx);
1133 cfg80211_find_sched_scan_req(struct cfg80211_registered_device *rdev, u64 reqid)
1137 list_for_each_entry_rcu(pos, &rdev->sched_scan_req_list, list,
1138 lockdep_is_held(&rdev->wiphy.mtx)) {
1153 int cfg80211_sched_scan_req_possible(struct cfg80211_registered_device *rdev,
1159 list_for_each_entry(pos, &rdev->sched_scan_req_list, list) {
1172 if (i == rdev->wiphy.max_sched_scan_reqs)
1180 struct cfg80211_registered_device *rdev;
1183 rdev = container_of(work, struct cfg80211_registered_device,
1186 wiphy_lock(&rdev->wiphy);
1187 list_for_each_entry_safe(req, tmp, &rdev->sched_scan_req_list, list) {
1192 spin_lock_bh(&rdev->bss_lock);
1193 __cfg80211_bss_expire(rdev, req->scan_start);
1194 spin_unlock_bh(&rdev->bss_lock);
1201 wiphy_unlock(&rdev->wiphy);
1206 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1213 request = cfg80211_find_sched_scan_req(rdev, reqid);
1216 queue_work(cfg80211_wq, &rdev->sched_scan_res_wk);
1224 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1230 __cfg80211_stop_sched_scan(rdev, reqid, true);
1242 int cfg80211_stop_sched_scan_req(struct cfg80211_registered_device *rdev,
1246 lockdep_assert_held(&rdev->wiphy.mtx);
1249 int err = rdev_sched_scan_stop(rdev, req->dev, req->reqid);
1256 cfg80211_del_sched_scan_req(rdev, req);
1261 int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
1266 lockdep_assert_held(&rdev->wiphy.mtx);
1268 sched_scan_req = cfg80211_find_sched_scan_req(rdev, reqid);
1272 return cfg80211_stop_sched_scan_req(rdev, sched_scan_req,
1276 void cfg80211_bss_age(struct cfg80211_registered_device *rdev,
1282 spin_lock_bh(&rdev->bss_lock);
1283 list_for_each_entry(bss, &rdev->bss_list, list)
1285 spin_unlock_bh(&rdev->bss_lock);
1288 void cfg80211_bss_expire(struct cfg80211_registered_device *rdev)
1290 __cfg80211_bss_expire(rdev, jiffies - IEEE80211_SCAN_RESULT_EXPIRE);
1295 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1297 spin_lock_bh(&rdev->bss_lock);
1298 __cfg80211_bss_expire(rdev, jiffies);
1299 spin_unlock_bh(&rdev->bss_lock);
1508 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
1516 spin_lock_bh(&rdev->bss_lock);
1518 list_for_each_entry(bss, &rdev->bss_list, list) {
1537 bss_ref_get(rdev, res);
1542 spin_unlock_bh(&rdev->bss_lock);
1550 static void rb_insert_bss(struct cfg80211_registered_device *rdev,
1553 struct rb_node **p = &rdev->bss_tree.rb_node;
1576 rb_insert_color(&bss->rbn, &rdev->bss_tree);
1580 rb_find_bss(struct cfg80211_registered_device *rdev,
1584 struct rb_node *n = rdev->bss_tree.rb_node;
1603 static bool cfg80211_combine_bsses(struct cfg80211_registered_device *rdev,
1634 list_for_each_entry(bss, &rdev->bss_list, list) {
1669 WARN_ONCE(n_entries != rdev->bss_entries,
1670 "rdev bss entries[%d]/list[len:%d] corruption\n",
1671 rdev->bss_entries, n_entries);
1694 cfg80211_update_known_bss(struct cfg80211_registered_device *rdev,
1699 lockdep_assert_held(&rdev->bss_lock);
1774 __cfg80211_bss_update(struct cfg80211_registered_device *rdev,
1789 found = rb_find_bss(rdev, tmp, BSS_CMP_REGULAR);
1792 if (!cfg80211_update_known_bss(rdev, found, tmp, signal_valid))
1804 new = kzalloc(sizeof(*new) + rdev->wiphy.bss_priv_size,
1823 hidden = rb_find_bss(rdev, tmp, BSS_CMP_HIDE_ZLEN);
1825 hidden = rb_find_bss(rdev, tmp,
1846 if (!cfg80211_combine_bsses(rdev, new)) {
1847 bss_ref_put(rdev, new);
1852 if (rdev->bss_entries >= bss_entries_limit &&
1853 !cfg80211_bss_expire_oldest(rdev)) {
1854 bss_ref_put(rdev, new);
1861 bss_ref_get(rdev, bss_from_pub(tmp->pub.transmitted_bss));
1864 list_add_tail(&new->list, &rdev->bss_list);
1865 rdev->bss_entries++;
1866 rb_insert_bss(rdev, new);
1870 rdev->bss_generation++;
1871 bss_ref_get(rdev, found);
1877 cfg80211_bss_update(struct cfg80211_registered_device *rdev,
1883 spin_lock_bh(&rdev->bss_lock);
1884 res = __cfg80211_bss_update(rdev, tmp, signal_valid, ts);
1885 spin_unlock_bh(&rdev->bss_lock);
2035 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
2127 spin_lock_bh(&rdev->bss_lock);
2128 res = __cfg80211_bss_update(rdev, &tmp, signal_valid, ts);
2132 rdev_inform_bss(rdev, &res->pub, ies, drv_data->drv_data);
2139 if (__cfg80211_unlink_bss(rdev, res)) {
2140 rdev->bss_generation++;
2148 spin_unlock_bh(&rdev->bss_lock);
2155 spin_unlock_bh(&rdev->bss_lock);
2793 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
2903 spin_lock_bh(&rdev->bss_lock);
2904 res = __cfg80211_bss_update(rdev, &tmp, signal_valid, jiffies);
2908 rdev_inform_bss(rdev, &res->pub, ies, data->drv_data);
2910 spin_unlock_bh(&rdev->bss_lock);
2917 spin_unlock_bh(&rdev->bss_lock);
2962 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
2967 spin_lock_bh(&rdev->bss_lock);
2968 bss_ref_get(rdev, bss_from_pub(pub));
2969 spin_unlock_bh(&rdev->bss_lock);
2975 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
2980 spin_lock_bh(&rdev->bss_lock);
2981 bss_ref_put(rdev, bss_from_pub(pub));
2982 spin_unlock_bh(&rdev->bss_lock);
2988 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
2997 spin_lock_bh(&rdev->bss_lock);
3005 if (__cfg80211_unlink_bss(rdev, tmp1))
3006 rdev->bss_generation++;
3009 if (__cfg80211_unlink_bss(rdev, bss))
3010 rdev->bss_generation++;
3012 spin_unlock_bh(&rdev->bss_lock);
3023 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
3026 spin_lock_bh(&rdev->bss_lock);
3028 list_for_each_entry(bss, &rdev->bss_list, list) {
3034 spin_unlock_bh(&rdev->bss_lock);
3043 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
3050 spin_lock_bh(&rdev->bss_lock);
3065 list_for_each_entry(bss, &rdev->bss_list, list) {
3082 if (cfg80211_update_known_bss(rdev, cbss, new, false)) {
3091 if (__cfg80211_unlink_bss(rdev, bss))
3092 rdev->bss_generation++;
3096 if (!WARN_ON(!__cfg80211_unlink_bss(rdev, new)))
3097 rdev->bss_generation++;
3100 rb_erase(&cbss->rbn, &rdev->bss_tree);
3101 rb_insert_bss(rdev, cbss);
3102 rdev->bss_generation++;
3109 rb_erase(&bss->rbn, &rdev->bss_tree);
3110 rb_insert_bss(rdev, bss);
3111 rdev->bss_generation++;
3115 spin_unlock_bh(&rdev->bss_lock);
3122 struct cfg80211_registered_device *rdev;
3131 rdev = wiphy_to_rdev(dev->ieee80211_ptr->wiphy);
3133 rdev = ERR_PTR(-ENODEV);
3135 return rdev;
3142 struct cfg80211_registered_device *rdev;
3155 rdev = cfg80211_get_dev_from_ifindex(dev_net(dev), dev->ifindex);
3157 if (IS_ERR(rdev))
3158 return PTR_ERR(rdev);
3160 if (rdev->scan_req || rdev->scan_msg)
3163 wiphy = &rdev->wiphy;
3253 wiphy_lock(&rdev->wiphy);
3255 rdev->scan_req = creq;
3256 err = rdev_scan(rdev, creq);
3258 rdev->scan_req = NULL;
3261 nl80211_send_scan_start(rdev, dev->ieee80211_ptr);
3266 wiphy_unlock(&rdev->wiphy);
3580 static int ieee80211_scan_results(struct cfg80211_registered_device *rdev,
3589 spin_lock_bh(&rdev->bss_lock);
3590 cfg80211_bss_expire(rdev);
3592 list_for_each_entry(bss, &rdev->bss_list, list) {
3597 current_ev = ieee80211_bss(&rdev->wiphy, info, bss,
3604 spin_unlock_bh(&rdev->bss_lock);
3617 struct cfg80211_registered_device *rdev;
3623 rdev = cfg80211_get_dev_from_ifindex(dev_net(dev), dev->ifindex);
3625 if (IS_ERR(rdev))
3626 return PTR_ERR(rdev);
3628 if (rdev->scan_req || rdev->scan_msg)
3631 res = ieee80211_scan_results(rdev, info, extra, data->length);