@@ -21,7 +21,7 @@ pub mod ip;
21
21
22
22
#[ repr( C ) ]
23
23
pub enum RawPacket {
24
- Ip ( IpHdr ) ,
24
+ Ip ( IpHdr , ip :: ProtoHdr ) ,
25
25
Arp ( ArpHdr ) ,
26
26
}
27
27
@@ -53,40 +53,40 @@ impl From<[u8; RawPacket::LEN]> for AppPacket {
53
53
fn from ( value : [ u8 ; RawPacket :: LEN ] ) -> Self {
54
54
let raw_packet = value. as_ptr ( ) as * const RawPacket ;
55
55
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 ) => {
59
59
//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;
62
62
63
63
let tcp_packet = TcpPacket {
64
64
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 ) ,
66
66
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 ) ,
68
68
} ;
69
69
AppPacket :: Ip ( IpPacket :: Tcp ( tcp_packet) )
70
70
}
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
+ // };
75
75
76
76
let udp_packet = UdpPacket {
77
77
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 ) ,
79
79
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 ) ,
81
81
} ;
82
82
Self :: Ip ( IpPacket :: Udp ( udp_packet) )
83
83
}
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
+ // };
88
88
89
- let icmp_type = match unsafe { ( * icmphdr ) . type_ } {
89
+ let icmp_type = match header . type_ {
90
90
0 => IcmpType :: EchoRequest ,
91
91
1 => IcmpType :: EchoReply ,
92
92
_ => IcmpType :: DestinationUnreachable ,
0 commit comments