Signed-off-by: Andy Zhou <az...@nicira.com> --- v1 -> v2: Minor adjustment. --- lib/match.c | 26 ++++++++++++++++++++++++ lib/match.h | 6 ++++++ lib/meta-flow.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/meta-flow.h | 2 ++ 4 files changed, 94 insertions(+)
diff --git a/lib/match.c b/lib/match.c index 12e58a2..8789413 100644 --- a/lib/match.c +++ b/lib/match.c @@ -165,6 +165,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 7a8ae68..95c8e67 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 d90477a..248d1f0 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, + NXM_NX_DP_HASH, "NXM_NX_DP_HASH", + NXM_NX_DP_HASH, "NXM_NX_DP_HASH", + OFPUTIL_P_NXM_OXM_ANY, + OFPUTIL_P_NXM_OXM_ANY, + -1, + }, { + MFF_RECIRC_ID, "recirc_id", NULL, + MF_FIELD_SIZES(be32), + MFM_FULLY, + MFS_DECIMAL, + MFP_NONE, + false, + NXM_NX_RECIRC_ID, "NXM_NX_RECIRC_ID", + NXM_NX_RECIRC_ID, "NXM_NX_RECIRC_ID", + OFPUTIL_P_NXM_OXM_ANY, + OFPUTIL_P_NXM_OXM_ANY, + -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: @@ -1124,6 +1152,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: @@ -1217,6 +1247,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; @@ -1409,6 +1445,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; @@ -1622,6 +1664,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; @@ -1834,6 +1882,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; @@ -2046,6 +2102,7 @@ mf_set(const struct mf_field *mf, } switch (mf->id) { + case MFF_RECIRC_ID: case MFF_IN_PORT: case MFF_IN_PORT_OXM: case MFF_SKB_PRIORITY: @@ -2068,6 +2125,9 @@ mf_set(const struct mf_field *mf, case MFF_ICMPV6_CODE: return OFPUTIL_P_NONE; + case MFF_DP_HASH: + match_set_dp_hash_masked(match, ntohl(value->be32), ntohl(mask->be32)); + break; case MFF_TUN_ID: match_set_tun_id_masked(match, value->be64, mask->be64); break; 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