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