hs20.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  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_PASSPOINT
  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->ucBssIndex != KAL_NETWORK_TYPE_AIS_INDEX) {
  93. DBGLOG(HS20, INFO, "[%s] prMsduInfo->ucBssIndex(%d) is not KAL_NETWORK_TYPE_AIS_INDEX\n",
  94. __func__, prMsduInfo->ucBssIndex);
  95. return;
  96. }
  97. pucBuffer = (PUINT_8) ((ULONG) prMsduInfo->prPacket + (ULONG) prMsduInfo->u2FrameLength);
  98. /* ASSOC INFO IE ID: 221 :0xDD */
  99. if (prAdapter->prGlueInfo->u2HS20AssocInfoIELen) {
  100. kalMemCopy(pucBuffer, &prAdapter->prGlueInfo->aucHS20AssocInfoIE,
  101. prAdapter->prGlueInfo->u2HS20AssocInfoIELen);
  102. prMsduInfo->u2FrameLength += prAdapter->prGlueInfo->u2HS20AssocInfoIELen;
  103. }
  104. }
  105. VOID hs20FillExtCapIE(P_ADAPTER_T prAdapter, P_BSS_INFO_T prBssInfo, P_MSDU_INFO_T prMsduInfo)
  106. {
  107. P_EXT_CAP_T prExtCap;
  108. ASSERT(prAdapter);
  109. ASSERT(prMsduInfo);
  110. /* Add Extended Capabilities IE */
  111. prExtCap = (P_EXT_CAP_T)
  112. (((PUINT_8) prMsduInfo->prPacket) + prMsduInfo->u2FrameLength);
  113. prExtCap->ucId = ELEM_ID_EXTENDED_CAP;
  114. if (prAdapter->prGlueInfo->fgConnectHS20AP == TRUE)
  115. prExtCap->ucLength = ELEM_MAX_LEN_EXT_CAP;
  116. else
  117. prExtCap->ucLength = 3 - ELEM_HDR_LEN;
  118. kalMemZero(prExtCap->aucCapabilities, prExtCap->ucLength);
  119. prExtCap->aucCapabilities[0] = ELEM_EXT_CAP_DEFAULT_VAL;
  120. if (prBssInfo->eCurrentOPMode != OP_MODE_INFRASTRUCTURE)
  121. prExtCap->aucCapabilities[0] &= ~ELEM_EXT_CAP_PSMP_CAP;
  122. if (prAdapter->prGlueInfo->fgConnectHS20AP == TRUE) {
  123. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_BSS_TRANSITION_BIT);
  124. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_UTC_TSF_OFFSET_BIT);
  125. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_INTERWORKING_BIT);
  126. /* For R2 WNM-Notification */
  127. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_WNM_NOTIFICATION_BIT);
  128. }
  129. DBGLOG(HS20, INFO, "IE_SIZE(prExtCap) = %d, %d %d\n", IE_SIZE(prExtCap),
  130. ELEM_HDR_LEN, ELEM_MAX_LEN_EXT_CAP);
  131. ASSERT(IE_SIZE(prExtCap) <= (ELEM_HDR_LEN + ELEM_MAX_LEN_EXT_CAP));
  132. prMsduInfo->u2FrameLength += IE_SIZE(prExtCap);
  133. }
  134. /*----------------------------------------------------------------------------*/
  135. /*!
  136. * \brief This function is called to fill up the content of Ext Cap IE bit 31.
  137. *
  138. * \param[in] prAdapter Pointer of ADAPTER_T
  139. * \param[out] pucIE Pointer of the IE buffer
  140. *
  141. * \return VOID
  142. */
  143. /*----------------------------------------------------------------------------*/
  144. VOID hs20FillProreqExtCapIE(IN P_ADAPTER_T prAdapter, OUT PUINT_8 pucIE)
  145. {
  146. P_EXT_CAP_T prExtCap;
  147. ASSERT(prAdapter);
  148. /* Add Extended Capabilities IE */
  149. prExtCap = (P_EXT_CAP_T) pucIE;
  150. prExtCap->ucId = ELEM_ID_EXTENDED_CAP;
  151. if (prAdapter->prGlueInfo->fgConnectHS20AP == TRUE)
  152. prExtCap->ucLength = ELEM_MAX_LEN_EXT_CAP;
  153. else
  154. prExtCap->ucLength = 3 - ELEM_HDR_LEN;
  155. kalMemZero(prExtCap->aucCapabilities, prExtCap->ucLength);
  156. prExtCap->aucCapabilities[0] = ELEM_EXT_CAP_DEFAULT_VAL;
  157. if (prAdapter->prGlueInfo->fgConnectHS20AP == TRUE) {
  158. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_BSS_TRANSITION_BIT);
  159. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_UTC_TSF_OFFSET_BIT);
  160. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_INTERWORKING_BIT);
  161. /* For R2 WNM-Notification */
  162. SET_EXT_CAP(prExtCap->aucCapabilities, ELEM_MAX_LEN_EXT_CAP, ELEM_EXT_CAP_WNM_NOTIFICATION_BIT);
  163. }
  164. }
  165. /*----------------------------------------------------------------------------*/
  166. /*!
  167. * \brief This function is called to fill up the content of HS2.0 IE.
  168. *
  169. * \param[in] prAdapter Pointer of ADAPTER_T
  170. * \param[out] pucIE Pointer of the IE buffer
  171. *
  172. * \return VOID
  173. */
  174. /*----------------------------------------------------------------------------*/
  175. VOID hs20FillHS20IE(IN P_ADAPTER_T prAdapter, OUT PUINT_8 pucIE)
  176. {
  177. P_IE_HS20_INDICATION_T prHS20IndicationIe;
  178. /* P_HS20_INFO_T prHS20Info; */
  179. UINT_8 aucWfaOui[] = VENDOR_OUI_WFA_SPECIFIC;
  180. /* prHS20Info = &(prAdapter->rWifiVar.rHS20Info); */
  181. prHS20IndicationIe = (P_IE_HS20_INDICATION_T) pucIE;
  182. prHS20IndicationIe->ucId = ELEM_ID_VENDOR;
  183. prHS20IndicationIe->ucLength = sizeof(IE_HS20_INDICATION_T) - ELEM_HDR_LEN;
  184. prHS20IndicationIe->aucOui[0] = aucWfaOui[0];
  185. prHS20IndicationIe->aucOui[1] = aucWfaOui[1];
  186. prHS20IndicationIe->aucOui[2] = aucWfaOui[2];
  187. prHS20IndicationIe->ucType = VENDOR_OUI_TYPE_HS20;
  188. /* prHS20IndicationIe->ucHotspotConfig = 0x00; *//* For PASSPOINT_R1 */
  189. prHS20IndicationIe->ucHotspotConfig = 0x10; /* For PASSPOINT_R2 */
  190. }
  191. /*----------------------------------------------------------------------------*/
  192. /*!
  193. * \brief This function is called while calculating length of hotspot 2.0 indication IE for Probe Request.
  194. *
  195. * \param[in] prAdapter Pointer of ADAPTER_T
  196. * \param[in] pucTargetBSSID Pointer of target HESSID
  197. *
  198. * \return the length of composed HS20 IE
  199. */
  200. /*----------------------------------------------------------------------------*/
  201. UINT_32 hs20CalculateHS20RelatedIEForProbeReq(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucTargetBSSID)
  202. {
  203. UINT_32 u4IeLength;
  204. if (0) /* Todo:: Not HS20 STA */
  205. return 0;
  206. u4IeLength = sizeof(IE_HS20_INDICATION_T) + /* sizeof(IE_INTERWORKING_T) */ + (ELEM_HDR_LEN +
  207. ELEM_MAX_LEN_EXT_CAP);
  208. if (!pucTargetBSSID) {
  209. /* Todo:: Nothing */
  210. /* u4IeLength -= MAC_ADDR_LEN; */
  211. }
  212. return u4IeLength;
  213. }
  214. /*----------------------------------------------------------------------------*/
  215. /*!
  216. * \brief This function is called while composing hotspot 2.0 indication IE for Probe Request.
  217. *
  218. * \param[in] prAdapter Pointer of ADAPTER_T
  219. * \param[in] pucTargetBSSID Pointer of target HESSID
  220. * \param[out] prIE Pointer of the IE buffer
  221. *
  222. * \return the wlan status
  223. */
  224. /*----------------------------------------------------------------------------*/
  225. WLAN_STATUS hs20GenerateHS20RelatedIEForProbeReq(IN P_ADAPTER_T prAdapter, IN PUINT_8 pucTargetBSSID, OUT PUINT_8 prIE)
  226. {
  227. if (0) /* Todo:: Not HS20 STA */
  228. return 0;
  229. #if 0
  230. P_HS20_INFO_T prHS20Info;
  231. prHS20Info = &(prAdapter->rWifiVar.rHS20Info);
  232. /*
  233. * Generate 802.11u Interworking IE (107)
  234. */
  235. hs20FillInterworkingIE(prAdapter,
  236. prHS20Info->ucAccessNetworkOptions,
  237. prHS20Info->ucVenueGroup, prHS20Info->ucVenueType, pucTargetBSSID, prIE);
  238. prIE += IE_SIZE(prIE);
  239. #endif
  240. /*
  241. * Generate Ext Cap IE (127)
  242. */
  243. hs20FillProreqExtCapIE(prAdapter, prIE);
  244. prIE += IE_SIZE(prIE);
  245. /*
  246. * Generate HS2.0 Indication IE (221)
  247. */
  248. hs20FillHS20IE(prAdapter, prIE);
  249. prIE += IE_SIZE(prIE);
  250. return WLAN_STATUS_SUCCESS;
  251. }
  252. BOOLEAN hs20IsGratuitousArp(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prCurrSwRfb)
  253. {
  254. PUINT_8 pucSenderIP = prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_SENDER_IP_OFFSET;
  255. PUINT_8 pucTargetIP = prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_TARGET_IP_OFFSET;
  256. PUINT_8 pucSenderMac = ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_SNEDER_MAC_OFFSET);
  257. #if CFG_HS20_DEBUG && 0
  258. /* UINT_8 aucIpAllZero[4] = {0,0,0,0}; */
  259. /* UINT_8 aucMACAllZero[MAC_ADDR_LEN] = {0,0,0,0,0,0}; */
  260. PUINT_8 pucTargetMac = ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_TARGET_MAC_OFFSET);
  261. #endif
  262. #if CFG_HS20_DEBUG && 0
  263. PUINT_16 pu2ArpOper = (PUINT_16) ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + ARP_OPERATION_OFFSET);
  264. kalPrint("Recv ARP 0x%04X\n", htons(*pu2ArpOper));
  265. kalPrint("SENDER[" MACSTR "] [%d:%d:%d:%d]\n", MAC2STR(pucSenderMac), *pucSenderIP,
  266. *(pucSenderIP + 1), *(pucSenderIP + 2), *(pucSenderIP + 3));
  267. kalPrint("TARGET[" MACSTR "] [%d:%d:%d:%d]\n", MAC2STR(pucTargetMac), *pucTargetIP,
  268. *(pucTargetIP + 1), *(pucTargetIP + 2), *(pucTargetIP + 3));
  269. #endif
  270. /* IsGratuitousArp */
  271. if (!kalMemCmp(pucSenderIP, pucTargetIP, 4)) {
  272. kalPrint("Drop Gratuitous ARP from [" MACSTR "] [%d:%d:%d:%d]\n",
  273. MAC2STR(pucSenderMac), *pucTargetIP, *(pucTargetIP + 1),
  274. *(pucTargetIP + 2), *(pucTargetIP + 3));
  275. return TRUE;
  276. }
  277. return FALSE;
  278. }
  279. BOOLEAN hs20IsUnsolicitedNeighborAdv(IN P_ADAPTER_T prAdapter, IN P_SW_RFB_T prCurrSwRfb)
  280. {
  281. PUINT_8 pucIpv6Protocol = ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + IPV6_HDR_IP_PROTOCOL_OFFSET);
  282. /* kalPrint("pucIpv6Protocol [%02X:%02X]\n", *pucIpv6Protocol, IPV6_PROTOCOL_ICMPV6); */
  283. if (*pucIpv6Protocol == IPV6_PROTOCOL_ICMPV6) {
  284. PUINT_8 pucICMPv6Type =
  285. ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + IPV6_HDR_LEN + ICMPV6_TYPE_OFFSET);
  286. /* kalPrint("pucICMPv6Type [%02X:%02X]\n", *pucICMPv6Type, ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT); */
  287. if (*pucICMPv6Type == ICMPV6_TYPE_NEIGHBOR_ADVERTISEMENT) {
  288. PUINT_8 pucICMPv6Flag =
  289. ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + IPV6_HDR_LEN + ICMPV6_FLAG_OFFSET);
  290. PUINT_8 pucSrcMAC = ((PUINT_8) prCurrSwRfb->pvHeader + MAC_ADDR_LEN);
  291. #if CFG_HS20_DEBUG
  292. kalPrint("NAdv Flag [%02X] [R(%d)\\S(%d)\\O(%d)]\n",
  293. *pucICMPv6Flag,
  294. (UINT_8) (*pucICMPv6Flag & ICMPV6_FLAG_ROUTER_BIT) >> 7,
  295. (UINT_8) (*pucICMPv6Flag & ICMPV6_FLAG_SOLICITED_BIT) >> 6,
  296. (UINT_8) (*pucICMPv6Flag & ICMPV6_FLAG_OVERWRITE_BIT) >> 5);
  297. #endif
  298. if (!(*pucICMPv6Flag & ICMPV6_FLAG_SOLICITED_BIT)) {
  299. kalPrint("Drop Unsolicited Neighbor Advertisement from [" MACSTR
  300. "]\n", MAC2STR(pucSrcMAC));
  301. return TRUE;
  302. }
  303. }
  304. }
  305. return FALSE;
  306. }
  307. #if CFG_ENABLE_GTK_FRAME_FILTER
  308. BOOLEAN hs20IsForgedGTKFrame(IN P_ADAPTER_T prAdapter, IN P_BSS_INFO_T prBssInfo, IN P_SW_RFB_T prCurrSwRfb)
  309. {
  310. /* 3 TODO: Need to verify this function before enable it */
  311. return FALSE;
  312. #if 0
  313. P_CONNECTION_SETTINGS_T prConnSettings = &prAdapter->rWifiVar.rConnSettings;
  314. PUINT_8 pucEthDestAddr = prCurrSwRfb->pvHeader;
  315. if ((prConnSettings->eEncStatus != ENUM_ENCRYPTION_DISABLED)
  316. && IS_BMCAST_MAC_ADDR(pucEthDestAddr)) {
  317. UINT_8 ucIdx = 0;
  318. PUINT_32 prIpAddr, prPacketDA;
  319. PUINT_16 pu2PktIpVer =
  320. (PUINT_16) ((PUINT_8) prCurrSwRfb->pvHeader + (ETHER_HEADER_LEN - ETHER_TYPE_LEN));
  321. if (*pu2PktIpVer == htons(ETH_P_IPV4)) {
  322. if (!prBssInfo->prIpV4NetAddrList)
  323. return FALSE;
  324. for (ucIdx = 0; ucIdx < prBssInfo->prIpV4NetAddrList->ucAddrCount; ucIdx++) {
  325. prIpAddr = (PUINT_32) &prBssInfo->prIpV4NetAddrList->arNetAddr[ucIdx].aucIpAddr[0];
  326. prPacketDA =
  327. (PUINT_32) ((PUINT_8) prCurrSwRfb->pvHeader + ETHER_HEADER_LEN +
  328. IPV4_HDR_IP_DST_ADDR_OFFSET);
  329. if (kalMemCmp(prIpAddr, prPacketDA, 4) == 0) {
  330. kalPrint("Drop FORGED IPv4 packet\n");
  331. return TRUE;
  332. }
  333. }
  334. }
  335. #ifdef CONFIG_IPV6
  336. else if (*pu2PktIpVer == htons(ETH_P_IPV6)) {
  337. UINT_8 aucIPv6Mac[MAC_ADDR_LEN];
  338. PUINT_8 pucIdx =
  339. prCurrSwRfb->pvHeader + ETHER_HEADER_LEN + IPV6_HDR_IP_DST_ADDR_MAC_HIGH_OFFSET;
  340. kalMemCopy(&aucIPv6Mac[0], pucIdx, 3);
  341. pucIdx += 5;
  342. kalMemCopy(&aucIPv6Mac[3], pucIdx, 3);
  343. kalPrint("Get IPv6 frame Dst IP MAC part " MACSTR "\n", MAC2STR(aucIPv6Mac));
  344. if (EQUAL_MAC_ADDR(aucIPv6Mac, prBssInfo->aucOwnMacAddr)) {
  345. kalPrint("Drop FORGED IPv6 packet\n");
  346. return TRUE;
  347. }
  348. }
  349. #endif
  350. }
  351. return FALSE;
  352. #endif
  353. }
  354. #endif
  355. BOOLEAN hs20IsUnsecuredFrame(IN P_ADAPTER_T prAdapter, IN P_BSS_INFO_T prBssInfo, IN P_SW_RFB_T prCurrSwRfb)
  356. {
  357. PUINT_16 pu2PktIpVer = (PUINT_16) ((PUINT_8) prCurrSwRfb->pvHeader + (ETHER_HEADER_LEN - ETHER_TYPE_LEN));
  358. /* kalPrint("IPVER 0x%4X\n", htons(*pu2PktIpVer)); */
  359. #if CFG_HS20_DEBUG & 0
  360. UINT_8 i = 0;
  361. kalPrint("===============================================");
  362. for (i = 0; i < 96; i++) {
  363. if (!(i % 16))
  364. kalPrint("\n");
  365. kalPrint("%02X ", *((PUINT_8) prCurrSwRfb->pvHeader + i));
  366. }
  367. kalPrint("\n");
  368. #endif
  369. #if CFG_ENABLE_GTK_FRAME_FILTER
  370. if (hs20IsForgedGTKFrame(prAdapter, prBssInfo, prCurrSwRfb))
  371. return TRUE;
  372. /* } else the else is very strange and not make sense here, mark for coding style check*/
  373. #endif
  374. if (*pu2PktIpVer == htons(ETH_P_ARP))
  375. return hs20IsGratuitousArp(prAdapter, prCurrSwRfb);
  376. else if (*pu2PktIpVer == htons(ETH_P_IPV6))
  377. return hs20IsUnsolicitedNeighborAdv(prAdapter, prCurrSwRfb);
  378. return FALSE;
  379. }
  380. BOOLEAN hs20IsFrameFilterEnabled(IN P_ADAPTER_T prAdapter, IN P_BSS_INFO_T prBssInfo)
  381. {
  382. #if 1
  383. if (prAdapter->prGlueInfo->fgConnectHS20AP)
  384. return TRUE;
  385. #else
  386. PARAM_SSID_T rParamSsid;
  387. P_BSS_DESC_T prBssDesc;
  388. rParamSsid.u4SsidLen = prBssInfo->ucSSIDLen;
  389. COPY_SSID(rParamSsid.aucSsid, rParamSsid.u4SsidLen, prBssInfo->aucSSID, prBssInfo->ucSSIDLen);
  390. prBssDesc = scanSearchBssDescByBssidAndSsid(prAdapter, prBssInfo->aucBSSID, TRUE, &rParamSsid);
  391. if (!prBssDesc)
  392. return FALSE;
  393. if (prBssDesc->fgIsSupportHS20) {
  394. if (!(prBssDesc->ucHotspotConfig & ELEM_HS_CONFIG_DGAF_DISABLED_MASK))
  395. return TRUE;
  396. /* Disable frame filter only if DGAF == 1 */
  397. return FALSE;
  398. }
  399. #endif
  400. /* For Now, always return true to run hs20 check even for legacy AP */
  401. return TRUE;
  402. }
  403. WLAN_STATUS hs20SetBssidPool(IN P_ADAPTER_T prAdapter, IN PVOID pvBuffer, IN ENUM_KAL_NETWORK_TYPE_INDEX_T eNetTypeIdx)
  404. {
  405. P_PARAM_HS20_SET_BSSID_POOL prParamBssidPool = (P_PARAM_HS20_SET_BSSID_POOL) pvBuffer;
  406. P_HS20_INFO_T prHS20Info;
  407. UINT_8 ucIdx;
  408. prHS20Info = &(prAdapter->rWifiVar.rHS20Info);
  409. DBGLOG(HS20, INFO, "[%s]Set Bssid Pool! enable[%d] num[%d]\n", __func__, prParamBssidPool->fgIsEnable,
  410. prParamBssidPool->ucNumBssidPool);
  411. for (ucIdx = 0; ucIdx < prParamBssidPool->ucNumBssidPool; ucIdx++) {
  412. COPY_MAC_ADDR(prHS20Info->arBssidPool[ucIdx].aucBSSID, &prParamBssidPool->arBSSID[ucIdx]);
  413. DBGLOG(HS20, INFO, "[%s][%d][" MACSTR "]\n", __func__, ucIdx,
  414. MAC2STR(prHS20Info->arBssidPool[ucIdx].aucBSSID));
  415. }
  416. prHS20Info->fgIsHS2SigmaMode = prParamBssidPool->fgIsEnable;
  417. prHS20Info->ucNumBssidPoolEntry = prParamBssidPool->ucNumBssidPool;
  418. #if 0
  419. wlanClearScanningResult(prAdapter);
  420. #endif
  421. return WLAN_STATUS_SUCCESS;
  422. }
  423. #endif /* CFG_SUPPORT_PASSPOINT */