summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluwenpeng <[email protected]>2023-08-18 14:43:19 +0800
committerluwenpeng <[email protected]>2023-08-18 14:44:13 +0800
commite826e40db75b48f6eb1ec72f2d4886a83786b840 (patch)
treed6069c7c40d093b77b204b603ee371cdd6e6666b
parentd1b6c9b332b8ce6ab3e48bbb02797801c39b5f1d (diff)
[feature] Define sessions and implement methods for manipulating sessions
-rw-r--r--Cargo.toml1
-rw-r--r--src/session/mod.rs1
-rw-r--r--src/session/session.rs217
3 files changed, 219 insertions, 0 deletions
diff --git a/Cargo.toml b/Cargo.toml
index bf33680..22f845b 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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())
+ );
+ }
+}