mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-24 12:35:31 +00:00
Inhereit DHCPClient from UDPClient + remove static Client + Add more tests
This commit is contained in:
parent
854264457e
commit
c01d4b9f6a
4 changed files with 37 additions and 55 deletions
|
|
@ -1,4 +1,5 @@
|
||||||
using Cosmos.HAL;
|
using Cosmos.HAL;
|
||||||
|
using Cosmos.System.Network;
|
||||||
using Cosmos.System.Network.ARP;
|
using Cosmos.System.Network.ARP;
|
||||||
using Cosmos.System.Network.Config;
|
using Cosmos.System.Network.Config;
|
||||||
using Cosmos.System.Network.IPv4;
|
using Cosmos.System.Network.IPv4;
|
||||||
|
|
@ -21,9 +22,31 @@ namespace NetworkTest
|
||||||
|
|
||||||
protected override void Run()
|
protected override void Run()
|
||||||
{
|
{
|
||||||
/**
|
/** Ethernet Packet Parsing Test **/
|
||||||
* Since DNS and DHCP are inherited and will call parent classes at creation. UDP, IP and EthernetFrame don't need tests
|
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 **/
|
/** DNS Packet Parsing Test **/
|
||||||
byte[] dnsPacketData = new byte[]
|
byte[] dnsPacketData = new byte[]
|
||||||
|
|
@ -35,15 +58,6 @@ namespace NetworkTest
|
||||||
DNSPacket dnsPacket = new DNSPacket(dnsPacketData);
|
DNSPacket dnsPacket = new DNSPacket(dnsPacketData);
|
||||||
Equals(dnsPacketData, dnsPacket.RawData);
|
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 **/
|
/** DHCP Packet Parsing Test **/
|
||||||
byte[] dhcpPacketData = new byte[]
|
byte[] dhcpPacketData = new byte[]
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ namespace Cosmos.System.Network
|
||||||
/// Create new instance of the <see cref="EthernetPacket"/> class, with specified raw data.
|
/// Create new instance of the <see cref="EthernetPacket"/> class, with specified raw data.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="rawData">Raw data.</param>
|
/// <param name="rawData">Raw data.</param>
|
||||||
protected EthernetPacket(byte[] rawData)
|
public EthernetPacket(byte[] rawData)
|
||||||
{
|
{
|
||||||
RawData = rawData;
|
RawData = rawData;
|
||||||
InitFields();
|
InitFields();
|
||||||
|
|
|
||||||
|
|
@ -16,18 +16,8 @@ namespace Cosmos.System.Network.IPv4.UDP.DHCP
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// DHCPClient class. Used to manage the DHCP connection to a server.
|
/// DHCPClient class. Used to manage the DHCP connection to a server.
|
||||||
/// </summary>
|
/// </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>
|
// <summary>
|
||||||
/// Is DHCP ascked check variable
|
/// Is DHCP ascked check variable
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -43,34 +33,12 @@ namespace Cosmos.System.Network.IPv4.UDP.DHCP
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create new instance of the <see cref="UdpClient"/> class.
|
/// Create new instance of the <see cref="DHCPClient"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <exception cref="ArgumentOutOfRangeException">Thrown on fatal error (contact support).</exception>
|
/// <exception cref="ArgumentOutOfRangeException">Thrown on fatal error (contact support).</exception>
|
||||||
/// <exception cref="ArgumentException">Thrown if UdpClient with localPort 0 exists.</exception>
|
/// <exception cref="ArgumentException">Thrown if UdpClient with localPort 53 exists.</exception>
|
||||||
public DHCPClient()
|
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>
|
/// <summary>
|
||||||
|
|
@ -90,14 +58,14 @@ namespace Cosmos.System.Network.IPv4.UDP.DHCP
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (_deltaT != Cosmos.HAL.RTC.Second)
|
if (_deltaT != RTC.Second)
|
||||||
{
|
{
|
||||||
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
|
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
|
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)
|
if (asked)
|
||||||
{
|
{
|
||||||
Apply(ack, true);
|
Apply(ack, true);
|
||||||
|
|
|
||||||
|
|
@ -51,9 +51,9 @@ namespace Cosmos.System.Network.IPv4.UDP.DHCP
|
||||||
/// <exception cref="sysIO.IOException">Thrown on IO error.</exception>
|
/// <exception cref="sysIO.IOException">Thrown on IO error.</exception>
|
||||||
public static void DHCPHandler(byte[] packetData)
|
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)
|
if (receiver != null)
|
||||||
{
|
{
|
||||||
receiver.ReceiveData(dhcp_packet);
|
receiver.ReceiveData(dhcp_packet);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue