}
#endif
-#ifndef HAVE_LINUX_KERNEL_SETSOCKOPT
+#if defined(HAVE_LINUX_IP_SOCK_SET)
+# include <net/ip.h>
+/* ip_sock_set_* introduced in linux 5.8 */
+static inline void
+afs_linux_sock_set_mtu_discover(struct socket *sockp, int pmtu)
+{
+ ip_sock_set_mtu_discover(sockp->sk, pmtu);
+}
+static inline void
+afs_linux_sock_set_recverr(struct socket *sockp)
+{
+ ip_sock_set_recverr(sockp->sk);
+}
+#else
+# if !defined(HAVE_LINUX_KERNEL_SETSOCKOPT)
/* Available from 2.6.19 */
-
static inline int
kernel_setsockopt(struct socket *sockp, int level, int name, char *val,
unsigned int len) {
return ret;
}
+# endif /* !HAVE_LINUX_KERNEL_SETSOCKOPT */
-static inline int
-kernel_getsockopt(struct socket *sockp, int level, int name, char *val,
- int *len) {
- mm_segment_t old_fs = get_fs();
- int ret;
-
- set_fs(get_ds());
- ret = sockp->ops->getsockopt(sockp, level, name, val, len);
- set_fs(old_fs);
-
- return ret;
+static inline void
+afs_linux_sock_set_mtu_discover(struct socket *sockp, int pmtu)
+{
+ kernel_setsockopt(sockp, SOL_IP, IP_MTU_DISCOVER, (char *)&pmtu,
+ sizeof(pmtu));
}
-#endif
+static inline void
+afs_linux_sock_set_recverr(struct socket *sockp)
+{
+ int recverr = 1;
+ kernel_setsockopt(sockp, SOL_IP, IP_RECVERR, (char *)&recverr,
+ sizeof(recverr));
+}
+#endif /* !HAVE_LINUX_IP_SOCK_SET */
#ifdef HAVE_TRY_TO_FREEZE
static inline int
[#include <linux/swap.h>],
[lru_cache_add_file(NULL);])
+dnl Linux 5.8 replaced kernel_setsockopt with helper functions
+dnl e.g. ip_sock_set_mtu_discover, ip_sock_set_recverr
+AC_CHECK_LINUX_FUNC([ip_sock_set],
+ [#include <net/ip.h>],
+ [ip_sock_set_mtu_discover(NULL, 0);])
+
dnl Consequences - things which get set as a result of the
dnl above tests
AS_IF([test "x$ac_cv_linux_func_d_alloc_anon" = "xno"],
#include <linux/errqueue.h>
#include <linux/icmp.h>
#endif
-
#include "osi_compat.h"
/* rxk_NewSocket
return NULL;
}
- kernel_setsockopt(sockp, SOL_IP, IP_MTU_DISCOVER, (char *)&pmtu,
- sizeof(pmtu));
+ afs_linux_sock_set_mtu_discover(sockp, pmtu);
+
#ifdef AFS_RXERRQ_ENV
- {
- int recverr = 1;
- kernel_setsockopt(sockp, SOL_IP, IP_RECVERR, (char *)&recverr,
- sizeof(recverr));
- }
+ afs_linux_sock_set_recverr(sockp);
#endif
return (osi_socket *)sockp;
}