From: Victor Julien Date: Thu, 19 Jul 2018 13:28:12 +0000 (+0200) Subject: nfs4: support 4.1 SEQUENCE procedure X-Git-Tag: suricata-4.1.0-rc1~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f2382356b1a145f34a7b5cc7e42f7a2d64657930;p=thirdparty%2Fsuricata.git nfs4: support 4.1 SEQUENCE procedure --- diff --git a/rust/src/nfs/nfs4_records.rs b/rust/src/nfs/nfs4_records.rs index 2db54cb619..52684a83ad 100644 --- a/rust/src/nfs/nfs4_records.rs +++ b/rust/src/nfs/nfs4_records.rs @@ -45,6 +45,7 @@ pub enum Nfs4RequestContent<'a> { SetClientId(Nfs4RequestSetClientId<'a>), SetClientIdConfirm, ExchangeId(Nfs4RequestExchangeId<'a>), + Sequence(Nfs4RequestSequence<'a>), } #[derive(Debug,PartialEq)] @@ -444,6 +445,25 @@ named!(nfs4_req_exchangeid, )) )); +#[derive(Debug,PartialEq)] +pub struct Nfs4RequestSequence<'a> { + pub ssn_id: &'a[u8], +} + +named!(nfs4_req_sequence, + do_parse!( + ssn_id: take!(16) + >> seq_id: be_u32 + >> slot_id: be_u32 + >> high_slot_id: be_u32 + >> cache_this: be_u32 + >> (Nfs4RequestContent::Sequence( + Nfs4RequestSequence { + ssn_id: ssn_id, + } + )) +)); + named!(parse_request_compound_command, do_parse!( cmd: be_u32 @@ -470,6 +490,7 @@ named!(parse_request_compound_command, NFSPROC4_PUTROOTFH => call!(nfs4_req_putrootfh) | NFSPROC4_SETCLIENTID => call!(nfs4_req_setclientid) | NFSPROC4_SETCLIENTID_CONFIRM => call!(nfs4_req_setclientid_confirm) | + NFSPROC4_SEQUENCE => call!(nfs4_req_sequence) | NFSPROC4_EXCHANGE_ID => call!(nfs4_req_exchangeid) ) >> ( cmd_data ) @@ -516,6 +537,7 @@ pub enum Nfs4ResponseContent<'a> { SetClientIdConfirm(u32), Create(u32), Commit(u32), + Sequence(u32, Option>), } #[derive(Debug,PartialEq)] @@ -818,6 +840,29 @@ named!(nfs4_res_access, status, ad, )) )); + +#[derive(Debug,PartialEq)] +pub struct Nfs4ResponseSequence<'a> { + pub ssn_id: &'a[u8], +} + +named!(nfs4_res_sequence_ok, + do_parse!( + ssn_id: take!(16) + >> _slots: take!(12) + >> _flags: be_u32 + >> ( Nfs4ResponseSequence { + ssn_id: ssn_id, + }) +)); + +named!(nfs4_res_sequence, + do_parse!( + status: be_u32 + >> seq: cond!(status == 0, nfs4_res_sequence_ok) + >> ( Nfs4ResponseContent::Sequence(status, seq) ) +)); + named!(nfs4_res_compound_command, do_parse!( cmd: be_u32 @@ -843,6 +888,7 @@ named!(nfs4_res_compound_command, NFSPROC4_SETCLIENTID => call!(nfs4_res_setclientid) | NFSPROC4_SETCLIENTID_CONFIRM => call!(nfs4_res_setclientid_confirm) | NFSPROC4_PUTROOTFH => call!(nfs4_res_putrootfh) | + NFSPROC4_SEQUENCE => call!(nfs4_res_sequence) | NFSPROC4_RENEW => call!(nfs4_res_renew)) >> (cmd_data) )); diff --git a/rust/src/nfs/types.rs b/rust/src/nfs/types.rs index bc1a68b92f..e916fdc553 100644 --- a/rust/src/nfs/types.rs +++ b/rust/src/nfs/types.rs @@ -265,6 +265,7 @@ pub const NFSPROC4_SETCLIENTID_CONFIRM: u32 = 36; pub const NFSPROC4_VERIFY: u32 = 37; pub const NFSPROC4_WRITE: u32 = 38; pub const NFSPROC4_RELEASE_LOCKOWNER: u32 = 39; +pub const NFSPROC4_SEQUENCE: u32 = 53; pub const NFSPROC4_EXCHANGE_ID: u32 = 42;