xref: /dpdk/examples/common/pkt_group.h (revision 732115ce38c63184cb706b9179c02ed04b961afa)
1*732115ceSRahul Bhansali /* SPDX-License-Identifier: BSD-3-Clause
2*732115ceSRahul Bhansali  * Copyright(c) 2016-2018 Intel Corporation.
3*732115ceSRahul Bhansali  * Copyright(c) 2017-2018 Linaro Limited.
4*732115ceSRahul Bhansali  * Copyright(C) 2022 Marvell.
5*732115ceSRahul Bhansali  */
6*732115ceSRahul Bhansali 
7*732115ceSRahul Bhansali #ifndef PKT_GROUP_H
8*732115ceSRahul Bhansali #define PKT_GROUP_H
9*732115ceSRahul Bhansali 
10*732115ceSRahul Bhansali #define FWDSTEP	4
11*732115ceSRahul Bhansali 
12*732115ceSRahul Bhansali /*
13*732115ceSRahul Bhansali  * Group consecutive packets with the same destination port into one burst.
14*732115ceSRahul Bhansali  * To avoid extra latency this is done together with some other packet
15*732115ceSRahul Bhansali  * processing, but after we made a final decision about packet's destination.
16*732115ceSRahul Bhansali  * To do this we maintain:
17*732115ceSRahul Bhansali  * pnum - array of number of consecutive packets with the same dest port for
18*732115ceSRahul Bhansali  * each packet in the input burst.
19*732115ceSRahul Bhansali  * lp - pointer to the last updated element in the pnum.
20*732115ceSRahul Bhansali  * dlp - dest port value lp corresponds to.
21*732115ceSRahul Bhansali  */
22*732115ceSRahul Bhansali 
23*732115ceSRahul Bhansali #define	GRPSZ	(1 << FWDSTEP)
24*732115ceSRahul Bhansali #define	GRPMSK	(GRPSZ - 1)
25*732115ceSRahul Bhansali 
26*732115ceSRahul Bhansali #define GROUP_PORT_STEP(dlp, dcp, lp, pn, idx)	do { \
27*732115ceSRahul Bhansali 	if (likely((dlp) == (dcp)[(idx)])) {         \
28*732115ceSRahul Bhansali 		(lp)[0]++;                           \
29*732115ceSRahul Bhansali 	} else {                                     \
30*732115ceSRahul Bhansali 		(dlp) = (dcp)[idx];                  \
31*732115ceSRahul Bhansali 		(lp) = (pn) + (idx);                 \
32*732115ceSRahul Bhansali 		(lp)[0] = 1;                         \
33*732115ceSRahul Bhansali 	}                                            \
34*732115ceSRahul Bhansali } while (0)
35*732115ceSRahul Bhansali 
36*732115ceSRahul Bhansali static const struct {
37*732115ceSRahul Bhansali 	uint64_t pnum; /* prebuild 4 values for pnum[]. */
38*732115ceSRahul Bhansali 	int32_t  idx;  /* index for new last updated elemnet. */
39*732115ceSRahul Bhansali 	uint16_t lpv;  /* add value to the last updated element. */
40*732115ceSRahul Bhansali } gptbl[GRPSZ] = {
41*732115ceSRahul Bhansali 	{
42*732115ceSRahul Bhansali 		/* 0: a != b, b != c, c != d, d != e */
43*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0001000100010001),
44*732115ceSRahul Bhansali 		.idx = 4,
45*732115ceSRahul Bhansali 		.lpv = 0,
46*732115ceSRahul Bhansali 	},
47*732115ceSRahul Bhansali 	{
48*732115ceSRahul Bhansali 		/* 1: a == b, b != c, c != d, d != e */
49*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0001000100010002),
50*732115ceSRahul Bhansali 		.idx = 4,
51*732115ceSRahul Bhansali 		.lpv = 1,
52*732115ceSRahul Bhansali 	},
53*732115ceSRahul Bhansali 	{
54*732115ceSRahul Bhansali 		/* 2: a != b, b == c, c != d, d != e */
55*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0001000100020001),
56*732115ceSRahul Bhansali 		.idx = 4,
57*732115ceSRahul Bhansali 		.lpv = 0,
58*732115ceSRahul Bhansali 	},
59*732115ceSRahul Bhansali 	{
60*732115ceSRahul Bhansali 		/* 3: a == b, b == c, c != d, d != e */
61*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0001000100020003),
62*732115ceSRahul Bhansali 		.idx = 4,
63*732115ceSRahul Bhansali 		.lpv = 2,
64*732115ceSRahul Bhansali 	},
65*732115ceSRahul Bhansali 	{
66*732115ceSRahul Bhansali 		/* 4: a != b, b != c, c == d, d != e */
67*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0001000200010001),
68*732115ceSRahul Bhansali 		.idx = 4,
69*732115ceSRahul Bhansali 		.lpv = 0,
70*732115ceSRahul Bhansali 	},
71*732115ceSRahul Bhansali 	{
72*732115ceSRahul Bhansali 		/* 5: a == b, b != c, c == d, d != e */
73*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0001000200010002),
74*732115ceSRahul Bhansali 		.idx = 4,
75*732115ceSRahul Bhansali 		.lpv = 1,
76*732115ceSRahul Bhansali 	},
77*732115ceSRahul Bhansali 	{
78*732115ceSRahul Bhansali 		/* 6: a != b, b == c, c == d, d != e */
79*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0001000200030001),
80*732115ceSRahul Bhansali 		.idx = 4,
81*732115ceSRahul Bhansali 		.lpv = 0,
82*732115ceSRahul Bhansali 	},
83*732115ceSRahul Bhansali 	{
84*732115ceSRahul Bhansali 		/* 7: a == b, b == c, c == d, d != e */
85*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0001000200030004),
86*732115ceSRahul Bhansali 		.idx = 4,
87*732115ceSRahul Bhansali 		.lpv = 3,
88*732115ceSRahul Bhansali 	},
89*732115ceSRahul Bhansali 	{
90*732115ceSRahul Bhansali 		/* 8: a != b, b != c, c != d, d == e */
91*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0002000100010001),
92*732115ceSRahul Bhansali 		.idx = 3,
93*732115ceSRahul Bhansali 		.lpv = 0,
94*732115ceSRahul Bhansali 	},
95*732115ceSRahul Bhansali 	{
96*732115ceSRahul Bhansali 		/* 9: a == b, b != c, c != d, d == e */
97*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0002000100010002),
98*732115ceSRahul Bhansali 		.idx = 3,
99*732115ceSRahul Bhansali 		.lpv = 1,
100*732115ceSRahul Bhansali 	},
101*732115ceSRahul Bhansali 	{
102*732115ceSRahul Bhansali 		/* 0xa: a != b, b == c, c != d, d == e */
103*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0002000100020001),
104*732115ceSRahul Bhansali 		.idx = 3,
105*732115ceSRahul Bhansali 		.lpv = 0,
106*732115ceSRahul Bhansali 	},
107*732115ceSRahul Bhansali 	{
108*732115ceSRahul Bhansali 		/* 0xb: a == b, b == c, c != d, d == e */
109*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0002000100020003),
110*732115ceSRahul Bhansali 		.idx = 3,
111*732115ceSRahul Bhansali 		.lpv = 2,
112*732115ceSRahul Bhansali 	},
113*732115ceSRahul Bhansali 	{
114*732115ceSRahul Bhansali 		/* 0xc: a != b, b != c, c == d, d == e */
115*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0002000300010001),
116*732115ceSRahul Bhansali 		.idx = 2,
117*732115ceSRahul Bhansali 		.lpv = 0,
118*732115ceSRahul Bhansali 	},
119*732115ceSRahul Bhansali 	{
120*732115ceSRahul Bhansali 		/* 0xd: a == b, b != c, c == d, d == e */
121*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0002000300010002),
122*732115ceSRahul Bhansali 		.idx = 2,
123*732115ceSRahul Bhansali 		.lpv = 1,
124*732115ceSRahul Bhansali 	},
125*732115ceSRahul Bhansali 	{
126*732115ceSRahul Bhansali 		/* 0xe: a != b, b == c, c == d, d == e */
127*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0002000300040001),
128*732115ceSRahul Bhansali 		.idx = 1,
129*732115ceSRahul Bhansali 		.lpv = 0,
130*732115ceSRahul Bhansali 	},
131*732115ceSRahul Bhansali 	{
132*732115ceSRahul Bhansali 		/* 0xf: a == b, b == c, c == d, d == e */
133*732115ceSRahul Bhansali 		.pnum = UINT64_C(0x0002000300040005),
134*732115ceSRahul Bhansali 		.idx = 0,
135*732115ceSRahul Bhansali 		.lpv = 4,
136*732115ceSRahul Bhansali 	},
137*732115ceSRahul Bhansali };
138*732115ceSRahul Bhansali 
139*732115ceSRahul Bhansali #endif /* PKT_GROUP_H */
140