diff options
-rw-r--r-- | epan/dissectors/packet-nfs.c | 1095 | ||||
-rw-r--r-- | epan/dissectors/packet-nfs.h | 17 |
2 files changed, 1104 insertions, 8 deletions
diff --git a/epan/dissectors/packet-nfs.c b/epan/dissectors/packet-nfs.c index 9f82ddee56..862b3ce259 100644 --- a/epan/dissectors/packet-nfs.c +++ b/epan/dissectors/packet-nfs.c @@ -46,6 +46,7 @@ static int hf_nfs_procedure_v2 = -1; static int hf_nfs_procedure_v3 = -1; static int hf_nfs_procedure_v4 = -1; static int hf_nfs_fh_length = -1; +static int hf_nfs_impl_id4_len = -1; static int hf_nfs_fh_hash = -1; static int hf_nfs_fh_fhandle_data = -1; static int hf_nfs_fh_mount_fileid = -1; @@ -242,6 +243,7 @@ static int hf_nfs_ace4 = -1; static int hf_nfs_recall = -1; static int hf_nfs_open_claim_type4 = -1; static int hf_nfs_opentype4 = -1; +static int hf_nfs_state_protect_how4 = -1; static int hf_nfs_limit_by4 = -1; static int hf_nfs_open_delegation_type4 = -1; static int hf_nfs_ftype4 = -1; @@ -342,10 +344,68 @@ static int hf_nfs_lock4_reclaim = -1; static int hf_nfs_acl4 = -1; static int hf_nfs_callback_ident = -1; static int hf_nfs_r_netid = -1; +static int hf_nfs_gsshandle4 = -1; static int hf_nfs_r_addr = -1; +/* NFSv4.1 */ +static int hf_nfs_length4_minlength = -1; +static int hf_nfs_layouttype4 = -1; +static int hf_nfs_layoutreturn_type4 = -1; +static int hf_nfs_iomode4 = -1; +static int hf_nfs_stripetype4 = -1; +static int hf_nfs_mdscommit4 = -1; +static int hf_nfs_stripeunit4 = -1; +static int hf_nfs_newtime4 = -1; +static int hf_nfs_newoffset4 = -1; +static int hf_nfs_layout_avail4 = -1; +static int hf_nfs_newsize4 = -1; +static int hf_nfs_layoutupdate4 = -1; +static int hf_nfs_deviceid4 = -1; +static int hf_nfs_devicenum4 = -1; +static int hf_nfs_deviceidx4 = -1; +static int hf_nfs_layout4 = -1; +static int hf_nfs_stripedevs4 = -1; +static int hf_nfs_devaddr4 = -1; +static int hf_nfs_notifydsop4 = -1; +static int hf_nfs_return_on_close4 = -1; +static int hf_nfs_slotid4 = -1; +static int hf_nfs_sr_status4 = -1; +static int hf_nfs_serverscope4 = -1; +static int hf_nfs_minorid4 = -1; +static int hf_nfs_majorid4 = -1; +static int hf_nfs_padsize4 = -1; +static int hf_nfs_cbrenforce4 = -1; +static int hf_nfs_hashalg4 = -1; +static int hf_nfs_ssvlen4 = -1; +static int hf_nfs_maxreqsize4 = -1; +static int hf_nfs_maxrespsize4 = -1; +static int hf_nfs_maxrespsizecached4 = -1; +static int hf_nfs_maxops4 = -1; +static int hf_nfs_maxreqs4 = -1; +static int hf_nfs_rdmachanattrs4 = -1; +static int hf_nfs_machinename4 = -1; +static int hf_nfs_flavor4 = -1; +static int hf_nfs_stamp4 = -1; +static int hf_nfs_uid4 = -1; +static int hf_nfs_gid4 = -1; +static int hf_nfs_service4 = -1; +static int hf_nfs_sessionid4 = -1; +static int hf_nfs_exch_id_flags4 = -1; +static int hf_nfs_state_protect_window = -1; +static int hf_nfs_state_protect_num_gss_handles = -1; +static int hf_nfs_prot_info4_spi_window = -1; +static int hf_nfs_prot_info4_svv_length = -1; +static int hf_nfs_prot_info4_encr_alg = -1; +static int hf_nfs_prot_info4_hash_alg = -1; +static int hf_nfs_nii_domain4 = -1; +static int hf_nfs_nii_name4 = -1; +static int hf_nfs_create_session_flags4 = -1; +static int hf_nfs_cachethis4 = -1; +static int hf_nfs_util4 = -1; +static int hf_nfs_first_stripe_idx4 = -1; + /* Hidden field for v2, v3, and v4 status */ - int hf_nfs_nfsstat = -1; +int hf_nfs_nfsstat = -1; static gint ett_nfs = -1; static gint ett_nfs_fh_encoding = -1; @@ -463,6 +523,44 @@ static gint ett_nfs_clientaddr4 = -1; static gint ett_nfs_aceflag4 = -1; static gint ett_nfs_acemask4 = -1; +static gint ett_nfs_layoutget4 = -1; +static gint ett_nfs_layoutcommit4 = -1; +static gint ett_nfs_layoutreturn4 = -1; +static gint ett_nfs_getdevinfo4 = -1; +static gint ett_nfs_getdevlist4 = -1; +static gint ett_nfs_notifyds4 = -1; +static gint ett_nfs_exchange_id4 = -1; +static gint ett_nfs_create_session4 = -1; +static gint ett_nfs_destroy_session4 = -1; +static gint ett_nfs_sequence4 = -1; +static gint ett_nfs_pnfs_create4 = -1; +static gint ett_nfs_slotid4 = -1; +static gint ett_nfs_sr_status4 = -1; +static gint ett_nfs_serverscope4 = -1; +static gint ett_nfs_minorid4 = -1; +static gint ett_nfs_majorid4 = -1; +static gint ett_nfs_persist4 = -1; +static gint ett_nfs_backchan4 = -1; +static gint ett_nfs_rdmamode4 = -1; +static gint ett_nfs_padsize4 = -1; +static gint ett_nfs_cbrenforce4 = -1; +static gint ett_nfs_hashalg4 = -1; +static gint ett_nfs_ssvlen4 = -1; +static gint ett_nfs_maxreqsize4 = -1; +static gint ett_nfs_maxrespsize4 = -1; +static gint ett_nfs_maxrespsizecached4 = -1; +static gint ett_nfs_maxops4 = -1; +static gint ett_nfs_maxreqs4 = -1; +static gint ett_nfs_streamchanattrs4 = -1; +static gint ett_nfs_rdmachanattrs4 = -1; +static gint ett_nfs_machinename4 = -1; +static gint ett_nfs_flavor4 = -1; +static gint ett_nfs_stamp4 = -1; +static gint ett_nfs_uid4 = -1; +static gint ett_nfs_gid4 = -1; +static gint ett_nfs_service4 = -1; +static gint ett_nfs_sessionid4 = -1; + /* what type of fhandles shoudl we dissect as */ static dissector_table_t nfs_fhandle_table; @@ -572,7 +670,7 @@ store_nfs_file_handle(nfs_fhandle_data_t *nfs_fh) new_nfs_fh=se_alloc(sizeof(nfs_fhandle_data_t)); new_nfs_fh->len=nfs_fh->len; new_nfs_fh->fh=se_alloc(sizeof(guint32)*(nfs_fh->len/4)); - memcpy( (void *) new_nfs_fh->fh, nfs_fh->fh, nfs_fh->len); + memcpy((void *)new_nfs_fh->fh, nfs_fh->fh, nfs_fh->len); new_nfs_fh->tvb=tvb_new_real_data(new_nfs_fh->fh, new_nfs_fh->len, new_nfs_fh->len); fhlen=nfs_fh->len/4; fhkey[0].length=1; @@ -5699,6 +5797,31 @@ static const value_string names_nfs_nfsstat4[] = { { 10046, "NFS4ERR_FILE_OPEN" }, { 10047, "NFS4ERR_ADMIN_REVOKED" }, { 10048, "NFS4ERR_CB_PATH_DOWN" }, + { 10049, "NFS4ERR_BADIOMODE" }, + { 10050, "NFS4ERR_BADLAYOUT" }, + { 10051, "NFS4ERR_BAD_SESSION_DIGEST" }, + { 10052, "NFS4ERR_BADSESSION" }, + { 10053, "NFS4ERR_BADSLOT" }, + { 10054, "NFS4ERR_COMPLETE_ALREADY" }, + { 10055, "NFS4ERR_CONN_NOT_BOUND_TO_SESSION" }, + { 10056, "NFS4ERR_DELEG_ALREADY_WANTED" }, + { 10057, "NFS4ERR_DIRDELEG_UNAVAIL" }, + { 10058, "NFS4ERR_LAYOUTTRYLATER" }, + { 10059, "NFS4ERR_LAYOUTUNAVAILABLE" }, + { 10060, "NFS4ERR_NOMATCHING_LAYOUT" }, + { 10061, "NFS4ERR_RECALLCONFLICT" }, + { 10062, "NFS4ERR_UNKNOWN_LAYOUTTYPE" }, + { 10063, "NFS4ERR_SEQ_MISORDERED" }, + { 10064, "NFS4ERR_SEQUENCE_POS" }, + { 10065, "NFS4ERR_REQ_TOO_BIG" }, + { 10066, "NFS4ERR_REP_TOO_BIG" }, + { 10067, "NFS4ERR_REP_TOO_BIG_TO_CACHE" }, + { 10068, "NFS4ERR_RETRY_UNCACHED_REP" }, + { 10069, "NFS4ERR_UNSAFE_COMPOUND" }, + { 10070, "NFS4ERR_TOO_MANY_OPS" }, + { 10071, "NFS4ERR_OP_NOT_IN_SESSION" }, + { 10072, "NFS4ERR_HASH_ALG_UNSUPP" }, + { 10073, "NFS4ERR_CONN_BINDING_NOT_ENFORCED" }, { 0, NULL } }; @@ -6303,6 +6426,20 @@ static const value_string names_fattr4[] = { { FATTR4_TIME_MODIFY_SET, "FATTR4_TIME_MODIFY_SET" }, #define FATTR4_MOUNTED_ON_FILEID 55 { FATTR4_MOUNTED_ON_FILEID, "FATTR4_MOUNTED_ON_FILEID" }, +#define FATTR4_DIR_NOTIF_DELAY 56 + { FATTR4_DIR_NOTIF_DELAY, "FATTR4_DIR_NOTIF_DELAY" }, +#define FATTR4_DIRENT_NOTIF_DELAY 57 + { FATTR4_DIRENT_NOTIF_DELAY, "FATTR4_DIRENT_NOTIF_DELAY" }, +#define FATTR4_SEND_IMPL_ID 58 + { FATTR4_SEND_IMPL_ID, "FATTR4_SEND_IMPL_ID" }, +#define FATTR4_RECV_IMPL_ID 59 + { FATTR4_RECV_IMPL_ID, "FATTR4_RECV_IMPL_ID" }, +#define FATTR4_ABSENT 60 + { FATTR4_ABSENT, "FATTR4_ABSENT" }, +#define FATTR4_FS_STATUS 61 + { FATTR4_FS_STATUS, "FATTR4_FS_STATUS" }, +#define FATTR4_FS_LAYOUT_TYPES 62 + { FATTR4_MOUNTED_ON_FILEID, "FATTR4_FS_LAYOUT_TYPES" }, { 0, NULL } }; @@ -6964,6 +7101,19 @@ static const value_string names_nfsv4_operation[] = { { NFS4_OP_VERIFY, "VERIFY" }, { NFS4_OP_WRITE, "WRITE" }, { NFS4_OP_RELEASE_LOCKOWNER, "RELEASE_LOCKOWNER" }, + { NFS4_OP_EXCHANGE_ID, "EXCHANGE_ID" }, + { NFS4_OP_CREATE_SESSION, "CREATE_SESSION" }, + { NFS4_OP_DESTROY_SESSION, "DESTROY_SESSION" }, + { NFS4_OP_SEQUENCE, "SEQUENCE" }, + { NFS4_OP_GETDEVINFO, "GETDEVINFO"}, + { NFS4_OP_GETDEVLIST, "GETDEVLIST"}, + { NFS4_OP_LAYOUTCOMMIT, "LAYOUTCOMMIT" }, + { NFS4_OP_LAYOUTGET, "LAYOUTGET" }, + { NFS4_OP_LAYOUTRETURN, "LAYOUTRETURN" }, + { NFS4_OP_NOTIFYDS, "PNFS_NOTIFYDS"}, + { NFS4_OP_PNFS_CREATE, "PNFS_CREATE"}, + { NFS4_OP_PNFS_WRITE, "PNFS_WRITE"}, + { NFS4_OP_PNFS_READ, "PNFS_READ"}, { NFS4_OP_ILLEGAL, "ILLEGAL" }, { 0, NULL } }; @@ -7006,7 +7156,29 @@ gint *nfsv4_operation_ett[] = &ett_nfs_setclientid_confirm4 , &ett_nfs_verify4 , &ett_nfs_write4, - &ett_nfs_release_lockowner4, + &ett_nfs_release_lockowner4, + NULL, + NULL, + &ett_nfs_exchange_id4, + &ett_nfs_create_session4, + &ett_nfs_destroy_session4, + NULL, + NULL, + &ett_nfs_getdevinfo4, + &ett_nfs_getdevlist4, + &ett_nfs_layoutcommit4, + &ett_nfs_layoutget4, + &ett_nfs_layoutreturn4, + NULL, + &ett_nfs_sequence4, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + &ett_nfs_notifyds4, + &ett_nfs_pnfs_create4, }; static int @@ -7142,6 +7314,7 @@ dissect_nfs_stateid4(tvbuff_t *tvb, int offset, } offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_seqid4, offset); + proto_tree_add_item(newftree, hf_nfs_stateid4_other, tvb, offset, 12, FALSE); offset+=12; @@ -7168,6 +7341,155 @@ dissect_nfs_modified_limit4(tvbuff_t *tvb, int offset, proto_tree *tree) return offset; } +/* + * No FULL DISECT yet. + */ +static int +dissect_nfs_state_protect_bitmap4(tvbuff_t *tvb, int offset, +proto_tree *tree) +{ + guint32 bitmap_len; + proto_item *fitem = NULL; + proto_tree *newftree = NULL; + proto_item *op_fitem = NULL; + proto_tree *op_newftree = NULL; + guint32 *bitmap=NULL; + guint32 fattr; + guint32 i; + gint j; + guint32 sl; + + bitmap_len = tvb_get_ntohl(tvb, offset); + if (bitmap_len > MAX_BITMAP_LEN) { + proto_tree_add_text(tree, tvb, offset, 4, + "Huge bitmap length: %u", bitmap_len); + THROW(ReportedBoundsError); + } + tvb_ensure_bytes_exist(tvb, offset, 4 + bitmap_len * 4); + fitem = proto_tree_add_text(tree, tvb, offset, 4 + bitmap_len * 4, + "%s", "operation mask"); + offset += 4; + if (fitem == NULL) return offset; + + newftree = proto_item_add_subtree(fitem, ett_nfs_bitmap4); + if (newftree == NULL) return offset; + + if(bitmap_len) + bitmap = ep_alloc(bitmap_len * sizeof(guint32)); + + if (bitmap == NULL) return offset; + for (i = 0; i < bitmap_len; i++) { + bitmap[i] = tvb_get_ntohl(tvb, offset); + sl = 0x00000001; + for (j = 0; j < 32; j++) { + fattr = 32 * i + j; + if (bitmap[i] & sl) { + op_fitem = proto_tree_add_uint(newftree, + hf_nfs_recc_attr, tvb, offset, 4, fattr); + if (op_fitem == NULL) break; + op_newftree = proto_item_add_subtree(op_fitem, ett_nfs_bitmap4); + if (op_newftree == NULL) break; + } + sl <<= 1; + } + offset += 4; + } + return offset; +} + +#define SP4_NONE 0 +#define SP4_MACH_CRED 1 +#define SP4_SSV 2 +static const value_string names_state_protect_how4[] = { +{ SP4_NONE, "SP4_NONE" }, +{ SP4_MACH_CRED, "SP4_MACH_CRED" }, +{ SP4_SSV, "SP4_SSV" }, +{ 0, NULL } +}; + +static int +dissect_nfs_state_protect_ops4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + offset = dissect_nfs_state_protect_bitmap4(tvb, offset, tree); + offset = dissect_nfs_state_protect_bitmap4(tvb, offset, tree); + return offset; +} + +static int +dissect_nfs_ssv_sp_parms4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + offset = dissect_nfs_state_protect_ops4(tvb, offset, tree); + offset = dissect_rpc_opaque_data(tvb, offset, tree, NULL, + hf_nfs_sec_oid4, FALSE, 0, FALSE, NULL, NULL); + offset = dissect_rpc_opaque_data(tvb, offset, tree, NULL, + hf_nfs_sec_oid4, FALSE, 0, FALSE, NULL, NULL); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_state_protect_window, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_state_protect_num_gss_handles, offset); + return offset; +} + +static int +dissect_nfs_ssv_prot_info4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + offset = dissect_nfs_state_protect_ops4(tvb, offset, tree); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_prot_info4_hash_alg, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_prot_info4_encr_alg, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_prot_info4_svv_length, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_prot_info4_spi_window, offset); + offset = dissect_nfsdata(tvb, offset, tree, hf_nfs_gsshandle4); + return offset; +} + +static int +dissect_nfs_state_protect4_a(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + guint stateprotect; + + stateprotect = tvb_get_ntohl(tvb, offset); + proto_tree_add_uint(tree, hf_nfs_state_protect_how4, tvb, offset+0, 4, + stateprotect); + offset += 4; + + switch(stateprotect) { + case SP4_NONE: + break; + case SP4_MACH_CRED: + offset = dissect_nfs_state_protect_ops4(tvb, offset, tree); + break; + case SP4_SSV: + offset = dissect_nfs_ssv_sp_parms4(tvb, offset, tree); + break; + default: + break; + } + return offset; +} + +static int +dissect_nfs_state_protect4_r(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + guint stateprotect; + + stateprotect = tvb_get_ntohl(tvb, offset); + proto_tree_add_uint(tree, hf_nfs_state_protect_how4, tvb, offset+0, 4, + stateprotect); + offset += 4; + + switch(stateprotect) { + case SP4_NONE: + break; + case SP4_MACH_CRED: + offset = dissect_nfs_state_protect_ops4(tvb, offset, tree); + break; + case SP4_SSV: + offset = dissect_nfs_ssv_prot_info4(tvb, offset, tree); + break; + default: + break; + } + return offset; +} + #define NFS_LIMIT_SIZE 1 #define NFS_LIMIT_BLOCKS 2 static const value_string names_limit_by4[] = { @@ -7322,6 +7644,289 @@ dissect_nfs_client_id4(tvbuff_t *tvb, int offset, proto_tree *tree) return offset; } + +static int +dissect_nfs_newtime4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + guint new_time; + + new_time = tvb_get_ntohl(tvb, offset); + offset = dissect_rpc_bool(tvb, tree, hf_nfs_newtime4, offset); + + if (new_time) { + offset = dissect_nfs_nfstime4(tvb, offset, tree); + } + + return offset; +} + +static int +dissect_nfs_newsize4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + guint new_size; + + new_size = tvb_get_ntohl(tvb, offset); + offset = dissect_rpc_bool(tvb, tree, hf_nfs_newsize4, offset); + + if (new_size) { + offset = dissect_rpc_uint64(tvb, tree, hf_nfs_length4, offset); + } + + return offset; +} + +static int +dissect_nfs_newoffset4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + guint new_offset; + + new_offset = tvb_get_ntohl(tvb, offset); + offset = dissect_rpc_bool(tvb, tree, hf_nfs_newoffset4, offset); + + if (new_offset) { + offset = dissect_rpc_uint64(tvb, tree, hf_nfs_offset4, offset); + } + + return offset; +} + +static int +dissect_nfs_layoutreturn4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + guint returntype; + + returntype = tvb_get_ntohl(tvb, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_layoutreturn_type4, offset); + if (returntype == 1) { /* RETURN_FILE */ + offset = dissect_rpc_uint64(tvb, tree, hf_nfs_offset4, offset); + offset = dissect_rpc_uint64(tvb, tree, hf_nfs_length4, offset); + } + + return offset; +} + +static int +dissect_nfs_devices4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + guint i; + guint32 num_devs,num_indices,num_multipath; + + /* No layout type - argh */ + + /* Assume file layout for now */ + + /* disect indices */ + num_indices = tvb_get_ntohl(tvb, offset); + offset += 4; + for (i = 0; i < num_indices; i++) { + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_deviceidx4,offset); + } + + /* disect devices */ + num_devs = tvb_get_ntohl(tvb, offset); + offset += 4; + for (i = 0; i < num_devs; i++) { + num_multipath = tvb_get_ntohl(tvb, offset); + offset += 4; + for (i = 0; i < num_multipath; i++) { + offset = dissect_nfsdata(tvb, offset, tree, hf_nfs_r_netid); + offset = dissect_nfsdata(tvb, offset, tree, hf_nfs_r_addr); + } + } + + return offset; +} + + +static int +dissect_nfs_deviceaddr4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + /* No layout type - argh */ + + /* Assume file layout for now */ + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_layouttype4, offset); + + offset = dissect_nfs_devices4(tvb, offset, tree); + + return offset; +} + +static int +dissect_nfs_devicelist4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + guint count; + guint i; + + count = tvb_get_ntohl(tvb, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_devicenum4, offset); + for (i = 0; i < count; i++) { + int opaque_devs, dev_limit; + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_deviceid4, offset); + + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_layouttype4, offset); + + opaque_devs = tvb_get_ntohl(tvb, offset); + offset += 4; + dev_limit = opaque_devs + offset; + while (offset < dev_limit) { + offset = dissect_nfs_devices4(tvb, offset, tree); + } + } + return offset; +} + +static int +dissect_rpc_serverowner4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + offset = dissect_rpc_uint64(tvb, tree, hf_nfs_minorid4, offset); + offset = dissect_nfsdata(tvb, offset, tree, hf_nfs_majorid4); + return offset; +} + +static int +dissect_rpc_chanattrs4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + guint i, count; + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_padsize4, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_maxreqsize4, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_maxrespsize4, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_maxrespsizecached4, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_maxops4, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_maxreqs4, offset); + count = tvb_get_ntohl(tvb, offset); + offset += 4; + for (i = 0; i < count; i++) { + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_rdmachanattrs4, offset); + } + return offset; +} + +static int +dissect_rpc_nfs_impl_id4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + guint i, count; + count = tvb_get_ntohl(tvb, offset); + proto_tree_add_uint(tree, hf_nfs_impl_id4_len, tvb, offset+0, 4, + count); + offset += 4; + for (i = 0; i < count; i++) { + offset = dissect_nfs_utf8string(tvb, offset, tree, hf_nfs_nii_domain4, NULL); + offset = dissect_nfs_utf8string(tvb, offset, tree, hf_nfs_nii_name4, NULL); + offset = dissect_nfs_nfstime4(tvb, offset, tree); + + } + return offset; +} +static int +dissect_rpc_secparms4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + guint count, i; + count = tvb_get_ntohl(tvb, offset); + offset += 4; + + for (i = 0; i < count; i++) { + guint j, flavor = tvb_get_ntohl(tvb, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_flavor4, offset); + + switch(flavor) { + case 1: { /* AUTH_SYS */ + guint count2; + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_stamp4, offset); + offset = dissect_nfs_utf8string(tvb, offset, tree, hf_nfs_machinename4, NULL); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_uid4, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_gid4, offset); + count2 = tvb_get_ntohl(tvb, offset); + offset += 4; + for (j = 0; j < count2; j++) { + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_gid4, offset); + } + break; + } + case 6: /* RPCSEC_GSS */ + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_service4, offset); + proto_item_append_text(tree, ", Handle from server"); + offset = dissect_nfsdata(tvb, offset, tree, hf_nfs_data); + proto_item_append_text(tree, ", Handle from client"); + offset = dissect_nfsdata(tvb, offset, tree, hf_nfs_data); + break; + default: + break; + } + } + return offset; +} + +static int +dissect_nfs_notifydsargs4(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + + guint op; + + op = tvb_get_ntohl(tvb, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_notifydsop4, offset); + switch(op) { + case 0: { /* ADDSTATE */ + guint count, i; + offset = dissect_rpc_uint64(tvb, tree, hf_nfs_clientid4, offset); + + proto_tree_add_text(tree, tvb, offset, 0, "filehandle: %s", + tvb_bytes_to_str(tvb, offset, 16)); + offset += 16; + + count = tvb_get_ntohl(tvb, offset); + offset += 4; + for (i = 0; i < count; i++) { + offset = dissect_nfs_stateid4(tvb, offset, tree); + } + break; + } + case 1: { /* DELSTATE */ + guint count, i; + count = tvb_get_ntohl(tvb, offset); + offset += 4; + for (i = 0; i < count; i++) { + offset = dissect_nfs_stateid4(tvb, offset, tree); + } + break; + } + case 2: /* DELCLIENT */ + offset = dissect_rpc_uint64(tvb, tree, hf_nfs_clientid4, offset); + break; + default: + break; + } + + return offset; +} + +static int +dissect_nfs_layout(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree) +{ + guint layout_type; + + layout_type = tvb_get_ntohl(tvb, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_layouttype4, offset); + + if (layout_type == 1) { /* NFS Files */ + guint num; + guint i; + offset += 4; /* Skip past opaque count */ + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_deviceid4, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_util4, offset); + offset = dissect_rpc_uint32(tvb, tree, hf_nfs_first_stripe_idx4, offset); + + num = tvb_get_ntohl(tvb, offset); /* Len of dev list */ + offset += 4; + for (i = 0; i < num; i++) { + offset = dissect_nfs_fh4(tvb, offset, pinfo, tree, "filehandle"); + } + } else { + offset = dissect_nfsdata(tvb, offset, tree, hf_nfs_layout4); + } + + return offset; +} + static int dissect_nfs_argop4(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree) @@ -7357,16 +7962,18 @@ dissect_nfs_argop4(tvbuff_t *tvb, int offset, packet_info *pinfo, offset += 4; /* the opcodes are not contiguous */ - if ((opcode < NFS4_OP_ACCESS || opcode > NFS4_OP_RELEASE_LOCKOWNER) && + if ((opcode < NFS4_OP_ACCESS || opcode > NFS4_OP_PNFS_CREATE) && (opcode != NFS4_OP_ILLEGAL)) break; /* all of the V4 ops are contiguous, except for NFS4_OP_ILLEGAL */ if (opcode == NFS4_OP_ILLEGAL) { newftree = proto_item_add_subtree(fitem, ett_nfs_illegal4); - } else { + } else if (nfsv4_operation_ett[opcode - 3]) { newftree = proto_item_add_subtree(fitem, *nfsv4_operation_ett[opcode - 3]); + } else { + break; } switch(opcode) @@ -7612,6 +8219,111 @@ dissect_nfs_argop4(tvbuff_t *tvb, int offset, packet_info *pinfo, offset = dissect_nfs_lock_owner4(tvb, offset, newftree); break; + /* Minor Version 1 */ + case NFS4_OP_EXCHANGE_ID: + + offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_verifier4, + offset); + proto_item_append_text(newftree, ", Client Owner"); + offset = dissect_nfsdata(tvb, offset, newftree, hf_nfs_data); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_exch_id_flags4, offset); + offset = dissect_nfs_state_protect4_a(tvb, offset, newftree); + offset = dissect_rpc_nfs_impl_id4(tvb, offset, newftree); + break; + + case NFS4_OP_CREATE_SESSION: + offset = dissect_rpc_uint64(tvb, newftree, + hf_nfs_clientid4, offset); + offset = dissect_rpc_uint32(tvb, newftree, + hf_nfs_seqid4, offset); + offset = dissect_rpc_uint32(tvb, newftree, + hf_nfs_create_session_flags4, offset); + offset = dissect_rpc_chanattrs4(tvb, offset, newftree); + offset = dissect_rpc_chanattrs4(tvb, offset, newftree); + offset = dissect_rpc_uint32(tvb, newftree, + hf_nfs_cb_program, offset); + offset = dissect_rpc_secparms4(tvb, offset, newftree); + break; + + case NFS4_OP_DESTROY_SESSION: + offset = dissect_rpc_opaque_data(tvb, offset, newftree, NULL, + hf_nfs_sessionid4, TRUE, 16, + FALSE, NULL, NULL); + break; + + /* pNFS */ + case NFS4_OP_LAYOUTGET: + offset = dissect_rpc_bool(tvb, newftree, hf_nfs_layout_avail4, + offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_layouttype4, + offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_iomode4, offset); + offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_offset4, offset); + offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_length4, offset); + offset = dissect_rpc_uint64(tvb, newftree, + hf_nfs_length4_minlength, offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_count4_maxcount, + offset); + break; + + case NFS4_OP_LAYOUTCOMMIT: + offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_offset4, offset); + offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_length4, offset); + offset = dissect_rpc_bool(tvb, newftree, hf_nfs_reclaim4, offset); + offset = dissect_nfs_newoffset4(tvb, offset, newftree); + offset = dissect_nfs_newtime4(tvb, offset, newftree); + offset = dissect_nfs_newtime4(tvb, offset, newftree); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_layouttype4, + offset); + offset = dissect_nfsdata(tvb, offset, newftree, + hf_nfs_layoutupdate4); + break; + + case NFS4_OP_LAYOUTRETURN: + offset = dissect_rpc_bool(tvb, newftree, hf_nfs_reclaim4, offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_layouttype4, + offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_iomode4, offset); + offset = dissect_nfs_layoutreturn4(tvb, offset, newftree); + break; + + case NFS4_OP_GETDEVINFO: + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_deviceid4, + offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_layouttype4, + offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_count4_maxcount, + offset); + break; + + case NFS4_OP_GETDEVLIST: + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_layouttype4, + offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_count4_maxcount, + offset); + offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_cookie4, offset); + offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_cookieverf4, + offset); + break; + + case NFS4_OP_SEQUENCE: + offset = dissect_rpc_opaque_data(tvb, offset, newftree, NULL, + hf_nfs_sessionid4, TRUE, 16, + FALSE, NULL, NULL); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_seqid4, offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_slotid4, offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_slotid4, offset); + offset = dissect_rpc_bool(tvb, newftree, hf_nfs_cachethis4, offset); + break; + + case NFS4_OP_NOTIFYDS: + offset = dissect_nfs_notifydsargs4(tvb, offset, newftree); + break; + + case NFS4_OP_PNFS_CREATE: + offset = dissect_nfs_utf8string(tvb, offset, newftree, hf_nfs_component4, NULL); + break; + /* In theory, it's possible to get this opcode */ case NFS4_OP_ILLEGAL: break; @@ -7698,7 +8410,7 @@ dissect_nfs_resop4(tvbuff_t *tvb, int offset, packet_info *pinfo, opcode = tvb_get_ntohl(tvb, offset); /* sanity check for bogus packets */ - if ((opcode < NFS4_OP_ACCESS || opcode > NFS4_OP_WRITE) && + if ((opcode < NFS4_OP_ACCESS || opcode > NFS4_OP_PNFS_CREATE) && (opcode != NFS4_OP_ILLEGAL)) break; @@ -7715,9 +8427,11 @@ dissect_nfs_resop4(tvbuff_t *tvb, int offset, packet_info *pinfo, /* all of the V4 ops are contiguous, except for NFS4_OP_ILLEGAL */ if (opcode == NFS4_OP_ILLEGAL) { newftree = proto_item_add_subtree(fitem, ett_nfs_illegal4); - } else { + } else if (nfsv4_operation_ett[opcode - 3]) { newftree = proto_item_add_subtree(fitem, *nfsv4_operation_ett[opcode - 3]); + } else { + break; } offset = dissect_nfs_nfsstat4(tvb, offset, newftree, &status); @@ -7854,6 +8568,82 @@ dissect_nfs_resop4(tvbuff_t *tvb, int offset, packet_info *pinfo, offset); break; + /* Minor Version 1 */ + case NFS4_OP_EXCHANGE_ID: + offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_clientid4, + offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_seqid4, offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_exch_id_flags4, offset); + offset = dissect_nfs_state_protect4_r(tvb, offset, newftree); + offset = dissect_rpc_serverowner4(tvb, offset, newftree); + offset = dissect_nfsdata(tvb, offset, newftree, + hf_nfs_serverscope4); + offset = dissect_rpc_nfs_impl_id4(tvb, offset, newftree); + break; + + case NFS4_OP_CREATE_SESSION: + offset = dissect_rpc_opaque_data(tvb, offset, newftree, + NULL, hf_nfs_sessionid4, TRUE, 16, + FALSE, NULL, NULL); + offset = dissect_rpc_uint32(tvb, newftree, + hf_nfs_seqid4, offset); + offset = dissect_rpc_uint32(tvb, newftree, + hf_nfs_create_session_flags4, offset); + offset = dissect_rpc_chanattrs4(tvb, offset, newftree); + + offset = dissect_rpc_chanattrs4(tvb, offset, newftree); + break; + + case NFS4_OP_DESTROY_SESSION: + break; + + case NFS4_OP_LAYOUTGET: + offset = dissect_rpc_bool(tvb, newftree, hf_nfs_return_on_close4, + offset); + offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_offset4, offset); + offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_length4, offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_iomode4, offset); + offset = dissect_nfs_layout(tvb, offset, pinfo, newftree); + break; + + case NFS4_OP_LAYOUTCOMMIT: + offset = dissect_nfs_newsize4(tvb, offset, newftree); + break; + + case NFS4_OP_LAYOUTRETURN: + break; + + case NFS4_OP_GETDEVINFO: + offset = dissect_nfs_deviceaddr4(tvb, offset, newftree); + break; + + case NFS4_OP_GETDEVLIST: + offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_cookie4, + offset); + offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_cookieverf4, + offset); + offset = dissect_nfs_devicelist4(tvb, offset, newftree); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_eof, offset); + break; + + case NFS4_OP_SEQUENCE: + offset = dissect_rpc_opaque_data(tvb, offset, newftree, NULL, + hf_nfs_sessionid4, TRUE, 16, + FALSE, NULL, NULL); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_seqid4, offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_slotid4, offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_slotid4, offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_slotid4, offset); + offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_sr_status4, + offset); + break; + + case NFS4_OP_NOTIFYDS: + break; + + case NFS4_OP_PNFS_CREATE: + break; + default: break; } @@ -8058,6 +8848,40 @@ static const value_string names_nfs_nfsstat[] = { { 0, NULL } }; +static const value_string notifydsop_names[] = { + { 0, "ADD_STATE" }, + { 1, "DEL_STATE" }, + { 2, "DEL_CLIENT" }, + { 0, NULL } +}; + +static const value_string iomode_names[] = { + { 1, "IOMODE_READ"}, + { 2, "IOMODE_RW"}, + { 3, "IOMODE_ANY"}, + { 0, NULL } +}; + +static const value_string stripetype_names[] = { + { 1, "STRIPE_SPARSE"}, + { 2, "STRIPE_DENSE"}, + { 0, NULL } +}; + +static const value_string layouttype_names[] = { + { 1, "LAYOUT_NFSV4_FILES"}, + { 2, "LAYOUT_OSD2_OBJECTS"}, + { 3, "LAYOUT_BLOCK_VOLUME"}, + { 0, NULL } +}; + +static const value_string layoutreturn_names[] = { + { 1, "RETURN_FILE"}, + { 2, "RETURN_FSID"}, + { 3, "RETURN_ALL"}, + { 0, NULL } +}; + void proto_register_nfs(void) { @@ -8071,6 +8895,9 @@ proto_register_nfs(void) { &hf_nfs_procedure_v4, { "V4 Procedure", "nfs.procedure_v4", FT_UINT32, BASE_DEC, VALS(nfsv4_proc_vals), 0, "V4 Procedure", HFILL }}, + { &hf_nfs_impl_id4_len, { + "Implemetation ID length", "nfs.impl_id4.length", FT_UINT32, BASE_DEC, + NULL, 0, "Implementation ID Length", HFILL }}, { &hf_nfs_fh_length, { "length", "nfs.fh.length", FT_UINT32, BASE_DEC, NULL, 0, "file handle length", HFILL }}, @@ -8584,6 +9411,12 @@ proto_register_nfs(void) "Open Type", "nfs.open.opentype", FT_UINT32, BASE_DEC, VALS(names_opentype4), 0, "Open Type", HFILL }}, + { &hf_nfs_state_protect_how4, { + "State Protect", "nfs.exchange_id.state_protect", + FT_UINT32, BASE_DEC, + VALS(names_state_protect_how4), 0, "State Protect How", + HFILL }}, + { &hf_nfs_limit_by4, { "Space Limit", "nfs.open.limit_by", FT_UINT32, BASE_DEC, VALS(names_limit_by4), 0, "Limit By", HFILL }}, @@ -9036,6 +9869,10 @@ proto_register_nfs(void) "callback_ident", "nfs.callback.ident", FT_UINT32, BASE_HEX, NULL, 0, "Callback Identifier", HFILL }}, + { &hf_nfs_gsshandle4, { + "gsshandle4", "nfs.gsshandle4", FT_BYTES, BASE_DEC, NULL, 0, + "gsshandle4", HFILL }}, + { &hf_nfs_r_netid, { "r_netid", "nfs.r_netid", FT_BYTES, BASE_DEC, NULL, 0, "r_netid", HFILL }}, @@ -9166,7 +10003,214 @@ proto_register_nfs(void) "export point unique id", "nfs.gxfh3.exportptuid", FT_UINT32, BASE_HEX, NULL, 0, "export point unique id", HFILL }}, + { &hf_nfs_length4_minlength, { + "min length", "nfs.minlength4", FT_UINT64, BASE_DEC, NULL, 0, + "min length", HFILL }}, + + { &hf_nfs_layouttype4, { + "layout type", "nfs.layouttype", FT_UINT32, BASE_DEC, + VALS(layouttype_names), 0, "layout type", HFILL }}, + + { &hf_nfs_layoutreturn_type4, { + "return type", "nfs.returntype", FT_UINT32, BASE_DEC, + VALS(layoutreturn_names), 0, "return type ", HFILL }}, + + { &hf_nfs_iomode4, { + "IO mode", "nfs.iomode", FT_UINT32, BASE_DEC, VALS(iomode_names), + 0, "IO mode", HFILL }}, + + { &hf_nfs_stripetype4, { + "stripe type", "nfs.stripetype", FT_UINT32, BASE_DEC, VALS(stripetype_names), 0, + "stripe type", HFILL }}, + + { &hf_nfs_stripeunit4, { + "stripe unit", "nfs.stripeunit", FT_UINT64, BASE_DEC, NULL, 0, + "stripe unit", HFILL }}, + + { &hf_nfs_util4, { + "util", "nfs.util", FT_UINT32, BASE_DEC, + NULL, 0, "util", HFILL }}, + + { &hf_nfs_first_stripe_idx4, { + "first stripe index", "nfs.stripeindex", FT_UINT32, BASE_DEC, + NULL, 0, "first stripe index", HFILL }}, + + { &hf_nfs_newtime4, { + "new time?", "nfs.newtime", FT_BOOLEAN, + BASE_NONE, &yesno, 0, "nfs.newtime", HFILL }}, + + { &hf_nfs_newoffset4, { + "new offset?", "nfs.newoffset", FT_BOOLEAN, + BASE_NONE, &yesno, 0, "nfs.newoffset", HFILL }}, + + { &hf_nfs_newsize4, { + "new size?", "nfs.newsize", FT_BOOLEAN, + BASE_NONE, &yesno, 0, "nfs.newsize", HFILL }}, + + { &hf_nfs_layout_avail4, { + "layout available?", "nfs.layoutavail", FT_BOOLEAN, + BASE_NONE, &yesno, 0, "nfs.layoutavail", HFILL }}, + + { &hf_nfs_mdscommit4, { + "MDS commit?", "nfs.mdscommit", FT_BOOLEAN, + BASE_NONE, &yesno, 0, "nfs.mdscommit", HFILL }}, + + { &hf_nfs_layoutupdate4, { + "layout update", "nfs.layoutupdate", FT_BYTES, BASE_DEC, + NULL, 0, "layout update", HFILL }}, + + { &hf_nfs_deviceid4, { + "device ID", "nfs.deviceid", FT_UINT32, BASE_DEC, + NULL, 0, "device ID", HFILL }}, + + { &hf_nfs_devicenum4, { + "num devices", "nfs.devicenum4", FT_UINT32, BASE_DEC, + NULL, 0, "num devices", HFILL }}, + + { &hf_nfs_deviceidx4, { + "device index", "nfs.deviceidx", FT_UINT32, BASE_DEC, + NULL, 0, "device index", HFILL }}, + + { &hf_nfs_layout4, { + "layout", "nfs.layout", FT_BYTES, BASE_DEC, + NULL, 0, "layout", HFILL }}, + + { &hf_nfs_stripedevs4, { + "stripe devs", "nfs.stripedevs", FT_UINT32, BASE_DEC, + NULL, 0, "stripe devs", HFILL }}, + { &hf_nfs_devaddr4, { + "device addr", "nfs.devaddr", FT_BYTES, BASE_DEC, + NULL, 0, "device addr", HFILL }}, + + { &hf_nfs_notifydsop4, { + "NotifyDS op", "nfs.notifydsop", FT_UINT32, BASE_DEC, + VALS(notifydsop_names), 0, "NotifyDS op", HFILL }}, + + { &hf_nfs_return_on_close4, { + "return on close?", "nfs.retclose4", FT_BOOLEAN, BASE_NONE, + &yesno, 0, "return on close", HFILL }}, + + { &hf_nfs_slotid4, { + "slot ID", "nfs.slotid4", FT_UINT32, BASE_DEC, + NULL, 0, "slot ID", HFILL }}, + + { &hf_nfs_sr_status4, { + "status", "nfs.status", FT_UINT32, BASE_DEC, + NULL, 0, "status", HFILL }}, + + { &hf_nfs_serverscope4, { + "server scope", "nfs.scope", FT_BYTES, BASE_DEC, + NULL, 0, "server scope", HFILL }}, + + { &hf_nfs_minorid4, { + "minor ID", "nfs.minorid4", FT_UINT64, BASE_DEC, + NULL, 0, "minor ID", HFILL }}, + + { &hf_nfs_majorid4, { + "major ID", "nfs.majorid4", FT_BYTES, BASE_DEC, + NULL, 0, "major ID", HFILL }}, + + { &hf_nfs_padsize4, { + "hdr pad size", "nfs.padsize4", FT_UINT32, BASE_DEC, + NULL, 0, "hdr pad size", HFILL }}, + + { &hf_nfs_cbrenforce4, { + "binding enforce?", "nfs.cbrenforce4", FT_BOOLEAN, + BASE_NONE, &yesno, 0, "nfs.cbrenforce4", HFILL }}, + + { &hf_nfs_hashalg4, { + "hash alg", "nfs.hashalg4", FT_UINT32, BASE_DEC, + NULL, 0, "hash alg", HFILL }}, + + { &hf_nfs_ssvlen4, { + "ssv len", "nfs.ssvlen4", FT_UINT32, BASE_DEC, + NULL, 0, "ssv len", HFILL }}, + + { &hf_nfs_maxreqsize4, { + "max req size", "nfs.maxreqsize4", FT_UINT32, BASE_DEC, + NULL, 0, "max req size", HFILL }}, + + { &hf_nfs_maxrespsize4, { + "max resp size", "nfs.maxrespsize4", FT_UINT32, BASE_DEC, + NULL, 0, "max resp size", HFILL }}, + + { &hf_nfs_maxrespsizecached4, { + "max resp size cached", "nfs.maxrespsizecached4", FT_UINT32, + BASE_DEC, NULL, 0, "max resp size cached", HFILL }}, + + { &hf_nfs_maxops4, { + "max ops", "nfs.maxops4", FT_UINT32, BASE_DEC, + NULL, 0, "max ops", HFILL }}, + + { &hf_nfs_maxreqs4, { + "max reqs", "nfs.maxreqs4", FT_UINT32, BASE_DEC, + NULL, 0, "max reqs", HFILL }}, + + { &hf_nfs_rdmachanattrs4, { + "RDMA chan attrs", "nfs.rdmachanattrs4", FT_UINT32, BASE_DEC, + NULL, 0, "RDMA chan attrs", HFILL }}, + + { &hf_nfs_machinename4, { + "machine name", "nfs.machinename4", FT_STRING, BASE_DEC, + NULL, 0, "machine name", HFILL }}, + + { &hf_nfs_flavor4, { + "flavor", "nfs.flavor4", FT_UINT32, BASE_DEC, + NULL, 0, "flavor", HFILL }}, + + { &hf_nfs_stamp4, { + "stamp", "nfs.stamp4", FT_UINT32, BASE_DEC, + NULL, 0, "stamp", HFILL }}, + + { &hf_nfs_uid4, { + "uid", "nfs.uid4", FT_UINT32, BASE_DEC, + NULL, 0, "nfs.uid4", HFILL }}, + + { &hf_nfs_gid4, { + "gid", "nfs.gid4", FT_UINT32, BASE_DEC, + NULL, 0, "nfs.gid4", HFILL }}, + + { &hf_nfs_service4, { + "gid", "nfs.service4", FT_UINT32, BASE_DEC, + NULL, 0, "nfs.service4", HFILL }}, + + { &hf_nfs_sessionid4, { + "sessionid", "nfs.session_id4", FT_BYTES, BASE_HEX, + NULL, 0, "nfs.session_id4", HFILL }}, + { &hf_nfs_exch_id_flags4, { + "EXCHANGE_ID flags", "nfs.exch_id_flags", FT_UINT32, BASE_HEX, + NULL, 0, "EXCHANGE_ID flags", HFILL }}, + { &hf_nfs_prot_info4_hash_alg, { + "Prot Info hash algorithm", "nfs.prot_info4_hash_alg", FT_UINT32, BASE_HEX, + NULL, 0, "Prot Info hash algorithm", HFILL }}, + { &hf_nfs_prot_info4_encr_alg, { + "Prot Info encription algorithm", "nfs.prot_info4_encr_alg", FT_UINT32, BASE_HEX, + NULL, 0, "Prot Info encrption algorithm", HFILL }}, + { &hf_nfs_prot_info4_svv_length, { + "Prot Info svv_length", "nfs.prot_info4_svv_length", FT_UINT32, BASE_HEX, + NULL, 0, "Prot Info svv length", HFILL }}, + { &hf_nfs_prot_info4_spi_window, { + "Prot Info spi window", "nfs.prot_info4_spi_window", FT_UINT32, BASE_HEX, + NULL, 0, "Prot Info spi Widow", HFILL }}, + { &hf_nfs_state_protect_window, { + "State Protect window", "nfs.state_protect_window", FT_UINT32, BASE_HEX, + NULL, 0, "State Protect Widow", HFILL }}, + { &hf_nfs_state_protect_num_gss_handles, { + "State Protect num gss handles", "nfs.state_protect_num_gss_handles", FT_UINT32, BASE_HEX, + NULL, 0, "State Protect Num GSS Handles", HFILL }}, + { &hf_nfs_nii_domain4, { + "Implementer Domain name", "nfs.nii_domain4", FT_STRING, BASE_DEC, + NULL, 0, "Implementer Domain name", HFILL }}, + { &hf_nfs_nii_name4, { + "Implementation name", "nfs.nii_name4", FT_STRING, BASE_DEC, + NULL, 0, "Implementation name", HFILL }}, + { &hf_nfs_create_session_flags4, { + "CREATE_SESSION flags", "nfs.create_session_flags", FT_UINT32, BASE_HEX, + NULL, 0, "CREATE_SESSION flags", HFILL }}, + { &hf_nfs_cachethis4, { + "Cache this?", "nfs.cachethis4", FT_BOOLEAN, + BASE_NONE, &yesno, 0, "nfs.cachethis4", HFILL }}, /* Hidden field for v2, v3, and v4 status */ { &hf_nfs_nfsstat, { @@ -9259,6 +10303,17 @@ proto_register_nfs(void) &ett_nfs_verify4, &ett_nfs_write4, &ett_nfs_release_lockowner4, + &ett_nfs_exchange_id4, + &ett_nfs_create_session4, + &ett_nfs_destroy_session4, + &ett_nfs_sequence4, + &ett_nfs_layoutget4, + &ett_nfs_layoutcommit4, + &ett_nfs_layoutreturn4, + &ett_nfs_getdevinfo4, + &ett_nfs_getdevlist4, + &ett_nfs_notifyds4, + &ett_nfs_pnfs_create4, &ett_nfs_illegal4, &ett_nfs_verifier4, &ett_nfs_opaque, @@ -9288,6 +10343,32 @@ proto_register_nfs(void) &ett_nfs_gxfh3_utlfield, &ett_nfs_gxfh3_sfhfield, &ett_nfs_gxfh3_sfhflags, + &ett_nfs_slotid4, + &ett_nfs_sr_status4, + &ett_nfs_serverscope4, + &ett_nfs_minorid4, + &ett_nfs_majorid4, + &ett_nfs_persist4, + &ett_nfs_backchan4, + &ett_nfs_rdmamode4, + &ett_nfs_padsize4, + &ett_nfs_cbrenforce4, + &ett_nfs_hashalg4, + &ett_nfs_ssvlen4, + &ett_nfs_maxreqsize4, + &ett_nfs_maxrespsize4, + &ett_nfs_maxrespsizecached4, + &ett_nfs_maxops4, + &ett_nfs_maxreqs4, + &ett_nfs_streamchanattrs4, + &ett_nfs_rdmachanattrs4, + &ett_nfs_machinename4, + &ett_nfs_flavor4, + &ett_nfs_stamp4, + &ett_nfs_uid4, + &ett_nfs_gid4, + &ett_nfs_service4, + &ett_nfs_sessionid4, }; module_t *nfs_module; diff --git a/epan/dissectors/packet-nfs.h b/epan/dissectors/packet-nfs.h index 7c18e854ed..b569341679 100644 --- a/epan/dissectors/packet-nfs.h +++ b/epan/dissectors/packet-nfs.h @@ -104,6 +104,21 @@ #define NFS4_OP_VERIFY 37 #define NFS4_OP_WRITE 38 #define NFS4_OP_RELEASE_LOCKOWNER 39 +/* Minor version 1 */ +#define NFS4_OP_EXCHANGE_ID 42 +#define NFS4_OP_CREATE_SESSION 43 +#define NFS4_OP_DESTROY_SESSION 44 +#define NFS4_OP_GETDEVINFO 47 +#define NFS4_OP_GETDEVLIST 48 +#define NFS4_OP_LAYOUTCOMMIT 49 +#define NFS4_OP_LAYOUTGET 50 +#define NFS4_OP_LAYOUTRETURN 51 +#define NFS4_OP_SEQUENCE 53 +#define NFS4_OP_NOTIFYDS 60 +#define NFS4_OP_PNFS_CREATE 61 +#define NFS4_OP_PNFS_WRITE 62 +#define NFS4_OP_PNFS_READ 63 + #define NFS4_OP_ILLEGAL 10044 /* for write */ @@ -147,7 +162,7 @@ extern int dissect_access(tvbuff_t *tvb, int offset, proto_tree *tree, const char* name); extern gint default_nfs_fhandle_type; -extern int hf_nfs_nfsstat; +extern gint hf_nfs_nfsstat; #endif /* packet-nfs.h */ |