[ovs-dev] [bond megaflow v2 2/5] lib/flow: add dp_hash and recirc_id to struct flow
Andy Zhou
azhou at nicira.com
Tue Mar 11 23:56:18 UTC 2014
Signed-off-by: Andy Zhou <azhou at nicira.com>
---
v1->v2: No major changes
---
include/openflow/nicira-ext.h | 26 ++++++++++++++++++++++++++
lib/flow.c | 6 ++++--
lib/flow.h | 13 ++++++++++---
lib/match.c | 12 +++++++++++-
lib/nx-match.c | 15 ++++++++++++++-
lib/ofp-util.c | 2 +-
ofproto/ofproto-dpif-xlate.c | 2 +-
7 files changed, 67 insertions(+), 9 deletions(-)
diff --git a/include/openflow/nicira-ext.h b/include/openflow/nicira-ext.h
index 22939f4..03b3776 100644
--- a/include/openflow/nicira-ext.h
+++ b/include/openflow/nicira-ext.h
@@ -1803,6 +1803,32 @@ OFP_ASSERT(sizeof(struct nx_action_output_reg) == 24);
#define NXM_NX_TCP_FLAGS NXM_HEADER (0x0001, 34, 2)
#define NXM_NX_TCP_FLAGS_W NXM_HEADER_W(0x0001, 34, 2)
+/* Metadata dp_hash.
+ *
+ * The dp_hash is used to carry the flow hash computed in the
+ * datapath.
+ *
+ * Prereqs: None.
+ *
+ * Format: 32-bit integer in network byte order.
+ *
+ * Masking: Fully maskable. */
+#define NXM_NX_DP_HASH NXM_HEADER (0x0001, 35, 4)
+#define NXM_NX_DP_HASH_W NXM_HEADER_W(0x0001, 35, 4)
+
+/* Metadata recirc_id.
+ *
+ * The recirc_id used for recirculation. 0 is reserved
+ * for initially received packet.
+ *
+ * Prereqs: None.
+ *
+ * Format: 32-bit integer in network byte order.
+ *
+ * Masking: not maskable. */
+#define NXM_NX_RECIRC_ID NXM_HEADER (0x0001, 36, 4)
+#define NXM_NX_RECIRC_ID_W NXM_HEADER_W(0x0001, 36, 4)
+
/* ## --------------------- ## */
/* ## Requests and replies. ## */
/* ## --------------------- ## */
diff --git a/lib/flow.c b/lib/flow.c
index 82d6729..6c60f04 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -532,8 +532,10 @@ flow_unwildcard_tp_ports(const struct flow *flow, struct flow_wildcards *wc)
void
flow_get_metadata(const struct flow *flow, struct flow_metadata *fmd)
{
- BUILD_ASSERT_DECL(FLOW_WC_SEQ == 24);
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 25);
+ fmd->dp_hash = flow->dp_hash;
+ fmd->recirc_id = flow->recirc_id;
fmd->tun_id = flow->tunnel.tun_id;
fmd->tun_src = flow->tunnel.ip_src;
fmd->tun_dst = flow->tunnel.ip_dst;
@@ -1177,7 +1179,7 @@ flow_push_mpls(struct flow *flow, int n, ovs_be16 mpls_eth_type,
flow->mpls_lse[0] = set_mpls_lse_values(ttl, tc, 1, htonl(label));
/* Clear all L3 and L4 fields. */
- BUILD_ASSERT(FLOW_WC_SEQ == 24);
+ BUILD_ASSERT(FLOW_WC_SEQ == 25);
memset((char *) flow + FLOW_SEGMENT_2_ENDS_AT, 0,
sizeof(struct flow) - FLOW_SEGMENT_2_ENDS_AT);
}
diff --git a/lib/flow.h b/lib/flow.h
index 8165bcf..8e1349d 100644
--- a/lib/flow.h
+++ b/lib/flow.h
@@ -37,7 +37,7 @@ struct pkt_metadata;
/* This sequence number should be incremented whenever anything involving flows
* or the wildcarding of flows changes. This will cause build assertion
* failures in places which likely need to be updated. */
-#define FLOW_WC_SEQ 24
+#define FLOW_WC_SEQ 25
#define FLOW_N_REGS 8
BUILD_ASSERT_DECL(FLOW_N_REGS <= NXM_NX_MAX_REGS);
@@ -97,6 +97,11 @@ union flow_in_port {
* be looked at. This enables better wildcarding for datapath flows.
*/
struct flow {
+ /* Recirculation */
+ uint32_t dp_hash; /* Datapth computed hash value. The exact
+ computation is opaque to the user space.*/
+ uint32_t recirc_id; /* Must be exact match. */
+
/* L1 */
struct flow_tnl tunnel; /* Encapsulating tunnel parameters. */
ovs_be64 metadata; /* OpenFlow Metadata. */
@@ -139,8 +144,8 @@ BUILD_ASSERT_DECL(sizeof(struct flow) % 4 == 0);
/* Remember to update FLOW_WC_SEQ when changing 'struct flow'. */
BUILD_ASSERT_DECL(offsetof(struct flow, tp_dst) + 2
- == sizeof(struct flow_tnl) + 164
- && FLOW_WC_SEQ == 24);
+ == sizeof(struct flow_tnl) + 172
+ && FLOW_WC_SEQ == 25);
/* Incremental points at which flow classification may be performed in
* segments.
@@ -165,6 +170,8 @@ extern const uint8_t flow_segment_u32s[];
/* Represents the metadata fields of struct flow. */
struct flow_metadata {
+ uint32_t dp_hash; /* Datapath computed hash field. */
+ uint32_t recirc_id; /* Recirculation ID. */
ovs_be64 tun_id; /* Encapsulating tunnel ID. */
ovs_be32 tun_src; /* Tunnel outer IPv4 src addr */
ovs_be32 tun_dst; /* Tunnel outer IPv4 dst addr */
diff --git a/lib/match.c b/lib/match.c
index b2a25fd..12e58a2 100644
--- a/lib/match.c
+++ b/lib/match.c
@@ -895,7 +895,7 @@ match_format(const struct match *match, struct ds *s, unsigned int priority)
int i;
- BUILD_ASSERT_DECL(FLOW_WC_SEQ == 24);
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 25);
if (priority != OFP_DEFAULT_PRIORITY) {
ds_put_format(s, "priority=%u,", priority);
@@ -903,6 +903,16 @@ match_format(const struct match *match, struct ds *s, unsigned int priority)
format_uint32_masked(s, "pkt_mark", f->pkt_mark, wc->masks.pkt_mark);
+ if (wc->masks.recirc_id) {
+ format_uint32_masked(s, "recirc_id", f->recirc_id,
+ wc->masks.recirc_id);
+ }
+
+ if (wc->masks.dp_hash) {
+ format_uint32_masked(s, "dp_hash", f->dp_hash,
+ wc->masks.dp_hash);
+ }
+
if (wc->masks.skb_priority) {
ds_put_format(s, "skb_priority=%#"PRIx32",", f->skb_priority);
}
diff --git a/lib/nx-match.c b/lib/nx-match.c
index 437e85b..a1cfacb 100644
--- a/lib/nx-match.c
+++ b/lib/nx-match.c
@@ -572,9 +572,22 @@ nx_put_raw(struct ofpbuf *b, bool oxm, const struct match *match,
int match_len;
int i;
- BUILD_ASSERT_DECL(FLOW_WC_SEQ == 24);
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 25);
/* Metadata. */
+ if (match->wc.masks.dp_hash) {
+ if (!oxm) {
+ nxm_put_32m(b, NXM_NX_DP_HASH, htonl(flow->dp_hash),
+ htonl(match->wc.masks.dp_hash));
+ }
+ }
+
+ if (match->wc.masks.recirc_id) {
+ if (!oxm) {
+ nxm_put_32(b, NXM_NX_RECIRC_ID, htonl(flow->recirc_id));
+ }
+ }
+
if (match->wc.masks.in_port.ofp_port) {
ofp_port_t in_port = flow->in_port.ofp_port;
if (oxm) {
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index fca18de..91d5b5a 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -84,7 +84,7 @@ ofputil_netmask_to_wcbits(ovs_be32 netmask)
void
ofputil_wildcard_from_ofpfw10(uint32_t ofpfw, struct flow_wildcards *wc)
{
- BUILD_ASSERT_DECL(FLOW_WC_SEQ == 24);
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 25);
/* Initialize most of wc. */
flow_wildcards_init_catchall(wc);
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index eb4931e..75728ce 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -1685,7 +1685,7 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
/* If 'struct flow' gets additional metadata, we'll need to zero it out
* before traversing a patch port. */
- BUILD_ASSERT_DECL(FLOW_WC_SEQ == 24);
+ BUILD_ASSERT_DECL(FLOW_WC_SEQ == 25);
if (!xport) {
xlate_report(ctx, "Nonexistent output port");
--
1.7.9.5
More information about the dev
mailing list