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