rx: For AFS_RXERRQ_ENV, retry sendmsg on error
[openafs.git] / src / rx / LINUX / rx_knet.c
index ec1cd60..42444e5 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,7 +51,9 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     int pmtu = IP_PMTUDISC_DONT;
 #endif
 
-#ifdef HAVE_LINUX_SOCK_CREATE_KERN
+#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);
@@ -70,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;
 }
@@ -97,8 +98,8 @@ rxk_FreeSocket(struct socket *asocket)
 }
 
 #ifdef AFS_RXERRQ_ENV
-static int
-osi_HandleSocketError(osi_socket so, char *cmsgbuf, size_t cmsgbuf_len)
+int
+osi_HandleSocketError(osi_socket so, void *cmsgbuf, size_t cmsgbuf_len)
 {
     struct msghdr msg;
     struct cmsghdr *cmsg;
@@ -139,26 +140,6 @@ osi_HandleSocketError(osi_socket so, char *cmsgbuf, size_t cmsgbuf_len)
 }
 #endif
 
-static void
-do_handlesocketerror(osi_socket so)
-{
-#ifdef AFS_RXERRQ_ENV
-    char *cmsgbuf;
-    size_t cmsgbuf_len;
-
-    cmsgbuf_len = 256;
-    cmsgbuf = rxi_Alloc(cmsgbuf_len);
-    if (!cmsgbuf) {
-       return;
-    }
-
-    while (osi_HandleSocketError(so, cmsgbuf, cmsgbuf_len))
-       ;
-
-    rxi_Free(cmsgbuf, cmsgbuf_len);
-#endif
-}
-
 /* osi_NetSend
  *
  * Return codes:
@@ -181,10 +162,6 @@ osi_NetSend(osi_socket sop, struct sockaddr_in *to, struct iovec *iovec,
 
     code = kernel_sendmsg(sop, &msg, (struct kvec *) iovec, iovcnt, size);
 
-    if (code < 0) {
-       do_handlesocketerror(sop);
-    }
-
     return (code < 0) ? code : 0;
 }
 
@@ -249,7 +226,7 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *from, struct iovec *iov,
        rxk_lastSocketError = code;
        rxk_nSocketErrors++;
 
-       do_handlesocketerror(so);
+       rxi_HandleSocketErrors(so);
     } else {
        *lengthp = code;
        code = 0;
@@ -266,7 +243,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;