Skip to content

Commit 31ca1b3

Browse files
AHashMap and Refactor (#35)
Co-authored-by: Sajjad <sajjad@pourali.com>
1 parent 71fcdbb commit 31ca1b3

6 files changed

Lines changed: 49 additions & 35 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ repository = 'https://github.com/narrowlink/ipstack'
1010
readme = "README.md"
1111

1212
[dependencies]
13+
ahash = "0.8"
1314
tokio = { version = "1.37", features = [
1415
"sync",
1516
"rt",

src/lib.rs

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
pub use error::{IpStackError, Result};
1+
use crate::{
2+
packet::IpStackPacketProtocol,
3+
stream::{IpStackStream, IpStackTcpStream, IpStackUdpStream, IpStackUnknownTransport},
4+
};
5+
use ahash::AHashMap;
6+
use log::{error, trace};
27
use packet::{NetworkPacket, NetworkTuple};
38
use std::{
4-
collections::{
5-
hash_map::Entry::{Occupied, Vacant},
6-
HashMap,
7-
},
9+
collections::hash_map::Entry::{Occupied, Vacant},
810
time::Duration,
911
};
1012
use tokio::{
@@ -13,16 +15,12 @@ use tokio::{
1315
sync::mpsc::{self, UnboundedReceiver, UnboundedSender},
1416
};
1517

16-
use log::{error, trace};
17-
18-
use crate::{
19-
packet::IpStackPacketProtocol,
20-
stream::{IpStackStream, IpStackTcpStream, IpStackUdpStream, IpStackUnknownTransport},
21-
};
2218
mod error;
2319
mod packet;
2420
pub mod stream;
2521

22+
pub use self::error::{IpStackError, Result};
23+
2624
const DROP_TTL: u8 = 0;
2725

2826
#[cfg(unix)]
@@ -89,7 +87,8 @@ impl IpStack {
8987
let (accept_sender, accept_receiver) = mpsc::unbounded_channel::<IpStackStream>();
9088

9189
tokio::spawn(async move {
92-
let mut streams: HashMap<NetworkTuple, UnboundedSender<NetworkPacket>> = HashMap::new();
90+
let mut streams: AHashMap<NetworkTuple, UnboundedSender<NetworkPacket>> =
91+
AHashMap::new();
9392
let mut buffer = [0u8; u16::MAX as usize];
9493

9594
let (pkt_sender, mut pkt_receiver) = mpsc::unbounded_channel::<NetworkPacket>();
@@ -102,7 +101,16 @@ impl IpStack {
102101
continue;
103102
};
104103
if let IpStackPacketProtocol::Unknown = packet.transport_protocol() {
105-
accept_sender.send(IpStackStream::UnknownTransport(IpStackUnknownTransport::new(packet.src_addr().ip(),packet.dst_addr().ip(),packet.payload,&packet.ip,config.mtu,pkt_sender.clone())))?;
104+
accept_sender.send(
105+
IpStackStream::UnknownTransport(IpStackUnknownTransport::new(
106+
packet.src_addr().ip(),
107+
packet.dst_addr().ip(),
108+
packet.payload,
109+
&packet.ip,
110+
config.mtu,
111+
pkt_sender.clone()
112+
))
113+
)?;
106114
continue;
107115
}
108116

@@ -115,7 +123,14 @@ impl IpStack {
115123
Vacant(entry) => {
116124
match packet.transport_protocol(){
117125
IpStackPacketProtocol::Tcp(h) => {
118-
match IpStackTcpStream::new(packet.src_addr(),packet.dst_addr(),h, pkt_sender.clone(),config.mtu,config.tcp_timeout){
126+
match IpStackTcpStream::new(
127+
packet.src_addr(),
128+
packet.dst_addr(),
129+
h,
130+
pkt_sender.clone(),
131+
config.mtu,
132+
config.tcp_timeout
133+
){
119134
Ok(stream) => {
120135
entry.insert(stream.stream_sender());
121136
accept_sender.send(IpStackStream::Tcp(stream))?;
@@ -130,7 +145,14 @@ impl IpStack {
130145
}
131146
}
132147
IpStackPacketProtocol::Udp => {
133-
let stream = IpStackUdpStream::new(packet.src_addr(),packet.dst_addr(),packet.payload, pkt_sender.clone(),config.mtu,config.udp_timeout);
148+
let stream = IpStackUdpStream::new(
149+
packet.src_addr(),
150+
packet.dst_addr(),
151+
packet.payload,
152+
pkt_sender.clone(),
153+
config.mtu,
154+
config.udp_timeout
155+
);
134156
entry.insert(stream.stream_sender());
135157
accept_sender.send(IpStackStream::Udp(stream))?;
136158
}

src/packet.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
2-
3-
use etherparse::{Ipv4Header, Ipv6Header, NetSlice, SlicedPacket, TcpHeader, UdpHeader};
4-
51
use crate::error::IpStackError;
2+
use etherparse::{Ipv4Header, Ipv6Header, NetSlice, SlicedPacket, TcpHeader, UdpHeader};
3+
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
64

75
#[derive(Eq, Hash, PartialEq, Debug, Clone, Copy)]
86
pub struct NetworkTuple {

src/stream/tcb.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1+
use crate::packet::TcpPacket;
12
use std::{collections::BTreeMap, pin::Pin, time::Duration};
2-
33
use tokio::time::Sleep;
44

5-
use crate::packet::TcpPacket;
6-
75
const MAX_UNACK: u32 = 1024 * 16; // 16KB
86
const READ_BUFFER_SIZE: usize = 1024 * 16; // 16KB
97

src/stream/tcp_wrapper.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,15 @@
1+
use super::tcp::IpStackTcpStream as IpStackTcpStreamInner;
2+
use crate::{
3+
packet::{NetworkPacket, TcpPacket},
4+
IpStackError,
5+
};
16
use std::{net::SocketAddr, pin::Pin, time::Duration};
2-
37
use tokio::{
48
io::AsyncWriteExt,
59
sync::mpsc::{self, UnboundedSender},
610
time::timeout,
711
};
812

9-
use crate::{
10-
packet::{NetworkPacket, TcpPacket},
11-
IpStackError,
12-
};
13-
14-
use super::tcp::IpStackTcpStream as IpStackTcpStreamInner;
15-
1613
pub struct IpStackTcpStream {
1714
inner: Option<Box<IpStackTcpStreamInner>>,
1815
peer_addr: SocketAddr,

src/stream/unknown.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
use std::{io::Error, mem, net::IpAddr};
2-
3-
use etherparse::{IpNumber, Ipv4Header, Ipv6FlowLabel, Ipv6Header};
4-
use tokio::sync::mpsc::UnboundedSender;
5-
61
use crate::{
72
packet::{IpHeader, NetworkPacket, TransportHeader},
83
TTL,
94
};
5+
use etherparse::{IpNumber, Ipv4Header, Ipv6FlowLabel, Ipv6Header};
6+
use std::{io::Error, mem, net::IpAddr};
7+
use tokio::sync::mpsc::UnboundedSender;
108

119
pub struct IpStackUnknownTransport {
1210
src_addr: IpAddr,

0 commit comments

Comments
 (0)