|
1 | 1 | use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; |
2 | 2 |
|
| 3 | +use serde::Deserialize; |
3 | 4 | use ts_storage::{DataValue, IpTuple}; |
4 | 5 |
|
5 | 6 | use crate::{db_writer::DBOperation, flow_tracker::{EventIndexer, AF_INET}, reader::FromBuffer}; |
6 | 7 |
|
7 | 8 | use arrayref::array_ref; |
8 | | - |
9 | 9 | #[repr(C)] |
10 | | -#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Default)] |
| 10 | +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Default, Deserialize)] |
11 | 11 | pub struct sock_trace_entry { |
12 | 12 | pub time: u64, |
13 | 13 | pub addr_v4: u64, |
14 | | - pub src_v6: [u8; 16], |
15 | | - pub dst_v6: [u8; 16], |
| 14 | + pub src_v6: [u8; 16usize], |
| 15 | + pub dst_v6: [u8; 16usize], |
16 | 16 | pub ports: u32, |
17 | 17 | pub family: u16, |
18 | 18 | // SOCK Stats |
@@ -45,29 +45,113 @@ pub struct sock_trace_entry { |
45 | 45 | // TCP_SOCK -> tcp_options_received |
46 | 46 | pub snd_wscale: u16, |
47 | 47 | pub rcv_wscale: u16, |
48 | | - pub div: u32 |
| 48 | + pub div: [u8; 4usize], |
49 | 49 | } |
50 | 50 |
|
51 | 51 | impl FromBuffer for sock_trace_entry { |
52 | 52 | fn from_buffer(buf: &Vec<u8>) -> Self { |
53 | | - unsafe { *(buf.as_ptr() as *const sock_trace_entry) } |
| 53 | + //unsafe { *(buf.as_ptr() as *const sock_trace_entry) } |
| 54 | + |
| 55 | + let try_deserialize = bincode::deserialize::<'_, sock_trace_entry>(buf); |
| 56 | + |
| 57 | + if try_deserialize.is_err() { |
| 58 | + sock_trace_entry::default() |
| 59 | + } else { |
| 60 | + try_deserialize.unwrap() |
| 61 | + } |
54 | 62 |
|
55 | 63 | } |
| 64 | + const ENTRY_SIZE: usize = 160; |
56 | 65 | } |
57 | 66 |
|
58 | 67 | impl EventIndexer for sock_trace_entry { |
59 | 68 | fn get_field(&self, index: usize) -> Option<DataValue> { |
60 | 69 | match index { |
| 70 | + 0 => if self.pacing_rate > 0 {Some(DataValue::Int(self.pacing_rate as i64))} else {None}, |
| 71 | + 1 => if self.max_pacing_rate > 0 {Some(DataValue::Int(self.max_pacing_rate as i64))} else {None}, |
| 72 | + 2 => if self.backoff > 0 {Some(DataValue::Int(self.backoff as i64))} else {None}, |
| 73 | + 3 => if self.rto > 0 {Some(DataValue::Int(self.rto as i64))} else {None}, |
| 74 | + 4 => if self.ato > 0 {Some(DataValue::Int(self.ato as i64))} else {None}, |
| 75 | + 5 => if self.rcv_mss > 0 {Some(DataValue::Int(self.rcv_mss as i64))} else {None}, |
| 76 | + 6 => if self.snd_cwnd > 0 {Some(DataValue::Int(self.snd_cwnd as i64))} else {None}, |
| 77 | + 7 => if self.bytes_acked > 0 {Some(DataValue::Int(self.bytes_acked as i64))} else {None}, |
| 78 | + 8 => if self.snd_ssthresh > 0 {Some(DataValue::Int(self.snd_ssthresh as i64))} else {None}, |
| 79 | + 9 => if self.total_retrans > 0 {Some(DataValue::Int(self.total_retrans as i64))} else {None}, |
| 80 | + 10 => if self.probes > 0 {Some(DataValue::Int(self.probes as i64))} else {None}, |
| 81 | + 11 => if self.lost > 0 {Some(DataValue::Int(self.lost as i64))} else {None}, |
| 82 | + 12 => if self.sacked_out > 0 {Some(DataValue::Int(self.sacked_out as i64))} else {None}, |
| 83 | + 13 => if self.retrans > 0 {Some(DataValue::Int(self.retrans as i64))} else {None}, |
| 84 | + 14 => if self.rcv_ssthresh > 0 {Some(DataValue::Int(self.rcv_ssthresh as i64))} else {None}, |
| 85 | + 15 => if self.rttvar > 0 {Some(DataValue::Int(self.rttvar as i64))} else {None}, |
| 86 | + 16 => if self.advmss > 0 {Some(DataValue::Int(self.advmss as i64))} else {None}, |
| 87 | + 17 => if self.reordering > 0 {Some(DataValue::Int(self.reordering as i64))} else {None}, |
| 88 | + 18 => if self.rcv_rtt > 0 {Some(DataValue::Int(self.rcv_rtt as i64))} else {None}, |
| 89 | + 19 => if self.rcv_space > 0 {Some(DataValue::Int(self.rcv_space as i64))} else {None}, |
| 90 | + 20 => if self.bytes_received > 0 {Some(DataValue::Int(self.bytes_received as i64))} else {None}, |
| 91 | + 21 => if self.segs_out> 0 {Some(DataValue::Int(self.segs_out as i64))} else {None}, |
| 92 | + 22 => if self.segs_in > 0 {Some(DataValue::Int(self.segs_in as i64))} else {None}, |
| 93 | + 23 => if self.snd_wscale > 0 {Some(DataValue::Int(self.snd_wscale as i64))} else {None}, |
| 94 | + 24 => if self.rcv_wscale > 0 {Some(DataValue::Int(self.rcv_wscale as i64))} else {None}, |
61 | 95 | _ => None, // TODO: better error handling |
62 | 96 | } |
63 | 97 | } |
64 | 98 | fn get_default_field(&self, index: usize) -> DataValue { |
65 | 99 | match index { |
| 100 | + 0 => DataValue::Int(0), |
| 101 | + 1 => DataValue::Int(0), |
| 102 | + 2 => DataValue::Int(0), |
| 103 | + 3 => DataValue::Int(0), |
| 104 | + 4 => DataValue::Int(0), |
| 105 | + 5 => DataValue::Int(0), |
| 106 | + 6 => DataValue::Int(0), |
| 107 | + 7 => DataValue::Int(0), |
| 108 | + 8 => DataValue::Int(0), |
| 109 | + 9 => DataValue::Int(0), |
| 110 | + 10 => DataValue::Int(0), |
| 111 | + 11 => DataValue::Int(0), |
| 112 | + 12 => DataValue::Int(0), |
| 113 | + 13 => DataValue::Int(0), |
| 114 | + 14 => DataValue::Int(0), |
| 115 | + 15 => DataValue::Int(0), |
| 116 | + 16 => DataValue::Int(0), |
| 117 | + 17 => DataValue::Int(0), |
| 118 | + 18 => DataValue::Int(0), |
| 119 | + 19 => DataValue::Int(0), |
| 120 | + 20 => DataValue::Int(0), |
| 121 | + 21 => DataValue::Int(0), |
| 122 | + 22 => DataValue::Int(0), |
| 123 | + 23 => DataValue::Int(0), |
| 124 | + 24 => DataValue::Int(0), |
66 | 125 | _ => panic!("Tried to access out of bounds index!"), // TODO: better error handling |
67 | 126 | } |
68 | 127 | } |
69 | 128 | fn get_field_name(&self, index: usize) -> &str { |
70 | 129 | match index { |
| 130 | + 0 => "pacing_rate", |
| 131 | + 1 => "max_pacing_rate", |
| 132 | + 2 => "backoff", |
| 133 | + 3 => "rto", |
| 134 | + 4 => "ato", |
| 135 | + 5 => "rcv_mss", |
| 136 | + 6 => "snd_cwnd", |
| 137 | + 7 => "bytes_acked", |
| 138 | + 8 => "snd_ssthresh", |
| 139 | + 9 => "total_retrans", |
| 140 | + 10 => "probes", |
| 141 | + 11 => "lost", |
| 142 | + 12 => "sacked_out", |
| 143 | + 13 => "retrans", |
| 144 | + 14 => "rcv_ssthresh", |
| 145 | + 15 => "rttvar", |
| 146 | + 16 => "advmss", |
| 147 | + 17 => "reordering", |
| 148 | + 18 => "rcv_rtt", |
| 149 | + 19 => "rcv_space", |
| 150 | + 20 => "bytes_received", |
| 151 | + 21 => "segs_out", |
| 152 | + 22 => "segs_in", |
| 153 | + 23 => "snd_wscale", |
| 154 | + 24 => "rcv_wscale", |
71 | 155 | _ => panic!("Tried to access out of bounds index!"), // TODO: better error handling |
72 | 156 | } |
73 | 157 | } |
@@ -114,12 +198,15 @@ impl EventIndexer for sock_trace_entry { |
114 | 198 | } |
115 | 199 | } |
116 | 200 | fn get_max_index(&self) -> usize { |
117 | | - 0 |
| 201 | + 24 |
118 | 202 | } |
119 | 203 | fn get_timestamp(&self) -> f64 { |
120 | 204 | self.time as f64 |
121 | 205 | } |
122 | 206 | fn as_db_op(self) -> DBOperation { |
123 | 207 | DBOperation::Socket(self) |
124 | 208 | } |
| 209 | + fn get_struct_length(&self) -> usize { |
| 210 | + 160 |
| 211 | + } |
125 | 212 | } |
0 commit comments