|
1 | 1 | #![no_std] |
2 | 2 |
|
3 | | -use core::{ |
4 | | - fmt::Display, |
5 | | - mem, |
6 | | - net::{IpAddr, Ipv4Addr}, |
7 | | -}; |
| 3 | +use core::{fmt::Display, mem, net::Ipv4Addr}; |
8 | 4 |
|
9 | 5 | 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}; |
12 | 8 |
|
13 | 9 | pub mod arp; |
14 | 10 | pub mod ip; |
15 | 11 | pub mod protocols; |
16 | 12 |
|
17 | 13 | #[repr(C)] |
18 | 14 | pub enum RawPacket { |
19 | | - Ip(IpHdr, ip::ProtoHdr), |
| 15 | + Ip(IpHdr, ProtoHdr), |
20 | 16 | Arp(ArpHdr), |
21 | 17 | } |
22 | 18 |
|
| 19 | +#[repr(C)] |
| 20 | +#[derive(Copy, Clone)] |
| 21 | +pub enum ProtoHdr { |
| 22 | + Tcp(TcpHdr), |
| 23 | + Udp(UdpHdr), |
| 24 | + Icmp(IcmpHdr), |
| 25 | +} |
| 26 | + |
23 | 27 | impl RawPacket { |
24 | 28 | pub const LEN: usize = mem::size_of::<RawPacket>(); |
25 | 29 | } |
@@ -49,74 +53,64 @@ impl From<[u8; RawPacket::LEN]> for AppPacket { |
49 | 53 | let raw_packet = value.as_ptr() as *const RawPacket; |
50 | 54 | match unsafe { &*raw_packet } { |
51 | 55 | 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(); |
77 | 88 |
|
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 | + }; |
111 | 107 |
|
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 | + } |
120 | 114 | }, |
121 | 115 | RawPacket::Arp(packet) => { |
122 | 116 | let arp_type = match u16::from_be(packet.oper) { |
|
0 commit comments