summaryrefslogtreecommitdiffstats
path: root/src/wireguard/router/worker.rs
blob: bbb644c22ecc363f64e3f4232b8b4c99abc0a5a5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use super::super::{tun, udp, Endpoint};
use super::types::Callbacks;

use super::queue::ParallelJob;
use super::receive::ReceiveJob;
use super::send::SendJob;

use crossbeam_channel::Receiver;

pub enum JobUnion<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> {
    Outbound(SendJob<E, C, T, B>),
    Inbound(ReceiveJob<E, C, T, B>),
}

pub fn worker<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
    receiver: Receiver<JobUnion<E, C, T, B>>,
) {
    loop {
        match receiver.recv() {
            Err(_) => break,
            Ok(JobUnion::Inbound(job)) => {
                job.parallel_work();
                job.queue().consume();
            }
            Ok(JobUnion::Outbound(job)) => {
                job.parallel_work();
                job.queue().consume();
            }
        }
    }
}