summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/log.rs31
-rw-r--r--src/main.rs8
-rw-r--r--src/opt.rs22
-rw-r--r--src/pkt.rs16
-rw-r--r--src/pkt/fake.rs10
-rw-r--r--src/pkt/hoptab.rs14
-rw-r--r--src/platform/linux.rs23
-rw-r--r--src/platform/linux/iptables.rs24
-rw-r--r--src/platform/linux/nftables.rs4
-rw-r--r--src/platform/windows.rs33
10 files changed, 93 insertions, 92 deletions
diff --git a/src/log.rs b/src/log.rs
index 5a98749..a9d831f 100644
--- a/src/log.rs
+++ b/src/log.rs
@@ -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
}
diff --git a/src/opt.rs b/src/opt.rs
index 814b48f..f0ff59c 100644
--- a/src/opt.rs
+++ b/src/opt.rs
@@ -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());
}
}
diff --git a/src/pkt.rs b/src/pkt.rs
index 1441014..aecd437 100644
--- a/src/pkt.rs
+++ b/src/pkt.rs
@@ -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() {