]> git.proxmox.com Git - mirror_ovs.git/blame - acinclude.m4
ovsdb-doc: Add build dependency on dirs.py.
[mirror_ovs.git] / acinclude.m4
CommitLineData
064af421
BP
1# -*- autoconf -*-
2
0cdd5b13 3# Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2019 Nicira, Inc.
064af421 4#
a14bc59f
BP
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at:
064af421 8#
a14bc59f
BP
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
064af421 16
e90e115a
HH
17dnl Set OVS DPCLS Autovalidator as default subtable search at compile time?
18dnl This enables automatically running all unit tests with all DPCLS
19dnl implementations.
20AC_DEFUN([OVS_CHECK_DPCLS_AUTOVALIDATOR], [
21 AC_ARG_ENABLE([autovalidator],
22 [AC_HELP_STRING([--enable-autovalidator], [Enable DPCLS autovalidator as default subtable search implementation.])],
23 [autovalidator=yes],[autovalidator=no])
24 AC_MSG_CHECKING([whether DPCLS Autovalidator is default implementation])
25 if test "$autovalidator" != yes; then
26 AC_MSG_RESULT([no])
27 else
28 OVS_CFLAGS="$OVS_CFLAGS -DDPCLS_AUTOVALIDATOR_DEFAULT"
29 AC_MSG_RESULT([yes])
30 fi
31])
32
a64e37a1
BP
33dnl OVS_ENABLE_WERROR
34AC_DEFUN([OVS_ENABLE_WERROR],
35 [AC_ARG_ENABLE(
36 [Werror],
37 [AC_HELP_STRING([--enable-Werror], [Add -Werror to CFLAGS])],
38 [], [enable_Werror=no])
39 AC_CONFIG_COMMANDS_PRE(
40 [if test "X$enable_Werror" = Xyes; then
95626395 41 OVS_CFLAGS="$OVS_CFLAGS -Werror"
308bf988
BP
42 fi])
43
44 # Unless --enable-Werror is specified, report but do not fail the build
45 # for errors reported by flake8.
46 if test "X$enable_Werror" = Xyes; then
47 FLAKE8_WERROR=
48 else
49 FLAKE8_WERROR=-
50 fi
df265086
BP
51 AC_SUBST([FLAKE8_WERROR])
52
53 # If --enable-Werror is specified, fail the build on sparse warnings.
54 if test "X$enable_Werror" = Xyes; then
55 SPARSE_WERROR=-Wsparse-error
56 else
57 SPARSE_WERROR=
58 fi
59 AC_SUBST([SPARSE_WERROR])])
a64e37a1 60
e3438006 61dnl OVS_CHECK_LINUX
064af421 62dnl
997d327d 63dnl Configure linux kernel source tree
e3438006 64AC_DEFUN([OVS_CHECK_LINUX], [
8a2d6596
BP
65 AC_ARG_WITH([linux],
66 [AC_HELP_STRING([--with-linux=/path/to/linux],
67 [Specify the Linux kernel build directory])])
68 AC_ARG_WITH([linux-source],
69 [AC_HELP_STRING([--with-linux-source=/path/to/linux-source],
70 [Specify the Linux kernel source directory
a0903134
YT
71 (usually figured out automatically from build
72 directory)])])
8a2d6596
BP
73
74 # Deprecated equivalents to --with-linux, --with-linux-source.
75 AC_ARG_WITH([l26])
76 AC_ARG_WITH([l26-source])
77
78 if test X"$with_linux" != X; then
79 KBUILD=$with_linux
24ce0afe 80 AC_MSG_WARN([--with-linux is deprecated and kernel support is limited to 5.8 and below])
8a2d6596
BP
81 elif test X"$with_l26" != X; then
82 KBUILD=$with_l26
83 AC_MSG_WARN([--with-l26 is deprecated, please use --with-linux instead])
84 else
85 KBUILD=
86 fi
87
88 if test X"$KBUILD" != X; then
89 if test X"$with_linux_source" != X; then
90 KSRC=$with_linux_source
91 elif test X"$with_l26_source" != X; then
92 KSRC=$with_l26_source
93 AC_MSG_WARN([--with-l26-source is deprecated, please use --with-linux-source instead])
0a89c170
BP
94 else
95 KSRC=
8a2d6596
BP
96 fi
97 elif test X"$with_linux_source" != X || test X"$with_l26_source" != X; then
98 AC_MSG_ERROR([Linux source directory may not be specified without Linux build directory])
99 fi
100
e3438006
BP
101 if test -n "$KBUILD"; then
102 KBUILD=`eval echo "$KBUILD"`
103 case $KBUILD in
0b6d72fc 104 /*) ;;
e3438006 105 *) KBUILD=`pwd`/$KBUILD ;;
0b6d72fc 106 esac
064af421 107
7c9e113b
BP
108 # The build directory is what the user provided.
109 # Make sure that it exists.
8a2d6596 110 AC_MSG_CHECKING([for Linux build directory])
e3438006 111 if test -d "$KBUILD"; then
a0903134
YT
112 AC_MSG_RESULT([$KBUILD])
113 AC_SUBST(KBUILD)
064af421 114 else
a0903134
YT
115 AC_MSG_RESULT([no])
116 AC_ERROR([source dir $KBUILD doesn't exist])
064af421
BP
117 fi
118
7c9e113b 119 # Debian breaks kernel headers into "source" header and "build" headers.
e3438006 120 # We want the source headers, but $KBUILD gives us the "build" headers.
7c9e113b 121 # Use heuristics to find the source headers.
8a2d6596 122 AC_MSG_CHECKING([for Linux source directory])
e3438006
BP
123 if test -n "$KSRC"; then
124 KSRC=`eval echo "$KSRC"`
125 case $KSRC in
f5fb5de6 126 /*) ;;
e3438006 127 *) KSRC=`pwd`/$KSRC ;;
b57f675c 128 esac
e3438006 129 if test ! -e $KSRC/include/linux/kernel.h; then
53319f95 130 AC_MSG_ERROR([$KSRC is not a kernel source directory])
f5fb5de6
BP
131 fi
132 else
e3438006
BP
133 KSRC=$KBUILD
134 if test ! -e $KSRC/include/linux/kernel.h; then
fe0731b1
BP
135 # Debian kernel build Makefiles tend to include a line of the form:
136 # MAKEARGS := -C /usr/src/linux-headers-3.2.0-1-common O=/usr/src/linux-headers-3.2.0-1-486
137 # First try to extract the source directory from this line.
138 KSRC=`sed -n 's/.*-C \([[^ ]]*\).*/\1/p' "$KBUILD"/Makefile`
139 if test ! -e "$KSRC"/include/linux/kernel.h; then
140 # Didn't work. Fall back to name-based heuristics that used to work.
141 case `echo "$KBUILD" | sed 's,/*$,,'` in # (
142 */build)
143 KSRC=`echo "$KBUILD" | sed 's,/build/*$,/source,'`
144 ;; # (
145 *)
146 KSRC=`(cd $KBUILD && pwd -P) | sed 's,-[[^-]]*$,-common,'`
147 ;;
148 esac
149 fi
f5fb5de6 150 fi
fe0731b1 151 if test ! -e "$KSRC"/include/linux/kernel.h; then
8a2d6596 152 AC_MSG_ERROR([cannot find source directory (please use --with-linux-source)])
7c9e113b
BP
153 fi
154 fi
e3438006 155 AC_MSG_RESULT([$KSRC])
7c9e113b
BP
156
157 AC_MSG_CHECKING([for kernel version])
71fe9970 158 version=`sed -n 's/^VERSION = //p' "$KSRC/Makefile"`
e3438006
BP
159 patchlevel=`sed -n 's/^PATCHLEVEL = //p' "$KSRC/Makefile"`
160 sublevel=`sed -n 's/^SUBLEVEL = //p' "$KSRC/Makefile"`
71fe9970 161 if test X"$version" = X || test X"$patchlevel" = X; then
7c9e113b 162 AC_ERROR([cannot determine kernel version])
71fe9970
BP
163 elif test X"$sublevel" = X; then
164 kversion=$version.$patchlevel
165 else
166 kversion=$version.$patchlevel.$sublevel
7c9e113b 167 fi
71fe9970
BP
168 AC_MSG_RESULT([$kversion])
169
2adada0e 170 if test "$version" -ge 5; then
44722d58 171 if test "$version" = 5 && test "$patchlevel" -le 8; then
2adada0e 172 : # Linux 5.x
d76aabea 173 else
44722d58 174 AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version newer than 5.8.x is not supported (please refer to the FAQ for advice)])
d76aabea 175 fi
2adada0e
YS
176 elif test "$version" = 4; then
177 : # Linux 4.x
8063e095 178 elif test "$version" = 3 && test "$patchlevel" -ge 10; then
3afcde43 179 : # Linux 3.x
71fe9970 180 else
8063e095 181 AC_ERROR([Linux kernel in $KBUILD is version $kversion, but version 3.10 or later is required])
064af421 182 fi
2520f452
IY
183 if (test ! -e "$KBUILD"/include/linux/version.h && \
184 test ! -e "$KBUILD"/include/generated/uapi/linux/version.h)|| \
e3438006
BP
185 (test ! -e "$KBUILD"/include/linux/autoconf.h && \
186 test ! -e "$KBUILD"/include/generated/autoconf.h); then
a0903134 187 AC_MSG_ERROR([Linux kernel source in $KBUILD is not configured])
064af421 188 fi
e3438006 189 OVS_CHECK_LINUX_COMPAT
064af421 190 fi
e3438006 191 AM_CONDITIONAL(LINUX_ENABLED, test -n "$KBUILD")
064af421
BP
192])
193
292d5bd9
VB
194dnl OVS_CHECK_LINUX_NETLINK
195dnl
196dnl Configure Linux netlink compat.
197AC_DEFUN([OVS_CHECK_LINUX_NETLINK], [
198 AC_COMPILE_IFELSE([
199 AC_LANG_PROGRAM([#include <linux/netlink.h>], [
200 struct nla_bitfield32 x = { 0 };
201 ])],
202 [AC_DEFINE([HAVE_NLA_BITFIELD32], [1],
203 [Define to 1 if struct nla_bitfield32 is available.])])
204])
205
1dc0da67
PB
206dnl OVS_CHECK_LINUX_TC
207dnl
208dnl Configure Linux tc compat.
209AC_DEFUN([OVS_CHECK_LINUX_TC], [
210 AC_COMPILE_IFELSE([
211 AC_LANG_PROGRAM([#include <linux/pkt_cls.h>], [
292d5bd9 212 int x = TCA_ACT_FLAGS;
1dc0da67 213 ])],
292d5bd9
VB
214 [AC_DEFINE([HAVE_TCA_ACT_FLAGS], [1],
215 [Define to 1 if TCA_ACT_FLAGS is available.])])
1dc0da67 216
c0a1df2e
RD
217 AC_CHECK_MEMBERS([struct tcf_t.firstuse], [], [], [#include <linux/pkt_cls.h>])
218
1dc0da67
PB
219 AC_COMPILE_IFELSE([
220 AC_LANG_PROGRAM([#include <linux/tc_act/tc_vlan.h>], [
221 int x = TCA_VLAN_PUSH_VLAN_PRIORITY;
222 ])],
223 [AC_DEFINE([HAVE_TCA_VLAN_PUSH_VLAN_PRIORITY], [1],
dd83253e 224 [Define to 1 if TCA_VLAN_PUSH_VLAN_PRIORITY is available.])])
1dc0da67 225
abef7959
JH
226 AC_COMPILE_IFELSE([
227 AC_LANG_PROGRAM([#include <linux/tc_act/tc_mpls.h>], [
228 int x = TCA_MPLS_TTL;
229 ])],
230 [AC_DEFINE([HAVE_TCA_MPLS_TTL], [1],
231 [Define to 1 if HAVE_TCA_MPLS_TTL is available.])])
232
1dc0da67
PB
233 AC_COMPILE_IFELSE([
234 AC_LANG_PROGRAM([#include <linux/tc_act/tc_tunnel_key.h>], [
4b12e454 235 int x = TCA_TUNNEL_KEY_ENC_TTL;
1dc0da67 236 ])],
4b12e454
OG
237 [AC_DEFINE([HAVE_TCA_TUNNEL_KEY_ENC_TTL], [1],
238 [Define to 1 if TCA_TUNNEL_KEY_ENC_TTL is available.])])
e5b1657e
PB
239
240 AC_COMPILE_IFELSE([
241 AC_LANG_PROGRAM([#include <linux/tc_act/tc_pedit.h>], [
242 int x = TCA_PEDIT_KEY_EX_HDR_TYPE_UDP;
243 ])],
244 [AC_DEFINE([HAVE_TCA_PEDIT_KEY_EX_HDR_TYPE_UDP], [1],
dd83253e 245 [Define to 1 if TCA_PEDIT_KEY_EX_HDR_TYPE_UDP is available.])])
7808b2b9
JH
246
247 AC_COMPILE_IFELSE([
248 AC_LANG_PROGRAM([#include <linux/tc_act/tc_skbedit.h>], [
249 int x = TCA_SKBEDIT_FLAGS;
250 ])],
251 [AC_DEFINE([HAVE_TCA_SKBEDIT_FLAGS], [1],
252 [Define to 1 if TCA_SKBEDIT_FLAGS is available.])])
1dc0da67
PB
253])
254
8c7130da
AC
255dnl OVS_CHECK_LINUX_SCTP_CT
256dnl
257dnl Checks for kernels which need additional SCTP state
258AC_DEFUN([OVS_CHECK_LINUX_SCTP_CT], [
259 AC_COMPILE_IFELSE([
260 AC_LANG_PROGRAM([#include <linux/netfilter/nfnetlink.h>
261#include <linux/netfilter/nfnetlink_conntrack.h>
262#include <linux/netfilter/nf_conntrack_common.h>
263#include <linux/netfilter/nf_conntrack_sctp.h>], [
264 int x = SCTP_CONNTRACK_HEARTBEAT_SENT;
265 ])],
266 [AC_DEFINE([HAVE_SCTP_CONNTRACK_HEARTBEATS], [1],
267 [Define to 1 if SCTP_CONNTRACK_HEARTBEAT_SENT is available.])])
268])
269
fd4d4777
YHW
270dnl OVS_CHECK_LINUX_VIRTIO_TYPES
271dnl
272dnl Checks for kernels that need virtio_types definition.
273AC_DEFUN([OVS_CHECK_LINUX_VIRTIO_TYPES], [
274 AC_COMPILE_IFELSE([
275 AC_LANG_PROGRAM([#include <linux/virtio_types.h>], [
276 __virtio16 x = 0;
277 ])],
278 [AC_DEFINE([HAVE_VIRTIO_TYPES], [1],
279 [Define to 1 if __virtio16 is available.])])
280])
281
f0d1ead8
IM
282dnl OVS_FIND_DEPENDENCY(FUNCTION, SEARCH_LIBS, NAME_TO_PRINT)
283dnl
284dnl Check for a function in a library list.
285AC_DEFUN([OVS_FIND_DEPENDENCY], [
286 AC_SEARCH_LIBS([$1], [$2], [], [
287 AC_MSG_ERROR([unable to find $3, install the dependency package])
288 ])
289])
290
0de1b425
WT
291dnl OVS_CHECK_LINUX_AF_XDP
292dnl
293dnl Check both Linux kernel AF_XDP and libbpf support
294AC_DEFUN([OVS_CHECK_LINUX_AF_XDP], [
295 AC_ARG_ENABLE([afxdp],
296 [AC_HELP_STRING([--enable-afxdp], [Enable AF-XDP support])],
297 [], [enable_afxdp=no])
298 AC_MSG_CHECKING([whether AF_XDP is enabled])
299 if test "$enable_afxdp" != yes; then
300 AC_MSG_RESULT([no])
301 AF_XDP_ENABLE=false
302 else
303 AC_MSG_RESULT([yes])
304 AF_XDP_ENABLE=true
305
306 AC_CHECK_HEADER([bpf/libbpf.h], [],
307 [AC_MSG_ERROR([unable to find bpf/libbpf.h for AF_XDP support])])
308
309 AC_CHECK_HEADER([linux/if_xdp.h], [],
310 [AC_MSG_ERROR([unable to find linux/if_xdp.h for AF_XDP support])])
311
312 AC_CHECK_HEADER([bpf/xsk.h], [],
313 [AC_MSG_ERROR([unable to find bpf/xsk.h for AF_XDP support])])
314
315 AC_CHECK_FUNCS([pthread_spin_lock], [],
316 [AC_MSG_ERROR([unable to find pthread_spin_lock for AF_XDP support])])
317
e8568993
YHW
318 OVS_FIND_DEPENDENCY([numa_alloc_onnode], [numa], [libnuma])
319
0de1b425
WT
320 AC_DEFINE([HAVE_AF_XDP], [1],
321 [Define to 1 if AF_XDP support is available and enabled.])
322 LIBBPF_LDADD=" -lbpf -lelf"
323 AC_SUBST([LIBBPF_LDADD])
e50547b5
WT
324
325 AC_CHECK_DECL([xsk_ring_prod__needs_wakeup], [
326 AC_DEFINE([HAVE_XDP_NEED_WAKEUP], [1],
327 [XDP need wakeup support detected in xsk.h.])
328 ], [], [[#include <bpf/xsk.h>]])
0de1b425
WT
329 fi
330 AM_CONDITIONAL([HAVE_AF_XDP], test "$AF_XDP_ENABLE" = true)
331])
332
8a9562d2
PS
333dnl OVS_CHECK_DPDK
334dnl
335dnl Configure DPDK source tree
336AC_DEFUN([OVS_CHECK_DPDK], [
337 AC_ARG_WITH([dpdk],
252e1e57
IS
338 [AC_HELP_STRING([--with-dpdk=static|shared|yes],
339 [Specify "static" or "shared" depending on the
340 DPDK libraries to use])],
4c16ee48 341 [have_dpdk=true])
8a9562d2 342
49df3c0f 343 AC_MSG_CHECKING([whether dpdk is enabled])
4c16ee48 344 if test "$have_dpdk" != true || test "$with_dpdk" = no; then
40b5ea86
BB
345 AC_MSG_RESULT([no])
346 DPDKLIB_FOUND=false
347 else
348 AC_MSG_RESULT([yes])
349 case "$with_dpdk" in
252e1e57
IS
350 "shared")
351 PKG_CHECK_MODULES([DPDK], [libdpdk], [
352 DPDK_INCLUDE="$DPDK_CFLAGS"
353 DPDK_LIB="$DPDK_LIBS"], [
354 DPDK_INCLUDE="-I/usr/local/include/dpdk -I/usr/include/dpdk"
355 DPDK_LIB="-ldpdk"])
356 ;;
357 "static" | "yes")
358 PKG_CHECK_MODULES_STATIC([DPDK], [libdpdk], [
359 DPDK_INCLUDE="$DPDK_CFLAGS"
360 DPDK_LIB="$DPDK_LIBS"], [
361 DPDK_INCLUDE="-I/usr/local/include/dpdk -I/usr/include/dpdk"
362 DPDK_LIB="-ldpdk"])
363
364 dnl Statically linked private DPDK objects of form
365 dnl -l:file.a must be positioned between
366 dnl --whole-archive ... --no-whole-archive linker parameters.
367 dnl Old pkg-config versions misplace --no-whole-archive parameter
368 dnl and put it next to --whole-archive.
369 AC_MSG_CHECKING([for faulty pkg-config version])
370 echo "$DPDK_LIB" | grep -q 'whole-archive.*l:lib.*no-whole-archive'
371 status=$?
372 case $status in
373 0)
374 AC_MSG_RESULT([no])
375 ;;
376 1)
377 AC_MSG_RESULT([yes])
378 AC_MSG_ERROR([Please upgrade pkg-config])
379 ;;
380 *)
381 AC_MSG_ERROR([grep exited with status $status])
382 ;;
383 esac
40b5ea86 384 esac
8a9562d2 385
95626395
TG
386 ovs_save_CFLAGS="$CFLAGS"
387 ovs_save_LDFLAGS="$LDFLAGS"
96195c09 388 CFLAGS="$CFLAGS $DPDK_INCLUDE"
40b5ea86 389
865cee2b
IM
390 AC_CHECK_HEADERS([rte_config.h], [], [
391 AC_MSG_ERROR([unable to find rte_config.h in $with_dpdk])
392 ], [AC_INCLUDES_DEFAULT])
393
f0d1ead8
IM
394 AC_CHECK_DECLS([RTE_LIBRTE_VHOST_NUMA, RTE_EAL_NUMA_AWARE_HUGEPAGES], [
395 OVS_FIND_DEPENDENCY([get_mempolicy], [numa], [libnuma])
396 ], [], [[#include <rte_config.h>]])
4b88d678 397
976c452a
CL
398 AC_CHECK_DECL([RTE_LIBRTE_PMD_PCAP], [
399 OVS_FIND_DEPENDENCY([pcap_dump_close], [pcap], [libpcap])
400 ], [], [[#include <rte_config.h>]])
401
5bb068a7
CL
402 AC_CHECK_DECL([RTE_LIBRTE_PMD_AF_XDP], [
403 LIBBPF_LDADD="-lbpf"
404 ], [], [[#include <rte_config.h>]])
405
f0d1ead8
IM
406 AC_CHECK_DECL([RTE_LIBRTE_VHOST_NUMA], [
407 AC_DEFINE([VHOST_NUMA], [1], [NUMA Aware vHost support detected in DPDK.])
408 ], [], [[#include <rte_config.h>]])
fc3b425f 409
f0d1ead8 410 AC_CHECK_DECL([RTE_LIBRTE_MLX5_PMD], [dnl found
b926f577 411 AC_CHECK_DECL([RTE_IBVERBS_LINK_DLOPEN], [], [dnl not found
f0d1ead8
IM
412 OVS_FIND_DEPENDENCY([mlx5dv_create_wq], [mlx5], [libmlx5])
413 OVS_FIND_DEPENDENCY([verbs_init_cq], [ibverbs], [libibverbs])
414 ], [[#include <rte_config.h>]])
415 ], [], [[#include <rte_config.h>]])
84844e3f 416
f0d1ead8 417 AC_CHECK_DECL([RTE_LIBRTE_MLX4_PMD], [dnl found
b926f577 418 AC_CHECK_DECL([RTE_IBVERBS_LINK_DLOPEN], [], [dnl not found
f0d1ead8
IM
419 OVS_FIND_DEPENDENCY([mlx4dv_init_obj], [mlx4], [libmlx4])
420 OVS_FIND_DEPENDENCY([verbs_init_cq], [ibverbs], [libibverbs])
421 ], [[#include <rte_config.h>]])
422 ], [], [[#include <rte_config.h>]])
939bad9a 423
e2f37511
IM
424 # DPDK uses dlopen to load plugins.
425 OVS_FIND_DEPENDENCY([dlopen], [dl], [libdl])
426
427 AC_MSG_CHECKING([whether linking with dpdk works])
428 LIBS="$DPDK_LIB $LIBS"
429 AC_LINK_IFELSE(
430 [AC_LANG_PROGRAM([#include <rte_config.h>
431 #include <rte_eal.h>],
432 [int rte_argc; char ** rte_argv;
433 rte_eal_init(rte_argc, rte_argv);])],
434 [AC_MSG_RESULT([yes])
435 DPDKLIB_FOUND=true],
436 [AC_MSG_RESULT([no])
252e1e57
IS
437 AC_MSG_ERROR(m4_normalize([
438 Could not find DPDK library in default search path, update
439 PKG_CONFIG_PATH for pkg-config to find the .pc file in
440 non-standard location]))
e2f37511 441 ])
c1223b11 442
95626395
TG
443 CFLAGS="$ovs_save_CFLAGS"
444 LDFLAGS="$ovs_save_LDFLAGS"
252e1e57
IS
445 # Stripping out possible instruction set specific configuration that DPDK
446 # forces in pkg-config since this could override user-specified options.
447 # It's enough to have -mssse3 to build with DPDK headers.
448 DPDK_INCLUDE=$(echo "$DPDK_INCLUDE" | sed 's/-march=[[^ ]]*//g')
32c8c10d
IM
449 # Also stripping out '-mno-avx512f'. Support for AVX512 will be disabled
450 # if OVS will detect that it's broken. OVS could be built with a
451 # completely different toolchain that correctly supports AVX512, flags
452 # forced by DPDK only breaks our feature detection mechanism and leads to
453 # build failures: https://github.com/openvswitch/ovs-issues/issues/201
454 DPDK_INCLUDE=$(echo "$DPDK_INCLUDE" | sed 's/-mno-avx512f//g')
96195c09 455 OVS_CFLAGS="$OVS_CFLAGS $DPDK_INCLUDE"
ab2a3154 456 OVS_ENABLE_OPTION([-mssse3])
8a9562d2 457
3c94676c 458 # DPDK pmd drivers are not linked unless --whole-archive is used.
d7310583
DDP
459 #
460 # This happens because the rest of the DPDK code doesn't use any symbol in
461 # the pmd driver objects, and the drivers register themselves using an
462 # __attribute__((constructor)) function.
252e1e57
IS
463 # Wrap the DPDK libraries inside a single -Wl directive
464 # after comma separation to prevent autotools from reordering them.
465 DPDK_vswitchd_LDFLAGS=$(echo "$DPDK_LIB"| tr -s ' ' ',' | sed 's/-Wl,//g')
466 # Replace -pthread with -lpthread for LD and remove the last extra comma.
467 DPDK_vswitchd_LDFLAGS=$(echo "$DPDK_vswitchd_LDFLAGS"| sed 's/,$//' | \
468 sed 's/-pthread/-lpthread/g')
469 # Prepend "-Wl,".
470 DPDK_vswitchd_LDFLAGS="-Wl,$DPDK_vswitchd_LDFLAGS"
471
9475dfeb 472 AC_SUBST([DPDK_vswitchd_LDFLAGS])
8a9562d2 473 AC_DEFINE([DPDK_NETDEV], [1], [System uses the DPDK module.])
8a9562d2
PS
474 fi
475
40b5ea86 476 AM_CONDITIONAL([DPDK_NETDEV], test "$DPDKLIB_FOUND" = true)
8a9562d2
PS
477])
478
8828e5c7 479dnl OVS_GREP_IFELSE(FILE, REGEX, [IF-MATCH], [IF-NO-MATCH])
064af421
BP
480dnl
481dnl Greps FILE for REGEX. If it matches, runs IF-MATCH, otherwise IF-NO-MATCH.
8828e5c7
BP
482dnl If IF-MATCH is empty then it defines to OVS_DEFINE(HAVE_<REGEX>), with
483dnl <REGEX> translated to uppercase.
064af421
BP
484AC_DEFUN([OVS_GREP_IFELSE], [
485 AC_MSG_CHECKING([whether $2 matches in $1])
7507ec48
JG
486 if test -f $1; then
487 grep '$2' $1 >/dev/null 2>&1
488 status=$?
489 case $status in
997d327d 490 0)
7507ec48 491 AC_MSG_RESULT([yes])
8828e5c7 492 m4_if([$3], [], [OVS_DEFINE([HAVE_]m4_toupper([$2]))], [$3])
7507ec48 493 ;;
997d327d 494 1)
7507ec48
JG
495 AC_MSG_RESULT([no])
496 $4
497 ;;
997d327d 498 *)
7507ec48
JG
499 AC_MSG_ERROR([grep exited with status $status])
500 ;;
501 esac
502 else
503 AC_MSG_RESULT([file not found])
504 $4
505 fi
064af421
BP
506])
507
13dd4a97
JS
508dnl OVS_FIND_FIELD_IFELSE(FILE, STRUCTURE, REGEX, [IF-MATCH], [IF-NO-MATCH])
509dnl
510dnl Looks for STRUCTURE in FILE. If it is found, greps for REGEX within the
511dnl structure definition. If this is successful, runs IF-MATCH, otherwise
512dnl IF_NO_MATCH. If IF-MATCH is empty then it defines to
513dnl OVS_DEFINE(HAVE_<STRUCTURE>_WITH_<REGEX>), with <STRUCTURE> and <REGEX>
514dnl translated to uppercase.
515AC_DEFUN([OVS_FIND_FIELD_IFELSE], [
516 AC_MSG_CHECKING([whether $2 has member $3 in $1])
517 if test -f $1; then
83a27884 518 awk '/$2.{/,/^}/' $1 2>/dev/null | grep '$3' >/dev/null
13dd4a97
JS
519 status=$?
520 case $status in
521 0)
522 AC_MSG_RESULT([yes])
523 m4_if([$4], [], [OVS_DEFINE([HAVE_]m4_toupper([$2])[_WITH_]m4_toupper([$3]))], [$4])
524 ;;
525 1)
526 AC_MSG_RESULT([no])
527 $5
528 ;;
529 *)
530 AC_MSG_ERROR([grep exited with status $status])
531 ;;
532 esac
533 else
534 AC_MSG_RESULT([file not found])
535 $5
536 fi
537])
538
71ce9edd
JR
539dnl OVS_FIND_PARAM_IFELSE(FILE, FUNCTION, REGEX, [IF-MATCH], [IF-NO-MATCH])
540dnl
541dnl Looks for FUNCTION in FILE. If it is found, greps for REGEX within
542dnl the function signature starting from the line matching FUNCTION
543dnl and ending with the line containing the closing parenthesis. If
544dnl this is successful, runs IF-MATCH, otherwise IF_NO_MATCH. If
545dnl IF-MATCH is empty then it defines to
546dnl OVS_DEFINE(HAVE_<FUNCTION>_WITH_<REGEX>), with <FUNCTION> and
547dnl <REGEX> translated to uppercase.
548AC_DEFUN([OVS_FIND_PARAM_IFELSE], [
549 AC_MSG_CHECKING([whether $2 has parameter $3 in $1])
550 if test -f $1; then
551 awk '/$2[[ \t\n]]*\(/,/\)/' $1 2>/dev/null | grep '$3' >/dev/null
552 status=$?
553 case $status in
554 0)
555 AC_MSG_RESULT([yes])
556 m4_if([$4], [], [OVS_DEFINE([HAVE_]m4_toupper([$2])[_WITH_]m4_toupper([$3]))], [$4])
557 ;;
558 1)
559 AC_MSG_RESULT([no])
560 $5
561 ;;
562 *)
563 AC_MSG_ERROR([grep exited with status $status])
564 ;;
565 esac
566 else
567 AC_MSG_RESULT([file not found])
568 $5
569 fi
570])
571
82b7e6d1
GR
572dnl OVS_FIND_OP_PARAM_IFELSE(FILE, OP, REGEX, [IF-MATCH], [IF-NO-MATCH])
573dnl
574dnl Looks for OP in FILE. If it is found, greps for REGEX within the
575dnl OP definition. If this is successful, runs IF-MATCH, otherwise
576dnl IF_NO_MATCH. If IF-MATCH is empty then it defines to
577dnl OVS_DEFINE(HAVE_<OP>_WITH_<REGEX>), with <OP> and <REGEX>
578dnl translated to uppercase.
579AC_DEFUN([OVS_FIND_OP_PARAM_IFELSE], [
580 AC_MSG_CHECKING([whether $2 has member $3 in $1])
581 if test -f $1; then
582 awk '/$2[[ \t\n]]*\)\(/,/;/' $1 2>/dev/null | grep '$3' >/dev/null
583 status=$?
584 case $status in
585 0)
586 AC_MSG_RESULT([yes])
587 m4_if([$4], [], [OVS_DEFINE([HAVE_]m4_toupper([$2])[_WITH_]m4_toupper([$3]))], [$4])
588 ;;
589 1)
590 AC_MSG_RESULT([no])
591 $5
592 ;;
593 *)
594 AC_MSG_ERROR([grep exited with status $status])
595 ;;
596 esac
597 else
598 AC_MSG_RESULT([file not found])
599 $5
600 fi
601])
602
064af421
BP
603dnl OVS_DEFINE(NAME)
604dnl
605dnl Defines NAME to 1 in kcompat.h.
606AC_DEFUN([OVS_DEFINE], [
22bcc0e7 607 echo '#define $1 1' >> datapath/linux/kcompat.h.new
064af421
BP
608])
609
e3438006 610dnl OVS_CHECK_LINUX_COMPAT
064af421 611dnl
8063e095 612dnl Runs various Autoconf checks on the Linux kernel source in
e3438006
BP
613dnl the directory in $KBUILD.
614AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
22bcc0e7
JG
615 rm -f datapath/linux/kcompat.h.new
616 mkdir -p datapath/linux
617 : > datapath/linux/kcompat.h.new
4aa13c0c 618
e23775f2
PS
619 echo '#include <linux/version.h>
620#ifndef RHEL_RELEASE_CODE
621#define RHEL_RELEASE_CODE 0
622#define RHEL_RELEASE_VERSION(a, b) 0
623#endif' >> datapath/linux/kcompat.h.new
624
e3438006 625 OVS_GREP_IFELSE([$KSRC/arch/x86/include/asm/checksum_32.h], [src_err,],
25fb3596
JG
626 [OVS_DEFINE([HAVE_CSUM_COPY_DBG])])
627
db1dcb23
DB
628 OVS_GREP_IFELSE([$KSRC/include/net/ip6_fib.h], [rt6_get_cookie],
629 [OVS_DEFINE([HAVE_RT6_GET_COOKIE])])
630
33f9c873
GR
631 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/addrconf.h], [ipv6_stub],
632 [dst_entry])
e23775f2
PS
633 OVS_GREP_IFELSE([$KSRC/include/net/addrconf.h], [ipv6_dst_lookup.*net],
634 [OVS_DEFINE([HAVE_IPV6_DST_LOOKUP_NET])])
5519e384
YHW
635 OVS_GREP_IFELSE([$KSRC/include/net/addrconf.h], [ipv6_dst_lookup_flow.*net],
636 [OVS_DEFINE([HAVE_IPV6_DST_LOOKUP_FLOW_NET])])
e23775f2 637 OVS_GREP_IFELSE([$KSRC/include/net/addrconf.h], [ipv6_stub])
5519e384 638 OVS_GREP_IFELSE([$KSRC/include/net/addrconf.h], [ipv6_dst_lookup_flow])
e23775f2 639
e3438006 640 OVS_GREP_IFELSE([$KSRC/include/linux/err.h], [ERR_CAST])
4303ec34 641 OVS_GREP_IFELSE([$KSRC/include/linux/err.h], [IS_ERR_OR_NULL])
54125dd0 642 OVS_GREP_IFELSE([$KSRC/include/linux/err.h], [PTR_ERR_OR_ZERO])
4aa13c0c 643
8aef057b 644 OVS_GREP_IFELSE([$KSRC/include/linux/jump_label.h], [static_branch_unlikely(],
6660a959 645 [OVS_DEFINE([HAVE_UPSTREAM_STATIC_KEY])])
8aef057b
YHW
646 OVS_GREP_IFELSE([$KSRC/include/linux/jump_label.h], [DEFINE_STATIC_KEY_FALSE],
647 [OVS_DEFINE([HAVE_DEFINE_STATIC_KEY])])
dca96842
PB
648 OVS_GREP_IFELSE([$KSRC/include/linux/jump_label.h],
649 [DECLARE_STATIC_KEY_FALSE],
650 [OVS_DEFINE([HAVE_DECLARE_STATIC_KEY])])
6660a959 651
d923a695 652 OVS_GREP_IFELSE([$KSRC/include/linux/etherdevice.h], [eth_hw_addr_random])
e2f3178f 653 OVS_GREP_IFELSE([$KSRC/include/linux/etherdevice.h], [ether_addr_copy])
d923a695 654
e23775f2
PS
655 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/if_link.h], [IFLA_GENEVE_TOS])
656 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/if_link.h], [rtnl_link_stats64])
657 OVS_GREP_IFELSE([$KSRC/include/linux/if_link.h], [rtnl_link_stats64])
d923a695 658 OVS_GREP_IFELSE([$KSRC/include/linux/if_vlan.h], [vlan_set_encap_proto])
ec96e663 659 OVS_GREP_IFELSE([$KSRC/include/linux/if_vlan.h], [vlan_hwaccel_push_inside])
9feb5bda 660 OVS_GREP_IFELSE([$KSRC/include/linux/if_vlan.h], [__vlan_hwaccel_clear_tag])
d923a695 661
e3438006 662 OVS_GREP_IFELSE([$KSRC/include/linux/in.h], [ipv4_is_multicast])
46d69d18 663 OVS_GREP_IFELSE([$KSRC/include/linux/in.h], [proto_ports_offset])
2ea82414
PS
664 OVS_GREP_IFELSE([$KSRC/include/net/ip.h], [__ip_select_ident.*dst_entry],
665 [OVS_DEFINE([HAVE_IP_SELECT_IDENT_USING_DST_ENTRY])])
e23775f2
PS
666 OVS_GREP_IFELSE([$KSRC/include/net/ip.h], [__ip_select_ident.*net],
667 [OVS_DEFINE([HAVE_IP_SELECT_IDENT_USING_NET])])
668
13dd4a97
JS
669 OVS_GREP_IFELSE([$KSRC/include/net/ip.h], [inet_get_local_port_range.*net],
670 [OVS_DEFINE([HAVE_INET_GET_LOCAL_PORT_RANGE_USING_NET])])
39c0ff22
JS
671 OVS_GREP_IFELSE([$KSRC/include/net/ip.h], [ip_defrag.*net],
672 [OVS_DEFINE([HAVE_IP_DEFRAG_TAKES_NET])])
0374bcbe
EB
673 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/ip.h],
674 [ip_do_fragment], [net],
675 [OVS_DEFINE([HAVE_IP_DO_FRAGMENT_TAKES_NET])])
0643a78b
PS
676 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/ip.h],
677 [ip_local_out], [net],
678 [OVS_DEFINE([HAVE_IP_LOCAL_OUT_TAKES_NET])])
679
cfda4537 680 OVS_GREP_IFELSE([$KSRC/include/net/ip.h], [ip_skb_dst_mtu])
0f09d6e3
JS
681
682 OVS_GREP_IFELSE([$KSRC/include/net/ip.h], [IPSKB_FRAG_PMTU],
683 [OVS_DEFINE([HAVE_CORRECT_MRU_HANDLING])])
06f1a61a 684 OVS_GREP_IFELSE([$KSRC/include/net/ip_tunnels.h], [__ip_tunnel_change_mtu])
595e069a
JS
685 OVS_GREP_IFELSE([$KSRC/include/net/inet_frag.h], [hashfn.*const],
686 [OVS_DEFINE([HAVE_INET_FRAGS_CONST])])
8f00ece9
JS
687 OVS_GREP_IFELSE([$KSRC/include/net/inet_frag.h], [last_in],
688 [OVS_DEFINE([HAVE_INET_FRAGS_LAST_IN])])
e0d45da3 689 OVS_GREP_IFELSE([$KSRC/include/net/inet_frag.h], [inet_frag_evicting])
ccd0a13b 690 OVS_GREP_IFELSE([$KSRC/include/net/inet_frag.h], [inet_frag_evictor])
91408ae0
JS
691 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/inet_frag.h], [inet_frags],
692 [frags_work])
d1c390e6
JS
693 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/inet_frag.h], [inet_frags],
694 [rwlock])
e0d45da3
JS
695 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/inet_frag.h], [inet_frag_queue],
696 [list_evictor])
38f45380 697 OVS_GREP_IFELSE([$KSRC/include/net/inet_frag.h], [inet_frag_lru_move])
6ccf21ca
YHW
698 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/inet_frag.h],
699 [sub_frag_mem_limit], [struct.netns_frags],
700 [OVS_DEFINE([HAVE_SUB_FRAG_MEM_LIMIT_ARG_STRUCT_NETNS_FRAGS])])
701 OVS_GREP_IFELSE([$KSRC/include/net/inet_frag.h], [void.*inet_frags_init],
702 [OVS_DEFINE([HAVE_VOID_INET_FRAGS_INIT])])
401da7b9
JS
703 OVS_GREP_IFELSE([$KSRC/include/net/inetpeer.h], [vif],
704 [OVS_DEFINE([HAVE_INETPEER_VIF_SUPPORT])])
8f00ece9 705
f2252c61
PS
706 dnl Check for dst_cache and ipv6 lable to use backported tunnel infrastructure.
707 dnl OVS does not really need ipv6 label field, but its presence signifies that
708 dnl the stack has all required ipv6 support.
709 dnl OVS also does not need dst_cache But this dependency allows us to write
710 dnl much cleaner code.
711
3259c4ff
PS
712 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/ip_tunnels.h], [ip_tunnel_key],
713 [label],
714 [OVS_GREP_IFELSE([$KSRC/include/net/ip_tunnels.h],
715 [iptunnel_pull_offloads],
997d327d 716 [OVS_GREP_IFELSE([$KSRC/include/net/dst_cache.h], [dst_cache],
e1ededf4
GR
717 [OVS_GREP_IFELSE([$KSRC/include/net/erspan.h], [erspan_md2],
718 [OVS_DEFINE([USE_UPSTREAM_TUNNEL])])])])])
4aa13c0c 719
138df3e5
GR
720 OVS_GREP_IFELSE([$KSRC/include/net/dst_cache.h], [dst_cache],
721 [OVS_DEFINE([USE_BUILTIN_DST_CACHE])])
65590144
YHW
722 OVS_GREP_IFELSE([$KSRC/include/net/mpls.h], [mpls_hdr],
723 [OVS_DEFINE([MPLS_HEADER_IS_L3])])
fdce83a3
PS
724 OVS_GREP_IFELSE([$KSRC/include/linux/net.h], [sock_create_kern.*net],
725 [OVS_DEFINE([HAVE_SOCK_CREATE_KERN_NET])])
aad7cb91 726 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [ndo_fill_metadata_dst])
e3438006
BP
727 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [dev_disable_lro])
728 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [dev_get_stats])
729 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [dev_get_by_index_rcu])
3f506f07 730 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [dev_recursion_level])
42d5dd95 731 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [__skb_gso_segment])
96b82f6d 732 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [skb_gso_error_unwind])
42d5dd95 733 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [can_checksum_protocol])
e23775f2 734 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [ndo_get_iflink])
0a0d9095
PS
735 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [ndo_features_check],
736 [OVS_DEFINE([USE_UPSTREAM_TUNNEL_GSO])])
f2252c61
PS
737 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [ndo_add_vxlan_port])
738 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [ndo_add_geneve_port])
e2e11c89 739 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [ndo_udp_tunnel_add])
d1890de5 740 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [netdev_features_t])
8063e095
PS
741 dnl Ubuntu kernel 3.13 has defined this struct but not used for netdev->tstats.
742 dnl So check type of tstats.
743 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [pcpu_sw_netstats.*tstats],
744 [OVS_DEFINE([HAVE_PCPU_SW_NETSTATS])])
e23775f2
PS
745 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [netif_needs_gso.*net_device],
746 [OVS_DEFINE([HAVE_NETIF_NEEDS_GSO_NETDEV])])
a0c9fedc 747 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [skb_csum_hwoffload_help])
e23775f2
PS
748 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [udp_offload])
749 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [udp_offload.*uoff],
750 [OVS_DEFINE([HAVE_UDP_OFFLOAD_ARG_UOFF])])
751 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [gro_remcsum])
8ce37339 752 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h], [IFF_PHONY_HEADROOM])
6ccf21ca
YHW
753 OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/netdevice.h], [net_device_ops],
754 [extended])
7efb1e09
PS
755 OVS_FIND_PARAM_IFELSE([$KSRC/include/linux/netdevice.h],
756 [netdev_master_upper_dev_link], [upper_priv],
757 [OVS_DEFINE([HAVE_NETDEV_MASTER_UPPER_DEV_LINK_PRIV])])
b7ab7316
YHW
758 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h],
759 [netdev_master_upper_dev_link_rh],
760 [OVS_DEFINE([HAVE_NETDEV_MASTER_UPPER_DEV_LINK_RH])])
761
6c0bf091
JW
762 OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/netdevice.h], [net_device],
763 [max_mtu])
39ca3383
YHW
764 OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/netdevice.h], [net_device_ops_extended],
765 [ndo_change_mtu], [OVS_DEFINE([HAVE_RHEL7_MAX_MTU])])
140c8971
PM
766 OVS_FIND_PARAM_IFELSE([$KSRC/include/linux/netdevice.h],
767 [dev_change_flags], [extack],
768 [OVS_DEFINE([HAVE_DEV_CHANGE_FLAGS_TAKES_EXTACK])])
e23775f2
PS
769
770 OVS_GREP_IFELSE([$KSRC/include/linux/netfilter.h], [nf_hook_state])
4fdec898
FW
771 OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/netfilter.h], [nf_hook_state],
772 [struct net ], [OVS_DEFINE([HAVE_NF_HOOK_STATE_NET])])
e23775f2 773 OVS_GREP_IFELSE([$KSRC/include/linux/netfilter.h], [nf_register_net_hook])
cd7330d0
PS
774 OVS_GREP_IFELSE([$KSRC/include/linux/netfilter.h], [nf_hookfn.*nf_hook_ops],
775 [OVS_DEFINE([HAVE_NF_HOOKFN_ARG_OPS])])
0643a78b
PS
776 OVS_FIND_PARAM_IFELSE([$KSRC/include/linux/netfilter.h], [nf_hookfn], [priv],
777 [OVS_DEFINE([HAVE_NF_HOOKFN_ARG_PRIV])])
778 OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/netfilter.h], [nf_hook_ops],
779 [owner], [OVS_DEFINE([HAVE_NF_HOOKS_OPS_OWNER])])
179fccce 780 OVS_GREP_IFELSE([$KSRC/include/linux/netfilter.h], [NFPROTO_INET])
d42fb06d 781 OVS_GREP_IFELSE([$KSRC/include/linux/netfilter.h], [CONFIG_NF_NAT_NEEDED])
179fccce 782
0643a78b 783
e4e04c3b 784 OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/netfilter_ipv6.h], [nf_ipv6_ops],
2b64e8fc 785 [fragment.*sock], [OVS_DEFINE([HAVE_NF_IPV6_OPS_FRAGMENT])])
e2f3178f 786
6d9b6937
JR
787 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/netfilter/nf_conntrack.h],
788 [nf_conn], [struct timer_list[[ \t]]*timeout],
789 [OVS_DEFINE([HAVE_NF_CONN_TIMER])])
790 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack.h],
791 [nf_ct_delete(], [OVS_DEFINE([HAVE_NF_CT_DELETE])])
792
71ce9edd
JR
793 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/netfilter/nf_conntrack.h],
794 [nf_ct_tmpl_alloc], [nf_conntrack_zone],
057772cf 795 [OVS_DEFINE([HAVE_NF_CT_TMPL_ALLOC_TAKES_STRUCT_ZONE])])
71ce9edd
JR
796 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/netfilter/nf_conntrack.h],
797 [nf_ct_get_tuplepr], [struct.net],
fa67f8e0 798 [OVS_DEFINE([HAVE_NF_CT_GET_TUPLEPR_TAKES_STRUCT_NET])])
dfa791b2
FW
799 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack.h],
800 [nf_ct_set])
56ec5593
JS
801 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack.h],
802 [nf_ct_is_untracked])
c1d728db
YHW
803 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack.h],
804 [nf_ct_invert_tuplepr])
ac9cd0d2
JS
805 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_zones.h],
806 [nf_ct_zone_init])
eca4cde0
YS
807 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_l3proto.h],
808 [net_ns_get])
459064e7
JS
809 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_labels.h],
810 [nf_connlabels_get])
7f2ab8cd
JR
811 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_labels.h],
812 [nf_connlabels_get], [int bit],
813 [OVS_DEFINE([HAVE_NF_CONNLABELS_GET_TAKES_BIT])])
9f04eabe
JR
814 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_labels.h],
815 [nf_conn_labels], [words])
0d330e42
JR
816 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_nat.h], [nf_ct_nat_ext_add])
817 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_nat.h], [nf_nat_alloc_null_binding])
fdec3c17 818 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_nat.h], [nf_nat_range2])
9ea96dce
YHW
819 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_nat.h], [nf_nat_packet],
820 [OVS_DEFINE([HAVE_UPSTREAM_NF_NAT])])
0d330e42 821 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_seqadj.h], [nf_ct_seq_adjust])
74496432 822 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_count.h], [nf_conncount_gc_list],
4bfdefea
YS
823 [OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_count.h],
824 [int nf_conncount_add],
825 [], [OVS_DEFINE([HAVE_UPSTREAM_NF_CONNCOUNT])])])
2fc8309b
YHW
826 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_timeout.h], [nf_ct_set_timeout])
827 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_timeout.h], [struct nf_ct_timeout],
828 [OVS_DEFINE([HAVE_NF_CT_TIMEOUT])])
829 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_timeout.h],
830 [\(*nf_ct_timeout_find_get_hook\)], [net],
831 [OVS_DEFINE([HAVE_NF_CT_TIMEOUT_FIND_GET_HOOK_NET])])
057772cf 832
9048ab60
GR
833 OVS_GREP_IFELSE([$KSRC/include/linux/random.h],
834 [prandom_u32[[\(]]],
835 [OVS_DEFINE([HAVE_PRANDOM_U32])])
f000c879 836 OVS_GREP_IFELSE([$KSRC/include/linux/random.h], [prandom_u32_max])
b8d42f87
IM
837 OVS_GREP_IFELSE([$KSRC/include/linux/prandom.h],
838 [prandom_u32[[\(]]],
839 [OVS_DEFINE([HAVE_PRANDOM_U32])])
840 OVS_GREP_IFELSE([$KSRC/include/linux/prandom.h], [prandom_u32_max])
4aa13c0c 841
e23775f2
PS
842 OVS_GREP_IFELSE([$KSRC/include/net/rtnetlink.h], [get_link_net])
843 OVS_GREP_IFELSE([$KSRC/include/net/rtnetlink.h], [name_assign_type])
844 OVS_GREP_IFELSE([$KSRC/include/net/rtnetlink.h], [rtnl_create_link.*src_net],
845 [OVS_DEFINE([HAVE_RTNL_CREATE_LINK_SRC_NET])])
846 OVS_GREP_IFELSE([$KSRC/include/net/net_namespace.h], [possible_net_t])
847
e3438006
BP
848 OVS_GREP_IFELSE([$KSRC/include/linux/rcupdate.h], [rcu_read_lock_held], [],
849 [OVS_GREP_IFELSE([$KSRC/include/linux/rtnetlink.h],
cf6cb3a2 850 [rcu_read_lock_held])])
8fa52250 851 OVS_GREP_IFELSE([$KSRC/include/linux/rtnetlink.h], [lockdep_rtnl_is_held])
3d10a0c8 852 OVS_GREP_IFELSE([$KSRC/include/linux/rtnetlink.h], [net_rwsem])
8b7cc752
YS
853 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/rtnetlink.h],
854 [rtnl_create_link], [extack],
855 [OVS_DEFINE([HAVE_RTNL_CREATE_LINK_TAKES_EXTACK])])
efcae7df 856 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [nf_reset_ct])
997d327d 857
6a33828d
BP
858 # Check for the proto_data_valid member in struct sk_buff. The [^@]
859 # is necessary because some versions of this header remove the
860 # member but retain the kerneldoc comment that describes it (which
861 # starts with @). The brackets must be doubled because of m4
862 # quoting rules.
e3438006 863 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [[[^@]]proto_data_valid],
6a33828d 864 [OVS_DEFINE([HAVE_PROTO_DATA_VALID])])
ccb75a28 865 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_checksum_start_offset])
e23775f2 866 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [inner_protocol])
f2252c61 867 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [inner_protocol_type])
c1eb2500 868 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_inner_transport_offset])
d23239a2 869 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [kfree_skb_list])
60c4904f 870 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [rxhash])
5640cbd8
JG
871 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [u16.*rxhash],
872 [OVS_DEFINE([HAVE_U16_RXHASH])])
e3438006 873 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_dst(],
85444c3f 874 [OVS_DEFINE([HAVE_SKB_DST_ACCESSOR_FUNCS])])
997d327d 875 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h],
8828e5c7 876 [skb_copy_from_linear_data_offset])
b9c15df9
PS
877 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h],
878 [skb_reset_tail_pointer])
e3438006 879 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_cow_head])
e3438006 880 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_warn_if_lro],
4aa13c0c 881 [OVS_DEFINE([HAVE_SKB_WARN_LRO])])
e3438006 882 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [consume_skb])
6c4ea27c 883 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_frag_page])
da4bbeb7 884 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_has_frag_list])
0aa6fda7 885 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [__skb_fill_page_desc])
d923a695 886 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_reset_mac_len])
dc0d542d 887 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_unclone])
1edc458d 888 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_orphan_frags])
c253c2e3
MC
889 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_get_hash(],
890 [OVS_DEFINE([HAVE_SKB_GET_HASH])])
e2f3178f 891 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_clear_hash])
705e9260
PS
892 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [int.skb_zerocopy(],
893 [OVS_DEFINE([HAVE_SKB_ZEROCOPY])])
5cce04b6 894 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_ensure_writable])
97894370 895 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_vlan_pop])
a27c454e 896 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [__skb_vlan_pop])
97894370 897 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_vlan_push])
c6e13fcc 898 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_clear_hash_if_not_l4])
ea3acd7a 899 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_postpush_rcsum])
73daf51a 900 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [lco_csum])
d3c313c1 901 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_nfct])
0ace0a26 902 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_put_zero])
4aa13c0c 903
e3438006 904 OVS_GREP_IFELSE([$KSRC/include/linux/types.h], [__wsum],
e215ebca 905 [OVS_DEFINE([HAVE_CSUM_TYPES])])
8dbe1f9f
PS
906 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/types.h], [__wsum],
907 [OVS_DEFINE([HAVE_CSUM_TYPES])])
4aa13c0c 908
e3438006
BP
909 OVS_GREP_IFELSE([$KSRC/include/net/checksum.h], [csum_replace4])
910 OVS_GREP_IFELSE([$KSRC/include/net/checksum.h], [csum_unfold])
4aa13c0c 911
0d03e51c 912 OVS_GREP_IFELSE([$KSRC/include/net/dst.h], [dst_discard_sk])
1dba1690 913 OVS_GREP_IFELSE([$KSRC/include/net/dst.h], [__skb_dst_copy])
0d03e51c 914
114fce23
SG
915 OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [genl_has_listeners])
916 OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [mcgrp_offset])
14002a59 917 OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [parallel_ops])
6233a1bd
TG
918 OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [netlink_has_listeners(net->genl_sock],
919 [OVS_DEFINE([HAVE_GENL_HAS_LISTENERS_TAKES_NET])])
c623ba49 920 OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [genlmsg_parse])
13dd4a97
JS
921 OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [genl_notify.*family],
922 [OVS_DEFINE([HAVE_GENL_NOTIFY_TAKES_FAMILY])])
f1e9590e 923 OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [genl_validate_flags])
0643a78b
PS
924 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/genetlink.h],
925 [genl_notify], [net],
926 [OVS_DEFINE([HAVE_GENL_NOTIFY_TAKES_NET])])
927
13dd4a97
JS
928
929 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/genetlink.h],
930 [genl_multicast_group], [id])
fdce83a3 931 OVS_GREP_IFELSE([$KSRC/include/net/geneve.h], [geneve_hdr])
13dd4a97 932
cc1d0dea 933 OVS_GREP_IFELSE([$KSRC/include/net/gre.h], [gre_cisco_register])
e23775f2 934 OVS_GREP_IFELSE([$KSRC/include/net/gre.h], [gre_handle_offloads])
8abaa53c 935 OVS_GREP_IFELSE([$KSRC/include/net/ipv6.h], [IP6_FH_F_SKIP_RH])
e23775f2 936 OVS_GREP_IFELSE([$KSRC/include/net/ipv6.h], [ip6_local_out_sk])
2d3ef70b 937 OVS_GREP_IFELSE([$KSRC/include/net/ipv6.h], [__ipv6_addr_jhash])
a94ebc39
JS
938 OVS_GREP_IFELSE([$KSRC/include/net/ip6_fib.h], [rt6i.*u.dst],
939 [OVS_DEFINE([HAVE_RT6INFO_DST_UNION])])
213e1f54
JS
940 OVS_GREP_IFELSE([$KSRC/include/net/ip6_route.h], [ip6_frag.*sock],
941 [OVS_DEFINE([HAVE_IP_FRAGMENT_TAKES_SOCK])])
942
91b37647 943 OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_put_64bit])
e3438006 944 OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_get_be16])
42d5dd95
TG
945 OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_put_be16])
946 OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_put_be32])
947 OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_put_be64])
dd693f9b 948 OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_put_in_addr])
e3438006 949 OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_find_nested])
0fcc086d 950 OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_is_last])
09c33996 951 OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], [nla_nest_start_noflag])
6dbd98e6
SH
952 OVS_GREP_IFELSE([$KSRC/include/linux/netlink.h], [void.*netlink_set_err],
953 [OVS_DEFINE([HAVE_VOID_NETLINK_SET_ERR])])
15702dc9
JB
954 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/netlink.h],
955 [nla_parse], [netlink_ext_ack],
956 [OVS_DEFINE([HAVE_NETLINK_EXT_ACK])])
4aa13c0c 957
c4e976db
JG
958 OVS_GREP_IFELSE([$KSRC/include/net/sctp/checksum.h], [sctp_compute_cksum])
959
1f649f1c 960 OVS_GREP_IFELSE([$KSRC/include/linux/if_vlan.h], [vlan_insert_tag_set_proto])
17e3889f 961 OVS_GREP_IFELSE([$KSRC/include/linux/if_vlan.h], [__vlan_insert_tag])
e23775f2 962 OVS_GREP_IFELSE([$KSRC/include/linux/if_vlan.h], [vlan_get_protocol])
5c3f23fe 963 OVS_GREP_IFELSE([$KSRC/include/linux/if_vlan.h], [skb_vlan_tagged])
ca6da1b1 964 OVS_GREP_IFELSE([$KSRC/include/linux/if_vlan.h], [eth_type_vlan])
431488e6 965
aadd6ae9
JS
966 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/dst_metadata.h],
967 [metadata_dst_alloc], [metadata_type])
968
09f27436
JG
969 OVS_GREP_IFELSE([$KSRC/include/linux/u64_stats_sync.h], [u64_stats_fetch_begin_irq])
970
3174a818
TG
971 OVS_GREP_IFELSE([$KSRC/include/net/vxlan.h], [struct vxlan_metadata],
972 [OVS_DEFINE([HAVE_VXLAN_METADATA])])
f6a0c895 973 OVS_GREP_IFELSE([$KSRC/include/net/udp.h], [udp_flow_src_port],
13dd4a97
JS
974 [OVS_GREP_IFELSE([$KSRC/include/net/udp.h], [inet_get_local_port_range(net],
975 [OVS_DEFINE([HAVE_UDP_FLOW_SRC_PORT])])])
976 OVS_GREP_IFELSE([$KSRC/include/net/udp.h], [udp_v4_check])
e23775f2 977 OVS_GREP_IFELSE([$KSRC/include/net/udp_tunnel.h], [udp_tunnel_gro_complete])
06aeda48
PS
978 OVS_GREP_IFELSE([$KSRC/include/net/udp_tunnel.h], [sk_buff.*udp_tunnel_handle_offloads],
979 [OVS_DEFINE([HAVE_UDP_TUNNEL_HANDLE_OFFLOAD_RET_SKB])])
d7e58913
PS
980 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/udp_tunnel.h], [udp_tunnel_sock_cfg],
981 [gro_receive])
e23775f2
PS
982
983 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [ignore_df],
f6a0c895
TG
984 [OVS_DEFINE([HAVE_IGNORE_DF_RENAME])])
985 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/netdevice.h], [NET_NAME_UNKNOWN],
986 [OVS_DEFINE([HAVE_NET_NAME_UNKNOWN])])
f285d3e7 987
b7ebebcd
PS
988 OVS_GREP_IFELSE([$KSRC/include/net/sock.h], [sk_no_check_tx])
989 OVS_GREP_IFELSE([$KSRC/include/linux/udp.h], [no_check6_tx])
c970aa4e
PS
990 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/protocol.h],
991 [udp_add_offload], [net],
992 [OVS_DEFINE([HAVE_UDP_ADD_OFFLOAD_TAKES_NET])])
802d12b6
GR
993 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/netfilter/ipv6/nf_defrag_ipv6.h],
994 [nf_defrag_ipv6_enable], [net],
995 [OVS_DEFINE([HAVE_DEFRAG_ENABLE_TAKES_NET])])
bef862bc
GR
996 OVS_GREP_IFELSE([$KSRC/include/net/genetlink.h], [family_list],
997 [OVS_DEFINE([HAVE_GENL_FAMILY_LIST])])
7f15e8dd
GR
998 OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/netdevice.h], [net_device],
999 [needs_free_netdev],
1000 [OVS_DEFINE([HAVE_NEEDS_FREE_NETDEV])])
14365643
GR
1001 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/vxlan.h], [vxlan_dev], [cfg],
1002 [OVS_DEFINE([HAVE_VXLAN_DEV_CFG])])
ac8e3c6d 1003 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_helper.h],
35fc0638
GR
1004 [nf_conntrack_helper_put],
1005 [OVS_DEFINE(HAVE_NF_CONNTRACK_HELPER_PUT)])
4c941202
YHW
1006 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_helper.h],
1007 [nf_nat_helper_try_module_get])
1008 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_helper.h],
1009 [nf_nat_helper_put])
f90e29c9 1010 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h],[[[[:space:]]]SKB_GSO_UDP[[[:space:]]]],
ad283644 1011 [OVS_DEFINE([HAVE_SKB_GSO_UDP])])
db1dcb23
DB
1012 OVS_GREP_IFELSE([$KSRC/include/net/dst.h],[DST_NOCACHE],
1013 [OVS_DEFINE([HAVE_DST_NOCACHE])])
6b51641a
GR
1014 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/rtnetlink.h], [rtnl_link_ops],
1015 [extack],
1016 [OVS_DEFINE([HAVE_EXT_ACK_IN_RTNL_LINKOPS])])
a5220693
GR
1017 OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/netfilter.h], [nf_hook_ops],
1018 [list],
1019 [OVS_DEFINE([HAVE_LIST_IN_NF_HOOK_OPS])])
c0802634
EG
1020 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/netfilter/nf_conntrack_common.h],
1021 [IP_CT_UNTRACKED])
36d3520b
GR
1022 OVS_FIND_PARAM_IFELSE([$KSRC/include/linux/netdevice.h],
1023 [netdev_master_upper_dev_link], [extack],
1024 [OVS_DEFINE([HAVE_UPPER_DEV_LINK_EXTACK])])
a61fbfa4
GR
1025 OVS_GREP_IFELSE([$KSRC/include/linux/compiler_types.h],
1026 [__LINUX_COMPILER_TYPES_H],
1027 [OVS_DEFINE([HAVE_LINUX_COMPILER_TYPES_H])])
6deeb55a
AB
1028 OVS_GREP_IFELSE([$KSRC/include/linux/timekeeping.h],
1029 [ktime_get_ts64],
1030 [OVS_DEFINE([HAVE_KTIME_GET_TS64])])
b147f2e9
JB
1031 OVS_GREP_IFELSE([$KSRC/include/net/net_namespace.h],
1032 [EXPORT_SYMBOL_GPL(peernet2id_alloc)],
1033 [OVS_DEFINE([HAVE_PEERNET2ID_ALLOC])])
1cb57039
AZ
1034 OVS_GREP_IFELSE([$KSRC/include/linux/timekeeping.h],
1035 [ktime_get_ns],
1036 [OVS_DEFINE([HAVE_KTIME_GET_NS])])
b3e647ca
GR
1037 OVS_GREP_IFELSE([$KSRC/include/net/inet_frag.h],
1038 frag_percpu_counter_batch[],
1039 [OVS_DEFINE([HAVE_FRAG_PERCPU_COUNTER_BATCH])])
8e53509c
WT
1040 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h],
1041 [null_compute_pseudo],
1042 [OVS_DEFINE([HAVE_NULL_COMPUTE_PSEUDO])])
1043 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h],
1044 [__skb_checksum_convert],
1045 [OVS_DEFINE([HAVE_SKB_CHECKSUM_CONVERT])])
1046 OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/netdevice.h], [net_device],
1047 [max_mtu],
1048 [OVS_DEFINE([HAVE_NET_DEVICE_MAX_MTU])])
8e53509c
WT
1049 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/ip6_tunnel.h], [__ip6_tnl_parm],
1050 [erspan_ver],
1051 [OVS_DEFINE([HAVE_IP6_TNL_PARM_ERSPAN_VER])])
1052 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h],
1053 [SKB_GSO_IPXIP6],
1054 [OVS_DEFINE([HAVE_SKB_GSO_IPXIP6])])
1055 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/ipv6.h],
1056 [ip6_make_flowlabel], [fl6],
1057 [OVS_DEFINE([HAVE_IP6_MAKE_FLOWLABEL_FL6])])
1058 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/ipv6.h], [netns_sysctl_ipv6],
1059 [auto_flowlabels],
1060 [OVS_DEFINE([HAVE_NETNS_SYSCTL_IPV6_AUTO_FLOWLABELS])])
1061 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h],
1062 [netif_keep_dst],
1063 [OVS_DEFINE([HAVE_NETIF_KEEP_DST])])
1064 OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/netdevice.h], [net_device_ops],
1065 [ndo_get_iflink],
1066 [OVS_DEFINE([HAVE_NDO_GET_IFLINK])])
1067 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h],
1068 [skb_set_inner_ipproto],
1069 [OVS_DEFINE([HAVE_SKB_SET_INNER_IPPROTO])])
1070 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/if_tunnel.h],
1071 [tunnel_encap_types],
1072 [OVS_DEFINE([HAVE_TUNNEL_ENCAP_TYPES])])
1073 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/if_tunnel.h],
1074 [IFLA_IPTUN_ENCAP_TYPE],
1075 [OVS_DEFINE([HAVE_IFLA_IPTUN_ENCAP_TYPE])])
1076 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/if_tunnel.h],
1077 [IFLA_IPTUN_COLLECT_METADATA],
1078 [OVS_DEFINE([HAVE_IFLA_IPTUN_COLLECT_METADATA])])
e1ededf4
GR
1079 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/if_tunnel.h],
1080 [IFLA_GRE_ENCAP_DPORT])
1081 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/if_tunnel.h],
1082 [IFLA_GRE_COLLECT_METADATA])
1083 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/if_tunnel.h],
1084 [IFLA_GRE_IGNORE_DF])
1085 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/if_tunnel.h],
1086 [IFLA_GRE_FWMARK])
1087 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/if_tunnel.h],
1088 [IFLA_GRE_ERSPAN_INDEX])
1089 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/if_tunnel.h],
1090 [IFLA_GRE_ERSPAN_HWID])
436d36db
GR
1091 OVS_GREP_IFELSE([$KSRC/include/uapi/linux/if_tunnel.h],
1092 [IFLA_IPTUN_FWMARK])
10f24236
GR
1093 OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/skbuff.h], [sk_buff],
1094 [csum_valid],
1095 [OVS_DEFINE([HAVE_SKBUFF_CSUM_VALID])])
9feb5bda
MM
1096 OVS_FIND_FIELD_IFELSE([$KSRC/include/linux/skbuff.h], [sk_buff],
1097 [vlan_present],
1098 [OVS_DEFINE([HAVE_SKBUFF_VLAN_PRESENT])])
10f24236
GR
1099 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h],
1100 [skb_checksum_simple_validate])
44a629b5
GR
1101 OVS_GREP_IFELSE([$KSRC/include/linux/netdevice.h],
1102 [void.*ndo_get_stats64],
1103 [OVS_DEFINE([HAVE_VOID_NDO_GET_STATS64])])
7f63d830
YS
1104 OVS_GREP_IFELSE([$KSRC/include/linux/timer.h], [init_timer_deferrable],
1105 [OVS_DEFINE([HAVE_INIT_TIMER_DEFERRABLE])])
3f3b76f9
GR
1106 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/ip_tunnels.h],
1107 [ip_tunnel_info_opts_set], [flags],
1108 [OVS_DEFINE([HAVE_IP_TUNNEL_INFO_OPTS_SET_FLAGS])])
4a90b277
GR
1109 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/inet_frag.h], [inet_frags],
1110 [rnd],
1111 [OVS_DEFINE([HAVE_INET_FRAGS_RND])])
f7246940
GS
1112 OVS_GREP_IFELSE([$KSRC/include/linux/overflow.h], [__LINUX_OVERFLOW_H],
1113 [OVS_DEFINE([HAVE_OVERFLOW_H])])
8f6d230f
YS
1114 OVS_GREP_IFELSE([$KSRC/include/linux/overflow.h], [struct_size],
1115 [OVS_DEFINE([HAVE_STRUCT_SIZE])])
f7246940
GS
1116 OVS_GREP_IFELSE([$KSRC/include/linux/mm.h], [kvmalloc_array],
1117 [OVS_DEFINE([HAVE_KVMALLOC_ARRAY])])
1118 OVS_GREP_IFELSE([$KSRC/include/linux/mm.h], [kvmalloc_node],
1119 [OVS_DEFINE([HAVE_KVMALLOC_NODE])])
945d6d1c
YS
1120 OVS_GREP_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_l3proto.h],
1121 [nf_conntrack_l3proto],
1122 [OVS_DEFINE([HAVE_NF_CONNTRACK_L3PROATO_H])])
4fdec898
FW
1123 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_core.h],
1124 [nf_conntrack_in], [nf_hook_state],
1125 [OVS_DEFINE([HAVE_NF_CONNTRACK_IN_TAKES_NF_HOOK_STATE])])
7857a9b4
FW
1126 OVS_GREP_IFELSE([$KSRC/include/net/ipv6_frag.h], [IP6_DEFRAG_CONNTRACK_IN],
1127 [OVS_DEFINE([HAVE_IPV6_FRAG_H])])
7685ce31
GF
1128 OVS_FIND_PARAM_IFELSE([$KSRC/include/net/netfilter/nf_conntrack_helper.h],
1129 [nf_ct_helper_ext_add], [nf_conntrack_helper],
1130 [OVS_DEFINE([HAVE_NF_CT_HELPER_EXT_ADD_TAKES_HELPER])])
6d97adee
GR
1131 OVS_GREP_IFELSE([$KSRC/include/net/gre.h], [gre_calc_hlen],
1132 [OVS_DEFINE([HAVE_GRE_CALC_HLEN])])
1133 OVS_GREP_IFELSE([$KSRC/include/net/gre.h], [ip_gre_calc_hlen],
1134 [OVS_DEFINE([HAVE_IP_GRE_CALC_HLEN])])
4bfdefea
YS
1135 OVS_GREP_IFELSE([$KSRC/include/linux/rbtree.h], [rb_link_node_rcu],
1136 [OVS_DEFINE([HAVE_RBTREE_RB_LINK_NODE_RCU])])
6634cc8a
GR
1137 OVS_GREP_IFELSE([$KSRC/include/net/dst_ops.h], [bool confirm_neigh],
1138 [OVS_DEFINE([HAVE_DST_OPS_CONFIRM_NEIGH])])
f77d85b1
GR
1139 OVS_GREP_IFELSE([$KSRC/include/net/inet_frag.h], [fqdir],
1140 [OVS_DEFINE([HAVE_INET_FRAG_FQDIR])])
2ef0f1c2
JB
1141 OVS_FIND_FIELD_IFELSE([$KSRC/include/net/genetlink.h], [genl_ops],
1142 [policy],
1143 [OVS_DEFINE([HAVE_GENL_OPS_POLICY])])
6db0f72d
JB
1144 OVS_GREP_IFELSE([$KSRC/include/net/netlink.h],
1145 [nla_parse_deprecated_strict],
1146 [OVS_DEFINE([HAVE_NLA_PARSE_DEPRECATED_STRICT])])
82b7e6d1
GR
1147 OVS_FIND_OP_PARAM_IFELSE([$KSRC/include/net/rtnetlink.h],
1148 [validate], [extack],
1149 [OVS_DEFINE([HAVE_RTNLOP_VALIDATE_WITH_EXTACK])])
9ba57fc7
HZ
1150 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h],
1151 [__skb_set_hash])
1152 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [sw_hash])
1153 OVS_GREP_IFELSE([$KSRC/include/linux/skbuff.h], [skb_get_hash_raw])
21a719d6 1154
22bcc0e7
JG
1155 if cmp -s datapath/linux/kcompat.h.new \
1156 datapath/linux/kcompat.h >/dev/null 2>&1; then
1157 rm datapath/linux/kcompat.h.new
064af421 1158 else
22bcc0e7 1159 mv datapath/linux/kcompat.h.new datapath/linux/kcompat.h
064af421
BP
1160 fi
1161])
1162
f6eb6b20 1163dnl Checks for net/if_dl.h.
d30e714c 1164dnl
d23fa2ed
YT
1165dnl (We use this as a proxy for checking whether we're building on FreeBSD
1166dnl or NetBSD.)
9360d9b7
EM
1167AC_DEFUN([OVS_CHECK_IF_DL],
1168 [AC_CHECK_HEADER([net/if_dl.h],
1169 [HAVE_IF_DL=yes],
1170 [HAVE_IF_DL=no])
1171 AM_CONDITIONAL([HAVE_IF_DL], [test "$HAVE_IF_DL" = yes])
1172 if test "$HAVE_IF_DL" = yes; then
1173 AC_DEFINE([HAVE_IF_DL], [1],
1174 [Define to 1 if net/if_dl.h is available.])
d30e714c 1175
d23fa2ed 1176 # On these platforms we use libpcap to access network devices.
d30e714c 1177 AC_SEARCH_LIBS([pcap_open_live], [pcap])
9360d9b7
EM
1178 fi])
1179
e50097d2
BP
1180dnl Checks for buggy strtok_r.
1181dnl
1182dnl Some versions of glibc 2.7 has a bug in strtok_r when compiling
1183dnl with optimization that can cause segfaults:
1184dnl
1185dnl http://sources.redhat.com/bugzilla/show_bug.cgi?id=5614.
1186AC_DEFUN([OVS_CHECK_STRTOK_R],
1187 [AC_CACHE_CHECK(
1188 [whether strtok_r macro segfaults on some inputs],
1189 [ovs_cv_strtok_r_bug],
1190 [AC_RUN_IFELSE(
1191 [AC_LANG_PROGRAM([#include <stdio.h>
1192 #include <string.h>
1193 ],
416e7132
BP
1194 [[#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 8
1195 /* Assume bug is present, because relatively minor
1196 changes in compiler settings (e.g. optimization
1197 level) can make it crop up. */
1198 return 1;
1199 #else
1200 char string[] = ":::";
e50097d2
BP
1201 char *save_ptr = (char *) 0xc0ffee;
1202 char *token1, *token2;
1203 token1 = strtok_r(string, ":", &save_ptr);
1204 token2 = strtok_r(NULL, ":", &save_ptr);
5819a7cd 1205 freopen ("/dev/null", "w", stdout);
e50097d2
BP
1206 printf ("%s %s\n", token1, token2);
1207 return 0;
416e7132 1208 #endif
e50097d2
BP
1209 ]])],
1210 [ovs_cv_strtok_r_bug=no],
1211 [ovs_cv_strtok_r_bug=yes],
1212 [ovs_cv_strtok_r_bug=yes])])
1213 if test $ovs_cv_strtok_r_bug = yes; then
1214 AC_DEFINE([HAVE_STRTOK_R_BUG], [1],
1215 [Define if strtok_r macro segfaults on some inputs])
1216 fi
1217])
1218
064af421
BP
1219dnl ----------------------------------------------------------------------
1220dnl These macros are from GNU PSPP, with the following original license:
1221dnl Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
1222dnl This file is free software; the Free Software Foundation
1223dnl gives unlimited permission to copy and/or distribute it,
1224dnl with or without modifications, as long as this notice is preserved.
1225
50194820 1226AC_DEFUN([_OVS_CHECK_CC_OPTION], [dnl
726af752 1227 m4_define([ovs_cv_name], [ovs_cv_[]m4_translit([$1], [-= ], [__])])dnl
064af421
BP
1228 AC_CACHE_CHECK([whether $CC accepts $1], [ovs_cv_name],
1229 [ovs_save_CFLAGS="$CFLAGS"
50194820
BP
1230 dnl Include -Werror in the compiler options, because without -Werror
1231 dnl clang's GCC-compatible compiler driver does not return a failure
1232 dnl exit status even though it complains about options it does not
1233 dnl understand.
c2deac54
YT
1234 dnl
1235 dnl Also, check stderr as gcc exits with status 0 for options
1236 dnl rejected at getopt level.
1237 dnl % touch /tmp/a.c
1238 dnl % gcc -g -c -Werror -Qunused-arguments /tmp/a.c; echo $?
1239 dnl gcc: unrecognized option '-Qunused-arguments'
1240 dnl 0
1241 dnl %
4c1e8cb9
BP
1242 dnl
1243 dnl In addition, GCC does not complain about a -Wno-<foo> option that
1244 dnl it does not understand, unless it has another error to report, so
1245 dnl instead of testing for -Wno-<foo>, test for the positive version.
1246 CFLAGS="$CFLAGS $WERROR m4_bpatsubst([$1], [-Wno-], [-W])"
37f4615e
BP
1247 AC_COMPILE_IFELSE(
1248 [AC_LANG_SOURCE([int x;])],
1249 [if test -s conftest.err && grep "unrecognized option" conftest.err
1250 then
1251 ovs_cv_name[]=no
1252 else
1253 ovs_cv_name[]=yes
1254 fi],
1255 [ovs_cv_name[]=no])
064af421
BP
1256 CFLAGS="$ovs_save_CFLAGS"])
1257 if test $ovs_cv_name = yes; then
83f6c050 1258 m4_if([$2], [], [:], [$2])
064af421
BP
1259 else
1260 m4_if([$3], [], [:], [$3])
1261 fi
1262])
1263
50194820
BP
1264dnl OVS_CHECK_WERROR
1265dnl
1266dnl Check whether the C compiler accepts -Werror.
1267dnl Sets $WERROR to "-Werror", if so, and otherwise to the empty string.
1268AC_DEFUN([OVS_CHECK_WERROR],
1269 [WERROR=
1270 _OVS_CHECK_CC_OPTION([-Werror], [WERROR=-Werror])])
1271
1272dnl OVS_CHECK_CC_OPTION([OPTION], [ACTION-IF-ACCEPTED], [ACTION-IF-REJECTED])
1273dnl Check whether the given C compiler OPTION is accepted.
1274dnl If so, execute ACTION-IF-ACCEPTED, otherwise ACTION-IF-REJECTED.
1275AC_DEFUN([OVS_CHECK_CC_OPTION],
1276 [AC_REQUIRE([OVS_CHECK_WERROR])
1277 _OVS_CHECK_CC_OPTION([$1], [$2], [$3])])
1278
064af421
BP
1279dnl OVS_ENABLE_OPTION([OPTION])
1280dnl Check whether the given C compiler OPTION is accepted.
d161c099 1281dnl If so, add it to WARNING_FLAGS.
064af421
BP
1282dnl Example: OVS_ENABLE_OPTION([-Wdeclaration-after-statement])
1283AC_DEFUN([OVS_ENABLE_OPTION],
d161c099
BP
1284 [OVS_CHECK_CC_OPTION([$1], [WARNING_FLAGS="$WARNING_FLAGS $1"])
1285 AC_SUBST([WARNING_FLAGS])])
c72e245a
BP
1286
1287dnl OVS_CONDITIONAL_CC_OPTION([OPTION], [CONDITIONAL])
1288dnl Check whether the given C compiler OPTION is accepted.
1289dnl If so, enable the given Automake CONDITIONAL.
1290
1291dnl Example: OVS_CONDITIONAL_CC_OPTION([-Wno-unused], [HAVE_WNO_UNUSED])
1292AC_DEFUN([OVS_CONDITIONAL_CC_OPTION],
1293 [OVS_CHECK_CC_OPTION(
1294 [$1], [ovs_have_cc_option=yes], [ovs_have_cc_option=no])
1295 AM_CONDITIONAL([$2], [test $ovs_have_cc_option = yes])])
064af421 1296dnl ----------------------------------------------------------------------
ed2d4f6a
BP
1297
1298dnl Check for too-old XenServer.
1299AC_DEFUN([OVS_CHECK_XENSERVER_VERSION],
1300 [AC_CACHE_CHECK([XenServer release], [ovs_cv_xsversion],
1301 [if test -e /etc/redhat-release; then
1302 ovs_cv_xsversion=`sed -n 's/^XenServer DDK release \([[^-]]*\)-.*/\1/p' /etc/redhat-release`
1303 fi
1304 if test -z "$ovs_cv_xsversion"; then
1305 ovs_cv_xsversion=none
1306 fi])
1307 case $ovs_cv_xsversion in
1308 none)
1309 ;;
1310
1311 [[1-9]][[0-9]]* | dnl XenServer 10 or later
1312 [[6-9]]* | dnl XenServer 6 or later
1313 5.[[7-9]]* | dnl XenServer 5.7 or later
1314 5.6.[[1-9]][[0-9]][[0-9]][[0-9]]* | dnl XenServer 5.6.1000 or later
1315 5.6.[[2-9]][[0-9]][[0-9]]* | dnl XenServer 5.6.200 or later
1316 5.6.1[[0-9]][[0-9]]) dnl Xenserver 5.6.100 or later
1317 ;;
1318
1319 *)
1320 AC_MSG_ERROR([This appears to be XenServer $ovs_cv_xsversion, but only XenServer 5.6.100 or later is supported. (If you are really using a supported version of XenServer, you may override this error message by specifying 'ovs_cv_xsversion=5.6.100' on the "configure" command line.)])
1321 ;;
1322 esac])
29d935d6 1323
643c0c34
BP
1324dnl OVS_CHECK_SPARSE_TARGET
1325dnl
1326dnl The "cgcc" script from "sparse" isn't very good at detecting the
1327dnl target for which the code is being built. This helps it out.
1328AC_DEFUN([OVS_CHECK_SPARSE_TARGET],
1329 [AC_CACHE_CHECK(
1330 [target hint for cgcc],
1331 [ac_cv_sparse_target],
1332 [AS_CASE([`$CC -dumpmachine 2>/dev/null`],
1333 [i?86-* | athlon-*], [ac_cv_sparse_target=x86],
1334 [x86_64-*], [ac_cv_sparse_target=x86_64],
1335 [ac_cv_sparse_target=other])])
1336 AS_CASE([$ac_cv_sparse_target],
0cdd5b13
BP
1337 [x86], [SPARSEFLAGS= CGCCFLAGS="-target=i86 -target=host_os_specs"],
1338 [x86_64], [SPARSEFLAGS=-m64 CGCCFLAGS="-target=x86_64 -target=host_os_specs"],
643c0c34 1339 [SPARSEFLAGS= CGCCFLAGS=])
346c6538 1340
e5273084 1341 dnl Get the default defines for vector instructions from compiler to
346c6538
IM
1342 dnl allow "sparse" correctly check the same code that will be built.
1343 dnl Required for checking DPDK headers.
1344 AC_MSG_CHECKING([vector options for cgcc])
1345 VECTOR=$($CC -dM -E - < /dev/null | grep -E "MMX|SSE|AVX" | \
1346 cut -c 9- | sed 's/ /=/' | sed 's/^/-D/' | tr '\n' ' ')
1347 AC_MSG_RESULT([$VECTOR])
1348 CGCCFLAGS="$CGCCFLAGS $VECTOR"
1349
643c0c34
BP
1350 AC_SUBST([SPARSEFLAGS])
1351 AC_SUBST([CGCCFLAGS])])
1352
32e96ab7
AZ
1353dnl OVS_SPARSE_EXTRA_INCLUDES
1354dnl
1355dnl The cgcc script from "sparse" does not search gcc's default
1356dnl search path. Get the default search path from GCC and pass
1357dnl them to sparse.
1358AC_DEFUN([OVS_SPARSE_EXTRA_INCLUDES],
1359 AC_SUBST([SPARSE_EXTRA_INCLUDES],
1360 [`$CC -v -E - </dev/null 2>&1 >/dev/null | sed -n -e '/^#include.*search.*starts.*here:/,/^End.*of.*search.*list\./s/^ \(.*\)/-I \1/p' |grep -v /usr/lib | grep -x -v '\-I /usr/include' | tr \\\n ' ' `] ))
1361
29d935d6
BP
1362dnl OVS_ENABLE_SPARSE
1363AC_DEFUN([OVS_ENABLE_SPARSE],
643c0c34 1364 [AC_REQUIRE([OVS_CHECK_SPARSE_TARGET])
32e96ab7 1365 AC_REQUIRE([OVS_SPARSE_EXTRA_INCLUDES])
372d58a4
BP
1366 : ${SPARSE=sparse}
1367 AC_SUBST([SPARSE])
1368 AC_CONFIG_COMMANDS_PRE(
d4042a70
BP
1369 [CC='$(if $(C:0=),env REAL_CC="'"$CC"'" CHECK="$(SPARSE) $(SPARSE_WERROR) -I $(top_srcdir)/include/sparse $(SPARSEFLAGS) $(SPARSE_EXTRA_INCLUDES) " cgcc $(CGCCFLAGS),'"$CC"')'])
1370
1371 AC_ARG_ENABLE(
1372 [sparse],
1373 [AC_HELP_STRING([--enable-sparse], [Run "sparse" by default])],
1374 [], [enable_sparse=no])
1375 AM_CONDITIONAL([ENABLE_SPARSE_BY_DEFAULT], [test $enable_sparse = yes])])
8a8cd0ac 1376
0eaaacac
FL
1377dnl OVS_CTAGS_IDENTIFIERS
1378dnl
9ed9df77
FL
1379dnl ctags ignores symbols with extras identifiers. This is a list of
1380dnl specially handled identifiers to be ignored. [ctags(1) -I <list>].
0eaaacac
FL
1381AC_DEFUN([OVS_CTAGS_IDENTIFIERS],
1382 AC_SUBST([OVS_CTAGS_IDENTIFIERS_LIST],
9ed9df77 1383 ["OVS_LOCKABLE OVS_NO_THREAD_SAFETY_ANALYSIS OVS_REQ_RDLOCK+ OVS_ACQ_RDLOCK+ OVS_REQ_WRLOCK+ OVS_ACQ_WRLOCK+ OVS_REQUIRES+ OVS_ACQUIRES+ OVS_TRY_WRLOCK+ OVS_TRY_RDLOCK+ OVS_TRY_LOCK+ OVS_GUARDED_BY+ OVS_EXCLUDED+ OVS_RELEASES+ OVS_ACQ_BEFORE+ OVS_ACQ_AFTER+"]))
0eaaacac 1384
8a8cd0ac
BP
1385dnl OVS_PTHREAD_SET_NAME
1386dnl
1387dnl This checks for three known variants of pthreads functions for setting
1388dnl the name of the current thread:
1389dnl
1390dnl glibc: int pthread_setname_np(pthread_t, const char *name);
1391dnl NetBSD: int pthread_setname_np(pthread_t, const char *format, void *arg);
1392dnl FreeBSD: int pthread_set_name_np(pthread_t, const char *name);
1393dnl
1394dnl For glibc and FreeBSD, the arguments are just a thread and its name. For
1395dnl NetBSD, 'format' is a printf() format string and 'arg' is an argument to
1396dnl provide to it.
1397dnl
1398dnl This macro defines:
1399dnl
1400dnl glibc: HAVE_GLIBC_PTHREAD_SETNAME_NP
1401dnl NetBSD: HAVE_NETBSD_PTHREAD_SETNAME_NP
1402dnl FreeBSD: HAVE_PTHREAD_SET_NAME_NP
1403AC_DEFUN([OVS_CHECK_PTHREAD_SET_NAME],
1404 [AC_CHECK_FUNCS([pthread_set_name_np])
1405 if test $ac_cv_func_pthread_set_name_np != yes; then
1406 AC_CACHE_CHECK(
1407 [for pthread_setname_np() variant],
1408 [ovs_cv_pthread_setname_np],
1409 [AC_LINK_IFELSE(
a0903134 1410 [AC_LANG_PROGRAM([#include <pthread.h>
8a8cd0ac 1411 ], [pthread_setname_np(pthread_self(), "name");])],
a0903134 1412 [ovs_cv_pthread_setname_np=glibc],
8a8cd0ac 1413 [AC_LINK_IFELSE(
a0903134 1414 [AC_LANG_PROGRAM([#include <pthread.h>
8a8cd0ac
BP
1415], [pthread_setname_np(pthread_self(), "%s", "name");])],
1416 [ovs_cv_pthread_setname_np=netbsd],
a0903134 1417 [ovs_cv_pthread_setname_np=none])])])
8a8cd0ac
BP
1418 case $ovs_cv_pthread_setname_np in # (
1419 glibc)
a0903134
YT
1420 AC_DEFINE(
1421 [HAVE_GLIBC_PTHREAD_SETNAME_NP], [1],
1422 [Define to 1 if pthread_setname_np() is available and takes 2 parameters (like glibc).])
1423 ;; # (
8a8cd0ac 1424 netbsd)
a0903134
YT
1425 AC_DEFINE(
1426 [HAVE_NETBSD_PTHREAD_SETNAME_NP], [1],
1427 [Define to 1 if pthread_setname_np() is available and takes 3 parameters (like NetBSD).])
1428 ;;
8a8cd0ac
BP
1429 esac
1430 fi])
5020f5f0
BP
1431
1432dnl OVS_CHECK_LINUX_HOST.
1433dnl
1434dnl Checks whether we're building for a Linux host, based on the presence of
1435dnl the __linux__ preprocessor symbol, and sets up an Automake conditional
1436dnl LINUX based on the result.
1437AC_DEFUN([OVS_CHECK_LINUX_HOST],
1438 [AC_CACHE_CHECK(
1439 [whether __linux__ is defined],
1440 [ovs_cv_linux],
1441 [AC_COMPILE_IFELSE(
1442 [AC_LANG_PROGRAM([enum { LINUX = __linux__};], [])],
1443 [ovs_cv_linux=true],
1444 [ovs_cv_linux=false])])
1445 AM_CONDITIONAL([LINUX], [$ovs_cv_linux])])