Skip to content

Commit cd61fc1

Browse files
committed
refactor ip packets representation
1 parent 79876b1 commit cd61fc1

File tree

6 files changed

+360
-285
lines changed

6 files changed

+360
-285
lines changed

oryx-common/src/ip.rs

Lines changed: 83 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,56 @@
1-
use core::{fmt::Display, net::IpAddr};
1+
use core::fmt::Display;
22

3-
use network_types::{icmp::IcmpHdr, tcp::TcpHdr, udp::UdpHdr};
3+
use core::net::{Ipv4Addr, Ipv6Addr};
4+
5+
#[repr(C)]
6+
#[derive(Debug, Copy, Clone)]
7+
pub enum IpPacket {
8+
V4(Ipv4Packet),
9+
V6(Ipv6Packet),
10+
}
11+
12+
#[repr(C)]
13+
#[derive(Debug, Copy, Clone)]
14+
pub struct Ipv4Packet {
15+
pub src_ip: Ipv4Addr,
16+
pub dst_ip: Ipv4Addr,
17+
pub proto: IpProto,
18+
}
19+
20+
#[repr(C)]
21+
#[derive(Debug, Copy, Clone)]
22+
pub struct Ipv6Packet {
23+
pub src_ip: Ipv6Addr,
24+
pub dst_ip: Ipv6Addr,
25+
pub proto: IpProto,
26+
}
27+
28+
#[repr(C)]
29+
#[derive(Debug, Copy, Clone)]
30+
pub enum IpProto {
31+
Tcp(TcpPacket),
32+
Udp(UdpPacket),
33+
Icmp(IcmpPacket),
34+
}
435

536
#[repr(C)]
637
#[derive(Debug, Copy, Clone)]
738
pub struct TcpPacket {
839
pub dst_port: u16,
940
pub src_port: u16,
10-
pub dst_ip: IpAddr,
11-
pub src_ip: IpAddr,
1241
}
1342

1443
#[repr(C)]
1544
#[derive(Debug, Copy, Clone)]
1645
pub struct UdpPacket {
1746
pub dst_port: u16,
1847
pub src_port: u16,
19-
pub dst_ip: IpAddr,
20-
pub src_ip: IpAddr,
2148
}
2249

2350
#[repr(C)]
2451
#[derive(Debug, Copy, Clone)]
2552
pub struct IcmpPacket {
2653
pub icmp_type: IcmpType,
27-
pub dst_ip: IpAddr,
28-
pub src_ip: IpAddr,
2954
}
3055

3156
#[repr(C)]
@@ -52,42 +77,59 @@ impl Display for IcmpType {
5277
}
5378
}
5479

55-
#[repr(C)]
56-
#[derive(Debug, Copy, Clone)]
57-
pub enum IpPacket {
58-
Tcp(TcpPacket),
59-
Udp(UdpPacket),
60-
Icmp(IcmpPacket),
61-
}
62-
63-
#[repr(C)]
64-
#[derive(Copy, Clone)]
65-
pub enum ProtoHdr {
66-
Tcp(TcpHdr),
67-
Udp(UdpHdr),
68-
Icmp(IcmpHdr),
69-
}
70-
7180
impl Display for IpPacket {
7281
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
7382
match self {
74-
IpPacket::Tcp(p) => {
75-
write!(
76-
f,
77-
"{} {} {} {} TCP",
78-
p.src_ip, p.src_port, p.dst_ip, p.dst_port
79-
)
80-
}
81-
IpPacket::Udp(p) => {
82-
write!(
83-
f,
84-
"{} {} {} {} UDP",
85-
p.src_ip, p.src_port, p.dst_ip, p.dst_port
86-
)
87-
}
88-
IpPacket::Icmp(p) => {
89-
write!(f, "{} {} ICMP", p.src_ip, p.dst_ip)
90-
}
83+
IpPacket::V4(ipv4_packet) => match ipv4_packet.proto {
84+
IpProto::Tcp(tcp_packet) => {
85+
write!(
86+
f,
87+
"{} {} {} {} TCP",
88+
ipv4_packet.src_ip,
89+
tcp_packet.src_port,
90+
ipv4_packet.dst_ip,
91+
tcp_packet.dst_port
92+
)
93+
}
94+
IpProto::Udp(udp_packet) => {
95+
write!(
96+
f,
97+
"{} {} {} {} UDP",
98+
ipv4_packet.src_ip,
99+
udp_packet.src_port,
100+
ipv4_packet.dst_ip,
101+
udp_packet.dst_port
102+
)
103+
}
104+
IpProto::Icmp(_) => {
105+
write!(f, "{} {} ICMP", ipv4_packet.src_ip, ipv4_packet.dst_ip)
106+
}
107+
},
108+
IpPacket::V6(ipv6_packet) => match ipv6_packet.proto {
109+
IpProto::Tcp(tcp_packet) => {
110+
write!(
111+
f,
112+
"{} {} {} {} TCP",
113+
ipv6_packet.src_ip,
114+
tcp_packet.src_port,
115+
ipv6_packet.dst_ip,
116+
tcp_packet.dst_port
117+
)
118+
}
119+
IpProto::Udp(udp_packet) => {
120+
write!(
121+
f,
122+
"{} {} {} {} UDP",
123+
ipv6_packet.src_ip,
124+
udp_packet.src_port,
125+
ipv6_packet.dst_ip,
126+
udp_packet.dst_port
127+
)
128+
}
129+
IpProto::Icmp(_) => {
130+
write!(f, "{} {} ICMP", ipv6_packet.src_ip, ipv6_packet.dst_ip)
131+
}
132+
},
91133
}
92134
}
93135
}

