Each flow already has a type field. This implies the protocol the flow
represents, but also has more information: we have two ways to represent
TCP flows, "tap" and "spliced". In order to generalise some of the flow
mechanics, we'll need to determine a flow's protocol in terms of the IP
(L4) protocol number.
Introduce a constant table and helper macro to derive this from the flow
type.
Signed-off-by: David Gibson
---
flow.c | 7 +++++++
flow.h | 4 ++++
2 files changed, 11 insertions(+)
diff --git a/flow.c b/flow.c
index 263633e..70036fc 100644
--- a/flow.c
+++ b/flow.c
@@ -26,6 +26,13 @@ const char *flow_type_str[] = {
static_assert(ARRAY_SIZE(flow_type_str) == FLOW_NUM_TYPES,
"flow_type_str[] doesn't match enum flow_type");
+const uint8_t flow_proto[] = {
+ [FLOW_TCP] = IPPROTO_TCP,
+ [FLOW_TCP_SPLICE] = IPPROTO_TCP,
+};
+static_assert(ARRAY_SIZE(flow_proto) == FLOW_NUM_TYPES,
+ "flow_proto[] doesn't match enum flow_type");
+
/* Global Flow Table */
unsigned flow_first_free;
union flow flowtab[FLOW_MAX];
diff --git a/flow.h b/flow.h
index 72ded54..ab831d1 100644
--- a/flow.h
+++ b/flow.h
@@ -27,6 +27,10 @@ extern const char *flow_type_str[];
#define FLOW_TYPE(f) \
((f)->type < FLOW_NUM_TYPES ? flow_type_str[(f)->type] : "?")
+extern const uint8_t flow_proto[];
+#define FLOW_PROTO(f) \
+ ((f)->type < FLOW_NUM_TYPES ? flow_proto[(f)->type] : 0)
+
/**
* struct flowside - Common information for one side of a flow
* @eaddr: Endpoint address (remote address from passt's PoV)
--
2.43.0