flow: Introduce 'sidx' type to represent one side of one flow
In a number of places, we use indices into the flow table to identify a specific flow. We also have cases where we need to identify a particular side of a particular flow, and we expect those to become more common as we generalise the flow table to cover more things. To assist with that, introduces flow_sidx_t, an index type which identifies a specific side of a specific flow in the table. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> [sbrivio: Suppress false cppcheck positive in flow_sidx()] Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
parent
eb8b1a233b
commit
df96a4cb5d
2 changed files with 52 additions and 0 deletions
14
flow.h
14
flow.h
|
@ -39,6 +39,20 @@ struct flow_common {
|
||||||
#define FLOW_TABLE_PRESSURE 30 /* % of FLOW_MAX */
|
#define FLOW_TABLE_PRESSURE 30 /* % of FLOW_MAX */
|
||||||
#define FLOW_FILE_PRESSURE 30 /* % of c->nofile */
|
#define FLOW_FILE_PRESSURE 30 /* % of c->nofile */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct flow_sidx - ID for one side of a specific flow
|
||||||
|
* @side: Side referenced (0 or 1)
|
||||||
|
* @flow: Index of flow referenced
|
||||||
|
*/
|
||||||
|
typedef struct flow_sidx {
|
||||||
|
int side :1;
|
||||||
|
unsigned flow :FLOW_INDEX_BITS;
|
||||||
|
} flow_sidx_t;
|
||||||
|
static_assert(sizeof(flow_sidx_t) <= sizeof(uint32_t),
|
||||||
|
"flow_sidx_t must fit within 32 bits");
|
||||||
|
|
||||||
|
#define FLOW_SIDX_NONE ((flow_sidx_t){ .flow = FLOW_MAX })
|
||||||
|
|
||||||
union flow;
|
union flow;
|
||||||
|
|
||||||
void flow_table_compact(struct ctx *c, union flow *hole);
|
void flow_table_compact(struct ctx *c, union flow *hole);
|
||||||
|
|
38
flow_table.h
38
flow_table.h
|
@ -47,4 +47,42 @@ static inline unsigned flow_idx(const struct flow_common *f)
|
||||||
*/
|
*/
|
||||||
#define FLOW(idx) (&flowtab[(idx)])
|
#define FLOW(idx) (&flowtab[(idx)])
|
||||||
|
|
||||||
|
/** flow_at_sidx - Flow entry for a given sidx
|
||||||
|
* @sidx: Flow & side index
|
||||||
|
*
|
||||||
|
* Return: pointer to the corresponding flow entry, or NULL
|
||||||
|
*/
|
||||||
|
static inline union flow *flow_at_sidx(flow_sidx_t sidx)
|
||||||
|
{
|
||||||
|
if (sidx.flow >= FLOW_MAX)
|
||||||
|
return NULL;
|
||||||
|
return FLOW(sidx.flow);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** flow_sidx_t - Index of one side of a flow from common structure
|
||||||
|
* @f: Common flow fields pointer
|
||||||
|
* @side: Which side to refer to (0 or 1)
|
||||||
|
*
|
||||||
|
* Return: index of @f and @side in the flow table
|
||||||
|
*/
|
||||||
|
static inline flow_sidx_t flow_sidx(const struct flow_common *f,
|
||||||
|
int side)
|
||||||
|
{
|
||||||
|
/* cppcheck-suppress [knownConditionTrueFalse, unmatchedSuppression] */
|
||||||
|
ASSERT(side == !!side);
|
||||||
|
|
||||||
|
return (flow_sidx_t){
|
||||||
|
.side = side,
|
||||||
|
.flow = flow_idx(f),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/** FLOW_SIDX - Find the index of one side of a flow
|
||||||
|
* @f_: Flow pointer, either union flow * or protocol specific
|
||||||
|
* @side: Which side to index (0 or 1)
|
||||||
|
*
|
||||||
|
* Return: index of @f and @side in the flow table
|
||||||
|
*/
|
||||||
|
#define FLOW_SIDX(f_, side) (flow_sidx(&(f_)->f, (side)))
|
||||||
|
|
||||||
#endif /* FLOW_TABLE_H */
|
#endif /* FLOW_TABLE_H */
|
||||||
|
|
Loading…
Reference in a new issue