diff --git a/SOURCES/openvswitch-2.17.0.patch b/SOURCES/openvswitch-2.17.0.patch
index 1712036..a7c9106 100644
--- a/SOURCES/openvswitch-2.17.0.patch
+++ b/SOURCES/openvswitch-2.17.0.patch
@@ -181,6 +181,19 @@ index af524251ff..49895c595f 100644
      ============ ========
  
  Q: Are all the DPDK releases that OVS versions work with maintained?
+diff --git a/Documentation/internals/maintainers.rst b/Documentation/internals/maintainers.rst
+index 172d684df9..0203bbe955 100644
+--- a/Documentation/internals/maintainers.rst
++++ b/Documentation/internals/maintainers.rst
+@@ -22,3 +22,8 @@
+       Avoid deeper levels because they do not render well.
+ 
+ .. include:: ../../MAINTAINERS.rst
++   :end-before: Cut here for the Documentation/internals/maintainers.rst
++
++.. |responsibilities| replace:: :doc:`committer-responsibilities`
++.. |grant-revocation| replace:: :doc:`committer-grant-revocation`
++.. |emeritus-status|  replace:: :doc:`committer-emeritus-status`
 diff --git a/Documentation/intro/install/dpdk.rst b/Documentation/intro/install/dpdk.rst
 index d9f44055db..a284e68514 100644
 --- a/Documentation/intro/install/dpdk.rst
@@ -220,6 +233,95 @@ index c4300cd53e..a297aadac8 100644
    (https://git.kernel.org/pub/scm/devel/sparse/sparse.git/).
  
  - GNU make.
+diff --git a/Documentation/topics/dpdk/phy.rst b/Documentation/topics/dpdk/phy.rst
+index 937f4c40e5..90c8691e32 100644
+--- a/Documentation/topics/dpdk/phy.rst
++++ b/Documentation/topics/dpdk/phy.rst
+@@ -76,8 +76,8 @@ persist across reboots. In addition, there are two options available for this
+ kernel space driver - VFIO (Virtual Function I/O) and UIO (Userspace I/O) -
+ along with a number of drivers for each option. We will demonstrate examples of
+ both tools and will use the ``vfio-pci`` driver, which is the more secure,
+-robust driver of those available. More information can be found in the `DPDK
+-documentation <dpdk-drivers>`__.
++robust driver of those available. More information can be found in the
++`DPDK drivers documentation`_.
+ 
+ To list devices using :command:`driverctl`, run::
+ 
+@@ -115,9 +115,9 @@ tool::
+    Open vSwitch 2.6.0 added support for DPDK 16.07, which in turn renamed the
+    former ``dpdk_nic_bind`` tool to ``dpdk-devbind``.
+ 
+-For more information, refer to the `DPDK documentation <dpdk-drivers>`__.
++For more information, refer to the `DPDK drivers documentation`_.
+ 
+-.. _dpdk-drivers: https://doc.dpdk.org/guides-21.11/linux_gsg/linux_drivers.html
++.. _DPDK drivers documentation: https://doc.dpdk.org/guides-21.11/linux_gsg/linux_drivers.html
+ 
+ .. _dpdk-phy-multiqueue:
+ 
+@@ -394,14 +394,14 @@ in the ``options`` column of the ``Interface`` table.
+ 
+ .. important::
+ 
+-   Some DPDK port use `bifurcated drivers <bifurcated-drivers>`__,
+-   which means that a kernel netdevice remains when Open vSwitch is stopped.
++   Some DPDK port use `bifurcated drivers`_, which means that a kernel
++   netdevice remains when Open vSwitch is stopped.
+ 
+    In such case, any configuration applied to a VF would remain set on the
+    kernel netdevice, and be inherited from it when Open vSwitch is restarted,
+    even if the options described in this section are unset from Open vSwitch.
+ 
+-.. _bifurcated-drivers: https://doc.dpdk.org/guides-21.11/linux_gsg/linux_drivers.html#bifurcated-driver
++.. _bifurcated drivers: https://doc.dpdk.org/guides-21.11/linux_gsg/linux_drivers.html#bifurcated-driver
+ 
+ - Configure the VF MAC address::
+ 
+diff --git a/MAINTAINERS.rst b/MAINTAINERS.rst
+index 27be4aa412..1dc406170f 100644
+--- a/MAINTAINERS.rst
++++ b/MAINTAINERS.rst
+@@ -28,11 +28,11 @@ Committers
+ Open vSwitch committers are the people who have been granted access to push
+ changes to the Open vSwitch git repository.
+ 
+-The responsibilities of an Open vSwitch committer are documented
+-`here <Documentation/internals/committer-responsibilities.rst>`__.
++The responsibilities of an Open vSwitch committer are documented here:
++|responsibilities|.
+ 
+-The process for adding or removing committers is documented
+-`here <Documentation/internals/committer-grant-revocation.rst>`__.
++The process for adding or removing committers is documented here:
++|grant-revocation|.
+ 
+ This is the current list of active Open vSwitch committers:
+ 
+@@ -77,8 +77,8 @@ This is the current list of active Open vSwitch committers:
+      - yamamoto@midokura.com
+ 
+ The project also maintains a list of Emeritus Committers (or Maintainers).
+-More information about Emeritus Committers can be found
+-`here <Documentation/internals/committer-emeritus-status.rst>`__.
++More information about Emeritus Committers can be found here:
++|emeritus-status|.
+ 
+ .. list-table:: OVS Emeritus Maintainers
+    :header-rows: 1
+@@ -91,3 +91,12 @@ More information about Emeritus Committers can be found
+      - ejj@eecs.berkeley.edu
+    * - Joe Stringer
+      - joe@ovn.org
++
++.. Cut here for the Documentation/internals/maintainers.rst
++
++.. |responsibilities| replace:: `Expectations for Developers with Open vSwitch
++   Repo Access <Documentation/internals/committer-responsibilities.rst>`__
++.. |grant-revocation| replace:: `OVS Committer Grant/Revocation Policy
++   <Documentation/internals/committer-grant-revocation.rst>`__
++.. |emeritus-status|  replace:: `Emeritus Status for OVS Committers
++   <Documentation/internals/committer-emeritus-status.rst>`__
 diff --git a/NEWS b/NEWS
 index c10e9bfacc..45b974ed22 100644
 --- a/NEWS
@@ -52206,6 +52308,19 @@ index 71e35ccdda..484545cfb8 100644
          return true;
      }
  
