X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Facl%2Fpublic_inlines.h;fp=src%2Fplugins%2Facl%2Fpublic_inlines.h;h=6b69bcef61e7b81666c9626d133b1664df059b50;hb=f995c7122ba0d024b17bc3232e8edd18d5e25088;hp=03b64012a744aafb585c5526afa1b98d7d09a183;hpb=025cd9c867bef937724535033ccdb979292b7714;p=vpp.git diff --git a/src/plugins/acl/public_inlines.h b/src/plugins/acl/public_inlines.h index 03b64012a74..6b69bcef61e 100644 --- a/src/plugins/acl/public_inlines.h +++ b/src/plugins/acl/public_inlines.h @@ -682,5 +682,46 @@ acl_plugin_match_5tuple_inline (void *p_acl_main, u32 lc_index, } +always_inline int +acl_plugin_match_5tuple_inline_and_count (void *p_acl_main, u32 lc_index, + fa_5tuple_opaque_t * pkt_5tuple, + int is_ip6, u8 * r_action, + u32 * r_acl_pos_p, + u32 * r_acl_match_p, + u32 * r_rule_match_p, + u32 * trace_bitmap, + u32 packet_size) +{ + acl_main_t *am = p_acl_main; + int ret = 0; + fa_5tuple_t * pkt_5tuple_internal = (fa_5tuple_t *)pkt_5tuple; + pkt_5tuple_internal->pkt.lc_index = lc_index; + if (PREDICT_TRUE(am->use_hash_acl_matching)) { + if (PREDICT_FALSE(pkt_5tuple_internal->pkt.is_nonfirst_fragment)) { + /* + * tuplemerge does not take fragments into account, + * and in general making fragments first class citizens has + * proved more overhead than it's worth - so just fall back to linear + * matching in that case. + */ + ret = linear_multi_acl_match_5tuple(p_acl_main, lc_index, pkt_5tuple_internal, is_ip6, r_action, + r_acl_pos_p, r_acl_match_p, r_rule_match_p, trace_bitmap); + } else { + ret = hash_multi_acl_match_5tuple(p_acl_main, lc_index, pkt_5tuple_internal, is_ip6, r_action, + r_acl_pos_p, r_acl_match_p, r_rule_match_p, trace_bitmap); + } + } else { + ret = linear_multi_acl_match_5tuple(p_acl_main, lc_index, pkt_5tuple_internal, is_ip6, r_action, + r_acl_pos_p, r_acl_match_p, r_rule_match_p, trace_bitmap); + } + if (PREDICT_TRUE(ret)) { + u16 thread_index = os_get_thread_index (); + vlib_increment_combined_counter(am->combined_acl_counters + *r_acl_match_p, thread_index, *r_rule_match_p, 1, packet_size); + } + return ret; +} + + + #endif