wifi: renew patch drivers/net/wireless
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / mt5931_kk / drv_wlan / mgmt / p2p_ie.c
1 #include "p2p_precomp.h"
2
3 #if CFG_SUPPORT_WFD
4 #if CFG_SUPPORT_WFD_COMPOSE_IE
5 #if 0
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 */
12 };
13
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 */
18 };
19
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 */
24 };
25 #endif
26
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 */
32
33 };
34
35 #endif
36
37
38
39
40 UINT_32
41 p2pCalculate_IEForAssocReq (
42
43
44     IN P_ADAPTER_T prAdapter,
45     IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex,
46     IN P_STA_RECORD_T prStaRec
47     )
48 {
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;
52
53     do {
54         ASSERT_BREAK((eNetTypeIndex == NETWORK_TYPE_P2P_INDEX) && (prAdapter != NULL));
55
56         prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
57
58         prConnReqInfo = &(prP2pFsmInfo->rConnReqInfo);
59
60         u4RetValue = prConnReqInfo->u4BufLength;
61
62         // ADD HT Capability
63         u4RetValue += (ELEM_HDR_LEN + ELEM_MAX_LEN_HT_CAP);
64                 
65                 // ADD WMM Information Element
66         u4RetValue += (ELEM_HDR_LEN + ELEM_MAX_LEN_WMM_INFO);
67
68     } while (FALSE);
69
70     return u4RetValue;
71 } /* p2pCalculate_IEForAssocReq */
72
73
74
75 /*----------------------------------------------------------------------------*/
76 /*!
77 * @brief This function is used to generate P2P IE for Beacon frame.
78 *
79 * @param[in] prMsduInfo             Pointer to the composed MSDU_INFO_T.
80 *
81 * @return none
82 */
83 /*----------------------------------------------------------------------------*/
84 VOID
85 p2pGenerate_IEForAssocReq (
86     IN P_ADAPTER_T prAdapter,
87     IN P_MSDU_INFO_T prMsduInfo
88     )
89 {
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;
93
94     do {
95         ASSERT_BREAK((prAdapter != NULL) && (prMsduInfo != NULL));
96
97         prP2pFsmInfo = prAdapter->rWifiVar.prP2pFsmInfo;
98
99         prConnReqInfo = &(prP2pFsmInfo->rConnReqInfo);
100
101         pucIEBuf = (PUINT_8)((UINT_32)prMsduInfo->prPacket + (UINT_32)prMsduInfo->u2FrameLength);
102
103         kalMemCopy(pucIEBuf, prConnReqInfo->aucIEBuf, prConnReqInfo->u4BufLength);
104
105         prMsduInfo->u2FrameLength += prConnReqInfo->u4BufLength;
106
107         rlmReqGenerateHtCapIE (prAdapter,prMsduInfo);
108                 mqmGenerateWmmInfoIE (prAdapter,prMsduInfo);
109
110
111     } while (FALSE);
112
113     return;
114
115 } /* p2pGenerate_IEForAssocReq */
116
117
118
119 UINT_32
120 wfdFuncAppendAttriDevInfo (
121     IN P_ADAPTER_T prAdapter,
122     IN BOOLEAN fgIsAssocFrame,
123     IN PUINT_16 pu2Offset,
124     IN PUINT_8 pucBuf,
125     IN UINT_16 u2BufSize
126     )
127 {
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;
132
133     do {
134         ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
135
136         prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
137
138         ASSERT_BREAK((prWfdCfgSettings != NULL));
139
140         if ((prWfdCfgSettings->ucWfdEnable == 0) ||
141                 ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_DEV_INFO_VALID) == 0)) {
142             break;
143         }
144
145         pucBuffer = (PUINT_8)((UINT_32)pucBuf + (UINT_32)(*pu2Offset));
146
147         ASSERT_BREAK(pucBuffer != NULL);
148
149         prWfdDevInfo = (P_WFD_DEVICE_INFORMATION_IE_T)pucBuffer;
150
151         prWfdDevInfo->ucElemID = WFD_ATTRI_ID_DEV_INFO;
152
153         WLAN_SET_FIELD_BE16(&prWfdDevInfo->u2WfdDevInfo, prWfdCfgSettings->u2WfdDevInfo);
154
155         WLAN_SET_FIELD_BE16(&prWfdDevInfo->u2SessionMgmtCtrlPort, prWfdCfgSettings->u2WfdControlPort);
156
157         WLAN_SET_FIELD_BE16(&prWfdDevInfo->u2WfdDevMaxSpeed, prWfdCfgSettings->u2WfdMaximumTp);
158
159         WLAN_SET_FIELD_BE16(&prWfdDevInfo->u2Length, WFD_ATTRI_MAX_LEN_DEV_INFO);
160
161         u4AttriLen = WFD_ATTRI_MAX_LEN_DEV_INFO + WFD_ATTRI_HDR_LEN;
162
163     } while (FALSE);
164
165     (*pu2Offset) += (UINT_16)u4AttriLen;
166
167     return u4AttriLen;
168 }
169 /* wfdFuncAppendAttriDevInfo */
170
171 UINT_32
172 wfdFuncAppendAttriAssocBssid (
173     IN P_ADAPTER_T prAdapter,
174     IN BOOLEAN fgIsAssocFrame,
175     IN PUINT_16 pu2Offset,
176     IN PUINT_8 pucBuf,
177     IN UINT_16 u2BufSize
178     )
179 {
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;
185
186     do {
187         ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
188
189         prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
190
191         ASSERT_BREAK((prWfdCfgSettings != NULL));
192
193         if (prWfdCfgSettings->ucWfdEnable == 0) {
194             break;
195         }
196
197         /* AIS network. */
198         prAisBssInfo = &(prAdapter->rWifiVar.arBssInfo[NETWORK_TYPE_AIS_INDEX]);
199
200         if ((!IS_NET_ACTIVE(prAdapter, NETWORK_TYPE_AIS_INDEX)) ||
201                 (prAisBssInfo->eConnectionState != PARAM_MEDIA_STATE_CONNECTED)) {
202             break;
203         }
204
205         pucBuffer = (PUINT_8)((UINT_32)pucBuf + (UINT_32)(*pu2Offset));
206
207         ASSERT_BREAK(pucBuffer != NULL);
208
209         prWfdAssocBssid = (P_WFD_ASSOCIATED_BSSID_IE_T)pucBuffer;
210
211         prWfdAssocBssid->ucElemID = WFD_ATTRI_ID_ASSOC_BSSID;
212
213         WLAN_SET_FIELD_BE16(&prWfdAssocBssid->u2Length, WFD_ATTRI_MAX_LEN_ASSOC_BSSID);
214
215         COPY_MAC_ADDR(prWfdAssocBssid->aucAssocBssid, prAisBssInfo->aucBSSID);
216
217         u4AttriLen = WFD_ATTRI_MAX_LEN_ASSOC_BSSID + WFD_ATTRI_HDR_LEN;
218
219     } while (FALSE);
220
221     (*pu2Offset) += (UINT_16)u4AttriLen;
222
223     return u4AttriLen;
224 }
225 /* wfdFuncAppendAttriAssocBssid */
226
227 UINT_32
228 wfdFuncAppendAttriCoupledSinkInfo (
229     IN P_ADAPTER_T prAdapter,
230     IN BOOLEAN fgIsAssocFrame,
231     IN PUINT_16 pu2Offset,
232     IN PUINT_8 pucBuf,
233     IN UINT_16 u2BufSize
234     )
235 {
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;
240
241     do {
242         ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
243
244         prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
245
246         ASSERT_BREAK((prWfdCfgSettings != NULL));
247
248         if ((prWfdCfgSettings->ucWfdEnable == 0) ||
249                 ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_SINK_INFO_VALID) == 0)) {
250             break;
251         }
252
253         pucBuffer = (PUINT_8)((UINT_32)pucBuf + (UINT_32)(*pu2Offset));
254
255         ASSERT_BREAK(pucBuffer != NULL);
256
257         prWfdCoupleSinkInfo = (P_WFD_COUPLE_SINK_INFORMATION_IE_T)pucBuffer;
258
259         prWfdCoupleSinkInfo->ucElemID = WFD_ATTRI_ID_COUPLED_SINK_INFO;
260
261         WLAN_SET_FIELD_BE16(&prWfdCoupleSinkInfo->u2Length, WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO);
262
263         COPY_MAC_ADDR(prWfdCoupleSinkInfo->aucCoupleSinkMac, prWfdCfgSettings->aucWfdCoupleSinkAddress);
264
265         prWfdCoupleSinkInfo->ucCoupleSinkStatusBp = prWfdCfgSettings->ucWfdCoupleSinkStatus;
266
267         u4AttriLen = WFD_ATTRI_MAX_LEN_COUPLED_SINK_INFO + WFD_ATTRI_HDR_LEN;
268
269     } while (FALSE);
270
271     (*pu2Offset) += (UINT_16)u4AttriLen;
272
273     return u4AttriLen;
274 }
275 /* wfdFuncAppendAttriCoupledSinkInfo */
276
277 UINT_32
278 wfdFuncAppendAttriExtCapability (
279     IN P_ADAPTER_T prAdapter,
280     IN BOOLEAN fgIsAssocFrame,
281     IN PUINT_16 pu2Offset,
282     IN PUINT_8 pucBuf,
283     IN UINT_16 u2BufSize
284     )
285 {
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;
290
291     do {
292         ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
293
294         prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
295
296         ASSERT_BREAK((prWfdCfgSettings != NULL));
297
298         if ((prWfdCfgSettings->ucWfdEnable == 0) ||
299                 ((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_EXT_CAPABILITY_VALID) == 0)) {
300             break;
301         }
302
303         pucBuffer = (PUINT_8)((UINT_32)pucBuf + (UINT_32)(*pu2Offset));
304
305         ASSERT_BREAK(pucBuffer != NULL);
306
307         prWfdExtCapability = (P_WFD_EXTENDED_CAPABILITY_IE_T)pucBuffer;
308
309         prWfdExtCapability->ucElemID = WFD_ATTRI_ID_EXT_CAPABILITY;
310
311         WLAN_SET_FIELD_BE16(&prWfdExtCapability->u2Length, WFD_ATTRI_MAX_LEN_EXT_CAPABILITY);
312
313         WLAN_SET_FIELD_BE16(&prWfdExtCapability->u2WfdExtCapabilityBp, prWfdCfgSettings->u2WfdExtendCap);
314
315         u4AttriLen = WFD_ATTRI_MAX_LEN_EXT_CAPABILITY + WFD_ATTRI_HDR_LEN;
316
317     } while (FALSE);
318
319     (*pu2Offset) += (UINT_16)u4AttriLen;
320
321     return u4AttriLen;
322 }
323 /* wfdFuncAppendAttriExtCapability */
324
325
326
327 /*----------------------------------------------------------------------------*/
328 /*!
329 * @brief This function is used to calculate length of Channel List Attribute
330 *
331 * @param[in] prStaRec           Pointer to the STA_RECORD_T
332 *
333 * @return The length of Attribute added
334 */
335 /*----------------------------------------------------------------------------*/
336 UINT_32
337 wfdFuncCalculateAttriLenSessionInfo (
338     IN P_ADAPTER_T prAdapter,
339     IN P_STA_RECORD_T prStaRec
340     )
341 {
342     UINT_16 u2AttriLen = 0;
343     P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T)NULL;
344
345     do {
346         ASSERT_BREAK((prAdapter != NULL) && (prStaRec != NULL));
347
348         prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
349
350         if (prWfdCfgSettings->ucWfdEnable == 0) {
351             break;
352         }
353
354         u2AttriLen = prWfdCfgSettings->u2WfdSessionInformationIELen + WFD_ATTRI_HDR_LEN;
355
356     } while (FALSE);
357
358
359     return (UINT_32)u2AttriLen;
360
361 } /* wfdFuncCalculateAttriLenSessionInfo */
362
363
364 UINT_32
365 wfdFuncAppendAttriSessionInfo (
366     IN P_ADAPTER_T prAdapter,
367     IN BOOLEAN fgIsAssocFrame,
368     IN PUINT_16 pu2Offset,
369     IN PUINT_8 pucBuf,
370     IN UINT_16 u2BufSize
371     )
372 {
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;
377
378     do {
379         ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL) && (pu2Offset != NULL));
380
381         prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
382
383         ASSERT_BREAK((prWfdCfgSettings != NULL));
384
385         if ((prWfdCfgSettings->ucWfdEnable == 0) || (prWfdCfgSettings->u2WfdSessionInformationIELen == 0)) {
386             break;
387         }
388
389         pucBuffer = (PUINT_8)((UINT_32)pucBuf + (UINT_32)(*pu2Offset));
390
391         ASSERT_BREAK(pucBuffer != NULL);
392
393         prWfdSessionInfo = (P_WFD_SESSION_INFORMATION_IE_T)pucBuffer;
394
395         prWfdSessionInfo->ucElemID = WFD_ATTRI_ID_SESSION_INFO;
396
397         // TODO: Check endian issue?
398         kalMemCopy(prWfdSessionInfo->pucWfdDevInfoDesc, prWfdCfgSettings->aucWfdSessionInformationIE, prWfdCfgSettings->u2WfdSessionInformationIELen);
399
400         WLAN_SET_FIELD_16(&prWfdSessionInfo->u2Length, prWfdCfgSettings->u2WfdSessionInformationIELen);
401
402         u4AttriLen = prWfdCfgSettings->u2WfdSessionInformationIELen + WFD_ATTRI_HDR_LEN;
403
404     }
405 while (FALSE);
406
407     (*pu2Offset) += (UINT_16)u4AttriLen;
408
409     return u4AttriLen;
410 }
411 /* wfdFuncAppendAttriSessionInfo */
412
413
414
415 #if CFG_SUPPORT_WFD_COMPOSE_IE
416 VOID
417 wfdFuncGenerateWfd_IE (
418     IN P_ADAPTER_T prAdapter,
419     IN BOOLEAN fgIsAssocFrame,
420     IN PUINT_16 pu2Offset,
421     IN PUINT_8 pucBuf,
422     IN UINT_16 u2BufSize,
423     IN APPEND_VAR_ATTRI_ENTRY_T arAppendAttriTable[],
424     IN UINT_32 u4AttriTableSize
425     )
426 {
427
428
429     PUINT_8 pucBuffer = (PUINT_8)NULL;
430     P_IE_WFD_T prIeWFD = (P_IE_WFD_T)NULL;
431     UINT_32 u4OverallAttriLen;
432     UINT_32 u4AttriLen;
433     UINT_8 aucWfaOui[] = VENDOR_OUI_WFA_SPECIFIC;
434     UINT_8 aucTempBuffer[P2P_MAXIMUM_ATTRIBUTE_LEN];
435     UINT_32 i;
436
437
438     do {
439         ASSERT_BREAK((prAdapter != NULL) && (pucBuf != NULL));
440
441         pucBuffer = (PUINT_8)((UINT_32)pucBuf + (*pu2Offset));
442
443         ASSERT_BREAK(pucBuffer != NULL);
444
445         /* Check buffer length is still enough. */
446         ASSERT_BREAK((u2BufSize - (*pu2Offset)) >= WFD_IE_OUI_HDR);
447
448         prIeWFD = (P_IE_WFD_T)pucBuffer;
449
450         prIeWFD->ucId = ELEM_ID_WFD;
451
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;
456
457         (*pu2Offset) += WFD_IE_OUI_HDR;
458
459         /* Overall length of all Attributes */
460         u4OverallAttriLen = 0;
461
462         for (i = 0; i < u4AttriTableSize; i++) {
463
464             if (arAppendAttriTable[i].pfnAppendAttri) {
465                 u4AttriLen = arAppendAttriTable[i].pfnAppendAttri(prAdapter, fgIsAssocFrame, pu2Offset, pucBuf, u2BufSize);
466
467                 u4OverallAttriLen += u4AttriLen;
468
469                 if (u4OverallAttriLen > P2P_MAXIMUM_ATTRIBUTE_LEN) {
470                     u4OverallAttriLen -= P2P_MAXIMUM_ATTRIBUTE_LEN;
471
472                     prIeWFD->ucLength = (VENDOR_OUI_TYPE_LEN + P2P_MAXIMUM_ATTRIBUTE_LEN);
473
474                     pucBuffer = (PUINT_8)((UINT_32)prIeWFD + (WFD_IE_OUI_HDR + P2P_MAXIMUM_ATTRIBUTE_LEN));
475
476                     prIeWFD = (P_IE_WFD_T)((UINT_32)prIeWFD + (WFD_IE_OUI_HDR + P2P_MAXIMUM_ATTRIBUTE_LEN));
477
478                     kalMemCopy(aucTempBuffer, pucBuffer, u4OverallAttriLen);
479
480                     prIeWFD->ucId = ELEM_ID_WFD;
481
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;
486
487                     kalMemCopy(prIeWFD->aucWFDAttributes, aucTempBuffer, u4OverallAttriLen);
488                     (*pu2Offset) += WFD_IE_OUI_HDR;
489                 }
490
491             }
492
493         }
494
495         prIeWFD->ucLength = (UINT_8)(VENDOR_OUI_TYPE_LEN + u4OverallAttriLen);
496
497
498     } while (FALSE);
499
500     return;
501 } /* wfdFuncGenerateWfd_IE */
502
503 #endif /* CFG_SUPPORT_WFD_COMPOSE_IE */
504
505
506
507
508 UINT_32
509 wfdFuncCalculateWfdIELenForAssocRsp (
510     IN P_ADAPTER_T prAdapter,
511     IN ENUM_NETWORK_TYPE_INDEX_T eNetTypeIndex,
512     IN P_STA_RECORD_T prStaRec
513     )
514 {
515
516 #if CFG_SUPPORT_WFD_COMPOSE_IE
517     P_WFD_CFG_SETTINGS_T prWfdCfgSettings = (P_WFD_CFG_SETTINGS_T)NULL;
518
519     prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
520
521     if (
522         !IS_STA_P2P_TYPE(prStaRec) ||
523             (prWfdCfgSettings->ucWfdEnable == 0)) {
524         return 0;
525     }
526
527     return p2pFuncCalculateP2P_IELen(prAdapter,
528                                 eNetTypeIndex,
529                                 prStaRec,
530                                 txAssocRspWFDAttributesTable,
531                                 sizeof(txAssocRspWFDAttributesTable)/sizeof(APPEND_VAR_ATTRI_ENTRY_T));
532     
533 #else
534     return 0;
535 #endif
536 } /* wfdFuncCalculateWfdIELenForAssocRsp */
537
538
539
540 VOID
541 wfdFuncGenerateWfdIEForAssocRsp (
542     IN  P_ADAPTER_T       prAdapter,
543     IN  P_MSDU_INFO_T     prMsduInfo
544     )
545 {
546
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;
550     
551     do {
552         ASSERT_BREAK((prMsduInfo != NULL) && (prAdapter != NULL));
553     
554         prWfdCfgSettings = &(prAdapter->rWifiVar.prP2pFsmInfo->rWfdConfigureSettings);
555         prStaRec = cnmGetStaRecByIndex(prAdapter, prMsduInfo->ucStaRecIndex);
556
557         if (IS_STA_P2P_TYPE(prStaRec)) {
558        
559             if (prWfdCfgSettings->ucWfdEnable == 0) {
560                 break;
561             }
562             if((prWfdCfgSettings->u4WfdFlag & WFD_FLAGS_DEV_INFO_VALID) == 0) {
563                 break;
564             }
565
566             wfdFuncGenerateWfd_IE(prAdapter,
567                             FALSE,
568                             &prMsduInfo->u2FrameLength,
569                             prMsduInfo->prPacket,
570                             1500,
571                             txAssocRspWFDAttributesTable,
572                             sizeof(txAssocRspWFDAttributesTable)/sizeof(APPEND_VAR_ATTRI_ENTRY_T));
573         }
574     } while (FALSE);
575
576     return;
577 #else
578
579     return;
580 #endif
581 } /* wfdFuncGenerateWfdIEForAssocRsp */
582
583 #endif