1use alloc::collections::VecDeque;
2use alloc::vec::Vec;
3use lazy_static::lazy_static;
4use lose_net_stack::IPv4;
5
6use crate::sync::UPIntrFreeCell;
7
8pub struct Socket {
10 pub raddr: IPv4, pub lport: u16, pub rport: u16, pub buffers: VecDeque<Vec<u8>>, pub seq: u32,
15 pub ack: u32,
16}
17
18lazy_static! {
19 static ref SOCKET_TABLE: UPIntrFreeCell<Vec<Option<Socket>>> =
20 unsafe { UPIntrFreeCell::new(Vec::new()) };
21}
22
23pub fn get_s_a_by_index(index: usize) -> Option<(u32, u32)> {
25 let socket_table = SOCKET_TABLE.exclusive_access();
26
27 assert!(index < socket_table.len());
28
29 socket_table.get(index).map_or(None, |x| match x {
30 Some(x) => Some((x.seq, x.ack)),
31 None => None,
32 })
33}
34
35pub fn set_s_a_by_index(index: usize, seq: u32, ack: u32) {
36 let mut socket_table = SOCKET_TABLE.exclusive_access();
37
38 assert!(socket_table.len() > index);
39 assert!(socket_table[index].is_some());
40
41 let sock = socket_table[index].as_mut().unwrap();
42
43 sock.ack = ack;
44 sock.seq = seq;
45}
46
47pub fn get_socket(raddr: IPv4, lport: u16, rport: u16) -> Option<usize> {
48 let socket_table = SOCKET_TABLE.exclusive_access();
49 for i in 0..socket_table.len() {
50 let sock = &socket_table[i];
51 if sock.is_none() {
52 continue;
53 }
54
55 let sock = sock.as_ref().unwrap();
56 if sock.raddr == raddr && sock.lport == lport && sock.rport == rport {
57 return Some(i);
58 }
59 }
60 None
61}
62
63pub fn add_socket(raddr: IPv4, lport: u16, rport: u16) -> Option<usize> {
64 if get_socket(raddr, lport, rport).is_some() {
65 return None;
66 }
67
68 let mut socket_table = SOCKET_TABLE.exclusive_access();
69 let mut index = usize::MAX;
70 for i in 0..socket_table.len() {
71 if socket_table[i].is_none() {
72 index = i;
73 break;
74 }
75 }
76
77 let socket = Socket {
78 raddr,
79 lport,
80 rport,
81 buffers: VecDeque::new(),
82 seq: 0,
83 ack: 0,
84 };
85
86 if index == usize::MAX {
87 socket_table.push(Some(socket));
88 Some(socket_table.len() - 1)
89 } else {
90 socket_table[index] = Some(socket);
91 Some(index)
92 }
93}
94
95pub fn remove_socket(index: usize) {
96 let mut socket_table = SOCKET_TABLE.exclusive_access();
97
98 assert!(socket_table.len() > index);
99
100 socket_table[index] = None;
101}
102
103pub fn push_data(index: usize, data: Vec<u8>) {
104 let mut socket_table = SOCKET_TABLE.exclusive_access();
105
106 assert!(socket_table.len() > index);
107 assert!(socket_table[index].is_some());
108
109 socket_table[index]
110 .as_mut()
111 .unwrap()
112 .buffers
113 .push_back(data);
114}
115
116pub fn pop_data(index: usize) -> Option<Vec<u8>> {
117 let mut socket_table = SOCKET_TABLE.exclusive_access();
118
119 assert!(socket_table.len() > index);
120 assert!(socket_table[index].is_some());
121
122 socket_table[index].as_mut().unwrap().buffers.pop_front()
123}