From 4a6768100fb6328a1b88eed5372eaeb4c162399d Mon Sep 17 00:00:00 2001 From: John Hodge Date: Fri, 18 May 2012 17:23:35 +0800 Subject: [PATCH] IPStack - Added quirk for unconfigured interfaces to aid DHCP --- KernelLand/Modules/IPStack/icmp.c | 2 +- KernelLand/Modules/IPStack/interface.c | 4 +-- KernelLand/Modules/IPStack/ipv4.c | 35 +++++++++++++++++++++++--- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/KernelLand/Modules/IPStack/icmp.c b/KernelLand/Modules/IPStack/icmp.c index 80974ef1..66f0f96a 100644 --- a/KernelLand/Modules/IPStack/icmp.c +++ b/KernelLand/Modules/IPStack/icmp.c @@ -133,7 +133,7 @@ int ICMP_Ping(tInterface *Interface, tIPv4 Addr) end = ts + Interface->TimeoutDelay; while( !gICMP_PingSlots[i].bArrived && now() < end) Threads_Yield(); - if(now() >= end) + if( !gICMP_PingSlots[i].bArrived ) return -1; return (int)( now() - ts ); diff --git a/KernelLand/Modules/IPStack/interface.c b/KernelLand/Modules/IPStack/interface.c index a5129a72..9bd00d92 100644 --- a/KernelLand/Modules/IPStack/interface.c +++ b/KernelLand/Modules/IPStack/interface.c @@ -10,8 +10,8 @@ #include "include/adapters.h" // === CONSTANTS === -//! Default timeout value, 30 seconds -#define DEFAULT_TIMEOUT (30*1000) +//! Default timeout value, 5 seconds +#define DEFAULT_TIMEOUT (5*1000) // === IMPORTS === extern int IPv4_Ping(tInterface *Iface, tIPv4 Addr); diff --git a/KernelLand/Modules/IPStack/ipv4.c b/KernelLand/Modules/IPStack/ipv4.c index 3162301c..36e2200b 100644 --- a/KernelLand/Modules/IPStack/ipv4.c +++ b/KernelLand/Modules/IPStack/ipv4.c @@ -181,7 +181,6 @@ void IPv4_int_GetPacket(tAdapter *Adapter, tMacAddr From, int Length, void *Buff // TODO: Handle packet fragmentation - Log_Debug("IPv4", " From %i.%i.%i.%i to %i.%i.%i.%i", hdr->Source.B[0], hdr->Source.B[1], hdr->Source.B[2], hdr->Source.B[3], hdr->Destination.B[0], hdr->Destination.B[1], hdr->Destination.B[2], hdr->Destination.B[3] @@ -234,9 +233,12 @@ void IPv4_int_GetPacket(tAdapter *Adapter, tMacAddr From, int Length, void *Buff // Routing if(!iface) { + #if 0 tMacAddr to; tRoute *rt; - + + + // TODO: Put this in another thread to avoid delays in the RX thread Log_Debug("IPv4", "Route the packet"); // Drop the packet if the TTL is zero if( hdr->TTL == 0 ) { @@ -261,6 +263,7 @@ void IPv4_int_GetPacket(tAdapter *Adapter, tMacAddr From, int Length, void *Buff ((tIPv4*)rt->NextHop)->B[2], ((tIPv4*)rt->NextHop)->B[3]); Log_Warning("IPv4", "TODO: Implement forwarding with tIPStackBuffer"); // Link_SendPacket(rt->Interface->Adapter, IPV4_ETHERNET_ID, to, Length, Buffer); + #endif return ; } @@ -283,7 +286,7 @@ void IPv4_int_GetPacket(tAdapter *Adapter, tMacAddr From, int Length, void *Buff */ tInterface *IPv4_GetInterface(tAdapter *Adapter, tIPv4 Address, int Broadcast) { - tInterface *iface = NULL; + tInterface *iface = NULL, *zero_iface = NULL; Uint32 netmask; Uint32 addr, this; @@ -301,7 +304,20 @@ tInterface *IPv4_GetInterface(tAdapter *Adapter, tIPv4 Address, int Broadcast) LEAVE('p', iface); return iface; } - + + LOG("iface->Address = 0x%x", *(Uint32*)iface->Address); + + if( *(Uint32*)iface->Address == 0 ) { + if( zero_iface ) { + Log_Notice("IPv4", "Multiple 0.0.0.0 interfaces on the same adapter, ignoring"); + } + else { + zero_iface = iface; + LOG("Zero IF %p", iface); + } + continue ; + } + if( !Broadcast ) continue; // Check for broadcast @@ -316,6 +332,17 @@ tInterface *IPv4_GetInterface(tAdapter *Adapter, tIPv4 Address, int Broadcast) return iface; } } + + // Special case for intefaces that are being DHCP configured + // - If the interface address is 0.0.0.0, then if there is no match for the + // destination the packet is treated as if it was addressed to 0.0.0.0 + if( zero_iface && Broadcast ) + { + LOG("Using 0.0.0.0 interface with magic!"); + LEAVE('p', zero_iface); + return zero_iface; + } + LEAVE('n'); return NULL; } -- 2.20.1