diff --git a/tests/Makefile b/tests/Makefile index d14a906..66d407a 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -32,5 +32,14 @@ $(TARGET): $(OBJS) @echo " LINK $@" $(Q)$(CXX) $(CFLAGS) -o $(TARGET) $(OBJS) +generate-inputs: $(SRCOBJS) generate-inputs.o + @echo " LINK $@" + $(Q)$(CXX) $(CFLAGS) -o generate-inputs $(SRCOBJS) generate-inputs.o + ./generate-inputs + +afl: $(SRCOBJS) afl.o + @echo " LINK $@" + $(Q)afl-clang++ $(CFLAGS) -o afl $(SRCOBJS) afl.o + clean: - $(Q)$(RM) $(SRCDIR)/*.o $(TESTDIR)/*.o $(SRCDIR)/*.d $(TESTDIR)/*.d $(TARGET) kernel + $(Q)$(RM) $(SRCDIR)/*.o $(TESTDIR)/*.o $(SRCDIR)/*.d $(TESTDIR)/*.d $(TARGET) kernel test afl generate-inputs *.profraw *.profdata diff --git a/tests/afl.cpp b/tests/afl.cpp new file mode 100644 index 0000000..1d70b85 --- /dev/null +++ b/tests/afl.cpp @@ -0,0 +1,49 @@ +#include +#include +#include +#include + +#include +#include + +static uint8_t uspiBuffer[USPI_FRAME_BUFFER_SIZE]; +static size_t uspiBufferLength; + +extern "C" int USPiEthernetAvailable(void) +{ + return 1; +} + +extern "C" int USPiReceiveFrame(void* pBuffer, unsigned* pResultLength) +{ + memcpy(pBuffer, uspiBuffer, uspiBufferLength); + *pResultLength = uspiBufferLength; + return 1; +} + +extern "C" int USPiSendFrame(const void* pBuffer, unsigned nLength) +{ + assert(nLength <= USPI_FRAME_BUFFER_SIZE); + memcpy(uspiBuffer, pBuffer, nLength); + uspiBufferLength = nLength; + return nLength; +} + +extern "C" void USPiGetMACAddress(unsigned char Buffer[6]) +{ + for (size_t i = 0; i < 6; i++) + Buffer[i] = i << 4; +} + +extern "C" void MsDelay(unsigned) {} + +#include + +int main(int, char**) +{ + fread(uspiBuffer, 1, sizeof(uspiBuffer), stdin); + Net::Ethernet::Header ethernetHeader; + Net::Arp::HandlePacket(ethernetHeader, uspiBuffer, sizeof(uspiBuffer)); + + return 0; +} diff --git a/tests/generate-packets.cpp b/tests/generate-packets.cpp new file mode 100644 index 0000000..ef06da9 --- /dev/null +++ b/tests/generate-packets.cpp @@ -0,0 +1,41 @@ +#include +#include +#include +#include + +#include +#include + +using namespace Net; + +extern "C" int USPiSendFrame(const void* pBuffer, unsigned nLength) +{ + return std::min(nLength, static_cast(USPI_FRAME_BUFFER_SIZE)); +} + +extern "C" void USPiGetMACAddress(unsigned char Buffer[6]) {} + +static void generateNetArpPacketValid() +{ + std::array buffer; + std::ofstream stream("inputs/net-arp-packet-valid.bin"); + const Utils::MacAddress sourceMac{10, 11, 12, 13, 14, 15}; + const Utils::MacAddress destMac{20, 21, 22, 23, 24, 25}; + + Arp::Packet packet(Arp::Operation::ARP_OPERATION_REQUEST); + packet.senderMac = sourceMac; + packet.senderIp = Utils::Ipv4Address; + packet.targetMac = destMac; + packet.targetIp = Utils::Ipv4Address; + packet.Serialize(buffer.data(), buffer.size()); + stream.write(reinterpret_cast(buffer.data()), buffer.size()); + + std::cerr << "Generated Net::Arp::Packet (valid)" << std::endl; +} + +int main(int, char**) +{ + Utils::Ipv4Address = 0xC0FFEEEE; + generateNetArpPacketValid(); + return 0; +} diff --git a/tests/net-arp.cpp b/tests/net-arp.cpp index 39d5e83..e2d6718 100644 --- a/tests/net-arp.cpp +++ b/tests/net-arp.cpp @@ -160,3 +160,23 @@ void TestNetArpHandlePacketInvalid() TEST_CHECK(buffer == bufferRef); } } + +void TestNetArpHandlePacketRequest() +{ + Ethernet::Header ethernetHeader; + + std::array buffer; + Arp::Packet reference(Arp::ARP_OPERATION_REQUEST); + reference.targetIp = Utils::Ipv4Address; + + { + auto packet = reference; + const auto size = packet.Serialize(buffer.data(), buffer.size()); + const auto bufferRef = buffer; + + Arp::HandlePacket(ethernetHeader, buffer.data(), size); + + // Check if we've got a proper response + TEST_CHECK(buffer != bufferRef); + } +} diff --git a/tests/net-arp.h b/tests/net-arp.h index 0d02595..e595e1b 100644 --- a/tests/net-arp.h +++ b/tests/net-arp.h @@ -6,3 +6,4 @@ void TestNetArpSendRequest(); void TestNetArpSendReply(); void TestNetArpSendAnnouncement(); void TestNetArpHandlePacketInvalid(); +void TestNetArpHandlePacketRequest(); diff --git a/tests/test.cpp b/tests/test.cpp index e348239..103632b 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -37,5 +37,6 @@ TEST_LIST = { {"Net::Arp::SendReply", TestNetArpSendReply}, {"Net::Arp::SendAnnouncement", TestNetArpSendAnnouncement}, {"Net::Arp::HandlePacket Invalid", TestNetArpHandlePacketInvalid}, + {"Net::Arp::HandlePacket Request", TestNetArpHandlePacketRequest}, {nullptr, nullptr}, };