Skip to main content

os/net/
socket.rs

1use alloc::collections::VecDeque;
2use alloc::vec::Vec;
3use lazy_static::lazy_static;
4use lose_net_stack::IPv4;
5
6use crate::sync::UPIntrFreeCell;
7
8// TODO: specify the protocol, TCP or UDP
9pub struct Socket {
10    pub raddr: IPv4,                // remote address
11    pub lport: u16,                 // local port
12    pub rport: u16,                 // rempote port
13    pub buffers: VecDeque<Vec<u8>>, // datas
14    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
23/// get the seq and ack by socket index
24pub 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}