network: calculate ICMPv4 checksums

This commit is contained in:
Alex Zenla 2024-02-13 12:01:35 +00:00
parent de0b2c35b1
commit c14a95a4bd
No known key found for this signature in database
GPG Key ID: 067B238899B51269
2 changed files with 4 additions and 3 deletions

View File

@ -14,7 +14,6 @@ use smoltcp::iface::{Config, Interface, SocketSet};
use smoltcp::phy::Medium; use smoltcp::phy::Medium;
use smoltcp::time::Instant; use smoltcp::time::Instant;
use smoltcp::wire::{HardwareAddress, IpCidr}; use smoltcp::wire::{HardwareAddress, IpCidr};
use std::time::Duration;
use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio::select; use tokio::select;
use tokio::sync::mpsc::{channel, Receiver}; use tokio::sync::mpsc::{channel, Receiver};
@ -103,7 +102,6 @@ impl NetworkBackend {
} }
let link = link.unwrap(); let link = link.unwrap();
handle.link().set(link.header.index).up().execute().await?; handle.link().set(link.header.index).up().execute().await?;
tokio::time::sleep(Duration::from_secs(3)).await;
Ok(()) Ok(())
} }

View File

@ -189,10 +189,12 @@ impl IcmpClient {
let rx = self.add_handler(token.clone()).await?; let rx = self.add_handler(token.clone()).await?;
let echo = IcmpEchoHeader { id, seq }; let echo = IcmpEchoHeader { id, seq };
let header = Icmpv4Header::new(Icmpv4Type::EchoRequest(echo)); let mut header = Icmpv4Header::new(Icmpv4Type::EchoRequest(echo));
header.update_checksum(payload);
let mut buffer: Vec<u8> = Vec::new(); let mut buffer: Vec<u8> = Vec::new();
header.write(&mut buffer)?; header.write(&mut buffer)?;
buffer.extend_from_slice(payload); buffer.extend_from_slice(payload);
self.socket self.socket
.send_to(&buffer, SocketAddr::V4(SocketAddrV4::new(addr, 0))) .send_to(&buffer, SocketAddr::V4(SocketAddrV4::new(addr, 0)))
.await?; .await?;
@ -223,6 +225,7 @@ impl IcmpClient {
let mut buffer: Vec<u8> = Vec::new(); let mut buffer: Vec<u8> = Vec::new();
header.write(&mut buffer)?; header.write(&mut buffer)?;
buffer.extend_from_slice(payload); buffer.extend_from_slice(payload);
self.socket self.socket
.send_to(&buffer, SocketAddr::V6(SocketAddrV6::new(addr, 0, 0, 0))) .send_to(&buffer, SocketAddr::V6(SocketAddrV6::new(addr, 0, 0, 0)))
.await?; .await?;