mirror of
https://github.com/openvswitch/ovs
synced 2025-08-31 06:15:47 +00:00
datapath: Convert odp_flow_key to use Netlink attributes instead.
One of the goals for Open vSwitch is to decouple kernel and userspace software, so that either one can be upgraded or rolled back independent of the other. To do this in full generality, it must be possible to change the kernel's idea of the flow key separately from the userspace version. In turn, that means that flow keys must become variable-length. This commit makes that change using Netlink attribute sequences. This commit does not actually make userspace flexible enough to handle changes in the kernel flow key structure, because userspace doesn't yet have enough information to do that intelligently. Upcoming commits will fix that. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Jesse Gross <jesse@nicira.com>
This commit is contained in:
@@ -28,6 +28,7 @@
|
||||
|
||||
struct ds;
|
||||
struct flow;
|
||||
struct ofpbuf;
|
||||
|
||||
static inline uint16_t
|
||||
ofp_port_to_odp_port(uint16_t ofp_port)
|
||||
@@ -55,7 +56,6 @@ odp_port_to_ofp_port(uint16_t odp_port)
|
||||
}
|
||||
}
|
||||
|
||||
void format_odp_flow_key(struct ds *, const struct odp_flow_key *);
|
||||
int odp_action_len(uint16_t type);
|
||||
void format_odp_action(struct ds *, const struct nlattr *);
|
||||
void format_odp_actions(struct ds *, const struct nlattr *odp_actions,
|
||||
@@ -64,21 +64,19 @@ void format_odp_flow_stats(struct ds *, const struct odp_flow_stats *);
|
||||
void format_odp_flow(struct ds *, const struct odp_flow *);
|
||||
void format_odp_port_type(struct ds *, const struct odp_port *);
|
||||
|
||||
void odp_flow_key_from_flow(struct odp_flow_key *, const struct flow *);
|
||||
void odp_flow_key_to_flow(const struct odp_flow_key *, struct flow *);
|
||||
/* By my calculations currently the longest valid nlattr-formatted flow key is
|
||||
* 80 bytes long, so this leaves some safety margin.
|
||||
*
|
||||
* 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 96
|
||||
#define ODPUTIL_FLOW_KEY_U32S DIV_ROUND_UP(ODPUTIL_FLOW_KEY_BYTES, 4)
|
||||
|
||||
static inline bool
|
||||
odp_flow_key_equal(const struct odp_flow_key *a, const struct odp_flow_key *b)
|
||||
{
|
||||
return !memcmp(a, b, sizeof *a);
|
||||
}
|
||||
void odp_flow_key_format(const struct nlattr *, size_t, struct ds *);
|
||||
|
||||
static inline size_t
|
||||
odp_flow_key_hash(const struct odp_flow_key *flow, uint32_t basis)
|
||||
{
|
||||
BUILD_ASSERT_DECL(!(sizeof *flow % sizeof(uint32_t)));
|
||||
return hash_words((const uint32_t *) flow,
|
||||
sizeof *flow / sizeof(uint32_t), basis);
|
||||
}
|
||||
void odp_flow_key_from_flow(struct ofpbuf *, const struct flow *);
|
||||
int odp_flow_key_to_flow(const struct nlattr *, size_t, struct flow *);
|
||||
|
||||
#endif /* odp-util.h */
|
||||
|
Reference in New Issue
Block a user