mod client;
mod config;
mod error;
mod icmp;
mod ping;
use std::{net::IpAddr, time::Duration};
pub use client::{AsyncSocket, Client};
pub use config::{Config, ConfigBuilder};
pub use error::SurgeError;
pub use icmp::{
icmpv4::Icmpv4Packet, icmpv6::Icmpv6Packet, IcmpPacket, PingIdentifier, PingSequence,
};
pub use ping::Pinger;
use rand::random;
#[derive(Debug, Clone, Copy)]
pub enum ICMP {
V4,
V6,
}
impl Default for ICMP {
fn default() -> Self {
ICMP::V4
}
}
pub async fn ping(host: IpAddr, payload: &[u8]) -> Result<(IcmpPacket, Duration), SurgeError> {
let config = match host {
IpAddr::V4(_) => Config::default(),
IpAddr::V6(_) => Config::builder().kind(ICMP::V6).build(),
};
let client = Client::new(&config)?;
let mut pinger = client.pinger(host, PingIdentifier(random())).await;
pinger.ping(PingSequence(0), payload).await
}