Looks good to me, Acked-by: Jarno Rajahalme <jrajaha...@nicira.com>
On Aug 20, 2014, at 9:00 PM, Ben Pfaff <b...@nicira.com> wrote: > Commit 79fe0f4611b60 (meta-flow: Add 64-bit registers.) added support for > the OpenFlow 1.5 (draft) standardized registers, but neglected to cause > them to be serialized when Open vSwitch composes flow matches. This meant > that they were always sent to a controller as pairs of Nicira extension > registers. This commit fixes the problem. > > Found by inspection. > > ONF-JIRA: EXT-244 > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > lib/nx-match.c | 14 ++++++-- > tests/ovs-ofctl.at | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 103 insertions(+), 4 deletions(-) > > diff --git a/lib/nx-match.c b/lib/nx-match.c > index 1d3205f..6eee551 100644 > --- a/lib/nx-match.c > +++ b/lib/nx-match.c > @@ -723,9 +723,17 @@ nx_put_raw(struct ofpbuf *b, enum ofp_version oxm, const > struct match *match, > flow->tunnel.ip_dst, match->wc.masks.tunnel.ip_dst); > > /* Registers. */ > - for (i = 0; i < FLOW_N_REGS; i++) { > - nxm_put_32m(b, mf_oxm_header(MFF_REG0 + i, oxm), > - htonl(flow->regs[i]), htonl(match->wc.masks.regs[i])); > + if (oxm < OFP15_VERSION) { > + for (i = 0; i < FLOW_N_REGS; i++) { > + nxm_put_32m(b, mf_oxm_header(MFF_REG0 + i, oxm), > + htonl(flow->regs[i]), > htonl(match->wc.masks.regs[i])); > + } > + } else { > + for (i = 0; i < FLOW_N_XREGS; i++) { > + nxm_put_64m(b, mf_oxm_header(MFF_XREG0 + i, oxm), > + htonll(flow_get_xreg(flow, i)), > + htonll(flow_get_xreg(&match->wc.masks, i))); > + } > } > > /* Mark. */ > diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at > index 6e82837..8eca295 100644 > --- a/tests/ovs-ofctl.at > +++ b/tests/ovs-ofctl.at > @@ -1681,7 +1681,7 @@ NXM_OF_IN_PORT(0001), NXM_OF_ETH_TYPE(0800) > ]) > AT_CLEANUP > > -AT_SETUP([ovs-ofctl parse-oxm]) > +AT_SETUP([ovs-ofctl parse-oxm (OpenFlow 1.5)]) > AT_KEYWORDS([oxm]) > AT_DATA([oxm.txt], [dnl > <any> > @@ -1895,6 +1895,27 @@ OXM_OF_ETH_TYPE(86dd) OXM_OF_IP_PROTO(3a) > OXM_OF_ICMPV6_TYPE(87) OXM_OF_IPV6_ND_ > OXM_OF_ETH_TYPE(86dd) OXM_OF_IP_PROTO(3b) OXM_OF_ICMPV6_TYPE(87) > OXM_OF_IPV6_ND_TARGET(20010db83c4d00010002000300040005) > OXM_OF_IPV6_ND_TLL(0002e30f80a4) > OXM_OF_ETH_TYPE(0800) OXM_OF_IP_PROTO(3a) OXM_OF_ICMPV6_TYPE(88) > OXM_OF_IPV6_ND_TARGET(20010db83c4d00010002000300040005) > OXM_OF_IPV6_ND_TLL(0002e30f80a4) > > +# Registers 0, 1, and 2. > +NXM_NX_REG0(acebdf56) > +NXM_NX_REG0_W(a0e0d050/f0f0f0f0) > +NXM_NX_REG0(a0e0d050) > +NXM_NX_REG1(acebdf56) > +NXM_NX_REG0_W(a0e0d050/f0f0f0f0), NXM_NX_REG1_W(a0e0d050/f0f0f0f0) > +NXM_NX_REG0_W(a0e0d050/f0f0f0f0), NXM_NX_REG1(a0e0d050) > +NXM_NX_REG1_W(a0e0d050/f0f0f0f0), NXM_NX_REG2_W(a0e0d050/f0f0f0f0) > +NXM_NX_REG1_W(a0e0d050/f0f0f0f0), NXM_NX_REG2(a0e0d050) > + > +# Extended registers 0, 1, and 2. > +# (For OpenFlow 1.2, OVS transforms these into its extension registers.) > +OXM_OF_PKT_REG0_W(acebdf5600000000/ffffffff00000000) > +OXM_OF_PKT_REG0_W(a0e0d05000000000/f0f0f0f000000000) > +OXM_OF_PKT_REG0_W(a0e0d05000000000/ffffffff00000000) > +OXM_OF_PKT_REG0_W(00000000acebdf56/00000000ffffffff) > +OXM_OF_PKT_REG0_W(a0e0d050a0e0d050/f0f0f0f0f0f0f0f0) > +OXM_OF_PKT_REG0_W(a0e0d050a0e0d050/f0f0f0f0ffffffff) > +OXM_OF_PKT_REG0_W(00000000a0e0d050/00000000f0f0f0f0), > OXM_OF_PKT_REG1_W(a0e0d05000000000/f0f0f0f000000000) > +OXM_OF_PKT_REG0_W(00000000a0e0d050/00000000f0f0f0f0), > OXM_OF_PKT_REG1_W(a0e0d05000000000/ffffffff00000000) > + > # Invalid field number. > 01020304(1111/2222) > ]) > @@ -2111,6 +2132,27 @@ nx_pull_match() returned error OFPBMC_BAD_PREREQ > nx_pull_match() returned error OFPBMC_BAD_PREREQ > nx_pull_match() returned error OFPBMC_BAD_PREREQ > > +# Registers 0, 1, and 2. > +NXM_NX_REG0(acebdf56) > +NXM_NX_REG0_W(a0e0d050/f0f0f0f0) > +NXM_NX_REG0(a0e0d050) > +NXM_NX_REG1(acebdf56) > +NXM_NX_REG0_W(a0e0d050/f0f0f0f0), NXM_NX_REG1_W(a0e0d050/f0f0f0f0) > +NXM_NX_REG0_W(a0e0d050/f0f0f0f0), NXM_NX_REG1(a0e0d050) > +NXM_NX_REG1_W(a0e0d050/f0f0f0f0), NXM_NX_REG2_W(a0e0d050/f0f0f0f0) > +NXM_NX_REG1_W(a0e0d050/f0f0f0f0), NXM_NX_REG2(a0e0d050) > + > +# Extended registers 0, 1, and 2. > +# (For OpenFlow 1.2, OVS transforms these into its extension registers.) > +NXM_NX_REG0(acebdf56) > +NXM_NX_REG0_W(a0e0d050/f0f0f0f0) > +NXM_NX_REG0(a0e0d050) > +NXM_NX_REG1(acebdf56) > +NXM_NX_REG0_W(a0e0d050/f0f0f0f0), NXM_NX_REG1_W(a0e0d050/f0f0f0f0) > +NXM_NX_REG0_W(a0e0d050/f0f0f0f0), NXM_NX_REG1(a0e0d050) > +NXM_NX_REG1_W(a0e0d050/f0f0f0f0), NXM_NX_REG2_W(a0e0d050/f0f0f0f0) > +NXM_NX_REG1_W(a0e0d050/f0f0f0f0), NXM_NX_REG2(a0e0d050) > + > # Invalid field number. > nx_pull_match() returned error OFPBMC_BAD_FIELD > ], [stderr]) > @@ -2125,6 +2167,55 @@ nx_match|WARN|NXM/OXM entry > OXM_OF_METADATA_W(1234567890abcdef/ffff0000ffff0000) > AT_CHECK([grep -v 'has 1-bits in value' stderr], [1]) > AT_CLEANUP > > +AT_SETUP([ovs-ofctl parse-oxm (OpenFlow 1.5)]) > +AT_KEYWORDS([oxm]) > +AT_DATA([oxm.txt], [dnl > +# Extended registers 0 and 1. > +OXM_OF_PKT_REG0_W(acebdf5600000000/ffffffff00000000) > +OXM_OF_PKT_REG0_W(a0e0d05000000000/f0f0f0f000000000) > +OXM_OF_PKT_REG0_W(a0e0d05000000000/ffffffff00000000) > +OXM_OF_PKT_REG0_W(00000000acebdf56/00000000ffffffff) > +OXM_OF_PKT_REG0_W(a0e0d050a0e0d050/f0f0f0f0f0f0f0f0) > +OXM_OF_PKT_REG0_W(a0e0d050a0e0d050/f0f0f0f0ffffffff) > +OXM_OF_PKT_REG0_W(00000000a0e0d050/00000000f0f0f0f0), > OXM_OF_PKT_REG1_W(a0e0d05000000000/f0f0f0f000000000) > +OXM_OF_PKT_REG0_W(00000000a0e0d050/00000000f0f0f0f0), > OXM_OF_PKT_REG1_W(a0e0d05000000000/ffffffff00000000) > + > +# Registers 0, 1, and 2. > +# (OpenFlow 1.5 transforms these into the standard "xregs".) > +NXM_NX_REG0(acebdf56) > +NXM_NX_REG0_W(a0e0d050/f0f0f0f0) > +NXM_NX_REG0(a0e0d050) > +NXM_NX_REG1(acebdf56) > +NXM_NX_REG0_W(a0e0d050/f0f0f0f0), NXM_NX_REG1_W(a0e0d050/f0f0f0f0) > +NXM_NX_REG0_W(a0e0d050/f0f0f0f0), NXM_NX_REG1(a0e0d050) > +NXM_NX_REG1_W(a0e0d050/f0f0f0f0), NXM_NX_REG2_W(a0e0d050/f0f0f0f0) > +NXM_NX_REG1_W(a0e0d050/f0f0f0f0), NXM_NX_REG2(a0e0d050) > +]) > +AT_CHECK([ovs-ofctl '-vPATTERN:console:%c|%p|%m' --strict parse-oxm > OpenFlow15 < oxm.txt], > + [0], [dnl > +# Extended registers 0 and 1. > +OXM_OF_PKT_REG0_W(acebdf5600000000/ffffffff00000000) > +OXM_OF_PKT_REG0_W(a0e0d05000000000/f0f0f0f000000000) > +OXM_OF_PKT_REG0_W(a0e0d05000000000/ffffffff00000000) > +OXM_OF_PKT_REG0_W(00000000acebdf56/00000000ffffffff) > +OXM_OF_PKT_REG0_W(a0e0d050a0e0d050/f0f0f0f0f0f0f0f0) > +OXM_OF_PKT_REG0_W(a0e0d050a0e0d050/f0f0f0f0ffffffff) > +OXM_OF_PKT_REG0_W(00000000a0e0d050/00000000f0f0f0f0), > OXM_OF_PKT_REG1_W(a0e0d05000000000/f0f0f0f000000000) > +OXM_OF_PKT_REG0_W(00000000a0e0d050/00000000f0f0f0f0), > OXM_OF_PKT_REG1_W(a0e0d05000000000/ffffffff00000000) > + > +# Registers 0, 1, and 2. > +# (OpenFlow 1.5 transforms these into the standard "xregs".) > +OXM_OF_PKT_REG0_W(acebdf5600000000/ffffffff00000000) > +OXM_OF_PKT_REG0_W(a0e0d05000000000/f0f0f0f000000000) > +OXM_OF_PKT_REG0_W(a0e0d05000000000/ffffffff00000000) > +OXM_OF_PKT_REG0_W(00000000acebdf56/00000000ffffffff) > +OXM_OF_PKT_REG0_W(a0e0d050a0e0d050/f0f0f0f0f0f0f0f0) > +OXM_OF_PKT_REG0_W(a0e0d050a0e0d050/f0f0f0f0ffffffff) > +OXM_OF_PKT_REG0_W(00000000a0e0d050/00000000f0f0f0f0), > OXM_OF_PKT_REG1_W(a0e0d05000000000/f0f0f0f000000000) > +OXM_OF_PKT_REG0_W(00000000a0e0d050/00000000f0f0f0f0), > OXM_OF_PKT_REG1_W(a0e0d05000000000/ffffffff00000000) > +], []) > +AT_CLEANUP > + > AT_SETUP([ovs-ofctl parse-oxm loose]) > AT_KEYWORDS([oxm]) > AT_DATA([oxm.txt], [dnl > -- > 1.9.1 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev