• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  * Description: Function related to wifi aware(NAN) feature.
15  */
16 
17 #include "hmac_sdp.h"
18 #include "hmac_mgmt_bss_comm.h"
19 #include "wlan_msg.h"
20 #include "frw_hmac.h"
21 #include "hmac_feature_dft.h"
22 
23 #include "dmac_ext_if_hcm.h"
24 #include "hmac_tx_mgmt.h"
25 #include "hmac_fcs.h"
26 #include "mac_data.h"
27 #include "mac_device_ext.h"
28 #include "hal_ext_if.h"
29 #include "oal_netbuf_data.h"
30 #include "msg_sdp_rom.h"
31 #include "hmac_feature_interface.h"
32 #include "hmac_ccpriv.h"
33 #include "mac_vap_ext.h"
34 
35 #ifdef __cplusplus
36 #if __cplusplus
37 extern "C" {
38 #endif
39 #endif
40 
41 #undef THIS_FILE_ID
42 #define THIS_FILE_ID DIAG_FILE_ID_WIFI_HOST_HMAC_SDP_C
43 
44 #undef THIS_MOD_ID
45 #define THIS_MOD_ID DIAG_MOD_ID_WIFI_HOST
46 
47 #define NAN_WAKE_PRE_TIME 8
48 #define NAN_2G_CHAN 6
49 
50 OAL_STATIC hmac_sdp_service_info g_service_info;
51 OAL_STATIC oal_bool_enum g_sdp_init = OAL_FALSE;
52 
hmac_sdp_get_service_num_by_type(osal_u8 type)53 OAL_STATIC osal_u8 hmac_sdp_get_service_num_by_type(osal_u8 type)
54 {
55     osal_u32 index;
56     osal_u8 num = 0;
57     oal_sdp_service *array = g_service_info.info;
58     osal_u8 size = (osal_u8)osal_array_size(g_service_info.info);
59 
60     for (index = 0; index < size; index++) {
61         if ((array[index].type & type) != 0) {
62             num++;
63         }
64     }
65     return num;
66 }
67 
hmac_sdp_service_max_size(osal_u8 type)68 OAL_STATIC osal_u8 hmac_sdp_service_max_size(osal_u8 type)
69 {
70     if ((type & OAL_SDP_SERVICE_TYPE_PUBLISH) != 0) {
71         return HMAC_MAX_PUBLISH_NUM;
72     } else if ((type & OAL_SDP_SERVICE_TYPE_SUBSCRIBE) != 0) {
73         return HMAC_MAX_SUBSCRIBE_NUM;
74     } else {
75         return 0;
76     }
77 }
78 
hmac_sdp_save_service_info(const oal_sdp_service * src_srv)79 OAL_STATIC osal_u32 hmac_sdp_save_service_info(const oal_sdp_service *src_srv)
80 {
81     osal_u8 index;
82     oal_sdp_service *array = g_service_info.info;
83     osal_u8 array_size = (osal_u8)osal_array_size(g_service_info.info);
84     osal_u8 match_index = array_size;
85     osal_u8 null_index = array_size;
86     osal_u8 max_size;
87     osal_u8 current_num;
88 
89     if (src_srv->local_handle < 1) {
90         oam_warning_log1(0, OAM_SF_SDP,
91             "hmac_sdp_save_service_info:can not add new service, src_srv->local_handle[%u]", src_srv->local_handle);
92         return OAL_FAIL;
93     }
94     for (index = 0; index < array_size; index++) {
95         if (((array[index].type & src_srv->type) != 0) && (array[index].local_handle == src_srv->local_handle)) {
96             match_index = index;
97             break;
98         }
99         if ((array[index].type == OAL_SDP_SERVICE_TYPE_DEFAULT) && (null_index == array_size)) {
100             null_index = index;
101         }
102     }
103     /* 未匹配到服务则保存到空的空间 */
104     if (match_index == array_size) {
105         max_size = hmac_sdp_service_max_size(src_srv->type);
106         current_num = hmac_sdp_get_service_num_by_type(src_srv->type);
107         /* 当前服务类型已达其最大个数或无空位 */
108         if ((current_num >= max_size) || (null_index == array_size)) {
109             oam_warning_log2(0, OAM_SF_SDP,
110                 "hmac_sdp_save_service_info:can not add new service, current[%d], max_size[%d]", current_num, max_size);
111             return OAL_FAIL;
112         } else {
113             match_index = null_index;
114         }
115     }
116 
117     /* 有未使用服务空间则保存 */
118     if (memcpy_s(&array[match_index], sizeof(oal_sdp_service), src_srv, sizeof(oal_sdp_service)) == EOK) {
119         oam_info_log3(0, OAM_SF_SDP, "hmac_sdp_save_service_info:name[0]=%02x, local_handle=%d, type=%d",
120             array[match_index].name[0], array[match_index].local_handle, array[match_index].type);
121         return OAL_SUCC;
122     } else {
123         oam_warning_log1(0, OAM_SF_SDP, "hmac_sdp_save_service_info:memcpy_s failed, name[0]=%02x", src_srv->name[0]);
124         return OAL_FAIL;
125     }
126 }
127 
128 /* 启动订阅操作,用于侦听某一服务信息,入参包含服务名称哈希值和订阅成功之后分配的本端instance id */
hmac_sdp_start_subscribe(hmac_vap_stru * hmac_vap,frw_msg * msg)129 osal_s32 hmac_sdp_start_subscribe(hmac_vap_stru *hmac_vap, frw_msg *msg)
130 {
131     oal_sdp_service *service_info = OSAL_NULL;
132 
133     if ((hmac_vap == OSAL_NULL) || (msg->data == OSAL_NULL)) {
134         oam_error_log0(0, OAM_SF_CFG, "{hmac_sdp_start_subscribe::param null.}");
135         return OAL_ERR_CODE_PTR_NULL;
136     }
137 
138     if (hmac_sdp_is_init() != OAL_TRUE) {
139         return OAL_FAIL;
140     }
141 
142     service_info = (oal_sdp_service *)msg->data;
143     if (hmac_sdp_save_service_info(service_info) != OAL_SUCC) {
144         return OAL_FAIL;
145     }
146 
147     oam_warning_log1(0, OAM_SF_CFG, "{hmac_sdp_start_subscribe::local_handle %d.}", service_info->local_handle);
148     return OAL_SUCC;
149 }
150 
hmac_sdp_clear_service_info(osal_u8 local_handle,osal_u8 type)151 OAL_STATIC osal_u32 hmac_sdp_clear_service_info(osal_u8 local_handle, osal_u8 type)
152 {
153     osal_u32 index;
154     oal_sdp_service *array = g_service_info.info;
155     osal_u8 size = (osal_u8)osal_array_size(g_service_info.info);
156 
157     for (index = 0; index < size; index++) {
158         if (((array[index].type & type) != 0) && (array[index].local_handle == local_handle)) {
159             oam_warning_log3(0, OAM_SF_SDP, "hmac_sdp_clear_service_info set local_handle =%d, index %d, size %d\r\n",
160                 local_handle, index, size);
161             (osal_void)memset_s((osal_void *)&array[index], sizeof(array[index]), 0, sizeof(array[index]));
162             break;
163         }
164     }
165     if (index >= size) {
166         oam_warning_log3(0, OAM_SF_SDP, "hmac_sdp_clear_service_info not find local_handle =%d, index %d, size %d\r\n",
167             local_handle, index, size);
168         return OAL_FAIL;
169     }
170     return OAL_SUCC;
171 }
172 
173 /* 取消订阅操作,入参包含待取消的服务的本端instance id */
hmac_sdp_cancel_subscribe(hmac_vap_stru * hmac_vap,frw_msg * msg)174 osal_s32 hmac_sdp_cancel_subscribe(hmac_vap_stru *hmac_vap, frw_msg *msg)
175 {
176     osal_u8 local_handle = 0;
177     if (msg->data == OSAL_NULL) {
178         oam_error_log0(0, OAM_SF_CFG, "{hmac_sdp_cancel_subscribe::param null.}");
179         return OAL_ERR_CODE_PTR_NULL;
180     }
181     local_handle = msg->data[0];
182     if ((hmac_vap == OSAL_NULL) || (hmac_sdp_is_init() != OAL_TRUE)) {
183         return OAL_FAIL;
184     }
185     oam_warning_log1(0, OAM_SF_SDP, "hmac_sdp_cancel_subscribe local_handle %d", local_handle);
186     if (hmac_sdp_clear_service_info(local_handle, OAL_SDP_SERVICE_TYPE_SUBSCRIBE) != OAL_SUCC) {
187         return OAL_FAIL;
188     }
189     return OAL_SUCC;
190 }
191 
192 /* 设置dw 和 prd time, prd_pre_time */
hmac_sdp_dw_prd_time_cfg(hmac_vap_stru * hmac_vap,frw_msg * msg)193 osal_s32 hmac_sdp_dw_prd_time_cfg(hmac_vap_stru *hmac_vap, frw_msg *msg)
194 {
195     frw_msg msg_info;
196     oal_sdp_dw_prd_time_info *time_info = OSAL_NULL;
197 
198     /* 为了支持在 sdp初始化之前配置两个全局变量的值, 此处不判断 hmac_sdp_is_init是否为true */
199     if ((hmac_vap == OSAL_NULL) || (msg->data == OSAL_NULL)) {
200         oam_error_log0(0, OAM_SF_CFG, "{hmac_sdp_dw_prd_time_cfg::param null.}");
201         return OAL_ERR_CODE_PTR_NULL;
202     }
203     time_info = (oal_sdp_dw_prd_time_info *)msg->data;
204     (osal_void)memset_s(&msg_info, OAL_SIZEOF(msg_info), 0, OAL_SIZEOF(msg_info));
205     msg_info.data = (osal_u8 *)time_info;
206     msg_info.data_len = (osal_u16)sizeof(oal_sdp_dw_prd_time_info);
207     return send_cfg_to_device(hmac_vap->vap_id, WLAN_MSG_H2D_C_CFG_SDP_DW_PRD_TIME_CFG, &msg_info, OSAL_TRUE);
208 }
209 
210 /* 发送publish报文的mac给device, 过滤时间同步beacon 或 私有action帧 */
hmac_sdp_add_peer_mac(hmac_vap_stru * hmac_vap,frw_msg * msg)211 osal_s32 hmac_sdp_add_peer_mac(hmac_vap_stru *hmac_vap, frw_msg *msg)
212 {
213     osal_s32 ret;
214     oal_sdp_peer_mac_handle *info = OSAL_NULL;
215     frw_msg msg_info;
216 
217     if ((hmac_vap == OSAL_NULL) || (hmac_sdp_is_init() != OAL_TRUE)) {
218         return OAL_FAIL;
219     }
220     if (msg->data == OSAL_NULL) {
221         oam_error_log0(0, OAM_SF_CFG, "{hmac_sdp_add_peer_mac::param null.}");
222         return OAL_ERR_CODE_PTR_NULL;
223     }
224 
225     info = (oal_sdp_peer_mac_handle *)msg->data;
226     (osal_void)memset_s(&msg_info, OAL_SIZEOF(msg_info), 0, OAL_SIZEOF(msg_info));
227     msg_info.data = (osal_u8 *)info;
228     msg_info.data_len = (osal_u16)sizeof(oal_sdp_peer_mac_handle);
229     ret = send_cfg_to_device(hmac_vap->vap_id, WLAN_MSG_H2D_C_CFG_SDP_ADD_PEER_MAC, &msg_info, OSAL_TRUE);
230     oam_warning_log1(0, OAM_SF_SDP, "hmac_sdp_add_peer_mac ret %d", ret);
231     return ret;
232 }
233 
hmac_sdp_init_send_info(hmac_vap_stru * hmac_vap,osal_bool switch_channel,osal_u16 peroid,osal_u8 ratio)234 OAL_STATIC osal_u32 hmac_sdp_init_send_info(hmac_vap_stru *hmac_vap, osal_bool switch_channel,
235     osal_u16 peroid, osal_u8 ratio)
236 {
237     mac_sdp_init_info init_info;
238     frw_msg msg_info;
239 
240     (osal_void)memset_s(&init_info, OAL_SIZEOF(init_info), 0, OAL_SIZEOF(init_info));
241     init_info.is_init = (osal_u8)hmac_sdp_is_init();
242     init_info.tx_enable = OAL_TRUE;
243     init_info.publish_cnt = HMAC_MAX_PUBLISH_NUM;
244     init_info.subscribe_cnt = HMAC_MAX_SUBSCRIBE_NUM;
245     init_info.timer_enable = switch_channel;
246     if (switch_channel) { /* 待拆分初始化命令后 更新此处代码 */
247         /* sta已联网状态下, 配置时间窗口接收publish和时间同步报文 */
248         init_info.init_period_ms = peroid; /* 默认 200ms */
249         init_info.init_dw_ms = (osal_u16)(init_info.init_period_ms * ratio) / 10; /* 10 用于计算百分比 */
250         oam_warning_log3(0, OAM_SF_CFG, "{hmac_sdp_init_send_info:peroid[%d] dw_ms[%d] ratio[%d]",
251             init_info.init_period_ms, init_info.init_dw_ms, ratio);
252     }
253     init_info.pre_dw = NAN_WAKE_PRE_TIME;
254     init_info.sw_chan.chan_number = NAN_2G_CHAN;
255     init_info.sw_chan.band = WLAN_BAND_2G;
256     init_info.sw_chan.en_bandwidth = WLAN_BAND_WIDTH_20M;
257     (osal_void)hmac_get_channel_idx_from_num_etc(init_info.sw_chan.band, init_info.sw_chan.chan_number,
258         &init_info.sw_chan.chan_idx);
259 
260     (osal_void)memset_s(&msg_info, OAL_SIZEOF(msg_info), 0, OAL_SIZEOF(msg_info));
261     msg_info.data = (osal_u8 *)&init_info;
262     msg_info.data_len = (osal_u16)sizeof(init_info);
263 
264     return (osal_u32)send_cfg_to_device(hmac_vap->vap_id, WLAN_MSG_H2D_C_CFG_SDP_INIT, &msg_info, OSAL_TRUE);
265 }
266 
hmac_sdp_init_enable(hmac_vap_stru * hmac_vap,frw_msg * msg)267 osal_s32 hmac_sdp_init_enable(hmac_vap_stru *hmac_vap, frw_msg *msg)
268 {
269     osal_u16 peroid = 524; /* 524 周期 */
270     osal_u8 ratio = 5; /* 待适配,默认5,表示50%比例,目前都未用该接口,要么就用sdp test,要么有上层APP场景下用其他接口 */
271     osal_u8 value;
272     if ((hmac_vap == OSAL_NULL) || (msg->data == OSAL_NULL)) {
273         oam_error_log0(0, OAM_SF_CFG, "{hmac_sdp_init_enable::param null.}");
274         return OAL_ERR_CODE_PTR_NULL;
275     }
276     value = *(msg->data);
277 
278     if (value == HMAC_SDP_ENABLE) {
279         return (osal_s32)hmac_sdp_init(hmac_vap, OAL_FALSE, peroid, &ratio);
280     } else if (value == HMAC_SDP_EN_SC) {
281         return (osal_s32)hmac_sdp_init(hmac_vap, OAL_TRUE, peroid, &ratio);
282     } else {
283         return (osal_s32)hmac_sdp_deinit(hmac_vap);
284     }
285 }
286 
hmac_sdp_is_init(osal_void)287 oal_bool_enum hmac_sdp_is_init(osal_void)
288 {
289     return g_sdp_init;
290 }
291 
292 /* SDP功能初始化,初始化时创建定时器并在DMAC设置寄存器允许侦听非本BSS的多播帧 */
hmac_sdp_init(hmac_vap_stru * hmac_vap,osal_bool switch_channel,osal_u16 peroid,osal_u8 * input_ratio)293 osal_u32 hmac_sdp_init(hmac_vap_stru *hmac_vap, osal_bool switch_channel, osal_u16 peroid, osal_u8 *input_ratio)
294 {
295     osal_u32 ret;
296     osal_u8 ratio;
297     if ((hmac_vap == OSAL_NULL) || (input_ratio == OSAL_NULL)) {
298         return OAL_FAIL;
299     }
300 
301     if (hmac_sdp_is_init() == OAL_TRUE) {
302         oam_warning_log0(0, OAM_SF_SDP, "sdp is already init now");
303         return OAL_FAIL;
304     }
305     (osal_void)memset_s((osal_void *)&g_service_info, sizeof(g_service_info), 0, sizeof(g_service_info));
306     g_sdp_init = OAL_TRUE;
307 
308     ratio = *input_ratio;
309     if ((ratio < 2) || (ratio > 8)) { /* 2-8 表示比例20%-80% 预留时间用于信道切换涉及的操作 */
310         oam_warning_log1(0, OAM_SF_SDP, "hmac_sdp_init ratio[%d] not valid, use default value 5", ratio);
311         wifi_printf("hmac_sdp_init ratio[%d] not valid[2-8], use default value 5\r\n", ratio);
312         ratio = 5; /* 5表示缺省50% */
313         *input_ratio = ratio;
314     }
315     ret = hmac_sdp_init_send_info(hmac_vap, switch_channel, peroid, ratio);
316     oam_info_log1(0, OAM_SF_SDP, "hmac_sdp_init return[%d]", ret);
317     if (ret == OAL_SUCC) {
318         /* 协议低功耗会影响收包,   深睡会断电,两者均会影响sdp业务;  不进协议低功耗不会进深睡 */
319 #ifdef _PRE_WLAN_FEATURE_STA_PM
320         ret = hmac_config_set_pm_by_module_etc(hmac_vap, MAC_STA_PM_CTRL_TYPE_SDP, MAC_STA_PM_SWITCH_OFF);
321         if (ret != OAL_SUCC) {
322             oam_warning_log2(0, OAM_SF_CFG,
323                 "vap_id[%d] {hmac_sdp_init::hmac_config_set_pm_by_module_etc failed[%d].}", hmac_vap->vap_id, ret);
324         }
325 #endif
326     }
327     return ret;
328 }
329 
330 /* SDP功能去初始化,清除定时器并还原DMAC寄存器配置 */
hmac_sdp_deinit(hmac_vap_stru * hmac_vap)331 osal_u32 hmac_sdp_deinit(hmac_vap_stru *hmac_vap)
332 {
333     osal_u32 ret;
334     if (hmac_vap == OSAL_NULL) {
335         return OAL_FAIL;
336     }
337 
338     if (hmac_sdp_is_init() == OAL_FALSE) {
339         oam_info_log0(0, OAM_SF_SDP, "sdp is not init now");
340         return OAL_FAIL;
341     }
342     (osal_void)memset_s((osal_void *)&g_service_info, sizeof(g_service_info), 0, sizeof(g_service_info));
343     g_sdp_init = OAL_FALSE;
344 
345     ret = hmac_sdp_init_send_info(hmac_vap, OAL_FALSE, 0, 0);
346     oam_info_log1(0, OAM_SF_SDP, "hmac_sdp_deinit return[%d]", ret);
347 
348     if (ret == OAL_SUCC) {
349         /* 协议低功耗会影响收包,   深睡会断电,两者均会影响sdp业务;  不进协议低功耗不会进深睡 */
350 #ifdef _PRE_WLAN_FEATURE_STA_PM
351         osal_u8 pm_switch = (hmac_vap->sta_pm_handler.last_ps_status != 0) ?
352             MAC_STA_PM_SWITCH_ON : MAC_STA_PM_SWITCH_RESET;
353         ret = hmac_config_set_pm_by_module_etc(hmac_vap, MAC_STA_PM_CTRL_TYPE_SDP, pm_switch);
354         if (ret != OAL_SUCC) {
355             oam_warning_log3(0, OAM_SF_CFG, "vap[%d]{hmac_sdp_deinit:hmac_config_set_pm_by_module_etc pm[%d] fail[%d]}",
356                 hmac_vap->vap_id, pm_switch, ret);
357         }
358 #endif
359     }
360 
361     return ret;
362 }
363 
364 /* 填充SDP followup帧除了action头之后的帧体内容 */
hmac_sdp_fill_followup_content(osal_u8 * data_input,const oal_sdp_info * sdp_info,osal_u16 * len)365 OAL_STATIC osal_void hmac_sdp_fill_followup_content(osal_u8 *data_input, const oal_sdp_info *sdp_info, osal_u16 *len)
366 {
367     /* 未发布服务前提供一个默认值 */
368     osal_u8 hash_tmp[SDP_HASH_SERVICE_NAME_LEN] = { 1, 2, 3, 4, 5, 6 };
369     /* Service Control配置0x12:follow-up类型报文,且有Service Info */
370     osal_u8 svc_ctrl = 0x12;
371     osal_u8 index;
372     osal_u16 desc_len;
373     osal_u8 *hash_name = OSAL_NULL;
374     osal_u8 size = (osal_u8)osal_array_size(g_service_info.info);
375     osal_u8 type = OAL_SDP_SERVICE_TYPE_PUBLISH | OAL_SDP_SERVICE_TYPE_GET_PUBLISH;
376     oal_sdp_service *array = g_service_info.info;
377     osal_u8 *data = data_input;
378     hmac_sdp_descriptor_attr attr;
379 
380     for (index = 0; index < size; index++) {
381         if (((array[index].type & type) != 0) && (array[index].local_handle == sdp_info->local_handle)) {
382             hash_name = array[index].name;
383             break;
384         }
385     }
386     if (hash_name == OSAL_NULL) {
387         oam_warning_log1(0, OAM_SF_SDP, "{hmac_sdp_fill_followup_content::no service for handle %d!}",
388             sdp_info->local_handle);
389         hash_name = hash_tmp;
390     }
391 
392     desc_len = sdp_info->len + HMAC_SDP_NO_DATA_LEN;
393     (osal_void)memset_s((osal_void *)&attr, sizeof(attr), 0, sizeof(attr));
394     attr.attr_id = SERVICE_DESCRIPTOR_ATTR_ID;
395     attr.attr_len_low = (osal_u8)desc_len;
396     attr.attr_len_high = (osal_u8)(desc_len >> 8); /* 长度占两个字节,右移8位写第二个字节 */
397     *len = 0;
398     if (memcpy_s(attr.service_name, sizeof(attr.service_name), hash_name, SDP_HASH_SERVICE_NAME_LEN) != EOK) {
399         oam_error_log0(0, OAM_SF_SDP, "hmac_sdp_fill_followup_content::memcpy_s name failed");
400         return;
401     }
402     attr.local_handle = sdp_info->local_handle;
403     attr.peer_handle = sdp_info->peer_handle;
404     attr.svc_ctrl = svc_ctrl;
405     attr.info_len = sdp_info->len;
406     if (memcpy_s(data, sizeof(hmac_sdp_descriptor_attr), &attr, sizeof(hmac_sdp_descriptor_attr)) != EOK) {
407         oam_error_log0(0, OAM_SF_SDP, "hmac_sdp_fill_followup_content::memcpy_s attr failed");
408         return;
409     }
410     data += sizeof(hmac_sdp_descriptor_attr);
411 
412     if (memcpy_s(data, sdp_info->len, sdp_info->data, sdp_info->len) != EOK) {
413         oam_error_log0(0, OAM_SF_SDP, "hmac_sdp_fill_followup_content::memcpy_s data failed");
414         return;
415     }
416     *len = desc_len + MAC_ATTR_HDR_LEN;
417     return;
418 }
419 
420 /* 封装SDP Action帧,包括Publish和Follow up帧类型,is_publish标示是哪种帧 */
hmac_sdp_encap_action(const hmac_vap_stru * hmac_vap,oal_netbuf_stru * mgmt_buf,const oal_sdp_info * sdp_info,osal_u8 is_publish)421 OAL_STATIC osal_u16 hmac_sdp_encap_action(const hmac_vap_stru *hmac_vap, oal_netbuf_stru *mgmt_buf,
422     const oal_sdp_info *sdp_info, osal_u8 is_publish)
423 {
424     /* sdp 帧头格式:Category:0x04,action:0x09,OUI:0x50-6F-9A,OUI Type:0x13 */
425     osal_u8 action_hdr_fixed[] = { 0x4, 0x9, 0x50, 0x6F, 0x9A, 0x13 };
426     osal_u8 mcast_mac[ETH_ALEN] = { 0x51, 0x6F, 0x9A, 0x01, 0x00, 0x00 };
427     osal_u8 bssid[ETH_ALEN] = { 0x50, 0x6F, 0x9A, 0x01, 0xFF, 0x00 };
428     osal_u8 *data = (osal_u8 *)oal_netbuf_header(mgmt_buf);
429     mac_tx_ctl_stru *tx_ctl = (mac_tx_ctl_stru *)oal_netbuf_cb(mgmt_buf);
430     const osal_u8 *dst_mac = OSAL_NULL;
431     sdp_action_header *action_hdr = OSAL_NULL;
432     osal_u8 *payload_addr = OSAL_NULL;
433     osal_u16 content_len = 0;
434 
435     mac_hdr_set_frame_control(data, WLAN_PROTOCOL_VERSION | WLAN_FC0_TYPE_MGT | WLAN_FC0_SUBTYPE_ACTION);
436 
437     /* 设置分片序号为0 */
438     mac_hdr_set_fragment_number(data, 0);
439 
440     /* 设置地址1,对端地址 */
441     dst_mac = (is_publish == OAL_TRUE) ? mcast_mac : sdp_info->name;
442     if (memcpy_s(data + WLAN_HDR_ADDR1_OFFSET, WLAN_MAC_ADDR_LEN, dst_mac, WLAN_MAC_ADDR_LEN) != EOK) {
443         return 0;
444     }
445 
446     /* 设置本端的MAC地址 */
447     if (memcpy_s(data + WLAN_HDR_ADDR2_OFFSET, WLAN_MAC_ADDR_LEN,
448         hmac_vap->mib_info->wlan_mib_sta_config.dot11_station_id, WLAN_MAC_ADDR_LEN) != EOK) {
449         return 0;
450     }
451     /* 地址3, BSSID */
452     if (memcpy_s(data + WLAN_HDR_ADDR3_OFFSET, WLAN_MAC_ADDR_LEN, bssid, WLAN_MAC_ADDR_LEN) != EOK) {
453         return 0;
454     }
455 
456     action_hdr = (sdp_action_header *)(data + MAC_80211_FRAME_LEN); /* 取action帧体 */
457     if (memcpy_s(action_hdr, sizeof(action_hdr_fixed), action_hdr_fixed, sizeof(action_hdr_fixed)) != EOK) {
458         return 0;
459     }
460     payload_addr = (osal_u8 *)(action_hdr + 1);
461 
462     /* 以下为填充SDP除action头之外帧体内容 */
463     hmac_sdp_fill_followup_content(payload_addr, sdp_info, &content_len);
464     if (content_len == 0) {
465         return 0;
466     }
467 
468     /* 计算帧的总长度,设置相关发送配置 */
469     mac_get_cb_frame_header_length(tx_ctl) = MAC_80211_FRAME_LEN;
470     mac_get_cb_tx_user_idx(tx_ctl) = HMAC_SDP_TX_UESR_ID; /* 标识发送完成需要获取user结构体 */
471     tx_ctl->need_rsp = OAL_FALSE;
472     tx_ctl->is_needretry = OAL_FALSE;
473     tx_ctl->ismcast = is_publish;
474     tx_ctl->tpc_code = hal_get_tpc_code();
475     tx_ctl->tpc_code_is_valid = OAL_TRUE;
476     mac_get_cb_mpdu_len(tx_ctl) = MAC_80211_FRAME_LEN + (osal_u8)sizeof(sdp_action_header) + content_len;
477     return mac_get_cb_mpdu_len(tx_ctl);
478 }
479 
480 /* 按照属性ID在报文结构中查找对应属性 */
hmac_sdp_find_attribute(osal_u8 attr_id,osal_u8 * attr_ies_input,osal_u32 len_input)481 OAL_STATIC osal_u8 *hmac_sdp_find_attribute(osal_u8 attr_id, osal_u8 *attr_ies_input, osal_u32 len_input)
482 {
483     osal_u32 len = len_input;
484     osal_u8 *attr_ies = attr_ies_input;
485     if (attr_ies == OSAL_NULL) {
486         return OSAL_NULL;
487     }
488     while (len > MAC_ATTR_HDR_LEN && attr_ies[0] != attr_id) {
489         if (len < (osal_u32)((*(osal_u16 *)&attr_ies[1]) + MAC_ATTR_HDR_LEN)) {
490             break;
491         }
492         len -= (*(osal_u16 *)&attr_ies[1]) + MAC_ATTR_HDR_LEN;
493         attr_ies += (*(osal_u16 *)&attr_ies[1]) + MAC_ATTR_HDR_LEN;
494     }
495     if ((len < MAC_ATTR_HDR_LEN) || (len < (osal_u32)(MAC_ATTR_HDR_LEN + (*(osal_u16 *)&attr_ies[1]))) ||
496         ((len == MAC_ATTR_HDR_LEN) && (attr_ies[0] != attr_id))) {
497         return OSAL_NULL;
498     }
499     return attr_ies;
500 }
501 
502 /* 将底层DMAC接收到的SDP数据信息发送给上层供应用程序解析 */
hmac_sdp_send_data_to_host(const hmac_vap_stru * hmac_vap,const oal_sdp_info * sdp_param)503 OAL_STATIC osal_u32 hmac_sdp_send_data_to_host(const hmac_vap_stru *hmac_vap, const oal_sdp_info *sdp_param)
504 {
505     frw_msg msg_info = {0};
506 
507     msg_info.data = (osal_void *)sdp_param;
508     msg_info.data_len = (osal_u16)OAL_SIZEOF(oal_sdp_info);
509 
510     return (osal_u32)frw_asyn_host_post_msg(WLAN_MSG_H2W_SDP_RX_DATA, FRW_POST_PRI_LOW, hmac_vap->vap_id, &msg_info);
511 }
512 
hmac_sdp_get_publish_local_id(const osal_u8 * name,osal_u8 * local_handle)513 OAL_STATIC osal_u32 hmac_sdp_get_publish_local_id(const osal_u8 *name, osal_u8 *local_handle)
514 {
515     osal_u32 index;
516     oal_sdp_service *array = g_service_info.info;
517     osal_u8 size = (osal_u8)osal_array_size(g_service_info.info);
518 
519     for (index = 0; index < size; index++) {
520         if (((array[index].type & OAL_SDP_SERVICE_TYPE_SUBSCRIBE) != 0) &&
521             (osal_memcmp(array[index].name, name, SDP_HASH_SERVICE_NAME_LEN) == 0)) {
522             array[index].type |= OAL_SDP_SERVICE_TYPE_GET_PUBLISH;
523             *local_handle = array[index].local_handle;
524             return OAL_SUCC;
525         }
526     }
527 
528     return OAL_FAIL;
529 }
530 
531 /* 将收到的followup报文相关信息通知到上层 */
hmac_sdp_send_followup_to_host(const hmac_vap_stru * hmac_vap,oal_sdp_info * sdp_info,osal_u8 * data,osal_u8 len)532 osal_u32 hmac_sdp_send_followup_to_host(const hmac_vap_stru *hmac_vap, oal_sdp_info *sdp_info, osal_u8 *data,
533     osal_u8 len)
534 {
535     osal_u32 ret;
536 
537     /* 此处申请内存注意释放,由wal_sdp_proc_rx_data释放 */
538     sdp_info->data = (osal_u8 *)oal_mem_alloc(OAL_MEM_POOL_ID_LOCAL, len + 1, OAL_TRUE);
539     if (sdp_info->data == OSAL_NULL) {
540         oam_error_log0(0, OAM_SF_SDP, "{hmac_sdp_send_followup_to_host:alloc mem failed!}");
541         return OAL_FAIL;
542     }
543 
544     if (memcpy_s(sdp_info->data, len, data, len) != EOK) {
545         oam_error_log0(0, OAM_SF_SDP, "hmac_sdp_send_followup_to_host:action_hdr memcpy fail.");
546         oal_mem_free(sdp_info->data, OAL_TRUE);
547         return OAL_FAIL;
548     }
549 
550     sdp_info->len = len;
551     sdp_info->data[len] = 0;
552     /* 打印服务名第0,3位,方便定位问题 */
553     oam_info_log2(0, OAM_SF_SDP, "{recv sdp data::peer XX:%d:%d}", sdp_info->name[0], sdp_info->name[3]);
554 
555     ret = hmac_sdp_send_data_to_host(hmac_vap, sdp_info);
556     if (ret != OAL_SUCC) {
557         oal_mem_free(sdp_info->data, OAL_TRUE);
558         sdp_info->data = OSAL_NULL;
559         oam_warning_log0(0, OAM_SF_SDP, "{hmac_sdp_send_followup_to_host::send data to host failed!}");
560         return ret;
561     }
562     return OAL_SUCC;
563 }
564 
hmac_sdp_parse_rx(oal_netbuf_stru * netbuf,oal_sdp_info * sdp_param)565 osal_u8 *hmac_sdp_parse_rx(oal_netbuf_stru *netbuf, oal_sdp_info *sdp_param)
566 {
567     dmac_rx_ctl_stru *rx_ctrl = OSAL_NULL;
568     mac_rx_ctl_stru *rx_info = OSAL_NULL;
569     mac_ieee80211_frame_stru *frame_hdr = OSAL_NULL;
570     sdp_action_header *action_hdr = OSAL_NULL;
571     osal_u8 *data = OSAL_NULL;
572     osal_u8 *desc_attr = OSAL_NULL;
573     osal_u8 sdp_type;
574 
575     if ((netbuf == OSAL_NULL) || (sdp_param == OSAL_NULL)) {
576         oam_error_log0(0, OAM_SF_SDP, "hmac_sdp_parse_rx:parameter NULL.");
577         return OSAL_NULL;
578     }
579 
580     /* 获取帧头和帧体指针 */
581     rx_ctrl = (dmac_rx_ctl_stru *)oal_netbuf_cb(netbuf);
582     rx_info = (mac_rx_ctl_stru *)(&(rx_ctrl->rx_info));
583     frame_hdr = (mac_ieee80211_frame_stru *)(uintptr_t)mac_get_rx_cb_mac_header_addr(rx_info);
584     data = (osal_u8 *)frame_hdr + rx_info->mac_header_len;
585     action_hdr = (sdp_action_header *)data;
586     desc_attr = hmac_sdp_find_attribute(SERVICE_DESCRIPTOR_ATTR_ID, (osal_u8 *)(action_hdr + 1),
587         (rx_info->frame_len - rx_info->mac_header_len - sizeof(sdp_action_header)));
588     if (desc_attr == OSAL_NULL) {
589         oam_warning_log0(0, OAM_SF_SDP, "hmac_sdp_parse_rx:frame received has no service descriptor!");
590         return OSAL_NULL;
591     }
592 
593     desc_attr += MAC_ATTR_HDR_LEN;
594     sdp_param->peer_handle = desc_attr[HMAC_SDP_POS_PEER_HANDLE];
595     sdp_param->local_handle = desc_attr[HMAC_SDP_POS_LOCAL_HANDLE];
596     sdp_type = desc_attr[HMAC_SDP_POS_TYPE] & HMAC_SDP_TYPE_MASK;
597 
598     /* 此处name临时用来保存publish报文的源mac地址, 从结构体成员定义来看是保存服务号的 */
599     if (memcpy_s(sdp_param->name, sizeof(sdp_param->name), frame_hdr->address2, ETH_ALEN) != EOK) {
600         oam_error_log0(0, OAM_SF_SDP, "hmac_sdp_parse_rx:address2 memcpy fail.");
601         return OSAL_NULL;
602     }
603     /* 接收到publish报文,获取local id */
604     if (sdp_type == HMAC_SDP_TYPE_PUBLISH) {
605         if (hmac_sdp_get_publish_local_id(desc_attr, &sdp_param->local_handle) != OAL_SUCC) {
606             oam_warning_log1(0, OAM_SF_SDP, "hmac_sdp_parse_rx:can not get publish id name[0]=%02x!", desc_attr[0]);
607             return OSAL_NULL;
608         }
609         oam_info_log2(0, OAM_SF_SDP, "hmac_sdp_rx_publish peer_handle=%d, local_handle=%d", sdp_param->peer_handle,
610             sdp_param->local_handle);
611     } else if (sdp_type == HMAC_SDP_TYPE_FOLLOWUP) {
612         oam_info_log2(0, OAM_SF_SDP, "hmac_sdp_rx_follow peer_handle=%d, local_handle=%d", sdp_param->peer_handle,
613             sdp_param->local_handle);
614     }
615     return desc_attr;
616 }
617 
618 /* 发送SDP数据帧给对端,封装在Follow up报文中 */
hmac_sdp_send_data(hmac_vap_stru * hmac_vap,frw_msg * msg)619 osal_s32 hmac_sdp_send_data(hmac_vap_stru *hmac_vap, frw_msg *msg)
620 {
621     oal_netbuf_stru *netbuf = OSAL_NULL;
622     oal_sdp_info *tmp = (oal_sdp_info *)msg->data;
623     osal_u32 ret;
624     osal_u16 mgmt_len;
625 
626     if ((hmac_vap == OSAL_NULL) || (hmac_sdp_is_init() != OAL_TRUE)) {
627         return OAL_FAIL;
628     }
629 
630     /* 申请管理帧内存 */
631     netbuf = OAL_MEM_NETBUF_ALLOC(OAL_MGMT_NETBUF, WLAN_MGMT_NETBUF_SIZE, OAL_NETBUF_PRIORITY_HIGH);
632     if (netbuf == OSAL_NULL) {
633         oam_warning_log0(0, OAM_SF_SDP, "{hmac_sdp_send_data::alloc netbuf failed.}");
634         oal_mem_free(tmp->data, OAL_TRUE);
635         return OAL_ERR_CODE_PTR_NULL;
636     }
637 
638     oal_set_netbuf_prev(netbuf, OSAL_NULL);
639     oal_set_netbuf_next(netbuf, OSAL_NULL);
640     if (memset_s(oal_netbuf_cb(netbuf), OAL_NETBUF_CB_SIZE(), 0, OAL_NETBUF_CB_SIZE()) != EOK) {
641         hmac_dft_print_drop_frame_info(THIS_FILE_ID, __LINE__, 1, OSAL_NULL);
642         oal_netbuf_free(netbuf);
643         oal_mem_free(tmp->data, OAL_TRUE);
644         return OAL_FAIL;
645     }
646 
647     /* 封装Action帧 */
648     mgmt_len = hmac_sdp_encap_action(hmac_vap, netbuf, tmp, OAL_FALSE);
649     if (mgmt_len == 0) {
650         hmac_dft_print_drop_frame_info(THIS_FILE_ID, __LINE__, 1, OSAL_NULL);
651         oal_netbuf_free(netbuf);
652         oam_warning_log0(0, OAM_SF_SDP, "{hmac_sdp_send_data::action frame len is 0.}");
653         oal_mem_free(tmp->data, OAL_TRUE);
654         return OAL_FAIL;
655     }
656 
657     /* 释放用户侧数据内存 */
658     oal_mem_free(tmp->data, OAL_TRUE);
659     oal_netbuf_put(netbuf, (osal_u32)mgmt_len);
660 
661     /* 调用发送管理帧接口 */
662     ret = hmac_tx_mgmt_send_event_etc(hmac_vap, netbuf, mgmt_len);
663     if (ret != OAL_SUCC) {
664         oal_netbuf_free(netbuf);
665         oam_warning_log1(0, OAM_SF_SDP, "{hmac_sdp_send_data::hmac_tx_mgmt_send_event failed[%d].}", ret);
666         return (osal_s32)ret;
667     }
668 
669     return OAL_SUCC;
670 }
671 
672 /* 通过传入的Action帧的前六个字节特征,判断是不是SDP类型帧 */
hmac_is_sdp_frame(oal_netbuf_stru * netbuf)673 osal_u8 hmac_is_sdp_frame(oal_netbuf_stru *netbuf)
674 {
675     dmac_rx_ctl_stru *rx_ctrl = OSAL_NULL;
676     mac_rx_ctl_stru *rx_info = OSAL_NULL;
677     mac_ieee80211_frame_stru *frame_hdr = OSAL_NULL;
678     osal_u8 *data = OSAL_NULL;
679     /* sdp 帧头格式:Category:0x04,action:0x09,OUI:0x50-6F-9A,OUI Type:0x13 */
680     osal_u8 auc_value[] = { 0x4, 0x9, 0x50, 0x6F, 0x9A, 0x13 };
681     osal_u16 len;
682 
683     if ((netbuf == OSAL_NULL) || (hmac_sdp_is_init() != OAL_TRUE)) {
684         return OAL_FALSE;
685     }
686 
687     rx_ctrl = (dmac_rx_ctl_stru *)oal_netbuf_cb(netbuf);
688     rx_info = (mac_rx_ctl_stru *)(&(rx_ctrl->rx_info));
689     frame_hdr = (mac_ieee80211_frame_stru *)(uintptr_t)mac_get_rx_cb_mac_hdr(rx_info);
690     data = oal_netbuf_rx_data(netbuf);
691     len = rx_info->frame_len - rx_info->mac_header_len;
692 
693     if ((data == OSAL_NULL) || (len < sizeof(auc_value))) {
694         return OAL_FALSE;
695     }
696     if ((frame_hdr->frame_control.type != WLAN_MANAGEMENT) ||
697         (frame_hdr->frame_control.sub_type != WLAN_ACTION)) {
698         return OAL_FALSE;
699     }
700 
701     if (osal_memcmp(data, auc_value, sizeof(auc_value)) == 0) {
702         return OAL_TRUE;
703     }
704     return OAL_FALSE;
705 }
706 
hmac_sdp_get_service_info(osal_void)707 const hmac_sdp_service_info *hmac_sdp_get_service_info(osal_void)
708 {
709     return &g_service_info;
710 }
711 
712 #ifdef _PRE_WLAN_SUPPORT_CCPRIV_CMD
hmac_ccpriv_sdp_srt_to_hex(const osal_s8 * param,osal_u8 len,osal_u8 * value)713 OAL_STATIC osal_void hmac_ccpriv_sdp_srt_to_hex(const osal_s8 *param, osal_u8 len, osal_u8 *value)
714 {
715     osal_u8 index;
716 
717     for (index = 0; index < len; index++) {
718         /* 每2位字符转为一个十六进制,第一位乘以16 */
719         value[index / 2] = (osal_u8)(value[index / 2] * 16 * (index % 2) + oal_strtohex(param));
720         param++;
721     }
722 }
723 
hmac_ccpriv_sdp_init(hmac_vap_stru * hmac_vap,const osal_s8 * param)724 OAL_STATIC osal_s32 hmac_ccpriv_sdp_init(hmac_vap_stru *hmac_vap, const osal_s8 *param)
725 {
726     osal_u8 tmp;
727     osal_s8 name[CCPRIV_CMD_NAME_MAX_LEN] = {0};
728     osal_s32 ret;
729     frw_msg msg;
730 
731     (osal_void)memset_s(&msg, OAL_SIZEOF(msg), 0, OAL_SIZEOF(msg));
732 
733     /* sdp初始化命令: ccpriv "wlan0 sdp_enable 0 | 1 ",此处将解析出"0"或"1"存入name */
734     ret = hmac_ccpriv_get_one_arg(&param, name, OAL_SIZEOF(name));
735     if (ret != OAL_SUCC) {
736         oam_warning_log1(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_init::hmac_ccpriv_get_one_arg return err_code %d!}", ret);
737         return ret;
738     }
739 
740     /* 针对解析出的不同命令,配置不同的通道 */
741     if ((osal_adapt_strncmp("0", (const char *)name, CCPRIV_CMD_NAME_MAX_LEN)) == 0) {
742         tmp = WAL_SDP_DISABLE;
743     } else if ((osal_adapt_strncmp("1", (const char *)name, CCPRIV_CMD_NAME_MAX_LEN)) == 0) {
744         tmp = WAL_SDP_ENABLE;
745     } else if ((osal_adapt_strncmp("2", (const char *)name, CCPRIV_CMD_NAME_MAX_LEN)) == 0) {
746         tmp = WAL_SDP_EN_SC;
747     } else {
748         oam_warning_log0(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_init::the sdp init command is error}");
749         return OAL_ERR_CODE_INVALID_CONFIG;
750     }
751 
752     msg.data = &tmp;
753     ret = hmac_sdp_init_enable(hmac_vap, &msg);
754     if (OAL_UNLIKELY(ret != OAL_SUCC)) {
755         oam_warning_log1(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_init::return err code %d!}", ret);
756         return ret;
757     }
758 
759     return OAL_SUCC;
760 }
761 
hmac_ccpriv_sdp_start_func(hmac_vap_stru * hmac_vap,const osal_s8 * param,osal_u8 type)762 OAL_STATIC osal_s32 hmac_ccpriv_sdp_start_func(hmac_vap_stru *hmac_vap, const osal_s8 *param, osal_u8 type)
763 {
764     osal_s8 name[WAL_CCPRIV_CMD_NAME_MAX_LEN] = {0};
765     osal_s32 ret;
766     frw_msg msg;
767     oal_sdp_service *service_para = OAL_PTR_NULL;
768     oal_sdp_service service_info;
769     (osal_void)memset_s(&service_info, OAL_SIZEOF(service_info), 0, OAL_SIZEOF(service_info));
770     service_para = &service_info;
771 
772     /*
773      * sdp发布服务命令:ccpriv "wlan0 sdp_start_publish service_name local_handle"
774      * sdp订阅服务命令:ccpriv "wlan0 sdp_start_subscribe service_name local_handle"
775      */
776     ret = hmac_ccpriv_get_one_arg(&param, name, WAL_CCPRIV_CMD_NAME_MAX_LEN);
777     /* 传入的是十六进制字符,长度为name真实长度的2倍 */
778     if ((ret != OAL_SUCC) || (osal_strlen((const char *)name) != SDP_HASH_SERVICE_NAME_LEN * 2)) {
779         oam_warning_log2(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_start_func::err_code %d!, len(name):%d}", ret,
780             osal_strlen((const char *)name));
781         return OAL_FAIL;
782     }
783     hmac_ccpriv_sdp_srt_to_hex((const osal_s8 *)name,
784         (osal_u8)osal_strlen((const char *)name), (osal_u8 *)service_para->name);
785 
786     ret = hmac_ccpriv_get_one_arg(&param, name, WAL_CCPRIV_CMD_NAME_MAX_LEN);
787     if (ret != OAL_SUCC) {
788         oam_warning_log1(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_start_func::hmac_ccpriv_get_one_arg return err_code %d!}",
789                          ret);
790         return ret;
791     }
792     service_para->local_handle = (osal_u8)oal_atoi((const osal_s8 *)name);
793     if (service_para->local_handle == 0) {
794         oam_error_log0(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_start_func:local_handle is 0!}");
795         return OAL_FAIL;
796     }
797     service_para->type = type;
798     msg.data = (osal_u8 *)&service_info;
799 
800     ret = hmac_sdp_start_subscribe(hmac_vap, &msg);
801     if (OAL_UNLIKELY(ret != OAL_SUCC)) {
802         oam_warning_log1(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_start_func::return err code %d!}", ret);
803         return ret;
804     }
805 
806     return OAL_SUCC;
807 }
808 
809 
hmac_ccpriv_sdp_start_subscribe(hmac_vap_stru * hmac_vap,const osal_s8 * param)810 OAL_STATIC osal_s32 hmac_ccpriv_sdp_start_subscribe(hmac_vap_stru *hmac_vap, const osal_s8 *param)
811 {
812     return hmac_ccpriv_sdp_start_func(hmac_vap, param, OAL_SDP_SERVICE_TYPE_SUBSCRIBE);
813 }
814 
hmac_ccpriv_sdp_cancle_func(hmac_vap_stru * hmac_vap,const osal_s8 * param)815 OAL_STATIC osal_s32 hmac_ccpriv_sdp_cancle_func(hmac_vap_stru *hmac_vap, const osal_s8 *param)
816 {
817     osal_u8 local_handle;
818     osal_s8 name[CCPRIV_CMD_NAME_MAX_LEN] = {0};
819     osal_s32 ret;
820     frw_msg msg;
821 
822     /*
823      * sdp取消订阅命令:ccpriv "wlan0 sdp_cancle_subscribe local_handle "
824      * sdp取消发布命令:ccpriv "wlan0 sdp_cancle_publish local_handle "
825      */
826     ret = hmac_ccpriv_get_one_arg(&param, name, OAL_SIZEOF(name));
827     if (ret != OAL_SUCC) {
828         oam_warning_log1(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_cancle_func::hmac_ccpriv_get_one_arg return err_code %d!}",
829                          ret);
830         return ret;
831     }
832     local_handle = (osal_u8)oal_atoi((const osal_s8 *)name);
833     if (local_handle == 0) {
834         oam_error_log0(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_cancle_func:local_handle is 0!}");
835         return OAL_FAIL;
836     }
837 
838     msg.data = (osal_u8 *)&local_handle;
839     ret = hmac_sdp_cancel_subscribe(hmac_vap, &msg);
840     if (OAL_UNLIKELY(ret != OAL_SUCC)) {
841         oam_warning_log1(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_cancle_func::return err code %d!}", ret);
842         return ret;
843     }
844 
845     return OAL_SUCC;
846 }
847 
hmac_ccpriv_sdp_parse_info(const osal_s8 ** src_head,oal_sdp_info * sdp_param)848 OAL_STATIC osal_s32 hmac_ccpriv_sdp_parse_info(const osal_s8 **src_head, oal_sdp_info *sdp_param)
849 {
850     osal_s8 name[CCPRIV_CMD_NAME_MAX_LEN] = {0};
851     osal_s32 ret;
852     const osal_s8 *param = *src_head;
853 
854     ret = hmac_ccpriv_get_one_arg(&param, name, OAL_SIZEOF(name));
855     /* 传入的是十六进制字符,长度为name真实长度的2倍 */
856     if ((ret != OAL_SUCC) || (osal_strlen((const char *)name) != SDP_HASH_SERVICE_NAME_LEN * 2)) {
857         oam_warning_log2(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_parse_info::err_code %d!, osal_strlen(name):%d}", ret,
858                          osal_strlen((const char *)name));
859         return OAL_FAIL;
860     }
861     hmac_ccpriv_sdp_srt_to_hex((const osal_s8 *)name,
862         (osal_u8)osal_strlen((const char *)name), (osal_u8 *)sdp_param->name);
863 
864     ret = hmac_ccpriv_get_one_arg(&param, name, OAL_SIZEOF(name));
865     if (ret != OAL_SUCC) {
866         oam_warning_log1(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_parse_info::hmac_ccpriv_get_one_arg return err_code %d!}",
867                          ret);
868         return ret;
869     }
870     sdp_param->local_handle = (osal_u8)oal_atoi((const osal_s8 *)name);
871 
872     ret = hmac_ccpriv_get_one_arg(&param, name, OAL_SIZEOF(name));
873     if (ret != OAL_SUCC) {
874         oam_warning_log1(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_parse_info::hmac_ccpriv_get_one_arg return err_code %d!}",
875                          ret);
876         return ret;
877     }
878     sdp_param->peer_handle = (osal_u8)oal_atoi((const osal_s8 *)name);
879 
880     ret = hmac_ccpriv_get_one_arg(&param, name, OAL_SIZEOF(name));
881     if (ret != OAL_SUCC) {
882         oam_warning_log1(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_parse_info::hmac_ccpriv_get_one_arg return err_code %d!}",
883                          ret);
884         return ret;
885     }
886     sdp_param->len = (osal_u8)oal_atoi((const osal_s8 *)name);
887 
888     /* 校验合法性,命令输入的是十六进制字符,data长度不能超过命令最大长度的2分之一 */
889     if ((sdp_param->len == 0) || (sdp_param->len >= CCPRIV_CMD_NAME_MAX_LEN / 2) ||
890         (sdp_param->local_handle == 0) || (sdp_param->peer_handle == 0)) {
891         oam_warning_log3(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_parse_info:: len:[%d],local_handle[%d],peer_handle[%d]!}",
892                          sdp_param->len, sdp_param->local_handle, sdp_param->peer_handle);
893         return OAL_FAIL;
894     }
895     *src_head = param;
896 
897     return OAL_SUCC;
898 }
899 
hmac_ccpriv_sdp_send_data(hmac_vap_stru * hmac_vap,const osal_s8 * param)900 OAL_STATIC osal_s32 hmac_ccpriv_sdp_send_data(hmac_vap_stru *hmac_vap, const osal_s8 *param)
901 {
902     osal_s8 name[CCPRIV_CMD_NAME_MAX_LEN] = {0};
903     osal_s32 ret;
904     oal_sdp_info *sdp_param = OAL_PTR_NULL;
905     oal_sdp_info sdp_info;
906     frw_msg msg;
907     (osal_void)memset_s(&sdp_info, OAL_SIZEOF(sdp_info), 0, OAL_SIZEOF(sdp_info));
908     sdp_param = &sdp_info;
909 
910     /* sdp发送数据命令: ccpriv "wlan0 sdp_send_data peer_mac local_handle peer_handle len data" */
911     ret = hmac_ccpriv_sdp_parse_info(&param, sdp_param);
912     if (ret != OAL_SUCC) {
913         oam_warning_log1(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_send_data::hmac_ccpriv_sdp_parse_info return err_code %d!}",
914                          ret);
915         return ret;
916     }
917     ret = hmac_ccpriv_get_one_arg(&param, name, OAL_SIZEOF(name));
918     /* 命令输入的是十六进制字符,长度为data真实长度的2倍 */
919     if ((ret != OAL_SUCC) || (osal_strlen((const char *)name) != sdp_param->len * 2)) {
920         oam_warning_log2(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_send_data::err_code %d!, osal_strlen(name):%d}", ret,
921                          osal_strlen((const char *)name));
922         return OAL_FAIL;
923     }
924     /*
925      * 申请内存存放用户信息,将内存指针作为事件payload抛下去
926      * 此处申请的内存在事件处理函数释放(hmac_sdp_send_data)
927      */
928     sdp_param->data = oal_mem_alloc(OAL_MEM_POOL_ID_LOCAL, sdp_param->len, OAL_TRUE);
929     if (sdp_param->data == OAL_PTR_NULL) {
930         oam_error_log1(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_send_data::alloc data fail(size:%u), return null ptr!}",
931                        sdp_param->len);
932         return OAL_ERR_CODE_ALLOC_MEM_FAIL;
933     }
934     (osal_void)memset_s(sdp_param->data, sdp_param->len, 0, sdp_param->len);
935     hmac_ccpriv_sdp_srt_to_hex((const osal_s8 *)name, (osal_u8)osal_strlen((const char *)name), sdp_param->data);
936     msg.data = (osal_u8 *)&sdp_info;
937 
938     ret = hmac_sdp_send_data(hmac_vap, &msg);
939     if (OAL_UNLIKELY(ret != OAL_SUCC)) {
940         oal_mem_free(sdp_param->data, OAL_TRUE);
941         oam_warning_log1(0, OAM_SF_SDP, "{hmac_ccpriv_sdp_send_data::return err code %d!}", ret);
942         return ret;
943     }
944 
945     return OAL_SUCC;
946 }
947 
hmac_ccpriv_sdp_dw_prd_time_cfg(hmac_vap_stru * hmac_vap,const osal_s8 * param)948 OAL_STATIC osal_s32 hmac_ccpriv_sdp_dw_prd_time_cfg(hmac_vap_stru *hmac_vap, const osal_s8 *param)
949 {
950     /* 待实现 */
951     unref_param(hmac_vap);
952     unref_param(param);
953     return OAL_SUCC;
954 }
955 #endif
956 
hmac_sdp_feature_hook_register(osal_void)957 osal_void hmac_sdp_feature_hook_register(osal_void)
958 {
959     /* 注册对外接口 */
960     hmac_feature_hook_register(HMAC_FHOOK_SDP_IS_INIT, hmac_sdp_is_init);
961     hmac_feature_hook_register(HMAC_FHOOK_IS_SDP_FRAME, hmac_is_sdp_frame);
962     hmac_feature_hook_register(HMAC_FHOOK_SDP_PROC_RX_MGMT, hmac_sdp_proc_rx_mgmt);
963     return;
964 }
965 
hmac_sdp_feature_hook_unregister(osal_void)966 osal_void hmac_sdp_feature_hook_unregister(osal_void)
967 {
968     /* 去注册对外接口 */
969     hmac_feature_hook_unregister(HMAC_FHOOK_SDP_IS_INIT);
970     hmac_feature_hook_unregister(HMAC_FHOOK_IS_SDP_FRAME);
971     hmac_feature_hook_unregister(HMAC_FHOOK_SDP_PROC_RX_MGMT);
972     return;
973 }
974 
hmac_sdp_msg_init(osal_void)975 osal_u32 hmac_sdp_msg_init(osal_void)
976 {
977 #ifdef _PRE_WLAN_SUPPORT_CCPRIV_CMD
978     /* ccpriv命令注册 */
979     hmac_ccpriv_register((const osal_s8 *)"sdp_enable", hmac_ccpriv_sdp_init);
980     hmac_ccpriv_register((const osal_s8 *)"sdp_start_subscribe", hmac_ccpriv_sdp_start_subscribe);
981     hmac_ccpriv_register((const osal_s8 *)"sdp_cancle_subscribe", hmac_ccpriv_sdp_cancle_func);
982     hmac_ccpriv_register((const osal_s8 *)"sdp_send_data", hmac_ccpriv_sdp_send_data);
983     hmac_ccpriv_register((const osal_s8 *)"sdp_dw_prd_time_cfg", hmac_ccpriv_sdp_dw_prd_time_cfg);
984 #endif
985 
986     /* 消息注册 */
987     frw_msg_hook_register(WLAN_MSG_W2H_CFG_SDP_START_SUBSCRIBE, hmac_sdp_start_subscribe);
988     frw_msg_hook_register(WLAN_MSG_W2H_CFG_SDP_CANCEL_SUBSCRIBE, hmac_sdp_cancel_subscribe);
989     frw_msg_hook_register(WLAN_MSG_W2H_CFG_SDP_DW_PRD_TIME_CFG, hmac_sdp_dw_prd_time_cfg);
990     frw_msg_hook_register(WLAN_MSG_W2H_CFG_SDP_INIT, hmac_sdp_init_enable);
991     frw_msg_hook_register(WLAN_MSG_W2H_CFG_SDP_SEND_DATA, hmac_sdp_send_data);
992     frw_msg_hook_register(WLAN_MSG_W2H_CFG_SDP_TEST_SYNC_PRIVATE, hmac_sdp_test);
993     return OAL_SUCC;
994 }
995 
hmac_sdp_msg_deinit(osal_void)996 osal_void hmac_sdp_msg_deinit(osal_void)
997 {
998 #ifdef _PRE_WLAN_SUPPORT_CCPRIV_CMD
999     /* ccpriv命令去注册 */
1000     hmac_ccpriv_unregister((const osal_s8 *)"sdp_enable");
1001     hmac_ccpriv_unregister((const osal_s8 *)"sdp_start_subscribe");
1002     hmac_ccpriv_unregister((const osal_s8 *)"sdp_cancle_subscribe");
1003     hmac_ccpriv_unregister((const osal_s8 *)"sdp_send_data");
1004     hmac_ccpriv_unregister((const osal_s8 *)"sdp_dw_prd_time_cfg");
1005 #endif
1006 
1007     /* 消息去注册 */
1008     frw_msg_hook_unregister(WLAN_MSG_W2H_CFG_SDP_START_SUBSCRIBE);
1009     frw_msg_hook_unregister(WLAN_MSG_W2H_CFG_SDP_CANCEL_SUBSCRIBE);
1010     frw_msg_hook_unregister(WLAN_MSG_W2H_CFG_SDP_DW_PRD_TIME_CFG);
1011     frw_msg_hook_unregister(WLAN_MSG_W2H_CFG_SDP_INIT);
1012     frw_msg_hook_unregister(WLAN_MSG_W2H_CFG_SDP_SEND_DATA);
1013     frw_msg_hook_unregister(WLAN_MSG_W2H_CFG_SDP_TEST_SYNC_PRIVATE);
1014     return;
1015 }
1016 
1017 #ifdef __cplusplus
1018 #if __cplusplus
1019 }
1020 #endif
1021 #endif
1022 
1023