Skip to content

Commit f7cd1a0

Browse files
feat(kernel): bump crabnet and crabnet_tcp
* Bump `crabnet` and `crabnet_tcp` * No longer ignore the TCP options and pass them to `on_packet` on the respective TCP socket. Signed-off-by: Anhad Singh <[email protected]>
1 parent c63e036 commit f7cd1a0

File tree

5 files changed

+49
-25
lines changed

5 files changed

+49
-25
lines changed

src/Cargo.lock

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/aero_kernel/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ vte = { git = "https://github.com/alacritty/vte", features = ["ansi"] }
5050
byte_endian = { git = "https://github.com/aero-os/byte_endian" }
5151
crabnet = { git = "https://github.com/aero-os/crabnet" }
5252
crabnet_tcp = { git = "https://github.com/aero-os/crabnet", default-features = false }
53+
# crabnet = { path = "../../../orgs/aero/crabnet" }
54+
# crabnet_tcp = { path = "../../../orgs/aero/crabnet/crabnet_tcp", default-features = false }
5355

5456
# X86_64 specific dependencies:
5557
[target.'cfg(target_arch = "x86_64")'.dependencies]

src/aero_kernel/src/net/mod.rs

+25-5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use alloc::boxed::Box;
1919
use alloc::sync::Arc;
2020
use alloc::vec::Vec;
21+
use crabnet::transport::TcpOptions;
2122
use spin::RwLock;
2223

2324
pub mod arp;
@@ -132,12 +133,11 @@ fn packet_processor_thread() {
132133

133134
Ipv4Type::Tcp => {
134135
let tcp = parser.next::<Tcp>();
135-
let options_size = tcp.options_size() as usize;
136-
let size = ip.payload_len() as usize - core::mem::size_of::<Tcp>();
136+
let size = ip.payload_len() as usize - tcp.header_size() as usize;
137+
let options = parser.next::<TcpOptions>();
138+
let payload = &parser.payload()[..size];
137139

138-
// TODO(andypython): do not ignore TCP options.
139-
let payload = &parser.payload()[options_size..size];
140-
tcp::on_packet(tcp, payload)
140+
tcp::on_packet(tcp, options, payload)
141141
}
142142
}
143143
}
@@ -217,6 +217,26 @@ pub mod shim {
217217
}
218218
}
219219

220+
impl<T: Protocol, U: Protocol, S: Protocol> PacketSend
221+
for Stacked<Stacked<Stacked<Stacked<Eth, Ipv4>, T>, U>, S>
222+
{
223+
fn send(mut self) {
224+
let device = net::default_device();
225+
226+
let eth = &mut self.upper.upper.upper.upper;
227+
let ip = &self.upper.upper.upper.lower;
228+
229+
eth.src_mac = device.mac();
230+
231+
if let Some(addr) = arp::get(ip.dest_ip()) {
232+
eth.dest_mac = addr;
233+
device.send(self.into_boxed_bytes_in(DmaAllocator));
234+
} else {
235+
arp::request_ip(ip.dest_ip(), self.into_boxed_bytes_in(DmaAllocator));
236+
}
237+
}
238+
}
239+
220240
impl PacketSend for Arp {
221241
fn send(self) {
222242
let device = net::default_device();

src/aero_kernel/src/net/tcp.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@
1818
use alloc::collections::BTreeMap;
1919
use alloc::sync::Arc;
2020

21-
use crabnet::transport::Tcp;
21+
use crabnet::transport::{Tcp, TcpOptions};
2222
use spin::RwLock;
2323

2424
use crate::socket::tcp::TcpSocket;
2525

2626
static HANDLERS: RwLock<BTreeMap<u16, Arc<TcpSocket>>> = RwLock::new(BTreeMap::new());
2727

28-
pub fn on_packet(tcp: &Tcp, payload: &[u8]) {
28+
pub fn on_packet(tcp: &Tcp, options: TcpOptions, payload: &[u8]) {
2929
let handlers = HANDLERS.read();
3030

3131
if let Some(handler) = handlers.get(&tcp.dest_port()) {
32-
handler.on_packet(tcp, payload);
32+
handler.on_packet(tcp, options, payload);
3333
} else {
3434
log::warn!("tcp: no handler registered for port {}", tcp.dest_port());
3535
}

src/aero_kernel/src/socket/tcp.rs

+17-15
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ use aero_syscall::{InAddr, OpenFlags, SocketAddrInet, AF_INET};
33
use alloc::sync::{Arc, Weak};
44
use alloc::vec::Vec;
55

6+
use crabnet::network::Ipv4Addr;
67
use spin::Once;
78

89
use crabnet::data_link::{Eth, EthType, MacAddr};
9-
use crabnet::transport::Tcp;
10-
use crabnet_tcp::{Address, Error as TcpError, State};
10+
use crabnet::transport::{Tcp, TcpOptions};
11+
use crabnet_tcp::{Address, Error as TcpError, Packet as TcpPacket, State};
1112

1213
use crate::fs::file_table::FileHandle;
1314
use crate::fs::inode::{FileType, INodeInterface, Metadata, PollFlags, PollTable};
@@ -23,19 +24,14 @@ use crate::utils::sync::{Mutex, WaitQueue};
2324
struct DeviceShim(Arc<NetworkDevice>);
2425

2526
impl crabnet_tcp::NetworkDevice for DeviceShim {
26-
fn send(
27-
&self,
28-
ipv4: crabnet::network::Ipv4,
29-
tcp: Tcp,
30-
payload: &[u8],
31-
_handle: crabnet_tcp::RetransmitHandle,
32-
) {
33-
// TODO(andypython): Handle TCP retransmission here.
27+
fn ip(&self) -> Ipv4Addr {
28+
self.0.ip()
29+
}
3430

31+
fn send(&self, packet: TcpPacket, _handle: crabnet_tcp::RetransmitHandle) {
32+
// TODO(andypython): Handle TCP retransmission here.
3533
let eth = Eth::new(MacAddr::NULL, self.0.mac(), EthType::Ip);
36-
let ipv4 = ipv4.set_src_ip(self.0.ip());
37-
38-
(eth / ipv4 / tcp / payload).send();
34+
(eth / packet.ip / packet.tcp / packet.options / packet.payload).send();
3935
}
4036

4137
fn remove_retransmit(&self, _seq_number: u32) {
@@ -62,9 +58,15 @@ impl TcpSocket {
6258
})
6359
}
6460

65-
pub fn on_packet(&self, tcp: &Tcp, payload: &[u8]) {
61+
pub fn on_packet(&self, tcp: &Tcp, options: TcpOptions, payload: &[u8]) {
6662
if let Some(socket) = self.tcp.lock_irq().as_mut() {
67-
socket.on_packet(tcp, payload);
63+
// Ignore any invalid TCP options.
64+
let options = options
65+
.iter()
66+
.filter_map(|option| option.ok())
67+
.collect::<Vec<_>>();
68+
69+
socket.on_packet(tcp, &options, payload);
6870
self.wq.notify_all();
6971
}
7072
}

0 commit comments

Comments
 (0)