+diff --git a/lib/dpif.c b/lib/dpif.c
+index 40f5fe4460..fe4db83fbf 100644
+--- a/lib/dpif.c
++++ b/lib/dpif.c
+@@ -1213,7 +1213,7 @@ dpif_execute_helper_cb(void *aux_, struct dp_packet_batch *packets_,
+             /* The Linux kernel datapath throws away the tunnel information
+              * that we supply as metadata.  We have to use a "set" action to
+              * supply it. */
+-            if (md->tunnel.ip_dst) {
++            if (flow_tnl_dst_is_set(&md->tunnel)) {
+                 odp_put_tunnel_action(&md->tunnel, &execute_actions, NULL);
+             }
+             ofpbuf_put(&execute_actions, action, NLA_ALIGN(action->nla_len));
 diff --git a/lib/dynamic-string.c b/lib/dynamic-string.c
 index fd0127ed17..8e9555a630 100644
 --- a/lib/dynamic-string.c
@@ -63560,7 +63675,7 @@ index 06b671df8c..2d14f1ac26 100644
  AT_CHECK([ovsdb-server --detach --no-chdir --pidfile --remote=punix:socket db], [0], [ignore], [ignore])
  sed 's/5\.1\.3/5.1.4/' < schema > schema2
 diff --git a/tests/ovsdb-cluster.at b/tests/ovsdb-cluster.at
-index fc6253cfe9..920b833b72 100644
+index fc6253cfe9..9fbf5dc897 100644
 --- a/tests/ovsdb-cluster.at
 +++ b/tests/ovsdb-cluster.at
 @@ -1,12 +1,25 @@
@@ -63577,7 +63692,7 @@ index fc6253cfe9..920b833b72 100644
      $schema_func > schema
      schema=`ovsdb-tool schema-name schema`
      AT_CHECK([ovsdb-tool '-vPATTERN:console:%c|%p|%m' create-cluster s1.db schema unix:s1.raft], [0], [], [stderr])
-+    if test X$local_config == X"yes"; then
++    if test X$local_config = X"yes"; then
 +        for i in `seq $n`; do
 +            AT_CHECK([ovsdb-tool create c$i.db $top_srcdir/ovsdb/local-config.ovsschema], [0], [], [stderr])
 +            local ctxn="[[\"Local_Config\",
@@ -63599,7 +63714,7 @@ index fc6253cfe9..920b833b72 100644
 -        AT_CHECK([ovsdb-server -vraft -vconsole:off -vsyslog:off --detach --no-chdir --log-file=s$i.log --pidfile=s$i.pid --unixctl=s$i --remote=punix:s$i.ovsdb s$i.db])
 +        local remote=punix:s$i.ovsdb
 +        local config_db=
-+        if test X$local_config == X"yes"; then
++        if test X$local_config = X"yes"; then
 +            remote=db:Local_Config,Config,connections
 +            config_db=c$i.db
 +        fi
@@ -63643,6 +63758,31 @@ index fc6253cfe9..920b833b72 100644
     AT_CLEANUP])
  EXECUTION_EXAMPLES
  
