1 /*
2 * Copyright (C) 2021 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 */
18
19 /* ****************************************************************************
20 1 头文件包含
21 **************************************************************************** */
22 #include "wlan_mib.h"
23 #include "mac_vap.h"
24 #include "mac_frame.h"
25 #include "hmac_encap_frame_sta.h"
26 #include "hmac_user.h"
27 #include "hmac_tx_data.h"
28
29 #ifdef __cplusplus
30 #if __cplusplus
31 extern "C" {
32 #endif
33 #endif
34
35 /* ****************************************************************************
36 3 函数实现
37 **************************************************************************** */
38 /* ****************************************************************************
39 功能描述 : 设置速率集
40 输入参数 : pst_hmac_sta: 指向vap
41 puc_buffer: 指向buffer
42 输出参数 : puc_ie_len: element的长度
43 修改历史 :
44 1.日 期 : 2015年6月12日
45 作 者 : HiSilicon
46 修改内容 : 新生成函数
47 **************************************************************************** */
hmac_set_supported_rates_ie_asoc_req(const hmac_vap_stru * hmac_vap,hi_u8 * puc_buffer,hi_u8 * puc_ie_len)48 hi_void hmac_set_supported_rates_ie_asoc_req(const hmac_vap_stru *hmac_vap, hi_u8 *puc_buffer, hi_u8 *puc_ie_len)
49 {
50 hi_u8 nrates;
51 hi_u8 idx;
52
53 /* *************************************************************************
54 ---------------------------------------
55 |Element ID | Length | Supported Rates|
56 ---------------------------------------
57 Octets: |1 | 1 | 1~8 |
58 ---------------------------------------
59 The Information field is encoded as 1 to 8 octets, where each octet describes a single Supported
60 Rate or BSS membership selector.
61 ************************************************************************* */
62 puc_buffer[0] = MAC_EID_RATES;
63
64 nrates = hmac_vap->rs_nrates;
65
66 if (nrates > MAC_MAX_SUPRATES) {
67 nrates = MAC_MAX_SUPRATES;
68 }
69
70 for (idx = 0; idx < nrates; idx++) {
71 puc_buffer[MAC_IE_HDR_LEN + idx] = hmac_vap->auc_supp_rates[idx];
72 }
73
74 puc_buffer[1] = nrates;
75
76 *puc_ie_len = MAC_IE_HDR_LEN + nrates;
77 }
78
79 /* ****************************************************************************
80 功能描述 : 填充extended supported rates信息
81 输入参数 : pst_hmac_sta: 指向vap
82 puc_buffer: 指向buffer
83 输出参数 : puc_ie_len: element的长度
84 修改历史 :
85 1.日 期 : 2015年6月12日
86 作 者 : HiSilicon
87 修改内容 : 新生成函数
88 **************************************************************************** */
hmac_set_exsup_rates_ie_asoc_req(const hmac_vap_stru * hmac_vap,hi_u8 * puc_buffer,hi_u8 * puc_ie_len)89 hi_void hmac_set_exsup_rates_ie_asoc_req(const hmac_vap_stru *hmac_vap, hi_u8 *puc_buffer, hi_u8 *puc_ie_len)
90 {
91 hi_u8 nrates;
92 hi_u8 idx;
93
94 /* **************************************************************************
95 -----------------------------------------------
96 |ElementID | Length | Extended Supported Rates|
97 -----------------------------------------------
98 Octets: |1 | 1 | 1-255 |
99 -----------------------------------------------
100 ************************************************************************** */
101 if (hmac_vap->rs_nrates <= MAC_MAX_SUPRATES) {
102 *puc_ie_len = 0;
103 return;
104 }
105
106 puc_buffer[0] = MAC_EID_XRATES;
107 nrates = hmac_vap->rs_nrates - MAC_MAX_SUPRATES;
108 puc_buffer[1] = nrates;
109
110 for (idx = 0; idx < nrates; idx++) {
111 puc_buffer[MAC_IE_HDR_LEN + idx] = hmac_vap->auc_supp_rates[idx + MAC_MAX_SUPRATES];
112 }
113
114 *puc_ie_len = MAC_IE_HDR_LEN + nrates;
115 }
116
117 /* ****************************************************************************
118 功能描述 : 组帧(Re)assoc
119 修改历史 :
120 1.日 期 : 2013年6月28日
121 作 者 : HiSilicon
122 修改内容 : 新生成函数
123 **************************************************************************** */
hmac_mgmt_encap_asoc_req_sta(const hmac_vap_stru * hmac_vap,hi_u8 * puc_req_frame)124 hi_u32 hmac_mgmt_encap_asoc_req_sta(const hmac_vap_stru *hmac_vap, hi_u8 *puc_req_frame)
125 {
126 hi_u16 us_app_ie_len = 0;
127 hi_u8 ie_len = 0;
128 hi_u8 *puc_req_frame_origin = puc_req_frame; /* 保存起始地址,方便计算长度 */
129 hi_u8 *bssid = hmac_vap->base_vap->auc_bssid;
130
131 /* *********************************************************************** */
132 /* Management Frame Format */
133 /* -------------------------------------------------------------------- */
134 /* |Frame Control|Duration|DA|SA|BSSID|Sequence Control|Frame Body|FCS| */
135 /* -------------------------------------------------------------------- */
136 /* | 2 |2 |6 |6 |6 |2 |0 - 2312 |4 | */
137 /* -------------------------------------------------------------------- */
138 /* */
139 /* *********************************************************************** */
140 /* *********************************************************************** */
141 /* Set the fields in the frame header */
142 /* *********************************************************************** */
143 /* 设置 Frame Control field */
144 /* 判断是否为reassoc操作 */
145 mac_hdr_set_frame_control(puc_req_frame, WLAN_PROTOCOL_VERSION | WLAN_FC0_TYPE_MGT |
146 ((hmac_vap->reassoc_flag == HI_TRUE) ? WLAN_FC0_SUBTYPE_REASSOC_REQ : WLAN_FC0_SUBTYPE_ASSOC_REQ));
147
148 /* 设置 DA address1: AP MAC地址 (BSSID) */
149 /* 设置 SA address2: dot11MACAddress */
150 /* 设置 DA address3: AP MAC地址 (BSSID) */
151 if ((memcpy_s(puc_req_frame + WLAN_HDR_ADDR1_OFFSET, WLAN_MAC_ADDR_LEN, bssid, WLAN_MAC_ADDR_LEN) != EOK) ||
152 (memcpy_s(puc_req_frame + WLAN_HDR_ADDR2_OFFSET, WLAN_MAC_ADDR_LEN,
153 hmac_vap->base_vap->mib_info->wlan_mib_sta_config.auc_dot11_station_id, WLAN_MAC_ADDR_LEN) != EOK) ||
154 (memcpy_s(puc_req_frame + WLAN_HDR_ADDR3_OFFSET, WLAN_MAC_ADDR_LEN, bssid, WLAN_MAC_ADDR_LEN) != EOK)) {
155 oam_error_log0(0, 0, "{hmac_mgmt_encap_asoc_req_sta::memcpy_s fail.}");
156 return 0;
157 }
158
159 puc_req_frame += MAC_80211_FRAME_LEN;
160
161 /* *********************************************************************** */
162 /* Set the contents of the frame body */
163 /* *********************************************************************** */
164 /* *********************************************************************** */
165 /* Association Request Frame - Frame Body */
166 /* --------------------------------------------------------------------- */
167 /* | Capability Information | Listen Interval | SSID | Supported Rates | */
168 /* --------------------------------------------------------------------- */
169 /* |2 |2 |2-34 |3-10 | */
170 /* --------------------------------------------------------------------- */
171 /* --------------------------------------------------------------------- */
172 /* |Externed Surpported rates| Power Capability | Supported Channels | */
173 /* --------------------------------------------------------------------- */
174 /* |3-257 |4 |4-256 | */
175 /* --------------------------------------------------------------------- */
176 /* --------------------------------------------------------------------- */
177 /* | RSN | QoS Capability | HT Capabilities | Extended Capabilities | */
178 /* --------------------------------------------------------------------- */
179 /* |36-256 |3 |28 |3-8 | */
180 /* --------------------------------------------------------------------- */
181 /* --------------------------------------------------------------------- */
182 /* | WPS | P2P | */
183 /* --------------------------------------------------------------------- */
184 /* |7-257 |X | */
185 /* --------------------------------------------------------------------- */
186 /* */
187 /* *********************************************************************** */
188 mac_set_cap_info_sta((hi_void *)hmac_vap->base_vap, puc_req_frame);
189 puc_req_frame += MAC_CAP_INFO_LEN;
190
191 /* 设置 Listen Interval IE */
192 mac_set_listen_interval_ie(puc_req_frame, &ie_len);
193 puc_req_frame += ie_len;
194
195 /* Ressoc组帧设置Current AP address */
196 if (hmac_vap->reassoc_flag) {
197 if (memcpy_s(puc_req_frame, WLAN_MAC_ADDR_LEN, hmac_vap->base_vap->auc_bssid, WLAN_MAC_ADDR_LEN) != EOK) {
198 return 0;
199 }
200 puc_req_frame += OAL_MAC_ADDR_LEN;
201 }
202 /* 设置 SSID IE */
203 mac_set_ssid_ie((hi_void *)hmac_vap->base_vap, puc_req_frame, &ie_len, WLAN_FC0_SUBTYPE_ASSOC_REQ);
204 puc_req_frame += ie_len;
205
206 /* 设置 Supported Rates IE */
207 hmac_set_supported_rates_ie_asoc_req(hmac_vap, puc_req_frame, &ie_len);
208 puc_req_frame += ie_len;
209
210 /* 设置 Extended Supported Rates IE */
211 hmac_set_exsup_rates_ie_asoc_req(hmac_vap, puc_req_frame, &ie_len);
212 puc_req_frame += ie_len;
213 /* 设置 Power Capability IE */
214 mac_set_power_cap_ie((hi_void *)hmac_vap->base_vap, puc_req_frame, &ie_len);
215 puc_req_frame += ie_len;
216
217 /* 设置 Supported channel IE */
218 mac_set_supported_channel_ie((hi_void *)hmac_vap->base_vap, puc_req_frame, &ie_len);
219 puc_req_frame += ie_len;
220
221 /* 填充WMM element */
222 if (hmac_vap->wmm_cap == HI_TRUE) {
223 mac_set_wmm_ie_sta((hi_void *)hmac_vap->base_vap, puc_req_frame, &ie_len);
224 puc_req_frame += ie_len;
225 }
226
227 /* 设置 HT Capability IE */
228 mac_set_ht_capabilities_ie((hi_void *)hmac_vap->base_vap, puc_req_frame, &ie_len);
229 puc_req_frame += ie_len;
230
231 /* 设置 Extended Capability IE */
232 mac_set_ext_capabilities_ie((hi_void *)hmac_vap->base_vap, puc_req_frame, &ie_len);
233 puc_req_frame += ie_len;
234
235 /* 填充P2P/WPS IE 信息 */
236 mac_add_app_ie(hmac_vap->base_vap, puc_req_frame, &us_app_ie_len, OAL_APP_ASSOC_REQ_IE);
237 puc_req_frame += us_app_ie_len;
238
239 return (hi_u32)(puc_req_frame - puc_req_frame_origin);
240 }
241
242 /* ****************************************************************************
243 功能描述 : 组seq = 1 的auth req帧
244 修改历史 :
245 1.日 期 : 2013年6月26日
246 作 者 : HiSilicon
247 修改内容 : 新生成函数
248 **************************************************************************** */
hmac_mgmt_encap_auth_req(const hmac_vap_stru * hmac_vap,hi_u8 * puc_mgmt_frame)249 hi_u16 hmac_mgmt_encap_auth_req(const hmac_vap_stru *hmac_vap, hi_u8 *puc_mgmt_frame)
250 {
251 hi_u8 user_index = 0;
252
253 /* *********************************************************************** */
254 /* Management Frame Format */
255 /* -------------------------------------------------------------------- */
256 /* |Frame Control|Duration|DA|SA|BSSID|Sequence Control|Frame Body|FCS| */
257 /* -------------------------------------------------------------------- */
258 /* | 2 |2 |6 |6 |6 |2 |0 - 2312 |4 | */
259 /* -------------------------------------------------------------------- */
260 /* */
261 /* *********************************************************************** */
262 /* *********************************************************************** */
263 /* Set the fields in the frame header */
264 /* *********************************************************************** */
265 mac_hdr_set_frame_control(puc_mgmt_frame, WLAN_FC0_SUBTYPE_AUTH);
266
267 if (memcpy_s(((mac_ieee80211_frame_stru *)puc_mgmt_frame)->auc_address1, WLAN_MAC_ADDR_LEN,
268 hmac_vap->base_vap->auc_bssid, WLAN_MAC_ADDR_LEN) != EOK) {
269 oam_error_log0(0, 0, "{hmac_mgmt_encap_auth_req::mem safe function err!}");
270 return 0;
271 }
272 if (memcpy_s(((mac_ieee80211_frame_stru *)puc_mgmt_frame)->auc_address2, WLAN_MAC_ADDR_LEN,
273 hmac_vap->base_vap->mib_info->wlan_mib_sta_config.auc_dot11_station_id, WLAN_MAC_ADDR_LEN) != EOK) {
274 oam_error_log0(0, 0, "{hmac_mgmt_encap_auth_req::mem safe function err!}");
275 return 0;
276 }
277 if (memcpy_s(((mac_ieee80211_frame_stru *)puc_mgmt_frame)->auc_address3, WLAN_MAC_ADDR_LEN,
278 hmac_vap->base_vap->auc_bssid, WLAN_MAC_ADDR_LEN) != EOK) {
279 oam_error_log0(0, 0, "{hmac_mgmt_encap_auth_req::mem safe function err!}");
280 return 0;
281 }
282 /* *********************************************************************** */
283 /* Set the contents of the frame body */
284 /* *********************************************************************** */
285 /* *********************************************************************** */
286 /* Authentication Frame (Sequence 1) - Frame Body */
287 /* -------------------------------------------------------------------- */
288 /* |Auth Algorithm Number|Auth Transaction Sequence Number|Status Code| */
289 /* -------------------------------------------------------------------- */
290 /* | 2 |2 |2 | */
291 /* -------------------------------------------------------------------- */
292 /* */
293 /* *********************************************************************** */
294 if (hmac_vap->base_vap->mib_info->wlan_mib_privacy.dot11_privacy_invoked == HI_FALSE) {
295 /* Open System */
296 puc_mgmt_frame[MAC_80211_FRAME_LEN] = 0x00;
297 puc_mgmt_frame[MAC_80211_FRAME_LEN + 1] = 0x00;
298 } else {
299 hi_u16 us_auth_type = (hi_u16)hmac_vap->auth_mode;
300
301 if (us_auth_type == WLAN_WITP_AUTH_SHARED_KEY) {
302 oam_info_log0(0, OAM_SF_ASSOC, "{hmac_mgmt_encap_auth_req::WLAN_WITP_AUTH_SHARED_KEY.}");
303 us_auth_type = WLAN_WITP_AUTH_SHARED_KEY;
304 } else {
305 oam_info_log0(0, OAM_SF_ASSOC, "{hmac_mgmt_encap_auth_req::WLAN_WITP_AUTH_OPEN_SYSTEM.}");
306 us_auth_type = WLAN_WITP_AUTH_OPEN_SYSTEM;
307 }
308
309 puc_mgmt_frame[MAC_80211_FRAME_LEN] = (us_auth_type & 0xFF);
310 puc_mgmt_frame[MAC_80211_FRAME_LEN + 1] = ((us_auth_type & 0xFF00) >> 8); /* 右移8位 */
311 }
312
313 /* 设置 Authentication Transaction Sequence Number 为 1 */
314 puc_mgmt_frame[MAC_80211_FRAME_LEN + 2] = 0x01; /* 位置增量为2 */
315 puc_mgmt_frame[MAC_80211_FRAME_LEN + 3] = 0x00; /* 位置增量为3 */
316 /* 设置 Status Code 为0. 这个包的这个字段没用 . */
317 puc_mgmt_frame[MAC_80211_FRAME_LEN + 4] = 0x00; /* 位置增量为4 */
318 puc_mgmt_frame[MAC_80211_FRAME_LEN + 5] = 0x00; /* 位置增量为5 */
319 /* 设置 认证帧的长度 */
320 hi_u16 us_auth_req_len = MAC_80211_FRAME_LEN + MAC_AUTH_ALG_LEN + MAC_AUTH_TRANS_SEQ_NUM_LEN + MAC_STATUS_CODE_LEN;
321
322 hmac_user_stru *hmac_user = (hmac_user_stru *)hmac_user_get_user_stru(hmac_vap->base_vap->assoc_vap_id);
323 if (hmac_user == HI_NULL) {
324 oam_info_log0(0, OAM_SF_ASSOC, "{hmac_mgmt_encap_auth_req::no present ap, alloc new ap.}");
325 hi_u32 ret = hmac_user_add(hmac_vap->base_vap, hmac_vap->base_vap->auc_bssid, WLAN_MAC_ADDR_LEN, &user_index);
326 if (ret != HI_SUCCESS) {
327 oam_warning_log1(0, OAM_SF_ASSOC, "{hmac_mgmt_encap_auth_req::hmac_user_add failed[%d].}", ret);
328 us_auth_req_len = 0;
329 }
330 }
331
332 return us_auth_req_len;
333 }
334
335 /* ****************************************************************************
336 功能描述 : 为shared key准备seq = 3 的认证帧
337 修改历史 :
338 1.日 期 : 2013年6月27日
339 作 者 : HiSilicon
340 修改内容 : 新生成函数
341 **************************************************************************** */
hmac_mgmt_encap_auth_req_seq3(const hmac_vap_stru * hmac_vap,hi_u8 * puc_mgmt_frame,hi_u8 * puc_mac_hrd)342 hi_u16 hmac_mgmt_encap_auth_req_seq3(const hmac_vap_stru *hmac_vap, hi_u8 *puc_mgmt_frame, hi_u8 *puc_mac_hrd)
343 {
344 /* *********************************************************************** */
345 /* Management Frame Format */
346 /* -------------------------------------------------------------------- */
347 /* |Frame Control|Duration|DA|SA|BSSID|Sequence Control|Frame Body|FCS| */
348 /* -------------------------------------------------------------------- */
349 /* | 2 |2 |6 |6 |6 |2 |0 - 2312 |4 | */
350 /* -------------------------------------------------------------------- */
351 /* */
352 /* *********************************************************************** */
353 /* *********************************************************************** */
354 /* Set the fields in the frame header */
355 /* *********************************************************************** */
356 mac_hdr_set_frame_control(puc_mgmt_frame, WLAN_FC0_SUBTYPE_AUTH);
357
358 /* 将帧保护字段置1 */
359 mac_set_wep(puc_mgmt_frame, 1);
360
361 if (memcpy_s(((mac_ieee80211_frame_stru *)puc_mgmt_frame)->auc_address1, WLAN_MAC_ADDR_LEN,
362 hmac_vap->base_vap->auc_bssid, WLAN_MAC_ADDR_LEN) != EOK) {
363 oam_error_log0(0, OAM_SF_CFG, "{hmac_mgmt_encap_auth_req_seq3::mem safe function err!}");
364 return 0;
365 }
366 if (memcpy_s(((mac_ieee80211_frame_stru *)puc_mgmt_frame)->auc_address2, WLAN_MAC_ADDR_LEN,
367 hmac_vap->base_vap->mib_info->wlan_mib_sta_config.auc_dot11_station_id, WLAN_MAC_ADDR_LEN) != EOK) {
368 oam_error_log0(0, OAM_SF_CFG, "{hmac_mgmt_encap_auth_req_seq3::mem safe function err!}");
369 return 0;
370 }
371 if (memcpy_s(((mac_ieee80211_frame_stru *)puc_mgmt_frame)->auc_address3, WLAN_MAC_ADDR_LEN,
372 hmac_vap->base_vap->auc_bssid, WLAN_MAC_ADDR_LEN) != EOK) {
373 oam_error_log0(0, OAM_SF_CFG, "{hmac_mgmt_encap_auth_req_seq3::mem safe function err!}");
374 return 0;
375 }
376
377 /* *********************************************************************** */
378 /* Set the contents of the frame body */
379 /* *********************************************************************** */
380 /* *********************************************************************** */
381 /* Authentication Frame (Sequence 3) - Frame Body */
382 /* --------------------------------------------------------------------- */
383 /* |Auth Algo Number|Auth Trans Seq Number|Status Code| Challenge Text | */
384 /* --------------------------------------------------------------------- */
385 /* | 2 |2 |2 | 3 - 256 | */
386 /* --------------------------------------------------------------------- */
387 /* */
388 /* *********************************************************************** */
389 /* 获取认证帧payload */
390 hi_u16 us_index = MAC_80211_FRAME_LEN;
391 hi_u8 *puc_data = (hi_u8 *)(puc_mgmt_frame + us_index);
392
393 /* 设置 认证帧的长度 */
394 hi_u16 us_auth_req_len = MAC_80211_FRAME_LEN + MAC_AUTH_ALG_LEN + MAC_AUTH_TRANS_SEQ_NUM_LEN + MAC_STATUS_CODE_LEN;
395
396 /* In case of no failure, the frame must be WEP encrypted.
397 * 4 bytes must be left for the IV in that case. These
398 * fields will then be reinitialized, using the correct
399 * index, with offset for IV field. Authentication
400 * Algorithm Number */
401 puc_data[0] = WLAN_WITP_AUTH_SHARED_KEY;
402 puc_data[1] = 0x00;
403
404 /* Authentication Transaction Sequence Number */
405 puc_data[2] = 0x03; /* 2 第3位 */
406 puc_data[3] = 0x00; /* 3 第4位 */
407
408 /* If WEP subfield in the incoming authentication frame
409 * is 1, respond with 'challenge text failure' status,
410 * since the STA does not expect an encrypted frame in
411 * this state. */
412 if (mac_is_protectedframe(puc_mac_hrd)) {
413 puc_data[4] = MAC_CHLNG_FAIL; /* 4 第5位 */
414 puc_data[5] = 0x00; /* 5 第6位 */
415 } else if (HI_FALSE == mac_is_wep_enabled(hmac_vap->base_vap)) {
416 /* If the STA does not support WEP, respond with
417 * 'unsupported algo' status, since WEP is necessary
418 * for Shared Key Authentication. */
419 puc_data[4] = MAC_UNSUPT_ALG; /* 4 第5位 */
420 puc_data[5] = 0x00; /* 5 第6位 */
421 } else if (mac_mib_get_wep_default_keysize(hmac_vap->base_vap) == 0) {
422 /* If the default WEP key is NULL, respond with
423 * 'challenge text failure' status, since a NULL
424 * key value cannot be used for WEP operations. */
425 puc_data[4] = MAC_CHLNG_FAIL; /* 4 第5位 */
426 puc_data[5] = 0x00; /* 5 第6位 */
427 } else {
428 /* If there is a mapping in dot11WEPKeyMappings
429 * matching the address of the AP, and the corresponding
430 * key is NULL respond with 'challenge text failure' status.
431 * This is currently not being used. */
432 /* No error condition detected */
433 puc_data[4] = MAC_SUCCESSFUL_STATUSCODE; /* 4 第5位 */
434 puc_data[5] = 0x00; /* 5 第6位 */
435
436 /* Extract 'Challenge Text' and its 'length' from the incoming */
437 /* authentication frame */
438 hi_u8 ch_text_len = puc_mac_hrd[MAC_80211_FRAME_LEN + 7]; /* 位置增7 */
439 hi_u8 *puc_ch_text = (hi_u8 *)(&puc_mac_hrd[MAC_80211_FRAME_LEN + 8]); /* 位置增8 */
440
441 /* Challenge Text Element */
442 /* --------------------------------------- */
443 /* |Element ID | Length | Challenge Text | */
444 /* --------------------------------------- */
445 /* | 1 |1 |1 - 253 | */
446 /* --------------------------------------- */
447 puc_mgmt_frame[us_index + 6] = MAC_EID_CHALLENGE; /* 位置增6 */
448 puc_mgmt_frame[us_index + 7] = ch_text_len; /* 位置增7 */
449 if (memcpy_s(&puc_mgmt_frame[us_index + 8], ch_text_len, puc_ch_text, ch_text_len) != EOK) { /* 位置增8 */
450 /* ROM化防止换行 */
451 oam_error_log0(0, OAM_SF_CFG, "hmac_mgmt_encap_auth_req_seq3:: puc_ch_text memcpy_s fail.");
452 return 0;
453 }
454
455 /* Add the challenge text element length to the authentication */
456 /* request frame length. The IV, ICV element lengths will be added */
457 /* after encryption. */
458 us_auth_req_len += (ch_text_len + MAC_IE_HDR_LEN);
459 }
460
461 return us_auth_req_len;
462 }
463
464 #ifdef __cplusplus
465 #if __cplusplus
466 }
467 #endif
468 #endif
469