all_clients: HashMap<ClientName, User>,
}
-pub type RoutedPacket = Box<[u8]>; // not MIME data
+pub struct RoutedPacket {
+ pub data: RoutedPacketData,
+ pub source: Option<ClientName>, // for eh, tracing, etc.
+}
+
+// not MIME data, valid SLIP (checked)
+pub type RoutedPacketData = Box<[u8]>;
#[throws(PacketError)]
pub async fn route_packet(global: &Global,
- conn: &str, link: &(dyn Display + Sync),
- packet: RoutedPacket, daddr: IpAddr)
+ conn: &str, source: Option<&ClientName>,
+ packet: RoutedPacketData, daddr: IpAddr)
{
let c = &global.config;
let len = packet.len();
let trace = |how: &str, why: &str| {
trace!("{} {} {} {} {:?} len={}",
- conn, link, how, why, daddr, len);
+ conn,
+ match source {
+ Some(s) => (s as &dyn Display),
+ None => &"local",
+ },
+ how, why, daddr, len);
};
let (dest, why) =
trace("discard", why); return;
};
+ let packet = RoutedPacket {
+ data: packet,
+ source: source.cloned(),
+ };
match dest.send(packet).await {
Ok(()) => trace("forward", why),
Err(_) => trace("task-crashed!", why),