diff --git a/SOURCES/openvswitch-2.17.0.patch b/SOURCES/openvswitch-2.17.0.patch
index 6b336f3..27f0b65 100644
--- a/SOURCES/openvswitch-2.17.0.patch
+++ b/SOURCES/openvswitch-2.17.0.patch
@@ -1,8 +1,8 @@
diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
-index 6cd38ff3ef..74872753d0 100755
+index 6cd38ff3ef..f5021e1a8f 100755
--- a/.ci/linux-build.sh
+++ b/.ci/linux-build.sh
-@@ -220,7 +220,7 @@ fi
+@@ -220,11 +220,15 @@ fi
if [ "$DPDK" ] || [ "$DPDK_SHARED" ]; then
if [ -z "$DPDK_VER" ]; then
@@ -11,7 +11,15 @@ index 6cd38ff3ef..74872753d0 100755
fi
install_dpdk $DPDK_VER
fi
-@@ -233,7 +233,7 @@ elif [ "$M32" ]; then
+
++if [ "$STD" ]; then
++ CFLAGS_FOR_OVS="${CFLAGS_FOR_OVS} -std=$STD"
++fi
++
+ if [ "$CC" = "clang" ]; then
+ CFLAGS_FOR_OVS="${CFLAGS_FOR_OVS} -Wno-error=unused-command-line-argument"
+ elif [ "$M32" ]; then
+@@ -233,7 +237,7 @@ elif [ "$M32" ]; then
# difference on 'configure' and 'make' stages.
export CC="$CC -m32"
elif [ "$TRAVIS_ARCH" != "aarch64" ]; then
@@ -20,7 +28,7 @@ index 6cd38ff3ef..74872753d0 100755
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
+@@ -244,9 +248,7 @@ fi
if [ "$ASAN" ]; then
# This will override default option configured in tests/atlocal.in.
export ASAN_OPTIONS='detect_leaks=1'
@@ -73,7 +81,7 @@ index a7ae793bc4..c460103bb1 100644
memory: 4G
diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml
-index eac3504e48..6ccab8e908 100644
+index eac3504e48..c923df3ea7 100644
--- a/.github/workflows/build-and-test.yml
+++ b/.github/workflows/build-and-test.yml
@@ -6,7 +6,7 @@ jobs:
@@ -85,7 +93,11 @@ index eac3504e48..6ccab8e908 100644
libssl-dev llvm-dev libelf-dev libnuma-dev libpcap-dev \
ninja-build selinux-policy-dev
deb_dependencies: |
-@@ -25,7 +25,7 @@ jobs:
+@@ -22,10 +22,11 @@ jobs:
+ LIBS: ${{ matrix.libs }}
+ M32: ${{ matrix.m32 }}
+ OPTS: ${{ matrix.opts }}
++ STD: ${{ matrix.std }}
TESTSUITE: ${{ matrix.testsuite }}
name: linux ${{ join(matrix.*, ' ') }}
@@ -94,7 +106,19 @@ index eac3504e48..6ccab8e908 100644
timeout-minutes: 30
strategy:
-@@ -111,7 +111,7 @@ jobs:
+@@ -37,6 +38,11 @@ jobs:
+ - compiler: clang
+ opts: --disable-ssl
+
++ - compiler: gcc
++ std: c99
++ - compiler: clang
++ std: c99
++
+ - compiler: gcc
+ testsuite: test
+ kernel: 3.16
+@@ -111,7 +117,7 @@ jobs:
steps:
- name: checkout
@@ -103,7 +127,7 @@ index eac3504e48..6ccab8e908 100644
- name: update PATH
run: |
-@@ -119,7 +119,7 @@ jobs:
+@@ -119,7 +125,7 @@ jobs:
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: set up python
@@ -112,7 +136,7 @@ index eac3504e48..6ccab8e908 100644
with:
python-version: '3.9'
-@@ -135,7 +135,7 @@ jobs:
+@@ -135,7 +141,7 @@ jobs:
- name: cache
if: matrix.dpdk != '' || matrix.dpdk_shared != ''
@@ -121,7 +145,7 @@ index eac3504e48..6ccab8e908 100644
env:
matrix_key: ${{ matrix.dpdk }}${{ matrix.dpdk_shared }}
ci_key: ${{ hashFiles('dpdk-ci-signature') }}
-@@ -163,7 +163,7 @@ jobs:
+@@ -163,7 +169,7 @@ jobs:
- name: upload deb packages
if: matrix.deb_package != ''
@@ -130,7 +154,7 @@ index eac3504e48..6ccab8e908 100644
with:
name: deb-packages
path: '/home/runner/work/ovs/*.deb'
-@@ -182,7 +182,7 @@ jobs:
+@@ -182,7 +188,7 @@ jobs:
- name: upload logs on failure
if: failure() || cancelled()
@@ -139,7 +163,7 @@ index eac3504e48..6ccab8e908 100644
with:
name: logs-linux-${{ join(matrix.*, '-') }}
path: logs.tgz
-@@ -201,13 +201,13 @@ jobs:
+@@ -201,13 +207,13 @@ jobs:
steps:
- name: checkout
@@ -155,7 +179,7 @@ index eac3504e48..6ccab8e908 100644
with:
python-version: '3.9'
- name: install dependencies
-@@ -218,7 +218,7 @@ jobs:
+@@ -218,7 +224,7 @@ jobs:
run: ./.ci/osx-build.sh
- name: upload logs on failure
if: failure()
@@ -247,10 +271,33 @@ index c4300cd53e..a297aadac8 100644
- GNU make.
diff --git a/Documentation/ref/ovs-actions.7.rst b/Documentation/ref/ovs-actions.7.rst
-index b59b7634fa..d138956556 100644
+index b59b7634fa..36adcc5db2 100644
--- a/Documentation/ref/ovs-actions.7.rst
+++ b/Documentation/ref/ovs-actions.7.rst
-@@ -1380,7 +1380,7 @@ The ``delete_field`` action
+@@ -694,7 +694,8 @@ encapsulated in an OpenFlow ``packet-in`` message. The supported options are:
+ Limit to *max_len* the number of bytes of the packet to send in the
+ ``packet-in.`` A *max_len* of 0 prevents any of the packet from being
+ sent (thus, only metadata is included). By default, the entire packet is
+- sent, equivalent to a *max_len* of 65535.
++ sent, equivalent to a *max_len* of 65535. This option has no effect in
++ Open vSwith 2.7 and later: the entire packet will always be sent.
+
+ ``reason=``\ *reason*
+ Specify *reason* as the reason for sending the message in the
+@@ -733,6 +734,12 @@ encapsulated in an OpenFlow ``packet-in`` message. The supported options are:
+ options require the Open vSwitch ``NXAST_CONTROLLER`` extension action added
+ in Open vSwitch 1.6.
+
++ Open vSwitch 2.7 and later is configured to not buffer packets for the
++ packet-in event. As a result, the full packet is always sent to
++ controllers. This means that the ``max_len`` option has no effect on the
++ ``controller`` action, and all values (even 0) are equivalent to the default
++ value of 65535.
++
+
+ The ``enqueue`` action
+ ----------------------
+@@ -1380,7 +1387,7 @@ The ``delete_field`` action
| ``delete_field:``\ *field*
The ``delete_field`` action deletes a *field* in the syntax described under
@@ -348,6 +395,28 @@ index 27be4aa412..1dc406170f 100644
+ `__
+.. |emeritus-status| replace:: `Emeritus Status for OVS Committers
+ `__
+diff --git a/Makefile.am b/Makefile.am
+index cb8076433e..22227c4957 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -368,7 +368,7 @@ ALL_LOCAL += manpage-check
+ manpage-check: $(man_MANS) $(dist_man_MANS) $(noinst_man_MANS)
+ @error=false; \
+ for manpage in $?; do \
+- LANG=en_US.UTF-8 groff -w mac -w delim -w escape -w input -w missing -w tab -T utf8 -man -p -z $$manpage >$@.tmp 2>&1; \
++ LANG=en_US.UTF-8 groff -t -w mac -w delim -w escape -w input -w missing -w tab -T utf8 -man -p -z $$manpage >$@.tmp 2>&1; \
+ if grep warning: $@.tmp; then error=:; fi; \
+ rm -f $@.tmp; \
+ done; \
+@@ -414,7 +414,7 @@ endif
+ CLEANFILES += flake8-check
+
+ -include manpages.mk
+-manpages.mk: $(MAN_ROOTS) build-aux/sodepends.py python/build/soutil.py
++manpages.mk: $(MAN_ROOTS) build-aux/sodepends.py python/ovs_build_helpers/soutil.py
+ @PYTHONPATH=$$PYTHONPATH$(psep)$(srcdir)/python $(PYTHON3) $(srcdir)/build-aux/sodepends.py -I. -I$(srcdir) $(MAN_ROOTS) >$(@F).tmp
+ @if cmp -s $(@F).tmp $@; then \
+ touch $@; \
diff --git a/NEWS b/NEWS
index c10e9bfacc..673f227202 100644
--- a/NEWS
@@ -531,6 +600,74 @@ index 0c360fd1ef..c981f90bc7 100644
[], [enable_sparse=no])
AM_CONDITIONAL([ENABLE_SPARSE_BY_DEFAULT], [test $enable_sparse = yes])])
+diff --git a/build-aux/extract-ofp-fields b/build-aux/extract-ofp-fields
+index 8766995d9a..9fb4df98ad 100755
+--- a/build-aux/extract-ofp-fields
++++ b/build-aux/extract-ofp-fields
+@@ -5,7 +5,8 @@ import sys
+ import os.path
+ import re
+ import xml.dom.minidom
+-import build.nroff
++
++from ovs_build_helpers import nroff
+
+ line = ""
+
+@@ -578,7 +579,7 @@ def field_to_xml(field_node, f, body, summary):
+ body += [""".PP
+ \\fB%s Field\\fR
+ .TS
+-tab(;);
++tab(;),nowarn;
+ l lx.
+ """ % title]
+
+@@ -636,7 +637,7 @@ l lx.
+ body += [".TE\n"]
+
+ body += ['.PP\n']
+- body += [build.nroff.block_xml_to_nroff(field_node.childNodes)]
++ body += [nroff.block_xml_to_nroff(field_node.childNodes)]
+
+ def group_xml_to_nroff(group_node, fields):
+ title = group_node.attributes['title'].nodeValue
+@@ -648,14 +649,14 @@ def group_xml_to_nroff(group_node, fields):
+ id_ = node.attributes['id'].nodeValue
+ field_to_xml(node, fields[id_], body, summary)
+ else:
+- body += [build.nroff.block_xml_to_nroff([node])]
++ body += [nroff.block_xml_to_nroff([node])]
+
+ content = [
+ '.bp\n',
+- '.SH \"%s\"\n' % build.nroff.text_to_nroff(title.upper() + " FIELDS"),
++ '.SH \"%s\"\n' % nroff.text_to_nroff(title.upper() + " FIELDS"),
+ '.SS "Summary:"\n',
+ '.TS\n',
+- 'tab(;);\n',
++ 'tab(;),nowarn;\n',
+ 'l l l l l l l.\n',
+ 'Name;Bytes;Mask;RW?;Prereqs;NXM/OXM Support\n',
+ '\_;\_;\_;\_;\_;\_\n']
+@@ -665,7 +666,7 @@ def group_xml_to_nroff(group_node, fields):
+ return ''.join(content)
+
+ def make_oxm_classes_xml(document):
+- s = '''tab(;);
++ s = '''tab(;),nowarn;
+ l l l.
+ Prefix;Vendor;Class
+ \_;\_;\_
+@@ -753,7 +754,7 @@ ovs\-fields \- protocol header fields in OpenFlow and Open vSwitch
+ elif node.nodeType == node.COMMENT_NODE:
+ pass
+ else:
+- s += build.nroff.block_xml_to_nroff([node])
++ s += nroff.block_xml_to_nroff([node])
+
+ for f in fields:
+ if "used" not in f:
diff --git a/build-aux/generate-dhparams-c b/build-aux/generate-dhparams-c
index 1884c99e1f..aca1dbca91 100755
--- a/build-aux/generate-dhparams-c
@@ -633,6 +770,74 @@ index 1884c99e1f..aca1dbca91 100755
+dhparam_to_c lib/dh2048.pem
+dhparam_to_c lib/dh4096.pem
+echo "#endif"
+diff --git a/build-aux/sodepends.py b/build-aux/sodepends.py
+index 45812bcbd7..ac8dd61a4b 100755
+--- a/build-aux/sodepends.py
++++ b/build-aux/sodepends.py
+@@ -14,9 +14,10 @@
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+
+-from build import soutil
+ import sys
+
++from ovs_build_helpers import soutil
++
+
+ def sodepends(include_dirs, filenames, dst):
+ ok = True
+diff --git a/build-aux/soexpand.py b/build-aux/soexpand.py
+index 00adcf47a3..7d4dc0486a 100755
+--- a/build-aux/soexpand.py
++++ b/build-aux/soexpand.py
+@@ -14,9 +14,10 @@
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+
+-from build import soutil
+ import sys
+
++from ovs_build_helpers import soutil
++
+
+ def soexpand(include_dirs, src, dst):
+ ok = True
+diff --git a/build-aux/xml2nroff b/build-aux/xml2nroff
+index ee5553f456..3e937910be 100755
+--- a/build-aux/xml2nroff
++++ b/build-aux/xml2nroff
+@@ -18,7 +18,7 @@ import getopt
+ import sys
+ import xml.dom.minidom
+
+-import build.nroff
++from ovs_build_helpers import nroff
+
+ argv0 = sys.argv[0]
+
+@@ -90,10 +90,10 @@ def manpage_to_nroff(xml_file, subst, include_path, version=None):
+ . I "\\$1"
+ . RE
+ ..
+-''' % (build.nroff.text_to_nroff(program), build.nroff.text_to_nroff(section),
+- build.nroff.text_to_nroff(title), build.nroff.text_to_nroff(version))
++''' % (nroff.text_to_nroff(program), nroff.text_to_nroff(section),
++ nroff.text_to_nroff(title), nroff.text_to_nroff(version))
+
+- s += build.nroff.block_xml_to_nroff(doc.childNodes) + "\n"
++ s += nroff.block_xml_to_nroff(doc.childNodes) + "\n"
+
+ return s
+
+@@ -139,7 +139,7 @@ if __name__ == "__main__":
+
+ try:
+ s = manpage_to_nroff(args[0], subst, include_path, version)
+- except build.nroff.error.Error as e:
++ except nroff.error.Error as e:
+ sys.stderr.write("%s: %s\n" % (argv0, e.msg))
+ sys.exit(1)
+ for line in s.splitlines():
diff --git a/configure.ac b/configure.ac
index 4e9bcce272..134106f54a 100644
--- a/configure.ac
@@ -50266,6 +50471,27 @@ index 0000000000..6fae6f727c
+
+#endif /* __KERNEL__ || !HAVE_TCA_STATS_PKT64 */
+#endif /* __LINUX_GEN_STATS_WRAPPER_H */
+diff --git a/include/openvswitch/compiler.h b/include/openvswitch/compiler.h
+index cf009f8264..52614a5ac0 100644
+--- a/include/openvswitch/compiler.h
++++ b/include/openvswitch/compiler.h
+@@ -37,6 +37,16 @@
+ #define OVS_NO_RETURN
+ #endif
+
++#ifndef typeof
++#define typeof __typeof__
++#endif
++
++#ifndef __cplusplus
++#ifndef asm
++#define asm __asm__
++#endif
++#endif
++
+ #if __GNUC__ && !__CHECKER__
+ #define OVS_UNUSED __attribute__((__unused__))
+ #define OVS_PRINTF_FORMAT(FMT, ARG1) __attribute__((__format__(printf, FMT, ARG1)))
diff --git a/include/openvswitch/dynamic-string.h b/include/openvswitch/dynamic-string.h
index ee18217107..1c262b0494 100644
--- a/include/openvswitch/dynamic-string.h
@@ -50939,7 +51165,7 @@ index a8b0705d9f..631a8fca80 100755
"""Remove all OVS IPsec related state from the NSS database"""
try:
diff --git a/lib/automake.mk b/lib/automake.mk
-index a23cdc4ade..e9a5978e88 100644
+index a23cdc4ade..3c4a58ed9c 100644
--- a/lib/automake.mk
+++ b/lib/automake.mk
@@ -38,8 +38,6 @@ lib_libopenvswitchavx512_la_CFLAGS = \
@@ -50960,6 +51186,15 @@ index a23cdc4ade..e9a5978e88 100644
lib/crc32c.c \
lib/crc32c.h \
lib/csum.c \
+@@ -437,7 +437,7 @@ lib_libsflow_la_SOURCES = \
+ lib/sflow_poller.c \
+ lib/sflow_receiver.c
+ lib_libsflow_la_CPPFLAGS = $(AM_CPPFLAGS)
+-lib_libsflow_la_CFLAGS = $(AM_CFLAGS)
++lib_libsflow_la_CFLAGS = $(AM_CFLAGS) -D_BSD_SOURCE -D_DEFAULT_SOURCE
+ if HAVE_WNO_UNUSED
+ lib_libsflow_la_CFLAGS += -Wno-unused
+ endif
diff --git a/lib/cfm.c b/lib/cfm.c
index cc43e70e31..c3742f3de2 100644
--- a/lib/cfm.c
@@ -52198,7 +52433,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..5b0047f5c7 100644
+index 9f35713ef5..f1895aae36 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -93,7 +93,8 @@ VLOG_DEFINE_THIS_MODULE(dpif_netdev);
@@ -52253,7 +52488,7 @@ index 9f35713ef5..5b0047f5c7 100644
item->timestamp = pmd->ctx.now;
dp_netdev_offload_flow_enqueue(item);
-@@ -3335,6 +3335,28 @@ netdev_flow_key_init_masked(struct netdev_flow_key *dst,
+@@ -3335,6 +3335,27 @@ netdev_flow_key_init_masked(struct netdev_flow_key *dst,
(dst_u64 - miniflow_get_values(&dst->mf)) * 8);
}
@@ -52262,14 +52497,13 @@ index 9f35713ef5..5b0047f5c7 100644
+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);
++ size_t n = miniflow_n_values(&key->mf);
+
+ FLOW_FOR_EACH_IN_MAPS (value, flow, key->mf.map) {
+ hash = hash_add64(hash, value);
@@ -52282,7 +52516,7 @@ index 9f35713ef5..5b0047f5c7 100644
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,
+@@ -4095,6 +4116,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd,
flow->dead = false;
flow->batch = NULL;
flow->mark = INVALID_FLOW_MARK;
@@ -52290,7 +52524,7 @@ index 9f35713ef5..5b0047f5c7 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 +4152,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd,
+@@ -4129,7 +4151,7 @@ dp_netdev_flow_add(struct dp_netdev_pmd_thread *pmd,
}
queue_netdev_flow_put(pmd, flow, match, actions, actions_len,
@@ -52299,7 +52533,7 @@ index 9f35713ef5..5b0047f5c7 100644
log_netdev_flow_change(flow, match, NULL, actions, actions_len);
return flow;
-@@ -4143,7 +4166,7 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd,
+@@ -4143,7 +4165,7 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd,
const struct dpif_flow_put *put,
struct dpif_flow_stats *stats)
{
@@ -52308,7 +52542,7 @@ index 9f35713ef5..5b0047f5c7 100644
int error = 0;
if (stats) {
-@@ -4151,16 +4174,35 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd,
+@@ -4151,16 +4173,35 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd,
}
ovs_mutex_lock(&pmd->flow_mutex);
@@ -52352,7 +52586,7 @@ index 9f35713ef5..5b0047f5c7 100644
struct dp_netdev_actions *new_actions;
struct dp_netdev_actions *old_actions;
-@@ -4171,7 +4213,7 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd,
+@@ -4171,7 +4212,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,
@@ -52361,7 +52595,7 @@ index 9f35713ef5..5b0047f5c7 100644
DP_NETDEV_FLOW_OFFLOAD_OP_MOD);
log_netdev_flow_change(netdev_flow, match, old_actions,
put->actions, put->actions_len);
-@@ -4191,15 +4233,11 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd,
+@@ -4191,15 +4232,11 @@ flow_put_on_pmd(struct dp_netdev_pmd_thread *pmd,
* counter, and subtracting it before outputting the stats */
error = EOPNOTSUPP;
}
@@ -52379,7 +52613,7 @@ index 9f35713ef5..5b0047f5c7 100644
ovs_mutex_unlock(&pmd->flow_mutex);
return error;
}
-@@ -4208,7 +4246,7 @@ static int
+@@ -4208,7 +4245,7 @@ static int
dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put)
{
struct dp_netdev *dp = get_dp_netdev(dpif);
@@ -52388,7 +52622,7 @@ index 9f35713ef5..5b0047f5c7 100644
struct dp_netdev_pmd_thread *pmd;
struct match match;
ovs_u128 ufid;
-@@ -4257,9 +4295,12 @@ dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put)
+@@ -4257,9 +4294,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
@@ -52404,7 +52638,7 @@ index 9f35713ef5..5b0047f5c7 100644
if (put->pmd_id == PMD_ID_NULL) {
if (cmap_count(&dp->poll_threads) == 0) {
-@@ -4778,8 +4819,8 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
+@@ -4778,8 +4818,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;
@@ -52415,7 +52649,7 @@ index 9f35713ef5..5b0047f5c7 100644
bool log_autolb = false;
enum sched_assignment_type pmd_rxq_assign_type;
-@@ -4880,8 +4921,12 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
+@@ -4880,8 +4920,12 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
struct pmd_auto_lb *pmd_alb = &dp->pmd_alb;
@@ -52430,7 +52664,7 @@ index 9f35713ef5..5b0047f5c7 100644
/* Input is in min, convert it to msec. */
rebalance_intvl =
-@@ -4894,21 +4939,21 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
+@@ -4894,21 +4938,21 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
log_autolb = true;
}
@@ -52458,7 +52692,7 @@ index 9f35713ef5..5b0047f5c7 100644
if (rebalance_load > 100) {
rebalance_load = ALB_LOAD_THRESHOLD;
}
-@@ -4916,7 +4961,7 @@ dpif_netdev_set_config(struct dpif *dpif, const struct smap *other_config)
+@@ -4916,7 +4960,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);
@@ -52467,7 +52701,7 @@ index 9f35713ef5..5b0047f5c7 100644
rebalance_load);
log_autolb = true;
}
-@@ -5425,7 +5470,6 @@ port_reconfigure(struct dp_netdev_port *port)
+@@ -5425,7 +5469,6 @@ port_reconfigure(struct dp_netdev_port *port)
port->rxqs[i].port = port;
port->rxqs[i].is_vhost = !strncmp(port->type, "dpdkvhost", 9);
@@ -52475,7 +52709,7 @@ index 9f35713ef5..5b0047f5c7 100644
err = netdev_rxq_open(netdev, &port->rxqs[i].rx, i);
if (err) {
-@@ -5684,23 +5728,28 @@ sched_numa_list_put_in_place(struct sched_numa_list *numa_list)
+@@ -5684,23 +5727,28 @@ sched_numa_list_put_in_place(struct sched_numa_list *numa_list)
}
}
@@ -52509,7 +52743,7 @@ index 9f35713ef5..5b0047f5c7 100644
rxq->pmd->numa_id !=
netdev_get_numa_id(rxq->port->netdev)) {
return true;
-@@ -6000,10 +6049,10 @@ sched_numa_list_schedule(struct sched_numa_list *numa_list,
+@@ -6000,10 +6048,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);
@@ -52521,7 +52755,7 @@ index 9f35713ef5..5b0047f5c7 100644
numa = NULL;
}
}
-@@ -6111,7 +6160,7 @@ sched_numa_list_variance(struct sched_numa_list *numa_list)
+@@ -6111,7 +6159,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
@@ -52530,7 +52764,7 @@ index 9f35713ef5..5b0047f5c7 100644
OVS_REQ_RDLOCK(dp->port_rwlock)
{
struct dp_netdev_pmd_thread *pmd;
-@@ -6342,11 +6391,11 @@ pmd_remove_stale_ports(struct dp_netdev *dp,
+@@ -6342,11 +6390,11 @@ pmd_remove_stale_ports(struct dp_netdev *dp,
OVS_EXCLUDED(pmd->port_mutex)
OVS_REQ_RDLOCK(dp->port_rwlock)
{
@@ -52545,7 +52779,7 @@ index 9f35713ef5..5b0047f5c7 100644
struct dp_netdev_port *port = poll->rxq->port;
if (port->need_reconfigure
-@@ -6354,7 +6403,7 @@ pmd_remove_stale_ports(struct dp_netdev *dp,
+@@ -6354,7 +6402,7 @@ pmd_remove_stale_ports(struct dp_netdev *dp,
dp_netdev_del_rxq_from_pmd(pmd, poll);
}
}
@@ -52554,7 +52788,7 @@ index 9f35713ef5..5b0047f5c7 100644
struct dp_netdev_port *port = tx->port;
if (port->need_reconfigure
-@@ -6430,8 +6479,7 @@ reconfigure_datapath(struct dp_netdev *dp)
+@@ -6430,8 +6478,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. */
@@ -52564,7 +52798,7 @@ index 9f35713ef5..5b0047f5c7 100644
int err;
if (!port->need_reconfigure) {
-@@ -6487,10 +6535,10 @@ reconfigure_datapath(struct dp_netdev *dp)
+@@ -6487,10 +6534,10 @@ reconfigure_datapath(struct dp_netdev *dp)
}
CMAP_FOR_EACH (pmd, node, &dp->poll_threads) {
@@ -52577,7 +52811,7 @@ index 9f35713ef5..5b0047f5c7 100644
if (poll->rxq->pmd != pmd) {
dp_netdev_del_rxq_from_pmd(pmd, poll);
-@@ -6682,7 +6730,7 @@ dpif_netdev_run(struct dpif *dpif)
+@@ -6682,7 +6729,7 @@ dpif_netdev_run(struct dpif *dpif)
if (pmd_rebalance &&
!dp_netdev_is_reconf_required(dp) &&
!ports_require_restart(dp) &&
@@ -52586,7 +52820,7 @@ index 9f35713ef5..5b0047f5c7 100644
pmd_rebalance_dry_run(dp)) {
VLOG_INFO("PMD auto load balance dry run. "
"Requesting datapath reconfigure.");
-@@ -7364,15 +7412,15 @@ static struct dp_netdev_pmd_thread *
+@@ -7364,15 +7411,15 @@ static struct dp_netdev_pmd_thread *
dp_netdev_get_pmd(struct dp_netdev *dp, unsigned core_id)
{
struct dp_netdev_pmd_thread *pmd;
@@ -52608,7 +52842,7 @@ index 9f35713ef5..5b0047f5c7 100644
}
/* Sets the 'struct dp_netdev_pmd_thread' for non-pmd threads. */
-@@ -7505,6 +7553,7 @@ dp_netdev_destroy_pmd(struct dp_netdev_pmd_thread *pmd)
+@@ -7505,6 +7552,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);
@@ -52616,7 +52850,7 @@ index 9f35713ef5..5b0047f5c7 100644
free(pmd);
}
-@@ -8020,17 +8069,15 @@ dp_netdev_hw_flow(const struct dp_netdev_pmd_thread *pmd,
+@@ -8020,17 +8068,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;
@@ -52641,7 +52875,7 @@ index 9f35713ef5..5b0047f5c7 100644
}
}
#endif
-@@ -9495,6 +9542,7 @@ dpif_netdev_bond_stats_get(struct dpif *dpif, uint32_t bond_id,
+@@ -9495,6 +9541,7 @@ dpif_netdev_bond_stats_get(struct dpif *dpif, uint32_t bond_id,
const struct dpif_class dpif_netdev_class = {
"netdev",
true, /* cleanup_required */
@@ -53901,10 +54135,49 @@ index e03cd8d0c5..474344194f 100644
+ }
+}
diff --git a/lib/meta-flow.xml b/lib/meta-flow.xml
-index 28865f88c8..ff81fddc5e 100644
+index 28865f88c8..67788baf25 100644
--- a/lib/meta-flow.xml
+++ b/lib/meta-flow.xml
-@@ -4303,9 +4303,9 @@ r r c c c.
+@@ -3517,23 +3517,24 @@ actions=clone(load:0->NXM_OF_IN_PORT[],output:123)
+
+
+
++tab(;);
+ r r r r r.
+-Criteria OpenFlow 1.0 OpenFlow 1.1 OpenFlow 1.2+ NXM
+-\_ \_ \_ \_ \_
+-[1] \fL????\fR/\fL1\fR,\fL??\fR/\fL?\fR \fL????\fR/\fL1\fR,\fL??\fR/\fL?\fR \fL0000\fR/\fL0000\fR,\fL--\fR \fL0000\fR/\fL0000\fR
+-[2] \fLffff\fR/\fL0\fR,\fL??\fR/\fL?\fR \fLffff\fR/\fL0\fR,\fL??\fR/\fL?\fR \fL0000\fR/\fLffff\fR,\fL--\fR \fL0000\fR/\fLffff\fR
+-[3] \fL0xxx\fR/\fL0\fR,\fL??\fR/\fL1\fR \fL0xxx\fR/\fL0\fR,\fL??\fR/\fL1\fR \fL1xxx\fR/\fLffff\fR,\fL--\fR \fL1xxx\fR/\fL1fff\fR
+-[4] \fL????\fR/\fL1\fR,\fL0y\fR/\fL0\fR \fLfffe\fR/\fL0\fR,\fL0y\fR/\fL0\fR \fL1000\fR/\fL1000\fR,\fL0y\fR \fLz000\fR/\fLf000\fR
+-[5] \fL0xxx\fR/\fL0\fR,\fL0y\fR/\fL0\fR \fL0xxx\fR/\fL0\fR,\fL0y\fR/\fL0\fR \fL1xxx\fR/\fLffff\fR,\fL0y\fR \fLzxxx\fR/\fLffff\fR
++Criteria;OpenFlow 1.0;OpenFlow 1.1;OpenFlow 1.2+;NXM
++\_;\_;\_;\_;\_
++[1];\fL????\fR/\fL1\fR,\fL??\fR/\fL?\fR;\fL????\fR/\fL1\fR,\fL??\fR/\fL?\fR;\fL0000\fR/\fL0000\fR,\fL--\fR;\fL0000\fR/\fL0000\fR
++[2];\fLffff\fR/\fL0\fR,\fL??\fR/\fL?\fR;\fLffff\fR/\fL0\fR,\fL??\fR/\fL?\fR;\fL0000\fR/\fLffff\fR,\fL--\fR;\fL0000\fR/\fLffff\fR
++[3];\fL0xxx\fR/\fL0\fR,\fL??\fR/\fL1\fR;\fL0xxx\fR/\fL0\fR,\fL??\fR/\fL1\fR;\fL1xxx\fR/\fLffff\fR,\fL--\fR;\fL1xxx\fR/\fL1fff\fR
++[4];\fL????\fR/\fL1\fR,\fL0y\fR/\fL0\fR;\fLfffe\fR/\fL0\fR,\fL0y\fR/\fL0\fR;\fL1000\fR/\fL1000\fR,\fL0y\fR;\fLz000\fR/\fLf000\fR
++[5];\fL0xxx\fR/\fL0\fR,\fL0y\fR/\fL0\fR;\fL0xxx\fR/\fL0\fR,\fL0y\fR/\fL0\fR;\fL1xxx\fR/\fLffff\fR,\fL0y\fR;\fLzxxx\fR/\fLffff\fR
+ .T&
+-r r c c r.
+-[6] (none) (none) \fL1001\fR/\fL1001\fR,\fL--\fR \fL1001\fR/\fL1001\fR
++r c c r r.
++[6];(none);(none);\fL1001\fR/\fL1001\fR,\fL--\fR;\fL1001\fR/\fL1001\fR
+ .T&
+-r r c c c.
+-[7] (none) (none) (none) \fL3000\fR/\fL3000\fR
+-[8] (none) (none) (none) \fL0000\fR/\fL0fff\fR
+-[9] (none) (none) (none) \fL0000\fR/\fLf000\fR
+-[10] (none) (none) (none) \fL0000\fR/\fLefff\fR
++r c c c r.
++[7];(none);(none);(none);\fL3000\fR/\fL3000\fR
++[8];(none);(none);(none);\fL0000\fR/\fL0fff\fR
++[9];(none);(none);(none);\fL0000\fR/\fLf000\fR
++[10];(none);(none);(none);\fL0000\fR/\fLefff\fR
+
+
+
+@@ -4303,9 +4304,9 @@ r r c c c.
@@ -63410,6 +63683,19 @@ index 0f222cc992..952fa902e4 100644
ovsdb_jsonrpc_monitor_destroy(jm->jsonrpc_monitor, true);
}
}
+diff --git a/ovsdb/ovsdb-doc b/ovsdb/ovsdb-doc
+index 10d0c0c134..099770d253 100755
+--- a/ovsdb/ovsdb-doc
++++ b/ovsdb/ovsdb-doc
+@@ -24,7 +24,7 @@ import ovs.json
+ from ovs.db import error
+ import ovs.db.schema
+
+-from build.nroff import *
++from ovs_build_helpers.nroff import *
+
+ argv0 = sys.argv[0]
+
diff --git a/ovsdb/ovsdb-idlc.in b/ovsdb/ovsdb-idlc.in
index 10a70ae26f..13c5359395 100755
--- a/ovsdb/ovsdb-idlc.in
@@ -64837,6 +65123,57 @@ index 726c138bf0..3a693855b9 100644
json_destroy(txn_json);
t->reply = jsonrpc_create_reply(json_object_create(),
t->request->id);
+diff --git a/python/automake.mk b/python/automake.mk
+index 767512f175..3c369e03b8 100644
+--- a/python/automake.mk
++++ b/python/automake.mk
+@@ -45,9 +45,9 @@ ovs_pyfiles = \
+ # These python files are used at build time but not runtime,
+ # so they are not installed.
+ EXTRA_DIST += \
+- python/build/__init__.py \
+- python/build/nroff.py \
+- python/build/soutil.py
++ python/ovs_build_helpers/__init__.py \
++ python/ovs_build_helpers/nroff.py \
++ python/ovs_build_helpers/soutil.py
+
+ # PyPI support.
+ EXTRA_DIST += \
+@@ -64,10 +64,11 @@ PYCOV_CLEAN_FILES += $(PYFILES:.py=.py,cover)
+
+ FLAKE8_PYFILES += \
+ $(filter-out python/ovs/compat/% python/ovs/dirs.py,$(PYFILES)) \
+- python/setup.py \
+- python/build/__init__.py \
+- python/build/nroff.py \
+- python/ovs/dirs.py.template
++ python/ovs_build_helpers/__init__.py \
++ python/ovs_build_helpers/nroff.py \
++ python/ovs_build_helpers/soutil.py \
++ python/ovs/dirs.py.template \
++ python/setup.py
+
+ nobase_pkgdata_DATA = $(ovs_pyfiles) $(ovstest_pyfiles)
+ ovs-install-data-local:
+@@ -86,11 +87,14 @@ ovs-install-data-local:
+ $(INSTALL_DATA) python/ovs/dirs.py.tmp $(DESTDIR)$(pkgdatadir)/python/ovs/dirs.py
+ rm python/ovs/dirs.py.tmp
+
++.PHONY: python-sdist
+ python-sdist: $(srcdir)/python/ovs/version.py $(ovs_pyfiles) python/ovs/dirs.py
+- (cd python/ && $(PYTHON3) setup.py sdist)
++ cd python/ && $(PYTHON3) -m build --sdist
++
++.PHONY: pypi-upload
++pypi-upload: python-sdist
++ twine upload python/dist/ovs-$(VERSION).tar.gz
+
+-pypi-upload: $(srcdir)/python/ovs/version.py $(ovs_pyfiles) python/ovs/dirs.py
+- (cd python/ && $(PYTHON3) setup.py sdist upload)
+ install-data-local: ovs-install-data-local
+
+ UNINSTALL_LOCAL += ovs-uninstall-local
diff --git a/python/ovs/_json.c b/python/ovs/_json.c
index ef7bb4b8ee..c36a140a8e 100644
--- a/python/ovs/_json.c
@@ -65353,6 +65690,18 @@ index ac5b0fd0c6..b32341076c 100644
return ovs.socket_util.get_exception_errno(e)
return 0
+diff --git a/python/build/__init__.py b/python/ovs_build_helpers/__init__.py
+similarity index 100%
+rename from python/build/__init__.py
+rename to python/ovs_build_helpers/__init__.py
+diff --git a/python/build/nroff.py b/python/ovs_build_helpers/nroff.py
+similarity index 100%
+rename from python/build/nroff.py
+rename to python/ovs_build_helpers/nroff.py
+diff --git a/python/build/soutil.py b/python/ovs_build_helpers/soutil.py
+similarity index 100%
+rename from python/build/soutil.py
+rename to python/ovs_build_helpers/soutil.py
diff --git a/python/setup.py b/python/setup.py
index cfe01763f3..36ced65089 100644
--- a/python/setup.py
@@ -65487,6 +65836,18 @@ index 220e5c7472..8ee8a99c22 100644
/usr/share/openvswitch/vswitch.ovsschema
/usr/share/openvswitch/vtep.ovsschema
%doc NOTICE README.rst NEWS rhel/README.RHEL.rst
+diff --git a/tests/.gitignore b/tests/.gitignore
+index a3d927e5d5..4c52fb2534 100644
+--- a/tests/.gitignore
++++ b/tests/.gitignore
+@@ -3,6 +3,7 @@
+ /Makefile.in
+ /atconfig
+ /atlocal
++/clang-analyzer-results/
+ /idltest.c
+ /idltest.h
+ /idltest.ovsidl
diff --git a/tests/alb.at b/tests/alb.at
index 2bef06f39c..922185d61d 100644
--- a/tests/alb.at
@@ -72037,6 +72398,28 @@ index f639ba53a2..53c86ef2fd 100644
+[
+ AT_SKIP_IF([:])
+])
+diff --git a/tests/test-barrier.c b/tests/test-barrier.c
+index 3bc5291cc1..fb0ab0e695 100644
+--- a/tests/test-barrier.c
++++ b/tests/test-barrier.c
+@@ -14,13 +14,13 @@
+ * limitations under the License.
+ */
+
+-#include
+-
+ #include
++#undef NDEBUG
++#include
+
+-#include "ovs-thread.h"
+-#include "ovs-rcu.h"
+ #include "ovstest.h"
++#include "ovs-rcu.h"
++#include "ovs-thread.h"
+ #include "random.h"
+ #include "util.h"
+
diff --git a/tests/test-cmap.c b/tests/test-cmap.c
index 0705475606..588a5dea63 100644
--- a/tests/test-cmap.c
@@ -72226,6 +72609,25 @@ index 9259b0b3fc..e50c7c3807 100644
hmap_destroy(&hmap);
}
+diff --git a/tests/test-id-fpool.c b/tests/test-id-fpool.c
+index 25275d9aef..27800aa9ba 100644
+--- a/tests/test-id-fpool.c
++++ b/tests/test-id-fpool.c
+@@ -14,12 +14,12 @@
+ * limitations under the License.
+ */
+
++#include
+ #undef NDEBUG
+ #include
+ #include
+ #include
+-
+-#include
++#include
+
+ #include "command-line.h"
+ #include "id-fpool.h"
diff --git a/tests/test-json.c b/tests/test-json.c
index 072a537252..fa51bb31c5 100644
--- a/tests/test-json.c
@@ -72481,6 +72883,25 @@ index 6f1fb059bc..ac82f2048e 100644
}
}
}
+diff --git a/tests/test-mpsc-queue.c b/tests/test-mpsc-queue.c
+index a38bf9e6df..16aa804a03 100644
+--- a/tests/test-mpsc-queue.c
++++ b/tests/test-mpsc-queue.c
+@@ -14,12 +14,12 @@
+ * limitations under the License.
+ */
+
++#include
+ #undef NDEBUG
+ #include
+ #include
+ #include
+-
+-#include
++#include
+
+ #include "command-line.h"
+ #include "guarded-list.h"
diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c
index ca4e87b811..cd1c31a6c2 100644
--- a/tests/test-ovsdb.c
diff --git a/SPECS/openvswitch2.17.spec b/SPECS/openvswitch2.17.spec
index 8990a65..ac03700 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: 103%{?dist}
+Release: 104%{?dist}
# Nearly all of openvswitch is ASL 2.0. The bugtool is LGPLv2+, and the
# lib/sflow*.[ch] files are SISSL
@@ -751,6 +751,24 @@ exit 0
%endif
%changelog
+* Fri Aug 25 2023 Open vSwitch CI - 2.17.0-104
+- Merging upstream branch-2.17 [RH git: 46e94d6a61]
+ Commit list:
+ 123b7aaa7c python: Use build to generate PEP517 compatible archives.
+ 41d2e7e9a8 python: Use twine to upload sdist package to pypi.org.
+ 66d5562e30 python: Rename build related code to ovs_build_helpers.
+ c880faea8e dpif-netdev: Fix length calculation of netdet_flow_key.
+ 8c7aa5f589 doc: Fix description of max_len for controller action.
+ 34ff03c3cb docs: Fix rendering of VLAN Comparison Chart.
+ 93412e00e7 docs: Run tbl preprocessor in manpage-check rule.
+ 6929485d31 docs: Add `nowarn` region option to tables.
+ 08b6b83a36 tests: Add clang-analyzer-results to gitignore.
+ c252b1f8a7 ci: Add jobs to test -std=c99 builds.
+ 242bb2624c tests: Fix order of includes in barrier/id-fpool/mpsc-queue tests.
+ 292eca58c6 sflow: Always enable _BSD_SOURCE.
+ 82aa3fb019 compiler.h: Don't use asm and typeof with non-GNU compilers.
+
+
* Thu Aug 17 2023 Open vSwitch CI - 2.17.0-103
- Merging upstream branch-2.17 [RH git: 04750e9ad1]
Commit list: