rx: Process all errors received
authorAndrew Deason <adeason@sinenomine.net>
Mon, 10 Sep 2012 21:31:01 +0000 (16:31 -0500)
committerDerrick Brashear <shadow@your-file-system.com>
Thu, 18 Oct 2012 07:50:56 +0000 (00:50 -0700)
When we receive a buffer of errors from the error queue, loop through
all of them, and do not stop at the first applicable one we find.

Change-Id: Iad928e0489041b360fe705ac397836650b30091e
Reviewed-on: http://gerrit.openafs.org/8116
Reviewed-by: Simon Wilkinson <simonxwilkinson@gmail.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>
Reviewed-by: Chas Williams - CONTRACTOR <chas@cmf.nrl.navy.mil>
Tested-by: BuildBot <buildbot@rampaginggeek.com>

src/rx/LINUX/rx_knet.c
src/rx/rx_user.c

index 0dc2b6a..3dfe1de 100644 (file)
@@ -128,21 +128,21 @@ 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;
+       if (cmsg->cmsg_level != SOL_IP || cmsg->cmsg_type != IP_RECVERR) {
+           continue;
+       }
 
-    memcpy(&addr, offender, sizeof(addr));
+       err = CMSG_DATA(cmsg);
+       offender = SO_EE_OFFENDER(err);
 
-    rxi_ProcessNetError(err, addr.sin_addr.s_addr, addr.sin_port);
+       if (offender->sa_family != AF_INET) {
+           continue;
+       }
+
+       memcpy(&addr, offender, sizeof(addr));
+       rxi_ProcessNetError(err, addr.sin_addr.s_addr, addr.sin_port);
+    }
 
     return 1;
 }
index be74a64..da265af 100644 (file)
@@ -780,7 +780,6 @@ rx_SetMaxMTU(int mtu)
 int
 rxi_HandleSocketError(int socket)
 {
-    int ret = 0;
     struct msghdr msg;
     struct cmsghdr *cmsg;
     struct sock_extended_err *err;
@@ -798,26 +797,15 @@ rxi_HandleSocketError(int socket)
     code = recvmsg(socket, &msg, MSG_ERRQUEUE|MSG_DONTWAIT|MSG_TRUNC);
 
     if (code < 0 || !(msg.msg_flags & MSG_ERRQUEUE))
-        goto out;
+        return 0;
 
     for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
-       if ((char *)cmsg - controlmsgbuf > msg.msg_controllen - CMSG_SPACE(0) ||
-           (char *)cmsg - controlmsgbuf > msg.msg_controllen - CMSG_SPACE(cmsg->cmsg_len) ||
-          cmsg->cmsg_len == 0) {
-          cmsg = 0;
-           break;
+       if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR) {
+           err = (struct sock_extended_err *)CMSG_DATA(cmsg);
+           rxi_ProcessNetError(err, addr.sin_addr.s_addr, addr.sin_port);
        }
-        if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVERR)
-            break;
     }
-    if (!cmsg)
-        goto out;
-    ret = 1;
-    err = (struct sock_extended_err *) CMSG_DATA(cmsg);
 
-    rxi_ProcessNetError(err, addr.sin_addr.s_addr, addr.sin_port);
-
-out:
-    return ret;
+    return 1;
 }
 #endif