With eight 32-bit registers, we can only store two IPv6 addresses, which is pretty tight.
Signed-off-by: Justin Pettit <jpet...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev