2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-25 15:07:05 +00:00

datapath: Better calculate max nlattr-formatted flow size.

Both userspace and the kernel allocate space based on the max size of a
nlattr-formatted flow.  It was easy to change the max size of a flow
definition and cause crashes by forgetting to update one or both of
those definitions.  This commit attempts to make that harder by
providing a better description of how the max size is calculated and a
build check to look for a common indication that it may have changed.

Signed-off-by: Justin Pettit <jpettit@nicira.com>
Acked-by: Jesse Gross <jesse@nicira.com>
This commit is contained in:
Justin Pettit
2011-02-06 22:46:27 -08:00
parent 7d332293f8
commit 18c4363158
3 changed files with 43 additions and 6 deletions

View File

@@ -63,14 +63,33 @@ void format_odp_action(struct ds *, const struct nlattr *);
void format_odp_actions(struct ds *, const struct nlattr *odp_actions,
size_t actions_len);
/* By my calculations currently the longest valid nlattr-formatted flow key is
* 132 bytes long.
/* Upper bound on the length of a nlattr-formatted flow key. The longest
* nlattr-formatted flow key would be:
*
* We allocate temporary on-stack buffers for flow keys as arrays of uint32_t
* struct pad nl hdr total
* ------ --- ------ -----
* ODP_KEY_ATTR_TUN_ID 8 -- 4 12
* ODP_KEY_ATTR_IN_PORT 4 -- 4 8
* ODP_KEY_ATTR_ETHERNET 12 -- 4 16
* ODP_KEY_ATTR_8021Q 4 -- 4 8
* ODP_KEY_ATTR_ETHERTYPE 2 2 4 8
* ODP_KEY_ATTR_IPV6 34 2 4 40
* ODP_KEY_ATTR_ICMPV6 2 2 4 8
* ODP_KEY_ATTR_ND 28 -- 4 32
* -------------------------------------------------
* total 132
*/
#define ODPUTIL_FLOW_KEY_BYTES 132
/* This is an imperfect sanity-check that ODPUTIL_FLOW_KEY_BYTES doesn't
* need to be updated, but will at least raise awareness when new ODP
* key types are added. */
BUILD_ASSERT_DECL(__ODP_KEY_ATTR_MAX == 14);
/* We allocate temporary on-stack buffers for flow keys as arrays of uint32_t
* to ensure proper 32-bit alignment for Netlink attributes. (An array of
* "struct nlattr" might not, in theory, be sufficiently aligned because it
* only contains 16-bit types.) */
#define ODPUTIL_FLOW_KEY_BYTES 132
#define ODPUTIL_FLOW_KEY_U32S DIV_ROUND_UP(ODPUTIL_FLOW_KEY_BYTES, 4)
void odp_flow_key_format(const struct nlattr *, size_t, struct ds *);