use flowscope::driver::{DriverBuilder, SlotHandle};
use flowscope::extract::{FiveTuple, FiveTupleKey};
use crate::protocol::{Dispatch, MessageProtocol, Protocol, ProtocolInitError};
#[derive(Debug, Clone, Copy)]
pub struct Rdp;
impl MessageProtocol for Rdp {}
impl Protocol for Rdp {
type Message = flowscope::rdp::RdpMessage;
const NAME: &'static str = flowscope::rdp::PARSER_KIND;
fn dispatch() -> Dispatch {
Dispatch::Tcp(vec![flowscope::rdp::RDP_PORT])
}
fn register(
builder: &mut DriverBuilder<FiveTuple>,
) -> Result<SlotHandle<Self::Message, FiveTupleKey>, ProtocolInitError> {
let ports = match Self::dispatch() {
Dispatch::Tcp(p) => p,
_ => unreachable!("Rdp::dispatch is Dispatch::Tcp by construction"),
};
Ok(builder.session_on_ports(flowscope::rdp::RdpParser::new(), ports))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn dispatch_targets_tcp_3389() {
match Rdp::dispatch() {
Dispatch::Tcp(ports) => assert_eq!(ports, vec![3389]),
other => panic!("expected Dispatch::Tcp, got {other:?}"),
}
}
#[test]
fn name_is_rdp() {
assert_eq!(Rdp::NAME, "rdp");
}
}