From 0ac9fe184a323fef212c421b844a45838f4d6e57 Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Mon, 10 Sep 2012 16:31:01 -0500 Subject: [PATCH] rx: Process all errors received 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 Reviewed-by: Derrick Brashear Reviewed-by: Chas Williams - CONTRACTOR Tested-by: BuildBot --- src/rx/LINUX/rx_knet.c | 24 ++++++++++++------------ src/rx/rx_user.c | 22 +++++----------------- 2 files changed, 17 insertions(+), 29 deletions(-) diff --git a/src/rx/LINUX/rx_knet.c b/src/rx/LINUX/rx_knet.c index 0dc2b6a..3dfe1de 100644 --- a/src/rx/LINUX/rx_knet.c +++ b/src/rx/LINUX/rx_knet.c @@ -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; } diff --git a/src/rx/rx_user.c b/src/rx/rx_user.c index be74a64..da265af 100644 --- a/src/rx/rx_user.c +++ b/src/rx/rx_user.c @@ -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 -- 1.9.4