mirror of https://github.com/F-Stack/f-stack.git
140 lines
3.1 KiB
C
140 lines
3.1 KiB
C
/* 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 */
|