Add small fix after testing with ping.

This commit is contained in:
Egor Karavaev
2017-06-12 19:59:25 +03:00
parent 47563fa29e
commit ce69cdbb8f
4 changed files with 26 additions and 33 deletions
+4 -4
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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))