Skip to content

Commit 7091565

Browse files
bors[bot]thvdveld
andauthored
Merge #634
634: IPv4 fragmentation (for outgoing) r=Dirbaio a=thvdveld Almost ready for review, just need to clean up some things 🎉 Co-authored-by: Thibaut Vandervelden <thvdveld@vub.be>
2 parents 1f35e6f + fe26f46 commit 7091565

File tree

13 files changed

+585
-165
lines changed

13 files changed

+585
-165
lines changed

examples/client.rs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use std::str::{self, FromStr};
99
feature = "proto-sixlowpan-fragmentation",
1010
feature = "proto-ipv4-fragmentation"
1111
))]
12-
use smoltcp::iface::FragmentsCache;
12+
use smoltcp::iface::ReassemblyBuffer;
1313

1414
use smoltcp::iface::{InterfaceBuilder, NeighborCache, Routes, SocketSet};
1515
use smoltcp::phy::{wait as phy_wait, Device, Medium};
@@ -51,20 +51,24 @@ fn main() {
5151
let medium = device.capabilities().medium;
5252
let mut builder = InterfaceBuilder::new().ip_addrs(ip_addrs).routes(routes);
5353

54+
#[cfg(feature = "proto-ipv4-fragmentation")]
55+
let mut ipv4_out_packet_cache = [0u8; 1280];
5456
#[cfg(feature = "proto-ipv4-fragmentation")]
5557
{
56-
let ipv4_frag_cache = FragmentsCache::new(vec![], BTreeMap::new());
57-
builder = builder.ipv4_fragments_cache(ipv4_frag_cache);
58+
let ipv4_frag_cache = ReassemblyBuffer::new(vec![], BTreeMap::new());
59+
builder = builder
60+
.ipv4_reassembly_buffer(ipv4_frag_cache)
61+
.ipv4_fragmentation_buffer(&mut ipv4_out_packet_cache[..]);
5862
}
5963

6064
#[cfg(feature = "proto-sixlowpan-fragmentation")]
61-
let mut out_packet_buffer = [0u8; 1280];
65+
let mut sixlowpan_out_packet_cache = [0u8; 1280];
6266
#[cfg(feature = "proto-sixlowpan-fragmentation")]
6367
{
64-
let sixlowpan_frag_cache = FragmentsCache::new(vec![], BTreeMap::new());
68+
let sixlowpan_frag_cache = ReassemblyBuffer::new(vec![], BTreeMap::new());
6569
builder = builder
66-
.sixlowpan_fragments_cache(sixlowpan_frag_cache)
67-
.sixlowpan_out_packet_cache(&mut out_packet_buffer[..]);
70+
.sixlowpan_reassembly_buffer(sixlowpan_frag_cache)
71+
.sixlowpan_fragmentation_buffer(&mut sixlowpan_out_packet_cache[..]);
6872
}
6973

7074
if medium == Medium::Ethernet {

examples/server.rs

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@ use log::debug;
44
use std::collections::BTreeMap;
55
use std::fmt::Write;
66
use std::os::unix::io::AsRawFd;
7-
use std::str;
87

98
#[cfg(any(
109
feature = "proto-sixlowpan-fragmentation",
1110
feature = "proto-ipv4-fragmentation"
1211
))]
13-
use smoltcp::iface::FragmentsCache;
12+
use smoltcp::iface::ReassemblyBuffer;
1413
use smoltcp::iface::{InterfaceBuilder, NeighborCache, SocketSet};
1514
use smoltcp::phy::{wait as phy_wait, Device, Medium};
1615
use smoltcp::socket::{tcp, udp};
@@ -32,8 +31,14 @@ fn main() {
3231

3332
let neighbor_cache = NeighborCache::new(BTreeMap::new());
3433

35-
let udp_rx_buffer = udp::PacketBuffer::new(vec![udp::PacketMetadata::EMPTY], vec![0; 65535]);
36-
let udp_tx_buffer = udp::PacketBuffer::new(vec![udp::PacketMetadata::EMPTY], vec![0; 65535]);
34+
let udp_rx_buffer = udp::PacketBuffer::new(
35+
vec![udp::PacketMetadata::EMPTY, udp::PacketMetadata::EMPTY],
36+
vec![0; 65535],
37+
);
38+
let udp_tx_buffer = udp::PacketBuffer::new(
39+
vec![udp::PacketMetadata::EMPTY, udp::PacketMetadata::EMPTY],
40+
vec![0; 65535],
41+
);
3742
let udp_socket = udp::Socket::new(udp_rx_buffer, udp_tx_buffer);
3843

3944
let tcp1_rx_buffer = tcp::SocketBuffer::new(vec![0; 64]);
@@ -62,20 +67,31 @@ fn main() {
6267
let medium = device.capabilities().medium;
6368
let mut builder = InterfaceBuilder::new().ip_addrs(ip_addrs);
6469

70+
builder = builder.random_seed(
71+
std::time::SystemTime::now()
72+
.duration_since(std::time::UNIX_EPOCH)
73+
.unwrap()
74+
.as_secs(),
75+
);
76+
77+
#[cfg(feature = "proto-ipv4-fragmentation")]
78+
let mut ipv4_out_packet_cache = [0u8; 10_000];
6579
#[cfg(feature = "proto-ipv4-fragmentation")]
6680
{
67-
let ipv4_frag_cache = FragmentsCache::new(vec![], BTreeMap::new());
68-
builder = builder.ipv4_fragments_cache(ipv4_frag_cache);
81+
let ipv4_frag_cache = ReassemblyBuffer::new(vec![], BTreeMap::new());
82+
builder = builder
83+
.ipv4_reassembly_buffer(ipv4_frag_cache)
84+
.ipv4_fragmentation_buffer(&mut ipv4_out_packet_cache[..]);
6985
}
7086

7187
#[cfg(feature = "proto-sixlowpan-fragmentation")]
72-
let mut out_packet_buffer = [0u8; 1280];
88+
let mut sixlowpan_out_packet_cache = [0u8; 1280];
7389
#[cfg(feature = "proto-sixlowpan-fragmentation")]
7490
{
75-
let sixlowpan_frag_cache = FragmentsCache::new(vec![], BTreeMap::new());
91+
let sixlowpan_frag_cache = ReassemblyBuffer::new(vec![], BTreeMap::new());
7692
builder = builder
77-
.sixlowpan_fragments_cache(sixlowpan_frag_cache)
78-
.sixlowpan_out_packet_cache(&mut out_packet_buffer[..]);
93+
.sixlowpan_reassembly_buffer(sixlowpan_frag_cache)
94+
.sixlowpan_fragmentation_buffer(&mut sixlowpan_out_packet_cache[..]);
7995
}
8096

8197
if medium == Medium::Ethernet {
@@ -110,22 +126,16 @@ fn main() {
110126

111127
let client = match socket.recv() {
112128
Ok((data, endpoint)) => {
113-
debug!(
114-
"udp:6969 recv data: {:?} from {}",
115-
str::from_utf8(data).unwrap(),
116-
endpoint
117-
);
118-
Some(endpoint)
129+
debug!("udp:6969 recv data: {:?} from {}", data, endpoint);
130+
let mut data = data.to_vec();
131+
data.reverse();
132+
Some((endpoint, data))
119133
}
120134
Err(_) => None,
121135
};
122-
if let Some(endpoint) = client {
123-
let data = b"hello\n";
124-
debug!(
125-
"udp:6969 send data: {:?}",
126-
str::from_utf8(data.as_ref()).unwrap()
127-
);
128-
socket.send_slice(data, endpoint).unwrap();
136+
if let Some((endpoint, data)) = client {
137+
debug!("udp:6969 send data: {:?} to {}", data, endpoint,);
138+
socket.send_slice(&data, endpoint).unwrap();
129139
}
130140

131141
// tcp:6969: respond "hello"
@@ -160,10 +170,7 @@ fn main() {
160170
let recvd_len = buffer.len();
161171
let mut data = buffer.to_owned();
162172
if !data.is_empty() {
163-
debug!(
164-
"tcp:6970 recv data: {:?}",
165-
str::from_utf8(data.as_ref()).unwrap_or("(invalid utf8)")
166-
);
173+
debug!("tcp:6970 recv data: {:?}", data);
167174
data = data.split(|&b| b == b'\n').collect::<Vec<_>>().concat();
168175
data.reverse();
169176
data.extend(b"\n");
@@ -172,10 +179,7 @@ fn main() {
172179
})
173180
.unwrap();
174181
if socket.can_send() && !data.is_empty() {
175-
debug!(
176-
"tcp:6970 send data: {:?}",
177-
str::from_utf8(data.as_ref()).unwrap_or("(invalid utf8)")
178-
);
182+
debug!("tcp:6970 send data: {:?}", data);
179183
socket.send_slice(&data[..]).unwrap();
180184
}
181185
} else if socket.may_send() {

examples/sixlowpan.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ use std::collections::BTreeMap;
4747
use std::os::unix::io::AsRawFd;
4848
use std::str;
4949

50-
use smoltcp::iface::{FragmentsCache, InterfaceBuilder, NeighborCache, SocketSet};
50+
use smoltcp::iface::{InterfaceBuilder, NeighborCache, ReassemblyBuffer, SocketSet};
5151
use smoltcp::phy::{wait as phy_wait, Medium, RawSocket};
5252
use smoltcp::socket::tcp;
5353
use smoltcp::socket::udp;
@@ -95,18 +95,18 @@ fn main() {
9595

9696
#[cfg(feature = "proto-ipv4-fragmentation")]
9797
{
98-
let ipv4_frag_cache = FragmentsCache::new(vec![], BTreeMap::new());
99-
builder = builder.ipv4_fragments_cache(ipv4_frag_cache);
98+
let ipv4_frag_cache = ReassemblyBuffer::new(vec![], BTreeMap::new());
99+
builder = builder.ipv4_reassembly_buffer(ipv4_frag_cache);
100100
}
101101

102102
#[cfg(feature = "proto-sixlowpan-fragmentation")]
103103
let mut out_packet_buffer = [0u8; 1280];
104104
#[cfg(feature = "proto-sixlowpan-fragmentation")]
105105
{
106-
let sixlowpan_frag_cache = FragmentsCache::new(vec![], BTreeMap::new());
106+
let sixlowpan_frag_cache = ReassemblyBuffer::new(vec![], BTreeMap::new());
107107
builder = builder
108-
.sixlowpan_fragments_cache(sixlowpan_frag_cache)
109-
.sixlowpan_out_packet_cache(&mut out_packet_buffer[..]);
108+
.sixlowpan_reassembly_buffer(sixlowpan_frag_cache)
109+
.sixlowpan_fragmentation_buffer(&mut out_packet_buffer[..]);
110110
}
111111

112112
let mut iface = builder.finalize(&mut device);

examples/sixlowpan_benchmark.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ use std::collections::BTreeMap;
4848
use std::os::unix::io::AsRawFd;
4949
use std::str;
5050

51-
use smoltcp::iface::{FragmentsCache, InterfaceBuilder, NeighborCache, SocketSet};
51+
use smoltcp::iface::{InterfaceBuilder, NeighborCache, ReassemblyBuffer, SocketSet};
5252
use smoltcp::phy::{wait as phy_wait, Medium, RawSocket};
5353
use smoltcp::socket::tcp;
5454
use smoltcp::wire::{Ieee802154Pan, IpAddress, IpCidr};
@@ -166,16 +166,16 @@ fn main() {
166166
64,
167167
)];
168168

169-
let cache = FragmentsCache::new(vec![], BTreeMap::new());
169+
let cache = ReassemblyBuffer::new(vec![], BTreeMap::new());
170170

171171
let mut builder = InterfaceBuilder::new()
172172
.ip_addrs(ip_addrs)
173173
.pan_id(Ieee802154Pan(0xbeef));
174174
builder = builder
175175
.hardware_addr(ieee802154_addr.into())
176176
.neighbor_cache(neighbor_cache)
177-
.sixlowpan_fragments_cache(cache)
178-
.sixlowpan_out_packet_cache(vec![]);
177+
.sixlowpan_reassembly_buffer(cache)
178+
.sixlowpan_fragmentation_buffer(vec![]);
179179
let mut iface = builder.finalize(&mut device);
180180

181181
let mut sockets = SocketSet::new(vec![]);

0 commit comments

Comments
 (0)