Subject: Re: kern/32318: NFS client or server hang
To: None <gnats-bugs@netbsd.org, kern-bug-people@netbsd.org,>
From: Christos Zoulas <christos@zoulas.com>
List: netbsd-bugs
Date: 12/16/2005 14:28:49
On Dec 16,  7:00pm, bouyer@antioche.eu.org (Manuel Bouyer) wrote:
-- Subject: kern/32318: NFS client or server hang

| 	Before that the server sent a stream of
| 19:19:24.927421 IP chassiron.localhost.nfs > rochebonne.antioche.eu.org.1098072401: reply ERR 1460
| 	I'm not sure if it's normal or not (is this an error, or a normal
| 	reply to a read ?)
| 	It also looks like the client opened a second TCP connection at
| 	19:19:26.792149, maybe for the concurrent accesses ?

Well, lets find out what the error means... Here's a patch to parse the
rpc message rejection code. I have not tested it, but it should be close.
If it works, please commit it. We can then find out what kind of error
you are getting.

christos

Index: print-nfs.c
===================================================================
RCS file: /cvsroot/src/dist/tcpdump/print-nfs.c,v
retrieving revision 1.13
diff -u -u -r1.13 print-nfs.c
--- print-nfs.c	27 Sep 2004 23:04:24 -0000	1.13
+++ print-nfs.c	16 Dec 2005 19:27:26 -0000
@@ -1007,6 +1007,67 @@
 	len = EXTRACT_32BITS(&dp[1]);
 	if (len >= length)
 		return (NULL);
+
+	if (EXTRACT_32BITS(&rp->rm_reply.rp_stat) != MSG_ACCEPTED) {
+		enum reject_stat rstat;
+		rpcvers_t rlow;
+		rpcvers_t rhigh;
+		enum auth_stat rwhy;
+
+		rstat = EXTRACT_32BITS(dp);
+		switch (rstat) {
+		case RPC_MISMATCH:
+			dp += sizeof(u_int32_t);
+			rlow = EXTRACT_32BITS(dp);
+			dp += sizeof(u_int32_t);
+			rhigh = EXTRACT_32BITS(dp);
+			printf("RPC Version mismatch (%d-%d)\n",
+			    (int)rlow, (int)rhigh);
+			break;
+		case AUTH_ERROR:
+			dp += sizeof(u_int32_t);
+			rwhy = EXTRACT_32BITS(dp);
+			printf("Auth ");
+			switch (rwhy) {
+			case AUTH_OK:
+				printf("OK\n");
+				break;
+			case AUTH_BADCRED:
+				printf("Bogus Credentials (seal broken)\n");
+				break;
+			case AUTH_REJECTEDCRED:
+				printf("Rejected Credentials (client should "
+				    "begin new session)\n");
+				break;
+			case AUTH_BADVERF:
+				printf("Bogus Verifier (seal broken)\n");
+				break;
+			case AUTH_REJECTEDVERF:
+				printf("Verifier expired or was replayed\n");
+				break;
+			case AUTH_TOOWEAK:
+				printf("Credentials are too weak\n");
+				break;
+			case AUTH_INVALIDRESP:
+				printf("Bogus response verifier\n");
+				break;
+			case AUTH_FAILED:
+				printf("Unknown failure\n");
+				break;
+			default:
+				printf("Invalid failure code %d\n",
+				    (int)rwhy);
+				break;
+			}
+			break;
+		default:
+			printf("Unknown reason for rejecting rpc message %d\n",
+			    (int)rstat);
+			break;
+		}
+		return NULL;
+	}
+
 	/*
 	 * skip past the ar_verf credentials.
 	 */