Fix loopback
This commit is contained in:
parent
5bdcb832c0
commit
6b02a20028
|
@ -37,6 +37,10 @@ impl Interface for EthernetInterface {
|
||||||
self.ip
|
self.ip
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn routable(&self, dst: Ipv4Addr) -> bool {
|
||||||
|
dst != Ipv4Addr::LOOPBACK
|
||||||
|
}
|
||||||
|
|
||||||
fn arp_event(&mut self) -> Result<()> {
|
fn arp_event(&mut self) -> Result<()> {
|
||||||
loop {
|
loop {
|
||||||
let mut bytes = [0; 65536];
|
let mut bytes = [0; 65536];
|
||||||
|
|
|
@ -4,14 +4,12 @@ use std::io::Result;
|
||||||
use interface::Interface;
|
use interface::Interface;
|
||||||
|
|
||||||
pub struct LoopbackInterface {
|
pub struct LoopbackInterface {
|
||||||
ip: Ipv4Addr,
|
|
||||||
packets: Vec<Ipv4>
|
packets: Vec<Ipv4>
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LoopbackInterface {
|
impl LoopbackInterface {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
LoopbackInterface {
|
LoopbackInterface {
|
||||||
ip: Ipv4Addr::LOOPBACK,
|
|
||||||
packets: Vec::new()
|
packets: Vec::new()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +17,11 @@ impl LoopbackInterface {
|
||||||
|
|
||||||
impl Interface for LoopbackInterface {
|
impl Interface for LoopbackInterface {
|
||||||
fn ip(&self) -> Ipv4Addr {
|
fn ip(&self) -> Ipv4Addr {
|
||||||
self.ip
|
Ipv4Addr::LOOPBACK
|
||||||
|
}
|
||||||
|
|
||||||
|
fn routable(&self, dst: Ipv4Addr) -> bool {
|
||||||
|
dst == Ipv4Addr::LOOPBACK
|
||||||
}
|
}
|
||||||
|
|
||||||
fn recv(&mut self) -> Result<Vec<Ipv4>> {
|
fn recv(&mut self) -> Result<Vec<Ipv4>> {
|
||||||
|
|
|
@ -9,6 +9,7 @@ mod loopback;
|
||||||
|
|
||||||
pub trait Interface {
|
pub trait Interface {
|
||||||
fn ip(&self) -> Ipv4Addr;
|
fn ip(&self) -> Ipv4Addr;
|
||||||
|
fn routable(&self, dst: Ipv4Addr) -> bool;
|
||||||
fn recv(&mut self) -> Result<Vec<Ipv4>>;
|
fn recv(&mut self) -> Result<Vec<Ipv4>>;
|
||||||
fn send(&mut self, ip: Ipv4) -> Result<usize>;
|
fn send(&mut self, ip: Ipv4) -> Result<usize>;
|
||||||
|
|
||||||
|
|
|
@ -194,7 +194,7 @@ impl SchemeMut for Ipd {
|
||||||
if let Some(mut ip) = Ipv4::from_bytes(buf) {
|
if let Some(mut ip) = Ipv4::from_bytes(buf) {
|
||||||
for mut interface in self.interfaces.iter_mut() {
|
for mut interface in self.interfaces.iter_mut() {
|
||||||
let if_ip = interface.ip();
|
let if_ip = interface.ip();
|
||||||
if ip.header.src == if_ip || ip.header.src == Ipv4Addr::NULL {
|
if ip.header.src == if_ip || (ip.header.src == Ipv4Addr::NULL && interface.routable(ip.header.dst)) {
|
||||||
ip.header.src = if_ip;
|
ip.header.src = if_ip;
|
||||||
ip.header.proto = handle.proto;
|
ip.header.proto = handle.proto;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue