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(¶m, 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(¶m, 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(¶m, 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(¶m, 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(¶m, 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(¶m, 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(¶m, 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(¶m, 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(¶m, 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(¶m, 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