Subject: Re: kern/32318: NFS client or server hang
To: None <kern-bug-people@netbsd.org, gnats-admin@netbsd.org,>
From: Christos Zoulas <christos@zoulas.com>
List: netbsd-bugs
Date: 12/16/2005 19:30:02
The following reply was made to PR kern/32318; it has been noted by GNATS.

From: christos@zoulas.com (Christos Zoulas)
To: gnats-bugs@netbsd.org, kern-bug-people@netbsd.org,
	gnats-admin@netbsd.org, netbsd-bugs@netbsd.org
Cc: 
Subject: Re: kern/32318: NFS client or server hang
Date: Fri, 16 Dec 2005 14:28:49 -0500

 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.
  	 */