diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/log.rs | 31 | ||||
| -rw-r--r-- | src/main.rs | 8 | ||||
| -rw-r--r-- | src/opt.rs | 22 | ||||
| -rw-r--r-- | src/pkt.rs | 16 | ||||
| -rw-r--r-- | src/pkt/fake.rs | 10 | ||||
| -rw-r--r-- | src/pkt/hoptab.rs | 14 | ||||
| -rw-r--r-- | src/platform/linux.rs | 23 | ||||
| -rw-r--r-- | src/platform/linux/iptables.rs | 24 | ||||
| -rw-r--r-- | src/platform/linux/nftables.rs | 4 | ||||
| -rw-r--r-- | src/platform/windows.rs | 33 |
10 files changed, 93 insertions, 92 deletions
@@ -98,10 +98,33 @@ macro_rules! log_println { }}; } -#[macro_export] macro_rules! debug { ($($arg:tt)*) => { log_println!(LogLevel::Debug, $($arg)*) } } -#[macro_export] macro_rules! info { ($($arg:tt)*) => { log_println!(LogLevel::Info, $($arg)*) } } -#[macro_export] macro_rules! warn { ($($arg:tt)*) => { log_println!(LogLevel::Warning,$($arg)*) } } -#[macro_export] macro_rules! error { ($($arg:tt)*) => { log_println!(LogLevel::Error, $($arg)*) } } +#[macro_export] +macro_rules! debug { + ($($arg:tt)*) => { + crate::log_println!(crate::log::LogLevel::Debug, $($arg)*) + } +} + +#[macro_export] +macro_rules! info { + ($($arg:tt)*) => { + crate::log_println!(crate::log::LogLevel::Info, $($arg)*) + } +} + +#[macro_export] +macro_rules! warn { + ($($arg:tt)*) => { + crate::log_println!(crate::log::LogLevel::Warning, $($arg)*) + } +} + +#[macro_export] +macro_rules! error { + ($($arg:tt)*) => { + crate::log_println!(crate::log::LogLevel::Error, $($arg)*) + } +} #[macro_export] macro_rules! splash { diff --git a/src/main.rs b/src/main.rs index 8731ec9..3094d5d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,8 +23,6 @@ mod tls; mod log; mod opt; -use log::LogLevel; - const PROJECT_NAME: &str = "DPIBreak"; const PKG_VERSION: &str = env!("CARGO_PKG_VERSION"); const PKG_DESCRIPTION: &str = env!("CARGO_PKG_DESCRIPTION"); @@ -41,7 +39,7 @@ fn main_1() -> Result<()> { let initialized = opt.set_opt()?; splash_banner(); platform::bootstrap()?; - log_println!(LogLevel::Info, "{PROJECT_NAME} v{PKG_VERSION}"); + crate::info!("{PROJECT_NAME} v{PKG_VERSION}"); initialized.log(); platform::run()?; @@ -52,10 +50,10 @@ fn main() { let code = match main_1() { Ok(()) => 0, Err(e) => { - log_println!(LogLevel::Error, "{e}"); + crate::error!("{e}"); for (i, cause) in e.chain().skip(1).enumerate() { - log_println!(LogLevel::Error, "caused by[{i}]: {cause}"); + crate::error!("caused by[{i}]: {cause}"); } 1 } @@ -4,8 +4,6 @@ use anyhow::{Result, anyhow, Context}; use std::sync::OnceLock; -use crate::log_println; - use crate::log; use log::LogLevel; @@ -147,18 +145,18 @@ pub struct InitializedOpts; impl InitializedOpts { pub fn log(&self) { - log_println!(LogLevel::Info, "OPT_DAEMON: {}", daemon()); - log_println!(LogLevel::Info, "OPT_NO_SPLASH: {}", no_splash()); - log_println!(LogLevel::Info, "OPT_LOG_LEVEL: {}", log_level()); - log_println!(LogLevel::Info, "OPT_DELAY_MS: {}", delay_ms()); - log_println!(LogLevel::Info, "OPT_FAKE: {}", fake()); - log_println!(LogLevel::Info, "OPT_FAKE_TTL: {}", fake_ttl()); - log_println!(LogLevel::Info, "OPT_FAKE_AUTOTTL: {}", fake_autottl()); - log_println!(LogLevel::Info, "OPT_FAKE_BADSUM: {}", fake_badsum()); + crate::info!("OPT_DAEMON: {}", daemon()); + crate::info!("OPT_NO_SPLASH: {}", no_splash()); + crate::info!("OPT_LOG_LEVEL: {}", log_level()); + crate::info!("OPT_DELAY_MS: {}", delay_ms()); + crate::info!("OPT_FAKE: {}", fake()); + crate::info!("OPT_FAKE_TTL: {}", fake_ttl()); + crate::info!("OPT_FAKE_AUTOTTL: {}", fake_autottl()); + crate::info!("OPT_FAKE_BADSUM: {}", fake_badsum()); #[cfg(target_os = "linux")] - log_println!(LogLevel::Info, "OPT_QUEUE_NUM: {}", queue_num()); + crate::info!("OPT_QUEUE_NUM: {}", queue_num()); #[cfg(target_os = "linux")] - log_println!(LogLevel::Info, "OPT_NFT_COMMAND: {}", nft_command()); + crate::info!("OPT_NFT_COMMAND: {}", nft_command()); } } @@ -21,10 +21,6 @@ use anyhow::anyhow; #[cfg(target_os = "linux")] use std::sync::atomic::Ordering; - -use crate::log_println; - -use crate::log; use crate::opt; use crate::platform; use crate::tls; @@ -32,8 +28,6 @@ use crate::tls; mod fake; mod hoptab; -use log::LogLevel; - struct PktView<'a> { ip: IpSlice<'a>, tcp: TcpSlice<'a> @@ -186,8 +180,7 @@ fn send_split(view: &PktView, order: &[u32], buf: &mut Vec<u8>) -> Result<()> { send_segment(view, first, None, buf)?; - log_println!( - LogLevel::Debug, + crate::debug!( "send_split: dst={} segments={:?} tcp_payload_len={}", view.daddr(), order, @@ -220,8 +213,7 @@ fn put_hop_1(pkt: &[u8]) -> Result<()> { let ttl = view.ttl(); let hop = infer_hops(view.ttl()); - log_println!( - LogLevel::Debug, + crate::debug!( "put_hop_1: {}: observed ttl={}, put hop={}", addr, ttl, hop ); @@ -234,7 +226,7 @@ fn put_hop_1(pkt: &[u8]) -> Result<()> { /// Read pkt and put ip,hop to [`HopTab`] pub fn put_hop(pkt: &[u8]) { if let Err(e) = put_hop_1(pkt) { - log_println!(LogLevel::Warning, "put_hop: {}", e); + crate::warn!("put_hop: {}", e); } } @@ -267,7 +259,7 @@ macro_rules! handle_packet { Ok(true) => { $on_handled } Ok(false) => { $on_rejected } Err(e) => { - log_println!(LogLevel::Warning, "handle_packet: {e}"); + crate::warn!("handle_packet: {e}"); $on_rejected } } diff --git a/src/pkt/fake.rs b/src/pkt/fake.rs index b876748..2535d58 100644 --- a/src/pkt/fake.rs +++ b/src/pkt/fake.rs @@ -2,11 +2,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later use anyhow::Result; -use log::LogLevel; -use crate::log; use crate::opt; -use crate::log_println; use crate::pkt::hoptab; use super::PktView; @@ -96,15 +93,12 @@ pub fn fake_clienthello( match daddr_hop(&view) { Ok(hop) => { let fake_ttl = hop.saturating_sub(AUTOTTL_DELTA); - log_println!(LogLevel::Debug, - "autottl: set ttl to {fake_ttl}" - ); + crate::debug!("autottl: set ttl to {fake_ttl}"); fake_ttl }, Err(e) => { let fake_ttl = opt::fake_ttl(); - log_println!(LogLevel::Warning, - "autottl: sv_hop_find: {e}; fallback to {fake_ttl}"); + crate::warn!("autottl: sv_hop_find: {e}; fallback to {fake_ttl}"); fake_ttl } } diff --git a/src/pkt/hoptab.rs b/src/pkt/hoptab.rs index 50bc996..d8ba562 100644 --- a/src/pkt/hoptab.rs +++ b/src/pkt/hoptab.rs @@ -33,9 +33,6 @@ use std::net::IpAddr; use std::sync::{Mutex, OnceLock}; use std::net::{Ipv4Addr, Ipv6Addr}; -use crate::log_println; -use crate::log::LogLevel; - /// Size of [`HopTab`] const CAP: usize = 1 << 7; // 128 @@ -306,7 +303,7 @@ impl<const CAP: usize> HopTab<CAP> { if e.key() == key && e.has(HopTabEntry::ST_OCCUPIED) { victim = (idx, EvictPriority::MustUpdate); #[cfg(debug_assertions)] - log_println!(LogLevel::Debug, "HopTab::put: hit {}; {:#?}", victim.0, entry); + crate::debug!("HopTab::put: hit {}; {:#?}", victim.0, entry); break; } @@ -317,8 +314,7 @@ impl<const CAP: usize> HopTab<CAP> { if prio == EvictPriority::Empty { #[cfg(debug_assertions)] - log_println!(LogLevel::Debug, - "HopTab::put: hit empty {}; {:#?}", victim.0, entry); + crate::debug!("HopTab::put: hit empty {}; {:#?}", victim.0, entry); break; // linear probing; there is no key here } } @@ -327,9 +323,9 @@ impl<const CAP: usize> HopTab<CAP> { if victim.1 > EvictPriority::None { self.update(victim.0, entry); #[cfg(debug_assertions)] - log_println!(LogLevel::Debug, "HopTab::put: update {} to {:#?}", victim.0, entry); + crate::debug!("HopTab::put: update {} to {:#?}", victim.0, entry); } else { - log_println!(LogLevel::Error, "HopTab::put: update fail: corrupted; {:#?}", entry); + crate::error!("HopTab::put: update fail: corrupted; {:#?}", entry); } } @@ -349,7 +345,7 @@ impl<const CAP: usize> HopTab<CAP> { self.entries[idx].touch(); #[cfg(debug_assertions)] - log_println!(LogLevel::Debug, "HopTab::find_hop: found {idx}; {:#?}", e); + crate::debug!("HopTab::find_hop: found {idx}; {:#?}", e); return Ok(e.hop()); } } diff --git a/src/platform/linux.rs b/src/platform/linux.rs index 2015484..d21e218 100644 --- a/src/platform/linux.rs +++ b/src/platform/linux.rs @@ -11,7 +11,7 @@ use std::io::Write; use anyhow::{Result, Context, anyhow}; use socket2::{Domain, Protocol, Socket, Type}; -use crate::{log::LogLevel, log_println, splash, opt}; +use crate::opt; mod iptables; mod nftables; @@ -69,8 +69,8 @@ fn install_rules() -> Result<()> { Ok(_) => {}, Err(e) => { IS_NFT_NOT_SUPPORTED.store(true, Ordering::Relaxed); - log_println!(LogLevel::Warning, "nftables: {}", e.to_string()); - log_println!(LogLevel::Warning, "fallback to iptables"); + crate::warn!("nftables: {}", e.to_string()); + crate::warn!("fallback to iptables"); let ipt = IPTables::new(false).map_err(iptables_err)?; let ip6 = IPTables::new(true).map_err(iptables_err)?; @@ -123,7 +123,7 @@ fn lock_pid_file() -> Result<()> { fn exit_if_not_root() { if !nix::unistd::geteuid().is_root() { - log_println!(LogLevel::Error, "{PKG_NAME} must be run as root. Try sudo."); + crate::error!("{PKG_NAME} must be run as root. Try sudo."); std::process::exit(3); } } @@ -185,7 +185,7 @@ fn open_nfqueue() -> Result<nfq::Queue> { let mut q = nfq::Queue::open()?; q.bind(crate::opt::queue_num())?; - log_println!(LogLevel::Info, "nfqueue: bound to queue number {}", crate::opt::queue_num()); + crate::info!("nfqueue: bound to queue number {}", crate::opt::queue_num()); // to check inturrupts let raw_fd = q.as_raw_fd(); @@ -221,9 +221,10 @@ fn open_rxring() -> Result<rxring::RxRing> { let rx = rxring::RxRing::new(SYNACK_443_CBPF)?; - log_println!(LogLevel::Info, "rxring: initialized"); - log_println!(LogLevel::Debug, - "rxring: tcp src port 443 and tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)"); + crate::info!("rxring: initialized"); + crate::debug!( + "rxring: tcp src port 443 and tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)" + ); Ok(rx) } @@ -279,7 +280,7 @@ pub fn run() -> Result<()> { let mut rx = if opt::fake_autottl() { Some(open_rxring()?) } else { None }; let mut buf = Vec::<u8>::with_capacity(PACKET_SIZE_CAP); - splash!("{}", super::MESSAGE_AT_RUN); + crate::splash!("{}", super::MESSAGE_AT_RUN); while RUNNING.load(Ordering::SeqCst) { let (q_ready, rx_ready) = match poll_once(&q, rx.as_ref())? { @@ -338,7 +339,7 @@ fn daemonize_1() -> Result<()> { daemonize.start()?; log_file.set_len(0)?; - log_println!(LogLevel::Info, "start as daemon: pid {}", std::process::id()); + crate::info!("start as daemon: pid {}", std::process::id()); Ok(()) } @@ -349,7 +350,7 @@ fn daemonize() { match daemonize_1() { Ok(_) => {}, Err(e) => { - log_println!(LogLevel::Error, "fail to start as daemon: {e}"); + crate::error!("fail to start as daemon: {e}"); std::process::exit(EXIT_DAEMON_FAIL); } } diff --git a/src/platform/linux/iptables.rs b/src/platform/linux/iptables.rs index 4264967..52d0350 100644 --- a/src/platform/linux/iptables.rs +++ b/src/platform/linux/iptables.rs @@ -7,7 +7,7 @@ use std::sync::{ atomic::{AtomicBool, Ordering} }; -use crate::{log::LogLevel, log_println, opt}; +use crate::opt; use super::{exec_process, INJECT_MARK, IS_U32_SUPPORTED}; static IS_XT_U32_LOADED_BY_US: AtomicBool = AtomicBool::new(false); @@ -89,11 +89,11 @@ fn is_u32_supported(ipt: &IPTables) -> bool { } if ensure_xt_u32().is_err() { - log_println!(LogLevel::Warning, "xt_u32 not supported"); + crate::warn!("xt_u32 not supported"); return false; } - log_println!(LogLevel::Info, "xt_u32 loaded"); + crate::info!("xt_u32 loaded"); let rule = ["-m", "u32", "--u32", "0x0=0x0", "-j", "RETURN"]; @@ -147,36 +147,36 @@ pub fn install_iptables_rules(ipt: &IPTables) -> Result<()> { ]; ipt.append("mangle", DPIBREAK_CHAIN, &synack_rule).map_err(iptables_err)?; - log_println!(LogLevel::Info, "{}: add SYN/ACK learning rule on mangle/{}", ipt.cmd, DPIBREAK_CHAIN); + crate::info!("{}: add SYN/ACK learning rule on mangle/{}", ipt.cmd, DPIBREAK_CHAIN); ipt.insert("mangle", "INPUT", &["-j", DPIBREAK_CHAIN], 1).map_err(iptables_err)?; - log_println!(LogLevel::Info, "{}: add jump to {} chain on INPUT", ipt.cmd, DPIBREAK_CHAIN); + crate::info!("{}: add jump to {} chain on INPUT", ipt.cmd, DPIBREAK_CHAIN); } ipt.append("mangle", DPIBREAK_CHAIN, &rule).map_err(iptables_err)?; - log_println!(LogLevel::Info, "{}: new chain {} on table mangle", ipt.cmd, DPIBREAK_CHAIN); + crate::info!("{}: new chain {} on table mangle", ipt.cmd, DPIBREAK_CHAIN); ipt.insert("mangle", "POSTROUTING", &["-j", DPIBREAK_CHAIN], 1).map_err(iptables_err)?; - log_println!(LogLevel::Info, "{}: add jump to {} chain on POSTROUTING", ipt.cmd, DPIBREAK_CHAIN); + crate::info!("{}: add jump to {} chain on POSTROUTING", ipt.cmd, DPIBREAK_CHAIN); Ok(()) } pub fn cleanup_iptables_rules(ipt: &IPTables) -> Result<()> { if ipt.delete("mangle", "POSTROUTING", &["-j", DPIBREAK_CHAIN]).is_ok() { - log_println!(LogLevel::Info, "{}: delete jump to {} from mangle/POSTROUTING", ipt.cmd, DPIBREAK_CHAIN); + crate::info!("{}: delete jump to {} from mangle/POSTROUTING", ipt.cmd, DPIBREAK_CHAIN); } if opt::fake_autottl() && ipt.delete("mangle", "INPUT", &["-j", DPIBREAK_CHAIN]).is_ok() { - log_println!(LogLevel::Info, "{}: delete jump to {} from mangle/INPUT", ipt.cmd, DPIBREAK_CHAIN); + crate::info!("{}: delete jump to {} from mangle/INPUT", ipt.cmd, DPIBREAK_CHAIN); } if ipt.flush_chain("mangle", DPIBREAK_CHAIN).is_ok() { - log_println!(LogLevel::Info, "{}: flush chain {}", ipt.cmd, DPIBREAK_CHAIN); + crate::info!("{}: flush chain {}", ipt.cmd, DPIBREAK_CHAIN); } if ipt.delete_chain("mangle", DPIBREAK_CHAIN).is_ok() { - log_println!(LogLevel::Info, "{}: delete chain {}", ipt.cmd, DPIBREAK_CHAIN); + crate::info!("{}: delete chain {}", ipt.cmd, DPIBREAK_CHAIN); } Ok(()) @@ -185,7 +185,7 @@ pub fn cleanup_iptables_rules(ipt: &IPTables) -> Result<()> { pub fn cleanup_xt_u32() -> Result<()> { if IS_XT_U32_LOADED_BY_US.load(Ordering::Relaxed) { exec_process(&["modprobe", "-q", "-r", "xt_u32"], None)?; - log_println!(LogLevel::Info, "cleanup: unload xt_u32"); + crate::info!("cleanup: unload xt_u32"); } Ok(()) diff --git a/src/platform/linux/nftables.rs b/src/platform/linux/nftables.rs index 7f26668..4809000 100644 --- a/src/platform/linux/nftables.rs +++ b/src/platform/linux/nftables.rs @@ -4,14 +4,14 @@ use std::sync::atomic::Ordering; use anyhow::Result; -use crate::{log::LogLevel, log_println, opt}; +use crate::opt; use super::{exec_process, INJECT_MARK, IS_U32_SUPPORTED}; const DPIBREAK_TABLE: &str = "dpibreak"; /// Apply nft rules with `nft_command() -f -`. fn nft(rule: &str) -> Result<()> { - log_println!(LogLevel::Info, "nft: {rule}"); + crate::info!("nft: {rule}"); exec_process(&[opt::nft_command(), "-f", "-"], Some(rule)) } diff --git a/src/platform/windows.rs b/src/platform/windows.rs index eb7127c..da9c567 100644 --- a/src/platform/windows.rs +++ b/src/platform/windows.rs @@ -23,7 +23,6 @@ use windivert::{ }; use std::sync::{LazyLock, Mutex}; use std::thread; -use crate::{log::LogLevel, log_println, splash}; use crate::{opt, pkt}; fn open_handle(filter: &str, flags: prelude::WinDivertFlags) -> WinDivert<NetworkLayer> { @@ -31,12 +30,12 @@ fn open_handle(filter: &str, flags: prelude::WinDivertFlags) -> WinDivert<Networ let h = match WinDivert::network(&filter, 0, flags) { Ok(h) => { - log_println!(LogLevel::Info, "windivert: open: {}", filter); + crate::info!("windivert: open: {}", filter); h }, Err(e) => { - log_println!(LogLevel::Error, "windivert: {}", e); - log_println!(LogLevel::Error, "windivert: {}", filter); + crate::error!("windivert: {}", e); + crate::error!("windivert: {}", filter); std::process::exit(1); } }; @@ -83,7 +82,7 @@ macro_rules! recv_loop { loop { match $handle.recv(Some(&mut buf)) { Ok($pkt) => { $body } - Err(e) => { log_println!(LogLevel::Warning, "windivert: recv: {}", e); } + Err(e) => { crate::warn!("windivert: recv: {}", e); } } } }; @@ -91,15 +90,15 @@ macro_rules! recv_loop { pub fn run() -> Result<()> { let mut buf = Vec::<u8>::with_capacity(super::PACKET_SIZE_CAP); - + if opt::fake_autottl() { let handle = open_handle( "!outbound and tcp and tcp.SrcPort == 443 and tcp.Syn and tcp.Ack", prelude::WinDivertFlags::new().set_sniff() ); - thread::spawn(move || { recv_loop!(handle, pkt => pkt::put_hop(&pkt.data)); }); + thread::spawn(move || { recv_loop!(handle, pkt => pkt::put_hop(&pkt.data)); }); } - + let divert = open_handle( concat!( "outbound and tcp and tcp.DstPort == 443", @@ -109,16 +108,16 @@ pub fn run() -> Result<()> { prelude::WinDivertFlags::new() ); - splash!("{}", super::MESSAGE_AT_RUN); + crate::splash!("{}", super::MESSAGE_AT_RUN); - recv_loop!(divert, pkt => { - crate::handle_packet!( - &pkt.data, - &mut buf, - handled => {}, - rejected => send_to_raw_1(&pkt.data)? - ) - }); + recv_loop!(divert, pkt => { + crate::handle_packet!( + &pkt.data, + &mut buf, + handled => {}, + rejected => send_to_raw_1(&pkt.data)? + ) + }); } fn service_run() { |