+@@ -101,7 +129,7 @@ ovsdb_test_cluster_disconnect () {
+     # When a node is disconnected from the cluster, the IDL should disconnect
+     # and retry even if it uses a single remote, because the remote IP can be
+     # a VIP on a load-balance. So we use single remote to test here.
+-    if test $leader_or_follower == "leader"; then
++    if test $leader_or_follower = "leader"; then
+         target=1
+         shutdown=`seq $(($n/2 + 1)) $n`
+         cleanup=`seq $(($n/2))`
+@@ -160,13 +188,13 @@ ovsdb_test_cluster_disconnect () {
+     count_old=`grep "raft_is_connected: true" raft_is_connected.log | wc -l`
+     echo count_old $count_old
+ 
+-    if test X$check_flapping == X"yes"; then
++    if test X$check_flapping = X"yes"; then
+         sleep 10
+     fi
+     # Make sure raft_is_connected didn't flap from false to true.
+     count_new=`grep "raft_is_connected: true" raft_is_connected.log | wc -l`
+     echo count_new $count_new
+-    AT_CHECK([test $count_new == $count_old])
++    AT_CHECK([test $count_new = $count_old])
+ 
+     for i in $cleanup; do
+         OVS_APP_EXIT_AND_WAIT_BY_TARGET([`pwd`/s$i], [s$i.pid])
 @@ -400,6 +428,61 @@ done
  
  AT_CLEANUP
@@ -63705,8 +63845,12 @@ index fc6253cfe9..920b833b72 100644
  
  
  OVS_START_SHELL_HELPERS
-@@ -413,12 +496,12 @@ ovsdb_cluster_failure_test () {
-     if test "$crash_node" == "1"; then
+@@ -410,15 +493,15 @@ ovsdb_cluster_failure_test () {
+     remote_2=$2
+     crash_node=$3
+     crash_command=$4
+-    if test "$crash_node" == "1"; then
++    if test "$crash_node" = "1"; then
          new_leader=$5
      fi
 +    log_grep=$6
@@ -63730,7 +63874,15 @@ index fc6253cfe9..920b833b72 100644
      }
      connect_server() {
          local i=$1
-@@ -460,14 +543,23 @@ ovsdb|WARN|schema: changed 30 columns in 'Open_vSwitch' database from ephemeral
+@@ -453,21 +536,30 @@ ovsdb|WARN|schema: changed 30 columns in 'Open_vSwitch' database from ephemeral
+     # To ensure $new_leader node the new leader, we delay election timer for
+     # the other follower.
+     if test -n "$new_leader"; then
+-        if test "$new_leader" == "2"; then
++        if test "$new_leader" = "2"; then
+             delay_election_node=3
+         else
+             delay_election_node=2
          fi
          AT_CHECK([ovs-appctl -t "`pwd`"/s$delay_election_node cluster/failure-test delay-election], [0], [ignore])
      fi
@@ -64129,7 +64281,7 @@ index 62e2b63832..092d9f81a2 100644
 +006: done
 +]])
 diff --git a/tests/ovsdb-server.at b/tests/ovsdb-server.at
-index 876cb836cd..e672c13b27 100644
+index 876cb836cd..d49de0daa4 100644
 --- a/tests/ovsdb-server.at
 +++ b/tests/ovsdb-server.at
 @@ -4,7 +4,7 @@ m4_define([OVSDB_SERVER_SHUTDOWN],
@@ -64222,6 +64374,15 @@ index 876cb836cd..e672c13b27 100644
      OVSDB_SERVER_SHUTDOWN
  }
  OVS_END_SHELL_HELPERS
+@@ -1255,7 +1254,7 @@ dnl a case where there is only one transaction in a history.
+ get_memory_value () {
+     n=$(ovs-appctl -t ovsdb-server memory/show dnl
+             | tr ' ' '\n' | grep "^$1:" | cut -d ':' -f 2)
+-    if test X"$n" == "X"; then
++    if test X"$n" = "X"; then
+         n=0
+     fi
+     echo $n
 @@ -1319,15 +1318,14 @@ m4_define([OVSDB_CHECK_EXECUTION],
     $2 > schema
     PKIDIR=$abs_top_builddir/tests
@@ -64999,7 +65160,7 @@ index 1714273e35..270956d13f 100644
  dnl Delete ip address.
  AT_CHECK([ip addr del 10.0.0.17/24 dev p1-route], [0], [stdout])
 diff --git a/tests/system-traffic.at b/tests/system-traffic.at
-index f22d86e466..9d1c96bb43 100644
+index f22d86e466..4808e78de3 100644
 --- a/tests/system-traffic.at
 +++ b/tests/system-traffic.at
 @@ -192,6 +192,46 @@ NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00:1::2 | FORMAT_PI
@@ -65202,15 +65363,64 @@ index f22d86e466..9d1c96bb43 100644
  OVS_CHECK_GENEVE_UDP6ZEROCSUM()
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -723,6 +822,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -722,7 +821,56 @@ NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PI
+ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
++AT_SETUP([datapath - slow_action on geneve6 tunnel])
++AT_SKIP_IF([test $HAVE_TCPDUMP = no])
++OVS_CHECK_TUNNEL_TSO()
++OVS_CHECK_GENEVE_UDP6ZEROCSUM()
++
++OVS_TRAFFIC_VSWITCHD_START()
++ADD_BR([br-underlay])
++
++AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
++AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
++
++ADD_NAMESPACES(at_ns0)
++
++dnl Set up underlay link from host into the namespace using veth pair.
++ADD_VETH(p0, at_ns0, br-underlay, "fc00::1/64", [], [], "nodad")
++AT_CHECK([ip addr add dev br-underlay "fc00::100/64" nodad])
++AT_CHECK([ip link set dev br-underlay up])
++
++dnl Set up tunnel endpoints on OVS outside the namespace and with a native
++dnl linux device inside the namespace.
++ADD_OVS_TUNNEL6([geneve], [br0], [at_gnv0], [fc00::1], [10.1.1.100/24])
++ADD_NATIVE_TUNNEL6([geneve], [ns_gnv0], [at_ns0], [fc00::100], [10.1.1.1/24],
++                   [vni 0 udp6zerocsumtx udp6zerocsumrx])
++AT_CHECK([ovs-ofctl add-flow br0 "table=37,actions=at_gnv0"])
++
++OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::100])
++
++dnl First, check the underlay.
++NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00::100 | FORMAT_PING], [0], [dnl
++3 packets transmitted, 3 received, 0% packet loss, time 0ms
++])
++
++dnl Start tcpdump to capture the encapsulated packets.
++NETNS_DAEMONIZE([at_ns0], [tcpdump -U -i p0 -w p0.pcap], [tcpdump.pid])
++sleep 1
++
++dnl Generate a single packet trough the controler that needs an ARP modification
++AT_CHECK([ovs-ofctl -O OpenFlow15 packet-out br0 "in_port=controller packet=fffffffffffffa163e949d8008060001080006040001fa163e949d80c0a820300000000000000a0000fe actions=set_field:0xa0000f4->reg1,move:NXM_NX_XXREG0[[64..95]]->NXM_OF_ARP_SPA[[]],resubmit(,37)"])
++sleep 1
++
++dnl Stop OVS and tcpdump and verify the results.
++OVS_TRAFFIC_VSWITCHD_STOP
++
++ovs-pcap p0.pcap
++
++AT_CHECK([ovs-pcap p0.pcap | grep -Eq "^[[[:xdigit:]]]{24}86dd60000000003a1140fc000000000000000000000000000100fc000000000000000000000000000001[[[:xdigit:]]]{4}17c1003a[[[:xdigit:]]]{4}0000655800000000fffffffffffffa163e949d8008060001080006040001[[[:xdigit:]]]{12}0a0000f40000000000000a0000fe$"])
++AT_CLEANUP
++
  AT_SETUP([datapath - ping over gre tunnel by simulated packets])
 +OVS_CHECK_TUNNEL_TSO()
  OVS_CHECK_MIN_KERNEL(3, 10)
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -759,16 +859,17 @@ dnl ADD_NATIVE_TUNNEL([gretap], [ns_gre0], [at_ns0], [172.31.1.100], [10.1.1.1/2
+@@ -759,16 +907,17 @@ dnl ADD_NATIVE_TUNNEL([gretap], [ns_gre0], [at_ns0], [172.31.1.100], [10.1.1.1/2
  dnl Now, check the overlay by sending out raw arp and icmp packets.
  ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff00000003080045000042ec2c4000402ff3bcac1f0101ac1f016400006558fffffffffffff2ff0000000408060001080006040001f2ff000000040a0101010000000000000a010164 actions=NORMAL"
  
@@ -65230,7 +65440,7 @@ index f22d86e466..9d1c96bb43 100644
  OVS_CHECK_MIN_KERNEL(3, 10)
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -803,20 +904,21 @@ dnl Okay, now send out an arp request from 10.1.1.1 for 10.1.1.100 in erspan.
+@@ -803,20 +952,21 @@ dnl Okay, now send out an arp request from 10.1.1.1 for 10.1.1.100 in erspan.
  ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff0000000308004500004e151d4000402fcac0ac1f0101ac1f0164100088be000000061000000100000007fffffffffffff2ff0000000408060001080006040001f2ff000000040a0101010000000000000a010164 actions=normal"
  
  dnl 0002 is arp reply, followed by mac address of 10.1.1.100.
@@ -65256,7 +65466,7 @@ index f22d86e466..9d1c96bb43 100644
  OVS_CHECK_MIN_KERNEL(3, 10)
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -854,22 +956,23 @@ NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [
+@@ -854,22 +1004,23 @@ NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [
  dnl Okay, send raw arp request and icmp echo request.
  ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff00000003080045000052373d4000402fa89cac1f0101ac1f0164100088be00000006200000016f54b41700008078fffffffffffff2ff0000000408060001080006040001f2ff000000040a0101010000000000000a010164 actions=normal"
  
@@ -65285,7 +65495,7 @@ index f22d86e466..9d1c96bb43 100644
  OVS_CHECK_MIN_KERNEL(3, 10)
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -911,20 +1014,21 @@ dnl Okay, now send raw arp request and icmp echo request.
+@@ -911,20 +1062,21 @@ dnl Okay, now send raw arp request and icmp echo request.
  ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff0000000386dd60008531003a2f40fc000100000000000000000000000001fc000100000000000000000000000100100088be000000051000007b00000007fffffffffffff2ff0000000408060001080006040001f2ff000000040a0101010000000000000a010164 actions=normal"
  
  dnl Check arp reply.
@@ -65312,7 +65522,7 @@ index f22d86e466..9d1c96bb43 100644
  OVS_CHECK_MIN_KERNEL(3, 10)
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -965,15 +1069,15 @@ NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00:100::100 | FORMAT_PING],
+@@ -965,15 +1117,15 @@ NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00:100::100 | FORMAT_PING],
  dnl Okay, now send raw arp request and icmp echo request.
  ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff0000000386dd60008531003e2f40fc000100000000000000000000000001fc000100000000000000000000000100100088be0000000620000079af514f9900008070fffffffffffff2ff0000000408060001080006040001f2ff000000040a0101010000000000000a010164 actions=normal"
  
@@ -65333,7 +65543,7 @@ index f22d86e466..9d1c96bb43 100644
  
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
-@@ -1004,9 +1108,9 @@ NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0],
+@@ -1004,9 +1156,9 @@ NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0],
  OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  
  AT_CHECK([cat ofctl_monitor.log | STRIP_MONITOR_CSUM], [0], [dnl
@@ -65346,7 +65556,7 @@ index f22d86e466..9d1c96bb43 100644
  ])
  
  OVS_TRAFFIC_VSWITCHD_STOP
-@@ -1765,10 +1869,10 @@ dnl p1(at_ns1) interface
+@@ -1765,10 +1917,10 @@ dnl p1(at_ns1) interface
  NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 36 b1 ee 7c 01 02 36 b1 ee 7c 01 03 08 00 45 00 00 54 03 44 40 00 40 01 21 61 0a 01 01 01 0a 01 01 02 08 00 ef ac 7c e4 00 03 5b 2c 1f 61 00 00 00 00 50 0b 02 00 00 00 00 00 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37  > /dev/null])
  
  dnl Check the expected mpls encapsulated packet on the egress interface
