/* Stores a miniflow with inline values */
-/* There are fields in the flow structure that we never use. Therefore we can
- * save a few words of memory */
-#define NETDEV_KEY_BUF_SIZE_U32 (FLOW_U32S \
- - MINI_N_INLINE \
- - FLOW_U32_SIZE(regs) \
- - FLOW_U32_SIZE(metadata) \
- )
struct netdev_flow_key {
struct miniflow flow;
- uint32_t buf[NETDEV_KEY_BUF_SIZE_U32];
+ uint32_t buf[FLOW_MAX_PACKET_U32S - MINI_N_INLINE];
};
/* Exact match cache for frequently used flows
#define FLOW_U32S (sizeof(struct flow) / 4)
+/* Some flow fields are mutually exclusive or only appear within the flow
+ * pipeline. IPv6 headers are bigger than IPv4 and MPLS, and IPv6 ND packets
+ * are bigger than TCP,UDP and IGMP packets. */
+#define FLOW_MAX_PACKET_U32S (FLOW_U32S \
+ /* Unused in datapath */ - FLOW_U32_SIZE(regs) \
+ - FLOW_U32_SIZE(metadata) \
+ /* L2.5/3 */ - FLOW_U32_SIZE(nw_src) \
+ - FLOW_U32_SIZE(nw_dst) \
+ - FLOW_U32_SIZE(mpls_lse) \
+ /* L4 */ - FLOW_U32_SIZE(tcp_flags) /* incl. pad. */ \
+ - FLOW_U32_SIZE(igmp_group_ip4) \
+ )
+
/* Remember to update FLOW_WC_SEQ when changing 'struct flow'. */
BUILD_ASSERT_DECL(offsetof(struct flow, dp_hash) + sizeof(uint32_t)
== sizeof(struct flow_tnl) + 176