xref: /dpdk/drivers/net/ice/base/ice_tmatch.h (revision 4b20fa1b)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2001-2021 Intel Corporation
3  */
4 
5 #ifndef _ICE_TMATCH_H_
6 #define _ICE_TMATCH_H_
7 
8 static inline
ice_ternary_match_byte(u8 key,u8 key_inv,u8 pat)9 bool ice_ternary_match_byte(u8 key, u8 key_inv, u8 pat)
10 {
11 	u8 k1, k2, v;
12 	int i;
13 
14 	for (i = 0; i < 8; i++) {
15 		k1 = (u8)(key & (1 << i));
16 		k2 = (u8)(key_inv & (1 << i));
17 		v = (u8)(pat & (1 << i));
18 
19 		if (k1 != 0 && k2 != 0)
20 			continue;
21 		if (k1 == 0 && k2 == 0)
22 			return false;
23 
24 		if (k1 == v)
25 			return false;
26 	}
27 
28 	return true;
29 }
30 
31 static inline
ice_ternary_match(const u8 * key,const u8 * key_inv,const u8 * pat,int len)32 bool ice_ternary_match(const u8 *key, const u8 *key_inv,
33 		       const u8 *pat, int len)
34 {
35 	int i;
36 
37 	for (i = 0; i < len; i++)
38 		if (!ice_ternary_match_byte(key[i], key_inv[i], pat[i]))
39 			return false;
40 
41 	return true;
42 }
43 
44 #endif /* _ICE_TMATCH_H_ */
45