@@ -65361,7 +65571,7 @@ index f22d86e466..9d1c96bb43 100644
  
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
-@@ -1797,10 +1901,10 @@ dnl p1(at_ns1) interface
+@@ -1797,10 +1949,10 @@ dnl p1(at_ns1) interface
  NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 36 b1 ee 7c 01 02 36 b1 ee 7c 01 03 08 00 45 00 00 54 03 44 40 00 40 01 21 61 0a 01 01 01 0a 01 01 02 08 00 ef ac 7c e4 00 03 5b 2c 1f 61 00 00 00 00 50 0b 02 00 00 00 00 00 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37  > /dev/null])
  
  dnl Check the expected mpls encapsulated packet on the egress interface
@@ -65376,7 +65586,7 @@ index f22d86e466..9d1c96bb43 100644
  
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
-@@ -1830,10 +1934,10 @@ dnl p1(at_ns1) interface
+@@ -1830,10 +1982,10 @@ dnl p1(at_ns1) interface
  NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 36 b1 ee 7c 01 02 36 b1 ee 7c 01 03 08 00 45 00 00 54 03 44 40 00 40 01 21 61 0a 01 01 01 0a 01 01 02 08 00 ef ac 7c e4 00 03 5b 2c 1f 61 00 00 00 00 50 0b 02 00 00 00 00 00 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37  > /dev/null])
  
  dnl Check the expected mpls encapsulated packet on the egress interface
