@@ -50,6 +50,133 @@ static int xid_map_find(netdissect_options *, const struct sunrpc_msg *, const u
5050static void interp_reply (netdissect_options * , const struct sunrpc_msg * , uint32_t , uint32_t , int );
5151static const uint32_t * parse_post_op_attr (netdissect_options * , const uint32_t * , int );
5252
53+ /*
54+ * NFS Version 4 Procedures.
55+ */
56+ static const struct tok nfsv4proc_str [] = {
57+ { NFSV4PROC_NULL , "null" },
58+ { NFSV4PROC_COMPOUND , "compound" },
59+ { 0 , NULL }
60+ };
61+
62+ static const struct tok status2strv4 [] = {
63+ /* RFC 7530 NFSv4 */
64+ { NFS4_OK , "NFS4_OK" },
65+ { NFS4ERR_PERM , "NFS4ERR_PERM" },
66+ { NFS4ERR_NOENT , "NFS4ERR_NOENT" },
67+ { NFS4ERR_IO , "NFS4ERR_IO" },
68+ { NFS4ERR_NXIO , "NFS4ERR_NXIO" },
69+ { NFS4ERR_ACCESS , "NFS4ERR_ACCESS" },
70+ { NFS4ERR_EXIST , "NFS4ERR_EXIST" },
71+ { NFS4ERR_XDEV , "NFS4ERR_XDEV" },
72+ { NFS4ERR_NOTDIR , "NFS4ERR_NOTDIR" },
73+ { NFS4ERR_ISDIR , "NFS4ERR_ISDIR" },
74+ { NFS4ERR_INVAL , "NFS4ERR_INVAL" },
75+ { NFS4ERR_FBIG , "NFS4ERR_FBIG" },
76+ { NFS4ERR_NOSPC , "NFS4ERR_NOSPC" },
77+ { NFS4ERR_ROFS , "NFS4ERR_ROFS" },
78+ { NFS4ERR_MLINK , "NFS4ERR_MLINK" },
79+ { NFS4ERR_NAMETOOLONG , "NFS4ERR_NAMETOOLONG" },
80+ { NFS4ERR_NOTEMPTY , "NFS4ERR_NOTEMPTY" },
81+ { NFS4ERR_DQUOT , "NFS4ERR_DQUOT" },
82+ { NFS4ERR_STALE , "NFS4ERR_STALE" },
83+ { NFS4ERR_BADHANDLE , "NFS4ERR_BADHANDLE" },
84+ { NFS4ERR_BAD_COOKIE , "NFS4ERR_BAD_COOKIE" },
85+ { NFS4ERR_NOTSUPP , "NFS4ERR_NOTSUPP" },
86+ { NFS4ERR_TOOSMALL , "NFS4ERR_TOOSMALL" },
87+ { NFS4ERR_SERVERFAULT , "NFS4ERR_SERVERFAULT" },
88+ { NFS4ERR_BADTYPE , "NFS4ERR_BADTYPE" },
89+ { NFS4ERR_DELAY , "NFS4ERR_DELAY" },
90+ { NFS4ERR_SAME , "NFS4ERR_SAME" },
91+ { NFS4ERR_DENIED , "NFS4ERR_DENIED" },
92+ { NFS4ERR_EXPIRED , "NFS4ERR_EXPIRED" },
93+ { NFS4ERR_LOCKED , "NFS4ERR_LOCKED" },
94+ { NFS4ERR_GRACE , "NFS4ERR_GRACE" },
95+ { NFS4ERR_FHEXPIRED , "NFS4ERR_FHEXPIRED" },
96+ { NFS4ERR_SHARE_DENIED , "NFS4ERR_SHARE_DENIED" },
97+ { NFS4ERR_WRONGSEC , "NFS4ERR_WRONGSEC" },
98+ { NFS4ERR_CLID_INUSE , "NFS4ERR_CLID_INUSE" },
99+ { NFS4ERR_RESOURCE , "NFS4ERR_RESOURCE" },
100+ { NFS4ERR_MOVED , "NFS4ERR_MOVED" },
101+ { NFS4ERR_NOFILEHANDLE , "NFS4ERR_NOFILEHANDLE" },
102+ { NFS4ERR_MINOR_VERS_MISMATCH , "NFS4ERR_MINOR_VERS_MISMATCH" },
103+ { NFS4ERR_STALE_CLIENTID , "NFS4ERR_STALE_CLIENTID" },
104+ { NFS4ERR_STALE_STATEID , "NFS4ERR_STALE_STATEID" },
105+ { NFS4ERR_OLD_STATEID , "NFS4ERR_OLD_STATEID" },
106+ { NFS4ERR_BAD_STATEID , "NFS4ERR_BAD_STATEID" },
107+ { NFS4ERR_BAD_SEQID , "NFS4ERR_BAD_SEQID" },
108+ { NFS4ERR_NOT_SAME , "NFS4ERR_NOT_SAME" },
109+ { NFS4ERR_LOCK_RANGE , "NFS4ERR_LOCK_RANGE" },
110+ { NFS4ERR_SYMLINK , "NFS4ERR_SYMLINK" },
111+ { NFS4ERR_RESTOREFH , "NFS4ERR_RESTOREFH" },
112+ { NFS4ERR_LEASE_MOVED , "NFS4ERR_LEASE_MOVED" },
113+ { NFS4ERR_ATTRNOTSUPP , "NFS4ERR_ATTRNOTSUPP" },
114+ { NFS4ERR_NO_GRACE , "NFS4ERR_NO_GRACE" },
115+ { NFS4ERR_RECLAIM_BAD , "NFS4ERR_RECLAIM_BAD" },
116+ { NFS4ERR_RECLAIM_CONFLICT , "NFS4ERR_RECLAIM_CONFLICT" },
117+ { NFS4ERR_BADXDR , "NFS4ERR_BADXDR" },
118+ { NFS4ERR_LOCKS_HELD , "NFS4ERR_LOCKS_HELD" },
119+ { NFS4ERR_OPENMODE , "NFS4ERR_OPENMODE" },
120+ { NFS4ERR_BADOWNER , "NFS4ERR_BADOWNER" },
121+ { NFS4ERR_BADCHAR , "NFS4ERR_BADCHAR" },
122+ { NFS4ERR_BADNAME , "NFS4ERR_BADNAME" },
123+ { NFS4ERR_BAD_RANGE , "NFS4ERR_BAD_RANGE" },
124+ { NFS4ERR_LOCK_NOTSUPP , "NFS4ERR_LOCK_NOTSUPP" },
125+ { NFS4ERR_OP_ILLEGAL , "NFS4ERR_OP_ILLEGAL" },
126+ { NFS4ERR_DEADLOCK , "NFS4ERR_DEADLOCK" },
127+ { NFS4ERR_FILE_OPEN , "NFS4ERR_FILE_OPEN" },
128+ { NFS4ERR_ADMIN_REVOKED , "NFS4ERR_ADMIN_REVOKED" },
129+ { NFS4ERR_CB_PATH_DOWN , "NFS4ERR_CB_PATH_DOWN" },
130+ /* RFC 8881 NFSv4.1 */
131+ { NFS4ERR_BADIOMODE , "NFS4ERR_BADIOMODE" },
132+ { NFS4ERR_BADLAYOUT , "NFS4ERR_BADLAYOUT" },
133+ { NFS4ERR_BAD_SESSION_DIGEST , "NFS4ERR_BAD_SESSION_DIGEST" },
134+ { NFS4ERR_BADSESSION , "NFS4ERR_BADSESSION" },
135+ { NFS4ERR_BADSLOT , "NFS4ERR_BADSLOT" },
136+ { NFS4ERR_COMPLETE_ALREADY , "NFS4ERR_COMPLETE_ALREADY" },
137+ { NFS4ERR_CONN_NOT_BOUND_TO_SESSION , "NFS4ERR_CONN_NOT_BOUND_TO_SESSION" },
138+ { NFS4ERR_DELEG_ALREADY_WANTED , "NFS4ERR_DELEG_ALREADY_WANTED" },
139+ { NFS4ERR_BACK_CHAN_BUSY , "NFS4ERR_BACK_CHAN_BUSY" },
140+ { NFS4ERR_LAYOUTTRYLATER , "NFS4ERR_LAYOUTTRYLATER" },
141+ { NFS4ERR_LAYOUTUNAVAILABLE , "NFS4ERR_LAYOUTUNAVAILABLE" },
142+ { NFS4ERR_NOMATCHING_LAYOUT , "NFS4ERR_NOMATCHING_LAYOUT" },
143+ { NFS4ERR_RECALLCONFLICT , "NFS4ERR_RECALLCONFLICT" },
144+ { NFS4ERR_UNKNOWN_LAYOUTTYPE , "NFS4ERR_UNKNOWN_LAYOUTTYPE" },
145+ { NFS4ERR_SEQ_MISORDERED , "NFS4ERR_SEQ_MISORDERED" },
146+ { NFS4ERR_SEQUENCE_POS , "NFS4ERR_SEQUENCE_POS" },
147+ { NFS4ERR_REQ_TOO_BIG , "NFS4ERR_REQ_TOO_BIG" },
148+ { NFS4ERR_REP_TOO_BIG , "NFS4ERR_REP_TOO_BIG" },
149+ { NFS4ERR_REP_TOO_BIG_TO_CACHE , "NFS4ERR_REP_TOO_BIG_TO_CACHE" },
150+ { NFS4ERR_RETRY_UNCACHED_REP , "NFS4ERR_RETRY_UNCACHED_REP" },
151+ { NFS4ERR_UNSAFE_COMPOUND , "NFS4ERR_UNSAFE_COMPOUND" },
152+ { NFS4ERR_TOO_MANY_OPS , "NFS4ERR_TOO_MANY_OPS" },
153+ { NFS4ERR_OP_NOT_IN_SESSION , "NFS4ERR_OP_NOT_IN_SESSION" },
154+ { NFS4ERR_HASH_ALG_UNSUPP , "NFS4ERR_HASH_ALG_UNSUPP" },
155+ { NFS4ERR_CLIENTID_BUSY , "NFS4ERR_CLIENTID_BUSY" },
156+ { NFS4ERR_PNFS_IO_HOLE , "NFS4ERR_PNFS_IO_HOLE" },
157+ { NFS4ERR_SEQ_FALSE_RETRY , "NFS4ERR_SEQ_FALSE_RETRY" },
158+ { NFS4ERR_BAD_HIGH_SLOT , "NFS4ERR_BAD_HIGH_SLOT" },
159+ { NFS4ERR_DEADSESSION , "NFS4ERR_DEADSESSION" },
160+ { NFS4ERR_ENCR_ALG_UNSUPP , "NFS4ERR_ENCR_ALG_UNSUPP" },
161+ { NFS4ERR_PNFS_NO_LAYOUT , "NFS4ERR_PNFS_NO_LAYOUT" },
162+ { NFS4ERR_NOT_ONLY_OP , "NFS4ERR_NOT_ONLY_OP" },
163+ { NFS4ERR_WRONG_CRED , "NFS4ERR_WRONG_CRED" },
164+ { NFS4ERR_WRONG_TYPE , "NFS4ERR_WRONG_TYPE" },
165+ { NFS4ERR_DIRDELEG_UNAVAIL , "NFS4ERR_DIRDELEG_UNAVAIL" },
166+ { NFS4ERR_REJECT_DELEG , "NFS4ERR_REJECT_DELEG" },
167+ { NFS4ERR_RETURNCONFLICT , "NFS4ERR_RETURNCONFLICT" },
168+ { NFS4ERR_DELEG_REVOKED , "NFS4ERR_DELEG_REVOKED" },
169+ /* RFC 7862 NFSv4.2 */
170+ { NFS4ERR_PARTNER_NOTSUPP , "NFS4ERR_PARTNER_NOTSUPP" },
171+ { NFS4ERR_PARTNER_NO_AUTH , "NFS4ERR_PARTNER_NO_AUTH" },
172+ { NFS4ERR_UNION_NOTSUPP , "NFS4ERR_UNION_NOTSUPP" },
173+ { NFS4ERR_OFFLOAD_DENIED , "NFS4ERR_OFFLOAD_DENIED" },
174+ { NFS4ERR_WRONG_LFS , "NFS4ERR_WRONG_LFS" },
175+ { NFS4ERR_BADLABEL , "NFS4ERR_BADLABEL" },
176+ { NFS4ERR_OFFLOAD_NO_REQS , "NFS4ERR_OFFLOAD_NO_REQS" },
177+ { 0 , NULL }
178+ };
179+
53180/*
54181 * Mapping of old NFS Version 2 RPC numbers to generic numbers.
55182 */
@@ -572,15 +699,7 @@ nfsreq_noaddr_print(netdissect_options *ndo,
572699 proc = GET_BE_U_4 (& rp -> rm_call .cb_proc );
573700
574701 if (GET_BE_U_4 (& rp -> rm_call .cb_vers ) == NFS_VER4 ) {
575- ND_PRINT (" v4" );
576- switch (proc ) {
577- case 0 :
578- ND_PRINT (" null" );
579- break ;
580- case 1 :
581- ND_PRINT (" compound" );
582- break ;
583- }
702+ ND_PRINT (" v4 %s" , tok2str (nfsv4proc_str , "proc-%u" , proc ));
584703 return ;
585704 }
586705
@@ -1131,6 +1250,24 @@ parsestatus(netdissect_options *ndo,
11311250 return (dp + 1 );
11321251}
11331252
1253+ static const uint32_t *
1254+ parsestatusv4 (netdissect_options * ndo ,
1255+ const uint32_t * dp , u_int * er , int * nfserrp )
1256+ {
1257+ u_int errnum ;
1258+
1259+ errnum = GET_BE_U_4 (dp );
1260+ if (er )
1261+ * er = errnum ;
1262+ if (errnum != NFS4_OK ) {
1263+ if (!ndo -> ndo_qflag )
1264+ ND_PRINT (" ERROR: %s" ,
1265+ tok2str (status2strv4 , "unk %u" , errnum ));
1266+ * nfserrp = 1 ;
1267+ }
1268+ return (dp + 1 );
1269+ }
1270+
11341271static const uint32_t *
11351272parsefattr (netdissect_options * ndo ,
11361273 const uint32_t * dp , int verbose , int v3 )
@@ -1553,21 +1690,15 @@ interp_reply(netdissect_options *ndo,
15531690 int nfserr = 0 ;
15541691
15551692 if (vers == NFS_VER4 ) {
1556- ND_PRINT (" v4" );
1557- switch (proc ) {
1558- case 0 :
1559- ND_PRINT ( " null" );
1560- break ;
1561- case 1 :
1562- ND_PRINT ( " compound" );
1563- break ;
1693+ ND_PRINT (" v4 %s" , tok2str ( nfsv4proc_str , "proc-%u" , proc ) );
1694+ if (proc == NFSV4PROC_COMPOUND ) {
1695+ dp = parserep ( ndo , rp , length , & nfserr );
1696+ if ( dp == NULL )
1697+ goto trunc ;
1698+ dp = parsestatusv4 ( ndo , dp , & er , & nfserr );
1699+ if ( dp == NULL )
1700+ goto trunc ;
15641701 }
1565- dp = parserep (ndo , rp , length , & nfserr );
1566- if (dp == NULL )
1567- goto trunc ;
1568- dp = parsestatus (ndo , dp , & er , & nfserr );
1569- if (dp == NULL )
1570- goto trunc ;
15711702 return ;
15721703 }
15731704
0 commit comments