- print_nfsaddr(bp2, srcid, dstid);
- (void)printf("reply %s %d",
- EXTRACT_32BITS(&rp->rm_reply.rp_stat) == SUNRPC_MSG_ACCEPTED?
- "ok":"ERR",
- length);
-
- if (xid_map_find(rp, bp2, &proc, &vers) >= 0)
- interp_reply(rp, proc, vers, length);
+ print_nfsaddr(ndo, bp2, srcid, dstid);
+
+ nfsreply_noaddr_print(ndo, bp, length, bp2);
+}
+
+void
+nfsreply_noaddr_print(netdissect_options *ndo,
+ const u_char *bp, u_int length,
+ const u_char *bp2)
+{
+ const struct sunrpc_msg *rp;
+ uint32_t proc, vers, reply_stat;
+ enum sunrpc_reject_stat rstat;
+ uint32_t rlow;
+ uint32_t rhigh;
+ enum sunrpc_auth_stat rwhy;
+
+ ndo->ndo_protocol = "nfs";
+ rp = (const struct sunrpc_msg *)bp;
+
+ ND_TCHECK_4(rp->rm_reply.rp_stat);
+ reply_stat = GET_BE_U_4(&rp->rm_reply.rp_stat);
+ switch (reply_stat) {
+
+ case SUNRPC_MSG_ACCEPTED:
+ ND_PRINT("reply ok %u", length);
+ if (xid_map_find(ndo, rp, bp2, &proc, &vers) >= 0)
+ interp_reply(ndo, rp, proc, vers, length);
+ break;
+
+ case SUNRPC_MSG_DENIED:
+ ND_PRINT("reply ERR %u: ", length);
+ ND_TCHECK_4(rp->rm_reply.rp_reject.rj_stat);
+ rstat = GET_BE_U_4(&rp->rm_reply.rp_reject.rj_stat);
+ switch (rstat) {
+
+ case SUNRPC_RPC_MISMATCH:
+ ND_TCHECK_4(rp->rm_reply.rp_reject.rj_vers.high);
+ rlow = GET_BE_U_4(&rp->rm_reply.rp_reject.rj_vers.low);
+ rhigh = GET_BE_U_4(&rp->rm_reply.rp_reject.rj_vers.high);
+ ND_PRINT("RPC Version mismatch (%u-%u)", rlow, rhigh);
+ break;
+
+ case SUNRPC_AUTH_ERROR:
+ ND_TCHECK_4(rp->rm_reply.rp_reject.rj_why);
+ rwhy = GET_BE_U_4(&rp->rm_reply.rp_reject.rj_why);
+ ND_PRINT("Auth %s", tok2str(sunrpc_auth_str, "Invalid failure code %u", rwhy));
+ break;
+
+ default:
+ ND_PRINT("Unknown reason for rejecting rpc message %u", (unsigned int)rstat);
+ break;
+ }
+ break;
+
+ default:
+ ND_PRINT("reply Unknown rpc response code=%u %u", reply_stat, length);
+ break;
+ }
+ return;
+
+trunc:
+ nd_print_trunc(ndo);