@@ -65391,7 +65601,7 @@ index f22d86e466..9d1c96bb43 100644
  
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
-@@ -1862,10 +1966,10 @@ dnl p1(at_ns1) interface
+@@ -1862,10 +2014,10 @@ dnl p1(at_ns1) interface
  NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 36 b1 ee 7c 01 02 36 b1 ee 7c 01 03 08 00 45 00 00 54 03 44 40 00 40 01 21 61 0a 01 01 01 0a 01 01 02 08 00 ef ac 7c e4 00 03 5b 2c 1f 61 00 00 00 00 50 0b 02 00 00 00 00 00 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37  > /dev/null])
  
  dnl Check the expected mpls encapsulated packet on the egress interface
@@ -65406,7 +65616,7 @@ index f22d86e466..9d1c96bb43 100644
  
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
-@@ -1896,13 +2000,13 @@ dnl p1(at_ns1) interface
+@@ -1896,13 +2048,13 @@ dnl p1(at_ns1) interface
  NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 00 00 00 00 00 02 00 00 00 00 00 01 88 47 00 00 21 40 36 b1 ee 7c 01 02 36 b1 ee 7c 01 03 08 00 45 00 00 54 03 44 40 00 40 01 21 61 0a 01 01 01 0a 01 01 02 08 00 ef ac 7c e4 00 03 5b 2c 1f 61 00 00 00 00 50 0b 02 00 00 00 00 00 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37  > /dev/null])
  
  dnl Check the expected decapsulated on the egress interface
