diff --git a/SOURCES/openvswitch-2.17.0.patch b/SOURCES/openvswitch-2.17.0.patch index f7c6c71..3de5e28 100644 --- a/SOURCES/openvswitch-2.17.0.patch +++ b/SOURCES/openvswitch-2.17.0.patch @@ -1,5 +1,5 @@ diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh -index 6cd38ff3ef..2dabd3d0a4 100755 +index 6cd38ff3ef..392c7ee79c 100755 --- a/.ci/linux-build.sh +++ b/.ci/linux-build.sh @@ -220,7 +220,7 @@ fi @@ -7,7 +7,7 @@ index 6cd38ff3ef..2dabd3d0a4 100755 if [ "$DPDK" ] || [ "$DPDK_SHARED" ]; then if [ -z "$DPDK_VER" ]; then - DPDK_VER="21.11" -+ DPDK_VER="21.11.1" ++ DPDK_VER="21.11.2" fi install_dpdk $DPDK_VER fi @@ -60,7 +60,7 @@ index eac3504e48..6c9dddbb59 100644 strategy: diff --git a/Documentation/faq/releases.rst b/Documentation/faq/releases.rst -index af524251ff..33a0d5d2d4 100644 +index af524251ff..49895c595f 100644 --- a/Documentation/faq/releases.rst +++ b/Documentation/faq/releases.rst @@ -32,7 +32,7 @@ Q: What does it mean for an Open vSwitch release to be LTS (long-term support)? @@ -72,21 +72,25 @@ index af524251ff..33a0d5d2d4 100644 For more information on the Open vSwitch release process, refer to :doc:`/internals/release-process`. -@@ -208,9 +208,9 @@ Q: What DPDK version does each Open vSwitch release work with? +@@ -206,11 +206,11 @@ Q: What DPDK version does each Open vSwitch release work with? + 2.10.x 17.11.10 + 2.11.x 18.11.9 2.12.x 18.11.9 - 2.13.x 19.11.10 - 2.14.x 19.11.10 +- 2.13.x 19.11.10 +- 2.14.x 19.11.10 - 2.15.x 20.11.1 - 2.16.x 20.11.1 - 2.17.x 21.11.0 -+ 2.15.x 20.11.4 -+ 2.16.x 20.11.4 -+ 2.17.x 21.11.1 ++ 2.13.x 19.11.13 ++ 2.14.x 19.11.13 ++ 2.15.x 20.11.6 ++ 2.16.x 20.11.6 ++ 2.17.x 21.11.2 ============ ======== Q: Are all the DPDK releases that OVS versions work with maintained? diff --git a/Documentation/intro/install/dpdk.rst b/Documentation/intro/install/dpdk.rst -index d9f44055db..f8f01bfadd 100644 +index d9f44055db..a284e68514 100644 --- a/Documentation/intro/install/dpdk.rst +++ b/Documentation/intro/install/dpdk.rst @@ -42,7 +42,7 @@ Build requirements @@ -94,7 +98,7 @@ index d9f44055db..f8f01bfadd 100644 vSwitch with DPDK will require the following: -- DPDK 21.11 -+- DPDK 21.11.1 ++- DPDK 21.11.2 - A `DPDK supported NIC`_ @@ -105,9 +109,9 @@ index d9f44055db..f8f01bfadd 100644 - $ wget https://fast.dpdk.org/rel/dpdk-21.11.tar.xz - $ tar xf dpdk-21.11.tar.xz - $ export DPDK_DIR=/usr/src/dpdk-21.11 -+ $ wget https://fast.dpdk.org/rel/dpdk-21.11.1.tar.xz -+ $ tar xf dpdk-21.11.1.tar.xz -+ $ export DPDK_DIR=/usr/src/dpdk-stable-21.11 ++ $ wget https://fast.dpdk.org/rel/dpdk-21.11.2.tar.xz ++ $ tar xf dpdk-21.11.2.tar.xz ++ $ export DPDK_DIR=/usr/src/dpdk-stable-21.11.2 $ cd $DPDK_DIR #. Configure and install DPDK using Meson @@ -125,10 +129,10 @@ index c4300cd53e..a297aadac8 100644 - GNU make. diff --git a/NEWS b/NEWS -index c10e9bfacc..7c71284f97 100644 +index c10e9bfacc..36fcbb8748 100644 --- a/NEWS +++ b/NEWS -@@ -1,3 +1,33 @@ +@@ -1,3 +1,51 @@ +v2.17.3 - xx xxx xxxx +--------------------- + - OVSDB: @@ -136,6 +140,24 @@ index c10e9bfacc..7c71284f97 100644 + configuration in a clustered databse independently for each server. + E.g. for listening on unique addresses. See the ovsdb.local-config.5 + manpage for schema details. ++ - DPDK: ++ * OVS validated with DPDK 21.11.2. ++ DPDK 21.11.2 contains fixes for the following CVEs: ++ CVE-2022-28199 cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-28199 ++ CVE-2022-2132 cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-2132 ++ A bug was introduced in DPDK 21.11.1 by the commit ++ 01e3dee29c02 ("vhost: fix unsafe vring addresses modifications"). ++ This bug can cause a deadlock when vIOMMU is enabled and NUMA ++ reallocation of the virtqueues happen. ++ A fix has been posted and pushed to the DPDK 21.11 branch. ++ It can be found here: ++ https://patches.dpdk.org/project/dpdk/patch/20220725203206.427083-2-david.marchand@redhat.com/. ++ If a user wishes to avoid the issue then it is recommended to use ++ DPDK 21.11.0 until the release of DPDK 21.11.3. ++ It should be noted that DPDK 21.11.0 does not benefit from the numerous ++ bug and CVE fixes addressed since its release. ++ If a user wishes to benefit from these fixes it is recommended to use ++ DPDK 21.11.2. + +v2.17.2 - 15 Jun 2022 +--------------------- @@ -50780,6 +50802,19 @@ index 33a1a92953..0103fb5396 100644 conn_key_hash(parent_key, ct->hash_basis), &ct->alg_expectation_refs) { if (!conn_key_cmp(&node->parent_key, parent_key)) { +diff --git a/lib/daemon-unix.c b/lib/daemon-unix.c +index 34d45b82a1..31db2d2c7c 100644 +--- a/lib/daemon-unix.c ++++ b/lib/daemon-unix.c +@@ -393,6 +393,8 @@ monitor_daemon(pid_t daemon_pid) + } + + log_received_backtrace(daemonize_fd); ++ close(daemonize_fd); ++ daemonize_fd = -1; + + /* Throttle restarts to no more than once every 10 seconds. */ + if (time(NULL) < last_restart + 10) { diff --git a/lib/dns-resolve.c b/lib/dns-resolve.c index d344514343..1afcc65adb 100644 --- a/lib/dns-resolve.c @@ -54289,7 +54324,7 @@ index 47115a7b85..ba5d179a65 100644 /* Transactions with named-uuid row names. */ struct json *ovsdb_datum_to_json_with_row_names(const struct ovsdb_datum *, diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c -index c19128d55c..882ede7559 100644 +index c19128d55c..917868c54a 100644 --- a/lib/ovsdb-idl.c +++ b/lib/ovsdb-idl.c @@ -389,25 +389,25 @@ ovsdb_idl_clear(struct ovsdb_idl *db) @@ -54414,7 +54449,18 @@ index c19128d55c..882ede7559 100644 if (!ovsdb_idl_track_is_set(row->table)) { ovs_list_remove(&row->track_node); ovsdb_idl_row_unparse(row); -@@ -2729,7 +2729,7 @@ ovsdb_idl_txn_increment(struct ovsdb_idl_txn *txn, +@@ -2367,6 +2367,10 @@ ovsdb_idl_insert_row(struct ovsdb_idl_row *row, const struct shash *data) + static void + ovsdb_idl_delete_row(struct ovsdb_idl_row *row) + { ++ /* If row has to be reparsed, reparse it before it's deleted. */ ++ if (!ovs_list_is_empty(&row->reparse_node)) { ++ ovsdb_idl_row_parse(row); ++ } + ovsdb_idl_remove_from_indexes(row); + ovsdb_idl_row_clear_arcs(row, true); + ovsdb_idl_row_destroy(row); +@@ -2729,7 +2733,7 @@ ovsdb_idl_txn_increment(struct ovsdb_idl_txn *txn, void ovsdb_idl_txn_destroy(struct ovsdb_idl_txn *txn) { @@ -54423,7 +54469,7 @@ index c19128d55c..882ede7559 100644 if (txn->status == TXN_INCOMPLETE) { ovsdb_cs_forget_transaction(txn->idl->cs, txn->request_id); -@@ -2739,7 +2739,7 @@ ovsdb_idl_txn_destroy(struct ovsdb_idl_txn *txn) +@@ -2739,7 +2743,7 @@ ovsdb_idl_txn_destroy(struct ovsdb_idl_txn *txn) ovsdb_idl_txn_abort(txn); ds_destroy(&txn->comment); free(txn->error); @@ -54432,7 +54478,7 @@ index c19128d55c..882ede7559 100644 free(insert); } hmap_destroy(&txn->inserted_rows); -@@ -2824,7 +2824,7 @@ substitute_uuids(struct json *json, const struct ovsdb_idl_txn *txn) +@@ -2824,7 +2828,7 @@ substitute_uuids(struct json *json, const struct ovsdb_idl_txn *txn) static void ovsdb_idl_txn_disassemble(struct ovsdb_idl_txn *txn) { @@ -54441,7 +54487,7 @@ index c19128d55c..882ede7559 100644 /* This must happen early. Otherwise, ovsdb_idl_row_parse() will call an * ovsdb_idl_column's 'parse' function, which will call -@@ -2832,7 +2832,7 @@ ovsdb_idl_txn_disassemble(struct ovsdb_idl_txn *txn) +@@ -2832,7 +2836,7 @@ ovsdb_idl_txn_disassemble(struct ovsdb_idl_txn *txn) * transaction and fail to update the graph. */ txn->idl->txn = NULL; @@ -55931,7 +55977,7 @@ index bd60adcbc8..2442ceca74 100644 [ax_cv_func_posix_memalign_works=no], [ax_cv_func_posix_memalign_works=no])]) diff --git a/m4/openvswitch.m4 b/m4/openvswitch.m4 -index 4c3bace6ef..21808483e9 100644 +index 4c3bace6ef..09134feca0 100644 --- a/m4/openvswitch.m4 +++ b/m4/openvswitch.m4 @@ -21,7 +21,7 @@ AC_DEFUN([OVS_CHECK_COVERAGE], @@ -56015,11 +56061,49 @@ index 4c3bace6ef..21808483e9 100644 [directory used for conf.db [[SYSCONFDIR/PACKAGE]]]), [DBDIR=$withval], [DBDIR='${sysconfdir}/${PACKAGE}']) +@@ -436,8 +436,8 @@ AC_DEFUN([OVS_CHECK_BINUTILS_AVX512], + mkdir -p build-aux + OBJFILE=build-aux/binutils_avx512_check.o + GATHER_PARAMS='0x8(,%ymm1,1),%ymm0{%k2}' +- echo "vpgatherqq $GATHER_PARAMS" | as --64 -o $OBJFILE - + if ($CC -dumpmachine | grep x86_64) >/dev/null 2>&1; then ++ echo "vpgatherqq $GATHER_PARAMS" | as --64 -o $OBJFILE - + if (objdump -d --no-show-raw-insn $OBJFILE | grep -q $GATHER_PARAMS) >/dev/null 2>&1; then + ovs_cv_binutils_avx512_good=yes + else +@@ -446,11 +446,11 @@ AC_DEFUN([OVS_CHECK_BINUTILS_AVX512], + dnl and causing zmm usage with buggy binutils versions. + CFLAGS="$CFLAGS -mno-avx512f" + fi ++ rm $OBJFILE + else + dnl non x86_64 architectures don't have avx512, so not affected + ovs_cv_binutils_avx512_good=no + fi]) +- rm $OBJFILE + if test "$ovs_cv_binutils_avx512_good" = yes; then + AC_DEFINE([HAVE_LD_AVX512_GOOD], [1], + [Define to 1 if binutils correctly supports AVX512.]) diff --git a/ofproto/bond.c b/ofproto/bond.c -index cdfdf0b9d8..845f69e21d 100644 +index cdfdf0b9d8..6ecd6e1c9f 100644 --- a/ofproto/bond.c +++ b/ofproto/bond.c -@@ -338,7 +338,7 @@ static void +@@ -185,10 +185,14 @@ static struct bond_member *choose_output_member(const struct bond *, + uint16_t vlan) + OVS_REQ_RDLOCK(rwlock); + static void update_recirc_rules__(struct bond *); ++static bool bond_may_recirc(const struct bond *); ++static void bond_update_post_recirc_rules__(struct bond *, bool force) ++ OVS_REQ_WRLOCK(rwlock); + static bool bond_is_falling_back_to_ab(const struct bond *); + static void bond_add_lb_output_buckets(const struct bond *); + static void bond_del_lb_output_buckets(const struct bond *); + ++ + /* Attempts to parse 's' as the name of a bond balancing mode. If successful, + * stores the mode in '*balance' and returns true. Otherwise returns false + * without modifying '*balance'. */ +@@ -338,7 +342,7 @@ static void update_recirc_rules__(struct bond *bond) { struct match match; @@ -56028,7 +56112,7 @@ index cdfdf0b9d8..845f69e21d 100644 uint64_t ofpacts_stub[128 / 8]; struct ofpbuf ofpacts; int i; -@@ -372,7 +372,7 @@ update_recirc_rules__(struct bond *bond) +@@ -372,7 +376,7 @@ update_recirc_rules__(struct bond *bond) ofpbuf_use_stub(&ofpacts, ofpacts_stub, sizeof ofpacts_stub); @@ -56037,7 +56121,62 @@ index cdfdf0b9d8..845f69e21d 100644 int error; switch (pr_op->op) { case ADD: -@@ -1258,7 +1258,7 @@ insert_bal(struct ovs_list *bals, struct bond_member *member) +@@ -510,6 +514,12 @@ bond_reconfigure(struct bond *bond, const struct bond_settings *s) + bond_entry_reset(bond); + } + ++ if (bond->ofproto->backer->rt_support.odp.recirc ++ && bond_may_recirc(bond)) { ++ /* Update rules to reflect possible recirc_id changes. */ ++ update_recirc_rules(bond); ++ } ++ + ovs_rwlock_unlock(&rwlock); + return revalidate; + } +@@ -723,6 +733,12 @@ bond_run(struct bond *bond, enum lacp_status lacp_status) + bond_choose_active_member(bond); + } + ++ if (bond->ofproto->backer->rt_support.odp.recirc ++ && bond_may_recirc(bond)) { ++ /* Update rules to reflect possible link state changes. */ ++ bond_update_post_recirc_rules__(bond, false); ++ } ++ + revalidate = bond->bond_revalidate; + bond->bond_revalidate = false; + ovs_rwlock_unlock(&rwlock); +@@ -1038,7 +1054,7 @@ bond_may_recirc(const struct bond *bond) + } + + static void +-bond_update_post_recirc_rules__(struct bond* bond, const bool force) ++bond_update_post_recirc_rules__(struct bond* bond, bool force) + OVS_REQ_WRLOCK(rwlock) + { + struct bond_entry *e; +@@ -1086,6 +1102,19 @@ bond_update_post_recirc_rules(struct bond *bond, uint32_t *recirc_id, + } + } + ++void ++bond_get_recirc_id_and_hash_basis(struct bond *bond, uint32_t *recirc_id, ++ uint32_t *hash_basis) ++{ ++ ovs_rwlock_rdlock(&rwlock); ++ if (bond_may_recirc(bond)) { ++ *recirc_id = bond->recirc_id; ++ *hash_basis = bond->basis; ++ } else { ++ *recirc_id = *hash_basis = 0; ++ } ++ ovs_rwlock_unlock(&rwlock); ++} + + /* Rebalancing. */ + +@@ -1258,7 +1287,7 @@ insert_bal(struct ovs_list *bals, struct bond_member *member) break; } } @@ -56046,6 +56185,20 @@ index cdfdf0b9d8..845f69e21d 100644 } /* Removes 'member' from its current list and then inserts it into 'bals' so +diff --git a/ofproto/bond.h b/ofproto/bond.h +index 1683ec8781..e7f7ea7a95 100644 +--- a/ofproto/bond.h ++++ b/ofproto/bond.h +@@ -128,6 +128,9 @@ void bond_rebalance(struct bond *); + void bond_update_post_recirc_rules(struct bond *, uint32_t *recirc_id, + uint32_t *hash_basis); + ++void bond_get_recirc_id_and_hash_basis(struct bond *, uint32_t *recirc_id, ++ uint32_t *hash_basis); ++ + bool bond_use_lb_output_action(const struct bond *bond); + + #endif /* bond.h */ diff --git a/ofproto/connmgr.c b/ofproto/connmgr.c index fa8f6cd0e8..172a58cfb7 100644 --- a/ofproto/connmgr.c @@ -56444,6 +56597,64 @@ index 78a54c715d..109940ad2a 100644 ovs_list_remove(&node->node); oftrace_node_destroy(node); } +diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c +index 57f94df544..fe47090584 100644 +--- a/ofproto/ofproto-dpif-upcall.c ++++ b/ofproto/ofproto-dpif-upcall.c +@@ -362,6 +362,10 @@ static void upcall_unixctl_dump_wait(struct unixctl_conn *conn, int argc, + const char *argv[], void *aux); + static void upcall_unixctl_purge(struct unixctl_conn *conn, int argc, + const char *argv[], void *aux); ++static void upcall_unixctl_pause(struct unixctl_conn *conn, int argc, ++ const char *argv[], void *aux); ++static void upcall_unixctl_resume(struct unixctl_conn *conn, int argc, ++ const char *argv[], void *aux); + + static struct udpif_key *ukey_create_from_upcall(struct upcall *, + struct flow_wildcards *); +@@ -434,6 +438,10 @@ udpif_init(void) + upcall_unixctl_dump_wait, NULL); + unixctl_command_register("revalidator/purge", "", 0, 0, + upcall_unixctl_purge, NULL); ++ unixctl_command_register("revalidator/pause", NULL, 0, 0, ++ upcall_unixctl_pause, NULL); ++ unixctl_command_register("revalidator/resume", NULL, 0, 0, ++ upcall_unixctl_resume, NULL); + ovsthread_once_done(&once); + } + } +@@ -3099,6 +3107,31 @@ upcall_unixctl_purge(struct unixctl_conn *conn, int argc OVS_UNUSED, + unixctl_command_reply(conn, ""); + } + ++static void ++upcall_unixctl_pause(struct unixctl_conn *conn, int argc OVS_UNUSED, ++ const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) ++{ ++ struct udpif *udpif; ++ ++ LIST_FOR_EACH (udpif, list_node, &all_udpifs) { ++ udpif_pause_revalidators(udpif); ++ } ++ unixctl_command_reply(conn, ""); ++} ++ ++static void ++upcall_unixctl_resume(struct unixctl_conn *conn, int argc OVS_UNUSED, ++ const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED) ++{ ++ struct udpif *udpif; ++ ++ LIST_FOR_EACH (udpif, list_node, &all_udpifs) { ++ udpif_resume_revalidators(udpif); ++ } ++ unixctl_command_reply(conn, ""); ++} ++ ++ + /* Flows are sorted in the following order: + * netdev, flow state (offloaded/kernel path), flow_pps_rate. + */ diff --git a/ofproto/ofproto-dpif-xlate-cache.c b/ofproto/ofproto-dpif-xlate-cache.c index dcc91cb380..9224ee2e6d 100644 --- a/ofproto/ofproto-dpif-xlate-cache.c @@ -56481,7 +56692,7 @@ index 114aff8ea3..0fc6d2ea60 100644 enum xc_type type; union { diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c -index 578cbfe581..a13cf7bc65 100644 +index 578cbfe581..e804c4d887 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -865,7 +865,7 @@ xlate_xbridge_init(struct xlate_cfg *xcfg, struct xbridge *xbridge) @@ -56603,7 +56814,29 @@ index 578cbfe581..a13cf7bc65 100644 /* If this mirror selects on the basis of VLAN, and it does not select -@@ -3015,7 +3037,7 @@ xlate_normal(struct xlate_ctx *ctx) +@@ -2444,9 +2466,18 @@ output_normal(struct xlate_ctx *ctx, const struct xbundle *out_xbundle, + /* In case recirculation is not actually in use, 'xr.recirc_id' + * will be set to '0', since a valid 'recirc_id' can + * not be zero. */ +- bond_update_post_recirc_rules(out_xbundle->bond, +- &xr.recirc_id, +- &xr.hash_basis); ++ if (ctx->xin->allow_side_effects) { ++ bond_update_post_recirc_rules(out_xbundle->bond, ++ &xr.recirc_id, ++ &xr.hash_basis); ++ } else { ++ /* If side effects are not allowed, only getting the bond ++ * configuration. Rule updates will be handled by the ++ * main thread later. */ ++ bond_get_recirc_id_and_hash_basis(out_xbundle->bond, ++ &xr.recirc_id, ++ &xr.hash_basis); ++ } + if (xr.recirc_id) { + /* Use recirculation instead of output. */ + use_recirc = true; +@@ -3015,7 +3046,7 @@ xlate_normal(struct xlate_ctx *ctx) bool is_grat_arp = is_gratuitous_arp(flow, wc); if (ctx->xin->allow_side_effects && flow->packet_type == htonl(PT_ETH) @@ -56612,7 +56845,7 @@ index 578cbfe581..a13cf7bc65 100644 ) { update_learning_table(ctx, in_xbundle, flow->dl_src, vlan, is_grat_arp); -@@ -3024,12 +3046,14 @@ xlate_normal(struct xlate_ctx *ctx) +@@ -3024,12 +3055,14 @@ xlate_normal(struct xlate_ctx *ctx) struct xc_entry *entry; /* Save just enough info to update mac learning table later. */ @@ -56633,7 +56866,7 @@ index 578cbfe581..a13cf7bc65 100644 } /* Determine output bundle. */ -@@ -3048,7 +3072,6 @@ xlate_normal(struct xlate_ctx *ctx) +@@ -3048,7 +3081,6 @@ xlate_normal(struct xlate_ctx *ctx) */ ctx->xout->slow |= SLOW_ACTION; @@ -56641,7 +56874,7 @@ index 578cbfe581..a13cf7bc65 100644 if (mcast_snooping_is_membership(flow->tp_src) || mcast_snooping_is_query(flow->tp_src)) { if (ctx->xin->allow_side_effects && ctx->xin->packet) { -@@ -3523,6 +3546,9 @@ propagate_tunnel_data_to_flow__(struct flow *dst_flow, +@@ -3523,6 +3555,9 @@ propagate_tunnel_data_to_flow__(struct flow *dst_flow, dst_flow->dl_dst = dmac; dst_flow->dl_src = smac; @@ -56651,7 +56884,7 @@ index 578cbfe581..a13cf7bc65 100644 dst_flow->packet_type = htonl(PT_ETH); dst_flow->nw_dst = src_flow->tunnel.ip_dst; dst_flow->nw_src = src_flow->tunnel.ip_src; -@@ -3654,14 +3680,27 @@ native_tunnel_output(struct xlate_ctx *ctx, const struct xport *xport, +@@ -3654,14 +3689,27 @@ native_tunnel_output(struct xlate_ctx *ctx, const struct xport *xport, err = tnl_neigh_lookup(out_dev->xbridge->name, &d_ip6, &dmac); if (err) { @@ -56681,7 +56914,7 @@ index 578cbfe581..a13cf7bc65 100644 } return err; } -@@ -4176,6 +4215,10 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port, +@@ -4176,6 +4224,10 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port, if (xport->pt_mode == NETDEV_PT_LEGACY_L3) { flow->packet_type = PACKET_TYPE_BE(OFPHTN_ETHERTYPE, ntohs(flow->dl_type)); @@ -56692,7 +56925,7 @@ index 578cbfe581..a13cf7bc65 100644 } } -@@ -5622,7 +5665,8 @@ xlate_sample_action(struct xlate_ctx *ctx, +@@ -5622,7 +5674,8 @@ xlate_sample_action(struct xlate_ctx *ctx, /* Scale the probability from 16-bit to 32-bit while representing * the same percentage. */ @@ -56702,7 +56935,7 @@ index 578cbfe581..a13cf7bc65 100644 /* If ofp_port in flow sample action is equel to ofp_port, * this sample action is a input port action. */ -@@ -7609,6 +7653,10 @@ xlate_wc_finish(struct xlate_ctx *ctx) +@@ -7609,6 +7662,10 @@ xlate_wc_finish(struct xlate_ctx *ctx) ctx->wc->masks.vlans[i].tci = 0; } } @@ -56713,7 +56946,7 @@ index 578cbfe581..a13cf7bc65 100644 } /* Translates the flow, actions, or rule in 'xin' into datapath actions in -@@ -7784,6 +7832,12 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout) +@@ -7784,6 +7841,12 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout) goto exit; } @@ -58862,7 +59095,7 @@ index ef7bb4b8ee..c36a140a8e 100644 -#endif } diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py -index 4ecdcaa197..8f13d1f55a 100644 +index 4ecdcaa197..8e31e02d79 100644 --- a/python/ovs/db/idl.py +++ b/python/ovs/db/idl.py @@ -140,6 +140,47 @@ class ConditionState(object): @@ -59043,10 +59276,14 @@ index 4ecdcaa197..8f13d1f55a 100644 def _row_to_uuid(value): if isinstance(value, Row): return value.uuid -@@ -1268,6 +1297,17 @@ class Row(object): +@@ -1266,7 +1295,19 @@ class Row(object): + return "{table}({data})".format( + table=self._table.name, data=", ".join("{col}={val}".format(col=c, val=getattr(self, c)) - for c in sorted(self._table.columns))) - +- for c in sorted(self._table.columns))) ++ for c in sorted(self._table.columns) ++ if hasattr(self, c))) ++ + def _uuid_to_row(self, atom, base): + if base.ref_table: + try: @@ -59057,11 +59294,10 @@ index 4ecdcaa197..8f13d1f55a 100644 + return table.rows.get(atom) + else: + return atom -+ + def __getattr__(self, column_name): assert self._changes is not None - assert self._mutations is not None -@@ -1309,7 +1349,7 @@ class Row(object): +@@ -1309,7 +1350,7 @@ class Row(object): datum = data.Datum.from_python(column.type, dlist, _row_to_uuid) elif column.type.is_map(): @@ -59070,7 +59306,7 @@ index 4ecdcaa197..8f13d1f55a 100644 if inserts is not None: dmap.update(inserts) if removes is not None: -@@ -1326,7 +1366,7 @@ class Row(object): +@@ -1326,7 +1367,7 @@ class Row(object): else: datum = inserts @@ -59079,7 +59315,7 @@ index 4ecdcaa197..8f13d1f55a 100644 def __setattr__(self, column_name, value): assert self._changes is not None -@@ -1410,7 +1450,7 @@ class Row(object): +@@ -1410,7 +1451,7 @@ class Row(object): if value: try: old_value = data.Datum.to_python(self._data[column_name], @@ -60239,7 +60475,7 @@ index 2c7e163bd6..7be6628c34 100644 AT_CLEANUP diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at -index 7c2edeb9d4..aee2af9fad 100644 +index 7c2edeb9d4..1a8de7398c 100644 --- a/tests/ofproto-dpif.at +++ b/tests/ofproto-dpif.at @@ -29,6 +29,39 @@ AT_CHECK([ovs-appctl revalidator/wait]) @@ -60431,7 +60667,80 @@ index 7c2edeb9d4..aee2af9fad 100644 OVS_VSWITCHD_STOP AT_CLEANUP -@@ -570,7 +603,7 @@ table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2) +@@ -498,6 +531,72 @@ AT_CHECK([sed -n '/member p2/,/^$/p' bond3.txt | grep 'hash'], [0], [ignore]) + OVS_VSWITCHD_STOP() + AT_CLEANUP + ++dnl Regression test for a deadlock / double lock on post-recirculation rule ++dnl updates while processing PACKET_OUT. ++AT_SETUP([ofproto-dpif - balance-tcp bonding rule updates on packet-out]) ++dnl Create br0 with interfaces bond0(p1, p2) and p5, ++dnl and br1 with interfaces bond1(p3, p4) and p6. ++dnl bond0 <-> bond1 ++OVS_VSWITCHD_START( ++ [add-bond br0 bond0 p1 p2 bond_mode=balance-tcp lacp=active dnl ++ other-config:lacp-time=fast other-config:bond-rebalance-interval=1000 -- dnl ++ set interface p1 type=dummy options:pstream=punix:$OVS_RUNDIR/p1.sock ofport_request=1 mtu_request=65535 -- dnl ++ set interface p2 type=dummy options:pstream=punix:$OVS_RUNDIR/p2.sock ofport_request=2 mtu_request=65535 -- dnl ++ add-port br0 p5 -- set interface p5 ofport_request=5 type=dummy mtu_request=65535 -- dnl ++ add-br br1 -- dnl ++ set bridge br1 other-config:hwaddr=aa:66:aa:66:00:00 -- dnl ++ set bridge br1 datapath-type=dummy other-config:datapath-id=1234 dnl ++ fail-mode=secure -- dnl ++ add-bond br1 bond1 p3 p4 bond_mode=balance-tcp lacp=active dnl ++ other-config:lacp-time=fast other-config:bond-rebalance-interval=1000 -- dnl ++ set interface p3 type=dummy options:stream=unix:$OVS_RUNDIR/p1.sock ofport_request=3 mtu_request=65535 -- dnl ++ set interface p4 type=dummy options:stream=unix:$OVS_RUNDIR/p2.sock ofport_request=4 mtu_request=65535 -- dnl ++ add-port br1 p6 -- set interface p6 ofport_request=6 type=dummy mtu_request=65535 --]) ++AT_CHECK([ovs-appctl vlog/set bond:dbg]) ++AT_CHECK([ovs-appctl netdev-dummy/set-admin-state up], 0, [OK ++]) ++AT_CHECK([ovs-ofctl add-flow br0 action=normal]) ++AT_CHECK([ovs-ofctl add-flow br1 action=normal]) ++OVS_WAIT_WHILE([ovs-appctl bond/show | grep "may_enable: false"]) ++ ++ovs-appctl time/stop ++ovs-appctl time/warp 2000 200 ++ ++dnl Send some traffic to distribute all the hashes between ports. ++AT_CHECK([SEND_TCP_BOND_PKTS([p5], [5], [65500])]) ++ ++dnl Wait for rebalancing for per-hash stats accounting. ++ovs-appctl time/warp 1000 100 ++ ++dnl Check that p2 handles some hashes. ++ovs-appctl bond/show > bond1.txt ++AT_CHECK([sed -n '/member p2/,/^$/p' bond1.txt | grep 'hash'], [0], [ignore]) ++ ++dnl Pause revalidators to be sure that they do not update flows while ++dnl the bonding configuration chnages. ++ovs-appctl revalidator/pause ++ ++dnl Move p2 down to trigger update of bonding post-recirculation rules by ++dnl forcing move of all the hashes to p1. ++AT_CHECK([ovs-appctl netdev-dummy/set-admin-state p2 down], 0, [OK ++]) ++ ++dnl Send PACKET_OUT that may lead to flow updates since the bonding ++dnl configuration changed. ++packet=ffffffffffff00102030405008004500001c00000000401100000a000002ffffffff0035111100080000 ++AT_CHECK([ovs-ofctl packet-out br0 "in_port=p5 packet=$packet actions=resubmit(,0)"]) ++ ++dnl Resume revalidators. ++ovs-appctl revalidator/resume ++ovs-appctl revalidator/wait ++ ++ovs-appctl time/warp 200 100 ++dnl Check that all hashes moved form p2 and OVS is still working. ++ovs-appctl bond/show > bond2.txt ++AT_CHECK([sed -n '/member p2/,/^$/p' bond2.txt | grep 'hash'], [1], [ignore]) ++ ++OVS_VSWITCHD_STOP() ++AT_CLEANUP + + # Makes sure recirculation does not change the way packet is handled. + AT_SETUP([ofproto-dpif - balance-tcp bonding, different recirc flow ]) +@@ -570,7 +669,7 @@ table=1 in_port=2 priority=1500 icmp actions=output(17),resubmit(,2) table=1 in_port=3 priority=1500 icmp actions=output(14),resubmit(,2) ]) AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) @@ -60440,7 +60749,7 @@ index 7c2edeb9d4..aee2af9fad 100644 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21 ]) -@@ -584,7 +617,7 @@ echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt +@@ -584,7 +683,7 @@ echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt for i in `seq 1 63`; do echo "table=$i actions=goto_table($(($i+1)))"; done >> flows.txt echo "table=64 actions=output(11)" >> flows.txt AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt]) @@ -60449,7 +60758,7 @@ index 7c2edeb9d4..aee2af9fad 100644 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 10,11 ]) -@@ -600,7 +633,7 @@ table=1 ip actions=write_actions(output(13)),goto_table(2) +@@ -600,7 +699,7 @@ table=1 ip actions=write_actions(output(13)),goto_table(2) table=2 ip actions=set_field:192.168.3.91->ip_src,output(11) ]) AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt]) @@ -60458,7 +60767,7 @@ index 7c2edeb9d4..aee2af9fad 100644 AT_CHECK([tail -2 stdout], [0], [Megaflow: recirc_id=0,eth,ip,in_port=1,nw_src=192.168.0.1,nw_frag=no Datapath actions: 10,set(ipv4(src=192.168.3.91)),11,set(ipv4(src=192.168.3.90)),13 -@@ -617,7 +650,7 @@ table=1 icmp6 actions=write_actions(output(13)),goto_table(2) +@@ -617,7 +716,7 @@ table=1 icmp6 actions=write_actions(output(13)),goto_table(2) table=2 in_port=1,icmp6,icmpv6_type=135 actions=set_field:fe80::4->nd_target,set_field:cc:cc:cc:cc:cc:cc->nd_sll,output(11) ]) AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt]) @@ -60467,7 +60776,7 @@ index 7c2edeb9d4..aee2af9fad 100644 AT_CHECK([tail -4 stdout], [0], [Megaflow: recirc_id=0,eth,icmp6,in_port=1,nw_frag=no,icmp_type=0x87/0xff,icmp_code=0x0/0xff,nd_target=fe80::2020,nd_sll=66:55:44:33:22:11 Datapath actions: 10,set(nd(target=fe80::4,sll=cc:cc:cc:cc:cc:cc)),11,set(nd(target=fe80::3,sll=aa:aa:aa:aa:aa:aa)),13 -@@ -635,7 +668,7 @@ table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip +@@ -635,7 +734,7 @@ table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip table=1 tcp actions=set_field:91->tp_src,output(11),clear_actions ]) AT_CHECK([ovs-ofctl -O OpenFlow12 add-flows br0 flows.txt]) @@ -60476,7 +60785,7 @@ index 7c2edeb9d4..aee2af9fad 100644 AT_CHECK([tail -2 stdout], [0], [Megaflow: recirc_id=0,eth,tcp,in_port=1,nw_frag=no,tp_src=8 Datapath actions: 10,set(tcp(src=91)),11 -@@ -649,7 +682,7 @@ add_of_ports br0 1 10 11 +@@ -649,7 +748,7 @@ add_of_ports br0 1 10 11 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=set_field:192.168.3.90->ip_src,group:123,bucket=output:11']) AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=123,type=all,bucket=output:10']) AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234']) @@ -60485,7 +60794,7 @@ index 7c2edeb9d4..aee2af9fad 100644 AT_CHECK([tail -1 stdout], [0], [Datapath actions: set(ipv4(src=192.168.3.90)),10,set(ipv4(src=192.168.0.1)),11 ]) -@@ -661,7 +694,7 @@ OVS_VSWITCHD_START +@@ -661,7 +760,7 @@ OVS_VSWITCHD_START add_of_ports br0 1 10 11 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11']) AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234']) @@ -60494,7 +60803,7 @@ index 7c2edeb9d4..aee2af9fad 100644 # Must match on the source address to be able to restore it's value for # the second bucket AT_CHECK([tail -2 stdout], [0], -@@ -676,7 +709,7 @@ OVS_VSWITCHD_START +@@ -676,7 +775,7 @@ OVS_VSWITCHD_START add_of_ports br0 1 10 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10]) AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=group:1234']) @@ -60503,7 +60812,7 @@ index 7c2edeb9d4..aee2af9fad 100644 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 10 ]) -@@ -708,7 +741,7 @@ OVS_VSWITCHD_START +@@ -708,7 +807,7 @@ OVS_VSWITCHD_START add_of_ports br0 1 10 11 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,set_field:192.168.3.90->ip_src,bucket=output:11']) AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)']) @@ -60512,7 +60821,7 @@ index 7c2edeb9d4..aee2af9fad 100644 # Must match on the source address to be able to restore it's value for # the third bucket AT_CHECK([tail -2 stdout], [0], -@@ -723,7 +756,7 @@ OVS_VSWITCHD_START +@@ -723,7 +822,7 @@ OVS_VSWITCHD_START add_of_ports br0 1 10 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 group_id=1234,type=indirect,bucket=output:10]) AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)']) @@ -60521,7 +60830,7 @@ index 7c2edeb9d4..aee2af9fad 100644 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 10 ]) -@@ -743,11 +776,11 @@ add_of_ports br0 1 +@@ -743,11 +842,11 @@ add_of_ports br0 1 add_of_ports br1 2 AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br1 'ip actions=write_actions(pop_vlan,output:2)']) AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=output:10']) @@ -60535,7 +60844,7 @@ index 7c2edeb9d4..aee2af9fad 100644 AT_CHECK([tail -1 stdout], [0], [Datapath actions: pop_vlan,2 ]) -@@ -1011,7 +1044,7 @@ OVS_VSWITCHD_START +@@ -1011,7 +1110,7 @@ OVS_VSWITCHD_START add_of_ports br0 1 10 11 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=ff,bucket=watch_port:10,output:10,bucket=watch_port:11,output:11']) AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(group:1234)']) @@ -60544,7 +60853,7 @@ index 7c2edeb9d4..aee2af9fad 100644 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 10 ]) -@@ -1142,7 +1175,7 @@ OVS_VSWITCHD_START +@@ -1142,7 +1241,7 @@ OVS_VSWITCHD_START add_of_ports br0 1 10 11 AT_CHECK([ovs-ofctl -O OpenFlow12 add-group br0 'group_id=1234,type=all,bucket=output:10,move:NXM_NX_REG1[[]]->NXM_OF_IP_SRC[[]],bucket=output:11']) AT_CHECK([ovs-ofctl -O OpenFlow12 add-flow br0 'ip actions=write_actions(load:0xffffffff->NXM_NX_REG1[[]],move:NXM_NX_REG1[[]]->NXM_NX_REG2[[]],group:1234)']) @@ -60553,7 +60862,7 @@ index 7c2edeb9d4..aee2af9fad 100644 AT_CHECK([tail -2 stdout], [0], [Megaflow: recirc_id=0,eth,ip,in_port=1,nw_src=192.168.0.1,nw_frag=no Datapath actions: set(ipv4(src=255.255.255.255)),10,set(ipv4(src=192.168.0.1)),11 -@@ -1288,7 +1321,7 @@ table=1 in_port=1 action=dec_ttl,output:3 +@@ -1288,7 +1387,7 @@ table=1 in_port=1 action=dec_ttl,output:3 AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=111,tos=0,ttl=2,frag=no)' -generate], [0], [stdout]) AT_CHECK([tail -4 stdout], [0], [ @@ -60562,7 +60871,7 @@ index 7c2edeb9d4..aee2af9fad 100644 Megaflow: recirc_id=0,eth,ip,in_port=1,nw_ttl=2,nw_frag=no Datapath actions: set(ipv4(ttl=1)),2,userspace(pid=0,controller(reason=2,dont_send=0,continuation=0,recirc_id=1,rule_cookie=0,controller_id=0,max_len=65535)),4 ]) -@@ -1311,7 +1344,7 @@ ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50: +@@ -1311,7 +1410,7 @@ ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50: OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=34 in_port=1 (via invalid_ttl) data_len=34 (unbuffered) @@ -60571,7 +60880,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP AT_CLEANUP -@@ -1497,13 +1530,13 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6]) +@@ -1497,13 +1596,13 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6]) OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=54 in_port=1 (via no_match) data_len=54 (unbuffered) @@ -60588,7 +60897,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -1560,13 +1593,13 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6]) +@@ -1560,13 +1659,13 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6]) OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl OFPT_PACKET_IN (xid=0x0): total_len=54 in_port=1 (via no_match) data_len=54 (unbuffered) @@ -60605,7 +60914,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -1627,13 +1660,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -1627,13 +1726,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=118 in_port=1 (via action) data_len=118 (unbuffered) @@ -60622,7 +60931,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) dnl Hit table 0, Miss all other tables, sent to controller -@@ -1647,13 +1680,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -1647,13 +1746,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): table_id=253 cookie=0x0 total_len=118 in_port=1 (via no_match) data_len=118 (unbuffered) @@ -60639,7 +60948,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -1690,13 +1723,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -1690,13 +1789,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): table_id=2 cookie=0x0 total_len=118 in_port=1 (via action) data_len=118 (unbuffered) @@ -60656,7 +60965,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) dnl Hit table 1, Miss all other tables, sent to controller -@@ -1710,13 +1743,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -1710,13 +1809,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): table_id=253 cookie=0x0 total_len=118 in_port=1 (via no_match) data_len=118 (unbuffered) @@ -60673,7 +60982,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -1900,13 +1933,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -1900,13 +1999,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([cat ofctl_monitor.log], [0], [dnl OFPT_PACKET_IN (xid=0x0): total_len=118 in_port=1 (via no_match) data_len=118 (unbuffered) @@ -60690,7 +60999,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) dnl Singleton controller action. -@@ -1920,11 +1953,11 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -1920,11 +2019,11 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([cat ofctl_monitor.log], [0], [dnl OFPT_PACKET_IN (xid=0x0): total_len=54 in_port=1 (via action) data_len=54 (unbuffered) @@ -60705,7 +61014,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) dnl Modified controller action. -@@ -1938,13 +1971,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -1938,13 +2037,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([cat ofctl_monitor.log], [0], [dnl OFPT_PACKET_IN (xid=0x0): total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -60722,7 +61031,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) dnl Modified VLAN controller action. -@@ -1958,13 +1991,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -1958,13 +2057,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=38 in_port=1 (via action) data_len=38 (unbuffered) @@ -60739,7 +61048,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) dnl Checksum TCP. -@@ -1978,31 +2011,31 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -1978,31 +2077,31 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=54 in_port=1 (via action) data_len=54 (unbuffered) @@ -60780,7 +61089,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) dnl Checksum UDP. -@@ -2016,31 +2049,31 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -2016,31 +2115,31 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=60 in_port=1 (via action) data_len=60 (unbuffered) @@ -60821,7 +61130,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) dnl Modified ARP controller action. -@@ -2087,31 +2120,31 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 18]) +@@ -2087,31 +2186,31 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 18]) OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0x1 total_len=98 in_port=1 (via action) data_len=98 (unbuffered) @@ -60862,7 +61171,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl -@@ -2151,13 +2184,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2151,13 +2250,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([cat ofctl_monitor.log], [0], [dnl OFPT_PACKET_IN (xid=0x0): total_len=118 in_port=1 (via action) data_len=118 (unbuffered) @@ -60879,7 +61188,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP -@@ -2325,13 +2358,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2325,13 +2424,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xa total_len=34 in_port=1 (via action) data_len=34 (unbuffered) @@ -60896,7 +61205,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) dnl Modified MPLS controller action. -@@ -2539,13 +2572,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2539,13 +2638,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -60913,7 +61222,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2565,13 +2598,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2565,13 +2664,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -60930,7 +61239,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2591,13 +2624,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2591,13 +2690,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -60947,7 +61256,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2617,13 +2650,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2617,13 +2716,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -60964,7 +61273,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2643,13 +2676,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2643,13 +2742,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -60981,7 +61290,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2669,13 +2702,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2669,13 +2768,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -60998,7 +61307,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2695,13 +2728,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2695,13 +2794,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -61015,7 +61324,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2721,13 +2754,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2721,13 +2820,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -61032,7 +61341,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2771,13 +2804,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2771,13 +2870,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -61049,7 +61358,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2797,13 +2830,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2797,13 +2896,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -61066,7 +61375,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2823,13 +2856,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2823,13 +2922,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -61083,7 +61392,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2931,13 +2964,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2931,13 +3030,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xd total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -61100,7 +61409,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2959,13 +2992,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2959,13 +3058,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xe total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -61117,7 +61426,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2986,13 +3019,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2986,13 +3085,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0xe total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -61134,7 +61443,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -3314,13 +3347,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -3314,13 +3413,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl OFPT_PACKET_IN (OF1.2) (xid=0x0): table_id=1 total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -61151,7 +61460,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -3363,13 +3396,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -3363,13 +3462,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([strip_metadata < ofctl_monitor.log], [0], [dnl OFPT_PACKET_IN (OF1.2) (xid=0x0): total_len=58 in_port=1 (via action) data_len=58 (unbuffered) @@ -61168,7 +61477,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -3402,13 +3435,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -3402,13 +3501,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl OFPT_PACKET_IN (xid=0x0): total_len=54 in_port=1 (via action) data_len=54 (unbuffered) @@ -61185,7 +61494,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -3444,13 +3477,13 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) +@@ -3444,13 +3543,13 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl OFPT_PACKET_IN (OF1.3) (xid=0x0): cookie=0x0 total_len=54 in_port=1 (via no_match) data_len=54 (unbuffered) @@ -61202,7 +61511,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -3516,13 +3549,13 @@ send: OFPT_SET_ASYNC (OF1.3) (xid=0x2): +@@ -3516,13 +3615,13 @@ send: OFPT_SET_ASYNC (OF1.3) (xid=0x2): REQUESTFORWARD: (off) dnl OFPT_PACKET_IN (OF1.3) (xid=0x0): cookie=0x0 total_len=54 in_port=1 (via no_match) data_len=54 (unbuffered) @@ -61219,7 +61528,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -3558,13 +3591,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -3558,13 +3657,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) AT_CHECK([ovs-appctl revalidator/purge], [0]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl OFPT_PACKET_IN (OF1.4) (xid=0x0): cookie=0x0 total_len=54 in_port=1 (via no_match) data_len=54 (unbuffered) @@ -61236,7 +61545,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -3607,34 +3640,34 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) +@@ -3607,34 +3706,34 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl OFPT_PACKET_IN (OF1.3) (xid=0x0): table_id=1 cookie=0x0 total_len=54 in_port=1 (via action) data_len=54 (unbuffered) @@ -61281,7 +61590,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -3679,34 +3712,34 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) +@@ -3679,34 +3778,34 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl OFPT_PACKET_IN (OF1.4) (xid=0x0): table_id=1 cookie=0x0 total_len=54 in_port=1 (via action) data_len=54 (unbuffered) @@ -61326,7 +61635,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -3751,10 +3784,10 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -3751,10 +3850,10 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) AT_CHECK([cat ofctl_monitor.log], [0], [dnl OFPT_PACKET_IN (OF1.3) (xid=0x0): table_id=43 cookie=0x0 total_len=98 metadata=0x67871d4d000000,in_port=1 (via action) data_len=98 (unbuffered) @@ -61339,7 +61648,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP -@@ -5007,7 +5040,7 @@ ovs-vsctl \ +@@ -5007,7 +5106,7 @@ ovs-vsctl \ AT_CHECK([ovs-ofctl add-flow br0 action=output:1]) # "in_port" defaults to OFPP_NONE if it's not specified. @@ -61348,7 +61657,7 @@ index 7c2edeb9d4..aee2af9fad 100644 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout]) AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: 1,2 -@@ -5317,7 +5350,7 @@ ovs-vsctl \ +@@ -5317,7 +5416,7 @@ ovs-vsctl \ AT_CHECK([ovs-ofctl add-flow br0 action=output:1]) # "in_port" defaults to OFPP_NONE if it's not specified. @@ -61357,7 +61666,7 @@ index 7c2edeb9d4..aee2af9fad 100644 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout]) AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: 1,trunc(100),2 -@@ -5464,7 +5497,7 @@ ovs-vsctl \ +@@ -5464,7 +5563,7 @@ ovs-vsctl \ flow="in_port=1" AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout]) @@ -61366,7 +61675,7 @@ index 7c2edeb9d4..aee2af9fad 100644 OVS_VSWITCHD_STOP AT_CLEANUP -@@ -5512,11 +5545,11 @@ AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) +@@ -5512,11 +5611,11 @@ AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)" AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout]) @@ -61380,7 +61689,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP -@@ -5573,7 +5606,36 @@ check_flows () { +@@ -5573,7 +5672,36 @@ check_flows () { echo "n_packets=$n" test "$n" = 1 } @@ -61418,7 +61727,7 @@ index 7c2edeb9d4..aee2af9fad 100644 OVS_VSWITCHD_STOP AT_CLEANUP -@@ -6202,6 +6264,20 @@ AT_CHECK([tail -2 stderr], [0], [dnl +@@ -6202,6 +6330,20 @@ AT_CHECK([tail -2 stderr], [0], [dnl ovs-appctl: ovs-vswitchd: server returned an error ]) @@ -61439,7 +61748,7 @@ index 7c2edeb9d4..aee2af9fad 100644 OVS_VSWITCHD_STOP AT_CLEANUP -@@ -7031,7 +7107,7 @@ dnl An 170 byte packet +@@ -7031,7 +7173,7 @@ dnl An 170 byte packet AT_CHECK([ovs-appctl netdev-dummy/receive p1 '000c29c8a0a4005056c0000808004500009cb4a6000040019003c0a8da01c0a8da640800cb5fa762000556f431ad0009388e08090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f']) AT_CHECK([ovs-ofctl parse-pcap p1.pcap], [0], [dnl @@ -61448,7 +61757,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -7600,13 +7676,28 @@ dnl configure bridge IPFIX and ensure that sample action generation works at the +@@ -7600,13 +7742,28 @@ dnl configure bridge IPFIX and ensure that sample action generation works at the dnl datapath level. AT_SETUP([ofproto-dpif - Bridge IPFIX sanity check]) OVS_VSWITCHD_START @@ -61478,7 +61787,7 @@ index 7c2edeb9d4..aee2af9fad 100644 dnl Send some packets that should be sampled. for i in `seq 1 3`; do AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800)']) -@@ -8666,7 +8757,7 @@ recirc_id(0),in_port(100),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(src=192.1 +@@ -8666,7 +8823,7 @@ recirc_id(0),in_port(100),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(src=192.1 ]) AT_CHECK([grep -e '|ofproto_dpif_xlate|WARN|' ovs-vswitchd.log | sed "s/^.*|WARN|//"], [0], [dnl @@ -61487,7 +61796,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP(["/stack underflow/d"]) -@@ -9855,7 +9946,7 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -9855,7 +10012,7 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=86 in_port=1 (via no_match) data_len=86 (unbuffered) @@ -61496,7 +61805,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP -@@ -9906,7 +9997,7 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -9906,7 +10063,7 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=86 in_port=1 (via action) data_len=86 (unbuffered) @@ -61505,7 +61814,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP -@@ -10166,10 +10257,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10166,10 +10323,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) dnl Check this output. We only see the latter two packets, not the first. AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x0 total_len=106 reg0=0x1,reg1=0x4d2,reg2=0x1,reg3=0x1,reg4=0x1,in_port=1 (via action) data_len=106 (unbuffered) @@ -61518,7 +61827,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl -P nxt_packet_in --detach --no-chdir --pidfile 2> ofctl_monitor.log]) -@@ -10187,10 +10278,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10187,10 +10344,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) dnl Check this output. We should see both packets AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): table_id=6 cookie=0x0 total_len=106 reg0=0x1,reg1=0x4d2,reg2=0x1,reg3=0x1,reg4=0x1,in_port=1 (via action) data_len=106 (unbuffered) @@ -61531,7 +61840,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP -@@ -10239,10 +10330,10 @@ dnl Note that the first packet doesn't have the ct_state bits set. This +@@ -10239,10 +10396,10 @@ dnl Note that the first packet doesn't have the ct_state bits set. This dnl happens because the ct_state field is available only after recirc. AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered) @@ -61544,7 +61853,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl -P nxt_packet_in --detach --no-chdir --pidfile 2> ofctl_monitor.log]) -@@ -10261,10 +10352,10 @@ dnl Note that the first packet doesn't have the ct_state bits set. This +@@ -10261,10 +10418,10 @@ dnl Note that the first packet doesn't have the ct_state bits set. This dnl happens because the ct_state field is available only after recirc. AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered) @@ -61557,7 +61866,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) dnl -@@ -10320,9 +10411,9 @@ dnl Note that the first packet doesn't have the ct_state bits set. This +@@ -10320,9 +10477,9 @@ dnl Note that the first packet doesn't have the ct_state bits set. This dnl happens because the ct_state field is available only after recirc. AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=126 in_port=1 (via action) data_len=126 (unbuffered) @@ -61569,7 +61878,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP -@@ -10433,7 +10524,7 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10433,7 +10590,7 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) dnl Check this output. Only one reply must be there AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=106 ct_state=est|rpl|trk,ct_nw_src=10.1.1.1,ct_nw_dst=10.1.1.2,ct_nw_proto=17,ct_tp_src=1,ct_tp_dst=2,ip,in_port=2 (via action) data_len=106 (unbuffered) @@ -61578,7 +61887,7 @@ index 7c2edeb9d4..aee2af9fad 100644 dnl OFPT_ECHO_REQUEST (xid=0x0): 0 bytes of payload ]) -@@ -10467,7 +10558,7 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10467,7 +10624,7 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=86 ct_state=inv|trk,ipv6,in_port=2 (via action) data_len=86 (unbuffered) @@ -61587,7 +61896,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP -@@ -10523,16 +10614,16 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10523,16 +10680,16 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) dnl Check this output. We only see the latter two packets (for each zone), not the first. AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered) @@ -61608,7 +61917,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP -@@ -10579,10 +10670,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10579,10 +10736,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) dnl Check this output. We only see the latter two packets, not the first. AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered) @@ -61621,7 +61930,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP -@@ -10629,10 +10720,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10629,10 +10786,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) dnl Check this output. We only see the first and the last packet AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=47 ct_state=new|trk,ct_nw_src=172.16.0.1,ct_nw_dst=172.16.0.2,ct_nw_proto=17,ct_tp_src=41614,ct_tp_dst=5555,ip,in_port=1 (via action) data_len=47 (unbuffered) @@ -61634,7 +61943,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP -@@ -10681,19 +10772,19 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10681,19 +10838,19 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) dnl Check this output. AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered) @@ -61659,7 +61968,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP -@@ -10738,10 +10829,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10738,10 +10895,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) dnl Check this output. AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=106 ct_state=est|rpl|trk,ct_label=0x1,ct_nw_src=10.1.1.1,ct_nw_dst=10.1.1.2,ct_nw_proto=17,ct_tp_src=1,ct_tp_dst=2,ip,in_port=2 (via action) data_len=106 (unbuffered) @@ -61672,7 +61981,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) OVS_VSWITCHD_STOP -@@ -11152,16 +11243,16 @@ dnl Note that the first packet doesn't have the ct_state bits set. This +@@ -11152,16 +11309,16 @@ dnl Note that the first packet doesn't have the ct_state bits set. This dnl happens because the ct_state field is available only after recirc. AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): cookie=0x0 total_len=106 in_port=1 (via action) data_len=106 (unbuffered) @@ -61693,7 +62002,7 @@ index 7c2edeb9d4..aee2af9fad 100644 ]) dnl The next test verifies that ct_clear at the datapath only gets executed -@@ -11235,13 +11326,13 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -11235,13 +11392,13 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) dnl Check this output. AT_CHECK([cat ofctl_monitor.log], [0], [dnl NXT_PACKET_IN (xid=0x0): table_id=1 cookie=0x0 total_len=106 ct_state=est|rpl|trk,ct_nw_src=10.1.2.100,ct_nw_dst=10.1.2.200,ct_nw_proto=17,ct_tp_src=6,ct_tp_dst=6,ip,in_port=2 (via action) data_len=106 (unbuffered) @@ -62137,6 +62446,103 @@ index fc6253cfe9..920b833b72 100644 join_cluster() { local i=$1 +diff --git a/tests/ovsdb-idl.at b/tests/ovsdb-idl.at +index 62e2b63832..19493a9254 100644 +--- a/tests/ovsdb-idl.at ++++ b/tests/ovsdb-idl.at +@@ -2437,3 +2437,92 @@ unix:socket2 remote has col id in table simple7 + + OVSDB_SERVER_SHUTDOWN + AT_CLEANUP ++ ++dnl This test checks that inserting and deleting the source of a reference ++dnl doesn't remove the reference in the (deleted) source tracked record. ++OVSDB_CHECK_IDL_TRACK([track, insert and delete, refs to link1], ++ [], ++ [['["idltest", ++ {"op": "insert", ++ "table": "link2", ++ "uuid-name": "l2row0", ++ "row": {"i": 1, "l1": ["set", [["named-uuid", "l1row0"]]]} ++ }, ++ {"op": "insert", ++ "table": "link1", ++ "uuid-name": "l1row0", ++ "row": {"i": 1, "k": ["named-uuid", "l1row0"]} ++ }, ++ {"op": "insert", ++ "table": "link2", ++ "uuid-name": "l2row1", ++ "row": {"i": 2, "l1": ["set", [["named-uuid", "l1row0"]]]} ++ } ++ ]' \ ++ '+["idltest", ++ {"op": "delete", ++ "table": "link2", ++ "where": [["i", "==", 2]]} ++ ]' \ ++ '["idltest", ++ {"op": "delete", ++ "table": "link2", ++ "where": [["i", "==", 1]]} ++ ]' ++ ]], ++ [[000: empty ++001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]}]} ++002: {"error":null,"result":[{"count":1}]} ++003: table link1: inserted row: i=1 k=1 ka=[] l2= uuid=<1> ++003: table link1: updated columns: i k ++003: table link2: inserted row: i=1 l1=1 uuid=<0> ++003: table link2: inserted/deleted row: i=2 l1=1 uuid=<2> ++003: table link2: updated columns: i l1 ++003: table link2: updated columns: i l1 ++004: {"error":null,"result":[{"count":1}]} ++005: table link1: i=1 k=1 ka=[] l2= uuid=<1> ++006: done ++]]) ++OVSDB_CHECK_IDL_TRACK([track, insert and delete, refs to link2], ++ [], ++ [['["idltest", ++ {"op": "insert", ++ "table": "link1", ++ "uuid-name": "l1row0", ++ "row": {"i": 1, "k": ["named-uuid", "l1row0"], "l2": ["set", [["named-uuid", "l2row0"]]]} ++ }, ++ {"op": "insert", ++ "table": "link2", ++ "uuid-name": "l2row0", ++ "row": {"i": 1} ++ }, ++ {"op": "insert", ++ "table": "link1", ++ "uuid-name": "l1row1", ++ "row": {"i": 2, "k": ["named-uuid", "l1row0"], "l2": ["set", [["named-uuid", "l2row0"]]]} ++ } ++ ]' \ ++ '+["idltest", ++ {"op": "delete", ++ "table": "link1", ++ "where": [["i", "==", 2]]} ++ ]' \ ++ '["idltest", ++ {"op": "delete", ++ "table": "link1", ++ "where": [["i", "==", 1]]} ++ ]' ++ ]], ++ [[000: empty ++001: {"error":null,"result":[{"uuid":["uuid","<0>"]},{"uuid":["uuid","<1>"]},{"uuid":["uuid","<2>"]}]} ++002: {"error":null,"result":[{"count":1}]} ++003: table link1: inserted row: i=1 k=1 ka=[] l2=1 uuid=<0> ++003: table link1: inserted/deleted row: i=2 k=1 ka=[] l2=1 uuid=<2> ++003: table link1: updated columns: i k l2 ++003: table link1: updated columns: i k l2 ++003: table link2: inserted row: i=1 l1= uuid=<1> ++003: table link2: updated columns: i ++004: {"error":null,"result":[{"count":1}]} ++005: table link2: i=1 l1= uuid=<1> ++006: done ++]]) diff --git a/tests/ovsdb-server.at b/tests/ovsdb-server.at index 876cb836cd..e672c13b27 100644 --- a/tests/ovsdb-server.at @@ -63995,7 +64401,7 @@ index 9259b0b3fc..e50c7c3807 100644 hmap_destroy(&hmap); } diff --git a/tests/test-list.c b/tests/test-list.c -index 6f1fb059bc..2c6c444488 100644 +index 6f1fb059bc..ac82f2048e 100644 --- a/tests/test-list.c +++ b/tests/test-list.c @@ -61,7 +61,7 @@ check_list(struct ovs_list *list, const int values[], size_t n) @@ -64016,7 +64422,16 @@ index 6f1fb059bc..2c6c444488 100644 assert(i == n); assert(ovs_list_is_empty(list) == !n); -@@ -135,6 +135,13 @@ test_list_for_each_safe(void) +@@ -106,6 +106,8 @@ test_list_construction(void) + int values[MAX_ELEMS]; + struct ovs_list list; + ++ memset(elements, 0, sizeof elements); ++ memset(values, 0, sizeof values); + make_list(&list, elements, values, n); + check_list(&list, values, n); + } +@@ -135,6 +137,13 @@ test_list_for_each_safe(void) values_idx = 0; n_remaining = n; LIST_FOR_EACH_SAFE (e, next, node, &list) { @@ -64030,7 +64445,7 @@ index 6f1fb059bc..2c6c444488 100644 assert(i < n); if (pattern & (1ul << i)) { ovs_list_remove(&e->node); -@@ -148,7 +155,8 @@ test_list_for_each_safe(void) +@@ -148,7 +157,8 @@ test_list_for_each_safe(void) i++; } assert(i == n); @@ -64040,7 +64455,7 @@ index 6f1fb059bc..2c6c444488 100644 for (i = 0; i < n; i++) { if (pattern & (1ul << i)) { -@@ -156,6 +164,35 @@ test_list_for_each_safe(void) +@@ -156,6 +166,35 @@ test_list_for_each_safe(void) } } assert(n == n_remaining); @@ -64077,7 +64492,7 @@ index 6f1fb059bc..2c6c444488 100644 } } diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c -index ca4e87b811..3194f50f2d 100644 +index ca4e87b811..c7bc32a246 100644 --- a/tests/test-ovsdb.c +++ b/tests/test-ovsdb.c @@ -294,11 +294,24 @@ print_and_free_ovsdb_error(struct ovsdb_error *error) @@ -64321,6 +64736,26 @@ index ca4e87b811..3194f50f2d 100644 /* Create table. */ json = parse_json("{\"name\": \"testdb\", " " \"tables\": " +@@ -1885,11 +1946,14 @@ format_idl_row(const struct ovsdb_idl_row *row, int step, const char *contents, + const char *change_str = + !ovsdb_idl_track_is_set(row->table) + ? "" +- : ovsdb_idl_row_get_seqno(row, OVSDB_IDL_CHANGE_INSERT) > 0 +- ? "inserted row: " +- : ovsdb_idl_row_get_seqno(row, OVSDB_IDL_CHANGE_DELETE) > 0 +- ? "deleted row: " +- : ""; ++ : ovsdb_idl_row_get_seqno(row, OVSDB_IDL_CHANGE_INSERT) > 0 && ++ ovsdb_idl_row_get_seqno(row, OVSDB_IDL_CHANGE_DELETE) > 0 ++ ? "inserted/deleted row: " ++ : ovsdb_idl_row_get_seqno(row, OVSDB_IDL_CHANGE_INSERT) > 0 ++ ? "inserted row: " ++ : ovsdb_idl_row_get_seqno(row, OVSDB_IDL_CHANGE_DELETE) > 0 ++ ? "deleted row: " ++ : ""; + + if (terse) { + return xasprintf("%03d: table %s", step, row->table->class_->name); diff --git a/tests/test-ovsdb.py b/tests/test-ovsdb.py index 853264f22b..402cacbe9d 100644 --- a/tests/test-ovsdb.py @@ -64414,6 +64849,18 @@ index f0fd042108..7d899fbbfd 100644 /* Check maximum x such that f(x) == n. */ check_ctz32(UINT32_MAX << n, n); +diff --git a/tests/test-vconn.c b/tests/test-vconn.c +index fc8ce4a2c0..96c89bd4e6 100644 +--- a/tests/test-vconn.c ++++ b/tests/test-vconn.c +@@ -157,6 +157,7 @@ test_refuse_connection(struct ovs_cmdl_context *ctx) + error = vconn_connect_block(vconn, (TIMEOUT - 2) * 1000); + if (!strcmp(type, "tcp")) { + if (error != ECONNRESET && error != EPIPE && error != ETIMEDOUT ++ && error != ECONNREFUSED + #ifdef _WIN32 + && error != WSAECONNRESET + #endif diff --git a/tests/tunnel-push-pop-ipv6.at b/tests/tunnel-push-pop-ipv6.at index 3f58e3e8fd..8c5af459e9 100644 --- a/tests/tunnel-push-pop-ipv6.at diff --git a/SPECS/openvswitch2.17.spec b/SPECS/openvswitch2.17.spec index da25093..d70dfbc 100644 --- a/SPECS/openvswitch2.17.spec +++ b/SPECS/openvswitch2.17.spec @@ -57,7 +57,7 @@ Summary: Open vSwitch Group: System Environment/Daemons daemon/database/utilities URL: http://www.openvswitch.org/ Version: 2.17.0 -Release: 45%{?dist} +Release: 46%{?dist} # Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the # lib/sflow*.[ch] files are SISSL @@ -748,6 +748,20 @@ exit 0 %endif %changelog +* Fri Oct 07 2022 Open vSwitch CI - 2.17.0-46 +- Merging upstream branch-2.17 [RH git: b2b4334db0] + Commit list: + 09e22fec45 daemon-unix: Fix file descriptor leak when monitor restarts child. + 53df50db26 vconn: Allow ECONNREFUSED in refuse connection test. + 26a11ca610 dpdk: Use DPDK 21.11.2 release. + edf699ec64 m4: Test avx512 for x86 only. + 1989caf9ea ovsdb-idl: Preserve references for rows deleted in same IDL run as their insertion. (#2126450) + db6a612cd7 python: idl: Fix idl.Row.__str__ method. + 73d7bf64a7 bond: Avoid deadlock while updating post recirculation rules. + 70a63391cb ofproto-dpif-upcall: Add debug commands to pause/resume revalidators. + cf0e12f8ae test-list: Fix false-positive build failure with GCC 12. + + * Tue Oct 04 2022 Timothy Redaelli - 2.17.0-45 - redhat: get the NVR from spec file directly [RH git: f3b0501deb] Fixes: 339efe77c4c7 ("pkgtool: keep %{?dist} before added bz string")