#include "ipstack.h"
#include "arp.h"
#include "link.h"
+#include "ipv4.h" // For IPv4_Netmask
+#include "include/adapters_int.h" // for MAC addr
#define ARPv6 0
#define ARP_CACHE_SIZE 64
req.HWSize = 6;
req.SWSize = 4;
req.Request = htons(1);
- req.SourceMac = Interface->Adapter->MacAddr;
+ memcpy(&req.SourceMac, Interface->Adapter->HWAddr, 6); // TODO: Remove hard size
req.SourceIP = *(tIPv4*)Interface->Address;
req.DestMac = cMAC_BROADCAST;
req.DestIP = Address;
-
+
+ tIPStackBuffer *buffer = IPStack_Buffer_CreateBuffer(3); // Assumes only a header and footer at link layer
+ IPStack_Buffer_AppendSubBuffer(buffer, sizeof(struct sArpRequest4), 0, &req, NULL, NULL);
+
// Send Request
- Link_SendPacket(Interface->Adapter, 0x0806, req.DestMac, sizeof(struct sArpRequest4), &req);
+ Link_SendPacket(Interface->Adapter, 0x0806, req.DestMac, buffer);
+
+ IPStack_Buffer_DestroyBuffer(buffer);
timeout = now() + Interface->TimeoutDelay;
req4->DestIP = req4->SourceIP;
req4->DestMac = req4->SourceMac;
req4->SourceIP = *(tIPv4*)iface->Address;;
- req4->SourceMac = Adapter->MacAddr;
+ memcpy(&req4->SourceMac, Adapter->HWAddr, 6); // TODO: Remove hard size
req4->Request = htons(2);
Log_Debug("ARP", "Sending back us (%02x:%02x:%02x:%02x:%02x:%02x)",
req4->SourceMac.B[0], req4->SourceMac.B[1],
req4->SourceMac.B[2], req4->SourceMac.B[3],
req4->SourceMac.B[4], req4->SourceMac.B[5]);
- Link_SendPacket(Adapter, 0x0806, req4->DestMac, sizeof(tArpRequest4), req4);
+
+ // Assumes only a header and footer at link layer
+ tIPStackBuffer *buffer = IPStack_Buffer_CreateBuffer(3);
+ IPStack_Buffer_AppendSubBuffer(buffer, sizeof(struct sArpRequest4), 0, req4, NULL, NULL);
+ Link_SendPacket(Adapter, 0x0806, req4->DestMac, buffer);
+ IPStack_Buffer_DestroyBuffer(buffer);
}
break;
#if ARPv6