1 #include "p2p_precomp.h"
4 #if CFG_SUPPORT_WFD_COMPOSE_IE
6 APPEND_VAR_ATTRI_ENTRY_T txProbeRspWFDAttributesTable[] = {
7 { (WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_DEV_INFO) , NULL, wfdFuncAppendAttriDevInfo } /* 0 */
8 ,{ (WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_ASSOC_BSSID), NULL, wfdFuncAppendAttriAssocBssid } /* 1 */
9 ,{ (WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO), NULL, wfdFuncAppendAttriCoupledSinkInfo } /* 6 */
10 ,{ (WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_EXT_CAPABILITY), NULL, wfdFuncAppendAttriExtCapability } /* 7 */
11 ,{ 0, wfdFuncCalculateAttriLenSessionInfo, wfdFuncAppendAttriSessionInfo } /* 9 */
14 APPEND_VAR_ATTRI_ENTRY_T txBeaconWFDAttributesTable[] = {
15 { (WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_DEV_INFO) , NULL, wfdFuncAppendAttriDevInfo } /* 0 */
16 ,{ (WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_ASSOC_BSSID), NULL, wfdFuncAppendAttriAssocBssid } /* 1 */
17 ,{ (WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO), NULL, wfdFuncAppendAttriCoupledSinkInfo } /* 6 */
20 APPEND_VAR_ATTRI_ENTRY_T txAssocReqWFDAttributesTable[] = {
21 { (WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_DEV_INFO) , NULL, wfdFuncAppendAttriDevInfo } /* 0 */
22 ,{ (WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_ASSOC_BSSID), NULL, wfdFuncAppendAttriAssocBssid } /* 1 */
23 ,{ (WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO), NULL, wfdFuncAppendAttriCoupledSinkInfo } /* 6 */
27 APPEND_VAR_ATTRI_ENTRY_T txAssocRspWFDAttributesTable[] = {
28 { (WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_DEV_INFO) , NULL, wfdFuncAppendAttriDevInfo } /* 0 */
29 ,{ (WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_ASSOC_BSSID), NULL, wfdFuncAppendAttriAssocBssid } /* 1 */
30 ,{ (WFD_ATTRI_HDR_LEN + WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO), NULL, wfdFuncAppendAttriCoupledSinkInfo } /* 6 */
31 ,{ 0, wfdFuncCalculateAttriLenSessionInfo, wfdFuncAppendAttriSessionInfo } /* 9 */
41 p2pCalculate_IEForAssocReq (
44 IN P_ADAPTER_T prAdapter,
45 IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex,
46 IN P_STA_RECORD_T prStaRec
49 P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T)NULL;
50 P_P2P_CONNECTION_REQ_INFO_T prConnReqInfo = (P_P2P_CONNECTION_REQ_INFO_T)NULL;
51 UINT_32 u4RetValue = 0;
54 ASSERT_BREAK((eNetTypeIndex == NETWORK_TYPE_P2P_INDEX) && (prAdapter != NULL));
56 prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
58 prConnReqInfo = &(prP2pFsmInfo->rConnReqInfo);
60 u4RetValue = prConnReqInfo->u4BufLength;
63 u4RetValue += (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP);
65 // ADD WMM Information Element
66 u4RetValue += (ELEM_HDR_LEN + ELEM_MAX_LEN_WMM_INFO);
71 } /* p2pCalculate_IEForAssocReq */
75 /*----------------------------------------------------------------------------*/
77 * @brief This function is used to generate P2P IE for Beacon frame.
79 * @param[in] prMsduInfo Pointer to the composed MSDU_INFO_T.
83 /*----------------------------------------------------------------------------*/
85 p2pGenerate_IEForAssocReq (
86 IN P_ADAPTER_T prAdapter,
87 IN P_MSDU_INFO_T prMsduInfo
90 P_P2P_FSM_INFO_T prP2pFsmInfo = (P_P2P_FSM_INFO_T)NULL;
91 P_P2P_CONNECTION_REQ_INFO_T prConnReqInfo = (P_P2P_CONNECTION_REQ_INFO_T)NULL;
92 PUINT_8 pucIEBuf = (PUINT_8)NULL;
95 ASSERT_BREAK((prAdapter != NULL) && (prMsduInfo != NULL));
97 prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
99 prConnReqInfo = &(prP2pFsmInfo->rConnReqInfo);
101 pucIEBuf = (PUINT_8)((UINT_32)prMsduInfo->prPacket + (UINT_32)prMsduInfo->u2FrameLength);
103 kalMemCopy(pucIEBuf, prConnReqInfo->aucIEBuf, prConnReqInfo->u4BufLength);
105 prMsduInfo->u2FrameLength += prConnReqInfo->u4BufLength;
107 rlmReqGenerateHtCapIE (prAdapter,prMsduInfo);
108 mqmGenerateWmmInfoIE (prAdapter,prMsduInfo);
115 } /* p2pGenerate_IEForAssocReq */
120 wfdFuncAppendAttriDevInfo (
121 IN P_ADAPTER_T prAdapter,
122 IN BOOLEAN fgIsAssocFrame,
123 IN PUINT_16 pu2Offset,
128 UINT_32 u4AttriLen = 0;
129 PUINT_8 pucBuffer = NULL;
130 P_WFD_DEVICE_INFORMATION_IE_T prWfdDevInfo = (P_WFD_DEVICE_INFORMATION_IE_T)NULL;
131 P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T)NULL;
134 ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
136 prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
138 ASSERT_BREAK((prWfdCfgSettings != NULL));
140 if ((prWfdCfgSettings->ucWfdEnable == 0) ||
141 ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_DEV_INFO_VALID) == 0)) {
145 pucBuffer = (PUINT_8)((UINT_32)pucBuf + (UINT_32)(*pu2Offset));
147 ASSERT_BREAK(pucBuffer != NULL);
149 prWfdDevInfo = (P_WFD_DEVICE_INFORMATION_IE_T)pucBuffer;
151 prWfdDevInfo->ucElemID = WFD_ATTRI_ID_DEV_INFO;
153 WLAN_SET_FIELD_BE16(&prWfdDevInfo->u2WfdDevInfo, prWfdCfgSettings->u2WfdDevInfo);
155 WLAN_SET_FIELD_BE16(&prWfdDevInfo->u2SessionMgmtCtrlPort, prWfdCfgSettings->u2WfdControlPort);
157 WLAN_SET_FIELD_BE16(&prWfdDevInfo->u2WfdDevMaxSpeed, prWfdCfgSettings->u2WfdMaximumTp);
159 WLAN_SET_FIELD_BE16(&prWfdDevInfo->u2Length, WFD_ATTRI_MAX_LEN_DEV_INFO);
161 u4AttriLen = WFD_ATTRI_MAX_LEN_DEV_INFO + WFD_ATTRI_HDR_LEN;
165 (*pu2Offset) += (UINT_16)u4AttriLen;
169 /* wfdFuncAppendAttriDevInfo */
172 wfdFuncAppendAttriAssocBssid (
173 IN P_ADAPTER_T prAdapter,
174 IN BOOLEAN fgIsAssocFrame,
175 IN PUINT_16 pu2Offset,
180 UINT_32 u4AttriLen = 0;
181 PUINT_8 pucBuffer = NULL;
182 P_WFD_ASSOCIATED_BSSID_IE_T prWfdAssocBssid = (P_WFD_ASSOCIATED_BSSID_IE_T)NULL;
183 P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T)NULL;
184 P_BSS_INFO_T prAisBssInfo = (P_BSS_INFO_T)NULL;
187 ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
189 prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
191 ASSERT_BREAK((prWfdCfgSettings != NULL));
193 if (prWfdCfgSettings->ucWfdEnable == 0) {
198 prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
200 if ((!IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX)) ||
201 (prAisBssInfo->eConnectionState != PARAM_MEDIA_STATE_CONNECTED)) {
205 pucBuffer = (PUINT_8)((UINT_32)pucBuf + (UINT_32)(*pu2Offset));
207 ASSERT_BREAK(pucBuffer != NULL);
209 prWfdAssocBssid = (P_WFD_ASSOCIATED_BSSID_IE_T)pucBuffer;
211 prWfdAssocBssid->ucElemID = WFD_ATTRI_ID_ASSOC_BSSID;
213 WLAN_SET_FIELD_BE16(&prWfdAssocBssid->u2Length, WFD_ATTRI_MAX_LEN_ASSOC_BSSID);
215 COPY_MAC_ADDR(prWfdAssocBssid->aucAssocBssid, prAisBssInfo->aucBSSID);
217 u4AttriLen = WFD_ATTRI_MAX_LEN_ASSOC_BSSID + WFD_ATTRI_HDR_LEN;
221 (*pu2Offset) += (UINT_16)u4AttriLen;
225 /* wfdFuncAppendAttriAssocBssid */
228 wfdFuncAppendAttriCoupledSinkInfo (
229 IN P_ADAPTER_T prAdapter,
230 IN BOOLEAN fgIsAssocFrame,
231 IN PUINT_16 pu2Offset,
236 UINT_32 u4AttriLen = 0;
237 PUINT_8 pucBuffer = NULL;
238 P_WFD_COUPLE_SINK_INFORMATION_IE_T prWfdCoupleSinkInfo = (P_WFD_COUPLE_SINK_INFORMATION_IE_T)NULL;
239 P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T)NULL;
242 ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
244 prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
246 ASSERT_BREAK((prWfdCfgSettings != NULL));
248 if ((prWfdCfgSettings->ucWfdEnable == 0) ||
249 ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_SINK_INFO_VALID) == 0)) {
253 pucBuffer = (PUINT_8)((UINT_32)pucBuf + (UINT_32)(*pu2Offset));
255 ASSERT_BREAK(pucBuffer != NULL);
257 prWfdCoupleSinkInfo = (P_WFD_COUPLE_SINK_INFORMATION_IE_T)pucBuffer;
259 prWfdCoupleSinkInfo->ucElemID = WFD_ATTRI_ID_COUPLED_SINK_INFO;
261 WLAN_SET_FIELD_BE16(&prWfdCoupleSinkInfo->u2Length, WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO);
263 COPY_MAC_ADDR(prWfdCoupleSinkInfo->aucCoupleSinkMac, prWfdCfgSettings->aucWfdCoupleSinkAddress);
265 prWfdCoupleSinkInfo->ucCoupleSinkStatusBp = prWfdCfgSettings->ucWfdCoupleSinkStatus;
267 u4AttriLen = WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO + WFD_ATTRI_HDR_LEN;
271 (*pu2Offset) += (UINT_16)u4AttriLen;
275 /* wfdFuncAppendAttriCoupledSinkInfo */
278 wfdFuncAppendAttriExtCapability (
279 IN P_ADAPTER_T prAdapter,
280 IN BOOLEAN fgIsAssocFrame,
281 IN PUINT_16 pu2Offset,
286 UINT_32 u4AttriLen = 0;
287 PUINT_8 pucBuffer = NULL;
288 P_WFD_EXTENDED_CAPABILITY_IE_T prWfdExtCapability = (P_WFD_EXTENDED_CAPABILITY_IE_T)NULL;
289 P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T)NULL;
292 ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
294 prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
296 ASSERT_BREAK((prWfdCfgSettings != NULL));
298 if ((prWfdCfgSettings->ucWfdEnable == 0) ||
299 ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_EXT_CAPABILITY_VALID) == 0)) {
303 pucBuffer = (PUINT_8)((UINT_32)pucBuf + (UINT_32)(*pu2Offset));
305 ASSERT_BREAK(pucBuffer != NULL);
307 prWfdExtCapability = (P_WFD_EXTENDED_CAPABILITY_IE_T)pucBuffer;
309 prWfdExtCapability->ucElemID = WFD_ATTRI_ID_EXT_CAPABILITY;
311 WLAN_SET_FIELD_BE16(&prWfdExtCapability->u2Length, WFD_ATTRI_MAX_LEN_EXT_CAPABILITY);
313 WLAN_SET_FIELD_BE16(&prWfdExtCapability->u2WfdExtCapabilityBp, prWfdCfgSettings->u2WfdExtendCap);
315 u4AttriLen = WFD_ATTRI_MAX_LEN_EXT_CAPABILITY + WFD_ATTRI_HDR_LEN;
319 (*pu2Offset) += (UINT_16)u4AttriLen;
323 /* wfdFuncAppendAttriExtCapability */
327 /*----------------------------------------------------------------------------*/
329 * @brief This function is used to calculate length of Channel List Attribute
331 * @param[in] prStaRec Pointer to the STA_RECORD_T
333 * @return The length of Attribute added
335 /*----------------------------------------------------------------------------*/
337 wfdFuncCalculateAttriLenSessionInfo (
338 IN P_ADAPTER_T prAdapter,
339 IN P_STA_RECORD_T prStaRec
342 UINT_16 u2AttriLen = 0;
343 P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T)NULL;
346 ASSERT_BREAK((prAdapter != NULL) && (prStaRec != NULL));
348 prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
350 if (prWfdCfgSettings->ucWfdEnable == 0) {
354 u2AttriLen = prWfdCfgSettings->u2WfdSessionInformationIELen + WFD_ATTRI_HDR_LEN;
359 return (UINT_32)u2AttriLen;
361 } /* wfdFuncCalculateAttriLenSessionInfo */
365 wfdFuncAppendAttriSessionInfo (
366 IN P_ADAPTER_T prAdapter,
367 IN BOOLEAN fgIsAssocFrame,
368 IN PUINT_16 pu2Offset,
373 UINT_32 u4AttriLen = 0;
374 PUINT_8 pucBuffer = NULL;
375 P_WFD_SESSION_INFORMATION_IE_T prWfdSessionInfo = (P_WFD_SESSION_INFORMATION_IE_T)NULL;
376 P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T)NULL;
379 ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
381 prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
383 ASSERT_BREAK((prWfdCfgSettings != NULL));
385 if ((prWfdCfgSettings->ucWfdEnable == 0) || (prWfdCfgSettings->u2WfdSessionInformationIELen == 0)) {
389 pucBuffer = (PUINT_8)((UINT_32)pucBuf + (UINT_32)(*pu2Offset));
391 ASSERT_BREAK(pucBuffer != NULL);
393 prWfdSessionInfo = (P_WFD_SESSION_INFORMATION_IE_T)pucBuffer;
395 prWfdSessionInfo->ucElemID = WFD_ATTRI_ID_SESSION_INFO;
397 // TODO: Check endian issue?
398 kalMemCopy(prWfdSessionInfo->pucWfdDevInfoDesc, prWfdCfgSettings->aucWfdSessionInformationIE, prWfdCfgSettings->u2WfdSessionInformationIELen);
400 WLAN_SET_FIELD_16(&prWfdSessionInfo->u2Length, prWfdCfgSettings->u2WfdSessionInformationIELen);
402 u4AttriLen = prWfdCfgSettings->u2WfdSessionInformationIELen + WFD_ATTRI_HDR_LEN;
407 (*pu2Offset) += (UINT_16)u4AttriLen;
411 /* wfdFuncAppendAttriSessionInfo */
415 #if CFG_SUPPORT_WFD_COMPOSE_IE
417 wfdFuncGenerateWfd_IE (
418 IN P_ADAPTER_T prAdapter,
419 IN BOOLEAN fgIsAssocFrame,
420 IN PUINT_16 pu2Offset,
422 IN UINT_16 u2BufSize,
423 IN APPEND_VAR_ATTRI_ENTRY_T arAppendAttriTable[],
424 IN UINT_32 u4AttriTableSize
429 PUINT_8 pucBuffer = (PUINT_8)NULL;
430 P_IE_WFD_T prIeWFD = (P_IE_WFD_T)NULL;
431 UINT_32 u4OverallAttriLen;
433 UINT_8 aucWfaOui[] = VENDOR_OUI_WFA_SPECIFIC;
434 UINT_8 aucTempBuffer[P2P_MAXIMUM_ATTRIBUTE_LEN];
439 ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL));
441 pucBuffer = (PUINT_8)((UINT_32)pucBuf + (*pu2Offset));
443 ASSERT_BREAK(pucBuffer != NULL);
445 /* Check buffer length is still enough. */
446 ASSERT_BREAK((u2BufSize - (*pu2Offset)) >= WFD_IE_OUI_HDR);
448 prIeWFD = (P_IE_WFD_T)pucBuffer;
450 prIeWFD->ucId = ELEM_ID_WFD;
452 prIeWFD->aucOui[0] = aucWfaOui[0];
453 prIeWFD->aucOui[1] = aucWfaOui[1];
454 prIeWFD->aucOui[2] = aucWfaOui[2];
455 prIeWFD->ucOuiType = VENDOR_OUI_TYPE_WFD;
457 (*pu2Offset) += WFD_IE_OUI_HDR;
459 /* Overall length of all Attributes */
460 u4OverallAttriLen = 0;
462 for (i = 0; i < u4AttriTableSize; i++) {
464 if (arAppendAttriTable[i].pfnAppendAttri) {
465 u4AttriLen = arAppendAttriTable[i].pfnAppendAttri(prAdapter, fgIsAssocFrame, pu2Offset, pucBuf, u2BufSize);
467 u4OverallAttriLen += u4AttriLen;
469 if (u4OverallAttriLen > P2P_MAXIMUM_ATTRIBUTE_LEN) {
470 u4OverallAttriLen -= P2P_MAXIMUM_ATTRIBUTE_LEN;
472 prIeWFD->ucLength = (VENDOR_OUI_TYPE_LEN + P2P_MAXIMUM_ATTRIBUTE_LEN);
474 pucBuffer = (PUINT_8)((UINT_32)prIeWFD + (WFD_IE_OUI_HDR + P2P_MAXIMUM_ATTRIBUTE_LEN));
476 prIeWFD = (P_IE_WFD_T)((UINT_32)prIeWFD + (WFD_IE_OUI_HDR + P2P_MAXIMUM_ATTRIBUTE_LEN));
478 kalMemCopy(aucTempBuffer, pucBuffer, u4OverallAttriLen);
480 prIeWFD->ucId = ELEM_ID_WFD;
482 prIeWFD->aucOui[0] = aucWfaOui[0];
483 prIeWFD->aucOui[1] = aucWfaOui[1];
484 prIeWFD->aucOui[2] = aucWfaOui[2];
485 prIeWFD->ucOuiType = VENDOR_OUI_TYPE_WFD;
487 kalMemCopy(prIeWFD->aucWFDAttributes, aucTempBuffer, u4OverallAttriLen);
488 (*pu2Offset) += WFD_IE_OUI_HDR;
495 prIeWFD->ucLength = (UINT_8)(VENDOR_OUI_TYPE_LEN + u4OverallAttriLen);
501 } /* wfdFuncGenerateWfd_IE */
503 #endif /* CFG_SUPPORT_WFD_COMPOSE_IE */
509 wfdFuncCalculateWfdIELenForAssocRsp (
510 IN P_ADAPTER_T prAdapter,
511 IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex,
512 IN P_STA_RECORD_T prStaRec
516 #if CFG_SUPPORT_WFD_COMPOSE_IE
517 P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T)NULL;
519 prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
522 !IS_STA_P2P_TYPE(prStaRec) ||
523 (prWfdCfgSettings->ucWfdEnable == 0)) {
527 return p2pFuncCalculateP2P_IELen(prAdapter,
530 txAssocRspWFDAttributesTable,
531 sizeof(txAssocRspWFDAttributesTable)/sizeof(APPEND_VAR_ATTRI_ENTRY_T));
536 } /* wfdFuncCalculateWfdIELenForAssocRsp */
541 wfdFuncGenerateWfdIEForAssocRsp (
542 IN P_ADAPTER_T prAdapter,
543 IN P_MSDU_INFO_T prMsduInfo
547 #if CFG_SUPPORT_WFD_COMPOSE_IE
548 P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T)NULL;
549 P_STA_RECORD_T prStaRec;
552 ASSERT_BREAK((prMsduInfo != NULL) && (prAdapter != NULL));
554 prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
555 prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
557 if (IS_STA_P2P_TYPE(prStaRec)) {
559 if (prWfdCfgSettings->ucWfdEnable == 0) {
562 if((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_DEV_INFO_VALID) == 0) {
566 wfdFuncGenerateWfd_IE(prAdapter,
568 &prMsduInfo->u2FrameLength,
569 prMsduInfo->prPacket,
571 txAssocRspWFDAttributesTable,
572 sizeof(txAssocRspWFDAttributesTable)/sizeof(APPEND_VAR_ATTRI_ENTRY_T));
581 } /* wfdFuncGenerateWfdIEForAssocRsp */