const METADATA_MAX_LEN: usize = MAX_OVERHEAD;
#[derive(Debug)]
-struct Global {
+pub struct Global {
config: config::InstanceConfigGlobal,
all_clients: HashMap<ClientName, Client>,
}
#[derive(Debug)]
-struct Client {
+pub struct Client {
ic: Arc<InstanceConfig>,
web: tokio::sync::mpsc::Sender<WebRequest>,
}
+pub type RoutedPacket = Box<[u8]>; // not MIME data
+
/// Sent from hyper worker pool task to client task
#[allow(dead_code)] // xxx
#[derive(Debug)]
type WebResponseData = Vec<u8>;
#[throws(PacketError)]
-pub fn route_packet(conn: &str, link: &dyn Display,
- packet: Box<[u8]>, daddr: IpAddr)
+pub fn route_packet(_global: &Global,
+ conn: &str, link: &dyn Display,
+ packet: RoutedPacket, daddr: IpAddr)
{
// xxx
trace!("{} {} discarding packet daddr={:?} len={}",
#[allow(unused_variables)] // xxx
#[allow(unused_mut)] // xxx
-async fn run_client(ic: Arc<InstanceConfig>,
+async fn run_client(global: Arc<Global>,
+ ic: Arc<InstanceConfig>,
mut web: mpsc::Receiver<WebRequest>)
-> Result<Void, AE>
{
let daddr = ip_packet_addr::<true>(header)?;
Ok(daddr)
}, |(daddr,packet)| route_packet(
- &conn, &ic.link.client, daddr,packet
+ &global, &conn, &ic.link.client, daddr,packet
),
|e| Ok::<_,SlipFramesError<_>>({ warnings.add(&e)?; })
)?;
let ipif = Ipif::start(&global_config.ipif, None)?;
+ let ics = ics.into_iter().map(Arc::new).collect_vec();
let (client_handles_send, client_handles_recv) = ics.iter()
.map(|_ic| mpsc::channel(
5 // xxx should me max_requests_outstanding but that's
)).unzip::<_,_,Vec<_>,Vec<_>>();
let all_clients = izip!(
- ics.into_iter(),
+ &ics,
client_handles_send,
- client_handles_recv,
- ).map(|(ic, web_send, web_recv)| {
- let ic = Arc::new(ic);
-
- let ic_ = ic.clone();
- tasks.push((tokio::spawn(async move {
- run_client(ic_, web_recv).await.void_unwrap_err()
- }), format!("client {}", &ic)));
-
+ ).map(|(ic, web_send)| {
(ic.link.client,
Client {
- ic,
+ ic: ic.clone(),
web: web_send,
})
}).collect();
+
let global = Arc::new(Global {
config: global_config,
all_clients,
});
+ for (ic, web_recv) in izip!(
+ ics,
+ client_handles_recv,
+ ) {
+ let global_ = global.clone();
+ let ic_ = ic.clone();
+ tasks.push((tokio::spawn(async move {
+ run_client(global_, ic_, web_recv).await.void_unwrap_err()
+ }), format!("client {}", &ic)));
+ }
+
for addr in &global.config.addrs {
let global_ = global.clone();
let make_service = hyper::service::make_service_fn(