Skip to content

Commit

Permalink
Fix syn handling
Browse files Browse the repository at this point in the history
  • Loading branch information
hikalium committed Aug 31, 2024
1 parent 68da9c9 commit 888534e
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 19 deletions.
35 changes: 16 additions & 19 deletions os/src/net/tcp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ impl TcpSocket {
let ip_data_size = out_tcp.header_len() + tcp_payload_data.len();
out_tcp.ip.set_data_length(ip_data_size);
let mut out_bytes = vec![0; (size_of::<IpV4Packet>() + ip_data_size).next_multiple_of(2)];
info!("net: tcp: send: {out_tcp:?}",);
out_bytes[0..size_of::<TcpPacket>()].copy_from_slice(out_tcp.as_slice());
out_bytes[size_of::<TcpPacket>()..][..tcp_payload_data.len()]
.copy_from_slice(tcp_payload_data);
Expand Down Expand Up @@ -306,7 +307,7 @@ impl TcpSocket {
let to_port = in_tcp.src_port();
//
let seq = *self.my_next_seq.lock();
let mut seq_to_ack = None;
let mut seq_to_ack = in_tcp.seq_num();
let mut fin = false;
let mut syn = false;
let prev_state = *self.state.lock();
Expand All @@ -317,7 +318,7 @@ impl TcpSocket {
return Ok(());
}
info!("net: tcp: recv: TCP SYN received");
seq_to_ack = Some(in_tcp.seq_num().wrapping_add(1));
seq_to_ack = seq_to_ack.wrapping_add(1);
// SYN consumes 1 byte in the seq number space.
syn = true;
*self.my_next_seq.lock() = seq.wrapping_add(1);
Expand All @@ -339,7 +340,7 @@ impl TcpSocket {
}
// Reply ACK
// SYN consumes 1 byte in the seq number space.
seq_to_ack = Some(in_tcp.seq_num().wrapping_add(1));
seq_to_ack = seq_to_ack.wrapping_add(1);
// Now the socket is established
*self.state.lock() = TcpSocketState::Established;
info!("net: tcp: recv: TCP connection established");
Expand All @@ -361,22 +362,20 @@ impl TcpSocket {
}
TcpSocketState::Established => {
if in_tcp.is_fin() {
seq_to_ack = Some(in_tcp.seq_num().wrapping_add(1));
seq_to_ack = seq_to_ack.wrapping_add(1);
// FIN consumes 1 byte in the seq number space.
fin = true;
*self.state.lock() = TcpSocketState::LastAck;
} else if in_tcp_data.is_empty() {
return Ok(());
} else {
if let Ok(s) = core::str::from_utf8(in_tcp_data) {
info!(
"net: tcp: recv: data(str) size = {}: {s}",
in_tcp_data.len()
);
}
seq_to_ack = Some(in_tcp.seq_num().wrapping_add(in_tcp_data.len() as u32));
self.rx_data.lock().extend(in_tcp_data);
}
if let Ok(s) = core::str::from_utf8(in_tcp_data) {
info!(
"net: tcp: recv: data(str) size = {}: {s}",
in_tcp_data.len()
);
}
seq_to_ack = seq_to_ack.wrapping_add(in_tcp_data.len() as u32);
self.rx_data.lock().extend(in_tcp_data);
// Send ACK
}
TcpSocketState::LastAck => {
if in_tcp.is_ack() {
Expand All @@ -393,16 +392,14 @@ impl TcpSocket {
}

//
if let Some(seq_to_ack) = seq_to_ack {
*self.last_seq_to_ack.lock() = seq_to_ack;
}
*self.last_seq_to_ack.lock() = seq_to_ack;
let out_bytes = Self::gen_tcp_packet(
to_ip,
to_port,
from_ip,
from_port,
seq,
seq_to_ack,
Some(seq_to_ack),
syn,
fin,
&[],
Expand Down
6 changes: 6 additions & 0 deletions os/src/syscall.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,11 @@ fn sys_nslookup(args: &[u64; 5]) -> i64 {
-1
}

fn sys_tcp_connect(_args: &[u64; 5]) -> i64 {
info!("sys_tcp_connect!");
-1
}

pub fn syscall_handler(op: u64, args: &[u64; 5]) -> u64 {
match op {
0 => sys_exit(args),
Expand All @@ -131,6 +136,7 @@ pub fn syscall_handler(op: u64, args: &[u64; 5]) -> u64 {
5 => sys_get_mouse_cursor_position(args),
6 => sys_get_args_region(args),
7 => sys_nslookup(args) as u64,
8 => sys_tcp_connect(args) as u64,
op => {
println!("syscall: unimplemented syscall: {}", op);
1
Expand Down

0 comments on commit 888534e

Please sign in to comment.