void Link_SendPacket(tAdapter *Adapter, Uint16 Type, tMacAddr To, tIPStackBuffer *Buffer)
{
int length = IPStack_Buffer_GetLength(Buffer);
- int ofs = 4 - (length & 3);
+ int ofs = (4 - (length & 3)) & 3;
Uint8 buf[sizeof(tEthernetHeader) + ofs + 4];
+ Uint32 *checksum = (void*)(buf + sizeof(tEthernetHeader) + ofs);
tEthernetHeader *hdr = (void*)buf;
- if( ofs == 4 ) ofs = 0;
-
Log_Log("Net Link", "Sending %i bytes to %02x:%02x:%02x:%02x:%02x:%02x (Type 0x%x)",
length, To.B[0], To.B[1], To.B[2], To.B[3], To.B[4], To.B[5], Type);
hdr->Dest = To;
memcpy(&hdr->Src, Adapter->HWAddr, 6); // TODO: Remove hard coded 6
hdr->Type = htons(Type);
- *(Uint32*)(buf + sizeof(tEthernetHeader) + ofs) = 0;
+ memset(hdr, 0, ofs+4); // zero padding and checksum
- IPStack_Buffer_AppendSubBuffer(Buffer, sizeof(tEthernetHeader), ofs + 4, hdr, NULL, NULL);
-
- *(Uint32*)(buf + sizeof(tEthernetHeader) + ofs) = htonl( Link_CalculateCRC(Buffer) );
+ 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));
+ }
Log_Log("Net Link", " from %02x:%02x:%02x:%02x:%02x:%02x",
hdr->Src.B[0], hdr->Src.B[1], hdr->Src.B[2],
void *data = IPStack_Buffer_CompactBuffer(Buffer, &len);
tEthernetHeader *hdr = (void*)data;
- int i;
- Uint32 checksum;
if(len < sizeof(tEthernetHeader)) {
Log_Log("Net Link", "Recieved an undersized packet (%i < %i)",
hdr->Dest.B[3], hdr->Dest.B[4], hdr->Dest.B[5],
ntohs(hdr->Type)
);
- checksum = *(Uint32*)&hdr->Data[len-sizeof(tEthernetHeader)-4];
+// Uint32 checksum = *(Uint32*)(data + len + 4);
//Log_Log("NET", "Checksum 0x%08x", checksum);
// TODO: Check checksum
// Check if there is a registered callback for this packet type
+ int i;
for( i = giRegisteredTypes; i--; )
{
if(gaRegisteredTypes[i].Type == ntohs(hdr->Type)) break;