p2p_scan.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  1. /*
  2. ** Id: @(#) p2p_scan.c@@
  3. */
  4. /*! \file "p2p_scan.c"
  5. \brief This file defines the p2p scan profile and the processing function of
  6. scan result for SCAN Module.
  7. The SCAN Profile selection is part of SCAN MODULE and responsible for defining
  8. SCAN Parameters - e.g. MIN_CHANNEL_TIME, number of scan channels.
  9. In this file we also define the process of SCAN Result including adding, searching
  10. and removing SCAN record from the list.
  11. */
  12. /*******************************************************************************
  13. * C O M P I L E R F L A G S
  14. ********************************************************************************
  15. */
  16. /*******************************************************************************
  17. * E X T E R N A L R E F E R E N C E S
  18. ********************************************************************************
  19. */
  20. #include "precomp.h"
  21. /*******************************************************************************
  22. * C O N S T A N T S
  23. ********************************************************************************
  24. */
  25. /*******************************************************************************
  26. * D A T A T Y P E S
  27. ********************************************************************************
  28. */
  29. /*******************************************************************************
  30. * P U B L I C D A T A
  31. ********************************************************************************
  32. */
  33. /*******************************************************************************
  34. * P R I V A T E D A T A
  35. ********************************************************************************
  36. */
  37. /*******************************************************************************
  38. * M A C R O S
  39. ********************************************************************************
  40. */
  41. /*******************************************************************************
  42. * F U N C T I O N D E C L A R A T I O N S
  43. ********************************************************************************
  44. */
  45. /*******************************************************************************
  46. * F U N C T I O N S
  47. ********************************************************************************
  48. */
  49. P_P2P_DEVICE_DESC_T
  50. scanSearchTargetP2pDesc(IN P_ADAPTER_T prAdapter, IN UINT_8 aucDeviceID[], IN PP_BSS_DESC_T pprBssDesc)
  51. {
  52. P_P2P_DEVICE_DESC_T prTargetP2pDesc = (P_P2P_DEVICE_DESC_T) NULL;
  53. P_SCAN_INFO_T prScanInfo = (P_SCAN_INFO_T) NULL;
  54. P_LINK_T prBSSDescList;
  55. P_BSS_DESC_T prBssDesc = (P_BSS_DESC_T) NULL;
  56. ASSERT(prAdapter);
  57. ASSERT(aucDeviceID);
  58. prScanInfo = &(prAdapter->rWifiVar.rScanInfo);
  59. prBSSDescList = &prScanInfo->rBSSDescList;
  60. /* 4 <1> The outer loop to search for a candidate. */
  61. LINK_FOR_EACH_ENTRY(prBssDesc, prBSSDescList, rLinkEntry, BSS_DESC_T) {
  62. /* Loop for each prBssDesc */
  63. prTargetP2pDesc = scanFindP2pDeviceDesc(prAdapter, prBssDesc, aucDeviceID, TRUE, FALSE);
  64. if (prTargetP2pDesc != NULL)
  65. break;
  66. }
  67. if ((pprBssDesc) && (prTargetP2pDesc != NULL)) {
  68. /* Only valid if prTargetP2pDesc is not NULL. */
  69. *pprBssDesc = prBssDesc;
  70. }
  71. return prTargetP2pDesc;
  72. } /* scanSearchTargetP2pDesc */
  73. VOID scanInvalidAllP2pClientDevice(IN P_ADAPTER_T prAdapter, IN P_BSS_DESC_T prBssDesc)
  74. {
  75. P_LINK_ENTRY_T prLinkEntry = (P_LINK_ENTRY_T) NULL;
  76. P_P2P_DEVICE_DESC_T prTargetDesc = (P_P2P_DEVICE_DESC_T) NULL;
  77. LINK_FOR_EACH(prLinkEntry, &prBssDesc->rP2pDeviceList) {
  78. prTargetDesc = LINK_ENTRY(prLinkEntry, P2P_DEVICE_DESC_T, rLinkEntry);
  79. if (prTargetDesc->fgDevInfoValid)
  80. prTargetDesc->fgDevInfoValid = FALSE;
  81. }
  82. } /* scanRenewP2pClientDevice */
  83. VOID scanRemoveInvalidP2pClientDevice(IN P_ADAPTER_T prAdapter, IN P_BSS_DESC_T prBssDesc)
  84. {
  85. P_LINK_ENTRY_T prLinkEntry = (P_LINK_ENTRY_T) NULL, prNexEntry = (P_LINK_ENTRY_T) NULL;
  86. P_P2P_DEVICE_DESC_T prTargetDesc = (P_P2P_DEVICE_DESC_T) NULL;
  87. P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T) NULL;
  88. prP2pConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
  89. LINK_FOR_EACH_SAFE(prLinkEntry, prNexEntry, &prBssDesc->rP2pDeviceList) {
  90. prTargetDesc = LINK_ENTRY(prLinkEntry, P2P_DEVICE_DESC_T, rLinkEntry);
  91. if (!prTargetDesc->fgDevInfoValid) {
  92. LINK_REMOVE_KNOWN_ENTRY(&prBssDesc->rP2pDeviceList, prLinkEntry);
  93. if ((prP2pConnSettings) && (prP2pConnSettings->prTargetP2pDesc == prTargetDesc))
  94. prP2pConnSettings->prTargetP2pDesc = NULL;
  95. kalMemFree(prTargetDesc, VIR_MEM_TYPE, sizeof(P2P_DEVICE_DESC_T));
  96. }
  97. }
  98. } /* scanRenewP2pClientDevice */
  99. P_P2P_DEVICE_DESC_T
  100. scanFindP2pDeviceDesc(IN P_ADAPTER_T prAdapter,
  101. IN P_BSS_DESC_T prBssDesc,
  102. IN UINT_8 aucMacAddr[], IN BOOLEAN fgIsDeviceAddr, IN BOOLEAN fgAddIfNoFound)
  103. {
  104. P_P2P_DEVICE_DESC_T prTargetDesc = (P_P2P_DEVICE_DESC_T) NULL;
  105. P_LINK_ENTRY_T prLinkEntry = (P_LINK_ENTRY_T) NULL;
  106. do {
  107. ASSERT_BREAK((prAdapter != NULL) && (prBssDesc != NULL) && (aucMacAddr != NULL));
  108. LINK_FOR_EACH(prLinkEntry, &prBssDesc->rP2pDeviceList) {
  109. prTargetDesc = LINK_ENTRY(prLinkEntry, P2P_DEVICE_DESC_T, rLinkEntry);
  110. if (fgIsDeviceAddr) {
  111. if (EQUAL_MAC_ADDR(prTargetDesc->aucDeviceAddr, aucMacAddr))
  112. break;
  113. } else {
  114. if (EQUAL_MAC_ADDR(prTargetDesc->aucInterfaceAddr, aucMacAddr))
  115. break;
  116. }
  117. prTargetDesc = NULL;
  118. }
  119. if ((fgAddIfNoFound) && (prTargetDesc == NULL)) {
  120. /* Target Not Found. */
  121. /* TODO: Use memory pool in the future. */
  122. prTargetDesc = kalMemAlloc(sizeof(P2P_DEVICE_DESC_T), VIR_MEM_TYPE);
  123. if (prTargetDesc) {
  124. kalMemZero(prTargetDesc, sizeof(P2P_DEVICE_DESC_T));
  125. LINK_ENTRY_INITIALIZE(&(prTargetDesc->rLinkEntry));
  126. COPY_MAC_ADDR(prTargetDesc->aucDeviceAddr, aucMacAddr);
  127. LINK_INSERT_TAIL(&prBssDesc->rP2pDeviceList, &prTargetDesc->rLinkEntry);
  128. prTargetDesc->fgDevInfoValid = TRUE;
  129. } else {
  130. ASSERT(FALSE);
  131. }
  132. }
  133. } while (FALSE);
  134. return prTargetDesc;
  135. } /* scanFindP2pDeviceDesc */
  136. P_P2P_DEVICE_DESC_T scanGetP2pDeviceDesc(IN P_ADAPTER_T prAdapter, IN P_BSS_DESC_T prBssDesc)
  137. {
  138. P_P2P_DEVICE_DESC_T prTargetDesc = (P_P2P_DEVICE_DESC_T) NULL;
  139. ASSERT(prAdapter);
  140. ASSERT(prBssDesc);
  141. if (prBssDesc->prP2pDesc == NULL) {
  142. prTargetDesc = kalMemAlloc(sizeof(P2P_DEVICE_DESC_T), VIR_MEM_TYPE);
  143. if (prTargetDesc) {
  144. kalMemZero(prTargetDesc, sizeof(P2P_DEVICE_DESC_T));
  145. LINK_ENTRY_INITIALIZE(&(prTargetDesc->rLinkEntry));
  146. LINK_INSERT_TAIL(&prBssDesc->rP2pDeviceList, &prTargetDesc->rLinkEntry);
  147. prTargetDesc->fgDevInfoValid = TRUE;
  148. prBssDesc->prP2pDesc = prTargetDesc;
  149. /* We are not sure the SrcAddr is Device Address or Interface Address. */
  150. COPY_MAC_ADDR(prTargetDesc->aucDeviceAddr, prBssDesc->aucSrcAddr);
  151. COPY_MAC_ADDR(prTargetDesc->aucInterfaceAddr, prBssDesc->aucSrcAddr);
  152. } else {
  153. ASSERT(FALSE);
  154. }
  155. } else {
  156. prTargetDesc = prBssDesc->prP2pDesc;
  157. }
  158. return prTargetDesc;
  159. } /* scanFindP2pDeviceDesc */
  160. #if 0
  161. /*----------------------------------------------------------------------------*/
  162. /*!
  163. * @brief Convert the Beacon or ProbeResp Frame in SW_RFB_T to Event Packet
  164. *
  165. * @param[in] prSwRfb Pointer to the receiving SW_RFB_T structure.
  166. *
  167. * @retval WLAN_STATUS_SUCCESS It is a valid Scan Result and been sent to the host.
  168. * @retval WLAN_STATUS_FAILURE It is not a valid Scan Result.
  169. */
  170. /*----------------------------------------------------------------------------*/
  171. BOOLEAN scanUpdateP2pDeviceDesc(IN P_ADAPTER_T prAdapter, IN P_BSS_DESC_T prBssDesc)
  172. {
  173. P_P2P_DEVICE_DESC_T prP2pDesc = (P_P2P_DEVICE_DESC_T) NULL;
  174. P_P2P_ATTRIBUTE_T prP2pAttribute = (P_P2P_ATTRIBUTE_T) NULL;
  175. UINT_16 u2AttributeLen = 0;
  176. UINT_32 u4Idx = 0;
  177. BOOLEAN fgUpdateDevInfo = FALSE;
  178. P_DEVICE_NAME_TLV_T prP2pDevName = (P_DEVICE_NAME_TLV_T) NULL;
  179. P_P2P_ATTRI_GROUP_INFO_T prP2pAttriGroupInfo = (P_P2P_ATTRI_GROUP_INFO_T) NULL;
  180. ASSERT(prAdapter);
  181. prP2pDesc = scanGetP2pDeviceDesc(prAdapter, prBssDesc);
  182. if (!prP2pDesc) {
  183. ASSERT(FALSE);
  184. return fgUpdateDevInfo;
  185. }
  186. p2pGetP2PAttriList(prAdapter, prBssDesc->aucIEBuf, prBssDesc->u2IELength, (PPUINT_8) & prP2pAttribute,
  187. &u2AttributeLen);
  188. while (u2AttributeLen >= P2P_ATTRI_HDR_LEN) {
  189. switch (prP2pAttribute->ucId) {
  190. case P2P_ATTRI_ID_P2P_CAPABILITY: /* Beacon, Probe Response */
  191. {
  192. P_P2P_ATTRI_CAPABILITY_T prP2pAttriCapability = (P_P2P_ATTRI_CAPABILITY_T) NULL;
  193. prP2pAttriCapability = (P_P2P_ATTRI_CAPABILITY_T) prP2pAttribute;
  194. ASSERT(prP2pAttriCapability->u2Length == 2);
  195. prP2pDesc->ucDeviceCapabilityBitmap = prP2pAttriCapability->ucDeviceCap;
  196. prP2pDesc->ucGroupCapabilityBitmap = prP2pAttriCapability->ucGroupCap;
  197. }
  198. break;
  199. case P2P_ATTRI_ID_P2P_DEV_ID: /* Beacon */
  200. {
  201. P_P2P_ATTRI_DEV_ID_T prP2pAttriDevID = (P_P2P_ATTRI_DEV_ID_T) NULL;
  202. prP2pAttriDevID = (P_P2P_ATTRI_DEV_ID_T) prP2pAttribute;
  203. ASSERT(prP2pAttriDevID->u2Length == P2P_ATTRI_MAX_LEN_P2P_DEV_ID);
  204. kalMemCopy(prP2pDesc->aucDeviceAddr, prP2pAttriDevID->aucDevAddr, MAC_ADDR_LEN);
  205. }
  206. break;
  207. case P2P_ATTRI_ID_P2P_DEV_INFO: /* Probe Response */
  208. {
  209. P_P2P_ATTRI_DEV_INFO_T prP2pAttriDevInfo = (P_P2P_ATTRI_DEV_INFO_T) NULL;
  210. P_P2P_DEVICE_TYPE_T prP2pDevType = (P_P2P_DEVICE_TYPE_T) NULL;
  211. UINT_16 u2NameLen = 0, u2Id = 0;
  212. fgUpdateDevInfo = TRUE;
  213. prP2pAttriDevInfo = (P_P2P_ATTRI_DEV_INFO_T) prP2pAttribute;
  214. kalMemCopy(prP2pDesc->aucDeviceAddr, prP2pAttriDevInfo->aucDevAddr, MAC_ADDR_LEN);
  215. WLAN_GET_FIELD_BE16(&prP2pAttriDevInfo->u2ConfigMethodsBE, &prP2pDesc->u2ConfigMethod);
  216. prP2pDevType = &prP2pDesc->rPriDevType;
  217. WLAN_GET_FIELD_BE16(&prP2pAttriDevInfo->rPrimaryDevTypeBE.u2CategoryId,
  218. &prP2pDevType->u2CategoryID);
  219. WLAN_GET_FIELD_BE16(&prP2pAttriDevInfo->rPrimaryDevTypeBE.u2SubCategoryId,
  220. &prP2pDevType->u2SubCategoryID);
  221. ASSERT(prP2pAttriDevInfo->ucNumOfSecondaryDevType <=
  222. P2P_GC_MAX_CACHED_SEC_DEV_TYPE_COUNT);
  223. /* TODO: Fixme if secondary device type is more than 2. */
  224. prP2pDesc->ucSecDevTypeNum = 0;
  225. for (u4Idx = 0; u4Idx < prP2pAttriDevInfo->ucNumOfSecondaryDevType; u4Idx++) {
  226. if (u4Idx < P2P_GC_MAX_CACHED_SEC_DEV_TYPE_COUNT) {
  227. prP2pDevType = &(prP2pDesc->arSecDevType[u4Idx]);
  228. WLAN_GET_FIELD_BE16(&prP2pAttriDevInfo->
  229. arSecondaryDevTypeListBE[u4Idx].u2CategoryId,
  230. &prP2pDevType->u2CategoryID);
  231. WLAN_GET_FIELD_BE16(&prP2pAttriDevInfo->
  232. arSecondaryDevTypeListBE[u4Idx].u2SubCategoryId,
  233. &prP2pDevType->u2SubCategoryID);
  234. prP2pDesc->ucSecDevTypeNum++;
  235. }
  236. }
  237. prP2pDevName =
  238. (P_DEVICE_NAME_TLV_T) ((PUINT_8) prP2pAttriDevInfo->arSecondaryDevTypeListBE +
  239. (u4Idx * sizeof(DEVICE_TYPE_T)));
  240. WLAN_GET_FIELD_BE16(&prP2pDevName->u2Length, &u2NameLen);
  241. WLAN_GET_FIELD_BE16(&prP2pDevName->u2Id, &u2Id);
  242. ASSERT(u2Id == WPS_ATTRI_ID_DEVICE_NAME);
  243. if (u2NameLen > WPS_ATTRI_MAX_LEN_DEVICE_NAME)
  244. u2NameLen = WPS_ATTRI_MAX_LEN_DEVICE_NAME;
  245. prP2pDesc->u2NameLength = u2NameLen;
  246. kalMemCopy(prP2pDesc->aucName, prP2pDevName->aucName, prP2pDesc->u2NameLength);
  247. }
  248. break;
  249. case P2P_ATTRI_ID_P2P_GROUP_INFO: /* Probe Response */
  250. prP2pAttriGroupInfo = (P_P2P_ATTRI_GROUP_INFO_T) prP2pAttribute;
  251. break;
  252. case P2P_ATTRI_ID_NOTICE_OF_ABSENCE:
  253. break;
  254. case P2P_ATTRI_ID_EXT_LISTEN_TIMING:
  255. /* TODO: Not implement yet. */
  256. /* ASSERT(FALSE); */
  257. break;
  258. default:
  259. break;
  260. }
  261. u2AttributeLen -= (prP2pAttribute->u2Length + P2P_ATTRI_HDR_LEN);
  262. prP2pAttribute =
  263. (P_P2P_ATTRIBUTE_T) ((UINT_32) prP2pAttribute + (prP2pAttribute->u2Length + P2P_ATTRI_HDR_LEN));
  264. }
  265. if (prP2pAttriGroupInfo != NULL) {
  266. P_P2P_CLIENT_INFO_DESC_T prClientInfoDesc = (P_P2P_CLIENT_INFO_DESC_T) NULL;
  267. P_P2P_DEVICE_TYPE_T prP2pDevType = (P_P2P_DEVICE_TYPE_T) NULL;
  268. scanInvalidAllP2pClientDevice(prAdapter, prBssDesc);
  269. /* GO/Device itself. */
  270. prP2pDesc->fgDevInfoValid = TRUE;
  271. prClientInfoDesc = (P_P2P_CLIENT_INFO_DESC_T) prP2pAttriGroupInfo->arClientDesc;
  272. u2AttributeLen = prP2pAttriGroupInfo->u2Length;
  273. while (u2AttributeLen > 0) {
  274. prP2pDesc =
  275. scanFindP2pDeviceDesc(prAdapter, prBssDesc, prClientInfoDesc->aucDevAddr, TRUE, TRUE);
  276. if (!prP2pDesc) {
  277. ASSERT(FALSE);
  278. break; /* while */
  279. }
  280. prP2pDesc->fgDevInfoValid = TRUE;
  281. /* Basic size for P2P client info descriptor. */
  282. ASSERT(u2AttributeLen >= 25);
  283. if (u2AttributeLen < 25) {
  284. DBGLOG(P2P, WARN, "Length incorrect warning.\n");
  285. break;
  286. }
  287. COPY_MAC_ADDR(prP2pDesc->aucInterfaceAddr, prClientInfoDesc->aucIfAddr);
  288. prP2pDesc->ucDeviceCapabilityBitmap = prClientInfoDesc->ucDeviceCap;
  289. WLAN_GET_FIELD_BE16(&prClientInfoDesc->u2ConfigMethodsBE, &prP2pDesc->u2ConfigMethod);
  290. prP2pDevType = &(prP2pDesc->rPriDevType);
  291. WLAN_GET_FIELD_BE16(&prClientInfoDesc->rPrimaryDevTypeBE.u2CategoryId,
  292. &prP2pDevType->u2CategoryID);
  293. WLAN_GET_FIELD_BE16(&prClientInfoDesc->rPrimaryDevTypeBE.u2SubCategoryId,
  294. &prP2pDevType->u2SubCategoryID);
  295. ASSERT(prClientInfoDesc->ucNumOfSecondaryDevType <= P2P_GC_MAX_CACHED_SEC_DEV_TYPE_COUNT);
  296. prP2pDesc->ucSecDevTypeNum = 0;
  297. for (u4Idx = 0; u4Idx < prClientInfoDesc->ucNumOfSecondaryDevType; u4Idx++) {
  298. if (u4Idx < P2P_GC_MAX_CACHED_SEC_DEV_TYPE_COUNT) {
  299. prP2pDevType = &(prP2pDesc->arSecDevType[u4Idx]);
  300. WLAN_GET_FIELD_BE16(&prClientInfoDesc->
  301. arSecondaryDevTypeListBE[u4Idx].u2CategoryId,
  302. &prP2pDevType->u2CategoryID);
  303. WLAN_GET_FIELD_BE16(&prClientInfoDesc->
  304. arSecondaryDevTypeListBE[u4Idx].u2SubCategoryId,
  305. &prP2pDevType->u2SubCategoryID);
  306. prP2pDesc->ucSecDevTypeNum++;
  307. }
  308. }
  309. prP2pDevName =
  310. (P_DEVICE_NAME_TLV_T) (prClientInfoDesc->arSecondaryDevTypeListBE +
  311. (u4Idx * sizeof(DEVICE_TYPE_T)));
  312. WLAN_GET_FIELD_BE16(&prP2pDevName->u2Length, &prP2pDesc->u2NameLength);
  313. if (prP2pDesc->u2NameLength > WPS_ATTRI_MAX_LEN_DEVICE_NAME)
  314. prP2pDesc->u2NameLength = WPS_ATTRI_MAX_LEN_DEVICE_NAME;
  315. kalMemCopy(prP2pDesc->aucName, prP2pDevName->aucName, prP2pDesc->u2NameLength);
  316. u2AttributeLen -= (prClientInfoDesc->ucLength + P2P_CLIENT_INFO_DESC_HDR_LEN);
  317. prClientInfoDesc =
  318. (P_P2P_CLIENT_INFO_DESC_T) ((UINT_32) prClientInfoDesc +
  319. (UINT_32) prClientInfoDesc->ucLength +
  320. P2P_CLIENT_INFO_DESC_HDR_LEN);
  321. }
  322. scanRemoveInvalidP2pClientDevice(prAdapter, prBssDesc);
  323. }
  324. return fgUpdateDevInfo;
  325. } /* end of scanAddP2pDeviceInfo() */
  326. #endif
  327. /*----------------------------------------------------------------------------*/
  328. /*!
  329. * @brief Convert the Beacon or ProbeResp Frame in SW_RFB_T to Event Packet
  330. *
  331. * @param[in] prSwRfb Pointer to the receiving SW_RFB_T structure.
  332. *
  333. * @retval WLAN_STATUS_SUCCESS It is a valid Scan Result and been sent to the host.
  334. * @retval WLAN_STATUS_FAILURE It is not a valid Scan Result.
  335. */
  336. /*----------------------------------------------------------------------------*/
  337. WLAN_STATUS scanSendDeviceDiscoverEvent(IN P_ADAPTER_T prAdapter, IN P_BSS_DESC_T prBssDesc, IN P_SW_RFB_T prSwRfb)
  338. {
  339. EVENT_P2P_DEV_DISCOVER_RESULT_T rEventDevInfo;
  340. #if 1
  341. P_LINK_ENTRY_T prLinkEntry = (P_LINK_ENTRY_T) NULL;
  342. P_P2P_DEVICE_DESC_T prTargetDesc = (P_P2P_DEVICE_DESC_T) NULL;
  343. LINK_FOR_EACH(prLinkEntry, &prBssDesc->rP2pDeviceList) {
  344. prTargetDesc = LINK_ENTRY(prLinkEntry, P2P_DEVICE_DESC_T, rLinkEntry);
  345. COPY_MAC_ADDR(rEventDevInfo.aucDeviceAddr, prTargetDesc->aucDeviceAddr);
  346. COPY_MAC_ADDR(rEventDevInfo.aucInterfaceAddr, prTargetDesc->aucInterfaceAddr);
  347. rEventDevInfo.ucDeviceCapabilityBitmap = prTargetDesc->ucDeviceCapabilityBitmap;
  348. rEventDevInfo.ucGroupCapabilityBitmap = prTargetDesc->ucGroupCapabilityBitmap;
  349. rEventDevInfo.u2ConfigMethod = prTargetDesc->u2ConfigMethod;
  350. kalMemCopy(&rEventDevInfo.rPriDevType, &prTargetDesc->rPriDevType, sizeof(P2P_DEVICE_TYPE_T));
  351. kalMemCopy(rEventDevInfo.arSecDevType,
  352. prTargetDesc->arSecDevType, (prTargetDesc->ucSecDevTypeNum * sizeof(P2P_DEVICE_TYPE_T)));
  353. rEventDevInfo.ucSecDevTypeNum = prTargetDesc->ucSecDevTypeNum;
  354. rEventDevInfo.u2NameLength = prTargetDesc->u2NameLength;
  355. kalMemCopy(rEventDevInfo.aucName, prTargetDesc->aucName, prTargetDesc->u2NameLength);
  356. COPY_MAC_ADDR(rEventDevInfo.aucBSSID, prBssDesc->aucBSSID);
  357. if (prTargetDesc == prBssDesc->prP2pDesc)
  358. nicRxAddP2pDevice(prAdapter, &rEventDevInfo, prBssDesc->aucIEBuf, prBssDesc->u2IELength);
  359. else
  360. nicRxAddP2pDevice(prAdapter, &rEventDevInfo, NULL, 0);
  361. }
  362. kalP2PIndicateFound(prAdapter->prGlueInfo);
  363. #else
  364. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = (P_P2P_SPECIFIC_BSS_INFO_T) NULL;
  365. P_P2P_ATTRIBUTE_T prP2pAttribute = (P_P2P_ATTRIBUTE_T) NULL;
  366. UINT_16 u2AttributeLen = 0;
  367. UINT_32 u4Idx = 0;
  368. P_P2P_ATTRI_GROUP_INFO_T prP2pAttriGroupInfo = (P_P2P_ATTRI_GROUP_INFO_T) NULL;
  369. P_DEVICE_NAME_TLV_T prP2pDevName = (P_DEVICE_NAME_TLV_T) NULL;
  370. ASSERT(prAdapter);
  371. prP2pSpecificBssInfo = &prAdapter->rWifiVar.rP2pSpecificBssInfo;
  372. #if 1
  373. p2pGetP2PAttriList(prAdapter, prBssDesc->aucIEBuf, prBssDesc->u2IELength, (PPUINT_8) & prP2pAttribute,
  374. &u2AttributeLen);
  375. #else
  376. prP2pAttribute = (P_P2P_ATTRIBUTE_T) &prP2pSpecificBssInfo->aucAttributesCache[0];
  377. u2AttributeLen = prP2pSpecificBssInfo->u2AttributeLen;
  378. #endif
  379. rEventDevInfo.fgDevInfoValid = FALSE;
  380. while (u2AttributeLen >= P2P_ATTRI_HDR_LEN) {
  381. switch (prP2pAttribute->ucId) {
  382. case P2P_ATTRI_ID_P2P_CAPABILITY:
  383. {
  384. P_P2P_ATTRI_CAPABILITY_T prP2pAttriCapability = (P_P2P_ATTRI_CAPABILITY_T) NULL;
  385. prP2pAttriCapability = (P_P2P_ATTRI_CAPABILITY_T) prP2pAttribute;
  386. ASSERT(prP2pAttriCapability->u2Length == 2);
  387. rEventDevInfo.ucDeviceCapabilityBitmap = prP2pAttriCapability->ucDeviceCap;
  388. rEventDevInfo.ucGroupCapabilityBitmap = prP2pAttriCapability->ucGroupCap;
  389. }
  390. break;
  391. case P2P_ATTRI_ID_P2P_DEV_ID:
  392. {
  393. P_P2P_ATTRI_DEV_ID_T prP2pAttriDevID = (P_P2P_ATTRI_DEV_ID_T) NULL;
  394. prP2pAttriDevID = (P_P2P_ATTRI_DEV_ID_T) prP2pAttribute;
  395. ASSERT(prP2pAttriDevID->u2Length == 6);
  396. kalMemCopy(rEventDevInfo.aucCommunicateAddr, prP2pAttriDevID->aucDevAddr, MAC_ADDR_LEN);
  397. }
  398. break;
  399. case P2P_ATTRI_ID_P2P_DEV_INFO:
  400. {
  401. P_P2P_ATTRI_DEV_INFO_T prP2pAttriDevInfo = (P_P2P_ATTRI_DEV_INFO_T) NULL;
  402. P_P2P_DEVICE_TYPE_T prP2pDevType = (P_P2P_DEVICE_TYPE_T) NULL;
  403. prP2pAttriDevInfo = (P_P2P_ATTRI_DEV_INFO_T) prP2pAttribute;
  404. rEventDevInfo.fgDevInfoValid = TRUE;
  405. kalMemCopy(rEventDevInfo.aucCommunicateAddr, prP2pAttriDevInfo->aucDevAddr,
  406. MAC_ADDR_LEN);
  407. rEventDevInfo.u2ConfigMethod = prP2pAttriDevInfo->u2ConfigMethodsBE;
  408. prP2pDevType = &rEventDevInfo.rPriDevType;
  409. prP2pDevType->u2CategoryID = prP2pAttriDevInfo->rPrimaryDevTypeBE.u2CategoryId;
  410. prP2pDevType->u2SubCategoryID = prP2pAttriDevInfo->rPrimaryDevTypeBE.u2SubCategoryId;
  411. ASSERT(prP2pAttriDevInfo->ucNumOfSecondaryDevType <= 2);
  412. /* TODO: Fixme if secondary device type is more than 2. */
  413. for (u4Idx = 0; u4Idx < prP2pAttriDevInfo->ucNumOfSecondaryDevType; u4Idx++) {
  414. /* TODO: Current sub device type can only support 2. */
  415. prP2pDevType = &rEventDevInfo.arSecDevType[u4Idx];
  416. prP2pDevType->u2CategoryID = prP2pAttriDevInfo->rPrimaryDevTypeBE.u2CategoryId;
  417. prP2pDevType->u2SubCategoryID =
  418. prP2pAttriDevInfo->rPrimaryDevTypeBE.u2SubCategoryId;
  419. }
  420. prP2pDevName =
  421. (P_DEVICE_NAME_TLV_T) (prP2pAttriDevInfo->arSecondaryDevTypeListBE +
  422. (u4Idx * sizeof(DEVICE_TYPE_T)));
  423. ASSERT(prP2pDevName->u2Id == 0x1011);
  424. ASSERT(prP2pDevName->u2Length <= 32);
  425. /* TODO: Fixme if device name length is longer than 32 bytes. */
  426. kalMemCopy(rEventDevInfo.aucName, prP2pDevName->aucName, prP2pDevName->u2Length);
  427. }
  428. break;
  429. case P2P_ATTRI_ID_P2P_GROUP_INFO:
  430. prP2pAttriGroupInfo = (P_P2P_ATTRI_GROUP_INFO_T) prP2pAttribute;
  431. break;
  432. }
  433. u2AttributeLen -= (prP2pAttribute->u2Length + P2P_ATTRI_HDR_LEN);
  434. prP2pAttribute =
  435. (P_P2P_ATTRIBUTE_T) ((UINT_32) prP2pAttribute + (prP2pAttribute->u2Length + P2P_ATTRI_HDR_LEN));
  436. }
  437. nicRxAddP2pDevice(prAdapter, &rEventDevInfo);
  438. if (prP2pAttriGroupInfo != NULL) {
  439. P_P2P_CLIENT_INFO_DESC_T prClientInfoDesc = (P_P2P_CLIENT_INFO_DESC_T) NULL;
  440. P_P2P_DEVICE_TYPE_T prP2pDevType = (P_P2P_DEVICE_TYPE_T) NULL;
  441. prClientInfoDesc = prP2pAttriGroupInfo->arClientDesc;
  442. u2AttributeLen = prP2pAttriGroupInfo->u2Length;
  443. while (u2AttributeLen > 0) {
  444. /* Basic size for P2P client info descriptor. */
  445. ASSERT(u2AttributeLen >= 25);
  446. rEventDevInfo.fgDevInfoValid = TRUE;
  447. kalMemCopy(rEventDevInfo.aucCommunicateAddr, prClientInfoDesc->aucIfAddr, MAC_ADDR_LEN);
  448. rEventDevInfo.ucDeviceCapabilityBitmap = prClientInfoDesc->ucDeviceCap;
  449. rEventDevInfo.u2ConfigMethod = prClientInfoDesc->u2ConfigMethodsBE;
  450. prP2pDevType = &rEventDevInfo.rPriDevType;
  451. prP2pDevType->u2CategoryID = prClientInfoDesc->rPrimaryDevTypeBE.u2CategoryId;
  452. prP2pDevType->u2SubCategoryID = prClientInfoDesc->rPrimaryDevTypeBE.u2SubCategoryId;
  453. ASSERT(prClientInfoDesc->ucNumOfSecondaryDevType <= 2);
  454. /* TODO: Fixme if secondary device type is more than 2. */
  455. for (u4Idx = 0; u4Idx < prClientInfoDesc->ucNumOfSecondaryDevType; u4Idx++) {
  456. /* TODO: Current sub device type can only support 2. */
  457. prP2pDevType = &rEventDevInfo.arSecDevType[u4Idx];
  458. prP2pDevType->u2CategoryID =
  459. prClientInfoDesc->arSecondaryDevTypeListBE[u4Idx].u2CategoryId;
  460. prP2pDevType->u2SubCategoryID =
  461. prClientInfoDesc->arSecondaryDevTypeListBE[u4Idx].u2SubCategoryId;
  462. }
  463. prP2pDevName =
  464. (P_DEVICE_NAME_TLV_T) (prClientInfoDesc->arSecondaryDevTypeListBE +
  465. (u4Idx * sizeof(DEVICE_TYPE_T)));
  466. ASSERT(prP2pDevName->u2Id == 0x1011);
  467. ASSERT(prP2pDevName->u2Length <= 32);
  468. /* TODO: Fixme if device name length is longer than 32 bytes. */
  469. kalMemCopy(&rEventDevInfo.aucName, prP2pDevName->aucName, prP2pDevName->u2Length);
  470. nicRxAddP2pDevice(prAdapter, &rEventDevInfo);
  471. u2AttributeLen -= prP2pAttriGroupInfo->u2Length;
  472. prP2pAttriGroupInfo = prP2pAttriGroupInfo + prP2pAttriGroupInfo->u2Length + 1;
  473. }
  474. }
  475. #endif
  476. return WLAN_STATUS_SUCCESS;
  477. } /* scanSendDeviceDiscoverEvent */
  478. VOID
  479. scanP2pProcessBeaconAndProbeResp(IN P_ADAPTER_T prAdapter,
  480. IN P_SW_RFB_T prSwRfb,
  481. IN P_WLAN_STATUS prStatus,
  482. IN P_BSS_DESC_T prBssDesc, IN P_WLAN_BEACON_FRAME_T prWlanBeaconFrame)
  483. {
  484. BOOLEAN fgIsSkipThisBeacon;
  485. P_BSS_INFO_T prP2pBssInfo = (P_BSS_INFO_T) NULL;
  486. P_P2P_CONNECTION_SETTINGS_T prP2pConnSettings = (P_P2P_CONNECTION_SETTINGS_T) NULL;
  487. prP2pBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_P2P_INDEX]);
  488. prP2pConnSettings = prAdapter->rWifiVar.prP2PConnSettings;
  489. fgIsSkipThisBeacon = FALSE;
  490. if (prBssDesc->fgIsP2PPresent) {
  491. if ((prP2pBssInfo->eCurrentOPMode == OP_MODE_INFRASTRUCTURE) && /* P2P GC */
  492. (prP2pBssInfo->eConnectionState == PARAM_MEDIA_STATE_CONNECTED) && /* Connected */
  493. ((prWlanBeaconFrame->u2FrameCtrl & MASK_FRAME_TYPE) == MAC_FRAME_BEACON)) { /* TX Beacon */
  494. fgIsSkipThisBeacon = TRUE;
  495. }
  496. if ((!prP2pBssInfo->ucDTIMPeriod) && /* First time. */
  497. fgIsSkipThisBeacon && (EQUAL_SSID(prBssDesc->aucSSID, prBssDesc->ucSSIDLen,
  498. prP2pConnSettings->aucSSID, prP2pConnSettings->ucSSIDLen))) { /* SSID Match */
  499. prP2pBssInfo->ucDTIMPeriod = prBssDesc->ucDTIMPeriod;
  500. nicPmIndicateBssConnected(prAdapter, NETWORK_TYPE_P2P_INDEX);
  501. }
  502. do {
  503. RF_CHANNEL_INFO_T rChannelInfo;
  504. ASSERT_BREAK((prSwRfb != NULL) && (prBssDesc != NULL));
  505. if (((prWlanBeaconFrame->u2FrameCtrl & MASK_FRAME_TYPE) != MAC_FRAME_PROBE_RSP)) {
  506. /* Only report Probe Response frame to supplicant. */
  507. /* Probe response collect much more information. */
  508. if (fgIsSkipThisBeacon || prBssDesc->eBand == BAND_2G4)
  509. break;
  510. }
  511. rChannelInfo.ucChannelNum = prBssDesc->ucChannelNum;
  512. rChannelInfo.eBand = prBssDesc->eBand;
  513. prBssDesc->fgIsP2PReport = TRUE;
  514. DBGLOG(P2P, INFO, "indicate %s [%d]\n", prBssDesc->aucSSID, prBssDesc->ucChannelNum);
  515. kalP2PIndicateBssInfo(prAdapter->prGlueInfo,
  516. (PUINT_8) prSwRfb->pvHeader,
  517. (UINT_32) prSwRfb->u2PacketLen,
  518. &rChannelInfo, RCPI_TO_dBm(prBssDesc->ucRCPI));
  519. } while (FALSE);
  520. }
  521. }
  522. VOID scnEventReturnChannel(IN P_ADAPTER_T prAdapter, IN UINT_8 ucScnSeqNum)
  523. {
  524. CMD_SCAN_CANCEL rCmdScanCancel;
  525. /* send cancel message to firmware domain */
  526. rCmdScanCancel.ucSeqNum = ucScnSeqNum;
  527. rCmdScanCancel.ucIsExtChannel = (UINT_8) FALSE;
  528. wlanSendSetQueryCmd(prAdapter,
  529. CMD_ID_SCAN_CANCEL,
  530. TRUE,
  531. FALSE, FALSE, NULL, NULL, sizeof(CMD_SCAN_CANCEL), (PUINT_8)&rCmdScanCancel, NULL, 0);
  532. } /* scnEventReturnChannel */
  533. VOID scanRemoveAllP2pBssDesc(IN P_ADAPTER_T prAdapter)
  534. {
  535. P_LINK_T prBSSDescList;
  536. P_BSS_DESC_T prBssDesc;
  537. P_BSS_DESC_T prBSSDescNext;
  538. ASSERT(prAdapter);
  539. prBSSDescList = &(prAdapter->rWifiVar.rScanInfo.rBSSDescList);
  540. /* Search BSS Desc from current SCAN result list. */
  541. LINK_FOR_EACH_ENTRY_SAFE(prBssDesc, prBSSDescNext, prBSSDescList, rLinkEntry, BSS_DESC_T) {
  542. scanRemoveP2pBssDesc(prAdapter, prBssDesc);
  543. }
  544. } /* scanRemoveAllP2pBssDesc */
  545. VOID scanRemoveP2pBssDesc(IN P_ADAPTER_T prAdapter, IN P_BSS_DESC_T prBssDesc)
  546. {
  547. } /* scanRemoveP2pBssDesc */
  548. P_BSS_DESC_T
  549. scanP2pSearchDesc(IN P_ADAPTER_T prAdapter, IN P_BSS_INFO_T prP2pBssInfo, IN P_P2P_CONNECTION_REQ_INFO_T prConnReqInfo)
  550. {
  551. P_BSS_DESC_T prCandidateBssDesc = (P_BSS_DESC_T) NULL, prBssDesc = (P_BSS_DESC_T) NULL;
  552. P_LINK_T prBssDescList = (P_LINK_T) NULL;
  553. do {
  554. if ((prAdapter == NULL) || (prP2pBssInfo == NULL) || (prConnReqInfo == NULL))
  555. break;
  556. prBssDescList = &(prAdapter->rWifiVar.rScanInfo.rBSSDescList);
  557. DBGLOG(P2P, LOUD, "Connecting to BSSID: %pM\n", prConnReqInfo->aucBssid);
  558. DBGLOG(P2P, LOUD, "Connecting to SSID:%s, length:%d\n",
  559. prConnReqInfo->rSsidStruct.aucSsid, prConnReqInfo->rSsidStruct.ucSsidLen);
  560. LINK_FOR_EACH_ENTRY(prBssDesc, prBssDescList, rLinkEntry, BSS_DESC_T) {
  561. DBGLOG(P2P, LOUD, "Checking BSS: %pM\n", prBssDesc->aucBSSID);
  562. if (prBssDesc->eBSSType != BSS_TYPE_INFRASTRUCTURE) {
  563. DBGLOG(P2P, LOUD, "Ignore mismatch BSS type.\n");
  564. continue;
  565. }
  566. if (UNEQUAL_MAC_ADDR(prBssDesc->aucBSSID, prConnReqInfo->aucBssid)) {
  567. DBGLOG(P2P, LOUD, "Ignore mismatch BSSID.\n");
  568. continue;
  569. }
  570. /* SSID should be the same? SSID is vary for each connection. so... */
  571. if (UNEQUAL_SSID(prConnReqInfo->rSsidStruct.aucSsid,
  572. prConnReqInfo->rSsidStruct.ucSsidLen,
  573. prBssDesc->aucSSID, prBssDesc->ucSSIDLen)) {
  574. DBGLOG(P2P, TRACE,
  575. "Connecting to BSSID: %pM\n", prConnReqInfo->aucBssid);
  576. DBGLOG(P2P, TRACE,
  577. "Connecting to SSID:%s, length:%d\n", prConnReqInfo->rSsidStruct.aucSsid,
  578. prConnReqInfo->rSsidStruct.ucSsidLen);
  579. DBGLOG(P2P, TRACE,
  580. "Checking SSID:%s, length:%d\n", prBssDesc->aucSSID, prBssDesc->ucSSIDLen);
  581. DBGLOG(P2P, TRACE, "Ignore mismatch SSID, (But BSSID match).\n");
  582. ASSERT(FALSE);
  583. continue;
  584. }
  585. if (!prBssDesc->fgIsP2PPresent) {
  586. DBGLOG(P2P, ERROR, "SSID, BSSID, BSSTYPE match, but no P2P IE present.\n");
  587. continue;
  588. }
  589. /* Final decision. */
  590. prCandidateBssDesc = prBssDesc;
  591. break;
  592. }
  593. } while (FALSE);
  594. return prCandidateBssDesc;
  595. } /* scanP2pSearchDesc */