use crate::error::{Error, Result};
use std::net::{SocketAddr, ToSocketAddrs};
fn match_range(lower: u8, upper: u8) -> impl Fn(&[u8]) -> bool {
move |buf: &[u8]| -> bool {
if buf.is_empty() {
return false;
}
let b = buf[0];
b >= lower && b <= upper
}
}
pub fn match_dtls(b: &[u8]) -> bool {
match_range(20, 63)(b)
}
pub fn match_srtp_or_srtcp(b: &[u8]) -> bool {
match_range(128, 191)(b)
}
pub fn is_rtcp(buf: &[u8]) -> bool {
if buf.len() < 4 {
return false;
}
let rtcp_packet_type = buf[1];
(192..=223).contains(&rtcp_packet_type)
}
pub fn match_srtp(buf: &[u8]) -> bool {
match_srtp_or_srtcp(buf) && !is_rtcp(buf)
}
pub fn match_srtcp(buf: &[u8]) -> bool {
match_srtp_or_srtcp(buf) && is_rtcp(buf)
}
pub fn lookup_host<T>(use_ipv4: bool, host: T) -> Result<SocketAddr>
where
T: ToSocketAddrs,
{
for remote_addr in host.to_socket_addrs()? {
if (use_ipv4 && remote_addr.is_ipv4()) || (!use_ipv4 && remote_addr.is_ipv6()) {
return Ok(remote_addr);
}
}
Err(Error::ErrAddressParseFailed)
}