Livt packages
Livt.Net
Version 1.4.1
Ethernet, IPv4, TCP, UDP, ARP, TFTP, and Telnet networking components for Livt hardware.
Published files (163)
tests/ethernet/EthernetIoTransmitFixture.lvt
namespace Livt.Net.Tests
using Livt.IO
/** Independent IO slot; explicit completion holds the real adapter's borrow. */
component EthernetIoTransmitFixture : IEthernetTransmitter
{
bytes: byte[128]
count: int
length: int
phase: int
ready: bool
failAppend: bool
failCommit: bool
terminal: EthernetTransmitOutcome
new()
{
ready = true
}
public fn SetReady(value: bool)
{
ready = value
}
public fn SetFailures(append: bool, commit: bool)
{
failAppend = append;
failCommit = commit
}
public fn IsCommitted() bool
{
return phase == 2
}
public fn IsFree() bool
{
return phase == 0
}
public fn GetCount() int
{
return count
}
public fn Read(index: int) byte
{
return bytes[index]
}
public fn Complete(value: EthernetTransmitOutcome)
{
assert phase == 2;
terminal = value;
phase = 3
}
override fn GetTransmitCapacity() int
{
return 128
}
override fn TryBegin(size: int) EthernetResult
{
if (phase != 0) { return EthernetResult.Busy }
if (!ready) { return EthernetResult.NotReady }
if (size < 14 || size > 128) { return EthernetResult.Invalid }
length = size;
count = 0;
phase = 1;
return EthernetResult.Success
}
override fn TryAppend(value: byte) EthernetResult
{
if (failAppend) { return EthernetResult.DeviceFailure }
if (phase != 1 || count >= length) { return EthernetResult.Invalid }
bytes[count] = value;
count++;
return EthernetResult.Success
}
override fn TryCommit() EthernetResult
{
if (failCommit) { return EthernetResult.NotReady }
if (phase != 1 || count != length) { return EthernetResult.Invalid }
phase = 2;
return EthernetResult.Accepted
}
override fn TryDiscard() EthernetResult
{
if (phase != 1) { return EthernetResult.Invalid }
phase = 0;
return EthernetResult.Success
}
override fn TryGetCompletion(outcome: out EthernetTransmitOutcome) EthernetResult
{
outcome = EthernetTransmitOutcome.None
if (phase != 3) { return EthernetResult.NotReady }
outcome = terminal;
return EthernetResult.Success
}
override fn TryAcknowledgeCompletion() EthernetResult
{
if (phase != 3) { return EthernetResult.NotReady }
phase = 0;
return EthernetResult.Success
}
}