/* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2016-2018 Intel Corporation. * Copyright(c) 2017-2018 Linaro Limited. * Copyright(C) 2022 Marvell. */ #ifndef PKT_GROUP_H #define PKT_GROUP_H #define FWDSTEP 4 /* * Group consecutive packets with the same destination port into one burst. * To avoid extra latency this is done together with some other packet * processing, but after we made a final decision about packet's destination. * To do this we maintain: * pnum - array of number of consecutive packets with the same dest port for * each packet in the input burst. * lp - pointer to the last updated element in the pnum. * dlp - dest port value lp corresponds to. */ #define GRPSZ (1 << FWDSTEP) #define GRPMSK (GRPSZ - 1) #define GROUP_PORT_STEP(dlp, dcp, lp, pn, idx) do { \ if (likely((dlp) == (dcp)[(idx)])) { \ (lp)[0]++; \ } else { \ (dlp) = (dcp)[idx]; \ (lp) = (pn) + (idx); \ (lp)[0] = 1; \ } \ } while (0) static const struct { uint64_t pnum; /* prebuild 4 values for pnum[]. */ int32_t idx; /* index for new last updated elemnet. */ uint16_t lpv; /* add value to the last updated element. */ } gptbl[GRPSZ] = { { /* 0: a != b, b != c, c != d, d != e */ .pnum = UINT64_C(0x0001000100010001), .idx = 4, .lpv = 0, }, { /* 1: a == b, b != c, c != d, d != e */ .pnum = UINT64_C(0x0001000100010002), .idx = 4, .lpv = 1, }, { /* 2: a != b, b == c, c != d, d != e */ .pnum = UINT64_C(0x0001000100020001), .idx = 4, .lpv = 0, }, { /* 3: a == b, b == c, c != d, d != e */ .pnum = UINT64_C(0x0001000100020003), .idx = 4, .lpv = 2, }, { /* 4: a != b, b != c, c == d, d != e */ .pnum = UINT64_C(0x0001000200010001), .idx = 4, .lpv = 0, }, { /* 5: a == b, b != c, c == d, d != e */ .pnum = UINT64_C(0x0001000200010002), .idx = 4, .lpv = 1, }, { /* 6: a != b, b == c, c == d, d != e */ .pnum = UINT64_C(0x0001000200030001), .idx = 4, .lpv = 0, }, { /* 7: a == b, b == c, c == d, d != e */ .pnum = UINT64_C(0x0001000200030004), .idx = 4, .lpv = 3, }, { /* 8: a != b, b != c, c != d, d == e */ .pnum = UINT64_C(0x0002000100010001), .idx = 3, .lpv = 0, }, { /* 9: a == b, b != c, c != d, d == e */ .pnum = UINT64_C(0x0002000100010002), .idx = 3, .lpv = 1, }, { /* 0xa: a != b, b == c, c != d, d == e */ .pnum = UINT64_C(0x0002000100020001), .idx = 3, .lpv = 0, }, { /* 0xb: a == b, b == c, c != d, d == e */ .pnum = UINT64_C(0x0002000100020003), .idx = 3, .lpv = 2, }, { /* 0xc: a != b, b != c, c == d, d == e */ .pnum = UINT64_C(0x0002000300010001), .idx = 2, .lpv = 0, }, { /* 0xd: a == b, b != c, c == d, d == e */ .pnum = UINT64_C(0x0002000300010002), .idx = 2, .lpv = 1, }, { /* 0xe: a != b, b == c, c == d, d == e */ .pnum = UINT64_C(0x0002000300040001), .idx = 1, .lpv = 0, }, { /* 0xf: a == b, b == c, c == d, d == e */ .pnum = UINT64_C(0x0002000300040005), .idx = 0, .lpv = 4, }, }; #endif /* PKT_GROUP_H */