feat(gateway): open AF_PACKET sockets
The gateway now has a small Linux PacketSocket wrapper for raw Ethernet frame I/O. It resolves the configured interface with if_nametoindex, opens an AF_PACKET/SOCK_RAW socket for ETH_P_ALL, binds it to the interface, and exposes thin send_frame and recv_frame helpers around the owned file descriptor. The gateway binary opens this socket after completing the relay control handshake. The frame bridge loop is still intentionally left for a later slice, but the process now proves the two required resources are available: relay admission and raw L2 access on the LAN interface. Tests cover interface-name validation and missing-interface lookup without requiring root or CAP_NET_RAW. Test Plan: - cargo fmt --check - cargo test --workspace - cargo clippy --workspace --all-targets -- -D warnings Refs: PLAN.md Linux AF_PACKET gateway socket
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
use clap::Parser;
|
||||
#[cfg(target_os = "linux")]
|
||||
use lanparty_gateway::PacketSocket;
|
||||
use lanparty_gateway::{GatewayArgs, connect_gateway};
|
||||
|
||||
#[tokio::main]
|
||||
@@ -19,6 +21,18 @@ async fn main() -> anyhow::Result<()> {
|
||||
gateway.welcome().effective_tap_mtu()
|
||||
);
|
||||
println!("AF_PACKET bridging is not wired yet; press Ctrl-C to stop");
|
||||
#[cfg(target_os = "linux")]
|
||||
let _packet_socket = {
|
||||
let socket = PacketSocket::open(gateway.config().interface())?;
|
||||
println!(
|
||||
"lanparty-gateway opened AF_PACKET socket on {} (ifindex {})",
|
||||
socket.interface(),
|
||||
socket.interface_index()
|
||||
);
|
||||
socket
|
||||
};
|
||||
#[cfg(not(target_os = "linux"))]
|
||||
anyhow::bail!("lanparty-gateway requires Linux AF_PACKET support");
|
||||
|
||||
tokio::signal::ctrl_c().await?;
|
||||
gateway.shutdown("gateway shutting down").await;
|
||||
|
||||
Reference in New Issue
Block a user