LINUX 5.8: Replace kernel_setsockopt with new funcs
[openafs.git] / src / rx / LINUX / rx_knet.c
index 143a93d..50607c8 100644 (file)
 #include "rx_peer.h"
 #include "rx_packet.h"
 #include "rx_internal.h"
+#if defined(HAVE_LINUX_UACCESS_H)
+#include <linux/uaccess.h>
+#else
 #include <asm/uaccess.h>
+#endif
 #ifdef AFS_RXERRQ_ENV
 #include <linux/errqueue.h>
 #include <linux/icmp.h>
 #endif
-
 #include "osi_compat.h"
 
 /* rxk_NewSocket
@@ -48,10 +51,11 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     int pmtu = IP_PMTUDISC_DONT;
 #endif
 
-    /* We need a better test for this. if you need it back, tell us
-     * how to detect it. 
-     */
-#ifdef LINUX_KERNEL_SOCK_CREATE_V
+#ifdef HAVE_LINUX_SOCK_CREATE_KERN_NS
+    code = sock_create_kern(&init_net, AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sockp);
+#elif defined(HAVE_LINUX_SOCK_CREATE_KERN)
+    code = sock_create_kern(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sockp);
+#elif defined(LINUX_KERNEL_SOCK_CREATE_V)
     code = sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sockp, 0);
 #else
     code = sock_create(AF_INET, SOCK_DGRAM, IPPROTO_UDP, &sockp);
@@ -71,14 +75,10 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
        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;
 }
@@ -105,7 +105,6 @@ osi_HandleSocketError(osi_socket so, char *cmsgbuf, size_t cmsgbuf_len)
     struct cmsghdr *cmsg;
     struct sock_extended_err *err;
     struct sockaddr_in addr;
-    struct sockaddr *offender;
     int code;
     struct socket *sop = (struct socket *)so;
 
@@ -128,28 +127,23 @@ osi_HandleSocketError(osi_socket so, char *cmsgbuf, size_t cmsgbuf_len)
 
     for (cmsg = CMSG_FIRSTHDR(&msg); cmsg && CMSG_OK(&msg, cmsg);
          cmsg = CMSG_NXTHDR(&msg, cmsg)) {
-       if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR)
-           break;
-    }
-    if (!cmsg)
-       return 0;
-
-    err = CMSG_DATA(cmsg);
-    offender = SO_EE_OFFENDER(err);
-    
-    if (offender->sa_family != AF_INET)
-       return 1;
 
-    memcpy(&addr, offender, sizeof(addr));
+       if (cmsg->cmsg_level != SOL_IP || cmsg->cmsg_type != IP_RECVERR) {
+           continue;
+       }
 
-    rxi_ProcessNetError(err, addr.sin_addr.s_addr, addr.sin_port);
+       err = CMSG_DATA(cmsg);
+       rxi_ProcessNetError(err, addr.sin_addr.s_addr, addr.sin_port);
+    }
 
     return 1;
 }
+#endif
 
 static void
 do_handlesocketerror(osi_socket so)
 {
+#ifdef AFS_RXERRQ_ENV
     char *cmsgbuf;
     size_t cmsgbuf_len;
 
@@ -163,8 +157,8 @@ do_handlesocketerror(osi_socket so)
        ;
 
     rxi_Free(cmsgbuf, cmsgbuf_len);
-}
 #endif
+}
 
 /* osi_NetSend
  *
@@ -188,11 +182,9 @@ osi_NetSend(osi_socket sop, struct sockaddr_in *to, struct iovec *iovec,
 
     code = kernel_sendmsg(sop, &msg, (struct kvec *) iovec, iovcnt, size);
 
-#ifdef AFS_RXERRQ_ENV
     if (code < 0) {
        do_handlesocketerror(sop);
     }
-#endif
 
     return (code < 0) ? code : 0;
 }
@@ -234,8 +226,13 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *from, struct iovec *iov,
 
     memcpy(tmpvec, iov, iovcnt * sizeof(struct iovec));
     msg.msg_name = from;
+#if defined(STRUCT_MSGHDR_HAS_MSG_ITER)
+    msg.msg_iter.iov = tmpvec;
+    msg.msg_iter.nr_segs = iovcnt;
+#else
     msg.msg_iov = tmpvec;
     msg.msg_iovlen = iovcnt;
+#endif
     msg.msg_control = NULL;
     msg.msg_controllen = 0;
     msg.msg_flags = 0;
@@ -253,9 +250,7 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *from, struct iovec *iov,
        rxk_lastSocketError = code;
        rxk_nSocketErrors++;
 
-#ifdef AFS_RXERRQ_ENV
        do_handlesocketerror(so);
-#endif
     } else {
        *lengthp = code;
        code = 0;
@@ -272,7 +267,7 @@ osi_StopListener(void)
     while (rxk_ListenerTask) {
         if (rxk_ListenerTask) {
            flush_signals(rxk_ListenerTask);
-           force_sig(SIGKILL, rxk_ListenerTask);
+           send_sig(SIGKILL, rxk_ListenerTask, 1);
        }
        if (!rxk_ListenerTask)
            break;