|
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