hs20.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. /*
  2. ** Id: //Department/DaVinci/BRANCHES/HS2_DEV_SW/MT6620_WIFI_DRIVER_V2_1_HS_2_0/mgmt/hs20.c#2
  3. */
  4. /*! \file "hs20.c"
  5. \brief This file including the hotspot 2.0 related function.
  6. This file provided the macros and functions library support for the
  7. protocol layer hotspot 2.0 related function.
  8. */
  9. /*
  10. ** Log: hs20.c
  11. *
  12. */
  13. /*******************************************************************************
  14. * C O M P I L E R F L A G S
  15. ********************************************************************************
  16. */
  17. /*******************************************************************************
  18. * E X T E R N A L R E F E R E N C E S
  19. ********************************************************************************
  20. */
  21. #include "precomp.h"
  22. #if CFG_SUPPORT_HOTSPOT_2_0
  23. /*******************************************************************************
  24. * C O N S T A N T S
  25. ********************************************************************************
  26. */
  27. /*******************************************************************************
  28. * D A T A T Y P E S
  29. ********************************************************************************
  30. */
  31. /*******************************************************************************
  32. * P U B L I C D A T A
  33. ********************************************************************************
  34. */
  35. /*******************************************************************************
  36. * P R I V A T E D A T A
  37. ********************************************************************************
  38. */
  39. /*******************************************************************************
  40. * M A C R O S
  41. ********************************************************************************
  42. */
  43. /*******************************************************************************
  44. * F U N C T I O N D E C L A R A T I O N S
  45. ********************************************************************************
  46. */
  47. /*******************************************************************************
  48. * F U N C T I O N S
  49. ********************************************************************************
  50. */
  51. /*----------------------------------------------------------------------------*/
  52. /*!
  53. * \brief This function is called to generate Interworking IE for Probe Rsp, Bcn, Assoc Req/Rsp.
  54. *
  55. * \param[in] prAdapter Pointer of ADAPTER_T
  56. * \param[out] prMsduInfo Pointer of the Msdu Info
  57. *
  58. * \return VOID
  59. */
  60. /*----------------------------------------------------------------------------*/
  61. VOID hs20GenerateInterworkingIE(IN P_ADAPTER_T prAdapter, OUT P_MSDU_INFO_T prMsduInfo)
  62. {
  63. }
  64. /*----------------------------------------------------------------------------*/
  65. /*!
  66. * \brief This function is called to generate Roaming Consortium IE for Probe Rsp, Bcn, Assoc Req/Rsp.
  67. *
  68. * \param[in] prAdapter Pointer of ADAPTER_T
  69. * \param[out] prMsduInfo Pointer of the Msdu Info
  70. *
  71. * \return VOID
  72. */
  73. /*----------------------------------------------------------------------------*/
  74. VOID hs20GenerateRoamingConsortiumIE(IN P_ADAPTER_T prAdapter, OUT P_MSDU_INFO_T prMsduInfo)
  75. {
  76. }
  77. /*----------------------------------------------------------------------------*/
  78. /*!
  79. * \brief This function is called to generate HS2.0 IE for Probe Rsp, Bcn, Assoc Req/Rsp.
  80. *
  81. * \param[in] prAdapter Pointer of ADAPTER_T
  82. * \param[out] prMsduInfo Pointer of the Msdu Info
  83. *
  84. * \return VOID
  85. */
  86. /*----------------------------------------------------------------------------*/
  87. VOID hs20GenerateHS20IE(IN P_ADAPTER_T prAdapter, OUT P_MSDU_INFO_T prMsduInfo)
  88. {
  89. PUINT_8 pucBuffer;
  90. ASSERT(prAdapter);
  91. ASSERT(prMsduInfo);
  92. if (prMsduInfo->ucNetworkType != NETWORK_TYPE_AIS_INDEX)
  93. return;
  94. pucBuffer = (PUINT_8) ((ULONG) prMsduInfo->prPacket + (UINT_32) prMsduInfo->u2FrameLength);
  95. /* ASSOC INFO IE ID: 221 :0xDD */
  96. if (prAdapter->prGlueInfo->u2HS20AssocInfoIELen) {
  97. kalMemCopy(pucBuffer, &prAdapter->prGlueInfo->aucHS20AssocInfoIE,
  98. prAdapter->prGlueInfo->u2HS20AssocInfoIELen);
  99. prMsduInfo->u2FrameLength += prAdapter->prGlueInfo->u2HS20AssocInfoIELen;
  100. }
  101. }
  102. VOID hs20FillExtCapIE(P_ADAPTER_T prAdapter, P_BSS_INFO_T prBssInfo, P_MSDU_INFO_T prMsduInfo)
  103. {
  104. P_HS20_EXT_CAP_T prExtCap;
  105. ASSERT(prAdapter);
  106. ASSERT(prMsduInfo);
  107. /* Add Extended Capabilities IE */
  108. prExtCap = (P_HS20_EXT_CAP_T)
  109. (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
  110. prExtCap->ucId = ELEM_ID_EXTENDED_CAP;
  111. if (prAdapter->prGlueInfo->fgConnectHS20AP == TRUE)
  112. prExtCap->ucLength = ELEM_MAX_LEN_EXT_CAP;
  113. else
  114. prExtCap->ucLength = 3 - ELEM_HDR_LEN;
  115. kalMemZero(prExtCap->aucCapabilities, prExtCap->ucLength);
  116. prExtCap->aucCapabilities[0] = ELEM_EXT_CAP_DEFAULT_VAL;
  117. if (prBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE)
  118. prExtCap->aucCapabilities[0] &= ~ELEM_EXT_CAP_PSMP_CAP;
  119. if (prAdapter->prGlueInfo->fgConnectHS20AP == TRUE) {
  120. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_BSS_TRANSITION_BIT);
  121. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_UTC_TSF_OFFSET_BIT);
  122. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_INTERWORKING_BIT);
  123. /* For R2 WNM-Notification */
  124. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_WNM_NOTIFICATION_BIT);
  125. }
  126. kalPrint("IE_SIZE(prExtCap) = %d, %d %d\n", IE_SIZE(prExtCap), ELEM_HDR_LEN, ELEM_MAX_LEN_EXT_CAP);
  127. ASSERT(IE_SIZE(prExtCap) <= (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP));
  128. prMsduInfo->u2FrameLength += IE_SIZE(prExtCap);
  129. }
  130. /*----------------------------------------------------------------------------*/
  131. /*!
  132. * \brief This function is called to fill up the content of Ext Cap IE bit 31.
  133. *
  134. * \param[in] prAdapter Pointer of ADAPTER_T
  135. * \param[out] pucIE Pointer of the IE buffer
  136. *
  137. * \return VOID
  138. */
  139. /*----------------------------------------------------------------------------*/
  140. VOID hs20FillProreqExtCapIE(IN P_ADAPTER_T prAdapter, OUT PUINT_8 pucIE)
  141. {
  142. P_HS20_EXT_CAP_T prExtCap;
  143. ASSERT(prAdapter);
  144. /* Add Extended Capabilities IE */
  145. prExtCap = (P_HS20_EXT_CAP_T) pucIE;
  146. prExtCap->ucId = ELEM_ID_EXTENDED_CAP;
  147. if (prAdapter->prGlueInfo->fgConnectHS20AP == TRUE)
  148. prExtCap->ucLength = ELEM_MAX_LEN_EXT_CAP;
  149. else
  150. prExtCap->ucLength = 3 - ELEM_HDR_LEN;
  151. kalMemZero(prExtCap->aucCapabilities, prExtCap->ucLength);
  152. prExtCap->aucCapabilities[0] = ELEM_EXT_CAP_DEFAULT_VAL;
  153. if (prAdapter->prGlueInfo->fgConnectHS20AP == TRUE) {
  154. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_BSS_TRANSITION_BIT);
  155. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_UTC_TSF_OFFSET_BIT);
  156. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_INTERWORKING_BIT);
  157. /* For R2 WNM-Notification */
  158. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_WNM_NOTIFICATION_BIT);
  159. }
  160. }
  161. /*----------------------------------------------------------------------------*/
  162. /*!
  163. * \brief This function is called to fill up the content of HS2.0 IE.
  164. *
  165. * \param[in] prAdapter Pointer of ADAPTER_T
  166. * \param[out] pucIE Pointer of the IE buffer
  167. *
  168. * \return VOID
  169. */
  170. /*----------------------------------------------------------------------------*/
  171. VOID hs20FillHS20IE(IN P_ADAPTER_T prAdapter, OUT PUINT_8 pucIE)
  172. {
  173. P_IE_HS20_INDICATION_T prHS20IndicationIe;
  174. /* P_HS20_INFO_T prHS20Info; */
  175. UINT_8 aucWfaOui[] = VENDOR_OUI_WFA_SPECIFIC;
  176. /* prHS20Info = &(prAdapter->rWifiVar.rHS20Info); */
  177. prHS20IndicationIe = (P_IE_HS20_INDICATION_T) pucIE;
  178. prHS20IndicationIe->ucId = ELEM_ID_VENDOR;
  179. prHS20IndicationIe->ucLength = sizeof(IE_HS20_INDICATION_T) - ELEM_HDR_LEN;
  180. prHS20IndicationIe->aucOui[0] = aucWfaOui[0];
  181. prHS20IndicationIe->aucOui[1] = aucWfaOui[1];
  182. prHS20IndicationIe->aucOui[2] = aucWfaOui[2];
  183. prHS20IndicationIe->ucType = VENDOR_OUI_TYPE_HS20;
  184. prHS20IndicationIe->ucHotspotConfig = 0x00; /* prHS20Info->ucHotspotConfig; */
  185. }
  186. /*----------------------------------------------------------------------------*/
  187. /*!
  188. * \brief This function is called while calculating length of hotspot 2.0 indication IE for Probe Request.
  189. *
  190. * \param[in] prAdapter Pointer of ADAPTER_T
  191. * \param[in] pucTargetBSSID Pointer of target HESSID
  192. *
  193. * \return the length of composed HS20 IE
  194. */
  195. /*----------------------------------------------------------------------------*/
  196. UINT_32 hs20CalculateHS20RelatedIEForProbeReq(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucTargetBSSID)
  197. {
  198. UINT_32 u4IeLength;
  199. if (0) /* Todo:: Not HS20 STA */
  200. return 0;
  201. u4IeLength =
  202. sizeof(IE_HS20_INDICATION_T) + /* sizeof(IE_INTERWORKING_T) */ + (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP);
  203. if (!pucTargetBSSID) {
  204. /* Do nothing */
  205. /* u4IeLength -= MAC_ADDR_LEN; */
  206. }
  207. return u4IeLength;
  208. }
  209. /*----------------------------------------------------------------------------*/
  210. /*!
  211. * \brief This function is called while composing hotspot 2.0 indication IE for Probe Request.
  212. *
  213. * \param[in] prAdapter Pointer of ADAPTER_T
  214. * \param[in] pucTargetBSSID Pointer of target HESSID
  215. * \param[out] prIE Pointer of the IE buffer
  216. *
  217. * \return the wlan status
  218. */
  219. /*----------------------------------------------------------------------------*/
  220. WLAN_STATUS hs20GenerateHS20RelatedIEForProbeReq(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucTargetBSSID, OUT PUINT_8 prIE)
  221. {
  222. if (0) /* Todo:: Not HS20 STA */
  223. return 0;
  224. #if 0
  225. P_HS20_INFO_T prHS20Info;
  226. prHS20Info = &(prAdapter->rWifiVar.rHS20Info);
  227. /*
  228. * Generate 802.11u Interworking IE (107)
  229. */
  230. hs20FillInterworkingIE(prAdapter,
  231. prHS20Info->ucAccessNetworkOptions,
  232. prHS20Info->ucVenueGroup, prHS20Info->ucVenueType, pucTargetBSSID, prIE);
  233. prIE += IE_SIZE(prIE);
  234. #endif
  235. /*
  236. * Generate Ext Cap IE (127)
  237. */
  238. hs20FillProreqExtCapIE(prAdapter, prIE);
  239. prIE += IE_SIZE(prIE);
  240. /*
  241. * Generate HS2.0 Indication IE (221)
  242. */
  243. hs20FillHS20IE(prAdapter, prIE);
  244. prIE += IE_SIZE(prIE);
  245. return WLAN_STATUS_SUCCESS;
  246. }
  247. BOOLEAN hs20IsGratuitousArp(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prCurrSwRfb)
  248. {
  249. PUINT_8 pucSenderIP = prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_SENDER_IP_OFFSET;
  250. PUINT_8 pucTargetIP = prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_TARGET_IP_OFFSET;
  251. PUINT_8 pucSenderMac = ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_SNEDER_MAC_OFFSET);
  252. #if CFG_HS20_DEBUG && 0
  253. /* UINT_8 aucIpAllZero[4] = {0,0,0,0}; */
  254. /* UINT_8 aucMACAllZero[MAC_ADDR_LEN] = {0,0,0,0,0,0}; */
  255. PUINT_8 pucTargetMac = ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_TARGET_MAC_OFFSET);
  256. #endif
  257. #if CFG_HS20_DEBUG && 0
  258. PUINT_16 pu2ArpOper = (PUINT_16) ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_OPERATION_OFFSET);
  259. kalPrint("Recv ARP 0x%04X\n", htons(*pu2ArpOper));
  260. kalPrint("SENDER[ %pM ] [%pI4]\n", pucSenderMac, pucSenderIP);
  261. kalPrint("TARGET[ %pM ] [%pI4]\n", pucTargetMac, pucTargetIP);
  262. #endif
  263. /* IsGratuitousArp */
  264. if (!kalMemCmp(pucSenderIP, pucTargetIP, 4)) {
  265. kalPrint("Drop Gratuitous ARP from [ %pM ] [%pI4]\n", pucSenderMac, pucTargetIP);
  266. return TRUE;
  267. }
  268. return FALSE;
  269. }
  270. BOOLEAN hs20IsUnsolicitedNeighborAdv(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prCurrSwRfb)
  271. {
  272. PUINT_8 pucIpv6Protocol = ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + IPV6_HDR_IP_PROTOCOL_OFFSET);
  273. /* kalPrint("pucIpv6Protocol [%02X:%02X]\n", *pucIpv6Protocol, IPV6_PROTOCOL_ICMPV6); */
  274. if (*pucIpv6Protocol == IPV6_PROTOCOL_ICMPV6) {
  275. PUINT_8 pucICMPv6Type =
  276. ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + IPV6_HDR_LEN + ICMPV6_TYPE_OFFSET);
  277. /* kalPrint("pucICMPv6Type [%02X:%02X]\n", *pucICMPv6Type, ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT); */
  278. if (*pucICMPv6Type == ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT) {
  279. PUINT_8 pucICMPv6Flag =
  280. ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + IPV6_HDR_LEN + ICMPV6_FLAG_OFFSET);
  281. PUINT_8 pucSrcMAC = ((PUINT_8) prCurrSwRfb->pvHeader + MAC_ADDR_LEN);
  282. #if CFG_HS20_DEBUG
  283. kalPrint("NAdv Flag [%02X] [R(%d)\\S(%d)\\O(%d)]\n",
  284. *pucICMPv6Flag,
  285. (UINT_8) (*pucICMPv6Flag & ICMPV6_FLAG_ROUTER_BIT) >> 7,
  286. (UINT_8) (*pucICMPv6Flag & ICMPV6_FLAG_SOLICITED_BIT) >> 6,
  287. (UINT_8) (*pucICMPv6Flag & ICMPV6_FLAG_OVERWRITE_BIT) >> 5);
  288. #endif
  289. if (!(*pucICMPv6Flag & ICMPV6_FLAG_SOLICITED_BIT)) {
  290. kalPrint("Drop Unsolicited Neighbor Advertisement from [%pM]\n", pucSrcMAC);
  291. return TRUE;
  292. }
  293. }
  294. }
  295. return FALSE;
  296. }
  297. #if CFG_ENABLE_GTK_FRAME_FILTER
  298. BOOLEAN hs20IsForgedGTKFrame(IN P_ADAPTER_T prAdapter, IN P_BSS_INFO_T prBssInfo, IN P_SW_RFB_T prCurrSwRfb)
  299. {
  300. /*
  301. P_CONNECTION_SETTINGS_T prConnSettings = &prAdapter->rWifiVar.rConnSettings;
  302. PUINT_8 pucEthDestAddr = prCurrSwRfb->pvHeader;
  303. */
  304. /* 3 TODO: Need to verify this function before enable it */
  305. return FALSE;
  306. /*
  307. if ((prConnSettings->eEncStatus != ENUM_ENCRYPTION_DISABLED) && IS_BMCAST_MAC_ADDR(pucEthDestAddr)) {
  308. UINT_8 ucIdx = 0;
  309. PUINT_32 prIpAddr, prPacketDA;
  310. PUINT_16 pu2PktIpVer =
  311. (PUINT_16) ((PUINT_8) prCurrSwRfb->pvHeader + (ETHER_HEADER_LEN - ETHER_TYPE_LEN));
  312. if (*pu2PktIpVer == htons(ETH_P_IPV4)) {
  313. if (!prBssInfo->prIpV4NetAddrList)
  314. return FALSE;
  315. for (ucIdx = 0; ucIdx < prBssInfo->prIpV4NetAddrList->ucAddrCount; ucIdx++) {
  316. prIpAddr = (PUINT_32) &prBssInfo->prIpV4NetAddrList->arNetAddr[ucIdx].aucIpAddr[0];
  317. prPacketDA =
  318. (PUINT_32) ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN +
  319. IPV4_HDR_IP_DST_ADDR_OFFSET);
  320. if (kalMemCmp(prIpAddr, prPacketDA, 4) == 0) {
  321. kalPrint("Drop FORGED IPv4 packet\n");
  322. return TRUE;
  323. }
  324. }
  325. }
  326. #ifdef CONFIG_IPV6
  327. else if (*pu2PktIpVer == htons(ETH_P_IPV6)) {
  328. UINT_8 aucIPv6Mac[MAC_ADDR_LEN];
  329. PUINT_8 pucIdx =
  330. prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + IPV6_HDR_IP_DST_ADDR_MAC_HIGH_OFFSET;
  331. kalMemCopy(&aucIPv6Mac[0], pucIdx, 3);
  332. pucIdx += 5;
  333. kalMemCopy(&aucIPv6Mac[3], pucIdx, 3);
  334. kalPrint("Get IPv6 frame Dst IP MAC part %pM\n", aucIPv6Mac);
  335. if (EQUAL_MAC_ADDR(aucIPv6Mac, prBssInfo->aucOwnMacAddr)) {
  336. kalPrint("Drop FORGED IPv6 packet\n");
  337. return TRUE;
  338. }
  339. }
  340. #endif
  341. }
  342. return FALSE;
  343. */
  344. }
  345. #endif
  346. BOOLEAN hs20IsUnsecuredFrame(IN P_ADAPTER_T prAdapter, IN P_BSS_INFO_T prBssInfo, IN P_SW_RFB_T prCurrSwRfb)
  347. {
  348. PUINT_16 pu2PktIpVer = (PUINT_16) ((PUINT_8) prCurrSwRfb->pvHeader + (ETHER_HEADER_LEN - ETHER_TYPE_LEN));
  349. /* kalPrint("IPVER 0x%4X\n", htons(*pu2PktIpVer)); */
  350. #if CFG_HS20_DEBUG & 0
  351. UINT_8 i = 0;
  352. kalPrint("===============================================");
  353. for (i = 0; i < 96; i++) {
  354. if (!(i % 16))
  355. kalPrint("\n");
  356. kalPrint("%02X ", *((PUINT_8) prCurrSwRfb->pvHeader + i));
  357. }
  358. kalPrint("\n");
  359. #endif
  360. #if CFG_ENABLE_GTK_FRAME_FILTER
  361. if (hs20IsForgedGTKFrame(prAdapter, prBssInfo, prCurrSwRfb))
  362. return TRUE;
  363. #endif
  364. if (*pu2PktIpVer == htons(ETH_P_ARP))
  365. return hs20IsGratuitousArp(prAdapter, prCurrSwRfb);
  366. else if (*pu2PktIpVer == htons(ETH_P_IPV6))
  367. return hs20IsUnsolicitedNeighborAdv(prAdapter, prCurrSwRfb);
  368. return FALSE;
  369. }
  370. BOOLEAN hs20IsFrameFilterEnabled(IN P_ADAPTER_T prAdapter, IN P_BSS_INFO_T prBssInfo)
  371. {
  372. #if 1
  373. if (prAdapter->prGlueInfo->fgConnectHS20AP)
  374. return TRUE;
  375. #else
  376. PARAM_SSID_T rParamSsid;
  377. P_BSS_DESC_T prBssDesc;
  378. rParamSsid.u4SsidLen = prBssInfo->ucSSIDLen;
  379. COPY_SSID(rParamSsid.aucSsid, rParamSsid.u4SsidLen, prBssInfo->aucSSID, prBssInfo->ucSSIDLen);
  380. prBssDesc = scanSearchBssDescByBssidAndSsid(prAdapter, prBssInfo->aucBSSID, TRUE, &rParamSsid);
  381. if (!prBssDesc)
  382. return FALSE;
  383. if (prBssDesc->fgIsSupportHS20) {
  384. if (!(prBssDesc->ucHotspotConfig & ELEM_HS_CONFIG_DGAF_DISABLED_MASK))
  385. return TRUE;
  386. /* Disable frame filter only if DGAF == 1 */
  387. return FALSE;
  388. }
  389. #endif
  390. /* For Now, always return true to run hs20 check even for legacy AP */
  391. return TRUE;
  392. }
  393. WLAN_STATUS hs20SetBssidPool(IN P_ADAPTER_T prAdapter, IN PVOID pvBuffer, IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIdx)
  394. {
  395. P_PARAM_HS20_SET_BSSID_POOL prParamBssidPool = (P_PARAM_HS20_SET_BSSID_POOL) pvBuffer;
  396. P_HS20_INFO_T prHS20Info;
  397. UINT_8 ucIdx;
  398. prHS20Info = &(prAdapter->rWifiVar.rHS20Info);
  399. kalPrint("[%s]Set Bssid Pool! enable[%d] num[%d]\n", __func__, prParamBssidPool->fgIsEnable,
  400. prParamBssidPool->ucNumBssidPool);
  401. for (ucIdx = 0; ucIdx < prParamBssidPool->ucNumBssidPool; ucIdx++) {
  402. COPY_MAC_ADDR(prHS20Info->arBssidPool[ucIdx].aucBSSID, &prParamBssidPool->arBSSID[ucIdx]);
  403. kalPrint("[%s][%d][ %pM ]\n", __func__, ucIdx, (prHS20Info->arBssidPool[ucIdx].aucBSSID));
  404. }
  405. prHS20Info->fgIsHS2SigmaMode = prParamBssidPool->fgIsEnable;
  406. prHS20Info->ucNumBssidPoolEntry = prParamBssidPool->ucNumBssidPool;
  407. #if 0
  408. wlanClearScanningResult(prAdapter);
  409. #endif
  410. return WLAN_STATUS_SUCCESS;
  411. }
  412. #endif