nan_ucfg_api.c 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452
  1. /*
  2. * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for
  6. * any purpose with or without fee is hereby granted, provided that the
  7. * above copyright notice and this permission notice appear in all
  8. * copies.
  9. *
  10. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  11. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  12. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  13. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  14. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  15. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  16. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  17. * PERFORMANCE OF THIS SOFTWARE.
  18. */
  19. /**
  20. * DOC: contains interface definitions for OS_IF layer
  21. */
  22. #include "nan_ucfg_api.h"
  23. #include "nan_public_structs.h"
  24. #include "wlan_nan_api.h"
  25. #include "../../core/src/nan_main_i.h"
  26. #include "scheduler_api.h"
  27. #include "wlan_objmgr_psoc_obj.h"
  28. #include "wlan_objmgr_pdev_obj.h"
  29. #include "wlan_objmgr_vdev_obj.h"
  30. #include "wlan_osif_request_manager.h"
  31. #include "wlan_policy_mgr_api.h"
  32. #include "cfg_ucfg_api.h"
  33. #include "cfg_nan.h"
  34. #include "wlan_mlme_api.h"
  35. #include "cfg_nan_api.h"
  36. #include "wlan_tdls_ucfg_api.h"
  37. #include "wlan_nan_api_i.h"
  38. struct wlan_objmgr_psoc;
  39. struct wlan_objmgr_vdev;
  40. #ifdef WLAN_FEATURE_NAN
  41. /**
  42. * nan_cfg_init() - Initialize NAN config params
  43. * @psoc: Pointer to PSOC Object
  44. * @nan_obj: Pointer to NAN private object
  45. *
  46. * This function initialize NAN config params
  47. */
  48. static void nan_cfg_init(struct wlan_objmgr_psoc *psoc,
  49. struct nan_psoc_priv_obj *nan_obj)
  50. {
  51. nan_obj->cfg_param.enable = cfg_get(psoc, CFG_NAN_ENABLE);
  52. nan_obj->cfg_param.support_mp0_discovery =
  53. cfg_get(psoc,
  54. CFG_SUPPORT_MP0_DISCOVERY);
  55. nan_obj->cfg_param.ndp_keep_alive_period =
  56. cfg_get(psoc,
  57. CFG_NDP_KEEP_ALIVE_PERIOD);
  58. nan_obj->cfg_param.max_ndp_sessions = cfg_get(psoc,
  59. CFG_NDP_MAX_SESSIONS);
  60. nan_obj->cfg_param.max_ndi = cfg_get(psoc, CFG_NDI_MAX_SUPPORT);
  61. nan_obj->cfg_param.nan_feature_config =
  62. cfg_get(psoc, CFG_NAN_FEATURE_CONFIG);
  63. nan_obj->cfg_param.disable_6g_nan = cfg_get(psoc, CFG_DISABLE_6G_NAN);
  64. }
  65. /**
  66. * nan_cfg_dp_init() - Initialize NAN Datapath config params
  67. * @psoc: Pointer to PSOC Object
  68. * @nan_obj: Pointer to NAN private object
  69. *
  70. * This function initialize NAN config params
  71. */
  72. static void nan_cfg_dp_init(struct wlan_objmgr_psoc *psoc,
  73. struct nan_psoc_priv_obj *nan_obj)
  74. {
  75. nan_obj->cfg_param.dp_enable = cfg_get(psoc,
  76. CFG_NAN_DATAPATH_ENABLE);
  77. nan_obj->cfg_param.ndi_mac_randomize =
  78. cfg_get(psoc, CFG_NAN_RANDOMIZE_NDI_MAC);
  79. nan_obj->cfg_param.ndp_inactivity_timeout =
  80. cfg_get(psoc, CFG_NAN_NDP_INACTIVITY_TIMEOUT);
  81. nan_obj->cfg_param.nan_separate_iface_support =
  82. cfg_get(psoc, CFG_NAN_SEPARATE_IFACE_SUPP);
  83. }
  84. #else
  85. static void nan_cfg_init(struct wlan_objmgr_psoc *psoc,
  86. struct nan_psoc_priv_obj *nan_obj)
  87. {
  88. }
  89. static void nan_cfg_dp_init(struct wlan_objmgr_psoc *psoc,
  90. struct nan_psoc_priv_obj *nan_obj)
  91. {
  92. }
  93. #endif
  94. bool ucfg_get_disable_6g_nan(struct wlan_objmgr_psoc *psoc)
  95. {
  96. struct nan_psoc_priv_obj *nan_obj = nan_get_psoc_priv_obj(psoc);
  97. if (!nan_obj) {
  98. nan_err("nan psoc priv object is NULL");
  99. return cfg_default(CFG_DISABLE_6G_NAN);
  100. }
  101. return nan_obj->cfg_param.disable_6g_nan;
  102. }
  103. QDF_STATUS ucfg_nan_psoc_open(struct wlan_objmgr_psoc *psoc)
  104. {
  105. struct nan_psoc_priv_obj *nan_obj = nan_get_psoc_priv_obj(psoc);
  106. if (!nan_obj) {
  107. nan_err("nan psoc priv object is NULL");
  108. return QDF_STATUS_E_NULL_VALUE;
  109. }
  110. nan_cfg_init(psoc, nan_obj);
  111. nan_cfg_dp_init(psoc, nan_obj);
  112. return QDF_STATUS_SUCCESS;
  113. }
  114. void ucfg_nan_psoc_close(struct wlan_objmgr_psoc *psoc)
  115. {
  116. /* No cleanup required on psoc close for NAN */
  117. }
  118. inline QDF_STATUS __ucfg_nan_set_ndi_state(struct wlan_objmgr_vdev *vdev,
  119. enum nan_datapath_state state,
  120. const char *func)
  121. {
  122. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  123. enum nan_datapath_state current_state;
  124. if (!priv_obj) {
  125. nan_err("priv_obj is null");
  126. return QDF_STATUS_E_NULL_VALUE;
  127. }
  128. qdf_spin_lock_bh(&priv_obj->lock);
  129. current_state = priv_obj->state;
  130. priv_obj->state = state;
  131. qdf_spin_unlock_bh(&priv_obj->lock);
  132. nan_nofl_debug("%s: ndi state: current: %u, new: %u", func,
  133. current_state, state);
  134. return QDF_STATUS_SUCCESS;
  135. }
  136. inline enum nan_datapath_state ucfg_nan_get_ndi_state(
  137. struct wlan_objmgr_vdev *vdev)
  138. {
  139. return wlan_nan_get_ndi_state(vdev);
  140. }
  141. inline QDF_STATUS ucfg_nan_set_active_peers(struct wlan_objmgr_vdev *vdev,
  142. uint32_t val)
  143. {
  144. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  145. if (!priv_obj) {
  146. nan_err("priv_obj is null");
  147. return QDF_STATUS_E_NULL_VALUE;
  148. }
  149. qdf_spin_lock_bh(&priv_obj->lock);
  150. priv_obj->active_ndp_peers = val;
  151. qdf_spin_unlock_bh(&priv_obj->lock);
  152. return QDF_STATUS_SUCCESS;
  153. }
  154. /**
  155. * ucfg_nan_update_mc_list() - update the multicast list
  156. * @vdev: Pointer to VDEV Object
  157. *
  158. * This function will update the multicast list for NDP peer
  159. */
  160. static void ucfg_nan_update_mc_list(struct wlan_objmgr_vdev *vdev)
  161. {
  162. struct nan_callbacks cb_obj;
  163. QDF_STATUS status;
  164. struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev);
  165. if (!psoc) {
  166. nan_err("psoc is null");
  167. return;
  168. }
  169. status = ucfg_nan_get_callbacks(psoc, &cb_obj);
  170. if (QDF_IS_STATUS_ERROR(status)) {
  171. nan_err("Couldn't get callback object");
  172. return;
  173. }
  174. if (!cb_obj.set_mc_list) {
  175. nan_err("set_mc_list callback not registered");
  176. return;
  177. }
  178. cb_obj.set_mc_list(vdev);
  179. }
  180. inline void ucfg_nan_set_peer_mc_list(struct wlan_objmgr_vdev *vdev,
  181. struct qdf_mac_addr peer_mac_addr)
  182. {
  183. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  184. uint32_t max_ndp_sessions = 0;
  185. struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev);
  186. int i, list_idx = 0;
  187. if (!priv_obj) {
  188. nan_err("priv_obj is null");
  189. return;
  190. }
  191. if (!psoc) {
  192. nan_err("psoc is null");
  193. return;
  194. }
  195. cfg_nan_get_ndp_max_sessions(psoc, &max_ndp_sessions);
  196. qdf_spin_lock_bh(&priv_obj->lock);
  197. for (i = 0; i < max_ndp_sessions; i++) {
  198. if (qdf_is_macaddr_zero(&priv_obj->peer_mc_addr_list[i])) {
  199. list_idx = i;
  200. break;
  201. }
  202. }
  203. if (list_idx == max_ndp_sessions) {
  204. nan_err("Peer multicast address list is full");
  205. qdf_spin_unlock_bh(&priv_obj->lock);
  206. }
  207. /* Derive peer multicast addr */
  208. peer_mac_addr.bytes[0] = 0x33;
  209. peer_mac_addr.bytes[1] = 0x33;
  210. peer_mac_addr.bytes[2] = 0xff;
  211. priv_obj->peer_mc_addr_list[list_idx] = peer_mac_addr;
  212. qdf_spin_unlock_bh(&priv_obj->lock);
  213. ucfg_nan_update_mc_list(vdev);
  214. }
  215. inline void ucfg_nan_get_peer_mc_list(
  216. struct wlan_objmgr_vdev *vdev,
  217. struct qdf_mac_addr **peer_mc_addr_list)
  218. {
  219. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  220. if (!priv_obj) {
  221. nan_err("priv_obj is null");
  222. return;
  223. }
  224. *peer_mc_addr_list = priv_obj->peer_mc_addr_list;
  225. }
  226. inline void ucfg_nan_clear_peer_mc_list(struct wlan_objmgr_psoc *psoc,
  227. struct wlan_objmgr_vdev *vdev,
  228. struct qdf_mac_addr *peer_mac_addr)
  229. {
  230. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  231. int i;
  232. uint32_t max_ndp_sessions = 0;
  233. struct qdf_mac_addr derived_peer_mc_addr;
  234. if (!priv_obj) {
  235. nan_err("priv_obj is null");
  236. return;
  237. }
  238. /* Derive peer multicast addr */
  239. derived_peer_mc_addr = *peer_mac_addr;
  240. derived_peer_mc_addr.bytes[0] = 0x33;
  241. derived_peer_mc_addr.bytes[1] = 0x33;
  242. derived_peer_mc_addr.bytes[2] = 0xff;
  243. qdf_spin_lock_bh(&priv_obj->lock);
  244. cfg_nan_get_ndp_max_sessions(psoc, &max_ndp_sessions);
  245. for (i = 0; i < max_ndp_sessions; i++) {
  246. if (qdf_is_macaddr_equal(&priv_obj->peer_mc_addr_list[i],
  247. &derived_peer_mc_addr)) {
  248. qdf_zero_macaddr(&priv_obj->peer_mc_addr_list[i]);
  249. break;
  250. }
  251. }
  252. qdf_spin_unlock_bh(&priv_obj->lock);
  253. ucfg_nan_update_mc_list(vdev);
  254. }
  255. inline uint32_t ucfg_nan_get_active_peers(struct wlan_objmgr_vdev *vdev)
  256. {
  257. uint32_t val;
  258. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  259. if (!priv_obj) {
  260. nan_err("priv_obj is null");
  261. return 0;
  262. }
  263. qdf_spin_lock_bh(&priv_obj->lock);
  264. val = priv_obj->active_ndp_peers;
  265. qdf_spin_unlock_bh(&priv_obj->lock);
  266. return val;
  267. }
  268. inline QDF_STATUS ucfg_nan_set_ndp_create_transaction_id(
  269. struct wlan_objmgr_vdev *vdev, uint16_t val)
  270. {
  271. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  272. if (!priv_obj) {
  273. nan_err("priv_obj is null");
  274. return QDF_STATUS_E_NULL_VALUE;
  275. }
  276. qdf_spin_lock_bh(&priv_obj->lock);
  277. priv_obj->ndp_create_transaction_id = val;
  278. qdf_spin_unlock_bh(&priv_obj->lock);
  279. return QDF_STATUS_SUCCESS;
  280. }
  281. inline uint16_t ucfg_nan_get_ndp_create_transaction_id(
  282. struct wlan_objmgr_vdev *vdev)
  283. {
  284. uint16_t val;
  285. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  286. if (!priv_obj) {
  287. nan_err("priv_obj is null");
  288. return 0;
  289. }
  290. qdf_spin_lock_bh(&priv_obj->lock);
  291. val = priv_obj->ndp_create_transaction_id;
  292. qdf_spin_unlock_bh(&priv_obj->lock);
  293. return val;
  294. }
  295. inline QDF_STATUS ucfg_nan_set_ndp_delete_transaction_id(
  296. struct wlan_objmgr_vdev *vdev, uint16_t val)
  297. {
  298. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  299. if (!priv_obj) {
  300. nan_err("priv_obj is null");
  301. return QDF_STATUS_E_NULL_VALUE;
  302. }
  303. qdf_spin_lock_bh(&priv_obj->lock);
  304. priv_obj->ndp_delete_transaction_id = val;
  305. qdf_spin_unlock_bh(&priv_obj->lock);
  306. return QDF_STATUS_SUCCESS;
  307. }
  308. inline uint16_t ucfg_nan_get_ndp_delete_transaction_id(
  309. struct wlan_objmgr_vdev *vdev)
  310. {
  311. uint16_t val;
  312. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  313. if (!priv_obj) {
  314. nan_err("priv_obj is null");
  315. return 0;
  316. }
  317. qdf_spin_lock_bh(&priv_obj->lock);
  318. val = priv_obj->ndp_delete_transaction_id;
  319. qdf_spin_unlock_bh(&priv_obj->lock);
  320. return val;
  321. }
  322. inline QDF_STATUS ucfg_nan_set_ndi_delete_rsp_reason(
  323. struct wlan_objmgr_vdev *vdev, uint32_t val)
  324. {
  325. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  326. if (!priv_obj) {
  327. nan_err("priv_obj is null");
  328. return QDF_STATUS_E_NULL_VALUE;
  329. }
  330. qdf_spin_lock_bh(&priv_obj->lock);
  331. priv_obj->ndi_delete_rsp_reason = val;
  332. qdf_spin_unlock_bh(&priv_obj->lock);
  333. return QDF_STATUS_SUCCESS;
  334. }
  335. inline uint32_t ucfg_nan_get_ndi_delete_rsp_reason(
  336. struct wlan_objmgr_vdev *vdev)
  337. {
  338. uint32_t val;
  339. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  340. if (!priv_obj) {
  341. nan_err("priv_obj is null");
  342. return 0;
  343. }
  344. qdf_spin_lock_bh(&priv_obj->lock);
  345. val = priv_obj->ndi_delete_rsp_reason;
  346. qdf_spin_unlock_bh(&priv_obj->lock);
  347. return val;
  348. }
  349. inline QDF_STATUS ucfg_nan_set_ndi_delete_rsp_status(
  350. struct wlan_objmgr_vdev *vdev, uint32_t val)
  351. {
  352. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  353. if (!priv_obj) {
  354. nan_err("priv_obj is null");
  355. return QDF_STATUS_E_NULL_VALUE;
  356. }
  357. qdf_spin_lock_bh(&priv_obj->lock);
  358. priv_obj->ndi_delete_rsp_status = val;
  359. qdf_spin_unlock_bh(&priv_obj->lock);
  360. return QDF_STATUS_SUCCESS;
  361. }
  362. inline uint32_t ucfg_nan_get_ndi_delete_rsp_status(
  363. struct wlan_objmgr_vdev *vdev)
  364. {
  365. uint32_t val;
  366. struct nan_vdev_priv_obj *priv_obj = nan_get_vdev_priv_obj(vdev);
  367. if (!priv_obj) {
  368. nan_err("priv_obj is null");
  369. return QDF_STATUS_E_NULL_VALUE;
  370. }
  371. qdf_spin_lock_bh(&priv_obj->lock);
  372. val = priv_obj->ndi_delete_rsp_status;
  373. qdf_spin_unlock_bh(&priv_obj->lock);
  374. return val;
  375. }
  376. inline QDF_STATUS ucfg_nan_get_callbacks(struct wlan_objmgr_psoc *psoc,
  377. struct nan_callbacks *cb_obj)
  378. {
  379. struct nan_psoc_priv_obj *psoc_obj = nan_get_psoc_priv_obj(psoc);
  380. if (!psoc_obj) {
  381. nan_err("nan psoc priv object is NULL");
  382. return QDF_STATUS_E_NULL_VALUE;
  383. }
  384. qdf_spin_lock_bh(&psoc_obj->lock);
  385. qdf_mem_copy(cb_obj, &psoc_obj->cb_obj, sizeof(*cb_obj));
  386. qdf_spin_unlock_bh(&psoc_obj->lock);
  387. return QDF_STATUS_SUCCESS;
  388. }
  389. static QDF_STATUS ucfg_nan_sch_msg_flush_cb(struct scheduler_msg *msg)
  390. {
  391. struct wlan_objmgr_vdev *vdev = NULL;
  392. if (!msg || !msg->bodyptr)
  393. return QDF_STATUS_E_NULL_VALUE;
  394. switch (msg->type) {
  395. case NDP_INITIATOR_REQ:
  396. vdev = ((struct nan_datapath_initiator_req *)
  397. msg->bodyptr)->vdev;
  398. break;
  399. case NDP_RESPONDER_REQ:
  400. vdev = ((struct nan_datapath_responder_req *)
  401. msg->bodyptr)->vdev;
  402. break;
  403. case NDP_END_REQ:
  404. vdev = ((struct nan_datapath_end_req *)msg->bodyptr)->vdev;
  405. break;
  406. case NDP_END_ALL:
  407. vdev = ((struct nan_datapath_end_all_ndps *)msg->bodyptr)->vdev;
  408. break;
  409. default:
  410. nan_err("Invalid NAN msg type during sch flush");
  411. return QDF_STATUS_E_INVAL;
  412. }
  413. if (vdev) {
  414. wlan_objmgr_vdev_release_ref(vdev, WLAN_NAN_ID);
  415. qdf_mem_free(msg->bodyptr);
  416. }
  417. return QDF_STATUS_SUCCESS;
  418. }
  419. QDF_STATUS ucfg_nan_req_processor(struct wlan_objmgr_vdev *vdev,
  420. void *in_req, uint32_t req_type)
  421. {
  422. uint32_t len;
  423. QDF_STATUS status;
  424. struct scheduler_msg msg = {0};
  425. int err;
  426. struct nan_psoc_priv_obj *psoc_obj = NULL;
  427. struct osif_request *request = NULL;
  428. static const struct osif_request_params params = {
  429. .priv_size = 0,
  430. .timeout_ms = WLAN_WAIT_TIME_NDP_END,
  431. };
  432. if (!in_req) {
  433. nan_alert("req is null");
  434. return QDF_STATUS_E_NULL_VALUE;
  435. }
  436. switch (req_type) {
  437. case NDP_INITIATOR_REQ:
  438. len = sizeof(struct nan_datapath_initiator_req);
  439. break;
  440. case NDP_RESPONDER_REQ:
  441. len = sizeof(struct nan_datapath_responder_req);
  442. break;
  443. case NDP_END_REQ:
  444. len = sizeof(struct nan_datapath_end_req);
  445. psoc_obj = nan_get_psoc_priv_obj(wlan_vdev_get_psoc(vdev));
  446. if (!psoc_obj) {
  447. nan_err("nan psoc priv object is NULL");
  448. return QDF_STATUS_E_INVAL;
  449. }
  450. request = osif_request_alloc(&params);
  451. if (!request) {
  452. nan_err("Request allocation failure");
  453. return QDF_STATUS_E_NOMEM;
  454. }
  455. psoc_obj->ndp_request_ctx = osif_request_cookie(request);
  456. break;
  457. case NDP_END_ALL:
  458. len = sizeof(struct nan_datapath_end_all_ndps);
  459. break;
  460. default:
  461. nan_err("in correct message req type: %d", req_type);
  462. return QDF_STATUS_E_INVAL;
  463. }
  464. msg.bodyptr = qdf_mem_malloc(len);
  465. if (!msg.bodyptr) {
  466. status = QDF_STATUS_E_NOMEM;
  467. goto fail;
  468. }
  469. qdf_mem_copy(msg.bodyptr, in_req, len);
  470. msg.type = req_type;
  471. msg.callback = nan_scheduled_msg_handler;
  472. msg.flush_callback = ucfg_nan_sch_msg_flush_cb;
  473. status = scheduler_post_message(QDF_MODULE_ID_HDD,
  474. QDF_MODULE_ID_NAN,
  475. QDF_MODULE_ID_OS_IF, &msg);
  476. if (QDF_IS_STATUS_ERROR(status)) {
  477. nan_err("failed to post msg to NAN component, status: %d",
  478. status);
  479. goto fail;
  480. }
  481. if (req_type == NDP_END_REQ) {
  482. nan_debug("Wait for NDP END indication");
  483. err = osif_request_wait_for_response(request);
  484. if (err)
  485. nan_debug("NAN request timed out: %d", err);
  486. osif_request_put(request);
  487. psoc_obj->ndp_request_ctx = NULL;
  488. }
  489. return QDF_STATUS_SUCCESS;
  490. fail:
  491. qdf_mem_free(msg.bodyptr);
  492. if (req_type == NDP_END_REQ) {
  493. osif_request_put(request);
  494. psoc_obj->ndp_request_ctx = NULL;
  495. }
  496. return status;
  497. }
  498. void ucfg_nan_datapath_event_handler(struct wlan_objmgr_psoc *psoc,
  499. struct wlan_objmgr_vdev *vdev,
  500. uint32_t type, void *msg)
  501. {
  502. struct nan_psoc_priv_obj *psoc_obj = nan_get_psoc_priv_obj(psoc);
  503. if (!psoc_obj) {
  504. nan_err("nan psoc priv object is NULL");
  505. return;
  506. }
  507. psoc_obj->cb_obj.os_if_ndp_event_handler(psoc, vdev, type, msg);
  508. }
  509. static void ucfg_nan_request_process_cb(void *cookie)
  510. {
  511. struct osif_request *request;
  512. request = osif_request_get(cookie);
  513. if (request) {
  514. osif_request_complete(request);
  515. osif_request_put(request);
  516. } else {
  517. nan_debug("Obsolete request (cookie:0x%pK), do nothing",
  518. cookie);
  519. }
  520. }
  521. #ifdef WLAN_FEATURE_SR
  522. static void
  523. nan_register_sr_concurrency_callback(struct nan_psoc_priv_obj *psoc_obj,
  524. struct nan_callbacks *cb_obj)
  525. {
  526. psoc_obj->cb_obj.nan_sr_concurrency_update =
  527. cb_obj->nan_sr_concurrency_update;
  528. }
  529. #else
  530. static inline void
  531. nan_register_sr_concurrency_callback(struct nan_psoc_priv_obj *psoc_obj,
  532. struct nan_callbacks *cb_obj)
  533. {}
  534. #endif
  535. int ucfg_nan_register_hdd_callbacks(struct wlan_objmgr_psoc *psoc,
  536. struct nan_callbacks *cb_obj)
  537. {
  538. struct nan_psoc_priv_obj *psoc_obj = nan_get_psoc_priv_obj(psoc);
  539. if (!psoc_obj) {
  540. nan_err("nan psoc priv object is NULL");
  541. return -EINVAL;
  542. }
  543. psoc_obj->cb_obj.ndi_open = cb_obj->ndi_open;
  544. psoc_obj->cb_obj.ndi_set_mode = cb_obj->ndi_set_mode;
  545. psoc_obj->cb_obj.ndi_start = cb_obj->ndi_start;
  546. psoc_obj->cb_obj.ndi_delete = cb_obj->ndi_delete;
  547. psoc_obj->cb_obj.ndi_close = cb_obj->ndi_close;
  548. psoc_obj->cb_obj.drv_ndi_create_rsp_handler =
  549. cb_obj->drv_ndi_create_rsp_handler;
  550. psoc_obj->cb_obj.drv_ndi_delete_rsp_handler =
  551. cb_obj->drv_ndi_delete_rsp_handler;
  552. psoc_obj->cb_obj.new_peer_ind = cb_obj->new_peer_ind;
  553. psoc_obj->cb_obj.peer_departed_ind = cb_obj->peer_departed_ind;
  554. psoc_obj->cb_obj.os_if_ndp_event_handler =
  555. cb_obj->os_if_ndp_event_handler;
  556. psoc_obj->cb_obj.os_if_nan_event_handler =
  557. cb_obj->os_if_nan_event_handler;
  558. psoc_obj->cb_obj.ucfg_nan_request_process_cb =
  559. ucfg_nan_request_process_cb;
  560. psoc_obj->cb_obj.nan_concurrency_update =
  561. cb_obj->nan_concurrency_update;
  562. psoc_obj->cb_obj.set_mc_list = cb_obj->set_mc_list;
  563. nan_register_sr_concurrency_callback(psoc_obj, cb_obj);
  564. return 0;
  565. }
  566. int ucfg_nan_register_lim_callbacks(struct wlan_objmgr_psoc *psoc,
  567. struct nan_callbacks *cb_obj)
  568. {
  569. struct nan_psoc_priv_obj *psoc_obj = nan_get_psoc_priv_obj(psoc);
  570. if (!psoc_obj) {
  571. nan_err("nan psoc priv object is NULL");
  572. return -EINVAL;
  573. }
  574. psoc_obj->cb_obj.add_ndi_peer = cb_obj->add_ndi_peer;
  575. psoc_obj->cb_obj.ndp_delete_peers = cb_obj->ndp_delete_peers;
  576. psoc_obj->cb_obj.delete_peers_by_addr = cb_obj->delete_peers_by_addr;
  577. return 0;
  578. }
  579. int ucfg_nan_register_wma_callbacks(struct wlan_objmgr_psoc *psoc,
  580. struct nan_callbacks *cb_obj)
  581. {
  582. struct nan_psoc_priv_obj *psoc_obj = nan_get_psoc_priv_obj(psoc);
  583. if (!psoc_obj) {
  584. nan_err("nan psoc priv object is NULL");
  585. return -EINVAL;
  586. }
  587. psoc_obj->cb_obj.update_ndi_conn = cb_obj->update_ndi_conn;
  588. return 0;
  589. }
  590. void ucfg_nan_set_tgt_caps(struct wlan_objmgr_psoc *psoc,
  591. struct nan_tgt_caps *nan_caps)
  592. {
  593. struct nan_psoc_priv_obj *psoc_priv = nan_get_psoc_priv_obj(psoc);
  594. if (!psoc_priv) {
  595. nan_err("nan psoc priv object is NULL");
  596. return;
  597. }
  598. psoc_priv->nan_caps = *nan_caps;
  599. }
  600. bool ucfg_is_nan_conc_control_supported(struct wlan_objmgr_psoc *psoc)
  601. {
  602. struct nan_psoc_priv_obj *psoc_priv;
  603. psoc_priv = nan_get_psoc_priv_obj(psoc);
  604. if (!psoc_priv) {
  605. nan_err("nan psoc priv object is NULL");
  606. return false;
  607. }
  608. return (psoc_priv->nan_caps.nan_conc_control == 1);
  609. }
  610. bool ucfg_is_nan_dbs_supported(struct wlan_objmgr_psoc *psoc)
  611. {
  612. struct nan_psoc_priv_obj *psoc_priv;
  613. psoc_priv = nan_get_psoc_priv_obj(psoc);
  614. if (!psoc_priv) {
  615. nan_err("nan psoc priv object is NULL");
  616. return false;
  617. }
  618. return (psoc_priv->nan_caps.nan_dbs_supported == 1);
  619. }
  620. bool ucfg_is_ndi_dbs_supported(struct wlan_objmgr_psoc *psoc)
  621. {
  622. struct nan_psoc_priv_obj *psoc_priv;
  623. psoc_priv = nan_get_psoc_priv_obj(psoc);
  624. if (!psoc_priv) {
  625. nan_err("nan psoc priv object is NULL");
  626. return false;
  627. }
  628. return (psoc_priv->nan_caps.ndi_dbs_supported == 1);
  629. }
  630. bool ucfg_is_nan_enable_allowed(struct wlan_objmgr_psoc *psoc,
  631. uint32_t nan_ch_freq, uint8_t vdev_id)
  632. {
  633. return nan_is_enable_allowed(psoc, nan_ch_freq, vdev_id);
  634. }
  635. bool ucfg_is_nan_disc_active(struct wlan_objmgr_psoc *psoc)
  636. {
  637. return nan_is_disc_active(psoc);
  638. }
  639. QDF_STATUS ucfg_nan_discovery_req(void *in_req, uint32_t req_type)
  640. {
  641. struct wlan_objmgr_psoc *psoc;
  642. struct scheduler_msg msg = {0};
  643. uint32_t len;
  644. QDF_STATUS status;
  645. struct nan_psoc_priv_obj *psoc_priv;
  646. struct osif_request *request = NULL;
  647. static const struct osif_request_params params = {
  648. .priv_size = 0,
  649. .timeout_ms = 4000,
  650. };
  651. int err = 0;
  652. bool recovery;
  653. if (!in_req) {
  654. nan_alert("NAN Discovery req is null");
  655. return QDF_STATUS_E_NULL_VALUE;
  656. }
  657. switch (req_type) {
  658. case NAN_ENABLE_REQ: {
  659. struct nan_enable_req *req = in_req;
  660. psoc = req->psoc;
  661. psoc_priv = nan_get_psoc_priv_obj(psoc);
  662. if (!psoc_priv) {
  663. nan_err("nan psoc priv object is NULL");
  664. return QDF_STATUS_E_INVAL;
  665. }
  666. if (policy_mgr_is_sta_mon_concurrency(psoc))
  667. return QDF_STATUS_E_INVAL;
  668. /*
  669. * Take a psoc reference while it is being used by the
  670. * NAN requests.
  671. */
  672. status = wlan_objmgr_psoc_try_get_ref(psoc,
  673. WLAN_NAN_ID);
  674. if (QDF_IS_STATUS_ERROR(status)) {
  675. nan_err("Couldn't obtain psoc ref");
  676. return status;
  677. }
  678. status = nan_discovery_pre_enable(req->pdev,
  679. req->social_chan_2g_freq);
  680. if (QDF_IS_STATUS_SUCCESS(status)) {
  681. len = sizeof(struct nan_enable_req) +
  682. req->params.request_data_len;
  683. } else {
  684. wlan_objmgr_psoc_release_ref(psoc,
  685. WLAN_NAN_ID);
  686. return status;
  687. }
  688. break;
  689. }
  690. case NAN_DISABLE_REQ: {
  691. struct nan_disable_req *req = in_req;
  692. psoc = req->psoc;
  693. psoc_priv = nan_get_psoc_priv_obj(psoc);
  694. if (!psoc_priv) {
  695. nan_err("nan psoc priv object is NULL");
  696. return QDF_STATUS_E_INVAL;
  697. }
  698. status = wlan_objmgr_psoc_try_get_ref(psoc,
  699. WLAN_NAN_ID);
  700. if (QDF_IS_STATUS_ERROR(status)) {
  701. nan_err("Couldn't obtain psoc ref");
  702. return status;
  703. }
  704. status =
  705. nan_set_discovery_state(req->psoc,
  706. NAN_DISC_DISABLE_IN_PROGRESS);
  707. if (QDF_IS_STATUS_SUCCESS(status)) {
  708. len = sizeof(struct nan_disable_req) +
  709. req->params.request_data_len;
  710. } else {
  711. wlan_objmgr_psoc_release_ref(psoc,
  712. WLAN_NAN_ID);
  713. return status;
  714. }
  715. break;
  716. }
  717. case NAN_GENERIC_REQ: {
  718. struct nan_generic_req *req = in_req;
  719. psoc = req->psoc;
  720. psoc_priv = nan_get_psoc_priv_obj(psoc);
  721. if (!psoc_priv) {
  722. nan_err("nan psoc priv object is NULL");
  723. return QDF_STATUS_E_INVAL;
  724. }
  725. status = wlan_objmgr_psoc_try_get_ref(psoc,
  726. WLAN_NAN_ID);
  727. if (QDF_IS_STATUS_ERROR(status)) {
  728. nan_err("Couldn't obtain psoc ref");
  729. return status;
  730. }
  731. len = sizeof(struct nan_generic_req) +
  732. req->params.request_data_len;
  733. break;
  734. }
  735. default:
  736. nan_err("in correct message req type: %d", req_type);
  737. return QDF_STATUS_E_INVAL;
  738. }
  739. msg.bodyptr = qdf_mem_malloc(len);
  740. if (!msg.bodyptr) {
  741. wlan_objmgr_psoc_release_ref(psoc, WLAN_NAN_ID);
  742. return QDF_STATUS_E_NOMEM;
  743. }
  744. qdf_mem_copy(msg.bodyptr, in_req, len);
  745. msg.type = req_type;
  746. msg.callback = nan_discovery_scheduled_handler;
  747. msg.flush_callback = nan_discovery_flush_callback;
  748. if (req_type == NAN_GENERIC_REQ)
  749. goto post_msg;
  750. request = osif_request_alloc(&params);
  751. if (!request) {
  752. nan_err("Request allocation failure");
  753. nan_discovery_flush_callback(&msg);
  754. return QDF_STATUS_E_NOMEM;
  755. }
  756. psoc_priv->nan_disc_request_ctx = osif_request_cookie(request);
  757. if (req_type == NAN_DISABLE_REQ)
  758. psoc_priv->is_explicit_disable = true;
  759. post_msg:
  760. status = scheduler_post_message(QDF_MODULE_ID_NAN,
  761. QDF_MODULE_ID_NAN,
  762. QDF_MODULE_ID_OS_IF, &msg);
  763. if (QDF_IS_STATUS_ERROR(status)) {
  764. nan_err("failed to post msg to NAN component, status: %d",
  765. status);
  766. nan_discovery_flush_callback(&msg);
  767. }
  768. if (req_type != NAN_GENERIC_REQ) {
  769. recovery = cds_is_driver_recovering();
  770. if (!recovery)
  771. err = osif_request_wait_for_response(request);
  772. if (recovery || err) {
  773. nan_debug("NAN request: %u recovery %d or timed out %d",
  774. req_type, recovery, err);
  775. if (req_type == NAN_ENABLE_REQ) {
  776. nan_set_discovery_state(psoc,
  777. NAN_DISC_DISABLED);
  778. if (ucfg_is_nan_dbs_supported(psoc))
  779. policy_mgr_check_n_start_opportunistic_timer(psoc);
  780. nan_handle_emlsr_concurrency(psoc, false);
  781. /*
  782. * If FW respond with NAN enable failure, then
  783. * TDLS should be enable again if there is TDLS
  784. * connection exist earlier.
  785. * decrement the active TDLS session.
  786. */
  787. ucfg_tdls_notify_connect_failure(psoc);
  788. } else if (req_type == NAN_DISABLE_REQ) {
  789. nan_disable_cleanup(psoc);
  790. }
  791. }
  792. if (req_type == NAN_DISABLE_REQ)
  793. psoc_priv->is_explicit_disable = false;
  794. osif_request_put(request);
  795. }
  796. return status;
  797. }
  798. void ucfg_nan_disable_concurrency(struct wlan_objmgr_psoc *psoc)
  799. {
  800. struct nan_disable_req nan_req = {0};
  801. enum nan_disc_state curr_nan_state;
  802. struct nan_psoc_priv_obj *psoc_priv;
  803. QDF_STATUS status;
  804. if (!psoc) {
  805. nan_err("psoc object is NULL, no action will be taken");
  806. return;
  807. }
  808. psoc_priv = nan_get_psoc_priv_obj(psoc);
  809. if (!psoc_priv) {
  810. nan_err("nan psoc priv object is NULL");
  811. return;
  812. }
  813. if (!ucfg_is_nan_conc_control_supported(psoc))
  814. return;
  815. qdf_spin_lock_bh(&psoc_priv->lock);
  816. curr_nan_state = nan_get_discovery_state(psoc);
  817. if (curr_nan_state == NAN_DISC_DISABLED ||
  818. curr_nan_state == NAN_DISC_DISABLE_IN_PROGRESS) {
  819. qdf_spin_unlock_bh(&psoc_priv->lock);
  820. return;
  821. }
  822. qdf_spin_unlock_bh(&psoc_priv->lock);
  823. nan_req.psoc = psoc;
  824. nan_req.disable_2g_discovery = true;
  825. nan_req.disable_5g_discovery = true;
  826. status = ucfg_nan_discovery_req(&nan_req, NAN_DISABLE_REQ);
  827. if (QDF_IS_STATUS_ERROR(status)) {
  828. nan_err("Unable to disable NAN Discovery");
  829. return;
  830. }
  831. nan_debug("NAN Disabled successfully");
  832. }
  833. QDF_STATUS
  834. ucfg_nan_disable_ndi(struct wlan_objmgr_psoc *psoc, uint32_t ndi_vdev_id)
  835. {
  836. enum nan_datapath_state curr_ndi_state;
  837. struct nan_vdev_priv_obj *ndi_vdev_priv;
  838. struct nan_datapath_end_all_ndps req = {0};
  839. struct wlan_objmgr_vdev *ndi_vdev;
  840. struct osif_request *request;
  841. QDF_STATUS status;
  842. int err;
  843. static const struct osif_request_params params = {
  844. .priv_size = 0,
  845. .timeout_ms = 2000,
  846. };
  847. if (!ucfg_is_ndi_dbs_supported(psoc))
  848. return QDF_STATUS_SUCCESS;
  849. ndi_vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, ndi_vdev_id,
  850. WLAN_NAN_ID);
  851. if (!ndi_vdev) {
  852. nan_err("Cannot obtain NDI vdev object!");
  853. return QDF_STATUS_E_INVAL;
  854. }
  855. ndi_vdev_priv = nan_get_vdev_priv_obj(ndi_vdev);
  856. if (!ndi_vdev_priv) {
  857. nan_err("ndi vdev priv object is NULL");
  858. wlan_objmgr_vdev_release_ref(ndi_vdev, WLAN_NAN_ID);
  859. return QDF_STATUS_E_INVAL;
  860. }
  861. curr_ndi_state = ucfg_nan_get_ndi_state(ndi_vdev);
  862. /*
  863. * Nothing to do if NDI is in DATA_END state.
  864. * Continue cleanup in NAN_DATA_NDI_DELETING_STATE as this API
  865. * can be called from hdd_ndi_delete.
  866. */
  867. if (curr_ndi_state == NAN_DATA_END_STATE) {
  868. wlan_objmgr_vdev_release_ref(ndi_vdev, WLAN_NAN_ID);
  869. return QDF_STATUS_SUCCESS;
  870. }
  871. ucfg_nan_set_ndi_state(ndi_vdev, NAN_DATA_END_STATE);
  872. request = osif_request_alloc(&params);
  873. if (!request) {
  874. nan_err("Request allocation failure");
  875. status = QDF_STATUS_E_NOMEM;
  876. goto cleanup;
  877. }
  878. ndi_vdev_priv->disable_context = osif_request_cookie(request);
  879. req.vdev = ndi_vdev;
  880. status = ucfg_nan_req_processor(NULL, &req, NDP_END_ALL);
  881. if (QDF_IS_STATUS_ERROR(status)) {
  882. nan_err("Unable to disable NDP's on NDI");
  883. wlan_objmgr_vdev_release_ref(ndi_vdev, WLAN_NAN_ID);
  884. goto cleanup;
  885. }
  886. nan_debug("Disabling all NDP's on NDI vdev id - %d", ndi_vdev_id);
  887. err = osif_request_wait_for_response(request);
  888. if (err) {
  889. nan_err("Disabling NDP's timed out waiting for confirmation");
  890. status = QDF_STATUS_E_TIMEOUT;
  891. }
  892. cleanup:
  893. /*
  894. * Host can assume NDP delete is successful and
  895. * remove policy mgr entry
  896. */
  897. policy_mgr_decr_session_set_pcl(psoc, QDF_NDI_MODE, ndi_vdev_id);
  898. ucfg_nan_set_ndi_state(ndi_vdev, NAN_DATA_DISCONNECTED_STATE);
  899. if (request)
  900. osif_request_put(request);
  901. return status;
  902. }
  903. QDF_STATUS
  904. ucfg_nan_check_and_disable_unsupported_ndi(struct wlan_objmgr_psoc *psoc,
  905. bool force)
  906. {
  907. uint32_t ndi_count, first_ndi_vdev_id, i;
  908. QDF_STATUS status;
  909. if (!psoc) {
  910. nan_err("psoc object is NULL, no action will be taken");
  911. return QDF_STATUS_E_INVAL;
  912. }
  913. if (!ucfg_is_ndi_dbs_supported(psoc))
  914. return QDF_STATUS_SUCCESS;
  915. ndi_count = policy_mgr_mode_specific_connection_count(psoc, PM_NDI_MODE,
  916. NULL);
  917. /* NDP force disable is done for unsupported concurrencies: NDI+SAP */
  918. if (force) {
  919. nan_debug("Force disable all NDPs");
  920. for (i = 0; i < ndi_count; i++) {
  921. first_ndi_vdev_id =
  922. policy_mgr_mode_specific_vdev_id(psoc,
  923. PM_NDI_MODE);
  924. status = ucfg_nan_disable_ndi(psoc, first_ndi_vdev_id);
  925. if (QDF_IS_STATUS_ERROR(status))
  926. return status;
  927. }
  928. return QDF_STATUS_SUCCESS;
  929. }
  930. if (ndi_count < 2) {
  931. nan_debug("No more than one NDI is active, nothing to do...");
  932. return QDF_STATUS_SUCCESS;
  933. }
  934. /*
  935. * At least 2 NDI active concurrencies exist. Disable all NDP's on the
  936. * first NDI to support an incoming connection.
  937. */
  938. first_ndi_vdev_id = policy_mgr_mode_specific_vdev_id(psoc, PM_NDI_MODE);
  939. status = ucfg_nan_disable_ndi(psoc, first_ndi_vdev_id);
  940. return status;
  941. }
  942. QDF_STATUS ucfg_ndi_remove_entry_from_policy_mgr(struct wlan_objmgr_vdev *vdev)
  943. {
  944. struct wlan_objmgr_psoc *psoc;
  945. struct nan_psoc_priv_obj *psoc_priv_obj;
  946. struct nan_vdev_priv_obj *vdev_priv_obj = nan_get_vdev_priv_obj(vdev);
  947. enum nan_datapath_state state;
  948. uint32_t active_ndp_peers;
  949. psoc = wlan_vdev_get_psoc(vdev);
  950. if (!psoc) {
  951. nan_err("can't get psoc");
  952. return QDF_STATUS_E_FAILURE;
  953. }
  954. psoc_priv_obj = nan_get_psoc_priv_obj(psoc);
  955. if (!psoc_priv_obj) {
  956. nan_err("psoc_priv_obj is null");
  957. return QDF_STATUS_E_NULL_VALUE;
  958. }
  959. if (!vdev_priv_obj) {
  960. nan_err("priv_obj is null");
  961. return QDF_STATUS_E_NULL_VALUE;
  962. }
  963. qdf_spin_lock_bh(&vdev_priv_obj->lock);
  964. state = vdev_priv_obj->state;
  965. active_ndp_peers = vdev_priv_obj->active_ndp_peers;
  966. qdf_spin_unlock_bh(&vdev_priv_obj->lock);
  967. if (state == NAN_DATA_NDI_DELETED_STATE &&
  968. NDI_CONCURRENCY_SUPPORTED(psoc) &&
  969. active_ndp_peers) {
  970. nan_info("Delete NDP peers: %u and remove NDI from policy mgr",
  971. active_ndp_peers);
  972. policy_mgr_decr_session_set_pcl(psoc, QDF_NDI_MODE,
  973. wlan_vdev_get_id(vdev));
  974. }
  975. return QDF_STATUS_SUCCESS;
  976. }
  977. bool ucfg_nan_is_enable_disable_in_progress(struct wlan_objmgr_psoc *psoc)
  978. {
  979. enum nan_disc_state nan_state;
  980. nan_state = nan_get_discovery_state(psoc);
  981. if (nan_state == NAN_DISC_ENABLE_IN_PROGRESS ||
  982. nan_state == NAN_DISC_DISABLE_IN_PROGRESS) {
  983. nan_info("NAN enable/disable is in progress, state: %u",
  984. nan_state);
  985. return true;
  986. }
  987. return false;
  988. }
  989. #ifdef NDP_SAP_CONCURRENCY_ENABLE
  990. /**
  991. * is_sap_ndp_concurrency_allowed() - Is SAP+NDP allowed
  992. *
  993. * Return: True if the NDP_SAP_CONCURRENCY_ENABLE feature define
  994. * is enabled, false otherwise.
  995. */
  996. static inline bool is_sap_ndp_concurrency_allowed(void)
  997. {
  998. return true;
  999. }
  1000. #else
  1001. static inline bool is_sap_ndp_concurrency_allowed(void)
  1002. {
  1003. return false;
  1004. }
  1005. #endif
  1006. bool ucfg_nan_is_sta_ndp_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
  1007. struct wlan_objmgr_vdev *vdev)
  1008. {
  1009. uint8_t vdev_id_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
  1010. uint32_t freq_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
  1011. uint32_t ndi_cnt, id, conc_ext_flags;
  1012. if (nan_is_sta_sta_concurrency_present(psoc)) {
  1013. nan_err("STA+STA+NDP concurrency is not allowed");
  1014. return false;
  1015. }
  1016. /*
  1017. * SAP+NDP concurrency is already validated in hdd_is_ndp_allowed().
  1018. * If SAP+NDP concurrency is enabled, return true from here to avoid
  1019. * failure.
  1020. */
  1021. if (is_sap_ndp_concurrency_allowed())
  1022. return true;
  1023. /* ML STA + NAN + NDP concurrency is allowed only if firmware
  1024. * support is present
  1025. */
  1026. if (policy_mgr_is_mlo_sta_present(psoc) &&
  1027. !wlan_is_mlo_sta_nan_ndi_allowed(psoc))
  1028. return false;
  1029. ndi_cnt = policy_mgr_get_mode_specific_conn_info(psoc,
  1030. freq_list,
  1031. vdev_id_list,
  1032. PM_NDI_MODE);
  1033. /* Allow if no other NDP peers are present on the NDIs */
  1034. if (!ndi_cnt)
  1035. return true;
  1036. /*
  1037. * Allow NDP creation if the current NDP request is on
  1038. * the NDI which already has an NDP by checking the vdev id of
  1039. * the NDIs
  1040. */
  1041. for (id = 0; id < ndi_cnt; id++)
  1042. if (wlan_vdev_get_id(vdev) == vdev_id_list[id])
  1043. return true;
  1044. /* If the flow reaches here then it is 4th NDI with STA */
  1045. if (!ucfg_nan_is_sta_nan_ndi_4_port_allowed(psoc))
  1046. return false;
  1047. conc_ext_flags = policy_mgr_get_conc_ext_flags(vdev, false);
  1048. /* The final freq would be provided by FW, it is not known now */
  1049. return policy_mgr_allow_concurrency(psoc, PM_NDI_MODE, 0,
  1050. HW_MODE_20_MHZ, conc_ext_flags,
  1051. wlan_vdev_get_id(vdev));
  1052. }
  1053. bool
  1054. ucfg_nan_is_sta_nan_ndi_4_port_allowed(struct wlan_objmgr_psoc *psoc)
  1055. {
  1056. struct nan_psoc_priv_obj *psoc_nan_obj;
  1057. psoc_nan_obj = nan_get_psoc_priv_obj(psoc);
  1058. if (!psoc_nan_obj) {
  1059. nan_err("psoc_nan_obj is null");
  1060. return false;
  1061. }
  1062. return psoc_nan_obj->nan_caps.sta_nan_ndi_ndi_allowed;
  1063. }
  1064. bool ucfg_nan_is_beamforming_supported(struct wlan_objmgr_psoc *psoc)
  1065. {
  1066. struct nan_psoc_priv_obj *psoc_nan_obj;
  1067. psoc_nan_obj = nan_get_psoc_priv_obj(psoc);
  1068. if (!psoc_nan_obj) {
  1069. nan_err("psoc_nan_obj is null");
  1070. return false;
  1071. }
  1072. return psoc_nan_obj->nan_caps.ndi_txbf_supported;
  1073. }
  1074. static inline bool
  1075. ucfg_is_nan_enabled(struct nan_psoc_priv_obj *psoc_nan_obj)
  1076. {
  1077. return psoc_nan_obj->cfg_param.enable;
  1078. }
  1079. static inline bool
  1080. ucfg_nan_is_vdev_creation_supp_by_fw(struct nan_psoc_priv_obj *psoc_nan_obj)
  1081. {
  1082. return psoc_nan_obj->nan_caps.nan_vdev_allowed;
  1083. }
  1084. static inline bool
  1085. ucfg_nan_is_vdev_creation_supp_by_host(struct nan_psoc_priv_obj *nan_obj)
  1086. {
  1087. return nan_obj->cfg_param.nan_separate_iface_support;
  1088. }
  1089. static void ucfg_nan_cleanup_all_ndps(struct wlan_objmgr_psoc *psoc)
  1090. {
  1091. QDF_STATUS status;
  1092. uint32_t ndi_count, vdev_id, i;
  1093. ndi_count = policy_mgr_mode_specific_connection_count(psoc, PM_NDI_MODE,
  1094. NULL);
  1095. for (i = 0; i < ndi_count; i++) {
  1096. vdev_id = policy_mgr_mode_specific_vdev_id(psoc, PM_NDI_MODE);
  1097. status = ucfg_nan_disable_ndi(psoc, vdev_id);
  1098. if (status == QDF_STATUS_E_TIMEOUT)
  1099. policy_mgr_decr_session_set_pcl(psoc, QDF_NDI_MODE,
  1100. vdev_id);
  1101. }
  1102. }
  1103. QDF_STATUS ucfg_disable_nan_discovery(struct wlan_objmgr_psoc *psoc,
  1104. uint8_t *data, uint32_t data_len)
  1105. {
  1106. struct nan_disable_req *nan_req;
  1107. QDF_STATUS status;
  1108. ucfg_nan_cleanup_all_ndps(psoc);
  1109. nan_req = qdf_mem_malloc(sizeof(*nan_req) + data_len);
  1110. if (!nan_req)
  1111. return -ENOMEM;
  1112. qdf_mem_zero(nan_req, sizeof(*nan_req) + data_len);
  1113. nan_req->psoc = psoc;
  1114. nan_req->disable_2g_discovery = true;
  1115. nan_req->disable_5g_discovery = true;
  1116. if (data_len && data) {
  1117. nan_req->params.request_data_len = data_len;
  1118. qdf_mem_copy(nan_req->params.request_data, data, data_len);
  1119. }
  1120. status = ucfg_nan_discovery_req(nan_req, NAN_DISABLE_REQ);
  1121. if (QDF_IS_STATUS_SUCCESS(status))
  1122. nan_debug("Successfully sent NAN Disable request");
  1123. else
  1124. nan_debug("Unable to send NAN Disable request: %u", status);
  1125. qdf_mem_free(nan_req);
  1126. return status;
  1127. }
  1128. bool ucfg_nan_is_vdev_creation_allowed(struct wlan_objmgr_psoc *psoc)
  1129. {
  1130. struct nan_psoc_priv_obj *psoc_nan_obj;
  1131. bool host_support, fw_support;
  1132. psoc_nan_obj = nan_get_psoc_priv_obj(psoc);
  1133. if (!psoc_nan_obj) {
  1134. nan_err("psoc_nan_obj is null");
  1135. return false;
  1136. }
  1137. if (!ucfg_is_nan_enabled(psoc_nan_obj)) {
  1138. nan_debug("NAN is not enabled");
  1139. return false;
  1140. }
  1141. host_support = ucfg_nan_is_vdev_creation_supp_by_host(psoc_nan_obj);
  1142. fw_support = ucfg_nan_is_vdev_creation_supp_by_fw(psoc_nan_obj);
  1143. if (!host_support || !fw_support) {
  1144. nan_debug("NAN separate vdev%s supported by host,%s supported by firmware",
  1145. host_support ? "" : " not", fw_support ? "" : " not");
  1146. return false;
  1147. }
  1148. return true;
  1149. }
  1150. void
  1151. ucfg_nan_set_vdev_creation_supp_by_fw(struct wlan_objmgr_psoc *psoc, bool set)
  1152. {
  1153. struct nan_psoc_priv_obj *psoc_nan_obj;
  1154. psoc_nan_obj = nan_get_psoc_priv_obj(psoc);
  1155. if (!psoc_nan_obj) {
  1156. nan_err("psoc_nan_obj is null");
  1157. return;
  1158. }
  1159. psoc_nan_obj->nan_caps.nan_vdev_allowed = set;
  1160. }
  1161. QDF_STATUS ucfg_get_nan_feature_config(struct wlan_objmgr_psoc *psoc,
  1162. uint32_t *nan_feature_config)
  1163. {
  1164. struct nan_psoc_priv_obj *psoc_nan_obj;
  1165. psoc_nan_obj = nan_get_psoc_priv_obj(psoc);
  1166. if (!psoc_nan_obj) {
  1167. nan_err("psoc_nan_obj is null");
  1168. *nan_feature_config = cfg_default(CFG_NAN_FEATURE_CONFIG);
  1169. return QDF_STATUS_E_INVAL;
  1170. }
  1171. *nan_feature_config = psoc_nan_obj->cfg_param.nan_feature_config;
  1172. return QDF_STATUS_SUCCESS;
  1173. }
  1174. bool ucfg_is_nan_vdev(struct wlan_objmgr_vdev *vdev)
  1175. {
  1176. if (wlan_vdev_mlme_get_opmode(vdev) == QDF_NAN_DISC_MODE ||
  1177. (!ucfg_nan_is_vdev_creation_allowed(wlan_vdev_get_psoc(vdev)) &&
  1178. wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE))
  1179. return true;
  1180. return false;
  1181. }
  1182. QDF_STATUS ucfg_nan_disable_ind_to_userspace(struct wlan_objmgr_psoc *psoc)
  1183. {
  1184. struct nan_psoc_priv_obj *psoc_nan_obj;
  1185. struct nan_event_params *disable_ind;
  1186. struct nan_disable_ind_msg msg = {
  1187. .msg_hdr.msg_id = NAN_MSG_ID_DISABLE_INDICATION,
  1188. .reason = 0, /* success */ };
  1189. psoc_nan_obj = nan_get_psoc_priv_obj(psoc);
  1190. if (!psoc_nan_obj) {
  1191. nan_err("psoc_nan_obj is null");
  1192. return QDF_STATUS_E_INVAL;
  1193. }
  1194. disable_ind = qdf_mem_malloc(sizeof(struct nan_event_params) +
  1195. sizeof(msg));
  1196. if (!disable_ind)
  1197. return QDF_STATUS_E_NOMEM;
  1198. disable_ind->psoc = psoc,
  1199. disable_ind->evt_type = nan_event_id_disable_ind;
  1200. disable_ind->buf_len = sizeof(msg);
  1201. qdf_mem_copy(disable_ind->buf, &msg, disable_ind->buf_len);
  1202. psoc_nan_obj->cb_obj.os_if_nan_event_handler(disable_ind);
  1203. qdf_mem_free(disable_ind);
  1204. return QDF_STATUS_SUCCESS;
  1205. }
  1206. bool ucfg_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq)
  1207. {
  1208. return wlan_is_nan_allowed_on_freq(pdev, freq);
  1209. }
  1210. bool ucfg_is_mlo_sta_nan_ndi_allowed(struct wlan_objmgr_psoc *psoc)
  1211. {
  1212. return wlan_is_mlo_sta_nan_ndi_allowed(psoc);
  1213. }