Skip to content

Commit

Permalink
feat: implement dublin and paris approach for UDP (#158 - WIP #5)
Browse files Browse the repository at this point in the history
  • Loading branch information
fujiapple852 committed Aug 19, 2022
1 parent 9b363cd commit 717a40c
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 23 deletions.
31 changes: 20 additions & 11 deletions src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ pub struct Args {
#[clap(long, default_value_t = 33000, display_order = 13)]
pub initial_sequence: u16,

/// The Equal-cost Multi-Path routing strategy (TCP & UDP only).
/// The Equal-cost Multi-Path routing strategy (IPv4/UDP only).
#[clap(
arg_enum,
short = 'R',
Expand Down Expand Up @@ -294,6 +294,7 @@ pub struct TrippyConfig {
impl TryFrom<(Args, u16)> for TrippyConfig {
type Error = anyhow::Error;

#[allow(clippy::too_many_lines)]
fn try_from(data: (Args, u16)) -> Result<Self, Self::Error> {
let (args, pid) = data;
let protocol = match (args.udp, args.tcp, args.protocol) {
Expand All @@ -313,11 +314,23 @@ impl TryFrom<(Args, u16)> for TrippyConfig {
.map_err(|_| anyhow!("invalid source IP address format: {}", addr))
})
.transpose()?;
let multipath_strategy = match args.multipath_strategy {
MultipathStrategyConfig::Classic => MultipathStrategy::Classic,
MultipathStrategyConfig::Paris => MultipathStrategy::Paris,
MultipathStrategyConfig::Dublin => MultipathStrategy::Dublin,
let addr_family = if args.ipv6 {
TracerAddrFamily::Ipv6
} else {
TracerAddrFamily::Ipv4
};
let multipath_strategy = match (args.multipath_strategy, addr_family) {
(MultipathStrategyConfig::Classic, _) => Ok(MultipathStrategy::Classic),
(MultipathStrategyConfig::Paris, _) => {
Err(anyhow!("Paris multipath strategy not implemented yet!"))
}
(MultipathStrategyConfig::Dublin, TracerAddrFamily::Ipv4) => {
Ok(MultipathStrategy::Dublin)
}
(MultipathStrategyConfig::Dublin, TracerAddrFamily::Ipv6) => Err(anyhow!(
"Dublin multipath strategy not implemented for IPv6 yet!"
)),
}?;
let port_direction = match (
protocol,
args.source_port,
Expand All @@ -334,19 +347,15 @@ impl TryFrom<(Args, u16)> for TrippyConfig {
(TracerProtocol::Tcp, Some(src), None, _) => PortDirection::new_fixed_src(src),
(_, None, Some(dest), _) => PortDirection::new_fixed_dest(dest),
(TracerProtocol::Udp, Some(src), Some(dest), MultipathStrategyConfig::Dublin) => {
validate_source_port(src)?;
PortDirection::new_fixed_both(src, dest)
}
(_, Some(_), Some(_), _) => {
return Err(anyhow!(
"only one of source-port and target-port may be fixed (except udp protocol with dublin strategy)"
"only one of source-port and target-port may be fixed (except IPv6/udp protocol with dublin strategy)"
));
}
};
let addr_family = if args.ipv6 {
TracerAddrFamily::Ipv6
} else {
TracerAddrFamily::Ipv4
};
let tui_refresh_rate = humantime::parse_duration(&args.tui_refresh_rate)?;
let dns_timeout = humantime::parse_duration(&args.dns_timeout)?;
let max_rounds = match args.mode {
Expand Down
11 changes: 3 additions & 8 deletions src/tracing/net/channel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,6 @@ impl TracerChannel {
probe,
src_addr,
dest_addr,
self.initial_sequence,
self.multipath_strategy,
self.port_direction,
self.packet_size,
self.payload_pattern,
Expand Down Expand Up @@ -206,12 +204,9 @@ impl TracerChannel {
self.multipath_strategy,
self.port_direction,
),
TracerAddrFamily::Ipv6 => ipv6::recv_icmp_probe(
&mut self.recv_socket,
self.protocol,
self.multipath_strategy,
self.port_direction,
),
TracerAddrFamily::Ipv6 => {
ipv6::recv_icmp_probe(&mut self.recv_socket, self.protocol, self.port_direction)
}
}
} else {
Ok(None)
Expand Down
5 changes: 1 addition & 4 deletions src/tracing/net/ipv6.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use crate::tracing::packet::udp::UdpPacket;
use crate::tracing::probe::{ProbeResponse, ProbeResponseData, TcpProbeResponseData};
use crate::tracing::types::{PacketSize, PayloadPattern, Sequence, TraceId};
use crate::tracing::util::Required;
use crate::tracing::{MultipathStrategy, PortDirection, Probe, TracerProtocol};
use crate::tracing::{PortDirection, Probe, TracerProtocol};
use nix::sys::socket::{AddressFamily, SockaddrLike};
use socket2::{Domain, Protocol, SockAddr, Socket, Type};
use std::io::ErrorKind;
Expand Down Expand Up @@ -102,8 +102,6 @@ pub fn dispatch_udp_probe(
probe: Probe,
src_addr: Ipv6Addr,
dest_addr: Ipv6Addr,
_initial_sequence: Sequence, // TODO
_multipath_strategy: MultipathStrategy, // TODO
port_direction: PortDirection,
packet_size: PacketSize,
payload_pattern: PayloadPattern,
Expand Down Expand Up @@ -179,7 +177,6 @@ pub fn dispatch_tcp_probe(
pub fn recv_icmp_probe(
recv_socket: &mut Socket,
protocol: TracerProtocol,
_multipath_strategy: MultipathStrategy, // TODO
direction: PortDirection,
) -> TraceResult<Option<ProbeResponse>> {
let mut buf = [0_u8; MAX_PACKET_SIZE];
Expand Down

0 comments on commit 717a40c

Please sign in to comment.