diff options
| author | luwenpeng <[email protected]> | 2023-08-18 14:43:19 +0800 |
|---|---|---|
| committer | luwenpeng <[email protected]> | 2023-08-18 14:44:13 +0800 |
| commit | e826e40db75b48f6eb1ec72f2d4886a83786b840 (patch) | |
| tree | d6069c7c40d093b77b204b603ee371cdd6e6666b | |
| parent | d1b6c9b332b8ce6ab3e48bbb02797801c39b5f1d (diff) | |
[feature] Define sessions and implement methods for manipulating sessions
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/session/mod.rs | 1 | ||||
| -rw-r--r-- | src/session/session.rs | 217 |
3 files changed, 219 insertions, 0 deletions
@@ -7,3 +7,4 @@ edition = "2021" [dependencies] nom = "7" +chrono = "0.4"
\ No newline at end of file diff --git a/src/session/mod.rs b/src/session/mod.rs index 682d981..efb9275 100644 --- a/src/session/mod.rs +++ b/src/session/mod.rs @@ -1 +1,2 @@ pub mod tuple; +pub mod session;
\ No newline at end of file diff --git a/src/session/session.rs b/src/session/session.rs new file mode 100644 index 0000000..65da07c --- /dev/null +++ b/src/session/session.rs @@ -0,0 +1,217 @@ +use crate::session::tuple::FiveTuple; +use chrono::Utc; +use std::collections::HashMap; + +/****************************************************************************** + * Struct + ******************************************************************************/ + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum SessionState { + New, + Active, + Inactive, + Expired, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct SessionMetrics { + pub c2s_pkts_sent: u64, + pub c2s_pkts_recv: u64, + + pub c2s_bytes_sent: u64, + pub c2s_bytes_recv: u64, + + pub s2c_pkts_sent: u64, + pub s2c_pkts_recv: u64, + + pub s2c_bytes_sent: u64, + pub s2c_bytes_recv: u64, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] + +struct SessionTimeStamp { + ts_start: i64, + ts_end: i64, + ts_expires: i64, + ts_last_seen: i64, +} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct Session { + session_id: String, + session_state: SessionState, + session_metrics: SessionMetrics, + session_five_tuple: FiveTuple, + session_timestamp: SessionTimeStamp, + session_exdata: HashMap<String, String>, +} + +/****************************************************************************** + * API + ******************************************************************************/ + +impl Session { + pub fn new(tuple: FiveTuple) -> Session { + let timestamp = Utc::now().timestamp(); + Session { + session_id: tuple.to_string(), + session_state: SessionState::New, + session_metrics: SessionMetrics { + c2s_pkts_sent: 0, + c2s_pkts_recv: 0, + c2s_bytes_sent: 0, + c2s_bytes_recv: 0, + s2c_pkts_sent: 0, + s2c_pkts_recv: 0, + s2c_bytes_sent: 0, + s2c_bytes_recv: 0, + }, + session_five_tuple: tuple, + session_timestamp: SessionTimeStamp { + ts_start: timestamp, + ts_end: 0, + ts_expires: timestamp + 60, + ts_last_seen: timestamp, + }, + session_exdata: HashMap::new(), + } + } + + pub fn get_session_id(&self) -> String { + self.session_id.clone() + } + + pub fn set_session_state(&mut self, state: SessionState) { + self.session_state = state; + } + + pub fn get_session_state(&self) -> SessionState { + self.session_state + } + + pub fn set_session_c2s_metrics( + &mut self, + pkts_sent: u64, + pkts_recv: u64, + bytes_sent: u64, + bytes_recv: u64, + ) { + self.session_metrics.c2s_pkts_sent = pkts_sent; + self.session_metrics.c2s_pkts_recv = pkts_recv; + self.session_metrics.c2s_bytes_sent = bytes_sent; + self.session_metrics.c2s_bytes_recv = bytes_recv; + } + + pub fn set_session_s2c_metrics( + &mut self, + pkts_sent: u64, + pkts_recv: u64, + bytes_sent: u64, + bytes_recv: u64, + ) { + self.session_metrics.s2c_pkts_sent = pkts_sent; + self.session_metrics.s2c_pkts_recv = pkts_recv; + self.session_metrics.s2c_bytes_sent = bytes_sent; + self.session_metrics.s2c_bytes_recv = bytes_recv; + } + + pub fn get_session_metrics(&self) -> SessionMetrics { + self.session_metrics + } + + pub fn get_session_five_tuple(&self) -> FiveTuple { + self.session_five_tuple + } + + pub fn get_session_start_ts(&self) -> i64 { + self.session_timestamp.ts_start + } + + pub fn set_session_expire_ts(&mut self, ts: i64) { + self.session_timestamp.ts_expires = ts; + } + + pub fn get_session_expire_ts(&self) -> i64 { + self.session_timestamp.ts_expires + } + + pub fn set_session_last_seen_ts(&mut self, ts: i64) { + self.session_timestamp.ts_last_seen = ts; + } + + pub fn get_session_last_seen_ts(&self) -> i64 { + self.session_timestamp.ts_last_seen + } + + pub fn set_session_end_ts(&mut self, ts: i64) { + self.session_timestamp.ts_end = ts; + } + + pub fn get_session_end_ts(&self) -> i64 { + self.session_timestamp.ts_end + } + + pub fn set_session_exdata(&mut self, key: String, value: String) { + self.session_exdata.insert(key, value); + } + + pub fn get_session_exdata(&self, key: String) -> Option<&String> { + self.session_exdata.get(&key) + } +} + +/****************************************************************************** + * TEST + ******************************************************************************/ + +#[cfg(test)] +mod tests { + use super::Session; + use crate::session::tuple::FiveTuple; + use std::net::Ipv4Addr; + + #[test] + fn test_session() { + let five_tuple_4 = FiveTuple::from_v4( + Ipv4Addr::new(192, 168, 0, 1), + Ipv4Addr::new(192, 168, 0, 2), + 2345, + 80, + 1, + ); + + let mut session = Session::new(five_tuple_4); + + assert_eq!( + session.get_session_id(), + "4:192.168.0.1:2345-192.168.0.2:80:1" + ); + assert_eq!(session.get_session_state(), super::SessionState::New); + assert_eq!(session.get_session_metrics().c2s_pkts_sent, 0); + assert_eq!(session.get_session_metrics().c2s_pkts_recv, 0); + assert_eq!(session.get_session_metrics().c2s_bytes_sent, 0); + assert_eq!(session.get_session_metrics().c2s_bytes_recv, 0); + assert_eq!(session.get_session_metrics().s2c_pkts_sent, 0); + assert_eq!(session.get_session_metrics().s2c_pkts_recv, 0); + assert_eq!(session.get_session_metrics().s2c_bytes_sent, 0); + assert_eq!(session.get_session_metrics().s2c_bytes_recv, 0); + assert_eq!(session.get_session_five_tuple(), five_tuple_4); + assert_eq!( + session.get_session_start_ts(), + session.get_session_last_seen_ts() + ); + assert_eq!( + session.get_session_start_ts(), + session.get_session_expire_ts() - 60 + ); + assert_eq!(session.get_session_end_ts(), 0); + + session.set_session_exdata("Hello".to_string(), "Word".to_string()); + assert_eq!( + session.get_session_exdata("Hello".to_string()), + Some(&"Word".to_string()) + ); + } +} |
