Before going through all 2048 SFF CAN IDs to set bits in the SFF match
bitmap, we can check for two (likely) special cases:
- check for a single ID (mask = CAN_SFF_MASK)
- check for all IDs (mask = zero)
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
pr_debug("%s() invoked\n", __FUNCTION__);
can_mask &= CAN_SFF_MASK;
- can_id &= can_mask;
+ /* single frame */
if (can_mask == CAN_SFF_MASK) {
set_bit(can_id, rls->match_sff);
return;
}
+
+ /* all frames */
+ if (can_mask == 0) {
+ bitmap_fill(rls->match_sff, (1 << CAN_SFF_ID_BITS));
+ return;
+ }
+
+ /* individual frame filter: reduce runtime operations */
+ can_id &= can_mask;
+
/* Add record (set bit to 1) for each ID that conforms particular rule */
for (i = 0; i < (1 << CAN_SFF_ID_BITS); i++) {
if ((i & can_mask) == can_id)