diff --git a/SOURCES/openvswitch-2.17.0.patch b/SOURCES/openvswitch-2.17.0.patch index 3181760..1712036 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..392c7ee79c 100755 +index 6cd38ff3ef..74872753d0 100755 --- a/.ci/linux-build.sh +++ b/.ci/linux-build.sh @@ -220,7 +220,7 @@ fi @@ -11,6 +11,15 @@ index 6cd38ff3ef..392c7ee79c 100755 fi install_dpdk $DPDK_VER fi +@@ -233,7 +233,7 @@ elif [ "$M32" ]; then + # difference on 'configure' and 'make' stages. + export CC="$CC -m32" + elif [ "$TRAVIS_ARCH" != "aarch64" ]; then +- OPTS="--enable-sparse" ++ EXTRA_OPTS="$EXTRA_OPTS --enable-sparse" + if [ "$AFXDP" ]; then + # netdev-afxdp uses memset for 64M for umem initialization. + SPARSE_FLAGS="${SPARSE_FLAGS} -Wno-memcpy-max-count" @@ -244,9 +244,7 @@ fi if [ "$ASAN" ]; then # This will override default option configured in tests/atlocal.in. @@ -212,13 +221,27 @@ index c4300cd53e..a297aadac8 100644 - GNU make. diff --git a/NEWS b/NEWS -index c10e9bfacc..b04b7b4c9d 100644 +index c10e9bfacc..45b974ed22 100644 --- a/NEWS +++ b/NEWS -@@ -1,3 +1,55 @@ -+v2.17.4 - xx xxx xxxx +@@ -1,3 +1,69 @@ ++v2.17.6 - xx xxx xxxx +--------------------- + ++v2.17.5 - 20 Dec 2022 ++--------------------- ++ - Bug fixes ++ - Security: ++ * Fixed LLDP underflow issue while parsing malformed Auto Attach TLVs. ++ The original patch is available here: ++ https://mail.openvswitch.org/pipermail/ovs-dev/2022-December/400596.html ++ ++v2.17.4 - 01 Dec 2022 ++--------------------- ++ - Bug fixes ++ - QoS: ++ * Fixed inability to apply QoS on ports with custom qdiscs. ++ +v2.17.3 - 07 Oct 2022 +--------------------- + - Bug fixes @@ -473,7 +496,7 @@ index 1884c99e1f..aca1dbca91 100755 +dhparam_to_c lib/dh4096.pem +echo "#endif" diff --git a/configure.ac b/configure.ac -index 4e9bcce272..733068bfd2 100644 +index 4e9bcce272..64db07f27b 100644 --- a/configure.ac +++ b/configure.ac @@ -13,7 +13,7 @@ @@ -481,7 +504,7 @@ index 4e9bcce272..733068bfd2 100644 AC_PREREQ(2.63) -AC_INIT(openvswitch, 2.17.0, bugs@openvswitch.org) -+AC_INIT(openvswitch, 2.17.4, bugs@openvswitch.org) ++AC_INIT(openvswitch, 2.17.6, bugs@openvswitch.org) AC_CONFIG_SRCDIR([datapath/datapath.c]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_AUX_DIR([build-aux]) @@ -733,15 +756,27 @@ index cc0840704a..2a206305ec 100644 completionList->dropNbl = NULL; completionList->dropNblNext = &completionList->dropNbl; diff --git a/debian/changelog b/debian/changelog -index 3e0d3a66e3..1a1f0984b3 100644 +index 3e0d3a66e3..11de722a81 100644 --- a/debian/changelog +++ b/debian/changelog -@@ -1,3 +1,27 @@ +@@ -1,3 +1,39 @@ ++openvswitch (2.17.6-1) unstable; urgency=low ++ [ Open vSwitch team ] ++ * New upstream version ++ ++ -- Open vSwitch team Tue, 20 Dec 2022 20:06:56 +0100 ++ ++openvswitch (2.17.5-1) unstable; urgency=low ++ [ Open vSwitch team ] ++ * New upstream version ++ ++ -- Open vSwitch team Tue, 20 Dec 2022 20:06:56 +0100 ++ +openvswitch (2.17.4-1) unstable; urgency=low + [ Open vSwitch team ] + * New upstream version + -+ -- Open vSwitch team Fri, 07 Oct 2022 13:12:51 +0200 ++ -- Open vSwitch team Thu, 01 Dec 2022 13:16:55 +0100 + +openvswitch (2.17.3-1) unstable; urgency=low + [ Open vSwitch team ] @@ -24167,7 +24202,7 @@ index d1230f94cb..b5cd6188b4 100644 #endif /* _HNS3_STATS_H_ */ diff --git a/dpdk/drivers/net/i40e/i40e_ethdev.c b/dpdk/drivers/net/i40e/i40e_ethdev.c -index c0bfff43ee..bad27355fc 100644 +index c0bfff43ee..ecef1a6e7e 100644 --- a/dpdk/drivers/net/i40e/i40e_ethdev.c +++ b/dpdk/drivers/net/i40e/i40e_ethdev.c @@ -386,6 +386,7 @@ static int i40e_set_default_mac_addr(struct rte_eth_dev *dev, @@ -24289,7 +24324,7 @@ index c0bfff43ee..bad27355fc 100644 struct i40e_ethertype_filter * i40e_sw_ethertype_filter_lookup(struct i40e_ethertype_rule *ethertype_rule, const struct i40e_ethertype_filter_input *input) -@@ -12103,6 +12105,35 @@ i40e_cloud_filter_qinq_create(struct i40e_pf *pf) +@@ -12103,6 +12105,40 @@ i40e_cloud_filter_qinq_create(struct i40e_pf *pf) return ret; } @@ -24302,8 +24337,13 @@ index c0bfff43ee..bad27355fc 100644 + enum i40e_status_code status; + bool can_be_set = true; + -+ /* I40E_MEDIA_TYPE_BASET link up can be ignored */ -+ if (hw->phy.media_type != I40E_MEDIA_TYPE_BASET) { ++ /* ++ * I40E_MEDIA_TYPE_BASET link up can be ignored ++ * I40E_MEDIA_TYPE_BASET link down that hw->phy.media_type ++ * is I40E_MEDIA_TYPE_UNKNOWN ++ */ ++ if (hw->phy.media_type != I40E_MEDIA_TYPE_BASET && ++ hw->phy.media_type != I40E_MEDIA_TYPE_UNKNOWN) { + do { + update_link_reg(hw, &link); + if (link.link_status) @@ -49522,7 +49562,7 @@ index 926b5c0bd9..7d1d6a1861 100644 goto error_exit; } diff --git a/dpdk/lib/vhost/vhost_user.c b/dpdk/lib/vhost/vhost_user.c -index a781346c4d..df780fd7d6 100644 +index a781346c4d..2b45e35d4a 100644 --- a/dpdk/lib/vhost/vhost_user.c +++ b/dpdk/lib/vhost/vhost_user.c @@ -143,57 +143,59 @@ get_blk_size(int fd) @@ -49802,7 +49842,7 @@ index a781346c4d..df780fd7d6 100644 fd = msg->fds[0]; if (msg->size != sizeof(msg->payload.inflight) || fd < 0) { VHOST_LOG_CONFIG(ERR, -@@ -2566,8 +2572,11 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg, +@@ -2566,8 +2572,12 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg, vhost_user_iotlb_cache_insert(vq, imsg->iova, vva, len, imsg->perm); @@ -49810,12 +49850,13 @@ index a781346c4d..df780fd7d6 100644 + if (is_vring_iotlb(dev, vq, imsg)) { + rte_spinlock_lock(&vq->access_lock); *pdev = dev = translate_ring_addresses(dev, i); ++ vq = dev->virtqueue[i]; + rte_spinlock_unlock(&vq->access_lock); + } } break; case VHOST_IOTLB_INVALIDATE: -@@ -2580,8 +2589,11 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg, +@@ -2580,8 +2590,11 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, struct VhostUserMsg *msg, vhost_user_iotlb_cache_remove(vq, imsg->iova, imsg->size); @@ -49828,7 +49869,7 @@ index a781346c4d..df780fd7d6 100644 } break; default: -@@ -2873,6 +2885,9 @@ vhost_user_check_and_alloc_queue_pair(struct virtio_net *dev, +@@ -2873,6 +2886,9 @@ vhost_user_check_and_alloc_queue_pair(struct virtio_net *dev, case VHOST_USER_SET_VRING_ADDR: vring_idx = msg->payload.addr.index; break; @@ -49838,7 +49879,7 @@ index a781346c4d..df780fd7d6 100644 default: return 0; } -@@ -2961,7 +2976,6 @@ vhost_user_msg_handler(int vid, int fd) +@@ -2961,7 +2977,6 @@ vhost_user_msg_handler(int vid, int fd) return -1; } @@ -49846,7 +49887,7 @@ index a781346c4d..df780fd7d6 100644 request = msg.request.master; if (request > VHOST_USER_NONE && request < VHOST_USER_MAX && vhost_message_str[request]) { -@@ -3103,9 +3117,11 @@ vhost_user_msg_handler(int vid, int fd) +@@ -3103,9 +3118,11 @@ vhost_user_msg_handler(int vid, int fd) } else if (ret == RTE_VHOST_MSG_RESULT_ERR) { VHOST_LOG_CONFIG(ERR, "vhost message handling failed.\n"); @@ -49859,7 +49900,7 @@ index a781346c4d..df780fd7d6 100644 for (i = 0; i < dev->nr_vring; i++) { struct vhost_virtqueue *vq = dev->virtqueue[i]; bool cur_ready = vq_is_ready(dev, vq); -@@ -3116,10 +3132,11 @@ vhost_user_msg_handler(int vid, int fd) +@@ -3116,10 +3133,11 @@ vhost_user_msg_handler(int vid, int fd) } } @@ -49872,7 +49913,7 @@ index a781346c4d..df780fd7d6 100644 goto out; /* -@@ -3146,7 +3163,7 @@ vhost_user_msg_handler(int vid, int fd) +@@ -3146,7 +3164,7 @@ vhost_user_msg_handler(int vid, int fd) } out: @@ -51574,7 +51615,7 @@ index 66016eb099..7425dd44e7 100644 /* Statistics. */ struct dp_netdev_flow_stats stats; diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c -index 9f35713ef5..24b64b1686 100644 +index 9f35713ef5..b9cafc2737 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -93,7 +93,8 @@ VLOG_DEFINE_THIS_MODULE(dpif_netdev); @@ -51629,7 +51670,36 @@ index 9f35713ef5..24b64b1686 100644 item->timestamp = pmd->ctx.now; dp_netdev_offload_flow_enqueue(item); -@@ -4095,6 +4095,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd, +@@ -3335,6 +3335,28 @@ netdev_flow_key_init_masked(struct netdev_flow_key *dst, + (dst_u64 - miniflow_get_values(&dst->mf)) * 8); + } + ++/* Initializes 'key' as a copy of 'flow'. */ ++static inline void ++netdev_flow_key_init(struct netdev_flow_key *key, ++ const struct flow *flow) ++{ ++ uint64_t *dst = miniflow_values(&key->mf); ++ uint32_t hash = 0; ++ uint64_t value; ++ ++ miniflow_map_init(&key->mf, flow); ++ miniflow_init(&key->mf, flow); ++ ++ size_t n = dst - miniflow_get_values(&key->mf); ++ ++ FLOW_FOR_EACH_IN_MAPS (value, flow, key->mf.map) { ++ hash = hash_add64(hash, value); ++ } ++ ++ key->hash = hash_finish(hash, n * 8); ++ key->len = netdev_flow_key_size(n); ++} ++ + static inline void + emc_change_entry(struct emc_entry *ce, struct dp_netdev_flow *flow, + const struct netdev_flow_key *key) +@@ -4095,6 +4117,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd, flow->dead = false; flow->batch = NULL; flow->mark = INVALID_FLOW_MARK; @@ -51637,7 +51707,7 @@ index 9f35713ef5..24b64b1686 100644 *CONST_CAST(unsigned *, &flow->pmd_id) = pmd->core_id; *CONST_CAST(struct flow *, &flow->flow) = match->flow; *CONST_CAST(ovs_u128 *, &flow->ufid) = *ufid; -@@ -4129,7 +4130,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd, +@@ -4129,7 +4152,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd, } queue_netdev_flow_put(pmd, flow, match, actions, actions_len, @@ -51646,7 +51716,7 @@ index 9f35713ef5..24b64b1686 100644 log_netdev_flow_change(flow, match, NULL, actions, actions_len); return flow; -@@ -4171,7 +4172,7 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd, +@@ -4171,7 +4194,7 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd, ovsrcu_set(&netdev_flow->actions, new_actions); queue_netdev_flow_put(pmd, netdev_flow, match, @@ -51655,7 +51725,32 @@ index 9f35713ef5..24b64b1686 100644 DP_NETDEV_FLOW_OFFLOAD_OP_MOD); log_netdev_flow_change(netdev_flow, match, old_actions, put->actions, put->actions_len); -@@ -4778,8 +4779,8 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config) +@@ -4208,7 +4231,7 @@ static int + dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put) + { + struct dp_netdev *dp = get_dp_netdev(dpif); +- struct netdev_flow_key key, mask; ++ struct netdev_flow_key key; + struct dp_netdev_pmd_thread *pmd; + struct match match; + ovs_u128 ufid; +@@ -4257,9 +4280,12 @@ dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put) + + /* Must produce a netdev_flow_key for lookup. + * Use the same method as employed to create the key when adding +- * the flow to the dplcs to make sure they match. */ +- netdev_flow_mask_init(&mask, &match); +- netdev_flow_key_init_masked(&key, &match.flow, &mask); ++ * the flow to the dplcs to make sure they match. ++ * We need to put in the unmasked key as flow_put_on_pmd() will first try ++ * to see if an entry exists doing a packet type lookup. As masked-out ++ * fields are interpreted as zeros, they could falsely match a wider IP ++ * address mask. Installation of the flow will use the match variable. */ ++ netdev_flow_key_init(&key, &match.flow); + + if (put->pmd_id == PMD_ID_NULL) { + if (cmap_count(&dp->poll_threads) == 0) { +@@ -4778,8 +4804,8 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config) uint32_t insert_min, cur_min; uint32_t tx_flush_interval, cur_tx_flush_interval; uint64_t rebalance_intvl; @@ -51666,7 +51761,7 @@ index 9f35713ef5..24b64b1686 100644 bool log_autolb = false; enum sched_assignment_type pmd_rxq_assign_type; -@@ -4880,8 +4881,12 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config) +@@ -4880,8 +4906,12 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config) struct pmd_auto_lb *pmd_alb = &dp->pmd_alb; @@ -51681,7 +51776,7 @@ index 9f35713ef5..24b64b1686 100644 /* Input is in min, convert it to msec. */ rebalance_intvl = -@@ -4894,21 +4899,21 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config) +@@ -4894,21 +4924,21 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config) log_autolb = true; } @@ -51709,7 +51804,7 @@ index 9f35713ef5..24b64b1686 100644 if (rebalance_load > 100) { rebalance_load = ALB_LOAD_THRESHOLD; } -@@ -4916,7 +4921,7 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config) +@@ -4916,7 +4946,7 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config) if (rebalance_load != cur_rebalance_load) { atomic_store_relaxed(&pmd_alb->rebalance_load_thresh, rebalance_load); @@ -51718,7 +51813,7 @@ index 9f35713ef5..24b64b1686 100644 rebalance_load); log_autolb = true; } -@@ -5425,7 +5430,6 @@ port_reconfigure(struct dp_netdev_port *port) +@@ -5425,7 +5455,6 @@ port_reconfigure(struct dp_netdev_port *port) port->rxqs[i].port = port; port->rxqs[i].is_vhost = !strncmp(port->type, "dpdkvhost", 9); @@ -51726,7 +51821,7 @@ index 9f35713ef5..24b64b1686 100644 err = netdev_rxq_open(netdev, &port->rxqs[i].rx, i); if (err) { -@@ -5684,23 +5688,28 @@ sched_numa_list_put_in_place(struct sched_numa_list *numa_list) +@@ -5684,23 +5713,28 @@ sched_numa_list_put_in_place(struct sched_numa_list *numa_list) } } @@ -51760,7 +51855,7 @@ index 9f35713ef5..24b64b1686 100644 rxq->pmd->numa_id != netdev_get_numa_id(rxq->port->netdev)) { return true; -@@ -6000,10 +6009,10 @@ sched_numa_list_schedule(struct sched_numa_list *numa_list, +@@ -6000,10 +6034,10 @@ sched_numa_list_schedule(struct sched_numa_list *numa_list, /* Find any numa with available PMDs. */ for (int j = 0; j < n_numa; j++) { numa = sched_numa_list_next(numa_list, last_cross_numa); @@ -51772,7 +51867,7 @@ index 9f35713ef5..24b64b1686 100644 numa = NULL; } } -@@ -6111,7 +6120,7 @@ sched_numa_list_variance(struct sched_numa_list *numa_list) +@@ -6111,7 +6145,7 @@ sched_numa_list_variance(struct sched_numa_list *numa_list) * pmd_rebalance_dry_run() can be avoided when it is not needed. */ static bool @@ -51781,7 +51876,7 @@ index 9f35713ef5..24b64b1686 100644 OVS_REQ_RDLOCK(dp->port_rwlock) { struct dp_netdev_pmd_thread *pmd; -@@ -6342,11 +6351,11 @@ pmd_remove_stale_ports(struct dp_netdev *dp, +@@ -6342,11 +6376,11 @@ pmd_remove_stale_ports(struct dp_netdev *dp, OVS_EXCLUDED(pmd->port_mutex) OVS_REQ_RDLOCK(dp->port_rwlock) { @@ -51796,7 +51891,7 @@ index 9f35713ef5..24b64b1686 100644 struct dp_netdev_port *port = poll->rxq->port; if (port->need_reconfigure -@@ -6354,7 +6363,7 @@ pmd_remove_stale_ports(struct dp_netdev *dp, +@@ -6354,7 +6388,7 @@ pmd_remove_stale_ports(struct dp_netdev *dp, dp_netdev_del_rxq_from_pmd(pmd, poll); } } @@ -51805,7 +51900,7 @@ index 9f35713ef5..24b64b1686 100644 struct dp_netdev_port *port = tx->port; if (port->need_reconfigure -@@ -6430,8 +6439,7 @@ reconfigure_datapath(struct dp_netdev *dp) +@@ -6430,8 +6464,7 @@ reconfigure_datapath(struct dp_netdev *dp) /* We only reconfigure the ports that we determined above, because they're * not being used by any pmd thread at the moment. If a port fails to * reconfigure we remove it from the datapath. */ @@ -51815,7 +51910,7 @@ index 9f35713ef5..24b64b1686 100644 int err; if (!port->need_reconfigure) { -@@ -6487,10 +6495,10 @@ reconfigure_datapath(struct dp_netdev *dp) +@@ -6487,10 +6520,10 @@ reconfigure_datapath(struct dp_netdev *dp) } CMAP_FOR_EACH (pmd, node, &dp->poll_threads) { @@ -51828,7 +51923,7 @@ index 9f35713ef5..24b64b1686 100644 if (poll->rxq->pmd != pmd) { dp_netdev_del_rxq_from_pmd(pmd, poll); -@@ -6682,7 +6690,7 @@ dpif_netdev_run(struct dpif *dpif) +@@ -6682,7 +6715,7 @@ dpif_netdev_run(struct dpif *dpif) if (pmd_rebalance && !dp_netdev_is_reconf_required(dp) && !ports_require_restart(dp) && @@ -51837,7 +51932,7 @@ index 9f35713ef5..24b64b1686 100644 pmd_rebalance_dry_run(dp)) { VLOG_INFO("PMD auto load balance dry run. " "Requesting datapath reconfigure."); -@@ -7364,15 +7372,15 @@ static struct dp_netdev_pmd_thread * +@@ -7364,15 +7397,15 @@ static struct dp_netdev_pmd_thread * dp_netdev_get_pmd(struct dp_netdev *dp, unsigned core_id) { struct dp_netdev_pmd_thread *pmd; @@ -51859,7 +51954,7 @@ index 9f35713ef5..24b64b1686 100644 } /* Sets the 'struct dp_netdev_pmd_thread' for non-pmd threads. */ -@@ -7505,6 +7513,7 @@ dp_netdev_destroy_pmd(struct dp_netdev_pmd_thread *pmd) +@@ -7505,6 +7538,7 @@ dp_netdev_destroy_pmd(struct dp_netdev_pmd_thread *pmd) seq_destroy(pmd->reload_seq); ovs_mutex_destroy(&pmd->port_mutex); ovs_mutex_destroy(&pmd->bond_mutex); @@ -51867,7 +51962,7 @@ index 9f35713ef5..24b64b1686 100644 free(pmd); } -@@ -8020,17 +8029,15 @@ dp_netdev_hw_flow(const struct dp_netdev_pmd_thread *pmd, +@@ -8020,17 +8054,15 @@ dp_netdev_hw_flow(const struct dp_netdev_pmd_thread *pmd, #ifdef ALLOW_EXPERIMENTAL_API /* Packet restoration API required. */ /* Restore the packet if HW processing was terminated before completion. */ struct dp_netdev_rxq *rxq = pmd->ctx.last_rxq; @@ -52666,6 +52761,26 @@ index e70a2b7048..34bb7e3d69 100644 Libs.private: @LIBS@ -Cflags: -I${includedir}/openvswitch +Cflags: -I${includedir} +diff --git a/lib/lldp/lldp.c b/lib/lldp/lldp.c +index dfeb2a8002..6fdcfef569 100644 +--- a/lib/lldp/lldp.c ++++ b/lib/lldp/lldp.c +@@ -583,6 +583,7 @@ lldp_decode(struct lldpd *cfg OVS_UNUSED, char *frame, int s, + + switch(tlv_subtype) { + case LLDP_TLV_AA_ELEMENT_SUBTYPE: ++ CHECK_TLV_SIZE(50, "ELEMENT"); + PEEK_BYTES(&msg_auth_digest, sizeof msg_auth_digest); + + aa_element_dword = PEEK_UINT32; +@@ -629,6 +630,7 @@ lldp_decode(struct lldpd *cfg OVS_UNUSED, char *frame, int s, + break; + + case LLDP_TLV_AA_ISID_VLAN_ASGNS_SUBTYPE: ++ CHECK_TLV_SIZE(36, "ISID_VLAN_ASGNS"); + PEEK_BYTES(&msg_auth_digest, sizeof msg_auth_digest); + + /* Subtract off tlv type and length (2Bytes) + OUI (3B) + diff --git a/lib/lldp/lldpd-structs.c b/lib/lldp/lldpd-structs.c index 499b441746..a8c7fad098 100644 --- a/lib/lldp/lldpd-structs.c @@ -54202,7 +54317,7 @@ index 8305f6c427..c797783782 100644 /* By default enable one tx and rx queue per netdev. */ diff --git a/lib/odp-util.c b/lib/odp-util.c -index 9a705cffa3..3bbc9a1010 100644 +index 9a705cffa3..fac4cf3a8c 100644 --- a/lib/odp-util.c +++ b/lib/odp-util.c @@ -1003,7 +1003,7 @@ format_odp_conntrack_action(struct ds *ds, const struct nlattr *attr) @@ -54236,7 +54351,34 @@ index 9a705cffa3..3bbc9a1010 100644 } ds_put_char(ds, ','); } -@@ -4630,6 +4630,11 @@ odp_flow_format(const struct nlattr *key, size_t key_len, +@@ -3592,9 +3592,16 @@ static bool + check_attr_len(struct ds *ds, const struct nlattr *a, const struct nlattr *ma, + const struct attr_len_tbl tbl[], int max_type, bool need_key) + { ++ uint16_t type = nl_attr_type(a); + int expected_len; + +- expected_len = odp_key_attr_len(tbl, max_type, nl_attr_type(a)); ++ if (type > max_type) { ++ /* Unknown attribute, can't check the length. */ ++ return true; ++ } ++ ++ expected_len = odp_key_attr_len(tbl, max_type, type); ++ + if (expected_len != ATTR_LEN_VARIABLE && + expected_len != ATTR_LEN_NESTED) { + +@@ -3603,7 +3610,7 @@ check_attr_len(struct ds *ds, const struct nlattr *a, const struct nlattr *ma, + + if (bad_key_len || bad_mask_len) { + if (need_key) { +- ds_put_format(ds, "key%u", nl_attr_type(a)); ++ ds_put_format(ds, "key%u", type); + } + if (bad_key_len) { + ds_put_format(ds, "(bad key length %"PRIuSIZE", expected %d)(", +@@ -4630,6 +4637,11 @@ odp_flow_format(const struct nlattr *key, size_t key_len, ds_put_char(ds, ','); } ds_put_cstr(ds, "eth()"); @@ -54248,7 +54390,7 @@ index 9a705cffa3..3bbc9a1010 100644 } ofpbuf_clear(&ofp); } -@@ -7161,11 +7166,6 @@ parse_l2_5_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1], +@@ -7161,11 +7173,6 @@ parse_l2_5_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1], } } } @@ -54260,7 +54402,7 @@ index 9a705cffa3..3bbc9a1010 100644 } if (is_mask && expected_bit != OVS_KEY_ATTR_UNSPEC) { if ((flow->tp_src || flow->tp_dst) && flow->nw_proto != 0xff) { -@@ -7188,7 +7188,8 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1], +@@ -7188,7 +7195,8 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1], uint64_t present_attrs, int out_of_range_attr, uint64_t expected_attrs, struct flow *flow, const struct nlattr *key, size_t key_len, @@ -54270,7 +54412,7 @@ index 9a705cffa3..3bbc9a1010 100644 { static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); bool is_mask = src_flow != flow; -@@ -7196,9 +7197,11 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1], +@@ -7196,9 +7204,11 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1], const struct nlattr *encap; enum odp_key_fitness encap_fitness; enum odp_key_fitness fitness = ODP_FIT_ERROR; @@ -54283,7 +54425,7 @@ index 9a705cffa3..3bbc9a1010 100644 (is_mask ? (src_flow->vlans[encaps].tci & htons(VLAN_CFI)) != 0 : eth_type_vlan(flow->dl_type))) { -@@ -7259,6 +7262,14 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1], +@@ -7259,6 +7269,14 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1], } expected_attrs = 0; @@ -54298,7 +54440,7 @@ index 9a705cffa3..3bbc9a1010 100644 if (!parse_ethertype(attrs, present_attrs, &expected_attrs, flow, src_flow, errorp)) { return ODP_FIT_ERROR; -@@ -7281,7 +7292,7 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1], +@@ -7281,7 +7299,7 @@ parse_8021q_onward(const struct nlattr *attrs[OVS_KEY_ATTR_MAX + 1], static enum odp_key_fitness odp_flow_key_to_flow__(const struct nlattr *key, size_t key_len, struct flow *flow, const struct flow *src_flow, @@ -54307,7 +54449,7 @@ index 9a705cffa3..3bbc9a1010 100644 { /* New "struct flow" fields that are visible to the datapath (including all * data fields) should be translated from equivalent datapath flow fields -@@ -7308,6 +7319,14 @@ odp_flow_key_to_flow__(const struct nlattr *key, size_t key_len, +@@ -7308,6 +7326,14 @@ odp_flow_key_to_flow__(const struct nlattr *key, size_t key_len, } expected_attrs = 0; @@ -54322,7 +54464,7 @@ index 9a705cffa3..3bbc9a1010 100644 /* Metadata. */ if (present_attrs & (UINT64_C(1) << OVS_KEY_ATTR_RECIRC_ID)) { flow->recirc_id = nl_attr_get_u32(attrs[OVS_KEY_ATTR_RECIRC_ID]); -@@ -7431,7 +7450,7 @@ odp_flow_key_to_flow__(const struct nlattr *key, size_t key_len, +@@ -7431,7 +7457,7 @@ odp_flow_key_to_flow__(const struct nlattr *key, size_t key_len, : eth_type_vlan(src_flow->dl_type)) { fitness = parse_8021q_onward(attrs, present_attrs, out_of_range_attr, expected_attrs, flow, key, key_len, @@ -54331,7 +54473,7 @@ index 9a705cffa3..3bbc9a1010 100644 } else { if (is_mask) { /* A missing VLAN mask means exact match on vlan_tci 0 (== no -@@ -7497,7 +7516,7 @@ enum odp_key_fitness +@@ -7497,7 +7523,7 @@ enum odp_key_fitness odp_flow_key_to_flow(const struct nlattr *key, size_t key_len, struct flow *flow, char **errorp) { @@ -54340,7 +54482,7 @@ index 9a705cffa3..3bbc9a1010 100644 } /* Converts the 'mask_key_len' bytes of OVS_KEY_ATTR_* attributes in 'mask_key' -@@ -7509,14 +7528,16 @@ odp_flow_key_to_flow(const struct nlattr *key, size_t key_len, +@@ -7509,14 +7535,16 @@ odp_flow_key_to_flow(const struct nlattr *key, size_t key_len, * If 'errorp' is nonnull, this function uses it for detailed error reports: if * the return value is ODP_FIT_ERROR, it stores a malloc()'d error string in * '*errorp', otherwise NULL. */ @@ -54362,7 +54504,7 @@ index 9a705cffa3..3bbc9a1010 100644 } else { if (errorp) { *errorp = NULL; -@@ -7530,6 +7551,15 @@ odp_flow_key_to_mask(const struct nlattr *mask_key, size_t mask_key_len, +@@ -7530,6 +7558,15 @@ odp_flow_key_to_mask(const struct nlattr *mask_key, size_t mask_key_len, } } @@ -54378,7 +54520,7 @@ index 9a705cffa3..3bbc9a1010 100644 /* Converts the netlink formated key/mask to match. * Fails if odp_flow_key_from_key/mask and odp_flow_key_key/mask * disagree on the acceptable form of flow */ -@@ -7540,12 +7570,15 @@ parse_key_and_mask_to_match(const struct nlattr *key, size_t key_len, +@@ -7540,12 +7577,15 @@ parse_key_and_mask_to_match(const struct nlattr *key, size_t key_len, { enum odp_key_fitness fitness; @@ -54399,7 +54541,7 @@ index 9a705cffa3..3bbc9a1010 100644 static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); if (!VLOG_DROP_ERR(&rl)) { -@@ -7553,20 +7586,18 @@ parse_key_and_mask_to_match(const struct nlattr *key, size_t key_len, +@@ -7553,20 +7593,18 @@ parse_key_and_mask_to_match(const struct nlattr *key, size_t key_len, ds_init(&s); odp_flow_format(key, key_len, NULL, 0, NULL, &s, true); @@ -54852,9 +54994,18 @@ index 3b444ccdcc..aac5e19c99 100644 #endif /* ovs-thread.h */ diff --git a/lib/ovsdb-cs.c b/lib/ovsdb-cs.c -index dead31275d..9713c7dc7c 100644 +index dead31275d..a7d2f73cc2 100644 --- a/lib/ovsdb-cs.c +++ b/lib/ovsdb-cs.c +@@ -892,7 +892,7 @@ ovsdb_cs_db_get_table(struct ovsdb_cs_db *db, const char *table) + + t = xzalloc(sizeof *t); + t->name = xstrdup(table); +- t->new_cond = json_array_create_1(json_boolean_create(true)); ++ t->ack_cond = json_array_create_1(json_boolean_create(true)); + hmap_insert(&db->tables, &t->hmap_node, hash); + return t; + } @@ -900,8 +900,8 @@ ovsdb_cs_db_get_table(struct ovsdb_cs_db *db, const char *table) static void ovsdb_cs_db_destroy_tables(struct ovsdb_cs_db *db) @@ -55323,10 +55474,10 @@ index 4e751ff2c7..70fabeb8a3 100644 #ifdef _WIN32 if (node->wevent && node->pollfd.fd) { diff --git a/lib/rculist.h b/lib/rculist.h -index 1072b87af2..9bb8cbf3eb 100644 +index 1072b87af2..6df963eb2b 100644 --- a/lib/rculist.h +++ b/lib/rculist.h -@@ -365,35 +365,57 @@ rculist_is_singleton_protected(const struct rculist *list) +@@ -365,35 +365,59 @@ rculist_is_singleton_protected(const struct rculist *list) return list_next == list->prev && list_next != list; } @@ -55373,12 +55524,14 @@ index 1072b87af2..9bb8cbf3eb 100644 + UPDATE_MULTIVAR(ITER, rculist_next(ITER_VAR(ITER)))) + +#define RCULIST_FOR_EACH_REVERSE_PROTECTED(ITER, MEMBER, RCULIST) \ -+ for (INIT_MULTIVAR(ITER, MEMBER, (RCULIST)->prev, struct rculist); \ ++ for (INIT_MULTIVAR(ITER, MEMBER, rculist_back_protected(RCULIST), \ ++ struct rculist); \ + CONDITION_MULTIVAR(ITER, MEMBER, ITER_VAR(ITER) != (RCULIST)); \ -+ UPDATE_MULTIVAR(ITER, ITER_VAR(ITER)->prev)) ++ UPDATE_MULTIVAR(ITER, rculist_back_protected(ITER_VAR(ITER)))) + +#define RCULIST_FOR_EACH_REVERSE_PROTECTED_CONTINUE(ITER, MEMBER, RCULIST) \ -+ for (INIT_MULTIVAR(ITER, MEMBER, (ITER)->MEMBER.prev, struct rculist); \ ++ for (INIT_MULTIVAR(ITER, MEMBER, rculist_back_protected(ITER->MEMBER), \ ++ struct rculist); \ + CONDITION_MULTIVAR(ITER, MEMBER, ITER_VAR(ITER) != (RCULIST)); \ + UPDATE_MULTIVAR(ITER, ITER_VAR(ITER)->prev)) + @@ -60123,9 +60276,21 @@ index ef7bb4b8ee..c36a140a8e 100644 -#endif } diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py -index 4ecdcaa197..8e31e02d79 100644 +index 4ecdcaa197..08846b0d51 100644 --- a/python/ovs/db/idl.py +++ b/python/ovs/db/idl.py +@@ -85,9 +85,9 @@ class Monitor(enum.IntEnum): + + class ConditionState(object): + def __init__(self): +- self._ack_cond = None ++ self._ack_cond = [True] + self._req_cond = None +- self._new_cond = [True] ++ self._new_cond = None + + def __iter__(self): + return iter([self._new_cond, self._req_cond, self._ack_cond]) @@ -140,6 +140,47 @@ class ConditionState(object): return False @@ -61167,7 +61332,7 @@ index 00e3a46b8b..b6155af253 100644 AT_CLEANUP diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at -index a79ebdb618..6aff1eda7b 100644 +index a79ebdb618..9af70a68d7 100644 --- a/tests/dpif-netdev.at +++ b/tests/dpif-netdev.at @@ -6,8 +6,8 @@ m4_divert_push([PREPARE_TESTS]) @@ -61241,6 +61406,27 @@ index a79ebdb618..6aff1eda7b 100644 ]) OVS_VSWITCHD_STOP +@@ -636,6 +636,20 @@ OVS_VSWITCHD_STOP(["/flow: in_port is not an exact match/d + /failed to put/d"]) + AT_CLEANUP + ++AT_SETUP([dpif-netdev - check dpctl/add-flow wider ip match]) ++OVS_VSWITCHD_START( ++ [add-port br0 p1 \ ++ -- set interface p1 type=dummy options:pstream=punix:$OVS_RUNDIR/p0.sock \ ++ -- set bridge br0 datapath-type=dummy]) ++ ++AT_CHECK([ovs-appctl revalidator/pause]) ++AT_CHECK([ovs-appctl dpctl/add-flow "in_port(1),eth_type(0x0800),ipv4(src=0.0.0.0/192.0.0.0,dst=0.0.0.0/192.0.0.0,frag=no)" "3"]) ++AT_CHECK([ovs-appctl dpctl/add-flow "in_port(1),eth_type(0x0800),ipv4(src=192.1.1.1/0.0.0.0,dst=49.1.1.1/0.0.0.0,frag=no)" "3"]) ++AT_CHECK([ovs-appctl revalidator/resume]) ++ ++OVS_VSWITCHD_STOP ++AT_CLEANUP ++ + # SEND_UDP_PKTS([p_name], [p_ofport]) + # + # Sends 128 packets to port 'p_name' with different UDP destination ports. diff --git a/tests/drop-stats.at b/tests/drop-stats.at index f3e19cd83b..1d3af98dab 100644 --- a/tests/drop-stats.at @@ -61577,10 +61763,10 @@ index 2c7e163bd6..7be6628c34 100644 AT_CLEANUP diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at -index 7c2edeb9d4..73a5e8c3d0 100644 +index 7c2edeb9d4..bc981f8fc6 100644 --- a/tests/ofproto-dpif.at +++ b/tests/ofproto-dpif.at -@@ -29,6 +29,39 @@ AT_CHECK([ovs-appctl revalidator/wait]) +@@ -29,6 +29,58 @@ AT_CHECK([ovs-appctl revalidator/wait]) OVS_VSWITCHD_STOP AT_CLEANUP @@ -61617,10 +61803,29 @@ index 7c2edeb9d4..73a5e8c3d0 100644 +OVS_VSWITCHD_STOP +AT_CLEANUP + ++AT_SETUP([ofproto-dpif - malformed lldp autoattach tlv]) ++OVS_VSWITCHD_START() ++add_of_ports br0 1 ++ ++dnl Enable lldp ++AT_CHECK([ovs-vsctl set interface p1 lldp:enable=true]) ++ ++dnl Send a malformed lldp packet ++packet="0180c200000ef6b426aa5f0088cc020704f6b426aa5f000403057632060200780c"dnl ++"5044454144424545464445414442454546444541444245454644454144424545464445414"dnl ++"4424545464445414442454546444541444245454644454144424545464445414442454546"dnl ++"4445414442454546fe0500040d0c010000" ++AT_CHECK([ovs-appctl netdev-dummy/receive p1 "$packet"], [0], [stdout]) ++ ++OVS_WAIT_UNTIL([grep -q "ISID_VLAN_ASGNS TLV too short" ovs-vswitchd.log]) ++ ++OVS_VSWITCHD_STOP(["/|WARN|ISID_VLAN_ASGNS TLV too short received on/d"]) ++AT_CLEANUP ++ AT_SETUP([ofproto-dpif - active-backup bonding (with primary)]) dnl Create br0 with members p1, p2 and p7, creating bond0 with p1 and -@@ -81,11 +114,12 @@ recirc_id(0),in_port(4),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=ff: +@@ -81,11 +133,12 @@ recirc_id(0),in_port(4),packet_type(ns=0,id=0),eth(src=50:54:00:00:00:0b,dst=ff: ovs-appctl netdev-dummy/set-admin-state p1 up ovs-appctl time/warp 100 @@ -61634,7 +61839,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 updelay: 0 ms downdelay: 0 ms lacp_status: off -@@ -99,7 +133,6 @@ member p1: enabled +@@ -99,7 +152,6 @@ member p1: enabled member p2: enabled may_enable: true @@ -61642,7 +61847,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -126,14 +159,15 @@ dnl bring the primary back and verify that we switched back to the +@@ -126,14 +178,15 @@ dnl bring the primary back and verify that we switched back to the dnl primary. ovs-appctl netdev-dummy/set-admin-state p1 down ovs-appctl time/warp 100 @@ -61660,7 +61865,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 updelay: 0 ms downdelay: 0 ms lacp_status: off -@@ -150,14 +184,13 @@ member p2: enabled +@@ -150,14 +203,13 @@ member p2: enabled member p3: enabled may_enable: true @@ -61676,7 +61881,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 dnl Now re-add the primary and verify that the output shows that the dnl primary is available again. -@@ -171,11 +204,12 @@ ovs-vsctl \ +@@ -171,11 +223,12 @@ ovs-vsctl \ --id=@p1 create Interface name=p1 type=dummy options:pstream=punix:$OVS_RUNDIR/p1.sock ofport_request=1 -- \ set Port bond0 interfaces="$uuids, @p1]" ovs-appctl time/warp 100 @@ -61690,7 +61895,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 updelay: 0 ms downdelay: 0 ms lacp_status: off -@@ -192,17 +226,17 @@ member p2: enabled +@@ -192,17 +245,17 @@ member p2: enabled member p3: enabled may_enable: true @@ -61710,7 +61915,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 updelay: 0 ms downdelay: 0 ms lacp_status: off -@@ -211,25 +245,25 @@ active-backup primary: p2 +@@ -211,25 +264,25 @@ active-backup primary: p2 member p1: enabled @@ -61739,7 +61944,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 updelay: 0 ms downdelay: 0 ms lacp_status: off -@@ -238,15 +272,14 @@ active-backup primary: +@@ -238,15 +291,14 @@ active-backup primary: member p1: enabled @@ -61756,7 +61961,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -336,9 +369,9 @@ ovs-appctl time/warp 100 +@@ -336,9 +388,9 @@ ovs-appctl time/warp 100 AT_CHECK([ovs-appctl dpif/dump-flows br1 > br1_flows.txt]) # Make sure there is resonable distribution to all three ports. # We don't want to make this check precise, in case hash function changes. @@ -61769,7 +61974,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 OVS_VSWITCHD_STOP AT_CLEANUP -@@ -498,6 +531,72 @@ AT_CHECK([sed -n '/member p2/,/^$/p' bond3.txt | grep 'hash'], [0], [ignore]) +@@ -498,6 +550,72 @@ AT_CHECK([sed -n '/member p2/,/^$/p' bond3.txt | grep 'hash'], [0], [ignore]) OVS_VSWITCHD_STOP() AT_CLEANUP @@ -61842,7 +62047,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 # 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) +@@ -570,7 +688,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]) @@ -61851,7 +62056,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 10,11,12,13,14,15,16,17,18,19,20,21 ]) -@@ -584,7 +683,7 @@ echo "table=0 in_port=1 actions=output(10),goto_table(1)" > flows.txt +@@ -584,7 +702,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]) @@ -61860,7 +62065,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 10,11 ]) -@@ -600,7 +699,7 @@ table=1 ip actions=write_actions(output(13)),goto_table(2) +@@ -600,7 +718,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]) @@ -61869,7 +62074,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +716,7 @@ table=1 icmp6 actions=write_actions(output(13)),goto_table(2) +@@ -617,7 +735,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]) @@ -61878,7 +62083,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +734,7 @@ table=0 in_port=1,ip actions=output(10),write_actions(set_field:192.168.3.90->ip +@@ -635,7 +753,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]) @@ -61887,7 +62092,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +748,7 @@ add_of_ports br0 1 10 11 +@@ -649,7 +767,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']) @@ -61896,7 +62101,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +760,7 @@ OVS_VSWITCHD_START +@@ -661,7 +779,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']) @@ -61905,7 +62110,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +775,7 @@ OVS_VSWITCHD_START +@@ -676,7 +794,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']) @@ -61914,7 +62119,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 10 ]) -@@ -708,7 +807,7 @@ OVS_VSWITCHD_START +@@ -708,7 +826,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)']) @@ -61923,7 +62128,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +822,7 @@ OVS_VSWITCHD_START +@@ -723,7 +841,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)']) @@ -61932,7 +62137,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 10 ]) -@@ -743,11 +842,11 @@ add_of_ports br0 1 +@@ -743,11 +861,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']) @@ -61946,7 +62151,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 AT_CHECK([tail -1 stdout], [0], [Datapath actions: pop_vlan,2 ]) -@@ -1011,7 +1110,7 @@ OVS_VSWITCHD_START +@@ -1011,7 +1129,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)']) @@ -61955,7 +62160,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 AT_CHECK([tail -1 stdout], [0], [Datapath actions: 10 ]) -@@ -1142,7 +1241,7 @@ OVS_VSWITCHD_START +@@ -1142,7 +1260,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)']) @@ -61964,7 +62169,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +1387,7 @@ table=1 in_port=1 action=dec_ttl,output:3 +@@ -1288,7 +1406,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], [ @@ -61973,7 +62178,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +1410,7 @@ ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:05,dst=50: +@@ -1311,7 +1429,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) @@ -61982,7 +62187,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP AT_CLEANUP -@@ -1497,13 +1596,13 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6]) +@@ -1497,13 +1615,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) @@ -61999,7 +62204,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -1560,13 +1659,13 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 6]) +@@ -1560,13 +1678,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) @@ -62016,7 +62221,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -1627,13 +1726,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -1627,13 +1745,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) @@ -62033,7 +62238,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) dnl Hit table 0, Miss all other tables, sent to controller -@@ -1647,13 +1746,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -1647,13 +1765,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) @@ -62050,7 +62255,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -1690,13 +1789,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -1690,13 +1808,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) @@ -62067,7 +62272,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) dnl Hit table 1, Miss all other tables, sent to controller -@@ -1710,13 +1809,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -1710,13 +1828,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) @@ -62084,7 +62289,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -1900,13 +1999,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -1900,13 +2018,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) @@ -62101,7 +62306,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) dnl Singleton controller action. -@@ -1920,11 +2019,11 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -1920,11 +2038,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) @@ -62116,7 +62321,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) dnl Modified controller action. -@@ -1938,13 +2037,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -1938,13 +2056,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) @@ -62133,7 +62338,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) dnl Modified VLAN controller action. -@@ -1958,13 +2057,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -1958,13 +2076,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) @@ -62150,7 +62355,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) dnl Checksum TCP. -@@ -1978,31 +2077,31 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -1978,31 +2096,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) @@ -62191,7 +62396,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) dnl Checksum UDP. -@@ -2016,31 +2115,31 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -2016,31 +2134,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) @@ -62232,7 +62437,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) dnl Modified ARP controller action. -@@ -2087,31 +2186,31 @@ OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 18]) +@@ -2087,31 +2205,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) @@ -62273,7 +62478,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl -@@ -2151,13 +2250,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2151,13 +2269,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) @@ -62290,7 +62495,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -2325,13 +2424,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2325,13 +2443,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) @@ -62307,7 +62512,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) dnl Modified MPLS controller action. -@@ -2539,13 +2638,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2539,13 +2657,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) @@ -62324,7 +62529,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2565,13 +2664,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2565,13 +2683,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) @@ -62341,7 +62546,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2591,13 +2690,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2591,13 +2709,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) @@ -62358,7 +62563,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2617,13 +2716,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2617,13 +2735,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) @@ -62375,7 +62580,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2643,13 +2742,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2643,13 +2761,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) @@ -62392,7 +62597,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2669,13 +2768,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2669,13 +2787,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) @@ -62409,7 +62614,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2695,13 +2794,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2695,13 +2813,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) @@ -62426,7 +62631,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2721,13 +2820,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2721,13 +2839,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) @@ -62443,7 +62648,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2771,13 +2870,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2771,13 +2889,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) @@ -62460,7 +62665,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2797,13 +2896,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2797,13 +2915,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) @@ -62477,7 +62682,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2823,13 +2922,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2823,13 +2941,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) @@ -62494,7 +62699,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2931,13 +3030,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2931,13 +3049,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) @@ -62511,7 +62716,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2959,13 +3058,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2959,13 +3077,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) @@ -62528,7 +62733,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -2986,13 +3085,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -2986,13 +3104,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) @@ -62545,7 +62750,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -3314,13 +3413,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -3314,13 +3432,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) @@ -62562,7 +62767,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -3363,13 +3462,13 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -3363,13 +3481,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) @@ -62579,7 +62784,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -3402,13 +3501,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -3402,13 +3520,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) @@ -62596,7 +62801,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -3444,13 +3543,13 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) +@@ -3444,13 +3562,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) @@ -62613,7 +62818,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -3516,13 +3615,13 @@ send: OFPT_SET_ASYNC (OF1.3) (xid=0x2): +@@ -3516,13 +3634,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) @@ -62630,7 +62835,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -3558,13 +3657,13 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -3558,13 +3676,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) @@ -62647,7 +62852,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -3607,34 +3706,34 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) +@@ -3607,34 +3725,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) @@ -62692,7 +62897,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -3679,34 +3778,34 @@ AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) +@@ -3679,34 +3797,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) @@ -62737,7 +62942,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl time/warp 5000], [0], [ignore]) -@@ -3751,10 +3850,10 @@ OVS_APP_EXIT_AND_WAIT(ovs-ofctl) +@@ -3751,10 +3869,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) @@ -62750,7 +62955,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -5007,7 +5106,7 @@ ovs-vsctl \ +@@ -5007,7 +5125,7 @@ ovs-vsctl \ AT_CHECK([ovs-ofctl add-flow br0 action=output:1]) # "in_port" defaults to OFPP_NONE if it's not specified. @@ -62759,7 +62964,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout]) AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: 1,2 -@@ -5317,7 +5416,7 @@ ovs-vsctl \ +@@ -5317,7 +5435,7 @@ ovs-vsctl \ AT_CHECK([ovs-ofctl add-flow br0 action=output:1]) # "in_port" defaults to OFPP_NONE if it's not specified. @@ -62768,7 +62973,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +5563,7 @@ ovs-vsctl \ +@@ -5464,7 +5582,7 @@ ovs-vsctl \ flow="in_port=1" AT_CHECK([ovs-appctl ofproto/trace br0 "$flow"], [0], [stdout]) @@ -62777,7 +62982,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 OVS_VSWITCHD_STOP AT_CLEANUP -@@ -5512,11 +5611,11 @@ AT_CHECK([ovs-ofctl add-flows br0 flows.txt]) +@@ -5512,11 +5630,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]) @@ -62791,7 +62996,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -5573,7 +5672,36 @@ check_flows () { +@@ -5573,7 +5691,36 @@ check_flows () { echo "n_packets=$n" test "$n" = 1 } @@ -62829,7 +63034,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 OVS_VSWITCHD_STOP AT_CLEANUP -@@ -6202,6 +6330,20 @@ AT_CHECK([tail -2 stderr], [0], [dnl +@@ -6202,6 +6349,20 @@ AT_CHECK([tail -2 stderr], [0], [dnl ovs-appctl: ovs-vswitchd: server returned an error ]) @@ -62850,7 +63055,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 OVS_VSWITCHD_STOP AT_CLEANUP -@@ -7004,6 +7146,29 @@ AT_CHECK([ovs-appctl coverage/read-counter mac_learning_static_none_move], [0], +@@ -7004,6 +7165,29 @@ AT_CHECK([ovs-appctl coverage/read-counter mac_learning_static_none_move], [0], OVS_VSWITCHD_STOP AT_CLEANUP @@ -62880,7 +63085,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 AT_SETUP([ofproto-dpif - basic truncate action]) OVS_VSWITCHD_START add_of_ports br0 1 2 3 4 5 -@@ -7031,7 +7196,7 @@ dnl An 170 byte packet +@@ -7031,7 +7215,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 @@ -62889,7 +63094,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-appctl revalidator/purge], [0]) -@@ -7600,13 +7765,28 @@ dnl configure bridge IPFIX and ensure that sample action generation works at the +@@ -7600,13 +7784,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 @@ -62919,7 +63124,7 @@ index 7c2edeb9d4..73a5e8c3d0 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 +8846,7 @@ recirc_id(0),in_port(100),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(src=192.1 +@@ -8666,7 +8865,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 @@ -62928,7 +63133,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP(["/stack underflow/d"]) -@@ -9855,7 +10035,7 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -9855,7 +10054,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) @@ -62937,7 +63142,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -9906,7 +10086,7 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl]) +@@ -9906,7 +10105,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) @@ -62946,7 +63151,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -10166,10 +10346,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10166,10 +10365,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) @@ -62959,7 +63164,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl -P nxt_packet_in --detach --no-chdir --pidfile 2> ofctl_monitor.log]) -@@ -10187,10 +10367,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10187,10 +10386,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) @@ -62972,7 +63177,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -10239,10 +10419,10 @@ dnl Note that the first packet doesn't have the ct_state bits set. This +@@ -10239,10 +10438,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) @@ -62985,7 +63190,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl -P nxt_packet_in --detach --no-chdir --pidfile 2> ofctl_monitor.log]) -@@ -10261,10 +10441,10 @@ dnl Note that the first packet doesn't have the ct_state bits set. This +@@ -10261,10 +10460,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) @@ -62998,7 +63203,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) dnl -@@ -10320,9 +10500,9 @@ dnl Note that the first packet doesn't have the ct_state bits set. This +@@ -10320,9 +10519,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) @@ -63010,7 +63215,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -10433,7 +10613,7 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10433,7 +10632,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) @@ -63019,7 +63224,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 dnl OFPT_ECHO_REQUEST (xid=0x0): 0 bytes of payload ]) -@@ -10467,7 +10647,7 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10467,7 +10666,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) @@ -63028,7 +63233,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -10523,16 +10703,16 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10523,16 +10722,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) @@ -63049,7 +63254,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -10579,10 +10759,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10579,10 +10778,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) @@ -63062,7 +63267,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -10629,10 +10809,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10629,10 +10828,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) @@ -63075,7 +63280,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -10681,19 +10861,19 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10681,19 +10880,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) @@ -63100,7 +63305,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -10738,10 +10918,10 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -10738,10 +10937,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) @@ -63113,7 +63318,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) OVS_VSWITCHD_STOP -@@ -11152,16 +11332,16 @@ dnl Note that the first packet doesn't have the ct_state bits set. This +@@ -11152,16 +11351,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) @@ -63134,7 +63339,7 @@ index 7c2edeb9d4..73a5e8c3d0 100644 ]) dnl The next test verifies that ct_clear at the datapath only gets executed -@@ -11235,13 +11415,13 @@ OVS_WAIT_UNTIL([ovs-appctl -t ovs-ofctl exit]) +@@ -11235,13 +11434,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) @@ -63579,10 +63784,258 @@ 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 +index 62e2b63832..092d9f81a2 100644 --- a/tests/ovsdb-idl.at +++ b/tests/ovsdb-idl.at -@@ -2437,3 +2437,92 @@ unix:socket2 remote has col id in table simple7 +@@ -561,9 +561,9 @@ OVSDB_CHECK_IDL([simple idl, conditional, false condition], + "b": true}}]']], + [['condition simple []' \ + 'condition simple [true]']], +- [[000: change conditions ++ [[000: simple: change conditions + 001: empty +-002: change conditions ++002: simple: change conditions + 003: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> + 004: done + ]]) +@@ -577,13 +577,40 @@ OVSDB_CHECK_IDL([simple idl, conditional, true condition], + "b": true}}]']], + [['condition simple []' \ + 'condition simple [true]']], +- [[000: change conditions ++ [[000: simple: change conditions + 001: empty +-002: change conditions ++002: simple: change conditions + 003: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> + 004: done + ]]) + ++dnl This test ensures that the first explicitly set monitor condition ++dnl is sent to the server. ++OVSDB_CHECK_IDL([simple idl, conditional, wait for condition], ++ [], ++ [['["idltest", ++ {"op": "insert", ++ "table": "simple", ++ "row": {"i": 1, ++ "r": 2.0, ++ "b": true}}]' \ ++ 'condition simple [true]' \ ++ '^["idltest", ++ {"op": "insert", ++ "table": "simple", ++ "row": {"i": 2, ++ "r": 4.0, ++ "b": true}}]']], ++ [[000: empty ++001: {"error":null,"result":[{"uuid":["uuid","<0>"]}]} ++002: table simple: i=1 r=2 b=true s= u=<1> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<0> ++003: simple: conditions unchanged ++004: {"error":null,"result":[{"uuid":["uuid","<2>"]}]} ++005: table simple: i=1 r=2 b=true s= u=<1> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<0> ++005: table simple: i=2 r=4 b=true s= u=<1> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2> ++006: done ++]]) ++ + OVSDB_CHECK_IDL([simple idl, conditional, multiple clauses in condition], + [['["idltest", + {"op": "insert", +@@ -598,9 +625,9 @@ OVSDB_CHECK_IDL([simple idl, conditional, multiple clauses in condition], + "b": true}}]']], + [['condition simple []' \ + 'condition simple [["i","==",1],["i","==",2]]']], +- [[000: change conditions ++ [[000: simple: change conditions + 001: empty +-002: change conditions ++002: simple: change conditions + 003: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> + 003: table simple: i=2 r=3 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2> + 004: done +@@ -615,9 +642,9 @@ OVSDB_CHECK_IDL([simple idl, conditional, modify as insert due to condition], + "b": true}}]']], + [['condition simple []' \ + 'condition simple [["i","==",1]]']], +- [[000: change conditions ++ [[000: simple: change conditions + 001: empty +-002: change conditions ++002: simple: change conditions + 003: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> + 004: done + ]]) +@@ -638,11 +665,11 @@ OVSDB_CHECK_IDL([simple idl, conditional, modify as delete due to condition], + "row": {"i": 2, + "r": 3.0, + "b": true}}]']], +- [[000: change conditions ++ [[000: simple: change conditions + 001: empty +-002: change conditions ++002: simple: change conditions + 003: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> +-004: change conditions ++004: simple: change conditions + 005: empty + 006: {"error":null,"result":[{"uuid":["uuid","<2>"]}]} + 007: table simple: i=2 r=3 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<2> +@@ -673,14 +700,16 @@ OVSDB_CHECK_IDL([simple idl, conditional, multiple tables], + "table": "link2", + "row": {"i": 3}, + "uuid-name": "row0"}]']], +- [[000: change conditions ++ [[000: link1: change conditions ++000: link2: change conditions ++000: simple: change conditions + 001: empty +-002: change conditions ++002: simple: change conditions + 003: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> +-004: change conditions ++004: link1: change conditions + 005: table link1: i=0 k=0 ka=[] l2= uuid=<2> + 005: table simple: i=1 r=2 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> +-006: change conditions ++006: link2: change conditions + 007: {"error":null,"result":[{"uuid":["uuid","<3>"]}]} + 008: table link1: i=0 k=0 ka=[] l2= uuid=<2> + 008: table link2: i=3 l1= uuid=<3> +@@ -1237,10 +1266,10 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, orphan weak refer + {"op": "delete", + "table": "simple6", + "where": []}]']], +- [[000: change conditions ++ [[000: simple: change conditions + 001: table simple6: inserted row: name=first_row weak_ref=[] uuid=<0> + 001: table simple6: updated columns: name weak_ref +-002: change conditions ++002: simple: change conditions + 003: table simple6: name=first_row weak_ref=[<1>] uuid=<0> + 003: table simple: inserted row: i=0 r=0 b=false s=row1_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> + 003: table simple: updated columns: s +@@ -1279,19 +1308,19 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, orphan rows, cond + {"op": "delete", + "table": "simple6", + "where": []}]']], +- [[000: change conditions ++ [[000: simple: change conditions + 001: table simple6: inserted row: name=first_row weak_ref=[] uuid=<0> + 001: table simple6: updated columns: name weak_ref +-002: change conditions ++002: simple: change conditions + 003: table simple6: name=first_row weak_ref=[<1>] uuid=<0> + 003: table simple: inserted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> + 003: table simple: updated columns: s +-004: change conditions ++004: simple: change conditions + 005: table simple6: name=first_row weak_ref=[] uuid=<0> + 005: table simple: deleted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> + 005: table simple: inserted row: i=0 r=0 b=false s=row1_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3> + 005: table simple: updated columns: s +-006: change conditions ++006: simple: change conditions + 007: table simple6: name=first_row weak_ref=[<1>] uuid=<0> + 007: table simple: deleted row: i=0 r=0 b=false s=row1_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3> + 007: table simple: inserted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> +@@ -1333,14 +1362,14 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, references, condi + {"op": "delete", + "table": "simple6", + "where": []}]']], +- [[000: change conditions ++ [[000: simple: change conditions + 001: table simple6: inserted row: name=first_row weak_ref=[] uuid=<0> + 001: table simple6: updated columns: name weak_ref +-002: change conditions ++002: simple: change conditions + 003: table simple6: name=first_row weak_ref=[<1>] uuid=<0> + 003: table simple: inserted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> + 003: table simple: updated columns: s +-004: change conditions ++004: simple: change conditions + 005: table simple6: name=first_row weak_ref=[<3>] uuid=<0> + 005: table simple: deleted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> + 005: table simple: inserted row: i=1 r=0 b=false s=row1_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<3> +@@ -1376,7 +1405,8 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, references, singl + {"op": "insert", + "table": "simple", + "row": {"s": "row0_s"}}]']], +- [[000: change conditions ++ [[000: simple6: conditions unchanged ++000: simple: conditions unchanged + 001: table simple6: inserted row: name=row0_s6 weak_ref=[<0>] uuid=<1> + 001: table simple6: updated columns: name weak_ref + 001: table simple: inserted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<0> +@@ -1418,7 +1448,8 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, weak references, + {"op": "insert", + "table": "simple", + "row": {"s": "row0_s"}}]']], +- [[000: change conditions ++ [[000: simple6: conditions unchanged ++000: simple: conditions unchanged + 001: table simple6: inserted row: name=row0_s6 weak_ref=[<0>] uuid=<1> + 001: table simple6: updated columns: name weak_ref + 001: table simple: inserted row: i=0 r=0 b=false s=row0_s u=<2> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<0> +@@ -1458,7 +1489,9 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, strong references + {"op": "insert", + "table": "simple", + "row": {"s": "row0_s"}}]']], +- [[000: change conditions ++ [[000: simple3: conditions unchanged ++000: simple4: conditions unchanged ++000: simple: conditions unchanged + 001: table simple3: inserted row: name=row0_s3 uset=[] uref=[<0>] uuid=<1> + 001: table simple3: updated columns: name uref + 001: table simple4: inserted row: name=row0_s4 uuid=<0> +@@ -1493,12 +1526,14 @@ OVSDB_CHECK_IDL_TRACK([track, simple idl, initially populated, strong references + {"op": "insert", + "table": "simple", + "row": {"s": "row0_s"}}]']], +- [[000: change conditions ++ [[000: simple3: conditions unchanged ++000: simple4: conditions unchanged ++000: simple: conditions unchanged + 001: table simple3: inserted row: name=row0_s3 uset=[] uref=[<0>] uuid=<1> + 001: table simple3: updated columns: name uref + 001: table simple4: inserted row: name=row0_s4 uuid=<0> + 001: table simple4: updated columns: name +-002: change conditions ++002: simple4: change conditions + 003: table simple3: name=row0_s3 uset=[] uref=[] uuid=<1> + 003: table simple4: deleted row: name=row0_s4 uuid=<0> + 004: {"error":null,"result":[{"uuid":["uuid","<2>"]}]} +@@ -1529,10 +1564,12 @@ OVSDB_CHECK_IDL([simple idl, initially populated, strong references, conditional + {"op": "insert", + "table": "simple", + "row": {"s": "row0_s"}}]']], +- [[000: change conditions ++ [[000: simple3: conditions unchanged ++000: simple4: conditions unchanged ++000: simple: conditions unchanged + 001: table simple3: name=row0_s3 uset=[] uref=[<0>] uuid=<1> + 001: table simple4: name=row0_s4 uuid=<0> +-002: change conditions ++002: simple4: change conditions + 003: table simple3: name=row0_s3 uset=[] uref=[] uuid=<1> + 004: {"error":null,"result":[{"uuid":["uuid","<2>"]}]} + 005: table simple3: name=row0_s3 uset=[] uref=[] uuid=<1> +@@ -2341,11 +2378,11 @@ OVSDB_CHECK_CLUSTER_IDL([simple idl, monitor_cond_since, cluster disconnect], + "table": "simple", + "where": [["i", "==", 1]], + "row": {"r": 2.0 }}]']], +- [[000: change conditions ++ [[000: simple: change conditions + 001: empty +-002: change conditions ++002: simple: change conditions + 003: table simple: i=2 r=1 b=true s= u=<0> ia=[] ra=[] ba=[] sa=[] ua=[] uuid=<1> +-004: change conditions ++004: simple: change conditions + 005: reconnect + 006: table simple + 007: {"error":null,"result":[{"count":1}]} +@@ -2437,3 +2474,92 @@ unix:socket2 remote has col id in table simple7 OVSDB_SERVER_SHUTDOWN AT_CLEANUP @@ -65839,7 +66292,7 @@ index 6f1fb059bc..ac82f2048e 100644 } } diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c -index ca4e87b811..c7bc32a246 100644 +index ca4e87b811..e725cd4983 100644 --- a/tests/test-ovsdb.c +++ b/tests/test-ovsdb.c @@ -294,11 +294,24 @@ print_and_free_ovsdb_error(struct ovsdb_error *error) @@ -66103,11 +66556,107 @@ index ca4e87b811..c7bc32a246 100644 if (terse) { return xasprintf("%03d: table %s", step, row->table->class_->name); +@@ -2541,11 +2605,12 @@ parse_link2_json_clause(struct ovsdb_idl_condition *cond, + } + } + +-static void +-update_conditions(struct ovsdb_idl *idl, char *commands) ++static unsigned int ++update_conditions(struct ovsdb_idl *idl, char *commands, int step) + { +- char *cmd, *save_ptr1 = NULL; + const struct ovsdb_idl_table_class *tc; ++ unsigned int next_cond_seqno = 0; ++ char *cmd, *save_ptr1 = NULL; + + for (cmd = strtok_r(commands, ";", &save_ptr1); cmd; + cmd = strtok_r(NULL, ";", &save_ptr1)) { +@@ -2596,15 +2661,20 @@ update_conditions(struct ovsdb_idl *idl, char *commands) + unsigned int seqno = ovsdb_idl_get_condition_seqno(idl); + unsigned int next_seqno = ovsdb_idl_set_condition(idl, tc, &cond); + if (seqno == next_seqno ) { +- ovs_fatal(0, "condition unchanged"); ++ print_and_log("%03d: %s: conditions unchanged", ++ step, table_name); ++ } else { ++ print_and_log("%03d: %s: change conditions", step, table_name); + } + unsigned int new_next_seqno = ovsdb_idl_set_condition(idl, tc, &cond); + if (next_seqno != new_next_seqno) { + ovs_fatal(0, "condition expected seqno changed"); + } ++ next_cond_seqno = MAX(next_cond_seqno, next_seqno); + ovsdb_idl_condition_destroy(&cond); + json_destroy(json); + } ++ return next_cond_seqno; + } + + static void +@@ -2612,6 +2682,7 @@ do_idl(struct ovs_cmdl_context *ctx) + { + struct jsonrpc *rpc; + struct ovsdb_idl *idl; ++ unsigned int next_cond_seqno = 0; + unsigned int seqno = 0; + struct ovsdb_symbol_table *symtab; + size_t n_uuids = 0; +@@ -2647,8 +2718,8 @@ do_idl(struct ovs_cmdl_context *ctx) + const char remote_s[] = "set-remote "; + const char cond_s[] = "condition "; + if (ctx->argc > 2 && strstr(ctx->argv[2], cond_s)) { +- update_conditions(idl, ctx->argv[2] + strlen(cond_s)); +- print_and_log("%03d: change conditions", step++); ++ next_cond_seqno = ++ update_conditions(idl, ctx->argv[2] + strlen(cond_s), step++); + i = 3; + } else { + i = 2; +@@ -2667,6 +2738,21 @@ do_idl(struct ovs_cmdl_context *ctx) + if (*arg == '+') { + /* The previous transaction didn't change anything. */ + arg++; ++ } else if (*arg == '^') { ++ /* Wait for condition change to be acked by the server. */ ++ arg++; ++ for (;;) { ++ ovsdb_idl_run(idl); ++ ovsdb_idl_check_consistency(idl); ++ if (ovsdb_idl_get_condition_seqno(idl) == next_cond_seqno) { ++ break; ++ } ++ jsonrpc_run(rpc); ++ ++ ovsdb_idl_wait(idl); ++ jsonrpc_wait(rpc); ++ poll_block(); ++ } + } else { + /* Wait for update. */ + for (;;) { +@@ -2701,8 +2787,8 @@ do_idl(struct ovs_cmdl_context *ctx) + arg + strlen(remote_s), + ovsdb_idl_is_connected(idl) ? "true" : "false"); + } else if (!strncmp(arg, cond_s, strlen(cond_s))) { +- update_conditions(idl, arg + strlen(cond_s)); +- print_and_log("%03d: change conditions", step++); ++ next_cond_seqno = update_conditions(idl, arg + strlen(cond_s), ++ step++); + } else if (arg[0] != '[') { + idl_set(idl, arg, step++); + } else { diff --git a/tests/test-ovsdb.py b/tests/test-ovsdb.py -index 853264f22b..402cacbe9d 100644 +index 853264f22b..eded9140e4 100644 --- a/tests/test-ovsdb.py +++ b/tests/test-ovsdb.py -@@ -620,7 +620,7 @@ def update_condition(idl, commands): +@@ -616,18 +616,32 @@ def idl_set(idl, commands, step): + sys.stdout.flush() + + +-def update_condition(idl, commands): ++def update_condition(idl, commands, step): ++ next_cond_seqno = 0 commands = commands[len("condition "):].split(";") for command in commands: command = command.split(" ") @@ -66116,6 +66665,74 @@ index 853264f22b..402cacbe9d 100644 sys.stderr.write("Error parsing condition %s\n" % command) sys.exit(1) + table = command[0] + cond = ovs.json.from_string(command[1]) + +- idl.cond_change(table, cond) ++ next_seqno = idl.cond_change(table, cond) ++ if idl.cond_seqno == next_seqno: ++ sys.stdout.write("%03d: %s: conditions unchanged\n" % ++ (step, table)) ++ else: ++ sys.stdout.write("%03d: %s: change conditions\n" % ++ (step, table)) ++ sys.stdout.flush() ++ ++ assert next_seqno == idl.cond_change(table, cond), \ ++ "condition expected seqno changed" ++ next_cond_seqno = max(next_cond_seqno, next_seqno) ++ ++ return next_cond_seqno + + + def do_idl(schema_file, remote, *commands): +@@ -684,6 +698,7 @@ def do_idl(schema_file, remote, *commands): + else: + rpc = None + ++ next_cond_seqno = 0 + symtab = {} + seqno = 0 + step = 0 +@@ -707,9 +722,7 @@ def do_idl(schema_file, remote, *commands): + + commands = list(commands) + if len(commands) >= 1 and "condition" in commands[0]: +- update_condition(idl, commands.pop(0)) +- sys.stdout.write("%03d: change conditions\n" % step) +- sys.stdout.flush() ++ next_cond_seqno = update_condition(idl, commands.pop(0), step) + step += 1 + + for command in commands: +@@ -722,6 +735,16 @@ def do_idl(schema_file, remote, *commands): + if command.startswith("+"): + # The previous transaction didn't change anything. + command = command[1:] ++ elif command.startswith("^"): ++ # Wait for condition change to be acked by the server. ++ command = command[1:] ++ while idl.cond_seqno != next_cond_seqno and not idl.run(): ++ rpc.run() ++ ++ poller = ovs.poller.Poller() ++ idl.wait(poller) ++ rpc.wait(poller) ++ poller.block() + else: + # Wait for update. + while idl.change_seqno == seqno and not idl.run(): +@@ -743,9 +766,7 @@ def do_idl(schema_file, remote, *commands): + step += 1 + idl.force_reconnect() + elif "condition" in command: +- update_condition(idl, command) +- sys.stdout.write("%03d: change conditions\n" % step) +- sys.stdout.flush() ++ next_cond_seqno = update_condition(idl, command, step) + step += 1 + elif not command.startswith("["): + idl_set(idl, command, step) diff --git a/tests/test-rcu.c b/tests/test-rcu.c index 965f3c49f3..bb17092bf0 100644 --- a/tests/test-rcu.c @@ -66415,6 +67032,23 @@ index 62928d50fc..763ece2a78 100644 diff --git a/utilities/ovs-appctl-bashcomp.bash b/utilities/ovs-appctl-bashcomp.bash old mode 100755 new mode 100644 +diff --git a/utilities/ovs-dpctl-top.in b/utilities/ovs-dpctl-top.in +index fbe6e4f560..2c1766eff5 100755 +--- a/utilities/ovs-dpctl-top.in ++++ b/utilities/ovs-dpctl-top.in +@@ -1236,11 +1236,7 @@ def flows_script(args): + + if (args.flowFiles is None): + logging.info("reading flows from stdin") +- ihdl = os.fdopen(sys.stdin.fileno(), 'r', 0) +- try: +- flow_db = flows_read(ihdl, flow_db) +- finally: +- ihdl.close() ++ flow_db = flows_read(sys.stdin, flow_db) + else: + for flowFile in args.flowFiles: + logging.info("reading flows from %s", flowFile) diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c index ede7f1e61a..6771973ae9 100644 --- a/utilities/ovs-ofctl.c diff --git a/SPECS/openvswitch2.17.spec b/SPECS/openvswitch2.17.spec index 03996d2..4423ca1 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: 65%{?dist} +Release: 68%{?dist} # Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the # lib/sflow*.[ch] files are SISSL @@ -743,6 +743,55 @@ exit 0 %endif %changelog +* Wed Jan 04 2023 Open vSwitch CI - 2.17.0-68 +- Merging upstream branch-2.17 [RH git: ba8ea0794a] + Commit list: + 8d055809b8 ci: Fix overriding OPTS provided from the yml. + 0eb2aa46be Prepare for 2.17.6. + 08971e4b93 Set release date for 2.17.5. + ecaacb01a9 lldp: Fix bugs when parsing malformed AutoAttach. + ee002b3514 dpif-netdev: Use unmasked key when adding datapath flows. + 18dcfda673 ovsdb-cs: Consider default conditions implicitly acked. + 793709a856 rculist: Use rculist_back_protected to access prev. + abb9d3482e Prepare for 2.17.5. + b6c3788fe2 Set release date for 2.17.4. + b50f4e3d21 odp-util: Fix reporting unknown keys as keys with bad length. + 44012fccdc ovs-dpctl-top: Fix ovs-dpctl-top via pipe. + + +* Tue Dec 06 2022 Timothy Redaelli - 2.17.0-67 +- net/i40e: fix jumbo frame Rx with X722 [RH git: c34d3981fc] + [ upstream commit 719469f13b11dbdc921b74258f2d10bd1c5328d4 ] + + For NIC I40E_10G-10G_BASE_T_X722, when the port is configured with + link speed, it cannot receive jumbo frame packets. + + Because it set maximum frame size failed when starts the port that + the port link status is still down. + + This patch fix the error that starts the port will force set maximum + frame size. + + Fixes: 2184f7cdeeaa ("net/i40e: fix max frame size config at port level") + + Signed-off-by: Jie Wang + Tested-by: Dukai Yuan + + +* Fri Nov 25 2022 Timothy Redaelli - 2.17.0-66 +- vhost: fix virtqueue use after free on NUMA reallocation [RH git: f4948cf20a] + [ upstream commit 0b2a2ca35037d6a5168f0832c11d9858b8ae946a ] + + translate_ring_addresses (via numa_realloc) may change a virtio device and + virtio queue. + The virtqueue object must be refreshed before accessing the lock. + + Fixes: 04c27cb673b9 ("vhost: fix unsafe vring addresses modifications") + + Signed-off-by: David Marchand + Reviewed-by: Maxime Coquelin + + * Thu Nov 24 2022 Open vSwitch CI - 2.17.0-65 - Merging upstream branch-2.17 [RH git: 63d511698e] Commit list: