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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
pub mod arp;
pub mod dhcp;
pub mod ethernet;
pub mod gre;
pub mod ip;
pub mod ipv4;
pub mod ipv6;
pub mod tcp;
pub mod udp;
pub mod icmp;
pub mod icmpv6;
pub mod builder;

use std::net::IpAddr;
use crate::datalink;

/// Packet Capture information
#[derive(Clone, Debug, PartialEq)]
pub struct CaptureInfo {
    /// Capture number
    pub capture_no: usize,
    /// Capture datetime
    pub datatime: String,
    /// Capture length
    pub capture_len: usize,
    /// interface index
    pub interface_index: u32,
    /// Interface name
    pub interface_name: String,
}

/// Packet Frame. Contains all the possible packet types
#[derive(Clone, Debug)]
pub struct PacketFrame {
    pub capture_info: CaptureInfo,
    pub ethernet_packet: Option<ethernet::EthernetPacket>,
    pub arp_packet: Option<arp::ArpPacket>,
    pub ipv4_packet: Option<ipv4::Ipv4Packet>,
    pub ipv6_packet: Option<ipv6::Ipv6Packet>,
    pub icmp_packet: Option<icmp::IcmpPacket>,
    pub icmpv6_packet: Option<icmpv6::Icmpv6Packet>,
    pub tcp_packet: Option<tcp::TcpPacket>,
    pub udp_packet: Option<udp::UdpPacket>,
}

/// High-level abstraction of a packet information
#[derive(Clone, Debug)]
pub struct PacketInfo {
    pub src_mac: datalink::MacAddr,
    pub dst_mac: datalink::MacAddr,
    pub ether_type: ethernet::EtherType,
    pub src_ip: IpAddr,
    pub dst_ip: IpAddr,
    pub src_port: Option<u16>,
    pub dst_port: Option<u16>,
    pub ip_protocol: Option<ip::IpNextLevelProtocol>,
    pub payload: Vec<u8>,
}

impl PacketInfo {
    pub fn new() -> Self {
        PacketInfo {
            src_mac: datalink::MacAddr::zero(),
            dst_mac: datalink::MacAddr::zero(),
            ether_type: ethernet::EtherType::Ipv4,
            src_ip: IpAddr::V4(std::net::Ipv4Addr::new(0, 0, 0, 0)),
            dst_ip: IpAddr::V4(std::net::Ipv4Addr::new(0, 0, 0, 0)),
            src_port: None,
            dst_port: None,
            ip_protocol: None,
            payload: Vec::new(),
        }
    }
}