From 2a49f5a6be4fd478ae4249115ff2a3bf0e34d7e5 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sun, 11 Aug 2013 11:10:49 +0800 Subject: [PATCH] Modules/IPStack - Disabled ethernet checksum generation, silenced some logging --- KernelLand/Modules/IPStack/arp.c | 23 +++++++++-------- KernelLand/Modules/IPStack/ipv4.c | 9 ++++++- KernelLand/Modules/IPStack/link.c | 41 +++++++++++++++++-------------- KernelLand/Modules/IPStack/tcp.c | 30 +++++++++++++++------- 4 files changed, 65 insertions(+), 38 deletions(-) diff --git a/KernelLand/Modules/IPStack/arp.c b/KernelLand/Modules/IPStack/arp.c index 5ca128bf..2957eeea 100644 --- a/KernelLand/Modules/IPStack/arp.c +++ b/KernelLand/Modules/IPStack/arp.c @@ -221,17 +221,20 @@ void ARP_UpdateCache4(tIPv4 SWAddr, tMacAddr HWAddr) else i = oldest; } - - Log_Log("ARP4", "Caching %i.%i.%i.%i (%02x:%02x:%02x:%02x:%02x:%02x) in %i", - SWAddr.B[0], SWAddr.B[1], SWAddr.B[2], SWAddr.B[3], - HWAddr.B[0], HWAddr.B[1], HWAddr.B[2], HWAddr.B[3], HWAddr.B[4], HWAddr.B[5], - i - ); + + if( memcmp(&gaARP_Cache4[i].MAC, &HWAddr, sizeof(HWAddr)) != 0 ) + { + Log_Log("ARP4", "Caching %i.%i.%i.%i (%02x:%02x:%02x:%02x:%02x:%02x) in %i", + SWAddr.B[0], SWAddr.B[1], SWAddr.B[2], SWAddr.B[3], + HWAddr.B[0], HWAddr.B[1], HWAddr.B[2], HWAddr.B[3], HWAddr.B[4], HWAddr.B[5], + i + ); - gaARP_Cache4[i].IP = SWAddr; - gaARP_Cache4[i].MAC = HWAddr; - gaARP_Cache4[i].LastUpdate = now(); - Semaphore_Signal(&gARP_Cache4Semaphore, giARP_WaitingThreads); + gaARP_Cache4[i].IP = SWAddr; + gaARP_Cache4[i].MAC = HWAddr; + gaARP_Cache4[i].LastUpdate = now(); + Semaphore_Signal(&gARP_Cache4Semaphore, giARP_WaitingThreads); + } Mutex_Release(&glARP_Cache4); } diff --git a/KernelLand/Modules/IPStack/ipv4.c b/KernelLand/Modules/IPStack/ipv4.c index 36e2200b..a765400c 100644 --- a/KernelLand/Modules/IPStack/ipv4.c +++ b/KernelLand/Modules/IPStack/ipv4.c @@ -8,7 +8,9 @@ #include "ipv4.h" #include "firewall.h" +// === CONSTANTS === #define DEFAULT_TTL 32 +#define IPV4_TRACE 0 // set to 1 to enable packet tracing // === IMPORTS === extern tInterface *gIP_Interfaces; @@ -118,8 +120,10 @@ int IPv4_SendPacket(tInterface *Iface, tIPv4 Address, int Protocol, int ID, tIPS IPStack_Buffer_AppendSubBuffer(Buffer, sizeof(tIPv4Header), 0, &hdr, NULL, NULL); + #if IPV4_TRACE Log_Log("IPv4", "Sending packet to %i.%i.%i.%i", Address.B[0], Address.B[1], Address.B[2], Address.B[3]); + #endif Link_SendPacket(Iface->Adapter, IPV4_ETHERNET_ID, to, Buffer); return 1; } @@ -181,12 +185,15 @@ void IPv4_int_GetPacket(tAdapter *Adapter, tMacAddr From, int Length, void *Buff // TODO: Handle packet fragmentation + #if IPV4_TRACE 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] ); + #endif - // TODO: Tell ARP? + // TODO: Should ARP sniffing be used? + // - If we get a packet, cache the source MAC ARP_UpdateCache4(hdr->Source, From); // Get Data and Data Length diff --git a/KernelLand/Modules/IPStack/link.c b/KernelLand/Modules/IPStack/link.c index ee7ad12a..da593129 100644 --- a/KernelLand/Modules/IPStack/link.c +++ b/KernelLand/Modules/IPStack/link.c @@ -12,6 +12,8 @@ #include "include/adapters_int.h" // === CONSTANTS === +#define LINK_LOGPACKETS 0 +#define VALIDATE_CHECKSUM 0 #define MAX_PACKET_SIZE 2048 // === PROTOTYPES === @@ -84,7 +86,7 @@ void Link_SendPacket(tAdapter *Adapter, Uint16 Type, tMacAddr To, tIPStackBuffer int length = IPStack_Buffer_GetLength(Buffer); int ofs = (4 - (length & 3)) & 3; Uint8 buf[sizeof(tEthernetHeader) + ofs + 4]; - Uint32 *checksum = (void*)(buf + sizeof(tEthernetHeader) + ofs); + //Uint32 *checksum = (void*)(buf + sizeof(tEthernetHeader) + ofs); tEthernetHeader *hdr = (void*)buf; Log_Log("Net Link", "Sending %i bytes to %02x:%02x:%02x:%02x:%02x:%02x (Type 0x%x)", @@ -95,14 +97,14 @@ void Link_SendPacket(tAdapter *Adapter, Uint16 Type, tMacAddr To, tIPStackBuffer hdr->Type = htons(Type); memset(hdr+1, 0, ofs+4); // zero padding and checksum - if( (Adapter->Type->Flags & ADAPTERFLAG_OFFLOAD_MAC) ) + //if( (Adapter->Type->Flags & ADAPTERFLAG_OFFLOAD_MAC) ) IPStack_Buffer_AppendSubBuffer(Buffer, sizeof(tEthernetHeader), ofs, hdr, NULL, NULL); - else - { - IPStack_Buffer_AppendSubBuffer(Buffer, sizeof(tEthernetHeader), ofs + 4, hdr, NULL, NULL); - *checksum = htonl( Link_CalculateCRC(Buffer) ); - Log_Debug("Net Link", "Non-Offloaded: 0x%x, 0x%x", *checksum, ntohl(*checksum)); - } + //else + //{ + // IPStack_Buffer_AppendSubBuffer(Buffer, sizeof(tEthernetHeader), ofs + 4, hdr, NULL, NULL); + // *checksum = htonl( Link_CalculateCRC(Buffer) ); + // Log_Debug("Net Link", "Non-Offloaded: 0x%x, 0x%x", *checksum, ntohl(*checksum)); + //} Log_Log("Net Link", " from %02x:%02x:%02x:%02x:%02x:%02x", hdr->Src.B[0], hdr->Src.B[1], hdr->Src.B[2], @@ -125,7 +127,8 @@ int Link_HandlePacket(tAdapter *Adapter, tIPStackBuffer *Buffer) free(data); return 1; } - + + #if LINK_LOGPACKETS Log_Log("Net Link", "Packet from %02x:%02x:%02x:%02x:%02x:%02x" " to %02x:%02x:%02x:%02x:%02x:%02x (Type=%04x)", @@ -135,9 +138,14 @@ int Link_HandlePacket(tAdapter *Adapter, tIPStackBuffer *Buffer) hdr->Dest.B[3], hdr->Dest.B[4], hdr->Dest.B[5], ntohs(hdr->Type) ); -// Uint32 checksum = *(Uint32*)(data + len + 4); - //Log_Log("NET", "Checksum 0x%08x", checksum); + #endif + + #if VALIDATE_CHECKSUM + Uint32 checksum = *(Uint32*)(data + len + 4); + Log_Log("NET Link", "Checksum 0x%08x", checksum); + Uint32 calculated = Link_CalculateCRC(Buffer); // TODO: Check checksum + #endif // Check if there is a registered callback for this packet type int i; @@ -170,15 +178,12 @@ int Link_HandlePacket(tAdapter *Adapter, tIPStackBuffer *Buffer) #define QUOTIENT 0x04c11db7 void Link_InitCRC(void) { - int i, j; - Uint32 crc; - - for (i = 0; i < 256; i++) + for( int i = 0; i < 256; i++ ) { - crc = i << 24; - for (j = 0; j < 8; j++) + Uint32 crc = i << 24; + for( int j = 0; j < 8; j++ ) { - if (crc & 0x80000000) + if( crc >> 31 ) crc = (crc << 1) ^ QUOTIENT; else crc = crc << 1; diff --git a/KernelLand/Modules/IPStack/tcp.c b/KernelLand/Modules/IPStack/tcp.c index aa951689..8d954bc9 100644 --- a/KernelLand/Modules/IPStack/tcp.c +++ b/KernelLand/Modules/IPStack/tcp.c @@ -22,6 +22,8 @@ #define TCP_DACK_THRESHOLD 4096 #define TCP_DACK_TIMEOUT 500 +#define TCP_DEBUG 0 // Set to non-0 to enable TCP packet logging + // === PROTOTYPES === void TCP_Initialise(void); void TCP_StartConnection(tTCPConnection *Conn); @@ -30,7 +32,8 @@ void TCP_GetPacket(tInterface *Interface, void *Address, int Length, void *Buffe void TCP_INT_HandleConnectionPacket(tTCPConnection *Connection, tTCPHeader *Header, int Length); int TCP_INT_AppendRecieved(tTCPConnection *Connection, const void *Data, size_t Length); void TCP_INT_UpdateRecievedFromFuture(tTCPConnection *Connection); -void TCP_INT_SendACK(tTCPConnection *Connection); +void TCP_int_SendDelayedACK(void *ConnPtr); +void TCP_INT_SendACK(tTCPConnection *Connection, const char *Reason); Uint16 TCP_GetUnusedPort(); int TCP_AllocatePort(Uint16 Port); int TCP_DeallocatePort(Uint16 Port); @@ -164,6 +167,7 @@ void TCP_GetPacket(tInterface *Interface, void *Address, int Length, void *Buffe tTCPListener *srv; tTCPConnection *conn; + #if TCP_DEBUG Log_Log("TCP", "TCP_GetPacket: :%i from [%s]:%i, Flags = %s%s%s%s%s%s%s%s", ntohs(hdr->DestPort), IPStack_PrintAddress(Interface->Type, Address), @@ -177,6 +181,7 @@ void TCP_GetPacket(tInterface *Interface, void *Address, int Length, void *Buffe (hdr->Flags & TCP_FLAG_SYN) ? "SYN " : "", (hdr->Flags & TCP_FLAG_FIN) ? "FIN " : "" ); + #endif if( Length > (hdr->DataOffset >> 4)*4 ) { @@ -336,7 +341,7 @@ void TCP_INT_HandleConnectionPacket(tTCPConnection *Connection, tTCPHeader *Head if(Header->Flags & TCP_FLAG_SYN) { // TODO: What if the packet also has data? if( Connection->LastACKSequence != Connection->NextSequenceRcv ) - TCP_INT_SendACK(Connection); + TCP_INT_SendACK(Connection, "SYN"); Connection->NextSequenceRcv = ntohl(Header->SequenceNumber); Connection->LastACKSequence = Connection->NextSequenceRcv; } @@ -350,7 +355,9 @@ void TCP_INT_HandleConnectionPacket(tTCPConnection *Connection, tTCPHeader *Head // Get length of data dataLen = Length - (Header->DataOffset>>4)*4; LOG("dataLen = %i", dataLen); + #if TCP_DEBUG Log_Debug("TCP", "State %i, dataLen = %x", Connection->State, dataLen); + #endif // // State Machine @@ -426,7 +433,7 @@ void TCP_INT_HandleConnectionPacket(tTCPConnection *Connection, tTCPHeader *Head } Connection->NextSequenceRcv ++; // TODO: Is this right? (empty packet counts as one byte) Log_Log("TCP", "Empty Packet, inc and ACK the current sequence number"); - TCP_INT_SendACK(Connection); + TCP_INT_SendACK(Connection, "Empty"); #if 0 Header->DestPort = Header->SourcePort; Header->SourcePort = htons(Connection->LocalPort); @@ -477,14 +484,14 @@ void TCP_INT_HandleConnectionPacket(tTCPConnection *Connection, tTCPHeader *Head // - Only send an ACK if we've had a burst if( Connection->NextSequenceRcv > (Uint32)(TCP_DACK_THRESHOLD + Connection->LastACKSequence) ) { - TCP_INT_SendACK(Connection); + TCP_INT_SendACK(Connection, "DACK Burst"); // - Extend TCP deferred ACK timer Time_RemoveTimer(Connection->DeferredACKTimer); } // - Schedule the deferred ACK timer (if already scheduled, this is a NOP) Time_ScheduleTimer(Connection->DeferredACKTimer, TCP_DACK_TIMEOUT); #else - TCP_INT_SendACK(Connection); + TCP_INT_SendACK(Connection, "RX"); #endif } // Check if the packet is in window @@ -557,7 +564,7 @@ void TCP_INT_HandleConnectionPacket(tTCPConnection *Connection, tTCPHeader *Head Log_Log("TCP", "Fully out of sequence packet (0x%08x not between 0x%08x and 0x%08x), dropped", sequence_num, Connection->NextSequenceRcv, Connection->NextSequenceRcv+TCP_WINDOW_SIZE); // Spec says we should send an empty ACK with the current state - TCP_INT_SendACK(Connection); + TCP_INT_SendACK(Connection, "Bad Seq"); } break; @@ -797,7 +804,12 @@ void TCP_INT_UpdateRecievedFromFuture(tTCPConnection *Connection) #endif } -void TCP_INT_SendACK(tTCPConnection *Connection) +void TCP_int_SendDelayedACK(void *ConnPtr) +{ + TCP_INT_SendACK(ConnPtr, "DACK Timeout"); +} + +void TCP_INT_SendACK(tTCPConnection *Connection, const char *Reason) { tTCPHeader hdr; // ACK Packet @@ -810,7 +822,7 @@ void TCP_INT_SendACK(tTCPConnection *Connection) hdr.Flags = TCP_FLAG_ACK; // TODO: Determine if SYN is wanted too hdr.Checksum = 0; // TODO: Checksum hdr.UrgentPointer = 0; - Log_Debug("TCP", "Sending ACK for 0x%08x", Connection->NextSequenceRcv); + Log_Debug("TCP", "Sending ACK for 0x%08x (%s)", Connection->NextSequenceRcv, Reason); TCP_SendPacket( Connection, &hdr, 0, NULL ); //Connection->NextSequenceSend ++; Connection->LastACKSequence = Connection->NextSequenceRcv; @@ -1090,7 +1102,7 @@ tVFS_Node *TCP_Client_Init(tInterface *Interface) conn->FuturePacketValidBytes = conn->FuturePacketData + TCP_WINDOW_SIZE; #endif - conn->DeferredACKTimer = Time_AllocateTimer( (void(*)(void*)) TCP_INT_SendACK, conn); + conn->DeferredACKTimer = Time_AllocateTimer( TCP_int_SendDelayedACK, conn); SHORTLOCK(&glTCP_OutbountCons); conn->Next = gTCP_OutbountCons; -- 2.20.1