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