1 /*
2 * Copyright (C) 2021 Huawei Device Co., Ltd.
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 */
15
16 #include <stdint.h>
17
18 #include "hci/hci.h"
19
20 #include "btm_snoop_filter.h"
21
22 typedef struct {
23 BtmFilterFunc cmdFunc;
24 uint16_t cmdDataOffset;
25 BtmFilterFunc completeFunc;
26 uint16_t completeEvtDataOffset;
27 } HciCommandFilterFunc;
28
29 #pragma pack(1)
30 typedef struct {
31 uint16_t opCode;
32 uint8_t parameterTotalLength;
33 } BtmHciCmdHeader;
34 typedef struct {
35 uint8_t eventCode;
36 uint8_t parameterTotalLength;
37 } HciEventHeader;
38 #pragma pack()
39
HciCommonFilterAddress(uint8_t * param)40 static void HciCommonFilterAddress(uint8_t *param)
41 {
42 BtmFilterAddress(param, BT_ADDRESS_SIZE);
43 }
44
45 static const HciCommandFilterFunc G_LINK_CONTROL_FILTER_FUNC_MAP[HCI_LINK_CONTROL_COMMAND_MAX_NUM + 1] = {
46 {NULL, 0, NULL, 0},
47 {NULL, 0, NULL, 0},
48 {NULL, 0, NULL, 0},
49 {NULL, 0, NULL, 0},
50 {NULL, 0, NULL, 0},
51 {HciCommonFilterAddress, offsetof(HciCreateConnectionParam, bdAddr), NULL, 0},
52 {NULL, 0, NULL, 0},
53 {NULL, 0, NULL, 0},
54 {
55 HciCommonFilterAddress,
56 offsetof(HciCreateConnectionCancelParam, bdAddr),
57 HciCommonFilterAddress,
58 offsetof(HciCreateConnectionCancelReturnParam, bdAddr),
59 },
60 {HciCommonFilterAddress, offsetof(HciAcceptConnectionReqestParam, bdAddr), NULL, 0},
61 {HciCommonFilterAddress, offsetof(HciRejectConnectionRequestParam, bdAddr), NULL, 0},
62 {
63 HciCommonFilterAddress,
64 offsetof(HciLinkKeyRequestReplyParam, bdAddr),
65 HciCommonFilterAddress,
66 offsetof(HciLinkKeyRequestReplyReturnParam, bdAddr),
67 },
68 {
69 HciCommonFilterAddress,
70 offsetof(HciLinkKeyRequestNegativeReplyParam, bdAddr),
71 HciCommonFilterAddress,
72 offsetof(HciLinkKeyRequestNegativeReplyReturnParam, bdAddr),
73 },
74 {
75 HciCommonFilterAddress,
76 offsetof(HciPinCodeRequestReplyParam, bdAddr),
77 HciCommonFilterAddress,
78 offsetof(HciPinCodeRequestReplyReturnParam, bdAddr),
79 },
80 {
81 HciCommonFilterAddress,
82 offsetof(HciPinCodeRequestNegativeReplyParam, bdAddr),
83 HciCommonFilterAddress,
84 offsetof(HciPinCodeRequestNegativeReplyReturnParam, bdAddr),
85 },
86 {NULL, 0, NULL, 0},
87 {NULL, 0, NULL, 0},
88 {NULL, 0, NULL, 0},
89 {NULL, 0, NULL, 0},
90 {NULL, 0, NULL, 0},
91 {NULL, 0, NULL, 0},
92 {NULL, 0, NULL, 0},
93 {NULL, 0, NULL, 0},
94 {NULL, 0, NULL, 0},
95 {NULL, 0, NULL, 0},
96 {HciCommonFilterAddress, offsetof(HciRemoteNameRequestParam, addr), NULL, 0},
97 {
98 HciCommonFilterAddress,
99 offsetof(HciRemoteNameRequestCancelParam, addr),
100 HciCommonFilterAddress,
101 offsetof(HciRemoteNameRequestCancelReturnParam, addr),
102 },
103 {NULL, 0, NULL, 0},
104 {NULL, 0, NULL, 0},
105 {NULL, 0, NULL, 0},
106 {NULL, 0, NULL, 0},
107 {NULL, 0, NULL, 0},
108 {NULL, 0, NULL, 0},
109 {NULL, 0, NULL, 0},
110 {NULL, 0, NULL, 0},
111 {NULL, 0, NULL, 0},
112 {NULL, 0, NULL, 0},
113 {NULL, 0, NULL, 0},
114 {NULL, 0, NULL, 0},
115 {NULL, 0, NULL, 0},
116 {NULL, 0, NULL, 0},
117 {HciCommonFilterAddress, offsetof(HciAcceptSynchronousConnectionRequestParam, addr), NULL, 0},
118 {HciCommonFilterAddress, offsetof(HciRejectSynchronousConnectionRequestParam, bdAddr), NULL, 0},
119 {
120 HciCommonFilterAddress,
121 offsetof(HciIOCapabilityRequestReplyParam, bdAddr),
122 HciCommonFilterAddress,
123 offsetof(HciIOCapabilityRequestReplyReturnParam, bdAddr),
124 },
125 {
126 HciCommonFilterAddress,
127 offsetof(HciUserConfirmationRequestReplyParam, bdAddr),
128 HciCommonFilterAddress,
129 offsetof(HciUserConfirmationRequestReplyReturnParam, bdAddr),
130 },
131 {
132 HciCommonFilterAddress,
133 offsetof(HciUserConfirmationRequestNegativeReplyParam, bdAddr),
134 HciCommonFilterAddress,
135 offsetof(HciUserConfirmationRequestNegativeReplyReturnParam, bdAddr),
136 },
137 {
138 HciCommonFilterAddress,
139 offsetof(HciUserPasskeyRequestReplyParam, bdAddr),
140 HciCommonFilterAddress,
141 offsetof(HciUserPasskeyRequestReplyReturnParam, bdAddr),
142 },
143 {
144 HciCommonFilterAddress,
145 offsetof(HciUserPasskeyRequestNegativeReplyParam, bdAddr),
146 HciCommonFilterAddress,
147 offsetof(HciUserPasskeyRequestNegativeReplyReturnParam, bdAddr),
148 },
149 {
150 HciCommonFilterAddress,
151 offsetof(HciRemoteOobDataRequestReplyParam, bdAddr),
152 HciCommonFilterAddress,
153 offsetof(HciRemoteOobDataRequestReplyReturnParam, bdAddr),
154 },
155 {NULL, 0, NULL, 0},
156 {NULL, 0, NULL, 0},
157 {
158 HciCommonFilterAddress,
159 offsetof(HciRemoteOobDataRequestNegativeReplyParam, bdAddr),
160 HciCommonFilterAddress,
161 offsetof(HciRemoteOobDataRequestNegativeReplyReturnParam, bdAddr),
162 },
163 {
164 HciCommonFilterAddress,
165 offsetof(HciIoCapabilityRequestNegativeReplyParam, bdAddr),
166 HciCommonFilterAddress,
167 offsetof(HciIoCapabilityRequestNegativeReplyReturnParam, bdAddr),
168 },
169 {NULL, 0, NULL, 0},
170 {NULL, 0, NULL, 0},
171 {NULL, 0, NULL, 0},
172 {NULL, 0, NULL, 0},
173 {NULL, 0, NULL, 0},
174 {NULL, 0, NULL, 0},
175 {NULL, 0, NULL, 0},
176 {NULL, 0, NULL, 0},
177 {NULL, 0, NULL, 0},
178 {HciCommonFilterAddress, offsetof(HciEnhancedAcceptSynchronousConnectionRequestParam, bdAddr), NULL, 0},
179 {HciCommonFilterAddress, offsetof(HciTruncatedPageParam, bdAddr), NULL, 0},
180 {
181 HciCommonFilterAddress,
182 offsetof(HciTruncatedPageCancelParam, bdAddr),
183 HciCommonFilterAddress,
184 offsetof(HciTruncatedPageCancelReturnParam, bdAddr),
185 },
186 {NULL, 0, NULL, 0},
187 {
188 HciCommonFilterAddress,
189 offsetof(HciSetConnectionlessSlaveBroadcastReceiveParam, bdAddr),
190 HciCommonFilterAddress,
191 offsetof(HciSetConnectionlessSlaveBroadcastReceiveReturnParam, bdAddr),
192 },
193 {NULL, 0, NULL, 0},
194 {HciCommonFilterAddress, offsetof(HciReceiveSynchronizationTrainParam, bdAddr), NULL, 0},
195 {
196 HciCommonFilterAddress,
197 offsetof(HciRemoteOobExtendedDataRequestReplyParam, bdAddr),
198 HciCommonFilterAddress,
199 offsetof(HciRemoteOobExtendedDataRequestReplyReturnParam, bdAddr),
200 },
201 };
202
203 static const HciCommandFilterFunc G_LINK_POLICY_FILTER_FUNC_MAP[HCI_LINK_POLICY_COMMAND_MAX_NUM + 1] = {
204 {NULL, 0, NULL, 0},
205 {NULL, 0, NULL, 0},
206 {NULL, 0, NULL, 0},
207 {NULL, 0, NULL, 0},
208 {NULL, 0, NULL, 0},
209 {NULL, 0, NULL, 0},
210 {NULL, 0, NULL, 0},
211 {NULL, 0, NULL, 0},
212 {NULL, 0, NULL, 0},
213 {NULL, 0, NULL, 0},
214 {NULL, 0, NULL, 0},
215 {NULL, 0, NULL, 0},
216 {NULL, 0, NULL, 0},
217 {NULL, 0, NULL, 0},
218 {NULL, 0, NULL, 0},
219 {NULL, 0, NULL, 0},
220 {NULL, 0, NULL, 0},
221 {HciCommonFilterAddress, offsetof(HciSwitchRoleParam, bdAddr), NULL, 0},
222 };
223
HciWriteStoredLinkKeyCmdFilter(uint8_t * param)224 static void HciWriteStoredLinkKeyCmdFilter(uint8_t *param)
225 {
226 uint16_t offset = 0;
227 uint8_t *numKeysToWrite = param + offset;
228 offset += sizeof(uint8_t);
229
230 for (int ii = 0; ii < *numKeysToWrite; ii++) {
231 BtmFilterAddress(param + offset, BT_ADDRESS_SIZE);
232 offset += sizeof(HciBdAddr) + LINK_KEY_SIZE;
233 }
234 }
235
236 static const HciCommandFilterFunc
237 G_CONTROLLER_AND_BASEBAND_FILTER_FUNC_MAP[HCI_CONTTOLLER_AND_BASEBAND_COMMAND_MAX_NUM + 1] = {
238 {NULL, 0, NULL, 0},
239 {NULL, 0, NULL, 0},
240 {NULL, 0, NULL, 0},
241 {NULL, 0, NULL, 0},
242 {NULL, 0, NULL, 0},
243 {NULL, 0, NULL, 0},
244 {NULL, 0, NULL, 0},
245 {NULL, 0, NULL, 0},
246 {NULL, 0, NULL, 0},
247 {NULL, 0, NULL, 0},
248 {NULL, 0, NULL, 0},
249 {NULL, 0, NULL, 0},
250 {NULL, 0, NULL, 0},
251 {HciCommonFilterAddress, offsetof(HciReadStoredLinkKeyParam, bdAddr), NULL, 0},
252 {NULL, 0, NULL, 0},
253 {NULL, 0, NULL, 0},
254 {NULL, 0, NULL, 0},
255 {HciWriteStoredLinkKeyCmdFilter, 0, NULL, 0},
256 {HciCommonFilterAddress, offsetof(HciDeleteStoredLinkKeyParam, bdAddr), NULL, 0},
257 {NULL, 0, NULL, 0},
258 {NULL, 0, NULL, 0},
259 {NULL, 0, NULL, 0},
260 {NULL, 0, NULL, 0},
261 {NULL, 0, NULL, 0},
262 {NULL, 0, NULL, 0},
263 {NULL, 0, NULL, 0},
264 {NULL, 0, NULL, 0},
265 {NULL, 0, NULL, 0},
266 {NULL, 0, NULL, 0},
267 {NULL, 0, NULL, 0},
268 {NULL, 0, NULL, 0},
269 {NULL, 0, NULL, 0},
270 {NULL, 0, NULL, 0},
271 {NULL, 0, NULL, 0},
272 {NULL, 0, NULL, 0},
273 {NULL, 0, NULL, 0},
274 {NULL, 0, NULL, 0},
275 {NULL, 0, NULL, 0},
276 {NULL, 0, NULL, 0},
277 {NULL, 0, NULL, 0},
278 {NULL, 0, NULL, 0},
279 {NULL, 0, NULL, 0},
280 {NULL, 0, NULL, 0},
281 {NULL, 0, NULL, 0},
282 {NULL, 0, NULL, 0},
283 {NULL, 0, NULL, 0},
284 {NULL, 0, NULL, 0},
285 {NULL, 0, NULL, 0},
286 {NULL, 0, NULL, 0},
287 {NULL, 0, NULL, 0},
288 {NULL, 0, NULL, 0},
289 {NULL, 0, NULL, 0},
290 {NULL, 0, NULL, 0},
291 {NULL, 0, NULL, 0},
292 {NULL, 0, NULL, 0},
293 {NULL, 0, NULL, 0},
294 {NULL, 0, NULL, 0},
295 {NULL, 0, NULL, 0},
296 {NULL, 0, NULL, 0},
297 {NULL, 0, NULL, 0},
298 {NULL, 0, NULL, 0},
299 {NULL, 0, NULL, 0},
300 {NULL, 0, NULL, 0},
301 {NULL, 0, NULL, 0},
302 {NULL, 0, NULL, 0},
303 {NULL, 0, NULL, 0},
304 {NULL, 0, NULL, 0},
305 {NULL, 0, NULL, 0},
306 {NULL, 0, NULL, 0},
307 {NULL, 0, NULL, 0},
308 {NULL, 0, NULL, 0},
309 {NULL, 0, NULL, 0},
310 {NULL, 0, NULL, 0},
311 {NULL, 0, NULL, 0},
312 {NULL, 0, NULL, 0},
313 {NULL, 0, NULL, 0},
314 {NULL, 0, NULL, 0},
315 {NULL, 0, NULL, 0},
316 {NULL, 0, NULL, 0},
317 {NULL, 0, NULL, 0},
318 {NULL, 0, NULL, 0},
319 {NULL, 0, NULL, 0},
320 {NULL, 0, NULL, 0},
321 {NULL, 0, NULL, 0},
322 {NULL, 0, NULL, 0},
323 {NULL, 0, NULL, 0},
324 {NULL, 0, NULL, 0},
325 {NULL, 0, NULL, 0},
326 {NULL, 0, NULL, 0},
327 {NULL, 0, NULL, 0},
328 {NULL, 0, NULL, 0},
329 {NULL, 0, NULL, 0},
330 {NULL, 0, NULL, 0},
331 {NULL, 0, NULL, 0},
332 {NULL, 0, NULL, 0},
333 {NULL, 0, NULL, 0},
334 {
335 HciCommonFilterAddress,
336 offsetof(HciSendKeypressNotificationParam, bdAddr),
337 HciCommonFilterAddress,
338 offsetof(HciSendKeypressNotificationReturnParam, bdAddr),
339 },
340 };
341
342 static const HciCommandFilterFunc
343 G_INFORMATION_PARAMETER_FILTER_FUNC_MAP[HCI_INFORMATIONAL_PARAMETERS_COMMAND_MAX_NUM + 1] = {
344 {NULL, 0, NULL, 0},
345 {NULL, 0, NULL, 0},
346 {NULL, 0, NULL, 0},
347 {NULL, 0, NULL, 0},
348 {NULL, 0, NULL, 0},
349 {NULL, 0, NULL, 0},
350 {NULL, 0, NULL, 0},
351 {NULL, 0, NULL, 0},
352 {NULL, 0, NULL, 0},
353 {NULL, 0, HciCommonFilterAddress, offsetof(HciReadBdAddrReturnParam, bdAddr)},
354 };
355
356 static const HciCommandFilterFunc G_LE_CONTROLLER_FILTER_FUNC_MAP[HCI_LE_CONTROLLER_COMMAND_MAX_NUM + 1] = {
357 {NULL, 0, NULL, 0},
358 {NULL, 0, NULL, 0},
359 {NULL, 0, NULL, 0},
360 {NULL, 0, NULL, 0},
361 {NULL, 0, NULL, 0},
362 {NULL, 0, NULL, 0},
363 {HciCommonFilterAddress, offsetof(HciLeSetAdvertisingParametersParam, peerAddress), NULL, 0},
364 {NULL, 0, NULL, 0},
365 {NULL, 0, NULL, 0},
366 {NULL, 0, NULL, 0},
367 {NULL, 0, NULL, 0},
368 {NULL, 0, NULL, 0},
369 {NULL, 0, NULL, 0},
370 {HciCommonFilterAddress, offsetof(HciLeCreateConnectionParam, peerAddress), NULL, 0},
371 {NULL, 0, NULL, 0},
372 {NULL, 0, NULL, 0},
373 {NULL, 0, NULL, 0},
374 {HciCommonFilterAddress, offsetof(HciLeAddDeviceToWhiteListParam, address), NULL, 0},
375 {HciCommonFilterAddress, offsetof(HciLeRemoveDeviceFromWhiteListParam, address), NULL, 0},
376 {NULL, 0, NULL, 0},
377 {NULL, 0, NULL, 0},
378 {NULL, 0, NULL, 0},
379 {NULL, 0, NULL, 0},
380 {NULL, 0, NULL, 0},
381 {NULL, 0, NULL, 0},
382 {NULL, 0, NULL, 0},
383 {NULL, 0, NULL, 0},
384 {NULL, 0, NULL, 0},
385 {NULL, 0, NULL, 0},
386 {NULL, 0, NULL, 0},
387 {NULL, 0, NULL, 0},
388 {NULL, 0, NULL, 0},
389 {NULL, 0, NULL, 0},
390 {NULL, 0, NULL, 0},
391 {NULL, 0, NULL, 0},
392 {NULL, 0, NULL, 0},
393 {NULL, 0, NULL, 0},
394 {NULL, 0, NULL, 0},
395 {NULL, 0, NULL, 0},
396 {HciCommonFilterAddress, offsetof(HciLeAddDeviceToResolvingListParam, peerIdentityAddress), NULL, 0},
397 {HciCommonFilterAddress, offsetof(HciLeRemoveDeviceFromResolvingListParam, peerIdentityAddress), NULL, 0},
398 {NULL, 0, NULL, 0},
399 {NULL, 0, NULL, 0},
400 {
401 HciCommonFilterAddress,
402 offsetof(HciLeReadPeerResolvableAddressParam, peerIdentityAddress),
403 HciCommonFilterAddress,
404 offsetof(HciLeReadPeerResolvableAddressReturnParam, peerResolvableAddress),
405 },
406 {
407 HciCommonFilterAddress,
408 offsetof(HciLeReadLocalResolvableAddressParam, peerIdentityAddress),
409 HciCommonFilterAddress,
410 offsetof(HciLeReadLocalResolvableAddressReturnParam, localResolvableAddress),
411 },
412 {NULL, 0, NULL, 0},
413 {NULL, 0, NULL, 0},
414 {NULL, 0, NULL, 0},
415 {NULL, 0, NULL, 0},
416 {NULL, 0, NULL, 0},
417 {NULL, 0, NULL, 0},
418 {NULL, 0, NULL, 0},
419 {NULL, 0, NULL, 0},
420 {NULL, 0, NULL, 0},
421 {NULL, 0, NULL, 0},
422 {NULL, 0, NULL, 0},
423 {NULL, 0, NULL, 0},
424 {NULL, 0, NULL, 0},
425 {NULL, 0, NULL, 0},
426 {NULL, 0, NULL, 0},
427 {NULL, 0, NULL, 0},
428 {NULL, 0, NULL, 0},
429 {NULL, 0, NULL, 0},
430 {NULL, 0, NULL, 0},
431 {NULL, 0, NULL, 0},
432 {NULL, 0, NULL, 0},
433 {NULL, 0, NULL, 0},
434 {HciCommonFilterAddress, offsetof(HciLeExtendedCreateConnectionParam, peerAddress), NULL, 0},
435 {NULL, 0, NULL, 0},
436 {NULL, 0, NULL, 0},
437 {NULL, 0, NULL, 0},
438 {NULL, 0, NULL, 0},
439 {NULL, 0, NULL, 0},
440 {NULL, 0, NULL, 0},
441 {NULL, 0, NULL, 0},
442 {NULL, 0, NULL, 0},
443 {NULL, 0, NULL, 0},
444 {NULL, 0, NULL, 0},
445 {HciCommonFilterAddress, offsetof(HciLeSetPrivacyModeParam, peerIdentityAddress), NULL, 0},
446 };
447
BtmFilterHciCmd(const uint8_t ** data,uint16_t originalLength,uint16_t * includedLength)448 void BtmFilterHciCmd(const uint8_t **data, uint16_t originalLength, uint16_t *includedLength)
449 {
450 if (originalLength < sizeof(BtmHciCmdHeader)) {
451 return;
452 }
453
454 uint16_t offset = 0;
455 BtmHciCmdHeader *header = (BtmHciCmdHeader *)(*data + offset);
456 offset += sizeof(BtmHciCmdHeader);
457 const HciCommandFilterFunc *filterFuncInfo = NULL;
458
459 switch (GET_OGF(header->opCode)) {
460 case HCI_COMMAND_OGF_LINK_CONTROL:
461 filterFuncInfo = &G_LINK_CONTROL_FILTER_FUNC_MAP[GET_OCF(header->opCode)];
462 break;
463 case HCI_COMMAND_OGF_LINK_POLICY:
464 filterFuncInfo = &G_LINK_POLICY_FILTER_FUNC_MAP[GET_OCF(header->opCode)];
465 break;
466 case HCI_COMMAND_OGF_CONTTOLLER_AND_BASEBAND:
467 filterFuncInfo = &G_CONTROLLER_AND_BASEBAND_FILTER_FUNC_MAP[GET_OCF(header->opCode)];
468 break;
469 case HCI_COMMAND_OGF_INFORMATIONAL_PARAMETERS:
470 filterFuncInfo = &G_INFORMATION_PARAMETER_FILTER_FUNC_MAP[GET_OCF(header->opCode)];
471 break;
472 case HCI_COMMAND_OGF_LE_CONTROLLER:
473 filterFuncInfo = &G_LE_CONTROLLER_FILTER_FUNC_MAP[GET_OCF(header->opCode)];
474 break;
475 case HCI_COMMAND_OGF_STATUS_PARAMETERS:
476 default:
477 break;
478 }
479
480 if (filterFuncInfo != NULL && filterFuncInfo->cmdFunc != NULL) {
481 uint8_t *copyData = BtmCreateFilterBuffer(includedLength, *data);
482 filterFuncInfo->cmdFunc(copyData + offset + filterFuncInfo->cmdDataOffset);
483 *data = copyData;
484 }
485 }
486
BtmFilterHciCmdCompleteEvt(const uint8_t ** data,uint16_t originalLength,uint16_t * includedLength)487 void BtmFilterHciCmdCompleteEvt(const uint8_t **data, uint16_t originalLength, uint16_t *includedLength)
488 {
489 if (originalLength < sizeof(HciEventHeader)) {
490 return;
491 }
492
493 uint8_t offset = 0;
494 HciEventHeader *header = (HciEventHeader *)(*data + offset);
495 offset += sizeof(HciEventHeader);
496
497 if (header->eventCode == HCI_COMMAND_COMPLETE_EVENT) {
498 HciCommandCompleteEventParam *evtParam = (HciCommandCompleteEventParam *)(*data + offset);
499 offset += sizeof(HciCommandCompleteEventParam);
500 const HciCommandFilterFunc *filterFuncInfo = NULL;
501 switch (GET_OGF(evtParam->commandOpcode)) {
502 case HCI_COMMAND_OGF_LINK_CONTROL:
503 filterFuncInfo = &G_LINK_CONTROL_FILTER_FUNC_MAP[GET_OCF(evtParam->commandOpcode)];
504 break;
505 case HCI_COMMAND_OGF_LINK_POLICY:
506 filterFuncInfo = &G_LINK_POLICY_FILTER_FUNC_MAP[GET_OCF(evtParam->commandOpcode)];
507 break;
508 case HCI_COMMAND_OGF_CONTTOLLER_AND_BASEBAND:
509 filterFuncInfo = &G_CONTROLLER_AND_BASEBAND_FILTER_FUNC_MAP[GET_OCF(evtParam->commandOpcode)];
510 break;
511 case HCI_COMMAND_OGF_INFORMATIONAL_PARAMETERS:
512 filterFuncInfo = &G_INFORMATION_PARAMETER_FILTER_FUNC_MAP[GET_OCF(evtParam->commandOpcode)];
513 break;
514 case HCI_COMMAND_OGF_LE_CONTROLLER:
515 filterFuncInfo = &G_LE_CONTROLLER_FILTER_FUNC_MAP[GET_OCF(evtParam->commandOpcode)];
516 break;
517 case HCI_COMMAND_OGF_STATUS_PARAMETERS:
518 default:
519 break;
520 }
521 if (filterFuncInfo != NULL && filterFuncInfo->completeFunc != NULL) {
522 uint8_t *copyData = BtmCreateFilterBuffer(includedLength, *data);
523 filterFuncInfo->completeFunc(copyData + offset + filterFuncInfo->completeEvtDataOffset);
524 }
525 }
526 }
527