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