• 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 "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, &reg_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