chiark / gitweb /
wip get address
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 1 Aug 2021 19:46:43 +0000 (20:46 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 1 Aug 2021 19:46:43 +0000 (20:46 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/prelude.rs
src/slip.rs

index 244d7766325ab48ba211f95c444f2e4425f2d858..8375744f84119b159fbe350b98c3e1a2f9be2a0b 100644 (file)
@@ -4,7 +4,7 @@
 
 pub use std::array;
 pub use std::collections::{BTreeSet, HashMap};
-pub use std::convert::TryInto;
+pub use std::convert::{TryFrom, TryInto};
 pub use std::borrow::Cow;
 pub use std::cmp::{min, max};
 pub use std::fs;
@@ -13,7 +13,7 @@ pub use std::future::Future;
 pub use std::io::{self, ErrorKind, Read as _};
 pub use std::iter;
 pub use std::mem;
-pub use std::net::{IpAddr, Ipv4Addr};
+pub use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
 pub use std::path::{Path, PathBuf};
 pub use std::panic;
 pub use std::process;
index 817357ba5c7cd9bb2b506a818d362106d64d2619..763f24fd6e2162a00464b042e404200424fad4a3 100644 (file)
@@ -72,6 +72,22 @@ impl From<Frames> for FramesData {
   fn from(frames: Frames) -> FramesData { frames.frames }
 }
 
+pub fn ip_packet_addrs(packet: &[u8]) -> Option<(IpAddr, IpAddr)> {
+  Some(match packet.get(0)? & 0xf0 {
+    4 if packet.len() >= 20 => (
+      Ipv4Addr::from(*<&[u8;4]>::try_from(&packet[12..16]).unwrap()).into(),
+      Ipv4Addr::from(*<&[u8;4]>::try_from(&packet[16..20]).unwrap()).into(),
+    ),
+
+    6 if packet.len() >= 40 => (
+      Ipv6Addr::from(*<&[u8;16]>::try_from(&packet[ 8..24]).unwrap()).into(),
+      Ipv6Addr::from(*<&[u8;16]>::try_from(&packet[24..40]).unwrap()).into(),
+    ),
+
+    _ => None?,
+  })
+}
+
 #[derive(Copy,Clone,Eq,PartialEq,Ord,PartialOrd,Hash)]
 pub struct DumpHex<'b>(pub &'b [u8]);
 impl Debug for DumpHex<'_> {