packet_builder/
lib.rs

1#![macro_use]
2#![allow(unused_macros)]
3
4extern crate derive_new;
5extern crate ipnetwork;
6extern crate pnet;
7
8pub mod icmp;
9pub mod tcp;
10pub mod udp;
11pub mod ethernet;
12pub mod arp;
13pub mod vlan;
14pub mod ipv4;
15pub mod payload;
16
17use std::net::Ipv4Addr;
18
19pub trait L4Checksum {
20  fn checksum_ipv4(&mut self, source: &Ipv4Addr, destination: &Ipv4Addr) -> ();
21}
22
23#[macro_export]
24macro_rules! build_channel {
25  ($ifname:expr) => {{
26    let interfaces = pnet_datalink::interfaces();
27    let interface = interfaces
28        .into_iter()
29        .find(|iface| iface.name == $ifname)
30        .unwrap();
31
32    let (sender, receiver) = match pnet_datalink::channel(&interface, Default::default()) {
33        Ok(pnet_datalink::Channel::Ethernet(tx, rx)) => (tx, rx),
34        Ok(_) => panic!("Unknown channel type"),
35        Err(e) => panic!("Error happened {}", e),
36    };
37    (sender, receiver)
38  }};
39}
40
41
42#[macro_export]
43macro_rules! sub_builder {
44    ($pkt_buf:expr, $build_macro:ident($args:tt) $(/ $rem_macros:ident($rem_args:tt))+) => {{
45      let (mut payload_pkt, _payload_proto) = sub_builder!($pkt_buf, $($rem_macros($rem_args) )/ *);
46      let (pkt, proto) = $build_macro!($args, payload_pkt, _payload_proto, $pkt_buf);
47      (pkt, proto)
48    }}; 
49   ($pkt_buf:expr, $build_macro:ident($args:tt)) => {{
50      $build_macro!($args, $pkt_buf)
51   }};
52}
53
54// Call the sub builder so we can return just the packet rather than the tuple that gets returned
55// by the sub builder for use during the recursion.
56#[macro_export]
57macro_rules! packet_builder {
58   ($pkt_buf:expr, $( $rem_macros:ident($rem_args:tt))/ * ) => {{
59    let (pkt, _proto) = sub_builder!($pkt_buf, $( $rem_macros($rem_args) )/ *);
60    pkt
61   }};
62}
63