• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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