- rp = (const struct rpc_msg *)bp;
- ip = (const struct ip *)bp2;
-
- if (!nflag)
- (void)printf("%s.nfs > %s.%u: reply %s %d",
- ipaddr_string(&ip->ip_src),
- ipaddr_string(&ip->ip_dst),
- (u_int32_t)ntohl(rp->rm_xid),
- ntohl(rp->rm_reply.rp_stat) == MSG_ACCEPTED?
- "ok":"ERR",
- length);
- else
- (void)printf("%s.%u > %s.%u: reply %s %d",
- ipaddr_string(&ip->ip_src),
- NFS_PORT,
- ipaddr_string(&ip->ip_dst),
- (u_int32_t)ntohl(rp->rm_xid),
- ntohl(rp->rm_reply.rp_stat) == MSG_ACCEPTED?
- "ok":"ERR",
- length);
-
- if (xid_map_find(rp, ip, &proc, &vers) >= 0)
- interp_reply(rp, proc, vers, length);
+ rp = (const struct sunrpc_msg *)bp;
+
+ ND_TCHECK(rp->rm_xid);
+ if (!ndo->ndo_nflag) {
+ strlcpy(srcid, "nfs", sizeof(srcid));
+ snprintf(dstid, sizeof(dstid), "%u",
+ EXTRACT_32BITS(&rp->rm_xid));
+ } else {
+ snprintf(srcid, sizeof(srcid), "%u", NFS_PORT);
+ snprintf(dstid, sizeof(dstid), "%u",
+ EXTRACT_32BITS(&rp->rm_xid));
+ }
+ print_nfsaddr(ndo, bp2, srcid, dstid);
+
+ nfsreply_print_noaddr(ndo, bp, length, bp2);
+ return;
+
+trunc:
+ if (!nfserr)
+ ND_PRINT((ndo, "%s", tstr));
+}
+
+void
+nfsreply_print_noaddr(netdissect_options *ndo,
+ register const u_char *bp, u_int length,
+ register const u_char *bp2)
+{
+ register const struct sunrpc_msg *rp;
+ u_int32_t proc, vers, reply_stat;
+ enum sunrpc_reject_stat rstat;
+ u_int32_t rlow;
+ u_int32_t rhigh;
+ enum sunrpc_auth_stat rwhy;
+
+ nfserr = 0; /* assume no error */
+ rp = (const struct sunrpc_msg *)bp;
+
+ ND_TCHECK(rp->rm_reply.rp_stat);
+ reply_stat = EXTRACT_32BITS(&rp->rm_reply.rp_stat);
+ switch (reply_stat) {
+
+ case SUNRPC_MSG_ACCEPTED:
+ ND_PRINT((ndo, "reply ok %u", length));
+ if (xid_map_find(rp, bp2, &proc, &vers) >= 0)
+ interp_reply(ndo, rp, proc, vers, length);
+ break;
+
+ case SUNRPC_MSG_DENIED:
+ ND_PRINT((ndo, "reply ERR %u: ", length));
+ ND_TCHECK(rp->rm_reply.rp_reject.rj_stat);
+ rstat = EXTRACT_32BITS(&rp->rm_reply.rp_reject.rj_stat);
+ switch (rstat) {
+
+ case SUNRPC_RPC_MISMATCH:
+ ND_TCHECK(rp->rm_reply.rp_reject.rj_vers.high);
+ rlow = EXTRACT_32BITS(&rp->rm_reply.rp_reject.rj_vers.low);
+ rhigh = EXTRACT_32BITS(&rp->rm_reply.rp_reject.rj_vers.high);
+ ND_PRINT((ndo, "RPC Version mismatch (%u-%u)", rlow, rhigh));
+ break;
+
+ case SUNRPC_AUTH_ERROR:
+ ND_TCHECK(rp->rm_reply.rp_reject.rj_why);
+ rwhy = EXTRACT_32BITS(&rp->rm_reply.rp_reject.rj_why);
+ ND_PRINT((ndo, "Auth "));
+ switch (rwhy) {
+
+ case SUNRPC_AUTH_OK:
+ ND_PRINT((ndo, "OK"));
+ break;
+
+ case SUNRPC_AUTH_BADCRED:
+ ND_PRINT((ndo, "Bogus Credentials (seal broken)"));
+ break;
+
+ case SUNRPC_AUTH_REJECTEDCRED:
+ ND_PRINT((ndo, "Rejected Credentials (client should begin new session)"));
+ break;
+
+ case SUNRPC_AUTH_BADVERF:
+ ND_PRINT((ndo, "Bogus Verifier (seal broken)"));
+ break;
+
+ case SUNRPC_AUTH_REJECTEDVERF:
+ ND_PRINT((ndo, "Verifier expired or was replayed"));
+ break;
+
+ case SUNRPC_AUTH_TOOWEAK:
+ ND_PRINT((ndo, "Credentials are too weak"));
+ break;
+
+ case SUNRPC_AUTH_INVALIDRESP:
+ ND_PRINT((ndo, "Bogus response verifier"));
+ break;
+
+ case SUNRPC_AUTH_FAILED:
+ ND_PRINT((ndo, "Unknown failure"));
+ break;
+
+ default:
+ ND_PRINT((ndo, "Invalid failure code %u", (unsigned int)rwhy));
+ break;
+ }
+ break;
+
+ default:
+ ND_PRINT((ndo, "Unknown reason for rejecting rpc message %u", (unsigned int)rstat));
+ break;
+ }
+ break;
+
+ default:
+ ND_PRINT((ndo, "reply Unknown rpc response code=%u %u", reply_stat, length));
+ break;
+ }
+ return;
+
+trunc:
+ if (!nfserr)
+ ND_PRINT((ndo, "%s", tstr));