@@ -65427,7 +65637,7 @@ index f22d86e466..9d1c96bb43 100644
  
  
  OVS_TRAFFIC_VSWITCHD_STOP
-@@ -1933,15 +2037,51 @@ dnl p1(at_ns1) interface
+@@ -1933,15 +2085,51 @@ dnl p1(at_ns1) interface
  NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 00 00 00 00 00 02 00 00 00 00 00 01 88 47 00 00 21 40 36 b1 ee 7c 01 02 36 b1 ee 7c 01 03 08 00 45 00 00 54 03 44 40 00 40 01 21 61 0a 01 01 01 0a 01 01 02 08 00 ef ac 7c e4 00 03 5b 2c 1f 61 00 00 00 00 50 0b 02 00 00 00 00 00 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37  > /dev/null])
  
  dnl Check the expected decapsulated on the egress interface
@@ -65486,7 +65696,7 @@ index f22d86e466..9d1c96bb43 100644
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
-@@ -1985,9 +2125,9 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -1985,9 +2173,9 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  dnl Check this output. We only see the latter two packets, not the first.
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN2 (xid=0x0): total_len=42 in_port=1 (via action) data_len=42 (unbuffered)
@@ -65498,7 +65708,7 @@ index f22d86e466..9d1c96bb43 100644
  ])
  
  OVS_TRAFFIC_VSWITCHD_STOP
-@@ -2033,9 +2173,9 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -2033,9 +2221,9 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  dnl Check this output. We only see the latter two packets, not the first.
  AT_CHECK([cat ofctl_monitor.log], [0], [dnl
  NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 in_port=1 (via action) data_len=42 (unbuffered)
@@ -65510,7 +65720,7 @@ index f22d86e466..9d1c96bb43 100644
  ])
  
  dnl
-@@ -2980,6 +3120,15 @@ NXST_FLOW reply:
+@@ -2980,6 +3168,15 @@ NXST_FLOW reply:
   table=1, priority=100,ct_state=+est+trk,in_port=1 actions=output:2
  ])
  
@@ -65526,7 +65736,7 @@ index f22d86e466..9d1c96bb43 100644
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
-@@ -3140,11 +3289,11 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
+@@ -3140,11 +3337,11 @@ OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
  dnl Check this output. We only see the latter two packets, not the first.
  AT_CHECK([cat ofctl_monitor.log | grep -v ff02 | grep -v fe80 | grep -v no_match], [0], [dnl
  NXT_PACKET_IN2 (xid=0x0): table_id=1 cookie=0x0 total_len=75 ct_state=inv|trk,ip,in_port=2 (via action) data_len=75 (unbuffered)
@@ -65541,7 +65751,7 @@ index f22d86e466..9d1c96bb43 100644
  ])
  
  AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(172.16.0.1)], [0], [dnl
-@@ -3345,6 +3494,11 @@ AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
+@@ -3345,6 +3542,11 @@ AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
  AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
  ])
  