oryx-common/src/lib.rs

Lines changed: 68 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,29 @@
11
#![no_std]
22

3-
use core::{
4-
fmt::Display,
5-
mem,
6-
net::{IpAddr, Ipv4Addr},
7-
};
3+
use core::{fmt::Display, mem, net::Ipv4Addr};
84

95
use arp::{ArpPacket, ArpType, MacAddr};
10-
use ip::{IcmpPacket, IcmpType, IpPacket, ProtoHdr, TcpPacket, UdpPacket};
11-
use network_types::{arp::ArpHdr, ip::IpHdr};
6+
use ip::{IcmpPacket, IcmpType, IpPacket, IpProto, Ipv4Packet, Ipv6Packet, TcpPacket, UdpPacket};
7+
use network_types::{arp::ArpHdr, icmp::IcmpHdr, ip::IpHdr, tcp::TcpHdr, udp::UdpHdr};
128

139
pub mod arp;
1410
pub mod ip;
1511
pub mod protocols;
1612

1713
#[repr(C)]
1814
pub enum RawPacket {
19-
Ip(IpHdr, ip::ProtoHdr),
15+
Ip(IpHdr, ProtoHdr),
2016
Arp(ArpHdr),
2117
}
2218

19+
#[repr(C)]
20+
#[derive(Copy, Clone)]
21+
pub enum ProtoHdr {
22+
Tcp(TcpHdr),
23+
Udp(UdpHdr),
24+
Icmp(IcmpHdr),
25+
}
26+
2327
impl RawPacket {
2428
pub const LEN: usize = mem::size_of::<RawPacket>();
2529
}
@@ -49,74 +53,64 @@ impl From<[u8; RawPacket::LEN]> for AppPacket {
4953
let raw_packet = value.as_ptr() as *const RawPacket;
5054
match unsafe { &*raw_packet } {
5155
RawPacket::Ip(packet, proto) => match packet {
52-
IpHdr::V4(ipv4_packet) => match proto {
53-
ProtoHdr::Tcp(header) => {
54-
let tcp_packet = TcpPacket {
55-
src_ip: IpAddr::V4(Ipv4Addr::from(u32::from_be(ipv4_packet.src_addr))),
56-
src_port: u16::from_be(header.source),
57-
dst_ip: IpAddr::V4(Ipv4Addr::from(u32::from_be(ipv4_packet.dst_addr))),
58-
dst_port: u16::from_be(header.dest),
59-
};
60-
AppPacket::Ip(IpPacket::Tcp(tcp_packet))
61-
}
62-
ProtoHdr::Udp(header) => {
63-
let udp_packet = UdpPacket {
64-
src_ip: IpAddr::V4(Ipv4Addr::from(u32::from_be(ipv4_packet.src_addr))),
65-
src_port: u16::from_be(header.source),
66-
dst_ip: IpAddr::V4(Ipv4Addr::from(u32::from_be(ipv4_packet.dst_addr))),
67-
dst_port: u16::from_be(header.dest),
68-
};
69-
Self::Ip(IpPacket::Udp(udp_packet))
70-
}
71-
ProtoHdr::Icmp(header) => {
72-
let icmp_type = match header.type_ {
73-
0 => IcmpType::EchoRequest,
74-
1 => IcmpType::EchoReply,
75-
_ => IcmpType::DestinationUnreachable,
76-
};
56+
IpHdr::V4(ipv4_packet) => {
57+
let src_ip = Ipv4Addr::from(u32::from_be(ipv4_packet.src_addr));
58+
let dst_ip = Ipv4Addr::from(u32::from_be(ipv4_packet.dst_addr));
59+
60+
let proto = match proto {
61+
ProtoHdr::Tcp(tcp_header) => IpProto::Tcp(TcpPacket {
62+
src_port: u16::from_be(tcp_header.source),
63+
dst_port: u16::from_be(tcp_header.dest),
64+
}),
65+
ProtoHdr::Udp(udp_header) => IpProto::Udp(UdpPacket {
66+
src_port: u16::from_be(udp_header.source),
67+
dst_port: u16::from_be(udp_header.dest),
68+
}),
69+
ProtoHdr::Icmp(header) => {
70+
let icmp_type = match header.type_ {
71+
0 => IcmpType::EchoRequest,
72+
1 => IcmpType::EchoReply,
73+
_ => IcmpType::DestinationUnreachable,
74+
};
75+
IpProto::Icmp(IcmpPacket { icmp_type })
76+
}
77+
};
78+
79+
AppPacket::Ip(IpPacket::V4(Ipv4Packet {
80+
src_ip,
81+
dst_ip,
82+
proto,
83+
}))
84+
}
85+
IpHdr::V6(ipv6_packet) => {
86+
let src_ip = ipv6_packet.src_addr();
87+
let dst_ip = ipv6_packet.dst_addr();
7788

78-
let icmp_packet = IcmpPacket {
79-
src_ip: IpAddr::V4(Ipv4Addr::from(u32::from_be(ipv4_packet.src_addr))),
80-
dst_ip: IpAddr::V4(Ipv4Addr::from(u32::from_be(ipv4_packet.dst_addr))),
81-
icmp_type,
82-
};
83-
Self::Ip(IpPacket::Icmp(icmp_packet))
84-
}
85-
},
86-
IpHdr::V6(ipv6_packet) => match proto {
87-
ProtoHdr::Tcp(header) => {
88-
let tcp_packet = TcpPacket {
89-
src_ip: IpAddr::V6(ipv6_packet.src_addr()),
90-
src_port: u16::from_be(header.source),
91-
dst_ip: IpAddr::V6(ipv6_packet.dst_addr()),
92-
dst_port: u16::from_be(header.dest),
93-
};
94-
Self::Ip(IpPacket::Tcp(tcp_packet))
95-
}
96-
ProtoHdr::Udp(header) => {
97-
let udp_packet = UdpPacket {
98-
src_ip: IpAddr::V6(ipv6_packet.src_addr()),
99-
src_port: u16::from_be(header.source),
100-
dst_ip: IpAddr::V6(ipv6_packet.dst_addr()),
101-
dst_port: u16::from_be(header.dest),
102-
};
103-
Self::Ip(IpPacket::Udp(udp_packet))
104-
}
105-
ProtoHdr::Icmp(header) => {
106-
let icmp_type = match header.type_ {
107-
0 => IcmpType::EchoRequest,
108-
1 => IcmpType::EchoReply,
109-
_ => IcmpType::DestinationUnreachable,
110-
};
89+
let proto = match proto {
90+
ProtoHdr::Tcp(tcp_header) => IpProto::Tcp(TcpPacket {
91+
src_port: u16::from_be(tcp_header.source),
92+
dst_port: u16::from_be(tcp_header.dest),
93+
}),
94+
ProtoHdr::Udp(udp_header) => IpProto::Udp(UdpPacket {
95+
src_port: u16::from_be(udp_header.source),
96+
dst_port: u16::from_be(udp_header.dest),
97+
}),
98+
ProtoHdr::Icmp(header) => {
99+
let icmp_type = match header.type_ {
100+
0 => IcmpType::EchoRequest,
101+
1 => IcmpType::EchoReply,
102+
_ => IcmpType::DestinationUnreachable,
103+
};
104+
IpProto::Icmp(IcmpPacket { icmp_type })
105+
}
106+
};
111107

112-
let icmp_packet = IcmpPacket {
113-
src_ip: IpAddr::V6(ipv6_packet.src_addr()),
114-
dst_ip: IpAddr::V6(ipv6_packet.dst_addr()),
115-
icmp_type,
116-
};
117-
Self::Ip(IpPacket::Icmp(icmp_packet))
118-
}
119-
},
108+
AppPacket::Ip(IpPacket::V6(Ipv6Packet {
109+
src_ip,
110+
dst_ip,
111+
proto,
112+
}))
113+
}
120114
},
121115
RawPacket::Arp(packet) => {
122116
let arp_type = match u16::from_be(packet.oper) {

oryx-ebpf/src/main.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ use network_types::{
1717
udp::UdpHdr,
1818
};
1919
use oryx_common::{
20-
ip::ProtoHdr,
2120
protocols::{LinkProtocol, NetworkProtocol, Protocol, TransportProtocol},
22-
RawPacket,
21+
ProtoHdr, RawPacket,
2322
};
2423

2524
#[map]

0 commit comments

Comments
 (0)