Skip to content

Commit 549d22a

Browse files
authored
Merge pull request #28 from ipfs-rust/rku/forward-nat
export NAT port forwarding
2 parents 1e13020 + 01aa18f commit 549d22a

File tree

6 files changed

+43
-47
lines changed

6 files changed

+43
-47
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ members = ["cli", "core", "machine", "nat", "router", "."]
33

44
[package]
55
name = "netsim-embed"
6-
version = "0.5.2"
6+
version = "0.6.0"
77
authors = ["David Craven <david@craven.ch>"]
88
edition = "2018"
99
description = "Network simulator."

core/src/range.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::str::FromStr;
44
use thiserror::Error;
55

66
/// A range of IPv4 addresses with a common prefix
7-
#[derive(Clone, Copy)]
7+
#[derive(Clone, Copy, PartialEq, Eq)]
88
pub struct Ipv4Range {
99
addr: Ipv4Addr,
1010
bits: u8,

machine/src/lib.rs

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ pub struct Machine<C, E> {
6666
impl<C, E> Machine<C, E>
6767
where
6868
C: Display + Send + 'static,
69-
E: FromStr + Send + 'static,
69+
E: FromStr + Display + Send + 'static,
7070
E::Err: std::fmt::Debug + Display + Send + Sync,
7171
{
7272
pub async fn new(id: MachineId, plug: Plug, cmd: Command) -> Self {
@@ -117,6 +117,28 @@ impl<C, E> Machine<C, E> {
117117
self.tx.unbounded_send(cmd).unwrap();
118118
}
119119

120+
pub fn drain(&mut self) -> Vec<E> {
121+
let mut res = self.buffer.drain(..).collect::<Vec<_>>();
122+
if !self.rx.is_terminated() {
123+
while let Ok(Some(x)) = self.rx.try_next() {
124+
res.push(x);
125+
}
126+
}
127+
res
128+
}
129+
130+
pub fn up(&self) {
131+
self.ctrl.unbounded_send(IfaceCtrl::Up).unwrap();
132+
}
133+
134+
pub fn down(&self) {
135+
self.ctrl.unbounded_send(IfaceCtrl::Down).unwrap();
136+
}
137+
138+
pub fn namespace(&self) -> Namespace {
139+
self.ns
140+
}
141+
120142
pub async fn recv(&mut self) -> Option<E> {
121143
if let Some(ev) = self.buffer.pop_front() {
122144
Some(ev)
@@ -172,28 +194,6 @@ impl<C, E> Machine<C, E> {
172194
}
173195
}
174196
}
175-
176-
pub fn drain(&mut self) -> Vec<E> {
177-
let mut res = self.buffer.drain(..).collect::<Vec<_>>();
178-
if !self.rx.is_terminated() {
179-
while let Ok(Some(x)) = self.rx.try_next() {
180-
res.push(x);
181-
}
182-
}
183-
res
184-
}
185-
186-
pub fn up(&self) {
187-
self.ctrl.unbounded_send(IfaceCtrl::Up).unwrap();
188-
}
189-
190-
pub fn down(&self) {
191-
self.ctrl.unbounded_send(IfaceCtrl::Down).unwrap();
192-
}
193-
194-
pub fn namespace(&self) -> Namespace {
195-
self.ns
196-
}
197197
}
198198

199199
impl<C, E> Drop for Machine<C, E> {
@@ -215,7 +215,7 @@ fn machine<C, E>(
215215
) -> thread::JoinHandle<Result<()>>
216216
where
217217
C: Display + Send + 'static,
218-
E: FromStr + Send + 'static,
218+
E: FromStr + Display + Send + 'static,
219219
E::Err: std::fmt::Debug + Display + Send + Sync,
220220
{
221221
thread::spawn(move || {
@@ -229,6 +229,7 @@ where
229229

230230
let ctrl_task = async {
231231
while let Some(ctrl) = ctrl.next().await {
232+
log::debug!("{} CTRL {:?}", id, ctrl);
232233
match ctrl {
233234
IfaceCtrl::Up => iface.get_ref().put_up()?,
234235
IfaceCtrl::Down => iface.get_ref().put_down()?,
@@ -260,7 +261,7 @@ where
260261
if buf[0] >> 4 != 4 {
261262
continue;
262263
}
263-
log::debug!("{} (reader): sending packet", id);
264+
log::trace!("{} (reader): sending packet", id);
264265
let mut bytes = buf[..n].to_vec();
265266
if let Some(mut packet) = Packet::new(&mut bytes) {
266267
packet.set_checksum();
@@ -277,7 +278,7 @@ where
277278

278279
let writer_task = async {
279280
while let Some(packet) = rx.next().await {
280-
log::debug!("{} (writer): received packet", id);
281+
log::trace!("{} (writer): received packet", id);
281282
// can error if the interface is down
282283
if let Ok(n) = iface.write_with(|iface| iface.send(&packet)).await {
283284
if n == 0 {
@@ -303,7 +304,7 @@ where
303304
let mut buf = Vec::with_capacity(4096);
304305
while let Some(cmd) = cmd.next().await {
305306
buf.clear();
306-
log::trace!("{}", cmd);
307+
log::debug!("{} {}", id, cmd);
307308
writeln!(buf, "{}", cmd)?;
308309
stdin.write_all(&buf).await?;
309310
}
@@ -321,6 +322,7 @@ where
321322
Ok(ev) => ev,
322323
Err(err) => return Err(Error::new(ErrorKind::Other, err.to_string())),
323324
};
325+
log::debug!("{} {}", id, ev);
324326
if event.unbounded_send(ev).is_err() {
325327
break;
326328
}

router/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ enum RouterCtrl {
1717

1818
#[derive(Debug)]
1919
pub struct Ipv4Router {
20+
#[allow(unused)]
2021
addr: Ipv4Addr,
2122
ctrl: mpsc::UnboundedSender<RouterCtrl>,
2223
}
@@ -129,9 +130,9 @@ fn forward_packet(
129130
for route in routes {
130131
if route.dest().contains(dest) || dest.is_broadcast() || dest.is_multicast() {
131132
if !*en {
132-
log::debug!("router {}: route {:?} disabled", addr, route);
133+
log::trace!("router {}: route {:?} disabled", addr, route);
133134
} else {
134-
log::debug!("router {}: routing packet on route {:?}", addr, route);
135+
log::trace!("router {}: routing packet on route {:?}", addr, route);
135136
let _ = tx.unbounded_send(bytes.clone());
136137
forwarded = true;
137138
}

src/lib.rs

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ use async_process::Command;
22
use futures::prelude::*;
33
pub use libpacket::*;
44
use netsim_embed_core::*;
5-
pub use netsim_embed_core::{DelayBuffer, Ipv4Range};
5+
pub use netsim_embed_core::{DelayBuffer, Ipv4Range, Protocol};
66
pub use netsim_embed_machine::{unshare_user, Machine, MachineId, Namespace};
77
use netsim_embed_nat::*;
88
use netsim_embed_router::*;
99
use std::fmt::Display;
10-
use std::net::Ipv4Addr;
10+
use std::net::{Ipv4Addr, SocketAddrV4};
1111
use std::str::FromStr;
1212

1313
pub fn run<F>(f: F)
@@ -52,7 +52,7 @@ impl<C, E> Default for Netsim<C, E> {
5252
impl<C, E> Netsim<C, E>
5353
where
5454
C: Display + Send + 'static,
55-
E: FromStr + Send + 'static,
55+
E: FromStr + Display + Send + 'static,
5656
E::Err: std::fmt::Debug + Display + Send + Sync,
5757
{
5858
pub fn new() -> Self {
@@ -171,6 +171,9 @@ where
171171
nat.set_symmetric(config.symmetric);
172172
nat.set_blacklist_unrecognized_addrs(config.blacklist_unrecognized_addrs);
173173
nat.set_restrict_endpoints(config.restrict_endpoints);
174+
for (protocol, port, local_addr) in config.forward_ports {
175+
nat.forward_port(port, local_addr, protocol);
176+
}
174177
async_global_executor::spawn(nat).detach();
175178
self.networks[public_net.0].router.add_connection(
176179
private_net.id(),
@@ -219,21 +222,11 @@ impl Network {
219222
}
220223
}
221224

222-
#[derive(Clone, Copy, Debug)]
225+
#[derive(Clone, Debug, Default)]
223226
pub struct NatConfig {
224227
pub hair_pinning: bool,
225228
pub symmetric: bool,
226229
pub blacklist_unrecognized_addrs: bool,
227230
pub restrict_endpoints: bool,
228-
}
229-
230-
impl Default for NatConfig {
231-
fn default() -> Self {
232-
Self {
233-
hair_pinning: false,
234-
symmetric: false,
235-
blacklist_unrecognized_addrs: false,
236-
restrict_endpoints: false,
237-
}
238-
}
231+
pub forward_ports: Vec<(Protocol, u16, SocketAddrV4)>,
239232
}

0 commit comments

Comments
 (0)