p2p_ie.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. #include "p2p_precomp.h"
  2. #if CFG_SUPPORT_WFD
  3. #if CFG_SUPPORT_WFD_COMPOSE_IE
  4. #if 0
  5. APPEND_VAR_ATTRI_ENTRY_T txProbeRspWFDAttributesTable[] = {
  6. {(WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_DEV_INFO), NULL, wfdFuncAppendAttriDevInfo} /* 0 */
  7. , {(WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_ASSOC_BSSID), NULL, wfdFuncAppendAttriAssocBssid} /* 1 */
  8. , {(WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO), NULL, wfdFuncAppendAttriCoupledSinkInfo} /* 6 */
  9. , {(WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_EXT_CAPABILITY), NULL, wfdFuncAppendAttriExtCapability} /* 7 */
  10. , {0, wfdFuncCalculateAttriLenSessionInfo, wfdFuncAppendAttriSessionInfo} /* 9 */
  11. };
  12. APPEND_VAR_ATTRI_ENTRY_T txBeaconWFDAttributesTable[] = {
  13. {(WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_DEV_INFO), NULL, wfdFuncAppendAttriDevInfo} /* 0 */
  14. , {(WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_ASSOC_BSSID), NULL, wfdFuncAppendAttriAssocBssid} /* 1 */
  15. , {(WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO), NULL, wfdFuncAppendAttriCoupledSinkInfo} /* 6 */
  16. };
  17. APPEND_VAR_ATTRI_ENTRY_T txAssocReqWFDAttributesTable[] = {
  18. {(WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_DEV_INFO), NULL, wfdFuncAppendAttriDevInfo} /* 0 */
  19. , {(WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_ASSOC_BSSID), NULL, wfdFuncAppendAttriAssocBssid} /* 1 */
  20. , {(WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO), NULL, wfdFuncAppendAttriCoupledSinkInfo} /* 6 */
  21. };
  22. #endif
  23. APPEND_VAR_ATTRI_ENTRY_T txAssocRspWFDAttributesTable[] = {
  24. {(WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_DEV_INFO), NULL, wfdFuncAppendAttriDevInfo} /* 0 */
  25. , {(WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_ASSOC_BSSID), NULL, wfdFuncAppendAttriAssocBssid} /* 1 */
  26. , {(WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO), NULL, wfdFuncAppendAttriCoupledSinkInfo} /* 6 */
  27. , {0, wfdFuncCalculateAttriLenSessionInfo, wfdFuncAppendAttriSessionInfo} /* 9 */
  28. };
  29. #endif
  30. UINT_32
  31. p2pCalculate_IEForAssocReq(IN P_ADAPTER_T prAdapter,
  32. IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex, IN P_STA_RECORD_T prStaRec)
  33. {
  34. P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
  35. P_P2P_CONNECTION_REQ_INFO_T prConnReqInfo = (P_P2P_CONNECTION_REQ_INFO_T) NULL;
  36. UINT_32 u4RetValue = 0;
  37. do {
  38. ASSERT_BREAK((eNetTypeIndex == NETWORK_TYPE_P2P_INDEX) && (prAdapter != NULL));
  39. prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
  40. prConnReqInfo = &(prP2pFsmInfo->rConnReqInfo);
  41. u4RetValue = prConnReqInfo->u4BufLength;
  42. /* ADD HT Capability */
  43. u4RetValue += (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP);
  44. /* ADD WMM Information Element */
  45. u4RetValue += (ELEM_HDR_LEN + ELEM_MAX_LEN_WMM_INFO);
  46. } while (FALSE);
  47. return u4RetValue;
  48. } /* p2pCalculate_IEForAssocReq */
  49. /*----------------------------------------------------------------------------*/
  50. /*!
  51. * @brief This function is used to generate P2P IE for Beacon frame.
  52. *
  53. * @param[in] prMsduInfo Pointer to the composed MSDU_INFO_T.
  54. *
  55. * @return none
  56. */
  57. /*----------------------------------------------------------------------------*/
  58. VOID p2pGenerate_IEForAssocReq(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo)
  59. {
  60. P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T) NULL;
  61. P_P2P_CONNECTION_REQ_INFO_T prConnReqInfo = (P_P2P_CONNECTION_REQ_INFO_T) NULL;
  62. PUINT_8 pucIEBuf = (PUINT_8) NULL;
  63. do {
  64. ASSERT_BREAK((prAdapter != NULL) && (prMsduInfo != NULL));
  65. prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
  66. prConnReqInfo = &(prP2pFsmInfo->rConnReqInfo);
  67. pucIEBuf = (PUINT_8) ((ULONG) prMsduInfo->prPacket + (UINT_32) prMsduInfo->u2FrameLength);
  68. kalMemCopy(pucIEBuf, prConnReqInfo->aucIEBuf, prConnReqInfo->u4BufLength);
  69. prMsduInfo->u2FrameLength += prConnReqInfo->u4BufLength;
  70. rlmReqGenerateHtCapIE(prAdapter, prMsduInfo);
  71. mqmGenerateWmmInfoIE(prAdapter, prMsduInfo);
  72. } while (FALSE);
  73. return;
  74. } /* p2pGenerate_IEForAssocReq */
  75. UINT_32
  76. wfdFuncAppendAttriDevInfo(IN P_ADAPTER_T prAdapter,
  77. IN BOOLEAN fgIsAssocFrame, IN PUINT_16 pu2Offset, IN PUINT_8 pucBuf, IN UINT_16 u2BufSize)
  78. {
  79. UINT_32 u4AttriLen = 0;
  80. PUINT_8 pucBuffer = NULL;
  81. P_WFD_DEVICE_INFORMATION_IE_T prWfdDevInfo = (P_WFD_DEVICE_INFORMATION_IE_T) NULL;
  82. P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL;
  83. do {
  84. ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
  85. prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
  86. ASSERT_BREAK((prWfdCfgSettings != NULL));
  87. if ((prWfdCfgSettings->ucWfdEnable == 0) ||
  88. ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_DEV_INFO_VALID) == 0)) {
  89. break;
  90. }
  91. pucBuffer = (PUINT_8) ((ULONG) pucBuf + (UINT_32) (*pu2Offset));
  92. ASSERT_BREAK(pucBuffer != NULL);
  93. prWfdDevInfo = (P_WFD_DEVICE_INFORMATION_IE_T) pucBuffer;
  94. prWfdDevInfo->ucElemID = WFD_ATTRI_ID_DEV_INFO;
  95. WLAN_SET_FIELD_BE16(&prWfdDevInfo->u2WfdDevInfo, prWfdCfgSettings->u2WfdDevInfo);
  96. WLAN_SET_FIELD_BE16(&prWfdDevInfo->u2SessionMgmtCtrlPort, prWfdCfgSettings->u2WfdControlPort);
  97. WLAN_SET_FIELD_BE16(&prWfdDevInfo->u2WfdDevMaxSpeed, prWfdCfgSettings->u2WfdMaximumTp);
  98. WLAN_SET_FIELD_BE16(&prWfdDevInfo->u2Length, WFD_ATTRI_MAX_LEN_DEV_INFO);
  99. u4AttriLen = WFD_ATTRI_MAX_LEN_DEV_INFO + WFD_ATTRI_HDR_LEN;
  100. } while (FALSE);
  101. (*pu2Offset) += (UINT_16) u4AttriLen;
  102. return u4AttriLen;
  103. }
  104. /* wfdFuncAppendAttriDevInfo */
  105. UINT_32
  106. wfdFuncAppendAttriAssocBssid(IN P_ADAPTER_T prAdapter,
  107. IN BOOLEAN fgIsAssocFrame, IN PUINT_16 pu2Offset, IN PUINT_8 pucBuf, IN UINT_16 u2BufSize)
  108. {
  109. UINT_32 u4AttriLen = 0;
  110. PUINT_8 pucBuffer = NULL;
  111. P_WFD_ASSOCIATED_BSSID_IE_T prWfdAssocBssid = (P_WFD_ASSOCIATED_BSSID_IE_T) NULL;
  112. P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL;
  113. P_BSS_INFO_T prAisBssInfo = (P_BSS_INFO_T) NULL;
  114. do {
  115. ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
  116. prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
  117. ASSERT_BREAK((prWfdCfgSettings != NULL));
  118. if (prWfdCfgSettings->ucWfdEnable == 0)
  119. break;
  120. /* AIS network. */
  121. prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
  122. if ((!IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX)) ||
  123. (prAisBssInfo->eConnectionState != PARAM_MEDIA_STATE_CONNECTED)) {
  124. break;
  125. }
  126. pucBuffer = (PUINT_8) ((ULONG) pucBuf + (UINT_32) (*pu2Offset));
  127. ASSERT_BREAK(pucBuffer != NULL);
  128. prWfdAssocBssid = (P_WFD_ASSOCIATED_BSSID_IE_T) pucBuffer;
  129. prWfdAssocBssid->ucElemID = WFD_ATTRI_ID_ASSOC_BSSID;
  130. WLAN_SET_FIELD_BE16(&prWfdAssocBssid->u2Length, WFD_ATTRI_MAX_LEN_ASSOC_BSSID);
  131. COPY_MAC_ADDR(prWfdAssocBssid->aucAssocBssid, prAisBssInfo->aucBSSID);
  132. u4AttriLen = WFD_ATTRI_MAX_LEN_ASSOC_BSSID + WFD_ATTRI_HDR_LEN;
  133. } while (FALSE);
  134. (*pu2Offset) += (UINT_16) u4AttriLen;
  135. return u4AttriLen;
  136. }
  137. /* wfdFuncAppendAttriAssocBssid */
  138. UINT_32
  139. wfdFuncAppendAttriCoupledSinkInfo(IN P_ADAPTER_T prAdapter,
  140. IN BOOLEAN fgIsAssocFrame,
  141. IN PUINT_16 pu2Offset, IN PUINT_8 pucBuf, IN UINT_16 u2BufSize)
  142. {
  143. UINT_32 u4AttriLen = 0;
  144. PUINT_8 pucBuffer = NULL;
  145. P_WFD_COUPLE_SINK_INFORMATION_IE_T prWfdCoupleSinkInfo = (P_WFD_COUPLE_SINK_INFORMATION_IE_T) NULL;
  146. P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL;
  147. do {
  148. ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
  149. prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
  150. ASSERT_BREAK((prWfdCfgSettings != NULL));
  151. if ((prWfdCfgSettings->ucWfdEnable == 0) ||
  152. ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_SINK_INFO_VALID) == 0)) {
  153. break;
  154. }
  155. pucBuffer = (PUINT_8) ((ULONG) pucBuf + (UINT_32) (*pu2Offset));
  156. ASSERT_BREAK(pucBuffer != NULL);
  157. prWfdCoupleSinkInfo = (P_WFD_COUPLE_SINK_INFORMATION_IE_T) pucBuffer;
  158. prWfdCoupleSinkInfo->ucElemID = WFD_ATTRI_ID_COUPLED_SINK_INFO;
  159. WLAN_SET_FIELD_BE16(&prWfdCoupleSinkInfo->u2Length, WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO);
  160. COPY_MAC_ADDR(prWfdCoupleSinkInfo->aucCoupleSinkMac, prWfdCfgSettings->aucWfdCoupleSinkAddress);
  161. prWfdCoupleSinkInfo->ucCoupleSinkStatusBp = prWfdCfgSettings->ucWfdCoupleSinkStatus;
  162. u4AttriLen = WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO + WFD_ATTRI_HDR_LEN;
  163. } while (FALSE);
  164. (*pu2Offset) += (UINT_16) u4AttriLen;
  165. return u4AttriLen;
  166. }
  167. /* wfdFuncAppendAttriCoupledSinkInfo */
  168. UINT_32
  169. wfdFuncAppendAttriExtCapability(IN P_ADAPTER_T prAdapter,
  170. IN BOOLEAN fgIsAssocFrame,
  171. IN PUINT_16 pu2Offset, IN PUINT_8 pucBuf, IN UINT_16 u2BufSize)
  172. {
  173. UINT_32 u4AttriLen = 0;
  174. PUINT_8 pucBuffer = NULL;
  175. P_WFD_EXTENDED_CAPABILITY_IE_T prWfdExtCapability = (P_WFD_EXTENDED_CAPABILITY_IE_T) NULL;
  176. P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL;
  177. do {
  178. ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
  179. prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
  180. ASSERT_BREAK((prWfdCfgSettings != NULL));
  181. if ((prWfdCfgSettings->ucWfdEnable == 0) ||
  182. ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_EXT_CAPABILITY_VALID) == 0)) {
  183. break;
  184. }
  185. pucBuffer = (PUINT_8) ((ULONG) pucBuf + (UINT_32) (*pu2Offset));
  186. ASSERT_BREAK(pucBuffer != NULL);
  187. prWfdExtCapability = (P_WFD_EXTENDED_CAPABILITY_IE_T) pucBuffer;
  188. prWfdExtCapability->ucElemID = WFD_ATTRI_ID_EXT_CAPABILITY;
  189. WLAN_SET_FIELD_BE16(&prWfdExtCapability->u2Length, WFD_ATTRI_MAX_LEN_EXT_CAPABILITY);
  190. WLAN_SET_FIELD_BE16(&prWfdExtCapability->u2WfdExtCapabilityBp, prWfdCfgSettings->u2WfdExtendCap);
  191. u4AttriLen = WFD_ATTRI_MAX_LEN_EXT_CAPABILITY + WFD_ATTRI_HDR_LEN;
  192. } while (FALSE);
  193. (*pu2Offset) += (UINT_16) u4AttriLen;
  194. return u4AttriLen;
  195. }
  196. /* wfdFuncAppendAttriExtCapability */
  197. /*----------------------------------------------------------------------------*/
  198. /*!
  199. * @brief This function is used to calculate length of Channel List Attribute
  200. *
  201. * @param[in] prStaRec Pointer to the STA_RECORD_T
  202. *
  203. * @return The length of Attribute added
  204. */
  205. /*----------------------------------------------------------------------------*/
  206. UINT_32 wfdFuncCalculateAttriLenSessionInfo(IN P_ADAPTER_T prAdapter, IN P_STA_RECORD_T prStaRec)
  207. {
  208. UINT_16 u2AttriLen = 0;
  209. P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL;
  210. do {
  211. ASSERT_BREAK((prAdapter != NULL) && (prStaRec != NULL));
  212. prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
  213. if (prWfdCfgSettings->ucWfdEnable == 0)
  214. break;
  215. u2AttriLen = prWfdCfgSettings->u2WfdSessionInformationIELen + WFD_ATTRI_HDR_LEN;
  216. } while (FALSE);
  217. return (UINT_32) u2AttriLen;
  218. } /* wfdFuncCalculateAttriLenSessionInfo */
  219. UINT_32
  220. wfdFuncAppendAttriSessionInfo(IN P_ADAPTER_T prAdapter,
  221. IN BOOLEAN fgIsAssocFrame, IN PUINT_16 pu2Offset, IN PUINT_8 pucBuf, IN UINT_16 u2BufSize)
  222. {
  223. UINT_32 u4AttriLen = 0;
  224. PUINT_8 pucBuffer = NULL;
  225. P_WFD_SESSION_INFORMATION_IE_T prWfdSessionInfo = (P_WFD_SESSION_INFORMATION_IE_T) NULL;
  226. P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL;
  227. do {
  228. ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
  229. prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
  230. ASSERT_BREAK((prWfdCfgSettings != NULL));
  231. if ((prWfdCfgSettings->ucWfdEnable == 0) || (prWfdCfgSettings->u2WfdSessionInformationIELen == 0))
  232. break;
  233. pucBuffer = (PUINT_8) ((ULONG) pucBuf + (UINT_32) (*pu2Offset));
  234. ASSERT_BREAK(pucBuffer != NULL);
  235. prWfdSessionInfo = (P_WFD_SESSION_INFORMATION_IE_T) pucBuffer;
  236. prWfdSessionInfo->ucElemID = WFD_ATTRI_ID_SESSION_INFO;
  237. /* TODO: Check endian issue? */
  238. kalMemCopy(prWfdSessionInfo->pucWfdDevInfoDesc, prWfdCfgSettings->aucWfdSessionInformationIE,
  239. prWfdCfgSettings->u2WfdSessionInformationIELen);
  240. WLAN_SET_FIELD_16(&prWfdSessionInfo->u2Length, prWfdCfgSettings->u2WfdSessionInformationIELen);
  241. u4AttriLen = prWfdCfgSettings->u2WfdSessionInformationIELen + WFD_ATTRI_HDR_LEN;
  242. } while (FALSE);
  243. (*pu2Offset) += (UINT_16) u4AttriLen;
  244. return u4AttriLen;
  245. }
  246. /* wfdFuncAppendAttriSessionInfo */
  247. #if CFG_SUPPORT_WFD_COMPOSE_IE
  248. VOID
  249. wfdFuncGenerateWfd_IE(IN P_ADAPTER_T prAdapter,
  250. IN BOOLEAN fgIsAssocFrame,
  251. IN PUINT_16 pu2Offset,
  252. IN PUINT_8 pucBuf,
  253. IN UINT_16 u2BufSize,
  254. IN APPEND_VAR_ATTRI_ENTRY_T arAppendAttriTable[], IN UINT_32 u4AttriTableSize)
  255. {
  256. PUINT_8 pucBuffer = (PUINT_8) NULL;
  257. P_IE_WFD_T prIeWFD = (P_IE_WFD_T) NULL;
  258. UINT_32 u4OverallAttriLen;
  259. UINT_32 u4AttriLen;
  260. UINT_8 aucWfaOui[] = VENDOR_OUI_WFA_SPECIFIC;
  261. UINT_8 aucTempBuffer[P2P_MAXIMUM_ATTRIBUTE_LEN];
  262. UINT_32 i;
  263. do {
  264. ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL));
  265. pucBuffer = (PUINT_8) ((ULONG) pucBuf + (*pu2Offset));
  266. ASSERT_BREAK(pucBuffer != NULL);
  267. /* Check buffer length is still enough. */
  268. ASSERT_BREAK((u2BufSize - (*pu2Offset)) >= WFD_IE_OUI_HDR);
  269. prIeWFD = (P_IE_WFD_T) pucBuffer;
  270. prIeWFD->ucId = ELEM_ID_WFD;
  271. prIeWFD->aucOui[0] = aucWfaOui[0];
  272. prIeWFD->aucOui[1] = aucWfaOui[1];
  273. prIeWFD->aucOui[2] = aucWfaOui[2];
  274. prIeWFD->ucOuiType = VENDOR_OUI_TYPE_WFD;
  275. (*pu2Offset) += WFD_IE_OUI_HDR;
  276. /* Overall length of all Attributes */
  277. u4OverallAttriLen = 0;
  278. for (i = 0; i < u4AttriTableSize; i++) {
  279. if (arAppendAttriTable[i].pfnAppendAttri) {
  280. u4AttriLen =
  281. arAppendAttriTable[i].pfnAppendAttri(prAdapter, fgIsAssocFrame, pu2Offset, pucBuf,
  282. u2BufSize);
  283. u4OverallAttriLen += u4AttriLen;
  284. if (u4OverallAttriLen > P2P_MAXIMUM_ATTRIBUTE_LEN) {
  285. u4OverallAttriLen -= P2P_MAXIMUM_ATTRIBUTE_LEN;
  286. prIeWFD->ucLength = (VENDOR_OUI_TYPE_LEN + P2P_MAXIMUM_ATTRIBUTE_LEN);
  287. pucBuffer =
  288. (PUINT_8) ((ULONG) prIeWFD + (WFD_IE_OUI_HDR + P2P_MAXIMUM_ATTRIBUTE_LEN));
  289. prIeWFD =
  290. (P_IE_WFD_T) ((ULONG) prIeWFD +
  291. (WFD_IE_OUI_HDR + P2P_MAXIMUM_ATTRIBUTE_LEN));
  292. kalMemCopy(aucTempBuffer, pucBuffer, u4OverallAttriLen);
  293. prIeWFD->ucId = ELEM_ID_WFD;
  294. prIeWFD->aucOui[0] = aucWfaOui[0];
  295. prIeWFD->aucOui[1] = aucWfaOui[1];
  296. prIeWFD->aucOui[2] = aucWfaOui[2];
  297. prIeWFD->ucOuiType = VENDOR_OUI_TYPE_WFD;
  298. kalMemCopy(prIeWFD->aucWFDAttributes, aucTempBuffer, u4OverallAttriLen);
  299. (*pu2Offset) += WFD_IE_OUI_HDR;
  300. }
  301. }
  302. }
  303. prIeWFD->ucLength = (UINT_8) (VENDOR_OUI_TYPE_LEN + u4OverallAttriLen);
  304. } while (FALSE);
  305. } /* wfdFuncGenerateWfd_IE */
  306. #endif /* CFG_SUPPORT_WFD_COMPOSE_IE */
  307. UINT_32
  308. wfdFuncCalculateWfdIELenForAssocRsp(IN P_ADAPTER_T prAdapter,
  309. IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex, IN P_STA_RECORD_T prStaRec)
  310. {
  311. #if CFG_SUPPORT_WFD_COMPOSE_IE
  312. P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL;
  313. prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
  314. if (!IS_STA_P2P_TYPE(prStaRec) || (prWfdCfgSettings->ucWfdEnable == 0))
  315. return 0;
  316. return p2pFuncCalculateP2P_IELen(prAdapter,
  317. eNetTypeIndex,
  318. prStaRec,
  319. txAssocRspWFDAttributesTable,
  320. sizeof(txAssocRspWFDAttributesTable) / sizeof(APPEND_VAR_ATTRI_ENTRY_T));
  321. #else
  322. return 0;
  323. #endif
  324. } /* wfdFuncCalculateWfdIELenForAssocRsp */
  325. VOID wfdFuncGenerateWfdIEForAssocRsp(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo)
  326. {
  327. #if CFG_SUPPORT_WFD_COMPOSE_IE
  328. P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T) NULL;
  329. P_STA_RECORD_T prStaRec;
  330. do {
  331. ASSERT_BREAK((prMsduInfo != NULL) && (prAdapter != NULL));
  332. prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
  333. prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
  334. if (!prStaRec) {
  335. ASSERT(FALSE);
  336. } else if (IS_STA_P2P_TYPE(prStaRec)) {
  337. if (prWfdCfgSettings->ucWfdEnable == 0)
  338. break;
  339. if ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_DEV_INFO_VALID) == 0)
  340. break;
  341. wfdFuncGenerateWfd_IE(prAdapter,
  342. FALSE,
  343. &prMsduInfo->u2FrameLength,
  344. prMsduInfo->prPacket,
  345. 1500,
  346. txAssocRspWFDAttributesTable,
  347. sizeof(txAssocRspWFDAttributesTable) / sizeof(APPEND_VAR_ATTRI_ENTRY_T));
  348. }
  349. } while (FALSE);
  350. return;
  351. #else
  352. return;
  353. #endif
  354. } /* wfdFuncGenerateWfdIEForAssocRsp */
  355. VOID p2pFuncComposeNoaAttribute(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo)
  356. {
  357. P_IE_P2P_T prIeP2P;
  358. P_P2P_ATTRI_NOA_T prNoaAttr = NULL;
  359. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = NULL;
  360. P_NOA_DESCRIPTOR_T prNoaDesc = NULL;
  361. UINT_8 aucWfaOui[] = VENDOR_OUI_WFA_SPECIFIC;
  362. UINT_32 u4AttributeLen;
  363. UINT_32 u4NumOfNoaDesc = 0;
  364. UINT_32 i = 0;
  365. /*P2P IE format */
  366. prIeP2P = (P_IE_P2P_T) ((ULONG) prMsduInfo->prPacket + (UINT_32) prMsduInfo->u2FrameLength);
  367. prIeP2P->ucId = ELEM_ID_P2P;
  368. prIeP2P->aucOui[0] = aucWfaOui[0];
  369. prIeP2P->aucOui[1] = aucWfaOui[1];
  370. prIeP2P->aucOui[2] = aucWfaOui[2];
  371. prIeP2P->ucOuiType = VENDOR_OUI_TYPE_P2P;
  372. prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
  373. /*P2P Attribute--NoA */
  374. prNoaAttr = (P_P2P_ATTRI_NOA_T) prIeP2P->aucP2PAttributes;
  375. prNoaAttr->ucId = P2P_ATTRI_ID_NOTICE_OF_ABSENCE;
  376. prNoaAttr->ucIndex = prP2pSpecificBssInfo->ucNoAIndex;
  377. /*OPP*/ if (prP2pSpecificBssInfo->fgEnableOppPS) {
  378. prNoaAttr->ucCTWOppPSParam = P2P_CTW_OPPPS_PARAM_OPPPS_FIELD |
  379. (prP2pSpecificBssInfo->u2CTWindow & P2P_CTW_OPPPS_PARAM_CTWINDOW_MASK);
  380. } else {
  381. prNoaAttr->ucCTWOppPSParam = 0;
  382. }
  383. /*NoA Description */
  384. DBGLOG(P2P, INFO, "Compose NoA count=%d.\n", prP2pSpecificBssInfo->ucNoATimingCount);
  385. for (i = 0; i < prP2pSpecificBssInfo->ucNoATimingCount; i++) {
  386. if (prP2pSpecificBssInfo->arNoATiming[i].fgIsInUse) {
  387. prNoaDesc = (P_NOA_DESCRIPTOR_T) &prNoaAttr->aucNoADesc[u4NumOfNoaDesc];
  388. prNoaDesc->ucCountType = prP2pSpecificBssInfo->arNoATiming[i].ucCount;
  389. prNoaDesc->u4Duration = prP2pSpecificBssInfo->arNoATiming[i].u4Duration;
  390. prNoaDesc->u4Interval = prP2pSpecificBssInfo->arNoATiming[i].u4Interval;
  391. prNoaDesc->u4StartTime = prP2pSpecificBssInfo->arNoATiming[i].u4StartTime;
  392. u4NumOfNoaDesc++;
  393. }
  394. }
  395. /* include "index" + "OppPs Params" + "NOA descriptors" */
  396. prNoaAttr->u2Length = 2 + u4NumOfNoaDesc * sizeof(NOA_DESCRIPTOR_T);
  397. u4NumOfNoaDesc++;
  398. /* include "Attribute ID" + "Length" + "index" + "OppPs Params" + "NOA descriptors" */
  399. u4AttributeLen = P2P_ATTRI_HDR_LEN + prNoaAttr->u2Length;
  400. prIeP2P->ucLength = VENDOR_OUI_TYPE_LEN + u4AttributeLen;
  401. prMsduInfo->u2FrameLength += (ELEM_HDR_LEN + prIeP2P->ucLength);
  402. }
  403. UINT_32 p2pFuncCalculateP2P_IE_NoA(IN P_ADAPTER_T prAdapter, IN UINT_32 ucBssIdx, IN P_STA_RECORD_T prStaRec)
  404. {
  405. P_P2P_SPECIFIC_BSS_INFO_T prP2pSpecificBssInfo = NULL;
  406. UINT_8 ucIdx;
  407. UINT_32 u4NumOfNoaDesc = 0;
  408. if (p2pFuncIsAPMode(prAdapter->rWifiVar.prP2pFsmInfo))
  409. return 0;
  410. prP2pSpecificBssInfo = prAdapter->rWifiVar.prP2pSpecificBssInfo;
  411. for (ucIdx = 0; ucIdx < prP2pSpecificBssInfo->ucNoATimingCount; ucIdx++) {
  412. if (prP2pSpecificBssInfo->arNoATiming[ucIdx].fgIsInUse)
  413. u4NumOfNoaDesc++;
  414. }
  415. /* include "index" + "OppPs Params" + "NOA descriptors" */
  416. /* include "Attribute ID" + "Length" + "index" + "OppPs Params" + "NOA descriptors" */
  417. return P2P_ATTRI_LEN_NOTICE_OF_ABSENCE + (u4NumOfNoaDesc * sizeof(NOA_DESCRIPTOR_T));
  418. }
  419. VOID p2pFuncGenerateP2P_IE_NoA(IN P_ADAPTER_T prAdapter, IN P_MSDU_INFO_T prMsduInfo)
  420. {
  421. if (p2pFuncIsAPMode(prAdapter->rWifiVar.prP2pFsmInfo)) { /* Hotspot */
  422. return;
  423. }
  424. /* Compose NoA attribute */
  425. p2pFuncComposeNoaAttribute(prAdapter,
  426. prMsduInfo /*prMsduInfo->ucBssIndex, prIeP2P->aucP2PAttributes, &u4AttributeLen */);
  427. }
  428. #endif