Skip to content

Commit e06db2b

Browse files
veluca93Virv12
authored andcommitted
Refactor net to be independent of the OS.
1 parent 7bf0c6a commit e06db2b

13 files changed

Lines changed: 761 additions & 687 deletions

File tree

pixie-uefi/Cargo.lock

Lines changed: 25 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pixie-uefi/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ managed = { version = "0.8.0", default-features = false, features = ["alloc"] }
2424
minicov = { version = "0.3.7", optional = true }
2525
postcard = { version = "1.1.3", default-features = false, features = ["alloc"] }
2626
smoltcp = { version = "0.12.0", default-features = false, features = ["alloc", "proto-ipv4", "medium-ethernet", "socket-udp", "socket-tcp", "socket-dhcpv4", "async", "socket-tcp-cubic"] }
27+
spin = "0.10.0"
2728
thingbuf = { version = "0.1.6", default-features = false, features = ["alloc"] }
2829
uefi = { version = "0.36.1", features = ["alloc", "global_allocator", "panic_handler"] }
2930

pixie-uefi/src/flash.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,18 @@ use uefi::proto::console::text::Color;
1616

1717
use crate::os::boot_options::BootOptions;
1818
use crate::os::error::{Error, Result};
19-
use crate::os::{memory, TcpStream, UefiOS, PACKET_SIZE};
19+
use crate::os::net::{TcpStream, UdpSocket, ETH_PACKET_SIZE};
20+
use crate::os::{memory, UefiOS};
2021
use crate::MIN_MEMORY;
2122

2223
async fn fetch_image(stream: &TcpStream) -> Result<Image> {
2324
let req = TcpRequest::GetImage;
2425
let mut buf = postcard::to_allocvec(&req)?;
25-
stream.send_u64_le(buf.len() as u64).await?;
26-
stream.send(&buf).await?;
27-
let len = stream.recv_u64_le().await?;
26+
stream.write_u64_le(buf.len() as u64).await?;
27+
stream.write_all(&buf).await?;
28+
let len = stream.read_u64_le().await?;
2829
buf.resize(len as usize, 0);
29-
stream.recv_exact(&mut buf).await?;
30+
stream.read_exact(&mut buf).await?;
3031
Ok(postcard::from_bytes(&buf)?)
3132
}
3233

@@ -74,9 +75,9 @@ fn handle_packet(
7475
}
7576

