[ovs-dev] [ovn-ipv6 04/26] Increase number of registers to 16.

Justin Pettit jpettit at ovn.org
Tue Jul 12 06:56:34 UTC 2016


With eight 32-bit registers, we can only store two IPv6 addresses, which is
pretty tight.

Signed-off-by: Justin Pettit <jpettit at ovn.org>
---
 NEWS                            |  1 +
 include/openvswitch/flow.h      |  8 ++++----
 include/openvswitch/meta-flow.h | 41 ++++++++++++++++++++++++++++++++---------
 lib/flow.c                      | 16 ++++++++--------
 lib/match.c                     |  2 +-
 lib/nx-match.c                  |  2 +-
 lib/odp-util.h                  |  2 +-
 lib/ofp-util.c                  |  2 +-
 ofproto/ofproto-dpif-rid.h      |  2 +-
 ofproto/ofproto-dpif-xlate.c    |  2 +-
 ovn/controller/pinctrl.c        | 13 ++++++++++---
 tests/ofproto.at                | 14 +++++++++++++-
 tests/ovs-ofctl.at              | 41 ++++++++++++++++++++++-------------------
 13 files changed, 96 insertions(+), 50 deletions(-)

diff --git a/NEWS b/NEWS
index f50b05e..188e23f 100644
--- a/NEWS
+++ b/NEWS
@@ -53,6 +53,7 @@ Post-v2.5.0
      * PMD threads servicing vHost User ports can now come from the NUMA
        node that device memory is located on if CONFIG_RTE_LIBRTE_VHOST_NUMA
        is enabled in DPDK.
+   - Increase number of registers to 16.
    - ovs-benchmark: This utility has been removed due to lack of use and
      bitrot.
    - ovs-appctl:
diff --git a/include/openvswitch/flow.h b/include/openvswitch/flow.h
index 03d406b..12e70ea 100644
--- a/include/openvswitch/flow.h
+++ b/include/openvswitch/flow.h
@@ -23,10 +23,10 @@
 /* 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 35
+#define FLOW_WC_SEQ 36
 
 /* Number of Open vSwitch extension 32-bit registers. */
-#define FLOW_N_REGS 8
+#define FLOW_N_REGS 16
 BUILD_ASSERT_DECL(FLOW_N_REGS <= NXM_NX_MAX_REGS);
 BUILD_ASSERT_DECL(FLOW_N_REGS % 2 == 0); /* Even. */
 
@@ -129,8 +129,8 @@ BUILD_ASSERT_DECL(sizeof(struct flow_tnl) % sizeof(uint64_t) == 0);
 
 /* Remember to update FLOW_WC_SEQ when changing 'struct flow'. */
 BUILD_ASSERT_DECL(offsetof(struct flow, igmp_group_ip4) + sizeof(uint32_t)
-                  == sizeof(struct flow_tnl) + 216
-                  && FLOW_WC_SEQ == 35);
+                  == sizeof(struct flow_tnl) + 248
+                  && FLOW_WC_SEQ == 36);
 
 /* Incremental points at which flow classification may be performed in
  * segments.
diff --git a/include/openvswitch/meta-flow.h b/include/openvswitch/meta-flow.h
index 84a0946..828c40c 100644
--- a/include/openvswitch/meta-flow.h
+++ b/include/openvswitch/meta-flow.h
@@ -255,7 +255,7 @@ struct match;
  *     field.
  *
  * Finally, a few "register" fields have very similar names and purposes,
- * e.g. MFF_REG0 through MFF_REG7.  For these, the comments may be merged
+ * e.g. MFF_REG0 through MFF_REG15.  For these, the comments may be merged
  * together using <N> as a metasyntactic variable for the numeric suffix.
  * Lines in the comment that are specific to one of the particular fields by
  * writing, e.g. <1>, to consider that line only for e.g. MFF_REG1.
@@ -842,7 +842,7 @@ enum OVS_PACKED_ENUM mf_field_id {
      */
     MFF_CT_LABEL,
 
