Correct IPv6 address generation (#5113)

* Correct IPv6 addres generation

* Fix clippy
This commit is contained in:
Bogdan-Ștefan Neacşu
2024-11-11 13:57:44 +02:00
committed by GitHub
parent f005693643
commit 84fff02e12
4 changed files with 36 additions and 11 deletions
@@ -50,12 +50,27 @@ impl fmt::Display for IpPair {
impl From<IpAddr> for IpPair {
fn from(value: IpAddr) -> Self {
let transformed_ipv4 = WG_TUN_DEVICE_IP_ADDRESS_V4;
let transformed_ipv6 = WG_TUN_DEVICE_IP_ADDRESS_V6;
let (ipv4, ipv6) = match value {
std::net::IpAddr::V4(ipv4_addr) => (ipv4_addr, transformed_ipv6),
std::net::IpAddr::V6(ipv6_addr) => (transformed_ipv4, ipv6_addr),
let (before_last_byte, last_byte) = match value {
std::net::IpAddr::V4(ipv4_addr) => (ipv4_addr.octets()[2], ipv4_addr.octets()[3]),
std::net::IpAddr::V6(ipv6_addr) => (ipv6_addr.octets()[14], ipv6_addr.octets()[15]),
};
let last_bytes = (before_last_byte as u16) << 8 | last_byte as u16;
let ipv4 = Ipv4Addr::new(
WG_TUN_DEVICE_IP_ADDRESS_V4.octets()[0],
WG_TUN_DEVICE_IP_ADDRESS_V4.octets()[1],
before_last_byte,
last_byte,
);
let ipv6 = Ipv6Addr::new(
WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[0],
WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[1],
WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[2],
WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[3],
WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[4],
WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[5],
WG_TUN_DEVICE_IP_ADDRESS_V6.segments()[6],
last_bytes,
);
IpPair::new(ipv4, ipv6)
}
}
@@ -237,6 +252,14 @@ mod tests {
use super::*;
use nym_crypto::asymmetric::encryption;
#[test]
fn create_ip_pair() {
let ipv4: IpAddr = Ipv4Addr::from_str("10.1.10.50").unwrap().into();
let ipv6: IpAddr = Ipv6Addr::from_str("fc01::0a32").unwrap().into();
assert_eq!(IpPair::from(ipv4), IpPair::from(ipv6));
}
#[test]
#[cfg(feature = "verify")]
fn client_request_roundtrip() {
+6 -4
View File
@@ -4,9 +4,9 @@
use tracing::level_filters::LevelFilter;
use tracing_subscriber::{filter::Directive, EnvFilter};
pub(crate) fn setup_tracing_logger() {
fn directive_checked(directive: String) -> Directive {
directive.parse().expect("Failed to parse log directive")
pub(crate) fn setup_tracing_logger() -> anyhow::Result<()> {
fn directive_checked(directive: impl Into<String>) -> anyhow::Result<Directive> {
directive.into().parse().map_err(From::from)
}
let log_builder = tracing_subscriber::fmt()
@@ -26,8 +26,10 @@ pub(crate) fn setup_tracing_logger() {
// these crates are more granularly filtered
let filter_crates = ["defguard_wireguard_rs"];
for crate_name in filter_crates {
filter = filter.add_directive(directive_checked(format!("{}=warn", crate_name)));
filter = filter.add_directive(directive_checked(format!("{}=warn", crate_name))?);
}
log_builder.with_env_filter(filter).init();
Ok(())
}
+1 -1
View File
@@ -23,7 +23,7 @@ async fn main() -> anyhow::Result<()> {
let cli = Cli::parse();
setup_env(cli.config_env_file.as_ref());
setup_tracing_logger();
setup_tracing_logger()?;
if !cli.no_banner {
maybe_print_banner(crate_name!(), crate_version!());
@@ -12,7 +12,7 @@ fn generate_random_ips_within_subnet<R: rand::Rng>(rng: &mut R) -> IpPair {
let before_last_byte = (last_bytes >> 8) as u8;
let last_byte = (last_bytes & 255) as u8;
let ipv4 = Ipv4Addr::new(10, 0, before_last_byte, last_byte);
let ipv6 = Ipv6Addr::new(0x2001, 0x0db8, 0xa160, 0, 0, 0, 0, last_bytes);
let ipv6 = Ipv6Addr::new(0xfc00, 0, 0, 0, 0, 0, 0, last_bytes);
IpPair::new(ipv4, ipv6)
}