From ce69cdbb8fe0340d09e5c09072c29e93130e1728 Mon Sep 17 00:00:00 2001 From: Egor Karavaev Date: Mon, 12 Jun 2017 19:59:25 +0300 Subject: [PATCH] Add small fix after testing with ping. --- src/icmpd/error.rs | 8 ++++---- src/icmpd/main.rs | 7 ++++--- src/icmpd/packet.rs | 11 +++-------- src/icmpd/scheme.rs | 33 +++++++++++++++------------------ 4 files changed, 26 insertions(+), 33 deletions(-) diff --git a/src/icmpd/error.rs b/src/icmpd/error.rs index ae8007e961..8c94e2af8c 100644 --- a/src/icmpd/error.rs +++ b/src/icmpd/error.rs @@ -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, diff --git a/src/icmpd/main.rs b/src/icmpd/main.rs index f44089e1f5..4284ae5d87 100644 --- a/src/icmpd/main.rs +++ b/src/icmpd/main.rs @@ -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) }))); diff --git a/src/icmpd/packet.rs b/src/icmpd/packet.rs index fea7e9cfca..ade4f6e4a0 100644 --- a/src/icmpd/packet.rs +++ b/src/icmpd/packet.rs @@ -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::
() + 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 } diff --git a/src/icmpd/scheme.rs b/src/icmpd/scheme.rs index e943f31a7d..1360ea345e 100644 --- a/src/icmpd/scheme.rs +++ b/src/icmpd/scheme.rs @@ -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>, - 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))