Inhereit DHCPClient from UDPClient + remove static Client + Add more tests

This commit is contained in:
valentinbreiz 2021-01-21 18:31:10 +01:00
parent 854264457e
commit c01d4b9f6a
4 changed files with 37 additions and 55 deletions

View file

@ -1,4 +1,5 @@
using Cosmos.HAL;
using Cosmos.System.Network;
using Cosmos.System.Network.ARP;
using Cosmos.System.Network.Config;
using Cosmos.System.Network.IPv4;
@ -21,9 +22,31 @@ namespace NetworkTest
protected override void Run()
{
/**
* Since DNS and DHCP are inherited and will call parent classes at creation. UDP, IP and EthernetFrame don't need tests
**/
/** Ethernet Packet Parsing Test **/
byte[] ethernetPacketData = new byte[]
{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0C, 0x29, 0xD5, 0xDB, 0x9D, 0x08, 0x00
};
EthernetPacket ethernetPacket = new EthernetPacket(ethernetPacketData);
Equals(ethernetPacketData, ethernetPacket.RawData);
/** IP Packet Parsing Test **/
byte[] ipPacketData = new byte[]
{
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x0C, 0x29, 0xD5, 0xDB, 0x9D, 0x08, 0x00, 0x45, 0x00, 0x01, 0x16, 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0x39,
0xD8, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF
};
IPPacket ipPacket = new IPPacket(ipPacketData);
Equals(ipPacketData, ipPacket.RawData);
/** UDP Packet Parsing Test **/
byte[] udpPacketData = new byte[]
{
0x98, 0xFA, 0x9B, 0xD4, 0xEB, 0x29, 0xD8, 0xCE, 0x3A, 0x89, 0x3E, 0xD9, 0x08, 0x00, 0x45, 0x00, 0x00, 0x22, 0x0C, 0x74, 0x40, 0x00, 0x40, 0x11, 0xAA,
0xBE, 0xC0, 0xA8, 0x01, 0x02, 0xC0, 0xA8, 0x01, 0x46, 0x10, 0x92, 0x10, 0x92, 0x00, 0x0E, 0x37, 0x22, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x21
};
UDPPacket udpPacket = new UDPPacket(udpPacketData);
Equals(udpPacketData, udpPacket.RawData);
/** DNS Packet Parsing Test **/
byte[] dnsPacketData = new byte[]
@ -35,15 +58,6 @@ namespace NetworkTest
DNSPacket dnsPacket = new DNSPacket(dnsPacketData);
Equals(dnsPacketData, dnsPacket.RawData);
/** UDP Packet Parsing Test **/
byte[] udpPacketData = new byte[]
{
0x98, 0xFA, 0x9B, 0xD4, 0xEB, 0x29, 0xD8, 0xCE, 0x3A, 0x89, 0x3E, 0xD9, 0x08, 0x00, 0x45, 0x00, 0x00, 0x22, 0x0C, 0x74, 0x40, 0x00, 0x40, 0x11, 0xAA,
0xBE, 0xC0, 0xA8, 0x01, 0x02, 0xC0, 0xA8, 0x01, 0x46, 0x10, 0x92, 0x10, 0x92, 0x00, 0x0E, 0x37, 0x22, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x21
};
UDPPacket udpPacket = new UDPPacket(udpPacketData);
Equals(udpPacketData, udpPacket.RawData);
/** DHCP Packet Parsing Test **/
byte[] dhcpPacketData = new byte[]
{

View file

@ -36,7 +36,7 @@ namespace Cosmos.System.Network
/// Create new instance of the <see cref="EthernetPacket"/> class, with specified raw data.
/// </summary>
/// <param name="rawData">Raw data.</param>
protected EthernetPacket(byte[] rawData)
public EthernetPacket(byte[] rawData)
{
RawData = rawData;
InitFields();

View file

@ -16,18 +16,8 @@ namespace Cosmos.System.Network.IPv4.UDP.DHCP
/// <summary>
/// DHCPClient class. Used to manage the DHCP connection to a server.
/// </summary>
public class DHCPClient
public class DHCPClient : UdpClient
{
/// <summary>
/// Current DHCPClient
/// </summary>
public static DHCPClient currentClient;
// <summary>
/// RX buffer queue.
/// </summary>
protected Queue<DHCPPacket> rxBuffer;
// <summary>
/// Is DHCP ascked check variable
/// </summary>
@ -43,34 +33,12 @@ namespace Cosmos.System.Network.IPv4.UDP.DHCP
}
/// <summary>
/// Create new instance of the <see cref="UdpClient"/> class.
/// Create new instance of the <see cref="DHCPClient"/> class.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown on fatal error (contact support).</exception>
/// <exception cref="ArgumentException">Thrown if UdpClient with localPort 0 exists.</exception>
public DHCPClient()
/// <exception cref="ArgumentException">Thrown if UdpClient with localPort 53 exists.</exception>
public DHCPClient() : base(68)
{
rxBuffer = new Queue<DHCPPacket>(8);
currentClient = this;
}
/// <summary>
/// Close connection.
/// </summary>
/// <exception cref="ArgumentOutOfRangeException">Thrown on fatal error (contact support).</exception>
public void Close()
{
currentClient = null;
}
/// <summary>
/// Receive data from packet.
/// </summary>
/// <param name="packet">Packet to receive.</param>
/// <exception cref="OverflowException">Thrown on fatal error (contact support).</exception>
/// <exception cref="Sys.IO.IOException">Thrown on IO error.</exception>
internal void ReceiveData(DHCPPacket packet)
{
rxBuffer.Enqueue(packet);
}
/// <summary>
@ -90,14 +58,14 @@ namespace Cosmos.System.Network.IPv4.UDP.DHCP
{
return -1;
}
if (_deltaT != Cosmos.HAL.RTC.Second)
if (_deltaT != RTC.Second)
{
second++;
_deltaT = Cosmos.HAL.RTC.Second;
_deltaT = RTC.Second;
}
}
var packet = rxBuffer.Dequeue();
var packet = new DHCPPacket(rxBuffer.Dequeue().RawData);
if (packet.MessageType == 2) //Boot Reply
{
@ -107,7 +75,7 @@ namespace Cosmos.System.Network.IPv4.UDP.DHCP
}
else if (packet.RawData[284] == 0x05 || packet.RawData[284] == 0x06) //ACK or NAK DHCP packet received
{
DHCPAck ack = new DHCPAck(packet.RawData);
var ack = new DHCPAck(packet.RawData);
if (asked)
{
Apply(ack, true);

View file

@ -51,9 +51,9 @@ namespace Cosmos.System.Network.IPv4.UDP.DHCP
/// <exception cref="sysIO.IOException">Thrown on IO error.</exception>
public static void DHCPHandler(byte[] packetData)
{
DHCPPacket dhcp_packet = new DHCPPacket(packetData);
var dhcp_packet = new DHCPPacket(packetData);
DHCPClient receiver = DHCPClient.currentClient;
var receiver = UdpClient.GetClient(dhcp_packet.DestinationPort);
if (receiver != null)
{
receiver.ReceiveData(dhcp_packet);