7677
pub async fn flash(os: UefiOS, server_addr: SocketAddrV4) -> Result<()> {
77-
let stream = os.connect(server_addr).await?;
78+
let stream = TcpStream::connect(server_addr).await?;
7879
let image = fetch_image(&stream).await?;
79-
stream.close_send().await;
80+
stream.shutdown().await;
8081
// TODO(virv): this could be better
8182
stream.force_close().await;
8283

@@ -160,8 +161,8 @@ pub async fn flash(os: UefiOS, server_addr: SocketAddrV4) -> Result<()> {
160161

161162
info!("Disk scanned; {} chunks to fetch", stats.borrow().fetch);
162163

163-
let socket = os.udp_bind(Some(CHUNKS_PORT)).await?;
164-
let mut buf = [0; PACKET_SIZE];
164+
let socket = UdpSocket::bind(Some(CHUNKS_PORT)).await?;
165+
let mut buf = [0; ETH_PACKET_SIZE];
165166

166167
let mut received = BTreeMap::new();
167168

@@ -177,7 +178,7 @@ pub async fn flash(os: UefiOS, server_addr: SocketAddrV4) -> Result<()> {
177178
BytesFmt(free_mem)
178179
);
179180
while !chunks_info.is_empty() {
180-
let recv = Box::pin(socket.recv(&mut buf));
181+
let recv = Box::pin(socket.recv_from(&mut buf));
181182
let sleep = Box::pin(os.sleep_us(100_000));
182183
match select(recv, sleep).await {
183184
Either::Left(((buf, _addr), _)) => {
@@ -204,7 +205,7 @@ pub async fn flash(os: UefiOS, server_addr: SocketAddrV4) -> Result<()> {
204205
chunks_info.iter().take(40).map(|(hash, _)| *hash).collect();
205206
stats.borrow_mut().requested += chunks.len();
206207
let msg = postcard::to_allocvec(&UdpRequest::RequestChunks(chunks)).unwrap();
207-
socket.send(server_addr, &msg).await?;
208+
socket.send_to(server_addr, &msg).await?;
208209
}
209210
}
210211
}
@@ -221,7 +222,7 @@ pub async fn flash(os: UefiOS, server_addr: SocketAddrV4) -> Result<()> {
221222

222223
let msg = UdpRequest::ActionProgress(stats.borrow().recv, stats.borrow().fetch);
223224
socket
224-
.send(server_addr, &postcard::to_allocvec(&msg)?)
225+
.send_to(server_addr, &postcard::to_allocvec(&msg)?)
225226
.await?;
226227
}
227228
Ok(())

pixie-uefi/src/main.rs

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ use uefi::{entry, Status};
1414

1515
use crate::flash::flash;
1616
use crate::os::error::{Error, Result};
17-
use crate::os::{TcpStream, UefiOS, PACKET_SIZE};
17+
use crate::os::net::{TcpStream, UdpSocket, ETH_PACKET_SIZE};
18+
use crate::os::UefiOS;
1819
use crate::reboot_to_os::reboot_to_os;
1920
use crate::register::register;
2021
use crate::store::store;
@@ -33,22 +34,22 @@ mod export_cov;
3334
const MIN_MEMORY: u64 = 32 << 20;
3435

3536
async fn server_discover(os: UefiOS) -> Result<SocketAddrV4> {
36-
let socket = os.udp_bind(None).await?;
37+
let socket = UdpSocket::bind(None).await?;
3738

3839
let task1 = async {
3940
let msg = postcard::to_allocvec(&UdpRequest::Discover).unwrap();
4041
#[allow(unreachable_code)]
4142
Ok::<_, Error>(loop {
4243
socket
43-
.send(SocketAddrV4::new(Ipv4Addr::BROADCAST, ACTION_PORT), &msg)
44+
.send_to(SocketAddrV4::new(Ipv4Addr::BROADCAST, ACTION_PORT), &msg)
4445
.await?;
4546
os.sleep_us(1_000_000).await;
4647
})
4748
};
4849

4950
let task2 = async {
50-
let mut buf = [0; PACKET_SIZE];
51-
let (data, server) = socket.recv(&mut buf).await;
51+
let mut buf = [0; ETH_PACKET_SIZE];
52+
let (data, server) = socket.recv_from(&mut buf).await;
5253
assert_eq!(data.len(), 0);
5354
Ok::<_, Error>(server)
5455
};
@@ -75,22 +76,22 @@ async fn shutdown(os: UefiOS) -> ! {
7576

7677
async fn get_action(stream: &TcpStream) -> Result<Action> {
7778
let msg = postcard::to_allocvec(&TcpRequest::GetAction)?;
78-
stream.send_u64_le(msg.len() as u64).await?;
79-
stream.send(&msg).await?;
79+
stream.write_u64_le(msg.len() as u64).await?;
80+
stream.write_all(&msg).await?;
8081

81-
let len = stream.recv_u64_le().await? as usize;
82+
let len = stream.read_u64_le().await? as usize;
8283
let mut buf = vec![0; len];
83-
stream.recv_exact(&mut buf).await?;
84+
stream.read_exact(&mut buf).await?;
8485
let cmd = postcard::from_bytes(&buf)?;
8586
Ok(cmd)
8687
}
8788

8889
async fn complete_action(stream: &TcpStream) -> Result<()> {
8990
let msg = postcard::to_allocvec(&TcpRequest::ActionComplete)?;
90-
stream.send_u64_le(msg.len() as u64).await?;
91-
stream.send(&msg).await?;
91+
stream.write_u64_le(msg.len() as u64).await?;
92+
stream.write_all(&msg).await?;
9293

93-
let len = stream.recv_u64_le().await?;
94+
let len = stream.read_u64_le().await?;
9495
assert_eq!(len, 0);
9596
Ok(())
9697
}
@@ -101,10 +102,10 @@ async fn run(os: UefiOS) -> Result<()> {
101102
let mut last_was_wait = false;
102103

103104
os.spawn("ping", async move {
104-
let udp_socket = os.udp_bind(None).await.unwrap();
105+
let udp_socket = UdpSocket::bind(None).await.unwrap();
105106
loop {
106107
udp_socket
107-
.send(SocketAddrV4::new(*server.ip(), PING_PORT), b"pixie")
108+
.send_to(SocketAddrV4::new(*server.ip(), PING_PORT), b"pixie")
108109
.await
109110
.unwrap();
110111
os.sleep_us(10_000_000).await;
@@ -119,9 +120,9 @@ async fn run(os: UefiOS) -> Result<()> {
119120
log::debug!("Sending request for command");
120121
}
121122

122-
let tcp = os.connect(server).await?;
123+
let tcp = TcpStream::connect(server).await?;
123124
let command = get_action(&tcp).await;
124-
tcp.close_send().await;
125+
tcp.shutdown().await;
125126
tcp.force_close().await;
126127

127128
if let Err(e) = command {
@@ -151,9 +152,9 @@ async fn run(os: UefiOS) -> Result<()> {
151152
Action::Flash => flash(os, server).await?,
152153
}
153154

154-
let tcp = os.connect(server).await?;
155+
let tcp = TcpStream::connect(server).await?;
155156
complete_action(&tcp).await?;
156-
tcp.close_send().await;
157+
tcp.shutdown().await;
157158
tcp.force_close().await;
158159

159160
if command == Action::Restart {

0 commit comments

Comments
 (0)