linux rx pmtu fixes
[openafs.git] / src / rx / LINUX / rx_knet.c
index d670a83..9005959 100644 (file)
@@ -25,6 +25,8 @@
 #include <linux/icmp.h>
 #endif
 
+#include "osi_compat.h"
+
 /* rxk_NewSocket
  * open and bind RX socket
  */
@@ -34,7 +36,6 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
     struct socket *sockp;
     struct sockaddr_in myaddr;
     int code;
-    KERNEL_SPACE_DECL;
 #ifdef ADAPT_PMTU
     int pmtu = IP_PMTUDISC_WANT;
     int do_recverr = 1;
@@ -65,14 +66,12 @@ rxk_NewSocketHost(afs_uint32 ahost, short aport)
        return NULL;
     }
 
-    TO_USER_SPACE();
-    sockp->ops->setsockopt(sockp, SOL_IP, IP_MTU_DISCOVER, (char *)&pmtu,
-                           sizeof(pmtu));
+    kernel_setsockopt(sockp, SOL_IP, IP_MTU_DISCOVER, (char *)&pmtu,
+                     sizeof(pmtu));
 #ifdef ADAPT_PMTU
-    sockp->ops->setsockopt(sockp, SOL_IP, IP_RECVERR, (char *)&do_recverr,
-                           sizeof(do_recverr));
+    kernel_setsockopt(sockp, SOL_IP, IP_RECVERR, (char *)&do_recverr,
+                      sizeof(do_recverr));
 #endif
-    TO_KERNEL_SPACE();
     return (osi_socket *)sockp;
 }
 
@@ -94,7 +93,6 @@ rxk_FreeSocket(struct socket *asocket)
 void
 handle_socket_error(osi_socket so)
 {
-    KERNEL_SPACE_DECL;
     struct msghdr msg;
     struct cmsghdr *cmsg;
     struct sock_extended_err *err;
@@ -108,15 +106,12 @@ handle_socket_error(osi_socket so)
        return;
     msg.msg_name = &addr;
     msg.msg_namelen = sizeof(addr);
-    msg.msg_iov = NULL;
-    msg.msg_iovlen = 0;
     msg.msg_control = controlmsgbuf;
     msg.msg_controllen = 256;
     msg.msg_flags = 0;
 
-    TO_USER_SPACE();
-    code = sock_recvmsg(sop, &msg, 256, MSG_ERRQUEUE|MSG_DONTWAIT|MSG_TRUNC);
-    TO_KERNEL_SPACE();
+    code = kernel_recvmsg(sop, &msg, NULL, 0, 256,
+                         MSG_ERRQUEUE|MSG_DONTWAIT|MSG_TRUNC);
 
     if (code < 0 || !(msg.msg_flags & MSG_ERRQUEUE))
        goto out;
@@ -139,7 +134,7 @@ handle_socket_error(osi_socket so)
     if (err->ee_origin == SO_EE_ORIGIN_ICMP &&
        err->ee_type == ICMP_DEST_UNREACH &&
        err->ee_code == ICMP_FRAG_NEEDED) {
-       rxi_SetPeerMtu(ntohl(addr.sin_addr.s_addr), ntohs(addr.sin_port),
+       rxi_SetPeerMtu(NULL, ntohl(addr.sin_addr.s_addr), ntohs(addr.sin_port),
                       err->ee_info);
     }
     /* other DEST_UNREACH's and TIME_EXCEEDED should be dealt with too */
@@ -160,7 +155,6 @@ int
 osi_NetSend(osi_socket sop, struct sockaddr_in *to, struct iovec *iovec,
            int iovcnt, afs_int32 size, int istack)
 {
-    KERNEL_SPACE_DECL;
     struct msghdr msg;
     int code;
 #ifdef ADAPT_PMTU
@@ -170,27 +164,20 @@ osi_NetSend(osi_socket sop, struct sockaddr_in *to, struct iovec *iovec,
     while (1) {
        sockerr=0;
        esize = sizeof(sockerr);
-       TO_USER_SPACE();
-       sop->ops->getsockopt(sop, SOL_SOCKET, SO_ERROR, (char *)&sockerr,
-                          &esize);
-       TO_KERNEL_SPACE();
+       kernel_getsockopt(sop, SOL_SOCKET, SO_ERROR, (char *)&sockerr, &esize);
        if (sockerr == 0)
           break;
        handle_socket_error(sop);
     }
 #endif
 
-    msg.msg_iovlen = iovcnt;
-    msg.msg_iov = iovec;
     msg.msg_name = to;
     msg.msg_namelen = sizeof(*to);
     msg.msg_control = NULL;
     msg.msg_controllen = 0;
     msg.msg_flags = 0;
 
-    TO_USER_SPACE();
-    code = sock_sendmsg(sop, &msg, size);
-    TO_KERNEL_SPACE();
+    code = kernel_sendmsg(sop, &msg, (struct kvec *) iovec, iovcnt, size);
     return (code < 0) ? code : 0;
 }
 
@@ -220,7 +207,6 @@ int
 osi_NetReceive(osi_socket so, struct sockaddr_in *from, struct iovec *iov,
               int iovcnt, int *lengthp)
 {
-    KERNEL_SPACE_DECL;
     struct msghdr msg;
     int code;
 #ifdef ADAPT_PMTU
@@ -237,10 +223,7 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *from, struct iovec *iov,
     while (1) {
        sockerr=0;
        esize = sizeof(sockerr);
-       TO_USER_SPACE();
-       sop->ops->getsockopt(sop, SOL_SOCKET, SO_ERROR, (char *)&sockerr,
-                          &esize);
-       TO_KERNEL_SPACE();
+       kernel_getsockopt(sop, SOL_SOCKET, SO_ERROR, (char *)&sockerr, &esize);
        if (sockerr == 0)
           break;
        handle_socket_error(so);
@@ -254,34 +237,10 @@ osi_NetReceive(osi_socket so, struct sockaddr_in *from, struct iovec *iov,
     msg.msg_controllen = 0;
     msg.msg_flags = 0;
 
-    TO_USER_SPACE();
-    code = sock_recvmsg(sop, &msg, *lengthp, 0);
-    TO_KERNEL_SPACE();
-
+    code = kernel_recvmsg(sop, &msg, (struct kvec *)tmpvec, iovcnt,
+                         *lengthp, 0);
     if (code < 0) {
-#ifdef CONFIG_PM
-       if (
-# ifdef PF_FREEZE
-           current->flags & PF_FREEZE
-# else
-#  if defined(STRUCT_TASK_STRUCT_HAS_TODO)
-           !current->todo
-#  else
-#   if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO)
-            test_ti_thread_flag(current->thread_info, TIF_FREEZE)
-#   else
-            test_ti_thread_flag(task_thread_info(current), TIF_FREEZE)
-#   endif
-#  endif
-# endif
-           )
-# ifdef LINUX_REFRIGERATOR_TAKES_PF_FREEZE
-           refrigerator(PF_FREEZE);
-# else
-           refrigerator();
-# endif
-           set_current_state(TASK_INTERRUPTIBLE);
-#endif
+       afs_try_to_freeze();
 
        /* Clear the error before using the socket again.
         * Oh joy, Linux has hidden header files as well. It appears we can