@@ -65553,7 +65763,7 @@ index f22d86e466..9d1c96bb43 100644
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
-@@ -4100,15 +4254,15 @@ action=normal
+@@ -4100,15 +4302,15 @@ action=normal
  
  AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
  
@@ -65572,7 +65782,7 @@ index f22d86e466..9d1c96bb43 100644
  "1616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161610a, actions=ct(table=1)"])
  
  AT_CHECK([ovs-appctl dpctl/dump-flows | head -2 | tail -1 | grep -q -e ["]udp[(]src=5001["]])
-@@ -5384,7 +5538,7 @@ AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | sed -e 's/dst=
+@@ -5384,7 +5586,7 @@ AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | sed -e 's/dst=
  udp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.2XX,sport=<cleared>,dport=<cleared>),mark=1
  ])
  
@@ -65581,7 +65791,7 @@ index f22d86e466..9d1c96bb43 100644
  
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
-@@ -6134,7 +6288,7 @@ sleep 1
+@@ -6134,7 +6336,7 @@ sleep 1
  dnl UDP packets from ns0->ns1 should solicit "destination unreachable" response.
  NS_CHECK_EXEC([at_ns0], [bash -c "echo a | nc -6 $NC_EOF_OPT -u fc00::2 1"])
  
@@ -65590,7 +65800,7 @@ index f22d86e466..9d1c96bb43 100644
  
  AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
  udp,orig=(src=fc00::1,dst=fc00::2,sport=<cleared>,dport=<cleared>),reply=(src=fc00::2,dst=fc00::240,sport=<cleared>,dport=<cleared>)
-@@ -6454,7 +6608,7 @@ on_exit 'ovs-appctl revalidator/purge'
+@@ -6454,7 +6656,7 @@ on_exit 'ovs-appctl revalidator/purge'
  on_exit 'ovs-appctl dpif/dump-flows br0'
  
  dnl Should work with the virtual IP address through NAT
@@ -65599,7 +65809,7 @@ index f22d86e466..9d1c96bb43 100644
      echo Request $i
      NS_CHECK_EXEC([at_ns1], [wget 10.1.1.64 -t 5 -T 1 --retry-connrefused -v -o wget$i.log])
  done
-@@ -6743,6 +6897,132 @@ AT_CHECK([ovs-ofctl dump-flows br0 | grep table=2, | OFPROTO_CLEAR_DURATION_IDLE
+@@ -6743,6 +6945,132 @@ AT_CHECK([ovs-ofctl dump-flows br0 | grep table=2, | OFPROTO_CLEAR_DURATION_IDLE
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
@@ -65732,7 +65942,7 @@ index f22d86e466..9d1c96bb43 100644
  AT_BANNER([802.1ad])
  
  AT_SETUP([802.1ad - vlan_limit])
-@@ -7007,12 +7287,12 @@ dnl p1(at_ns1) interface
+@@ -7007,12 +7335,12 @@ dnl p1(at_ns1) interface
  NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 f2 00 00 00 00 02 f2 00 00 00 00 01 08 00 45 00 00 28 00 01 00 00 40 06 b0 13 c0 a8 00 0a 0a 00 00 0a 04 00 08 00 00 00 00 c8 00 00 00 00 50 02 20 00 b8 5e 00 00 > /dev/null])
  
  dnl Check the expected nsh encapsulated packet on the egress interface
@@ -65751,7 +65961,7 @@ index f22d86e466..9d1c96bb43 100644
  
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
-@@ -7039,10 +7319,10 @@ dnl p1(at_ns1) interface
+@@ -7039,10 +7367,10 @@ dnl p1(at_ns1) interface
  NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 f2 ff 00 00 00 02 f2 ff 00 00 00 01 89 4f 02 06 01 03 00 00 64 03 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 f2 00 00 00 00 02 f2 00 00 00 00 01 08 00 45 00 00 28 00 01 00 00 40 06 b0 13 c0 a8 00 0a 0a 00 00 0a 04 00 08 00 00 00 00 c8 00 00 00 00 50 02 20 00 b8 5e 00 00 > /dev/null])
  
  dnl Check the expected de-capsulated TCP packet on the egress interface
