Skip to main content

os/net/
tcp.rs

1use alloc::vec;
2use lose_net_stack::IPv4;
3use lose_net_stack::MacAddress;
4use lose_net_stack::TcpFlags;
5use lose_net_stack::packets::tcp::TCPPacket;
6
7use crate::{drivers::NET_DEVICE, fs::File};
8
9use super::socket::get_s_a_by_index;
10use super::{
11    LOSE_NET_STACK, net_interrupt_handler,
12    socket::{add_socket, pop_data, remove_socket},
13};
14
15// add tcp packet info to this structure
16pub struct TCP {
17    pub target: IPv4,
18    pub sport: u16,
19    pub dport: u16,
20    #[allow(unused)]
21    pub seq: u32,
22    #[allow(unused)]
23    pub ack: u32,
24    pub socket_index: usize,
25}
26
27impl TCP {
28    pub fn new(target: IPv4, sport: u16, dport: u16, seq: u32, ack: u32) -> Self {
29        let index = add_socket(target, sport, dport).expect("can't add socket");
30
31        Self {
32            target,
33            sport,
34            dport,
35            seq,
36            ack,
37            socket_index: index,
38        }
39    }
40}
41
42impl File for TCP {
43    fn readable(&self) -> bool {
44        true
45    }
46
47    fn writable(&self) -> bool {
48        true
49    }
50
51    fn read(&self, mut buf: crate::mm::UserBuffer) -> usize {
52        loop {
53            if let Some(data) = pop_data(self.socket_index) {
54                let data_len = data.len();
55                let mut left = 0;
56                for i in 0..buf.buffers.len() {
57                    let buffer_i_len = buf.buffers[i].len().min(data_len - left);
58
59                    buf.buffers[i][..buffer_i_len]
60                        .copy_from_slice(&data[left..(left + buffer_i_len)]);
61
62                    left += buffer_i_len;
63                    if left == data_len {
64                        break;
65                    }
66                }
67                return left;
68            } else {
69                net_interrupt_handler();
70            }
71        }
72    }
73
74    fn write(&self, buf: crate::mm::UserBuffer) -> usize {
75        let lose_net_stack = LOSE_NET_STACK.0.exclusive_access();
76
77        let mut data = vec![0u8; buf.len()];
78
79        let mut left = 0;
80        for i in 0..buf.buffers.len() {
81            data[left..(left + buf.buffers[i].len())].copy_from_slice(buf.buffers[i]);
82            left += buf.buffers[i].len();
83        }
84
85        let len = data.len();
86
87        // get sock and sequence
88        let (ack, seq) = get_s_a_by_index(self.socket_index).map_or((0, 0), |x| x);
89
90        let tcp_packet = TCPPacket {
91            source_ip: lose_net_stack.ip,
92            source_mac: lose_net_stack.mac,
93            source_port: self.sport,
94            dest_ip: self.target,
95            dest_mac: MacAddress::new([0xff, 0xff, 0xff, 0xff, 0xff, 0xff]),
96            dest_port: self.dport,
97            data_len: len,
98            seq,
99            ack,
100            flags: TcpFlags::A,
101            win: 65535,
102            urg: 0,
103            data: data.as_ref(),
104        };
105        NET_DEVICE.transmit(&tcp_packet.build_data());
106        len
107    }
108}
109
110impl Drop for TCP {
111    fn drop(&mut self) {
112        remove_socket(self.socket_index)
113    }
114}