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
15pub 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 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}