xref: /f-stack/dpdk/kernel/linux/kni/compat.h (revision 0c6bd470)
1d30ea906Sjfb8856606 /* SPDX-License-Identifier: GPL-2.0 */
2d30ea906Sjfb8856606 /*
3d30ea906Sjfb8856606  * Minimal wrappers to allow compiling kni on older kernels.
4d30ea906Sjfb8856606  */
5d30ea906Sjfb8856606 
6d30ea906Sjfb8856606 #include <linux/version.h>
7d30ea906Sjfb8856606 
8d30ea906Sjfb8856606 #ifndef RHEL_RELEASE_VERSION
9d30ea906Sjfb8856606 #define RHEL_RELEASE_VERSION(a, b) (((a) << 8) + (b))
10d30ea906Sjfb8856606 #endif
11d30ea906Sjfb8856606 
12d30ea906Sjfb8856606 /* SuSE version macro is the same as Linux kernel version */
13d30ea906Sjfb8856606 #ifndef SLE_VERSION
14d30ea906Sjfb8856606 #define SLE_VERSION(a, b, c) KERNEL_VERSION(a, b, c)
15d30ea906Sjfb8856606 #endif
16d30ea906Sjfb8856606 #ifdef CONFIG_SUSE_KERNEL
17d30ea906Sjfb8856606 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 57))
18d30ea906Sjfb8856606 /* SLES12SP3 is at least 4.4.57+ based */
19d30ea906Sjfb8856606 #define SLE_VERSION_CODE SLE_VERSION(12, 3, 0)
20d30ea906Sjfb8856606 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 12, 28))
21d30ea906Sjfb8856606 /* SLES12 is at least 3.12.28+ based */
22d30ea906Sjfb8856606 #define SLE_VERSION_CODE SLE_VERSION(12, 0, 0)
23d30ea906Sjfb8856606 #elif ((LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 61)) && \
24d30ea906Sjfb8856606 	(LINUX_VERSION_CODE < KERNEL_VERSION(3, 1, 0)))
25d30ea906Sjfb8856606 /* SLES11 SP3 is at least 3.0.61+ based */
26d30ea906Sjfb8856606 #define SLE_VERSION_CODE SLE_VERSION(11, 3, 0)
27d30ea906Sjfb8856606 #elif (LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 32))
28d30ea906Sjfb8856606 /* SLES11 SP1 is 2.6.32 based */
29d30ea906Sjfb8856606 #define SLE_VERSION_CODE SLE_VERSION(11, 1, 0)
30d30ea906Sjfb8856606 #elif (LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 27))
31d30ea906Sjfb8856606 /* SLES11 GA is 2.6.27 based */
32d30ea906Sjfb8856606 #define SLE_VERSION_CODE SLE_VERSION(11, 0, 0)
33d30ea906Sjfb8856606 #endif /* LINUX_VERSION_CODE == KERNEL_VERSION(x,y,z) */
34d30ea906Sjfb8856606 #endif /* CONFIG_SUSE_KERNEL */
35d30ea906Sjfb8856606 #ifndef SLE_VERSION_CODE
36d30ea906Sjfb8856606 #define SLE_VERSION_CODE 0
37d30ea906Sjfb8856606 #endif /* SLE_VERSION_CODE */
38d30ea906Sjfb8856606 
39d30ea906Sjfb8856606 
40d30ea906Sjfb8856606 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) && \
41d30ea906Sjfb8856606 	(!(defined(RHEL_RELEASE_CODE) && \
42d30ea906Sjfb8856606 	   RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 4)))
43d30ea906Sjfb8856606 
44d30ea906Sjfb8856606 #define kstrtoul strict_strtoul
45d30ea906Sjfb8856606 
46d30ea906Sjfb8856606 #endif /* < 2.6.39 */
47d30ea906Sjfb8856606 
48d30ea906Sjfb8856606 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 33)
49d30ea906Sjfb8856606 #define HAVE_SIMPLIFIED_PERNET_OPERATIONS
50d30ea906Sjfb8856606 #endif
51d30ea906Sjfb8856606 
52d30ea906Sjfb8856606 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 35)
53d30ea906Sjfb8856606 #define sk_sleep(s) ((s)->sk_sleep)
54d30ea906Sjfb8856606 #else
55d30ea906Sjfb8856606 #define HAVE_SOCKET_WQ
56d30ea906Sjfb8856606 #endif
57d30ea906Sjfb8856606 
58d30ea906Sjfb8856606 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 7, 0)
59d30ea906Sjfb8856606 #define HAVE_STATIC_SOCK_MAP_FD
60d30ea906Sjfb8856606 #else
61d30ea906Sjfb8856606 #define kni_sock_map_fd(s) sock_map_fd(s, 0)
62d30ea906Sjfb8856606 #endif
63d30ea906Sjfb8856606 
64d30ea906Sjfb8856606 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
65d30ea906Sjfb8856606 #define HAVE_CHANGE_CARRIER_CB
66d30ea906Sjfb8856606 #endif
67d30ea906Sjfb8856606 
68d30ea906Sjfb8856606 #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)
69d30ea906Sjfb8856606 #define ether_addr_copy(dst, src) memcpy(dst, src, ETH_ALEN)
70d30ea906Sjfb8856606 #endif
71d30ea906Sjfb8856606 
72d30ea906Sjfb8856606 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
73d30ea906Sjfb8856606 #define HAVE_IOV_ITER_MSGHDR
74d30ea906Sjfb8856606 #endif
75d30ea906Sjfb8856606 
76d30ea906Sjfb8856606 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)
77d30ea906Sjfb8856606 #define HAVE_KIOCB_MSG_PARAM
78d30ea906Sjfb8856606 #define HAVE_REBUILD_HEADER
79d30ea906Sjfb8856606 #endif
80d30ea906Sjfb8856606 
81d30ea906Sjfb8856606 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 2, 0)
82d30ea906Sjfb8856606 #define HAVE_SK_ALLOC_KERN_PARAM
83d30ea906Sjfb8856606 #endif
84d30ea906Sjfb8856606 
85d30ea906Sjfb8856606 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) || \
86d30ea906Sjfb8856606 	(defined(RHEL_RELEASE_CODE) && \
87d30ea906Sjfb8856606 	 RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 4)) || \
88d30ea906Sjfb8856606 	(SLE_VERSION_CODE && SLE_VERSION_CODE == SLE_VERSION(12, 3, 0))
89d30ea906Sjfb8856606 #define HAVE_TRANS_START_HELPER
90d30ea906Sjfb8856606 #endif
91d30ea906Sjfb8856606 
92d30ea906Sjfb8856606 /*
93d30ea906Sjfb8856606  * KNI uses NET_NAME_UNKNOWN macro to select correct version of alloc_netdev()
94d30ea906Sjfb8856606  * For old kernels just backported the commit that enables the macro
95d30ea906Sjfb8856606  * (685343fc3ba6) but still uses old API, it is required to undefine macro to
96d30ea906Sjfb8856606  * select correct version of API, this is safe since KNI doesn't use the value.
97d30ea906Sjfb8856606  * This fix is specific to RedHat/CentOS kernels.
98d30ea906Sjfb8856606  */
99d30ea906Sjfb8856606 #if (defined(RHEL_RELEASE_CODE) && \
100d30ea906Sjfb8856606 	(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(6, 8)) && \
101d30ea906Sjfb8856606 	(LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 34)))
102d30ea906Sjfb8856606 #undef NET_NAME_UNKNOWN
103d30ea906Sjfb8856606 #endif
104d30ea906Sjfb8856606 
1051646932aSjfb8856606 /*
1061646932aSjfb8856606  * RHEL has two different version with different kernel version:
1071646932aSjfb8856606  * 3.10 is for AMD, Intel, IBM POWER7 and POWER8;
1081646932aSjfb8856606  * 4.14 is for ARM and IBM POWER9
1091646932aSjfb8856606  */
110d30ea906Sjfb8856606 #if (defined(RHEL_RELEASE_CODE) && \
1111646932aSjfb8856606 	(RHEL_RELEASE_CODE >= RHEL_RELEASE_VERSION(7, 5)) && \
1121646932aSjfb8856606 	(RHEL_RELEASE_CODE < RHEL_RELEASE_VERSION(8, 0)) && \
1131646932aSjfb8856606 	(LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0)))
114d30ea906Sjfb8856606 #define ndo_change_mtu ndo_change_mtu_rh74
115d30ea906Sjfb8856606 #endif
116d30ea906Sjfb8856606 
1174418919fSjohnjiang #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
1184418919fSjohnjiang #define HAVE_MAX_MTU_PARAM
1194418919fSjohnjiang #endif
1204418919fSjohnjiang 
121d30ea906Sjfb8856606 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
122d30ea906Sjfb8856606 #define HAVE_SIGNAL_FUNCTIONS_OWN_HEADER
123d30ea906Sjfb8856606 #endif
1244418919fSjohnjiang 
1254418919fSjohnjiang /*
1264418919fSjohnjiang  * iova to kva mapping support can be provided since 4.6.0, but required
1274418919fSjohnjiang  * kernel version increased to >= 4.10.0 because of the updates in
1284418919fSjohnjiang  * get_user_pages_remote() kernel API
1294418919fSjohnjiang  */
1304418919fSjohnjiang #if KERNEL_VERSION(4, 10, 0) <= LINUX_VERSION_CODE
1314418919fSjohnjiang #define HAVE_IOVA_TO_KVA_MAPPING_SUPPORT
1324418919fSjohnjiang #endif
1334418919fSjohnjiang 
134*0c6bd470Sfengbojiang #if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE || \
135*0c6bd470Sfengbojiang 	(defined(RHEL_RELEASE_CODE) && \
136*0c6bd470Sfengbojiang 	 RHEL_RELEASE_VERSION(8, 3) <= RHEL_RELEASE_CODE)
1374418919fSjohnjiang #define HAVE_TX_TIMEOUT_TXQUEUE
1384418919fSjohnjiang #endif
139*0c6bd470Sfengbojiang 
140*0c6bd470Sfengbojiang #if KERNEL_VERSION(5, 9, 0) > LINUX_VERSION_CODE
141*0c6bd470Sfengbojiang #define HAVE_TSK_IN_GUP
142*0c6bd470Sfengbojiang #endif
143