diff options
author | Ben Pfaff <blp@nicira.com> | 2014-07-28 09:50:37 -0700 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2014-07-28 09:50:37 -0700 |
commit | 79fe0f4611b60fe0fdf43206bc06201fd724a18d (patch) | |
tree | 41c45e985bcf91336901706439836243f0374e90 /lib/meta-flow.c | |
parent | 3eed53e9cf8e5a11516bf8d77cf247766aaf0804 (diff) | |
download | openvswitch-79fe0f4611b60fe0fdf43206bc06201fd724a18d.tar.gz |
meta-flow: Add 64-bit registers.
These 64-bit registers are intended to conform with the OpenFlow 1.5
draft specification.
EXT-244.
Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
Diffstat (limited to 'lib/meta-flow.c')
-rw-r--r-- | lib/meta-flow.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/meta-flow.c b/lib/meta-flow.c index e980a2a85..b76c11d2c 100644 --- a/lib/meta-flow.c +++ b/lib/meta-flow.c @@ -236,6 +236,29 @@ const struct mf_field mf_fields[MFF_N_IDS] = { #error "Need to update mf_fields[] to match FLOW_N_REGS" #endif +#define XREGISTER(IDX) \ + { \ + MFF_XREG##IDX, "xreg" #IDX, NULL, \ + MF_FIELD_SIZES(be64), \ + MFM_FULLY, \ + MFS_HEXADECIMAL, \ + MFP_NONE, \ + true, \ + OXM_OF_PKT_REG(IDX), "OXM_OF_PKT_REG" #IDX, \ + OXM_OF_PKT_REG(IDX), "OXM_OF_PKT_REG" #IDX, OFP15_VERSION, \ + OFPUTIL_P_NXM_OXM_ANY, \ + OFPUTIL_P_NXM_OXM_ANY, \ + -1, \ + } +#if FLOW_N_XREGS == 4 + XREGISTER(0), + XREGISTER(1), + XREGISTER(2), + XREGISTER(3), +#else +#error "Need to update mf_fields[] to match FLOW_N_XREGS" +#endif + /* ## -- ## */ /* ## L2 ## */ /* ## -- ## */ @@ -922,6 +945,8 @@ mf_is_all_wild(const struct mf_field *mf, const struct flow_wildcards *wc) return !wc->masks.pkt_mark; CASE_MFF_REGS: return !wc->masks.regs[mf->id - MFF_REG0]; + CASE_MFF_XREGS: + return !flow_get_xreg(&wc->masks, mf->id - MFF_XREG0); case MFF_ETH_SRC: return eth_addr_is_zero(wc->masks.dl_src); @@ -1160,6 +1185,7 @@ mf_is_value_valid(const struct mf_field *mf, const union mf_value *value) case MFF_SKB_PRIORITY: case MFF_PKT_MARK: CASE_MFF_REGS: + CASE_MFF_XREGS: case MFF_ETH_SRC: case MFF_ETH_DST: case MFF_ETH_TYPE: @@ -1290,6 +1316,10 @@ mf_get_value(const struct mf_field *mf, const struct flow *flow, value->be32 = htonl(flow->regs[mf->id - MFF_REG0]); break; + CASE_MFF_XREGS: + value->be64 = htonll(flow_get_xreg(flow, mf->id - MFF_XREG0)); + break; + case MFF_ETH_SRC: memcpy(value->mac, flow->dl_src, ETH_ADDR_LEN); break; @@ -1492,6 +1522,10 @@ mf_set_value(const struct mf_field *mf, match_set_reg(match, mf->id - MFF_REG0, ntohl(value->be32)); break; + CASE_MFF_XREGS: + match_set_xreg(match, mf->id - MFF_XREG0, ntohll(value->be64)); + break; + case MFF_ETH_SRC: match_set_dl_src(match, value->mac); break; @@ -1711,6 +1745,10 @@ mf_set_flow_value(const struct mf_field *mf, flow->regs[mf->id - MFF_REG0] = ntohl(value->be32); break; + CASE_MFF_XREGS: + flow_set_xreg(flow, mf->id - MFF_XREG0, ntohll(value->be64)); + break; + case MFF_ETH_SRC: memcpy(flow->dl_src, value->mac, ETH_ADDR_LEN); break; @@ -1928,6 +1966,10 @@ mf_set_wild(const struct mf_field *mf, struct match *match) match_set_reg_masked(match, mf->id - MFF_REG0, 0, 0); break; + CASE_MFF_XREGS: + match_set_xreg_masked(match, mf->id - MFF_XREG0, 0, 0); + break; + case MFF_ETH_SRC: memset(match->flow.dl_src, 0, ETH_ADDR_LEN); memset(match->wc.masks.dl_src, 0, ETH_ADDR_LEN); @@ -2151,6 +2193,11 @@ mf_set(const struct mf_field *mf, ntohl(value->be32), ntohl(mask->be32)); break; + CASE_MFF_XREGS: + match_set_xreg_masked(match, mf->id - MFF_XREG0, + ntohll(value->be64), ntohll(mask->be64)); + break; + case MFF_PKT_MARK: match_set_pkt_mark_masked(match, ntohl(value->be32), ntohl(mask->be32)); |