@@ -50,6 +50,133 @@ static int xid_map_find(netdissect_options *, const struct sunrpc_msg *, const u
50
50
static void interp_reply (netdissect_options * , const struct sunrpc_msg * , uint32_t , uint32_t , int );
51
51
static const uint32_t * parse_post_op_attr (netdissect_options * , const uint32_t * , int );
52
52
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
+
53
180
/*
54
181
* Mapping of old NFS Version 2 RPC numbers to generic numbers.
55
182
*/
@@ -572,15 +699,7 @@ nfsreq_noaddr_print(netdissect_options *ndo,
572
699
proc = GET_BE_U_4 (& rp -> rm_call .cb_proc );
573
700
574
701
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 ));
584
703
return ;
585
704
}
586
705
@@ -1131,6 +1250,24 @@ parsestatus(netdissect_options *ndo,
1131
1250
return (dp + 1 );
1132
1251
}
1133
1252
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
+
1134
1271
static const uint32_t *
1135
1272
parsefattr (netdissect_options * ndo ,
1136
1273
const uint32_t * dp , int verbose , int v3 )
@@ -1553,21 +1690,15 @@ interp_reply(netdissect_options *ndo,
1553
1690
int nfserr = 0 ;
1554
1691
1555
1692
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 ;
1564
1701
}
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 ;
1571
1702
return ;
1572
1703
}
1573
1704
0 commit comments