Signed-off-by: Andy Zhou <az...@nicira.com> --- lib/match.c | 26 +++++++++++++++++++++++++ lib/match.h | 6 ++++++ lib/meta-flow.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/meta-flow.h | 2 ++ 4 files changed, 92 insertions(+)
diff --git a/lib/match.c b/lib/match.c index 35c893e..b6be480 100644 --- a/lib/match.c +++ b/lib/match.c @@ -158,6 +158,32 @@ match_zero_wildcarded_fields(struct match *match) } void +match_set_dp_hash(struct match *match, uint32_t value) +{ + match_set_dp_hash_masked(match, value, UINT32_MAX); +} + +void +match_set_dp_hash_masked(struct match *match, uint32_t value, uint32_t mask) +{ + match->wc.masks.dp_hash = mask; + match->flow.dp_hash = value & mask; +} + +void +match_set_recirc_id(struct match *match, uint32_t value) +{ + match_set_recirc_id_masked(match, value, UINT32_MAX); +} + +void +match_set_recirc_id_masked(struct match *match, uint32_t value, uint32_t mask) +{ + match->wc.masks.recirc_id = mask; + match->flow.recirc_id = value & mask; +} + +void match_set_reg(struct match *match, unsigned int reg_idx, uint32_t value) { match_set_reg_masked(match, reg_idx, value, UINT32_MAX); diff --git a/lib/match.h b/lib/match.h index ee01acd..f7f24e5 100644 --- a/lib/match.h +++ b/lib/match.h @@ -41,6 +41,12 @@ void match_init_catchall(struct match *); void match_zero_wildcarded_fields(struct match *); +void match_set_dp_hash(struct match *, uint32_t value); +void match_set_dp_hash_masked(struct match *, uint32_t value, uint32_t mask); + +void match_set_recirc_id(struct match *, uint32_t value); +void match_set_recirc_id_masked(struct match *, uint32_t value, uint32_t mask); + void match_set_reg(struct match *, unsigned int reg_idx, uint32_t value); void match_set_reg_masked(struct match *, unsigned int reg_idx, uint32_t value, uint32_t mask); diff --git a/lib/meta-flow.c b/lib/meta-flow.c index 96e0efe..218c942 100644 --- a/lib/meta-flow.c +++ b/lib/meta-flow.c @@ -52,6 +52,30 @@ const struct mf_field mf_fields[MFF_N_IDS] = { /* ## -------- ## */ { + MFF_DP_HASH, "dp_hash", NULL, + MF_FIELD_SIZES(be32), + MFM_FULLY, + MFS_HEXADECIMAL, + MFP_NONE, + false, + 0, NULL, + 0, NULL, + OFPUTIL_P_NONE, + OFPUTIL_P_NONE, + -1, + }, { + MFF_RECIRC_ID, "recirc_id", NULL, + MF_FIELD_SIZES(be32), + MFM_NONE, + MFS_HEXADECIMAL, + MFP_NONE, + false, + 0, NULL, + 0, NULL, + OFPUTIL_P_NONE, + OFPUTIL_P_NONE, + -1, + }, { MFF_TUN_ID, "tun_id", "tunnel_id", MF_FIELD_SIZES(be64), MFM_FULLY, @@ -879,6 +903,10 @@ bool mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc) { switch (mf->id) { + case MFF_DP_HASH: + return !wc->masks.dp_hash; + case MFF_RECIRC_ID: + return !wc->masks.recirc_id; case MFF_TUN_SRC: return !wc->masks.tunnel.ip_src; case MFF_TUN_DST: @@ -1138,6 +1166,8 @@ bool mf_is_value_valid(const struct mf_field *mf, const union mf_value *value) { switch (mf->id) { + case MFF_DP_HASH: + case MFF_RECIRC_ID: case MFF_TUN_ID: case MFF_TUN_SRC: case MFF_TUN_DST: @@ -1231,6 +1261,12 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow, union mf_value *value) { switch (mf->id) { + case MFF_DP_HASH: + value->be32 = htonl(flow->dp_hash); + break; + case MFF_RECIRC_ID: + value->be32 = htonl(flow->recirc_id); + break; case MFF_TUN_ID: value->be64 = flow->tunnel.tun_id; break; @@ -1423,6 +1459,12 @@ mf_set_value(const struct mf_field *mf, const union mf_value *value, struct match *match) { switch (mf->id) { + case MFF_DP_HASH: + match_set_dp_hash(match, ntohl(value->be32)); + break; + case MFF_RECIRC_ID: + match_set_recirc_id(match, ntohl(value->be32)); + break; case MFF_TUN_ID: match_set_tun_id(match, value->be64); break; @@ -1636,6 +1678,12 @@ mf_set_flow_value(const struct mf_field *mf, const union mf_value *value, struct flow *flow) { switch (mf->id) { + case MFF_DP_HASH: + flow->dp_hash = ntohl(value->be32); + break; + case MFF_RECIRC_ID: + flow->recirc_id = ntohl(value->be32); + break; case MFF_TUN_ID: flow->tunnel.tun_id = value->be64; break; @@ -1848,6 +1896,14 @@ void mf_set_wild(const struct mf_field *mf, struct match *match) { switch (mf->id) { + case MFF_DP_HASH: + match->flow.dp_hash = 0; + match->wc.masks.dp_hash = 0; + break; + case MFF_RECIRC_ID: + match->flow.recirc_id = 0; + match->wc.masks.recirc_id = 0; + break; case MFF_TUN_ID: match_set_tun_id_masked(match, htonll(0), htonll(0)); break; @@ -2060,6 +2116,8 @@ mf_set(const struct mf_field *mf, } switch (mf->id) { + case MFF_DP_HASH: + case MFF_RECIRC_ID: case MFF_IN_PORT: case MFF_IN_PORT_OXM: case MFF_SKB_PRIORITY: diff --git a/lib/meta-flow.h b/lib/meta-flow.h index cf92556..91dfecd 100644 --- a/lib/meta-flow.h +++ b/lib/meta-flow.h @@ -33,6 +33,8 @@ struct match; * to represent its value. */ enum OVS_PACKED_ENUM mf_field_id { /* Metadata. */ + MFF_DP_HASH, /* be32 */ + MFF_RECIRC_ID, /* be32 */ MFF_TUN_ID, /* be64 */ MFF_TUN_SRC, /* be32 */ MFF_TUN_DST, /* be32 */ -- 1.7.9.5 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev