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 "mac_regdomain.h"
23 #include "mac_device.h"
24
25 #ifdef __cplusplus
26 #if __cplusplus
27 extern "C" {
28 #endif
29 #endif
30
31 /* ****************************************************************************
32 2 全局变量定义
33 **************************************************************************** */
34 /* 管制域信息全局变量 */
35 mac_regdomain_info_stru g_mac_regdomain;
36
37 mac_channel_info_stru g_ast_channel_list_2g[MAC_CHANNEL_FREQ_2_BUTT] = {
38 {1, MAC_INVALID_RC}, {2, MAC_INVALID_RC}, {3, MAC_INVALID_RC},
39 {4, MAC_INVALID_RC}, {5, MAC_INVALID_RC}, {6, MAC_INVALID_RC},
40 {7, MAC_INVALID_RC}, {8, MAC_INVALID_RC}, {9, MAC_INVALID_RC},
41 {10, MAC_INVALID_RC}, {11, MAC_INVALID_RC}, {12, MAC_INVALID_RC},
42 {13, MAC_INVALID_RC}, {14, MAC_INVALID_RC},
43 };
44
45 /* ****************************************************************************
46 3 函数实现
47 **************************************************************************** */
48 /* ****************************************************************************
49 功能描述 : 获取管制域信息
50 修改历史 :
51 1.日 期 : 2013年9月23日
52 作 者 : HiSilicon
53 修改内容 : 新生成函数
54 **************************************************************************** */
mac_get_regdomain_info(hi_void)55 mac_regdomain_info_stru *mac_get_regdomain_info(hi_void)
56 {
57 return &g_mac_regdomain;
58 }
59
60 /* ****************************************************************************
61 功能描述 : 初始化默认管制域2.4G信息
62 修改历史 :
63 1.日 期 : 2019年7月28日
64 作 者 : HiSilicon
65 **************************************************************************** */
mac_init_regdomain_2g(hi_void)66 hi_void mac_init_regdomain_2g(hi_void)
67 {
68 mac_regclass_info_stru *regclass = HI_NULL;
69
70 regclass = &(g_mac_regdomain.ast_regclass[0]);
71 regclass->start_freq = MAC_RC_START_FREQ_2;
72 regclass->ch_spacing = MAC_CH_SPACING_5MHZ;
73 regclass->behaviour_bmap = 0;
74 regclass->coverage_class = 0;
75 regclass->max_reg_tx_pwr = MAC_RC_DEFAULT_MAX_TX_PWR;
76 regclass->max_tx_pwr = MAC_RC_DEFAULT_MAX_TX_PWR;
77 regclass->channel_bmap = bit(MAC_CHANNEL1) |
78 bit(MAC_CHANNEL2) |
79 bit(MAC_CHANNEL3) |
80 bit(MAC_CHANNEL4) |
81 bit(MAC_CHANNEL5) |
82 bit(MAC_CHANNEL6) |
83 bit(MAC_CHANNEL7) |
84 bit(MAC_CHANNEL8) |
85 bit(MAC_CHANNEL9) |
86 bit(MAC_CHANNEL10) |
87 bit(MAC_CHANNEL11) |
88 bit(MAC_CHANNEL12) |
89 bit(MAC_CHANNEL13);
90 }
91
92 /* ****************************************************************************
93 功能描述 : 初始化默认管制域信息
94 修改历史 :
95 1.日 期 : 2013年9月18日
96 作 者 : HiSilicon
97 修改内容 : 新生成函数
98 **************************************************************************** */
mac_init_regdomain(hi_void)99 hi_void mac_init_regdomain(hi_void)
100 {
101 hi_char ac_default_country[WLAN_COUNTRY_STR_LEN] = "99";
102
103 if (memcpy_s(g_mac_regdomain.ac_country, WLAN_COUNTRY_STR_LEN, ac_default_country, WLAN_COUNTRY_STR_LEN) != EOK) {
104 return;
105 }
106 /* 初始默认的管制类个数为1 */
107 g_mac_regdomain.regclass_num = 1;
108
109 /* ************************************************************************
110 初始化管制类1 2.4G
111 ************************************************************************ */
112 mac_init_regdomain_2g();
113 }
114
115 /* ****************************************************************************
116 功能描述 : 依据管制域初始化信道列表
117 修改历史 :
118 1.日 期 : 2013年9月18日
119 作 者 : HiSilicon
120 修改内容 : 新生成函数
121 **************************************************************************** */
mac_init_channel_list(hi_void)122 hi_void mac_init_channel_list(hi_void)
123 {
124 hi_u8 ch_idx;
125 hi_u8 rc_num;
126 hi_u8 rc_idx;
127 mac_regdomain_info_stru *rd_info = HI_NULL;
128 mac_regclass_info_stru *rc_info = HI_NULL;
129
130 rd_info = &g_mac_regdomain;
131 /* 先初始化所有信道的管制类为无效 */
132 for (ch_idx = 0; ch_idx < MAC_CHANNEL_FREQ_2_BUTT; ch_idx++) {
133 g_ast_channel_list_2g[ch_idx].reg_class = MAC_INVALID_RC;
134 }
135
136 /* 然后根据管制域更新信道的管制类信息 */
137 rc_num = rd_info->regclass_num;
138 /* 更新2G频段上信道的管制类信息 */
139 for (rc_idx = 0; rc_idx < rc_num; rc_idx++) {
140 rc_info = &(rd_info->ast_regclass[rc_idx]);
141 if (rc_info->start_freq != MAC_RC_START_FREQ_2) {
142 continue;
143 }
144 for (ch_idx = 0; ch_idx < MAC_CHANNEL_FREQ_2_BUTT; ch_idx++) {
145 if (rc_info->channel_bmap & bit(ch_idx)) {
146 g_ast_channel_list_2g[ch_idx].reg_class = rc_idx;
147 }
148 }
149 }
150 }
151
152 /* ****************************************************************************
153 功能描述 : 获取1个信道索引的管制类信息
154 输入参数 : uc_band: 频段,0-2.4G, 1-5G
155 uc_ch_idx: 信道索引号
156 修改历史 :
157 1.日 期 : 2013年10月29日
158 作 者 : HiSilicon
159 修改内容 : 新生成函数
160 **************************************************************************** */
mac_get_channel_idx_rc_info(hi_u8 band,hi_u8 ch_idx)161 mac_regclass_info_stru *mac_get_channel_idx_rc_info(hi_u8 band, hi_u8 ch_idx)
162 {
163 hi_u8 reg_class;
164
165 if (mac_is_channel_idx_valid(band, ch_idx, ®_class) != HI_SUCCESS) {
166 return HI_NULL;
167 }
168
169 return &(g_mac_regdomain.ast_regclass[reg_class]);
170 }
171
172 /* ****************************************************************************
173 功能描述 : 由信道索引值返回信道号
174 修改历史 :
175 1.日 期 : 2013年4月17日
176 作 者 : HiSilicon
177 修改内容 : 新生成函数
178 **************************************************************************** */
mac_get_channel_num_from_idx(hi_u8 band,hi_u8 idx,hi_u8 * puc_channel_num)179 hi_void mac_get_channel_num_from_idx(hi_u8 band, hi_u8 idx, hi_u8 *puc_channel_num)
180 {
181 if (band == MAC_RC_START_FREQ_2) {
182 if (idx >= MAC_CHANNEL_FREQ_2_BUTT) {
183 return;
184 }
185 *puc_channel_num = g_ast_channel_list_2g[idx].chan_number;
186 }
187 }
188
189 /* ****************************************************************************
190 功能描述 : 通过信道号找到信道索引号
191 修改历史 :
192 1.日 期 : 2013年7月3日
193 作 者 : HiSilicon
194 修改内容 : 新生成函数
195 **************************************************************************** */
mac_get_channel_idx_from_num(hi_u8 band,hi_u8 channel_num,hi_u8 * puc_channel_idx)196 hi_u32 mac_get_channel_idx_from_num(hi_u8 band, hi_u8 channel_num, hi_u8 *puc_channel_idx)
197 {
198 mac_channel_info_stru *channel = HI_NULL;
199 hi_u8 total_channel_num = 0;
200 hi_u8 idx;
201
202 /* 根据频段获取信道信息 */
203 switch (band) {
204 case MAC_RC_START_FREQ_2:
205 channel = g_ast_channel_list_2g;
206 total_channel_num = (hi_u8)MAC_CHANNEL_FREQ_2_BUTT;
207 break;
208 default:
209 return HI_ERR_CODE_INVALID_CONFIG;
210 }
211 /* 检查信道索引号 */
212 for (idx = 0; idx < total_channel_num; idx++) {
213 if (channel[idx].chan_number == channel_num) {
214 *puc_channel_idx = idx;
215 return HI_SUCCESS;
216 }
217 }
218 return HI_ERR_CODE_INVALID_CONFIG;
219 }
220
221 /* ****************************************************************************
222 功能描述 : 根据管制域,判断信道索引号是否有效
223 修改历史 :
224 1.日 期 : 2013年9月23日
225 作 者 : HiSilicon
226 修改内容 : 新生成函数
227 **************************************************************************** */
mac_is_channel_idx_valid(hi_u8 band,hi_u8 ch_idx,hi_u8 * reg_class)228 hi_u32 mac_is_channel_idx_valid(hi_u8 band, hi_u8 ch_idx, hi_u8 *reg_class)
229 {
230 hi_u8 max_ch_idx;
231 mac_channel_info_stru *ch_info = HI_NULL;
232
233 switch (band) {
234 case MAC_RC_START_FREQ_2:
235 max_ch_idx = MAC_CHANNEL_FREQ_2_BUTT;
236 ch_info = &(g_ast_channel_list_2g[ch_idx]);
237 break;
238 default:
239 return HI_ERR_CODE_INVALID_CONFIG;
240 }
241
242 if (ch_idx >= max_ch_idx) {
243 return HI_ERR_CODE_ARRAY_OVERFLOW;
244 }
245 if (ch_info->reg_class != MAC_INVALID_RC) {
246 if (reg_class != HI_NULL) {
247 *reg_class = ch_info->reg_class;
248 }
249 return HI_SUCCESS;
250 }
251 return HI_ERR_CODE_INVALID_CONFIG;
252 }
253
254 /* ****************************************************************************
255 功能描述 : 检测信道号是否合法
256 输入参数 : en_band : 频段
257 uc_ch_num: 信道号
258 返 回 值 : HI_TRUE或HI_FALSE
259 修改历史 :
260 1.日 期 : 2013年4月18日
261 作 者 : HiSilicon
262 修改内容 : 新生成函数
263 **************************************************************************** */
mac_is_channel_num_valid(hi_u8 band,hi_u8 ch_num)264 hi_u32 mac_is_channel_num_valid(hi_u8 band, hi_u8 ch_num)
265 {
266 hi_u8 ch_idx;
267 hi_u32 ret;
268
269 ret = mac_get_channel_idx_from_num(band, ch_num, &ch_idx);
270 if (ret != HI_SUCCESS) {
271 return ret;
272 }
273 ret = mac_is_channel_idx_valid(band, ch_idx, HI_NULL);
274 return ret;
275 }
276
277 /* ****************************************************************************
278 功能描述 : 获取信道号管制类信息
279 输入参数 : uc_band: 频段,0-2.4G, 1-5G
280 uc_ch_num: 信道索引号
281 修改历史 :
282 1.日 期 : 2013年10月30日
283 作 者 : HiSilicon
284 修改内容 : 新生成函数
285 **************************************************************************** */
mac_get_channel_num_rc_info(hi_u8 band,hi_u8 ch_num)286 mac_regclass_info_stru *mac_get_channel_num_rc_info(hi_u8 band, hi_u8 ch_num)
287 {
288 hi_u8 channel_idx;
289
290 if (mac_get_channel_idx_from_num(band, ch_num, &channel_idx) != HI_SUCCESS) {
291 oam_warning_log2(0, OAM_SF_ANY,
292 "{mac_get_channel_num_rc_info::mac_get_channel_idx_from_num failed. band:%d, ch_num:%d", band, ch_num);
293 return HI_NULL;
294 }
295 return mac_get_channel_idx_rc_info(band, channel_idx);
296 }
297
298 /* ****************************************************************************
299 功能描述 : 设置管制域最大发送功率
300 输入参数 : uc_pwr : 功率
301 en_exceed_reg: 是否可以超出管制域限制
302 修改历史 :
303 1.日 期 : 2014年8月27日
304 作 者 : HiSilicon
305 修改内容 : 新生成函数
306 **************************************************************************** */
mac_regdomain_set_max_power(hi_u8 pwr,hi_u8 exceed_reg)307 hi_void mac_regdomain_set_max_power(hi_u8 pwr, hi_u8 exceed_reg)
308 {
309 hi_u8 rc_idx;
310 hi_u8 reg_pwr;
311
312 for (rc_idx = 0; rc_idx < g_mac_regdomain.regclass_num; rc_idx++) {
313 reg_pwr = g_mac_regdomain.ast_regclass[rc_idx].max_reg_tx_pwr;
314 if (pwr <= reg_pwr || exceed_reg) {
315 g_mac_regdomain.ast_regclass[rc_idx].max_tx_pwr = pwr;
316 } else {
317 oam_warning_log3(0, OAM_SF_TPC, "uc_pwr[%d] exceed reg_tx_pwr[%d], rc_idx[%d]", pwr, reg_pwr, rc_idx);
318 }
319 }
320 }
321
322 /* ****************************************************************************
323 功能描述 : 2G频段填写国家码
324 输入参数 : pst_rd_info: 管制域信息
325 puc_buffer : 填写频带三元组起始buffer地址
326 输出参数 : puc_len : 所填写三元组的长度
327 修改历史 :
328 1.日 期 : 2013年11月27日
329 作 者 : HiSilicon
330 修改内容 : 新生成函数
331 **************************************************************************** */
mac_set_country_ie_2g(mac_regdomain_info_stru * rd_info,hi_u8 * puc_buffer,hi_u8 * puc_len)332 hi_void mac_set_country_ie_2g(mac_regdomain_info_stru *rd_info, hi_u8 *puc_buffer, hi_u8 *puc_len)
333 {
334 hi_u8 rc_idx;
335 hi_u8 lsb_bit_position;
336 mac_regclass_info_stru *reg_class = HI_NULL;
337 hi_u8 len = 0;
338
339 for (rc_idx = 0; rc_idx < rd_info->regclass_num; rc_idx++) {
340 /* 获取 Regulatory Class */
341 reg_class = &(rd_info->ast_regclass[rc_idx]);
342 /* 如果频段不匹配 */
343 if (MAC_RC_START_FREQ_2 != reg_class->start_freq) {
344 continue;
345 }
346 /* 异常检查,信道位图为0表示此管制域没有信道存在,不能少 */
347 if (reg_class->channel_bmap == 0) {
348 continue;
349 }
350 /* 获取信道位图的最低一位, 返回0代表bit0置1 */
351 lsb_bit_position = oal_bit_find_first_bit_four_byte(reg_class->channel_bmap);
352 /* 获取信道号,例如Channel_Map为1100,其对应的索引值为2与3,再由索引值找到信道号 */
353 mac_get_channel_num_from_idx(MAC_RC_START_FREQ_2, lsb_bit_position, &puc_buffer[len++]);
354 /* 获取信道数 */
355 puc_buffer[len++] = (hi_u8)oal_bit_get_num_four_byte(reg_class->channel_bmap);
356 /* 获取最大功率 */
357 puc_buffer[len++] = reg_class->max_reg_tx_pwr;
358 }
359 *puc_len = len;
360 return;
361 }
362
363 /* ****************************************************************************
364 功能描述 : 获取国家字符
365 修改历史 :
366 1.日 期 : 2013年10月18日
367 作 者 : HiSilicon
368 修改内容 : 新生成函数
369 **************************************************************************** */
mac_regdomain_get_country(hi_void)370 hi_char *mac_regdomain_get_country(hi_void)
371 {
372 return g_mac_regdomain.ac_country;
373 }
374
375 #ifdef __cplusplus
376 #if __cplusplus
377 }
378 #endif
379 #endif
380