diff --git a/SOURCES/openvswitch-2.13.0.patch b/SOURCES/openvswitch-2.13.0.patch index ab4c8db..de42328 100644 --- a/SOURCES/openvswitch-2.13.0.patch +++ b/SOURCES/openvswitch-2.13.0.patch @@ -996,12 +996,16 @@ index b279303d18..b3b56cd50e 100644 boot.sh \ poc/builders/Vagrantfile \ diff --git a/NEWS b/NEWS -index dab94e924d..a637489365 100644 +index dab94e924d..34cb511769 100644 --- a/NEWS +++ b/NEWS -@@ -1,3 +1,63 @@ -+v2.13.6 - xx xxx xxxx +@@ -1,3 +1,67 @@ ++v2.13.7 - xx xxx xxxx +--------------------- ++ ++v2.13.6 - 17 Dec 2021 ++--------------------- ++ - Bug fixes + - DPDK: + * OVS validated with DPDK 19.11.10. It is recommended to use this version + until further releases. @@ -1063,7 +1067,7 @@ index dab94e924d..a637489365 100644 v2.13.0 - 14 Feb 2020 --------------------- - OVN: -@@ -43,6 +103,9 @@ v2.13.0 - 14 Feb 2020 +@@ -43,6 +107,9 @@ v2.13.0 - 14 Feb 2020 - 'ovs-appctl dpctl/dump-flows' can now show offloaded=partial for partially offloaded flows, dp:dpdk for fully offloaded by dpdk, and type filter supports new filters: "dpdk" and "partially-offloaded". @@ -1073,7 +1077,7 @@ index dab94e924d..a637489365 100644 v2.12.0 - 03 Sep 2019 --------------------- -@@ -117,9 +180,6 @@ v2.12.0 - 03 Sep 2019 +@@ -117,9 +184,6 @@ v2.12.0 - 03 Sep 2019 * Add support for conntrack zone-based timeout policy. - 'ovs-dpctl dump-flows' is no longer suitable for dumping offloaded flows. 'ovs-appctl dpctl/dump-flows' should be used instead. @@ -1224,7 +1228,7 @@ index f6b88ca2d0..9429702db9 100755 manpages=`cd $distdir && echo *` diff --git a/configure.ac b/configure.ac -index 92b52f6712..7fe5e83e84 100644 +index 92b52f6712..b2bb3796ac 100644 --- a/configure.ac +++ b/configure.ac @@ -13,7 +13,7 @@ @@ -1232,7 +1236,7 @@ index 92b52f6712..7fe5e83e84 100644 AC_PREREQ(2.63) -AC_INIT(openvswitch, 2.13.0, bugs@openvswitch.org) -+AC_INIT(openvswitch, 2.13.6, bugs@openvswitch.org) ++AC_INIT(openvswitch, 2.13.7, bugs@openvswitch.org) AC_CONFIG_SRCDIR([datapath/datapath.c]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_AUX_DIR([build-aux]) @@ -2046,15 +2050,21 @@ index 23118e8b63..05ccfb9288 100644 *saddr = fl6.saddr; if (use_cache) diff --git a/debian/changelog b/debian/changelog -index 8e075bc98b..16c04acacd 100644 +index 8e075bc98b..f1cc9b2f7e 100644 --- a/debian/changelog +++ b/debian/changelog -@@ -1,3 +1,39 @@ +@@ -1,3 +1,45 @@ ++openvswitch (2.13.7-1) unstable; urgency=low ++ [ Open vSwitch team ] ++ * New upstream version ++ ++ -- Open vSwitch team Fri, 17 Dec 2021 22:13:28 +0100 ++ +openvswitch (2.13.6-1) unstable; urgency=low + [ Open vSwitch team ] + * New upstream version + -+ -- Open vSwitch team Thu, 21 Oct 2021 23:58:08 +0200 ++ -- Open vSwitch team Fri, 17 Dec 2021 22:13:28 +0100 + +openvswitch (2.13.5-1) unstable; urgency=low + [ Open vSwitch team ] @@ -85440,6 +85450,209 @@ index d31c0953ed..0dc62bd83f 100644 }; /* assert that if we overflow with a masked write of uint32_t to the last byte +diff --git a/lib/tnl-neigh-cache.c b/lib/tnl-neigh-cache.c +index 5bda4af7e0..995c88bf17 100644 +--- a/lib/tnl-neigh-cache.c ++++ b/lib/tnl-neigh-cache.c +@@ -32,6 +32,7 @@ + #include "errno.h" + #include "flow.h" + #include "netdev.h" ++#include "ovs-atomic.h" + #include "ovs-thread.h" + #include "packets.h" + #include "openvswitch/poll-loop.h" +@@ -44,14 +45,13 @@ + #include "openvswitch/vlog.h" + + +-/* In seconds */ +-#define NEIGH_ENTRY_DEFAULT_IDLE_TIME (15 * 60) ++#define NEIGH_ENTRY_DEFAULT_IDLE_TIME_MS (15 * 60 * 1000) + + struct tnl_neigh_entry { + struct cmap_node cmap_node; + struct in6_addr ip; + struct eth_addr mac; +- time_t expires; /* Expiration time. */ ++ atomic_llong expires; /* Expiration time in ms. */ + char br_name[IFNAMSIZ]; + }; + +@@ -64,6 +64,16 @@ tnl_neigh_hash(const struct in6_addr *ip) + return hash_bytes(ip->s6_addr, 16, 0); + } + ++static bool ++tnl_neigh_expired(struct tnl_neigh_entry *neigh) ++{ ++ long long expires; ++ ++ atomic_read_explicit(&neigh->expires, &expires, memory_order_acquire); ++ ++ return expires <= time_msec(); ++} ++ + static struct tnl_neigh_entry * + tnl_neigh_lookup__(const char br_name[IFNAMSIZ], const struct in6_addr *dst) + { +@@ -73,11 +83,13 @@ tnl_neigh_lookup__(const char br_name[IFNAMSIZ], const struct in6_addr *dst) + hash = tnl_neigh_hash(dst); + CMAP_FOR_EACH_WITH_HASH (neigh, cmap_node, hash, &table) { + if (ipv6_addr_equals(&neigh->ip, dst) && !strcmp(neigh->br_name, br_name)) { +- if (neigh->expires <= time_now()) { ++ if (tnl_neigh_expired(neigh)) { + return NULL; + } + +- neigh->expires = time_now() + NEIGH_ENTRY_DEFAULT_IDLE_TIME; ++ atomic_store_explicit(&neigh->expires, time_msec() + ++ NEIGH_ENTRY_DEFAULT_IDLE_TIME_MS, ++ memory_order_release); + return neigh; + } + } +@@ -113,15 +125,16 @@ tnl_neigh_delete(struct tnl_neigh_entry *neigh) + ovsrcu_postpone(neigh_entry_free, neigh); + } + +-static void +-tnl_neigh_set__(const char name[IFNAMSIZ], const struct in6_addr *dst, +- const struct eth_addr mac) ++void ++tnl_neigh_set(const char name[IFNAMSIZ], const struct in6_addr *dst, ++ const struct eth_addr mac) + { + ovs_mutex_lock(&mutex); + struct tnl_neigh_entry *neigh = tnl_neigh_lookup__(name, dst); + if (neigh) { + if (eth_addr_equals(neigh->mac, mac)) { +- neigh->expires = time_now() + NEIGH_ENTRY_DEFAULT_IDLE_TIME; ++ atomic_store_relaxed(&neigh->expires, time_msec() + ++ NEIGH_ENTRY_DEFAULT_IDLE_TIME_MS); + ovs_mutex_unlock(&mutex); + return; + } +@@ -133,7 +146,8 @@ tnl_neigh_set__(const char name[IFNAMSIZ], const struct in6_addr *dst, + + neigh->ip = *dst; + neigh->mac = mac; +- neigh->expires = time_now() + NEIGH_ENTRY_DEFAULT_IDLE_TIME; ++ atomic_store_relaxed(&neigh->expires, time_msec() + ++ NEIGH_ENTRY_DEFAULT_IDLE_TIME_MS); + ovs_strlcpy(neigh->br_name, name, sizeof neigh->br_name); + cmap_insert(&table, &neigh->cmap_node, tnl_neigh_hash(&neigh->ip)); + ovs_mutex_unlock(&mutex); +@@ -144,12 +158,12 @@ tnl_arp_set(const char name[IFNAMSIZ], ovs_be32 dst, + const struct eth_addr mac) + { + struct in6_addr dst6 = in6_addr_mapped_ipv4(dst); +- tnl_neigh_set__(name, &dst6, mac); ++ tnl_neigh_set(name, &dst6, mac); + } + + static int + tnl_arp_snoop(const struct flow *flow, struct flow_wildcards *wc, +- const char name[IFNAMSIZ]) ++ const char name[IFNAMSIZ], bool allow_update) + { + /* Snoop normal ARP replies and gratuitous ARP requests/replies only */ + if (!is_arp(flow) +@@ -159,13 +173,17 @@ tnl_arp_snoop(const struct flow *flow, struct flow_wildcards *wc, + return EINVAL; + } + +- tnl_arp_set(name, FLOW_WC_GET_AND_MASK_WC(flow, wc, nw_src), flow->arp_sha); ++ memset(&wc->masks.nw_src, 0xff, sizeof wc->masks.nw_src); ++ ++ if (allow_update) { ++ tnl_arp_set(name, flow->nw_src, flow->arp_sha); ++ } + return 0; + } + + static int + tnl_nd_snoop(const struct flow *flow, struct flow_wildcards *wc, +- const char name[IFNAMSIZ]) ++ const char name[IFNAMSIZ], bool allow_update) + { + if (!is_nd(flow, wc) || flow->tp_src != htons(ND_NEIGHBOR_ADVERT)) { + return EINVAL; +@@ -184,20 +202,22 @@ tnl_nd_snoop(const struct flow *flow, struct flow_wildcards *wc, + memset(&wc->masks.ipv6_dst, 0xff, sizeof wc->masks.ipv6_dst); + memset(&wc->masks.nd_target, 0xff, sizeof wc->masks.nd_target); + +- tnl_neigh_set__(name, &flow->nd_target, flow->arp_tha); ++ if (allow_update) { ++ tnl_neigh_set(name, &flow->nd_target, flow->arp_tha); ++ } + return 0; + } + + int + tnl_neigh_snoop(const struct flow *flow, struct flow_wildcards *wc, +- const char name[IFNAMSIZ]) ++ const char name[IFNAMSIZ], bool allow_update) + { + int res; +- res = tnl_arp_snoop(flow, wc, name); ++ res = tnl_arp_snoop(flow, wc, name, allow_update); + if (res != EINVAL) { + return res; + } +- return tnl_nd_snoop(flow, wc, name); ++ return tnl_nd_snoop(flow, wc, name, allow_update); + } + + void +@@ -208,7 +228,7 @@ tnl_neigh_cache_run(void) + + ovs_mutex_lock(&mutex); + CMAP_FOR_EACH(neigh, cmap_node, &table) { +- if (neigh->expires <= time_now()) { ++ if (tnl_neigh_expired(neigh)) { + tnl_neigh_delete(neigh); + changed = true; + } +@@ -294,7 +314,7 @@ tnl_neigh_cache_add(struct unixctl_conn *conn, int argc OVS_UNUSED, + return; + } + +- tnl_neigh_set__(br_name, &ip6, mac); ++ tnl_neigh_set(br_name, &ip6, mac); + unixctl_command_reply(conn, "OK"); + } + +@@ -319,7 +339,7 @@ tnl_neigh_cache_show(struct unixctl_conn *conn, int argc OVS_UNUSED, + + ds_put_format(&ds, ETH_ADDR_FMT" %s", + ETH_ADDR_ARGS(neigh->mac), neigh->br_name); +- if (neigh->expires <= time_now()) { ++ if (tnl_neigh_expired(neigh)) { + ds_put_format(&ds, " STALE"); + } + ds_put_char(&ds, '\n'); +diff --git a/lib/tnl-neigh-cache.h b/lib/tnl-neigh-cache.h +index ded9c2f86f..877bca3127 100644 +--- a/lib/tnl-neigh-cache.h ++++ b/lib/tnl-neigh-cache.h +@@ -32,11 +32,13 @@ + #include "util.h" + + int tnl_neigh_snoop(const struct flow *flow, struct flow_wildcards *wc, +- const char dev_name[]); +-int tnl_neigh_lookup(const char dev_name[], const struct in6_addr *dst, ++ const char dev_name[IFNAMSIZ], bool allow_update); ++void tnl_neigh_set(const char name[IFNAMSIZ], const struct in6_addr *dst, ++ const struct eth_addr mac); ++int tnl_neigh_lookup(const char dev_name[IFNAMSIZ], const struct in6_addr *dst, + struct eth_addr *mac); + void tnl_neigh_cache_init(void); + void tnl_neigh_cache_run(void); +-void tnl_neigh_flush(const char dev_name[]); ++void tnl_neigh_flush(const char dev_name[IFNAMSIZ]); + + #endif diff --git a/lib/tun-metadata.c b/lib/tun-metadata.c index f8a0e19524..d177333297 100644 --- a/lib/tun-metadata.c @@ -85672,7 +85885,7 @@ index 409286ab15..cb197e9010 100644 ofproto_dpif_send_async_msg(upcall->ofproto, am); diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c -index 4407f9c97a..fd0e843334 100644 +index 4407f9c97a..3cfb6bf8d6 100644 --- a/ofproto/ofproto-dpif-xlate.c +++ b/ofproto/ofproto-dpif-xlate.c @@ -1516,15 +1516,32 @@ xlate_lookup_ofproto_(const struct dpif_backer *backer, @@ -85738,7 +85951,30 @@ index 4407f9c97a..fd0e843334 100644 if (is_sample) { nl_msg_end_nested(ctx->odp_actions, actions_offset); nl_msg_end_nested(ctx->odp_actions, sample_offset); -@@ -4796,7 +4813,7 @@ put_controller_user_action(struct xlate_ctx *ctx, +@@ -4071,7 +4088,21 @@ terminate_native_tunnel(struct xlate_ctx *ctx, struct flow *flow, + (flow->dl_type == htons(ETH_TYPE_ARP) || + flow->nw_proto == IPPROTO_ICMPV6) && + is_neighbor_reply_correct(ctx, flow)) { +- tnl_neigh_snoop(flow, wc, ctx->xbridge->name); ++ tnl_neigh_snoop(flow, wc, ctx->xbridge->name, ++ ctx->xin->allow_side_effects); ++ } else if (*tnl_port != ODPP_NONE && ++ ctx->xin->allow_side_effects && ++ dl_type_is_ip_any(flow->dl_type)) { ++ struct eth_addr mac = flow->dl_src; ++ struct in6_addr s_ip6; ++ ++ if (flow->dl_type == htons(ETH_TYPE_IP)) { ++ in6_addr_set_mapped_ipv4(&s_ip6, flow->nw_src); ++ } else { ++ s_ip6 = flow->ipv6_src; ++ } ++ ++ tnl_neigh_set(ctx->xbridge->name, &s_ip6, mac); + } + } + +@@ -4796,7 +4827,7 @@ put_controller_user_action(struct xlate_ctx *ctx, ctx->xin->flow.in_port.ofp_port); uint32_t pid = dpif_port_get_pid(ctx->xbridge->dpif, odp_port); odp_put_userspace_action(pid, &cookie, sizeof cookie, ODPP_NONE, @@ -85747,7 +85983,7 @@ index 4407f9c97a..fd0e843334 100644 } static void -@@ -6123,11 +6140,32 @@ static void +@@ -6123,11 +6154,32 @@ static void compose_conntrack_action(struct xlate_ctx *ctx, struct ofpact_conntrack *ofc, bool is_last_action) { @@ -85758,7 +85994,7 @@ index 4407f9c97a..fd0e843334 100644 + if (ofc->zone_src.field) { + union mf_subvalue value; + memset(&value, 0xff, sizeof(value)); -+ + + zone = mf_get_subfield(&ofc->zone_src, &ctx->xin->flow); + if (ctx->xin->frozen_state) { + /* If the upcall is a resume of a recirculation, we only need to @@ -85776,14 +86012,14 @@ index 4407f9c97a..fd0e843334 100644 + } else { + zone = ofc->zone_imm; + } - ++ + size_t ct_offset; + ovs_u128 old_ct_label_mask = ctx->wc->masks.ct_label; + uint32_t old_ct_mark_mask = ctx->wc->masks.ct_mark; /* Ensure that any prior actions are applied before composing the new * conntrack action. */ xlate_commit_actions(ctx); -@@ -6139,11 +6177,6 @@ compose_conntrack_action(struct xlate_ctx *ctx, struct ofpact_conntrack *ofc, +@@ -6139,11 +6191,6 @@ compose_conntrack_action(struct xlate_ctx *ctx, struct ofpact_conntrack *ofc, do_xlate_actions(ofc->actions, ofpact_ct_get_action_len(ofc), ctx, is_last_action, false); @@ -85795,7 +86031,7 @@ index 4407f9c97a..fd0e843334 100644 ct_offset = nl_msg_start_nested(ctx->odp_actions, OVS_ACTION_ATTR_CT); if (ofc->flags & NX_CT_F_COMMIT) { -@@ -6278,6 +6311,7 @@ xlate_check_pkt_larger(struct xlate_ctx *ctx, +@@ -6278,6 +6325,7 @@ xlate_check_pkt_larger(struct xlate_ctx *ctx, * then ctx->exit would be true. Reset to false so that we can * do flow translation for 'IF_LESS_EQUAL' case. finish_freezing() * would have taken care of Undoing the changes done for freeze. */ @@ -85803,7 +86039,7 @@ index 4407f9c97a..fd0e843334 100644 ctx->exit = false; offset_attr = nl_msg_start_nested( -@@ -6302,7 +6336,7 @@ xlate_check_pkt_larger(struct xlate_ctx *ctx, +@@ -6302,7 +6350,7 @@ xlate_check_pkt_larger(struct xlate_ctx *ctx, ctx->was_mpls = old_was_mpls; ctx->conntracked = old_conntracked; ctx->xin->flow = old_flow; @@ -85812,7 +86048,7 @@ index 4407f9c97a..fd0e843334 100644 } static void -@@ -6680,6 +6714,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, +@@ -6680,6 +6728,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, return; } @@ -85820,7 +86056,7 @@ index 4407f9c97a..fd0e843334 100644 OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) { struct ofpact_controller *controller; const struct ofpact_metadata *metadata; -@@ -6694,7 +6729,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, +@@ -6694,7 +6743,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, recirc_for_mpls(a, ctx); @@ -85829,7 +86065,7 @@ index 4407f9c97a..fd0e843334 100644 /* Check if need to store the remaining actions for later * execution. */ if (ctx->freezing) { -@@ -7096,6 +7131,12 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, +@@ -7096,6 +7145,12 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len, ofpacts_len); xlate_check_pkt_larger(ctx, ofpact_get_CHECK_PKT_LARGER(a), remaining_acts, remaining_acts_len); @@ -85842,7 +86078,7 @@ index 4407f9c97a..fd0e843334 100644 break; } } -@@ -7519,7 +7560,8 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout) +@@ -7519,7 +7574,8 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout) /* Restore pipeline metadata. May change flow's in_port and other * metadata to the values that existed when freezing was triggered. */ @@ -85852,7 +86088,7 @@ index 4407f9c97a..fd0e843334 100644 /* Restore stack, if any. */ if (state->stack) { -@@ -7571,14 +7613,10 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout) +@@ -7571,14 +7627,10 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout) ctx.error = XLATE_INVALID_TUNNEL_METADATA; goto exit; } @@ -92083,11 +92319,100 @@ index 4af44200e8..68ce2c5442 100644 + stream_close(stream); return (error || !stream) ? 1 : 0; } +diff --git a/tests/tunnel-push-pop-ipv6.at b/tests/tunnel-push-pop-ipv6.at +index 59723e63b8..c7665a1aeb 100644 +--- a/tests/tunnel-push-pop-ipv6.at ++++ b/tests/tunnel-push-pop-ipv6.at +@@ -432,6 +432,42 @@ AT_CHECK([ovs-appctl dpif/dump-flows int-br | grep 'in_port(6081)'], [0], [dnl + tunnel(tun_id=0x7b,ipv6_src=2001:cafe::92,ipv6_dst=2001:cafe::88,geneve({class=0xffff,type=0x80,len=4,0xa/0xf}{class=0xffff,type=0,len=4}),flags(-df-csum+key)),recirc_id(0),in_port(6081),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(frag=no), packets:0, bytes:0, used:never, actions:userspace(pid=0,controller(reason=1,dont_send=0,continuation=0,recirc_id=3,rule_cookie=0,controller_id=0,max_len=65535)) + ]) + ++dnl Receive VXLAN with different MAC and verify that the neigh cache gets updated ++AT_CHECK([ovs-appctl netdev-dummy/receive p0 'aa55aa550000f8bc1244cafe86dd60000000003a11402001cafe0000000000000000000000922001cafe000000000000000000000088c85312b5003abc700c00000300007b00ffffffffffff00000000000008004500001c0001000040117cce7f0000017f0000010035003500080172']) ++ ++ovs-appctl time/warp 1000 ++ovs-appctl time/warp 1000 ++ ++dnl Check VXLAN tunnel push ++AT_CHECK([ovs-ofctl add-flow int-br action=2]) ++AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=36:b1:ee:7c:01:01,dst=36:b1:ee:7c:01:02),eth_type(0x0800),ipv4(src=1.1.3.88,dst=1.1.3.112,proto=47,tos=0,ttl=64,frag=no)'], [0], [stdout]) ++AT_CHECK([tail -1 stdout], [0], ++ [Datapath actions: clone(tnl_push(tnl_port(4789),header(size=70,type=4,eth(dst=f8:bc:12:44:ca:fe,src=aa:55:aa:55:00:00,dl_type=0x86dd),ipv6(src=2001:cafe::88,dst=2001:cafe::92,label=0,proto=17,tclass=0x0,hlimit=64),udp(src=0,dst=4789,csum=0xffff),vxlan(flags=0x8000000,vni=0x7b)),out_port(100)),1) ++]) ++ ++AT_CHECK([ovs-appctl tnl/arp/show | tail -n+3 | sort], [0], [dnl ++2001:cafe::92 f8:bc:12:44:ca:fe br0 ++2001:cafe::93 f8:bc:12:44:34:b7 br0 ++]) ++ ++dnl Restore and check the cache entries ++AT_CHECK([ovs-appctl netdev-dummy/receive p0 'aa55aa550000f8bc124434b686dd60000000003a11402001cafe0000000000000000000000922001cafe000000000000000000000088c85312b5003abc700c00000300007b00ffffffffffff00000000000008004500001c0001000040117cce7f0000017f0000010035003500080172']) ++ ++ovs-appctl time/warp 1000 ++ovs-appctl time/warp 1000 ++ ++dnl Check VXLAN tunnel push ++AT_CHECK([ovs-ofctl add-flow int-br action=2]) ++AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=36:b1:ee:7c:01:01,dst=36:b1:ee:7c:01:02),eth_type(0x0800),ipv4(src=1.1.3.88,dst=1.1.3.112,proto=47,tos=0,ttl=64,frag=no)'], [0], [stdout]) ++AT_CHECK([tail -1 stdout], [0], ++ [Datapath actions: clone(tnl_push(tnl_port(4789),header(size=70,type=4,eth(dst=f8:bc:12:44:34:b6,src=aa:55:aa:55:00:00,dl_type=0x86dd),ipv6(src=2001:cafe::88,dst=2001:cafe::92,label=0,proto=17,tclass=0x0,hlimit=64),udp(src=0,dst=4789,csum=0xffff),vxlan(flags=0x8000000,vni=0x7b)),out_port(100)),1) ++]) ++ ++AT_CHECK([ovs-appctl tnl/arp/show | tail -n+3 | sort], [0], [dnl ++2001:cafe::92 f8:bc:12:44:34:b6 br0 ++2001:cafe::93 f8:bc:12:44:34:b7 br0 ++]) ++ + ovs-appctl time/warp 10000 + + AT_CHECK([ovs-vsctl del-port int-br t3 \ diff --git a/tests/tunnel-push-pop.at b/tests/tunnel-push-pop.at -index b92c23fde8..320ae5c9c2 100644 +index b92c23fde8..78373b9edc 100644 --- a/tests/tunnel-push-pop.at +++ b/tests/tunnel-push-pop.at -@@ -573,6 +573,64 @@ OVS_WAIT_UNTIL([test `ovs-pcap p0.pcap | grep 50540000000a5054000000091235 | wc +@@ -502,6 +502,41 @@ AT_CHECK([ovs-appctl dpif/dump-flows int-br | grep 'in_port(6081)'], [0], [dnl + tunnel(tun_id=0x7b,src=1.1.2.92,dst=1.1.2.88,geneve({class=0xffff,type=0x80,len=4,0xa/0xf}{class=0xffff,type=0,len=4}),flags(-df-csum+key)),recirc_id(0),in_port(6081),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(frag=no), packets:0, bytes:0, used:never, actions:userspace(pid=0,controller(reason=1,dont_send=0,continuation=0,recirc_id=2,rule_cookie=0,controller_id=0,max_len=65535)) + ]) + ++dnl Receive VXLAN with different MAC and verify that the neigh cache gets updated ++AT_CHECK([ovs-appctl netdev-dummy/receive p0 'aa55aa550000f8bc1244cafe08004500004e00010000401173e90101025c01010258c85312b5003a8cd40c00000300007b00ffffffffffff00000000000008004500001c0001000040117cce7f0000017f0000010035003500080172']) ++ ++ovs-appctl time/warp 1000 ++ovs-appctl time/warp 1000 ++ ++dnl Check VXLAN tunnel push ++AT_CHECK([ovs-ofctl add-flow int-br action=2]) ++AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=36:b1:ee:7c:01:01,dst=36:b1:ee:7c:01:02),eth_type(0x0800),ipv4(src=1.1.3.88,dst=1.1.3.112,proto=47,tos=0,ttl=64,frag=no)'], [0], [stdout]) ++AT_CHECK([tail -1 stdout], [0], ++ [Datapath actions: clone(tnl_push(tnl_port(4789),header(size=50,type=4,eth(dst=f8:bc:12:44:ca:fe,src=aa:55:aa:55:00:00,dl_type=0x0800),ipv4(src=1.1.2.88,dst=1.1.2.92,proto=17,tos=0,ttl=64,frag=0x4000),udp(src=0,dst=4789,csum=0x0),vxlan(flags=0x8000000,vni=0x7b)),out_port(100)),1) ++]) ++ ++AT_CHECK([ovs-appctl tnl/neigh/show | tail -n+3 | sort], [0], [dnl ++1.1.2.92 f8:bc:12:44:ca:fe br0 ++1.1.2.93 f8:bc:12:44:34:b7 br0 ++]) ++ ++dnl Restore and check the cache entries ++AT_CHECK([ovs-appctl netdev-dummy/receive p0 'aa55aa550000f8bc124434b608004500004e00010000401173e90101025c01010258c85312b5003a8cd40c00000300007b00ffffffffffff00000000000008004500001c0001000040117cce7f0000017f0000010035003500080172']) ++ ++ovs-appctl time/warp 1000 ++ovs-appctl time/warp 1000 ++ ++dnl Check VXLAN tunnel push ++AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=36:b1:ee:7c:01:01,dst=36:b1:ee:7c:01:02),eth_type(0x0800),ipv4(src=1.1.3.88,dst=1.1.3.112,proto=47,tos=0,ttl=64,frag=no)'], [0], [stdout]) ++AT_CHECK([tail -1 stdout], [0], ++ [Datapath actions: clone(tnl_push(tnl_port(4789),header(size=50,type=4,eth(dst=f8:bc:12:44:34:b6,src=aa:55:aa:55:00:00,dl_type=0x0800),ipv4(src=1.1.2.88,dst=1.1.2.92,proto=17,tos=0,ttl=64,frag=0x4000),udp(src=0,dst=4789,csum=0x0),vxlan(flags=0x8000000,vni=0x7b)),out_port(100)),1) ++]) ++ ++AT_CHECK([ovs-appctl tnl/neigh/show | tail -n+3 | sort], [0], [dnl ++1.1.2.92 f8:bc:12:44:34:b6 br0 ++1.1.2.93 f8:bc:12:44:34:b7 br0 ++]) ++ + ovs-appctl time/warp 10000 + + AT_CHECK([ovs-vsctl del-port int-br t3 \ +@@ -573,6 +608,64 @@ OVS_WAIT_UNTIL([test `ovs-pcap p0.pcap | grep 50540000000a5054000000091235 | wc OVS_VSWITCHD_STOP AT_CLEANUP diff --git a/SPECS/openvswitch2.13.spec b/SPECS/openvswitch2.13.spec index ddd80aa..dde6366 100644 --- a/SPECS/openvswitch2.13.spec +++ b/SPECS/openvswitch2.13.spec @@ -59,7 +59,7 @@ Summary: Open vSwitch Group: System Environment/Daemons daemon/database/utilities URL: http://www.openvswitch.org/ Version: 2.13.0 -Release: 141%{?commit0:.%{date}git%{shortcommit0}}%{?commit1:dpdk%{shortcommit1}}%{?dist} +Release: 142%{?commit0:.%{date}git%{shortcommit0}}%{?commit1:dpdk%{shortcommit1}}%{?dist} # Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the # lib/sflow*.[ch] files are SISSL @@ -712,6 +712,17 @@ exit 0 %endif %changelog +* Sat Dec 18 2021 Open vSwitch CI - 2.13.0-142 +- Merging upstream branch-2.13 [RH git: e2ae994435] + Commit list: + 025ec93bc5 Prepare for 2.13.7. + 723e0727f3 Set release date for 2.13.6. + d6d2dead72 ofproto-dpif-xlate: Snoop ingress packets and update neigh cache if needed. + dc8b79ccf1 tnl-neigh-cache: Do not refresh the entry while revalidating. + 7e1c6034b5 tnl-neigh-cache: Include expected array sizes in prototypes. + 9c98116ac7 tnl-neigh-cache: Read/write expires atomically. + + * Thu Dec 09 2021 Open vSwitch CI - 2.13.0-141 - Merging upstream branch-2.13 [RH git: 035911bcc8] Commit list: