From 07c7f910940bceab8441249c7f21524c4def5ed7 Mon Sep 17 00:00:00 2001 From: Jhonny Sousa Date: Mon, 27 Oct 2025 15:45:48 -0300 Subject: [PATCH] nfs: Fix NFSv2 STATFS procedure parsing Ticket: #5140 (cherry picked from commit 257ed82dbded434d18095b72b5008435fb31599e) --- rust/src/nfs/log.rs | 4 +++- rust/src/nfs/types.rs | 55 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/rust/src/nfs/log.rs b/rust/src/nfs/log.rs index e2b63f2c57..6cd463a754 100644 --- a/rust/src/nfs/log.rs +++ b/rust/src/nfs/log.rs @@ -81,8 +81,10 @@ fn nfs_common_header( state: &NFSState, tx: &NFSTransaction, js: &mut JsonBuilder, ) -> Result<(), JsonError> { js.set_uint("version", state.nfs_version as u64)?; - let proc_string = if state.nfs_version < 4 { + let proc_string = if state.nfs_version == 3 { nfs3_procedure_string(tx.procedure) + } else if state.nfs_version <= 2 { + nfs2_procedure_string(tx.procedure) } else { nfs4_procedure_string(tx.procedure) }; diff --git a/rust/src/nfs/types.rs b/rust/src/nfs/types.rs index 609d02be43..f93f650410 100644 --- a/rust/src/nfs/types.rs +++ b/rust/src/nfs/types.rs @@ -15,6 +15,61 @@ * 02110-1301, USA. */ +use crate::detect::EnumString; + +/* RFC 1094, section '2.2 Server Procedures' */ +#[repr(u32)] +#[derive(EnumStringU32)] +#[allow(non_camel_case_types)] +pub enum NfsProc2 { + NULL = 0, + GETATTR = 1, + SETATTR = 2, + ROOT = 3, + LOOKUP = 4, + READLINK = 5, + READ = 6, + WRITECACHE = 7, + WRITE = 8, + CREATE = 9, + REMOVE = 10, + RENAME = 11, + LINK = 12, + SYMLINK = 13, + MKDIR = 14, + RMDIR = 15, + READDIR = 16, + STATFS = 17, +} + + +pub fn nfs2_procedure_string(procedure: u32) -> String { + match NfsProc2::from_u(procedure) { + Some(NfsProc2::NULL) => "NULL", + Some(NfsProc2::GETATTR) => "GETATTR", + Some(NfsProc2::SETATTR) => "SETATTR", + Some(NfsProc2::ROOT) => "ROOT", + Some(NfsProc2::LOOKUP) => "LOOKUP", + Some(NfsProc2::READLINK) => "READLINK", + Some(NfsProc2::READ) => "READ", + Some(NfsProc2::WRITECACHE) => "WRITECACHE", + Some(NfsProc2::WRITE) => "WRITE", + Some(NfsProc2::CREATE) => "CREATE", + Some(NfsProc2::REMOVE) => "REMOVE", + Some(NfsProc2::RENAME) => "RENAME", + Some(NfsProc2::LINK) => "LINK", + Some(NfsProc2::SYMLINK) => "SYMLINK", + Some(NfsProc2::MKDIR) => "MKDIR", + Some(NfsProc2::RMDIR) => "RMDIR", + Some(NfsProc2::READDIR) => "READDIR", + Some(NfsProc2::STATFS) => "STATFS", + None => { + return (procedure).to_string(); + } + } + .to_string() +} + /* RFC 1813, section '3. Server Procedures' */ pub const NFSPROC3_NULL: u32 = 0; pub const NFSPROC3_GETATTR: u32 = 1;