blob: 4aa7ecbe69f43d1cb2d6c606e3c71033eb63ccc4 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
use failure::Error;
use pnet::packet::ipv4::Ipv4Packet;
use pnet::packet::ipv6::Ipv6Packet;
use std::net::{Ipv4Addr, Ipv6Addr, IpAddr, SocketAddr};
pub enum IpPacket<'a> {
V4(Ipv4Packet<'a>),
V6(Ipv6Packet<'a>),
}
impl<'a> IpPacket<'a> {
pub fn new(packet: &'a [u8]) -> Option<Self> {
match packet[0] >> 4 {
4 => Ipv4Packet::new(&packet).map(|packet| IpPacket::V4(packet)),
6 => Ipv6Packet::new(&packet).map(|packet| IpPacket::V6(packet)),
_ => None
}
}
pub fn get_source(&self) -> IpAddr {
match *self {
IpPacket::V4(ref packet) => packet.get_source().into(),
IpPacket::V6(ref packet) => packet.get_source().into(),
}
}
pub fn get_destination(&self) -> IpAddr {
match *self {
IpPacket::V4(ref packet) => packet.get_destination().into(),
IpPacket::V6(ref packet) => packet.get_destination().into(),
}
}
}
|