@@ -65766,7 +65976,7 @@ index f22d86e466..9d1c96bb43 100644
  
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
-@@ -7072,12 +7352,12 @@ dnl p1(at_ns1) interface
+@@ -7072,12 +7400,12 @@ dnl p1(at_ns1) interface
  NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 f2 ff 00 00 00 02 f2 ff 00 00 00 01 89 4f 02 06 01 03 00 01 00 03 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 f2 00 00 00 00 02 f2 00 00 00 00 01 08 00 45 00 00 28 00 01 00 00 40 06 b0 13 c0 a8 00 0a 0a 00 00 0a 04 00 08 00 00 00 00 c8 00 00 00 00 50 02 20 00 b8 5e 00 00 > /dev/null])
  
  dnl Check the expected NSH packet with new fields in the header
@@ -65785,7 +65995,7 @@ index f22d86e466..9d1c96bb43 100644
  
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
-@@ -7106,23 +7386,23 @@ dnl First send packet from at_ns0 --> OVS with SPI=0x100 and SI=2
+@@ -7106,23 +7434,23 @@ dnl First send packet from at_ns0 --> OVS with SPI=0x100 and SI=2
  NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 f2 ff 00 00 00 02 f2 ff 00 00 00 01 89 4f 02 06 01 03 00 01 00 02 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 f2 00 00 00 00 02 f2 00 00 00 00 01 08 00 45 00 00 28 00 01 00 00 40 06 b0 13 c0 a8 00 0a 0a 00 00 0a 04 00 08 00 00 00 00 c8 00 00 00 00 50 02 20 00 b8 5e 00 00 > /dev/null])
  
  dnl Check for the above packet on p1 interface
@@ -67090,6 +67300,37 @@ index fb2025b765..67092ecf7e 100755
          ovs-ofctl dump-tlv-map ${bridge} -O $ofp_version | \
          awk '/^  *0x/ {if (cnt != 0) printf ","; \
               cnt++;printf "{class="$1",type="$2",len="$3"}->"$4}'
+diff --git a/utilities/ovs-sim.in b/utilities/ovs-sim.in
+index 08957bdf46..779ea60aee 100755
+--- a/utilities/ovs-sim.in
++++ b/utilities/ovs-sim.in
+@@ -131,7 +131,7 @@ EOF
+ export -f as
+ 
+ sim_add() {
+-    if test "$1" == --help; then
++    if test "$1" = --help; then
+         cat <<EOF
+ $FUNCNAME: create a new sandboxed Open vSwitch instance
+ usage: $FUNCNAME SANDBOX
+@@ -178,7 +178,7 @@ EOF
+ export -f sim_add
+ 
+ net_add() {
+-    if test "$1" == --help; then
++    if test "$1" = --help; then
+         cat <<EOF
+ $FUNCNAME: create a new interconnection network
+ usage: $FUNCNAME NETWORK
+@@ -198,7 +198,7 @@ EOF
+ export -f net_add
+ 
+ net_attach() {
+-    if test "$1" == --help; then
++    if test "$1" = --help; then
+         cat <<EOF
+ $FUNCNAME: attach the default sandbox to an interconnection network
+ usage: $FUNCNAME NETWORK BRIDGE
 diff --git a/utilities/ovs-tcpdump.in b/utilities/ovs-tcpdump.in
 index 82d1bedfa6..a49ec9f942 100755
 --- a/utilities/ovs-tcpdump.in
diff --git a/SPECS/openvswitch2.17.spec b/SPECS/openvswitch2.17.spec
index 4423ca1..820783f 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: 68%{?dist}
+Release: 69%{?dist}
 
 # Nearly all of openvswitch is ASL 2.0.  The bugtool is LGPLv2+, and the
 # lib/sflow*.[ch] files are SISSL
@@ -743,6 +743,15 @@ exit 0
 %endif
 
 %changelog
+* Fri Jan 06 2023 Open vSwitch CI <ovs-ci@redhat.com> - 2.17.0-69
+- Merging upstream branch-2.17 [RH git: a7b4835415]
+    Commit list:
+    ba62a1eae6 Documentation: Fix links in maintainers.rst.
+    1b76faf8d1 Documentation: Fix links in the DPDK guide on physical ports.
+    e1ee9c32a4 treewide: Don't use non-portable '==' with test command.
+    a7d7c30c48 dpif: Fix tunnel key set for IPv6 tunnels with SLOW_ACTION.
+
+
 * Wed Jan 04 2023 Open vSwitch CI <ovs-ci@redhat.com> - 2.17.0-68
 - Merging upstream branch-2.17 [RH git: ba8ea0794a]
     Commit list: