use std::fmt::Debug;
use std::net::IpAddr;
use connection::{Connection, Direction};
use serialized::PacketExtra;
pub mod connection;
pub mod emit;
pub mod flow_table;
pub mod handler;
pub mod parser;
pub mod serialized;
pub mod stream;
#[derive(Clone, Debug)]
pub struct TcpMeta {
pub src_addr: IpAddr,
pub src_port: u16,
pub dst_addr: IpAddr,
pub dst_port: u16,
pub seq_number: u32,
pub ack_number: u32,
pub flags: TcpFlags,
pub window: u16,
pub option_window_scale: Option<u8>,
pub option_timestamp: Option<(u32, u32)>,
}
#[derive(Clone, Default)]
pub struct TcpFlags {
pub syn: bool,
pub ack: bool,
pub fin: bool,
pub rst: bool,
}
impl Debug for TcpFlags {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "[")?;
let mut has_prev = false;
macro_rules! write_flag {
($flag:expr) => {
if has_prev {
write!(f, ", ")?;
} else {
has_prev = true;
}
write!(f, $flag)?;
};
}
if self.syn {
write_flag!("SYN");
}
if self.ack {
write_flag!("ACK");
}
if self.fin {
write_flag!("FIN");
}
if self.rst {
write_flag!("RST");
}
let _ = has_prev;
write!(f, "]")?;
Ok(())
}
}
pub trait ConnectionHandler
where
Self: Sized,
{
type InitialData: Clone;
type ConstructError;
fn new(
init_data: Self::InitialData,
connection: &mut Connection<Self>,
) -> Result<Self, Self::ConstructError>;
fn handshake_done(&mut self, _connection: &mut Connection<Self>) {}
fn data_received(&mut self, _connection: &mut Connection<Self>, _direction: Direction) {}
fn ack_received(&mut self, _connection: &mut Connection<Self>, _direction: Direction) {}
fn fin_received(&mut self, _connection: &mut Connection<Self>, _direction: Direction) {}
fn rst_received(
&mut self,
_connection: &mut Connection<Self>,
_direction: Direction,
_extra: PacketExtra,
) {
}
fn stream_end(&mut self, _connection: &mut Connection<Self>, _direction: Direction) {}
fn connection_desync(&mut self, _connection: &mut Connection<Self>, _direction: Direction) {}
fn will_retire(&mut self, _connection: &mut Connection<Self>) {}
}
pub fn setup_log_handlers() {
use tracing_error::ErrorLayer;
use tracing_subscriber::prelude::*;
use tracing_subscriber::{fmt, EnvFilter};
color_eyre::install().unwrap();
let fmt_layer = fmt::layer();
let filter_layer = EnvFilter::try_from_default_env()
.or_else(|_| EnvFilter::try_new("info"))
.unwrap();
tracing_subscriber::registry()
.with(filter_layer)
.with(fmt_layer)
.with(ErrorLayer::default())
.init();
}
pub fn initialize_logging() {
use parking_lot::Once;
static INITIALIZE: Once = Once::new();
INITIALIZE.call_once(setup_log_handlers);
}