use crate::ast::{TcpFlag, TcpOptions};
use alloc::vec::Vec;
pub fn encode_tcp_flags(flags: &[TcpFlag]) -> u8 {
let mut byte = 0u8;
for flag in flags {
match flag {
TcpFlag::Fin => byte |= 0x01,
TcpFlag::Syn => byte |= 0x02,
TcpFlag::Rst => byte |= 0x04,
TcpFlag::Psh => byte |= 0x08,
TcpFlag::Ack => byte |= 0x10,
TcpFlag::Urg => byte |= 0x20,
TcpFlag::Ece => byte |= 0x40,
TcpFlag::Cwr => byte |= 0x80,
}
}
byte
}
pub fn encode_tcp_options(opts: &TcpOptions) -> Vec<u8> {
let mut tcp_opts = Vec::new();
if let Some(mss) = opts.mss {
tcp_opts.push(2); tcp_opts.push(4); tcp_opts.extend_from_slice(&mss.to_be_bytes());
}
if let Some(ws) = opts.wscale {
tcp_opts.push(1); tcp_opts.push(3); tcp_opts.push(3); tcp_opts.push(ws);
}
if opts.sack_perm {
tcp_opts.push(4); tcp_opts.push(2); }
if opts.tsval.is_some() || opts.tsecr.is_some() {
let ts_val = opts.tsval.unwrap_or(0);
let ts_ecr = opts.tsecr.unwrap_or(0);
tcp_opts.push(8); tcp_opts.push(10); tcp_opts.extend_from_slice(&ts_val.to_be_bytes());
tcp_opts.extend_from_slice(&ts_ecr.to_be_bytes());
}
while !tcp_opts.len().is_multiple_of(4) {
tcp_opts.push(0); }
tcp_opts
}