Skip to content

Commit 5006294

Browse files
committed
try fix ports
1 parent 60882e9 commit 5006294

File tree

5 files changed

+87
-27
lines changed

5 files changed

+87
-27
lines changed

Justfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ show interface:
1616

1717
# Run oryx
1818
run:
19-
cargo xtask run
19+
cargo xtask run --release
2020

2121
# Build oryx
2222
build:

oryx-common/src/ip.rs

+10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use core::{fmt::Display, net::IpAddr};
22

3+
use network_types::{icmp::IcmpHdr, tcp::TcpHdr, udp::UdpHdr};
4+
35
#[repr(C)]
46
#[derive(Debug, Copy, Clone)]
57
pub struct TcpPacket {
@@ -58,6 +60,14 @@ pub enum IpPacket {
5860
Icmp(IcmpPacket),
5961
}
6062

63+
#[repr(C)]
64+
#[derive(Copy, Clone)]
65+
pub enum ProtoHdr {
66+
Tcp(TcpHdr),
67+
Udp(UdpHdr),
68+
Icmp(IcmpHdr),
69+
}
70+
6171
impl Display for IpPacket {
6272
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
6373
match self {

oryx-common/src/lib.rs

+19-19
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub mod ip;
2121

2222
#[repr(C)]
2323
pub enum RawPacket {
24-
Ip(IpHdr),
24+
Ip(IpHdr, ip::ProtoHdr),
2525
Arp(ArpHdr),
2626
}
2727

@@ -53,40 +53,40 @@ impl From<[u8; RawPacket::LEN]> for AppPacket {
5353
fn from(value: [u8; RawPacket::LEN]) -> Self {
5454
let raw_packet = value.as_ptr() as *const RawPacket;
5555
match unsafe { &*raw_packet } {
56-
RawPacket::Ip(packet) => match packet {
57-
IpHdr::V4(ipv4_packet) => match ipv4_packet.proto {
58-
IpProto::Tcp => {
56+
RawPacket::Ip(packet, proto) => match packet {
57+
IpHdr::V4(ipv4_packet) => match proto {
58+
ip::ProtoHdr::Tcp(header) => {
5959
//FIX: This does not work
60-
let tcphdr =
61-
unsafe { raw_packet.add(mem::size_of::<Ipv4Hdr>()) } as *const TcpHdr;
60+
// let tcphdr =
61+
// unsafe { raw_packet.add(mem::size_of::<Ipv4Hdr>()) } as *const TcpHdr;
6262

6363
let tcp_packet = TcpPacket {
6464
src_ip: IpAddr::V4(Ipv4Addr::from(u32::from_be(ipv4_packet.src_addr))),
65-
src_port: u16::from_be(unsafe { (*tcphdr).source }),
65+
src_port: u16::from_be(header.source),
6666
dst_ip: IpAddr::V4(Ipv4Addr::from(u32::from_be(ipv4_packet.dst_addr))),
67-
dst_port: u16::from_be(unsafe { (*tcphdr).dest }),
67+
dst_port: u16::from_be(header.dest),
6868
};
6969
AppPacket::Ip(IpPacket::Tcp(tcp_packet))
7070
}
71-
IpProto::Udp => {
72-
let udphdr = unsafe {
73-
raw_packet.offset(Ipv4Hdr::LEN.try_into().unwrap()) as *const UdpHdr
74-
};
71+
ip::ProtoHdr::Udp(header) => {
72+
// let udphdr = unsafe {
73+
// raw_packet.offset(Ipv4Hdr::LEN.try_into().unwrap()) as *const UdpHdr
74+
// };
7575

7676
let udp_packet = UdpPacket {
7777
src_ip: IpAddr::V4(Ipv4Addr::from(u32::from_be(ipv4_packet.src_addr))),
78-
src_port: u16::from_be(unsafe { (*udphdr).source }),
78+
src_port: u16::from_be(header.source),
7979
dst_ip: IpAddr::V4(Ipv4Addr::from(u32::from_be(ipv4_packet.dst_addr))),
80-
dst_port: u16::from_be(unsafe { (*udphdr).dest }),
80+
dst_port: u16::from_be(header.dest),
8181
};
8282
Self::Ip(IpPacket::Udp(udp_packet))
8383
}
84-
IpProto::Icmp => {
85-
let icmphdr = unsafe {
86-
raw_packet.offset(Ipv4Hdr::LEN.try_into().unwrap()) as *const IcmpHdr
87-
};
84+
ip::ProtoHdr::Icmp(header) => {
85+
// let icmphdr = unsafe {
86+
// raw_packet.offset(Ipv4Hdr::LEN.try_into().unwrap()) as *const IcmpHdr
87+
// };
8888

89-
let icmp_type = match unsafe { (*icmphdr).type_ } {
89+
let icmp_type = match header.type_ {
9090
0 => IcmpType::EchoRequest,
9191
1 => IcmpType::EchoReply,
9292
_ => IcmpType::DestinationUnreachable,

oryx-ebpf/src/main.rs

+56-6
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@ use aya_ebpf::{
77
maps::RingBuf,
88
programs::TcContext,
99
};
10-
10+
use core::mem;
1111
use network_types::{
1212
arp::ArpHdr,
1313
eth::{EthHdr, EtherType},
14+
icmp::IcmpHdr,
1415
ip::{IpHdr, IpProto, Ipv4Hdr, Ipv6Hdr},
16+
tcp::TcpHdr,
17+
udp::UdpHdr,
1518
};
16-
use oryx_common::RawPacket;
19+
use oryx_common::{ip::ProtoHdr, RawPacket};
1720

1821
#[map]
1922
static DATA: RingBuf = RingBuf::with_byte_size(4096 * 40, 0);
@@ -33,7 +36,18 @@ fn submit(packet: RawPacket) {
3336
buf.submit(0);
3437
}
3538
}
39+
#[inline]
40+
fn ptr_at<T>(ctx: &TcContext, offset: usize) -> Result<*const T, ()> {
41+
let start = ctx.data();
42+
let end = ctx.data_end();
43+
let len = mem::size_of::<T>();
3644

45+
if start + offset + len > end {
46+
return Err(());
47+
}
48+
49+
Ok((start + offset) as *const T)
50+
}
3751
#[inline]
3852
fn process(ctx: TcContext) -> Result<i32, ()> {
3953
let ethhdr: EthHdr = ctx.load(0).map_err(|_| ())?;
@@ -42,17 +56,53 @@ fn process(ctx: TcContext) -> Result<i32, ()> {
4256
EtherType::Ipv4 => {
4357
let header: Ipv4Hdr = ctx.load(EthHdr::LEN).map_err(|_| ())?;
4458
match header.proto {
45-
IpProto::Tcp | IpProto::Udp | IpProto::Icmp => {
46-
submit(RawPacket::Ip(IpHdr::V4(header)));
59+
IpProto::Tcp => {
60+
let tcphdr: *const TcpHdr = ptr_at(&ctx, EthHdr::LEN + Ipv4Hdr::LEN)?;
61+
submit(RawPacket::Ip(
62+
IpHdr::V4(header),
63+
ProtoHdr::Tcp(unsafe { *tcphdr }),
64+
));
65+
}
66+
IpProto::Udp => {
67+
let udphdr: *const UdpHdr = ptr_at(&ctx, EthHdr::LEN + Ipv4Hdr::LEN)?;
68+
submit(RawPacket::Ip(
69+
IpHdr::V4(header),
70+
ProtoHdr::Udp(unsafe { *udphdr }),
71+
));
72+
}
73+
IpProto::Icmp => {
74+
let icmphdr: *const IcmpHdr = ptr_at(&ctx, EthHdr::LEN + Ipv4Hdr::LEN)?;
75+
submit(RawPacket::Ip(
76+
IpHdr::V4(header),
77+
ProtoHdr::Icmp(unsafe { *icmphdr }),
78+
));
4779
}
4880
_ => {}
4981
}
5082
}
5183
EtherType::Ipv6 => {
5284
let header: Ipv6Hdr = ctx.load(EthHdr::LEN).map_err(|_| ())?;
5385
match header.next_hdr {
54-
IpProto::Tcp | IpProto::Udp | IpProto::Icmp => {
55-
submit(RawPacket::Ip(IpHdr::V6(header)));
86+
IpProto::Tcp => {
87+
let tcphdr: *const TcpHdr = ptr_at(&ctx, EthHdr::LEN + Ipv4Hdr::LEN)?;
88+
submit(RawPacket::Ip(
89+
IpHdr::V6(header),
90+
ProtoHdr::Tcp(unsafe { *tcphdr }),
91+
));
92+
}
93+
IpProto::Udp => {
94+
let udphdr: *const UdpHdr = ptr_at(&ctx, EthHdr::LEN + Ipv4Hdr::LEN)?;
95+
submit(RawPacket::Ip(
96+
IpHdr::V6(header),
97+
ProtoHdr::Udp(unsafe { *udphdr }),
98+
));
99+
}
100+
IpProto::Icmp => {
101+
let icmphdr: *const IcmpHdr = ptr_at(&ctx, EthHdr::LEN + Ipv4Hdr::LEN)?;
102+
submit(RawPacket::Ip(
103+
IpHdr::V6(header),
104+
ProtoHdr::Icmp(unsafe { *icmphdr }),
105+
));
56106
}
57107
_ => {}
58108
}

oryx-tui/src/event.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub enum Event {
1212
Key(KeyEvent),
1313
Mouse(MouseEvent),
1414
Resize(u16, u16),
15-
Packet([u8; 48]),
15+
Packet([u8; 72]),
1616
Notification(Notification),
1717
Reset,
1818
}

0 commit comments

Comments
 (0)