Add small fix after testing with ping.
This commit is contained in:
+4
-4
@@ -1,8 +1,8 @@
|
||||
use std::result;
|
||||
use std::fmt;
|
||||
use syscall::error::Error as SyscallError;
|
||||
use std::io::Error as IOError;
|
||||
use std::convert;
|
||||
use std::fmt;
|
||||
use std::io::Error as IOError;
|
||||
use std::result;
|
||||
use syscall::error::Error as SyscallError;
|
||||
|
||||
pub enum PacketError {
|
||||
NotEnoughData,
|
||||
|
||||
+4
-3
@@ -18,6 +18,10 @@ mod scheme;
|
||||
fn run() -> Result<()> {
|
||||
use syscall::flag::*;
|
||||
|
||||
if unsafe { syscall::clone(0).unwrap() } != 0 {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let icmp_fd = syscall::open("ip:1", O_RDWR | O_NONBLOCK)
|
||||
.map_err(|e| Error::from_syscall_error(e, "failed to open ip:1"))? as
|
||||
RawFd;
|
||||
@@ -26,9 +30,6 @@ fn run() -> Result<()> {
|
||||
.map_err(|e| Error::from_syscall_error(e, "failed to open :icmp"))? as
|
||||
RawFd;
|
||||
|
||||
if unsafe { syscall::clone(0).unwrap() } != 0 {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let icmpd = Rc::new(RefCell::new(Icmpd::new(unsafe { File::from_raw_fd(icmp_fd) },
|
||||
unsafe { File::from_raw_fd(scheme_fd) })));
|
||||
|
||||
+3
-8
@@ -13,7 +13,7 @@ pub struct Header {
|
||||
#[repr(packed)]
|
||||
pub struct EchoHeader {
|
||||
id: u16,
|
||||
seq: u16,
|
||||
//Seq is set by the caller
|
||||
}
|
||||
|
||||
pub enum SubHeader<'a> {
|
||||
@@ -43,20 +43,15 @@ pub enum PacketKind {
|
||||
}
|
||||
|
||||
impl EchoHeader {
|
||||
pub fn new(id: u16, seq: u16) -> EchoHeader {
|
||||
pub fn new(id: u16) -> EchoHeader {
|
||||
EchoHeader {
|
||||
id: id.to_be(),
|
||||
seq: seq.to_be(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_id(&self) -> u16 {
|
||||
u16::from_be(self.id)
|
||||
}
|
||||
|
||||
pub fn get_seq(&self) -> u16 {
|
||||
u16::from_be(self.seq)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> SubHeader<'a> {
|
||||
@@ -193,7 +188,7 @@ impl<'a> MutPacket<'a> {
|
||||
pub fn compute_checksum(&mut self) {
|
||||
self.header.crc = 0;
|
||||
let header_ptr = self.header as *mut Header as usize;
|
||||
let total_size = mem::size_of::<Header>() + self.payload.len();
|
||||
let total_size = Self::get_total_header_size(&self.subheader) + self.payload.len();
|
||||
let crc = Checksum::compile(unsafe { Checksum::sum(header_ptr, total_size) });
|
||||
self.header.crc = crc
|
||||
}
|
||||
|
||||
+15
-18
@@ -1,7 +1,7 @@
|
||||
use error::{Result, Error, PacketError};
|
||||
use netutils::{Ipv4, Ipv4Header, Checksum, n16};
|
||||
use netutils;
|
||||
use packet::{Header, Packet, MutPacket, PacketKind, SubHeader, EchoHeader};
|
||||
use packet::{Packet, MutPacket, PacketKind, SubHeader, EchoHeader};
|
||||
use std::collections::{BTreeMap, HashSet, VecDeque};
|
||||
use std::fs::File;
|
||||
use std::io::{Read, Write};
|
||||
@@ -24,7 +24,6 @@ struct Handle {
|
||||
flags: usize,
|
||||
ip_addr: Ipv4Addr,
|
||||
payload_queue: VecDeque<Vec<u8>>,
|
||||
seq: u16,
|
||||
}
|
||||
|
||||
impl Handle {
|
||||
@@ -35,7 +34,6 @@ impl Handle {
|
||||
ip_addr,
|
||||
payload_queue: VecDeque::new(),
|
||||
flags,
|
||||
seq: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -66,6 +64,7 @@ impl Icmpd {
|
||||
break;
|
||||
}
|
||||
self.handle(&mut packet);
|
||||
self.scheme_file.write(&packet)?;
|
||||
}
|
||||
Ok(None)
|
||||
}
|
||||
@@ -108,19 +107,22 @@ impl Icmpd {
|
||||
}
|
||||
|
||||
fn on_echo_response(&mut self, ip_packet: &Ipv4, icmp_packet: &Packet) -> Result<()> {
|
||||
if let Some(fd_set) = self.echo_ips
|
||||
.get_mut(&Ipv4Addr::from(ip_packet.header.src.bytes)) {
|
||||
for fd in fd_set.iter() {
|
||||
if let Some(handle) = self.handles.get_mut(fd) {
|
||||
if let &SubHeader::Echo(echo_subheader) = icmp_packet.get_subheader() {
|
||||
if let &SubHeader::Echo(echo_subheader) = icmp_packet.get_subheader() {
|
||||
if let Some(fd_set) = self.echo_ips
|
||||
.get_mut(&Ipv4Addr::from(ip_packet.header.src.bytes)) {
|
||||
for fd in fd_set.iter() {
|
||||
if let Some(handle) = self.handles.get_mut(fd) {
|
||||
if echo_subheader.get_id() == *fd as u16 {
|
||||
handle
|
||||
.payload_queue
|
||||
.push_back(Vec::from(icmp_packet.get_payload()));
|
||||
post_fevent(&mut self.scheme_file,
|
||||
*fd,
|
||||
syscall::EVENT_READ,
|
||||
icmp_packet.get_payload().len())?;
|
||||
|
||||
if handle.events & syscall::EVENT_READ == syscall::EVENT_READ {
|
||||
post_fevent(&mut self.scheme_file,
|
||||
*fd,
|
||||
syscall::EVENT_READ,
|
||||
icmp_packet.get_payload().len())?;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -161,10 +163,6 @@ impl SchemeMut for Icmpd {
|
||||
use std::str;
|
||||
use std::str::FromStr;
|
||||
|
||||
// if uid != 0 {
|
||||
// return Err(syscall::Error::new(syscall::EACCES));
|
||||
// }
|
||||
|
||||
let path = str::from_utf8(url)
|
||||
.or(Err(syscall::Error::new(syscall::EINVAL)))?;
|
||||
let mut parts = path.split("/");
|
||||
@@ -216,10 +214,9 @@ impl SchemeMut for Icmpd {
|
||||
let echo_request =
|
||||
produce_icmp_packet(handle.ip_addr,
|
||||
PacketKind::EchoRequest,
|
||||
&SubHeader::Echo(&EchoHeader::new(fd as u16, handle.seq)),
|
||||
&SubHeader::Echo(&EchoHeader::new(fd as u16)),
|
||||
buf)
|
||||
.map_err(|_| syscall::Error::new(syscall::EPROTO))?;
|
||||
handle.seq += 1;
|
||||
self.icmp_file
|
||||
.write(&echo_request)
|
||||
.map_err(|_| syscall::Error::new(syscall::EPROTO))
|
||||
|
||||
Reference in New Issue
Block a user