-#if FLOW_N_REGS == 8
+#if FLOW_N_REGS == 16
     /* "reg<N>".
      *
      * Nicira extension scratch pad register with initial value 0.
@@ -860,6 +860,14 @@ enum OVS_PACKED_ENUM mf_field_id {
      * NXM: NXM_NX_REG5(5) since v1.7.        <5>
      * NXM: NXM_NX_REG6(6) since v1.7.        <6>
      * NXM: NXM_NX_REG7(7) since v1.7.        <7>
+     * NXM: NXM_NX_REG8(8) since v2.6.        <8>
+     * NXM: NXM_NX_REG9(9) since v2.6.        <9>
+     * NXM: NXM_NX_REG10(10) since v2.6.      <10>
+     * NXM: NXM_NX_REG11(11) since v2.6.      <11>
+     * NXM: NXM_NX_REG12(12) since v2.6.      <12>
+     * NXM: NXM_NX_REG13(13) since v2.6.      <13>
+     * NXM: NXM_NX_REG14(14) since v2.6.      <14>
+     * NXM: NXM_NX_REG15(15) since v2.6.      <15>
      * OXM: none.
      */
     MFF_REG0,
@@ -870,11 +878,19 @@ enum OVS_PACKED_ENUM mf_field_id {
     MFF_REG5,
     MFF_REG6,
     MFF_REG7,
+    MFF_REG8,
+    MFF_REG9,
+    MFF_REG10,
+    MFF_REG11,
+    MFF_REG12,
+    MFF_REG13,
+    MFF_REG14,
+    MFF_REG15,
 #else
 #error "Need to update MFF_REG* to match FLOW_N_REGS"
 #endif
 
-#if FLOW_N_XREGS == 4
+#if FLOW_N_XREGS == 8
     /* "xreg<N>".
      *
      * OpenFlow 1.5 ``extended register".  Each extended register
@@ -899,6 +915,10 @@ enum OVS_PACKED_ENUM mf_field_id {
     MFF_XREG1,
     MFF_XREG2,
     MFF_XREG3,
+    MFF_XREG4,
+    MFF_XREG5,
+    MFF_XREG6,
+    MFF_XREG7,
 #else
 #error "Need to update MFF_REG* to match FLOW_N_XREGS"
 #endif
@@ -1731,19 +1751,22 @@ struct mf_bitmap {
 
 /* Use this macro as CASE_MFF_REGS: in a switch statement to choose all of the
  * MFF_REGn cases. */
-#if FLOW_N_REGS == 8
-#define CASE_MFF_REGS                                           \
-    case MFF_REG0: case MFF_REG1: case MFF_REG2: case MFF_REG3: \
-    case MFF_REG4: case MFF_REG5: case MFF_REG6: case MFF_REG7
+#if FLOW_N_REGS ==16
+#define CASE_MFF_REGS                                             \
+    case MFF_REG0: case MFF_REG1: case MFF_REG2: case MFF_REG3:   \
+    case MFF_REG4: case MFF_REG5: case MFF_REG6: case MFF_REG7:   \
+    case MFF_REG8: case MFF_REG9: case MFF_REG10: case MFF_REG11: \
+    case MFF_REG12: case MFF_REG13: case MFF_REG14: case MFF_REG15
 #else
 #error "Need to update CASE_MFF_REGS to match FLOW_N_REGS"
 #endif
 
 /* Use this macro as CASE_MFF_XREGS: in a switch statement to choose all of the
  * MFF_REGn cases. */
-#if FLOW_N_XREGS == 4
+#if FLOW_N_XREGS == 8
 #define CASE_MFF_XREGS                                              \
-    case MFF_XREG0: case MFF_XREG1: case MFF_XREG2: case MFF_XREG3
+    case MFF_XREG0: case MFF_XREG1: case MFF_XREG2: case MFF_XREG3: \
+    case MFF_XREG4: case MFF_XREG5: case MFF_XREG6: case MFF_XREG7
 #else
 #error "Need to update CASE_MFF_XREGS to match FLOW_N_XREGS"
 #endif
diff --git a/lib/flow.c b/lib/flow.c
index a4c1215..b97b853 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -124,7 +124,7 @@ struct mf_ctx {
  * away.  Some GCC versions gave warnings on ALWAYS_INLINE, so these are
  * defined as macros. */
 
-#if (FLOW_WC_SEQ != 35)
+#if (FLOW_WC_SEQ != 36)
 #define MINIFLOW_ASSERT(X) ovs_assert(X)
 BUILD_MESSAGE("FLOW_WC_SEQ changed: miniflow_extract() will have runtime "
                "assertions enabled. Consider updating FLOW_WC_SEQ after "
@@ -842,7 +842,7 @@ flow_get_metadata(const struct flow *flow, struct match *flow_metadata)
 {
     int i;
 
-    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 35);
+    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 36);
 
     match_init_catchall(flow_metadata);
     if (flow->tunnel.tun_id != htonll(0)) {
@@ -1248,7 +1248,7 @@ void flow_wildcards_init_for_packet(struct flow_wildcards *wc,
     memset(&wc->masks, 0x0, sizeof wc->masks);
 
     /* Update this function whenever struct flow changes. */
-    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 35);
+    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 36);
 
     if (flow_tnl_dst_is_set(&flow->tunnel)) {
         if (flow->tunnel.flags & FLOW_TNL_F_KEY) {
@@ -1365,7 +1365,7 @@ void
 flow_wc_map(const struct flow *flow, struct flowmap *map)
 {
     /* Update this function whenever struct flow changes. */
-    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 35);
+    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 36);
 
     flowmap_init(map);
 
@@ -1449,7 +1449,7 @@ void
 flow_wildcards_clear_non_packet_fields(struct flow_wildcards *wc)
 {
     /* Update this function whenever struct flow changes. */
-    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 35);
+    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 36);
 
     memset(&wc->masks.metadata, 0, sizeof wc->masks.metadata);
     memset(&wc->masks.regs, 0, sizeof wc->masks.regs);
@@ -1584,7 +1584,7 @@ flow_wildcards_set_xreg_mask(struct flow_wildcards *wc, int idx, uint64_t mask)
 uint32_t
 miniflow_hash_5tuple(const struct miniflow *flow, uint32_t basis)
 {
-    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 35);
+    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 36);
     uint32_t hash = basis;
 
     if (flow) {
@@ -1631,7 +1631,7 @@ ASSERT_SEQUENTIAL(ipv6_src, ipv6_dst);
 uint32_t
 flow_hash_5tuple(const struct flow *flow, uint32_t basis)
 {
-    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 35);
+    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 36);
     uint32_t hash = basis;
 
     if (flow) {
@@ -2098,7 +2098,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 and dp_hash. */
-        BUILD_ASSERT(FLOW_WC_SEQ == 35);
+        BUILD_ASSERT(FLOW_WC_SEQ == 36);
         memset((char *) flow + FLOW_SEGMENT_2_ENDS_AT, 0,
                sizeof(struct flow) - FLOW_SEGMENT_2_ENDS_AT);
         flow->dp_hash = 0;
diff --git a/lib/match.c b/lib/match.c
index db78831..906308b 100644
--- a/lib/match.c
+++ b/lib/match.c
@@ -1060,7 +1060,7 @@ match_format(const struct match *match, struct ds *s, int priority)
 
     int i;
 
-    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 35);
+    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 36);
 
     if (priority != OFP_DEFAULT_PRIORITY) {
         ds_put_format(s, "%spriority=%s%d,",
diff --git a/lib/nx-match.c b/lib/nx-match.c
index 9a2ada9..505c6f9 100644
--- a/lib/nx-match.c
+++ b/lib/nx-match.c
@@ -917,7 +917,7 @@ nx_put_raw(struct ofpbuf *b, enum ofp_version oxm, const struct match *match,
     int match_len;
     int i;
 
-    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 35);
+    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 36);
 
     /* Metadata. */
     if (match->wc.masks.dp_hash) {
diff --git a/lib/odp-util.h b/lib/odp-util.h
index 53ee661..50e52e4 100644
--- a/lib/odp-util.h
+++ b/lib/odp-util.h
@@ -141,7 +141,7 @@ void odp_portno_names_destroy(struct hmap *portno_names);
  * add another field and forget to adjust this value.
  */
 #define ODPUTIL_FLOW_KEY_BYTES 640
-BUILD_ASSERT_DECL(FLOW_WC_SEQ == 35);
+BUILD_ASSERT_DECL(FLOW_WC_SEQ == 36);
 
 /* A buffer with sufficient size and alignment to hold an nlattr-formatted flow
  * key.  An array of "struct nlattr" might not, in theory, be sufficiently
diff --git a/lib/ofp-util.c b/lib/ofp-util.c
index 2b214ea..4ae83df 100644
--- a/lib/ofp-util.c
+++ b/lib/ofp-util.c
@@ -101,7 +101,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 == 35);
+    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 36);
 
     /* Initialize most of wc. */
     flow_wildcards_init_catchall(wc);
diff --git a/ofproto/ofproto-dpif-rid.h b/ofproto/ofproto-dpif-rid.h
index c34d760..3bca817 100644
--- a/ofproto/ofproto-dpif-rid.h
+++ b/ofproto/ofproto-dpif-rid.h
@@ -99,7 +99,7 @@ struct rule;
 /* Metadata for restoring pipeline context after recirculation.  Helpers
  * are inlined below to keep them together with the definition for easier
  * updates. */
-BUILD_ASSERT_DECL(FLOW_WC_SEQ == 35);
+BUILD_ASSERT_DECL(FLOW_WC_SEQ == 36);
 
 struct frozen_metadata {
     /* Metadata in struct flow. */
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 1977b6b..16fcea3 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -3007,7 +3007,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 == 35);
+    BUILD_ASSERT_DECL(FLOW_WC_SEQ == 36);
     memset(&flow_tnl, 0, sizeof flow_tnl);
 
     if (!xport) {
diff --git a/ovn/controller/pinctrl.c b/ovn/controller/pinctrl.c
index f960ea9..0b5922c 100644
--- a/ovn/controller/pinctrl.c
+++ b/ovn/controller/pinctrl.c
@@ -164,8 +164,7 @@ pinctrl_handle_arp(const struct flow *ip_flow, const struct match *md,
     enum ofp_version version = rconn_get_version(swconn);
 
     reload_metadata(&ofpacts, md);
-    enum ofperr error = ofpacts_pull_openflow_actions(userdata, userdata->size,
-                                                      version, &ofpacts);
+    enum ofperr error = ofpacts_pull_openflow_actions(userdata, userdata->size, version, &ofpacts);
     if (error) {
         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
         VLOG_WARN_RL(&rl, "failed to parse arp actions (%s)",
@@ -911,7 +910,7 @@ static void
 reload_metadata(struct ofpbuf *ofpacts, const struct match *md)
 {
     enum mf_field_id md_fields[] = {
-#if FLOW_N_REGS == 8
+#if FLOW_N_REGS == 16
         MFF_REG0,
         MFF_REG1,
         MFF_REG2,
@@ -920,6 +919,14 @@ reload_metadata(struct ofpbuf *ofpacts, const struct match *md)
         MFF_REG5,
         MFF_REG6,
         MFF_REG7,
+        MFF_REG8,
+        MFF_REG9,
+        MFF_REG10,
+        MFF_REG11,
+        MFF_REG12,
+        MFF_REG13,
+        MFF_REG14,
+        MFF_REG15,
 #else
 #error
 #endif
diff --git a/tests/ofproto.at b/tests/ofproto.at
index bac6981..78ad09e 100644
--- a/tests/ofproto.at
+++ b/tests/ofproto.at
@@ -1807,7 +1807,7 @@ head_table () {
         actions: output group set_field strip_vlan push_vlan mod_nw_ttl dec_ttl set_mpls_ttl dec_mpls_ttl push_mpls pop_mpls set_queue
         supported on Set-Field: tun_id tun_src tun_dst tun_ipv6_src tun_ipv6_dst tun_flags tun_gbp_id tun_gbp_flags tun_metadata0 dnl
 tun_metadata1 tun_metadata2 tun_metadata3 tun_metadata4 tun_metadata5 tun_metadata6 tun_metadata7 tun_metadata8 tun_metadata9 tun_metadata10 tun_metadata11 tun_metadata12 tun_metadata13 tun_metadata14 tun_metadata15 tun_metadata16 tun_metadata17 tun_metadata18 tun_metadata19 tun_metadata20 tun_metadata21 tun_metadata22 tun_metadata23 tun_metadata24 tun_metadata25 tun_metadata26 tun_metadata27 tun_metadata28 tun_metadata29 tun_metadata30 tun_metadata31 tun_metadata32 tun_metadata33 tun_metadata34 tun_metadata35 tun_metadata36 tun_metadata37 tun_metadata38 tun_metadata39 tun_metadata40 tun_metadata41 tun_metadata42 tun_metadata43 tun_metadata44 tun_metadata45 tun_metadata46 tun_metadata47 tun_metadata48 tun_metadata49 tun_metadata50 tun_metadata51 tun_metadata52 tun_metadata53 tun_metadata54 tun_metadata55 tun_metadata56 tun_metadata57 tun_metadata58 tun_metadata59 tun_metadata60 tun_metadata61 tun_metadata62 tun_metadata63 dnl
-metadata in_port in_port_oxm pkt_mark ct_mark ct_label reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 xreg0 xreg1 xreg2 xreg3 eth_src eth_dst vlan_tci vlan_vid vlan_pcp mpls_label mpls_tc mpls_ttl ip_src ip_dst ipv6_src ipv6_dst ipv6_label nw_tos ip_dscp nw_ecn nw_ttl arp_op arp_spa arp_tpa arp_sha arp_tha tcp_src tcp_dst udp_src udp_dst sctp_src sctp_dst icmp_type icmp_code icmpv6_type icmpv6_code nd_target nd_sll nd_tll
+metadata in_port in_port_oxm pkt_mark ct_mark ct_label reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 reg9 reg10 reg11 reg12 reg13 reg14 reg15 xreg0 xreg1 xreg2 xreg3 xreg4 xreg5 xreg6 xreg7 eth_src eth_dst vlan_tci vlan_vid vlan_pcp mpls_label mpls_tc mpls_ttl ip_src ip_dst ipv6_src ipv6_dst ipv6_label nw_tos ip_dscp nw_ecn nw_ttl arp_op arp_spa arp_tpa arp_sha arp_tha tcp_src tcp_dst udp_src udp_dst sctp_src sctp_dst icmp_type icmp_code icmpv6_type icmpv6_code nd_target nd_sll nd_tll
     matching:
       dp_hash: arbitrary mask
       recirc_id: exact match or wildcard
@@ -1901,10 +1901,22 @@ metadata in_port in_port_oxm pkt_mark ct_mark ct_label reg0 reg1 reg2 reg3 reg4
       reg5: arbitrary mask
       reg6: arbitrary mask
       reg7: arbitrary mask
+      reg8: arbitrary mask
+      reg9: arbitrary mask
+      reg10: arbitrary mask
+      reg11: arbitrary mask
+      reg12: arbitrary mask
+      reg13: arbitrary mask
+      reg14: arbitrary mask
+      reg15: arbitrary mask
       xreg0: arbitrary mask
       xreg1: arbitrary mask
       xreg2: arbitrary mask
       xreg3: arbitrary mask
+      xreg4: arbitrary mask
+      xreg5: arbitrary mask
+      xreg6: arbitrary mask
+      xreg7: arbitrary mask
       eth_src: arbitrary mask
       eth_dst: arbitrary mask
       eth_type: exact match or wildcard
diff --git a/tests/ovs-ofctl.at b/tests/ovs-ofctl.at
index 71c4aab..65ce51b 100644
--- a/tests/ovs-ofctl.at
+++ b/tests/ovs-ofctl.at
@@ -41,7 +41,20 @@ for test_case in \
     'reg6=6                                      NXM,OXM' \
     'reg6=6/1                                    NXM,OXM' \
     'reg7=7                                      NXM,OXM' \
-    'reg7=7/1                                    NXM,OXM' \
+    'reg8=8/1                                    NXM,OXM' \
+    'reg8=8                                      NXM,OXM' \
+    'reg9=9/1                                    NXM,OXM' \
+    'reg9=9                                      NXM,OXM' \
+    'reg10=10                                    NXM,OXM' \
+    'reg10=10/1                                  NXM,OXM' \
+    'reg11=11                                    NXM,OXM' \
+    'reg11=11/1                                  NXM,OXM' \
+    'reg12=12                                    NXM,OXM' \
+    'reg12=12/1                                  NXM,OXM' \
+    'reg13=13                                    NXM,OXM' \
+    'reg13=13/1                                  NXM,OXM' \
+    'reg14=14                                    NXM,OXM' \
+    'reg14=14/1                                  NXM,OXM' \
     'xreg0=0                                     NXM,OXM' \
     'xreg0=0/1                                   NXM,OXM' \
     'xreg1=1                                     NXM,OXM' \
@@ -50,6 +63,14 @@ for test_case in \
     'xreg2=2/3                                   NXM,OXM' \
     'xreg3=3                                     NXM,OXM' \
     'xreg3=3/5                                   NXM,OXM' \
+    'xreg4=4                                     NXM,OXM' \
+    'xreg4=4/1                                   NXM,OXM' \
+    'xreg5=5                                     NXM,OXM' \
+    'xreg5=5/1                                   NXM,OXM' \
+    'xreg6=6                                     NXM,OXM' \
+    'xreg6=6/1                                   NXM,OXM' \
+    'xreg7=7                                     NXM,OXM' \
+    'xreg7=7/1                                   NXM,OXM' \
     'dl_src=00:11:22:33:44:55                    any' \
     'dl_src=00:11:22:33:44:55/00:ff:ff:ff:ff:ff  NXM,OXM,OpenFlow11' \
     'dl_dst=00:11:22:33:44:55                    any' \
@@ -886,15 +907,6 @@ NXOXM_ET_DP_HASH(01234567)
 # Invalid field numbers (experimenter OXM).
 ffff020800002320(11112222)
 ffff030800002320(1111/3333)
-
-# Unimplemented registers.
-#
-# This test assumes that at least two registers, but fewer than 16,
-# registers are implemented.
-00010004(12345678)
-00010108(12345678/12345678)
-00011e04(12345678)
-00011f08(12345678/12345678)
 ])
 AT_CHECK([ovs-ofctl -vPATTERN:'console:%c|%p|%m' --strict parse-nx-match < nx-match.txt], [0], [dnl
 <any>
@@ -1191,15 +1203,6 @@ nx_pull_match() returned error OFPBMC_BAD_FIELD
 # Invalid field numbers (experimenter OXM).
 nx_pull_match() returned error OFPBMC_BAD_FIELD
 nx_pull_match() returned error OFPBMC_BAD_FIELD
-
-# Unimplemented registers.
-#
-# This test assumes that at least two registers, but fewer than 16,
-# registers are implemented.
-NXM_NX_REG0(12345678)
-NXM_NX_REG0_W(12345678/12345678)
-nx_pull_match() returned error OFPBMC_BAD_FIELD
-nx_pull_match() returned error OFPBMC_BAD_FIELD
 ], [stderr])
 
 # Check that at least the first warning made it.  (It's rate-limited
-- 
1.9.1




More information about the dev mailing list