Releases: tinic/AmiNetXDuo
Release list
AmiNetXDuo 0.25.5 (NetX Duo 6.5.1, ThreadX 6.5.1)
Fixed
- Removing one interface no longer takes the machine's default gateway with it. DHCP installs the gateway at bind, so the last interface to come up owns it machine-wide -- and detaching that one cleared it, leaving the survivor able to reach its own subnet and nothing else. Every off-link connection and every name lookup that had to leave the subnet failed, on an interface that was up, had an address and answered an on-link ping. A gateway is now reinstated from a surviving interface after a detach, taking the survivors' next hops in slot order and letting the stack pick one on a live subnet.
- Removing one interface no longer takes its sibling off the wire.
S2_ONLINE/S2_OFFLINEare unit commands and every interface on one unit shares one wire, so on a card with two interfaces onUNIT=0the first one removed sent the whole unit offline underneath the other. The openers of a unit are counted now, keyed on device, unit and board, and the offline command is issued only by the last interface to leave. - A 3c589 is no longer declared dead on a fast machine. Three waits in
anxnet.device-- the command-register wait, the EEPROM read and the coax converter's start-up -- polled a hardware bit a fixed number of register reads rather than for a length of time, so the faster the processor the sooner each expired. All three are clocked against the raster beam now, with the old count kept as an unconditional floor. - An empty expansion slot is no longer reported as a card. Gayle's bus keeps the last byte driven on it, so a probe that writes a register and reads the same address back is reading its own write.
CheckNetDeviceand the ISA-PnP probe now drive a different byte at a second register between the write and the read, so a floating bus cannot answer correctly. - IPv6 stateless autoconfiguration forms an address per interface. Two interfaces sharing a prefix previously did not each get one.
AmiNetXDuo 0.25.4 (NetX Duo 6.5.1, ThreadX 6.5.1)
AmiNetXDuo 0.25.4 (NetX Duo 6.5.1, ThreadX 6.5.1)
Drop AmiNetXDuo-0.25.4.lha on a Workbench window and run Install-AmiNetXDuo.
sha256 abc79985af378cb59bf0ef778b3f995b69993f57027d99681065360afdf34ef6 AmiNetXDuo-0.25.4.lha
- Four interfaces can be online at once, up from two. An A1200 with a PiStorm32 has two conventional cards -- a 3c589 in the PCMCIA slot, and room for another -- and two more the accelerator supplies,
genet.devicefor the Pi's gigabit Ethernet andwifipi.devicefor its WiFi, so four is what that machine has. It costs 4,872 bytes of resident memory on every machine, whether it brings up one interface or four -- 4,032 of the single allocation the stack makes, 808 of interface-list floor and 32 ofbsdsocket.library's BSS -- which a 2 MB A1200 with no Fast RAM was measured carrying traffic with. A machine that would rather have the bytes builds fewer slots withcmake -DAMINETXDUO_MAX_INTERFACES=2 - An
AddNetInterfacethat fails puts back the interface it displaced. On a machine with every slot in use, bringing up an interface takes a slot from one the boot started on its own -- and if the new interface then fails after its device has opened, which is what a copied interface file with an address the machine already has does, the one that stood down was left defined and not attached, with nothing said about it. It now comes back up, with its address, its DHCP and its routes - An interface whose
GATEWAYcannot be reached still comes up. A next hop on no network this machine is on is refused by the stack, andAddNetInterfacetreated that as a reason to destroy the interface -- which on a full machine also cost the interface that had stood down to make room for it, so one mistyped line in one file took the network off a working machine. The interface comes up, and the command says the route was refused and which line of which file to look at NetShutdowntakes the machine off the network, and a second one can put it back. Three separate faults, each of which left something running after the command reported success. The card was told the stack's belief about the wire rather than the fact it had been sent an offline command, so one out-of-service read stoppedS2_OFFLINEever reaching that interface again -- anda2065.device2.16 ignoresAbortIO(), so the reads already posted stayed with the device, the reader timed out reaping them and the close was refused while the card went on receiving. The interface count was then written to zero over the top of whatever the close loop had actually managed, so everything that walks the stack -- the capture taps, the mDNS and DHCPv6 loops -- walked slots that were still occupied. And theTCP:handler was never asked to go down, so the first machine to openTCP:kept a Process, its DOS entry and 371,648 bytes for the rest of that boot, withbsdsocket.libraryunable to expunge- A receive window too small to be useful is advertised as zero rather than as a number the sender cannot use. RFC 1122's silly-window-syndrome rule: below one maximum segment the window goes on the wire as zero, so the sender waits for a real opening instead of dribbling undersized segments at a receiver that has no room for them
- 64-bit arithmetic is faster, and four shipped programs stopped carrying a second copy of it.
iperf,httpd,Profileandprofspinwere resolving__udivdi3out of libgcc rather than this tree's own, because GCC invents that call late in link-time optimisation, after our archive has already been scanned. The helper that now serves them is 4.8x libgcc's on the common path, and the wide-divisor branch -- a 64-bit divisor, which was a 64-iteration shift-and-subtract loop -- goes from 847 to 57 microseconds an operation on a 68020. The flag that used to trim the unused helpers charged every program that linked them 0.8 to 6.6 per cent of its whole size for it, and no longer does - A machine with no Fast RAM gets a packet pool it can actually receive into. The pool was a sixteenth of free memory, which on a 2 MB A1200 with 1.2 MB free buys 47 packets, and the receive window derived from it was then overridden by an 8 KB floor -- so the socket advertised a window larger than the pool that had to hold it. Measured on an A2065 bridged to a real sender for 15 seconds: zero-window events fall from 113 to 6 and throughput rises 10.9 per cent
getsockopt(SO_RCVBUF)on a UDP socket answers the datagram queue rather than a TCP window. It returned 8192 whatever the queue actually was, which is a TCP number on a socket that has no TCP in it- A 3c589 under load loses fewer frames, and the counters say which loss it was. The receive FIFO's head packet was held for the whole of the call up into the stack, occupying receive memory that arriving frames needed; it is released after the last read from the FIFO now. Transmit underruns were also being added to the overrun counter, which SANA-II reports as "Receive ring overruns", so a card with a transmit problem read as a card that was being flooded. They have their own counter
- The libraries build for 68020 and 68060 again. The check that refuses a program whose PC-relative branches cannot reach was reading local symbols out of an Amiga load file, which has none, so it refused every build of every target for those processors -- the shipping libraries among them
- Three commands answer correctly where they used to answer plausibly. The browser console's first
SetMode()orWaitForChar()of a session was refused with an invalid-lock error, because neither the break port nor the shell task is known until after the first packet.CheckNetConfig's four IPv4 checks -- no default route, an off-network router, no name server, an off-network name server -- were dead on every configuration an IPv6 build parses, which is all of them. AndConfigureNetInterfacetold a user with a working DHCP client that the machine had none, because the client being mid-allocation answersEBUSYand only one of the four possible errors was being read
0.25.3
DEVS:NetInterfacesmay hold as many interface definitions as you put in it. The reader stopped at two: the third and later files were discarded as they were read, in whatever order the filesystem handed them over, so which two survived was not something the drawer told you -- and nothing said a word about it, soCheckNetConfigwent on reporting the card and the driver healthy for a machine whose configuration it had only half read. The list has no ceiling now. The one that remains is the hardware's -- two interfaces attach at a time -- and it is a refusal at the moment you ask, naming the interfaces that are holding the slots- The interface you name is the interface that comes up, whichever file it is in
DEVS:NetInterfaces. Two interfaces can be online at once and a drawer may describe more than two; the boot brought up whichever came first alphabetically and took both slots, soAddNetInterface wifi0on a machine that also hadeth0andeth1was refused "no space left on device" with nothing else in use, and the card the machine was allowed to use was decided by the alphabet. An interface the boot started on its own now gives its slot to one you ask for by name, and says which one it was and how to bring it back. An interface you named keeps its slot: a thirdAddNetInterfaceis still refused, with the names of the two that are holding them - An interface reports its own name. When an earlier interface file named a card that is not in the machine, the machine came up on the next card with the next card's address and reported it under the missing card's name -- in
netstat -iand inShowNetStatus, which also said the interface file had been changed after the network started, about a file nobody had touched -- while the interface that was actually running was listed as offline - A mistyped
DEVICE=costs a message and nothing else. Bringing up an interface whose driver is not on the machine never takes down one that is working - A keyword this stack reads and ignores on purpose is no longer filed as a problem with your file. An interface file written for Roadshow carries
IPREQUESTS,WRITEREQUESTS,COPYMODEandMULTICAST, which are accepted so that a stock file loads here unchanged and are then acted on by nothing -- and every command that loaded the configuration printed six lines about each of them under the heading "Problems in the configuration:", ending with the sentence "The line is harmless and can stay". One machine'snetstat -iwas thirty-three lines, twenty-one of them that lecture, before the table, andShowNetStatus DHCPanswered with the same essay and then said there is no interface called DHCP. Ordinary commands now say nothing about them;CheckNetConfig, whose job is auditing the file, prints every one with its line and its reason under a heading of its own, and a file whose only findings are those is told it has nothing wrong with it. A real fault is still printed by every command, with the file and the line -- and byAddNetInterfaceonce rather than five times, which is how often it reads the file netstat -inames an interface that is defined and did not attach. The table is built from the live stack, so on a machine describing more interfaces than there are slots the ones that did not come up appeared in no column of that command at all; there is a line under the table for them now, the same factShowNetStatusreports as thedefinedstate- A bring-up that fails says which call failed and what it answered, rather than describing the trouble in prose and then sending you to a debug log. That log is
AMINETXDUO_LOG, it is off in every build that ships, and a machine that has just refused to put its network up is the worst possible moment to be told to go and read something it cannot write - The waits inside
anxnet.devicemeasure time rather than counting instructions. Every one of th...
AmiNetXDuo 0.25.3 (NetX Duo 6.5.1, ThreadX 6.5.1)
AmiNetXDuo 0.25.3 (NetX Duo 6.5.1, ThreadX 6.5.1)
Drop AmiNetXDuo-0.25.3.lha on a Workbench
window and run Install-AmiNetXDuo.
DEVS:NetInterfacesmay hold as many interface definitions as you put in it. The reader stopped at two: the third and later files were discarded as they were read, in whatever order the filesystem handed them over, so which two survived was not something the drawer told you -- and nothing said a word about it, soCheckNetConfigwent on reporting the card and the driver healthy for a machine whose configuration it had only half read. The list has no ceiling now. The one that remains is the hardware's -- two interfaces attach at a time -- and it is a refusal at the moment you ask, naming the interfaces that are holding the slots- The interface you name is the interface that comes up, whichever file it is in
DEVS:NetInterfaces. Two interfaces can be online at once and a drawer may describe more than two; the boot brought up whichever came first alphabetically and took both slots, soAddNetInterface wifi0on a machine that also hadeth0andeth1was refused "no space left on device" with nothing else in use, and the card the machine was allowed to use was decided by the alphabet. An interface the boot started on its own now gives its slot to one you ask for by name, and says which one it was and how to bring it back. An interface you named keeps its slot: a thirdAddNetInterfaceis still refused, with the names of the two that are holding them - An interface reports its own name. When an earlier interface file named a card that is not in the machine, the machine came up on the next card with the next card's address and reported it under the missing card's name -- in
netstat -iand inShowNetStatus, which also said the interface file had been changed after the network started, about a file nobody had touched -- while the interface that was actually running was listed as offline - A mistyped
DEVICE=costs a message and nothing else. Bringing up an interface whose driver is not on the machine never takes down one that is working - A keyword this stack reads and ignores on purpose is no longer filed as a problem with your file. An interface file written for Roadshow carries
IPREQUESTS,WRITEREQUESTS,COPYMODEandMULTICAST, which are accepted so that a stock file loads here unchanged and are then acted on by nothing -- and every command that loaded the configuration printed six lines about each of them under the heading "Problems in the configuration:", ending with the sentence "The line is harmless and can stay". One machine'snetstat -iwas thirty-three lines, twenty-one of them that lecture, before the table, andShowNetStatus DHCPanswered with the same essay and then said there is no interface called DHCP. Ordinary commands now say nothing about them;CheckNetConfig, whose job is auditing the file, prints every one with its line and its reason under a heading of its own, and a file whose only findings are those is told it has nothing wrong with it. A real fault is still printed by every command, with the file and the line -- and byAddNetInterfaceonce rather than five times, which is how often it reads the file netstat -inames an interface that is defined and did not attach. The table is built from the live stack, so on a machine describing more interfaces than there are slots the ones that did not come up appeared in no column of that command at all; there is a line under the table for them now, the same factShowNetStatusreports as thedefinedstate- A bring-up that fails says which call failed and what it answered, rather than describing the trouble in prose and then sending you to a debug log. That log is
AMINETXDUO_LOG, it is off in every build that ships, and a machine that has just refused to put its network up is the worst possible moment to be told to go and read something it cannot write - The waits inside
anxnet.devicemeasure time rather than counting instructions. Every one of them was a spin over a bus read whose count had been calibrated on a 14 MHz 68020 -- including the three hundred milliseconds a PCMCIA card is held in reset, which the card's own documentation puts at one to two hundred as a minimum -- so on an accelerated machine each of them finished early, and by as much as the processor was faster. They are clocked against the raster beam now, which runs off the chipset oscillator and keeps the same time on every Amiga, and each one is floored by the old count as well, so no machine waits less than it did before. This was found by reading the code while looking into an accelerator report, and it is not established to have caused that report or any other: there is no accelerated machine here, and the new behaviour is unverified on physical hardware.CheckNetDeviceprints the spins it measures per raster line, which is the number that says whether a machine was affected -- tens on a stock A1200, tens of thousands on an accelerator - IGMP receive checksums are checked again. A guard that should read "unless the interface and the packet BOTH say the checksum has already been done" was negated the wrong way round in the vendored NetX Duo on 2026-08-06, and every build that ships has interface capabilities compiled in, so since that day an IGMP membership message has been accepted without its checksum being looked at at all
- A transfer into this machine no longer stops dead for a third of a second at a time. Two faults in the vendored TCP, both measured on the A1200 against a Linux sender. A window that fell below one segment could only be reopened from the receive path, which a program parked in
recv()never reaches, so the sender sat in persist backoff long after the application had made room; and the sender's window probe -- one byte past the advertised edge -- was trimmed away to nothing and then matched none of the conditions that produce an acknowledgment, so it went unanswered and the probe interval doubled, and doubled again. The window is now reopened from the delayed-acknowledgment timer once two full segments fit, and a segment trimmed to nothing is answered with the current sequence and window, which is what RFC 1122 asks for. About one transfer in ten used to lose five to ten per cent this way and the occasional one collapsed outright - Multicast name service no longer takes the machine off the air for half a second at a time. The responder drained its whole receive queue in a single pass with its mutex held, and every record in every packet is compared against the entire peer cache: on a 14 MHz 68020 with a populated cache that measured one hundred to five hundred milliseconds, during which the IP thread never ran and no acknowledgment left the machine, and one transfer in six crossed a burst of LAN chatter and lost five to ten per cent to the dead air. The thread hands the processor back between resource records now, not merely between packets -- one multi-record response on its own was holding the machine one hundred and thirty milliseconds
- A certificate chain signed with RSASSA-PSS verifies. It was not failing verification, it was failing to parse:
id-RSASSA-PSSis the one signature algorithm in X.509 whose parameters are notNULL, the parser refused theSEQUENCEthey arrive in and answered that the certificate was invalid, so any chain with a PSS link anywhere in it was simply unreachable - A 3c589 in the PCMCIA slot keeps its own hardware address. Read straight after the attach-time reset the card's EEPROM answers with words that have not settled, and they look enough like an address to pass every check there was, so the machine took a different made-up address on each boot -- measured on the wire as
54:00:72:65:1b:03one boot and40:4c:00:10:09:dbthe next, where the card's real address is00:10:4b:df:09:db. A new address every boot is a new DHCP identity every boot. The address is now read only once the part says it has settled, every word is read twice and believed only when both reads agree, and a card whose EEPROM never answers gets the same stable derived address the driver already gives a card with no EEPROM at all - A PCMCIA card that comes up deaf is reset and tried again instead of needing the machine rebooted. Whether a 3c589's receiver hears the wire is decided at power-up, on an A1200 the slot is never reset properly at power-on -- Commodore's unfixed bug, and 3Com cards are the documented sufferers -- and no register a driver can write changes it. The claim now holds the slot in reset for the three hundred milliseconds the card's documentation asks for, writes the activate bit that nothing on an Amiga has ever written, and if the unit is online and has transmitted and heard nothing back two seconds later, halts the chip and tries again until the first frame arrives.
CheckNetDevicecounts the retries - A card whose interrupt line has stopped delivering keeps receiving. Transmit needs no interrupt, so a machine in this state looks online and is deaf; the driver counts the interrupts its servers actually claim, and while none have arrived -- or after ten vertical blanks with traffic outstanding and none claimed -- it services the chip from the blank it is already on. A network at fifty frames a second where there was none, and the first genuine interrupt hands the work back
httpdanswers on IPv6 as well as IPv4. One wildcard listener now carries both families, because NetX keys its listen table by port alone and a second socket on[::]cannot be opened beside the first: the earlier attempt at two listeners answered the IPv6 connection from the IPv4 socket and then reset it. Naming anADDRESSstill picks that address's family, which is what naming one asks forhttpd <drawer> -Cstarts fromS:User-Startup, which is the machine that most wants it. Intuition's screen list is empty until something opens a screen, andLoadWBis at the end of the st...
AmiNetXDuo 0.25.2 (NetX Duo 6.5.1, ThreadX 6.5.1)
AmiNetXDuo 0.25.2 (NetX Duo 6.5.1, ThreadX 6.5.1)
Drop AmiNetXDuo-0.25.2.lha on a Workbench
window and run Install-AmiNetXDuo.
AmiTCP:is assigned, so a program that opensAmiTCP:libs/usergroup.libraryas a file finds one. 0.25.1 made ixemul clients work by holdingusergroup.libraryopen, which satisfies a path-qualifiedOpenLibrarybecause Exec falls back to matching the file part; that does nothing for a program whichLocks orOpens the path instead. The installer makes the assign and writes it intoS:User-Startup, and the library makes it on first open if nothing else owns the name -- so a hand-installed library works too. A machine with a real AmiTCP on it keeps its own- Every shipped binary is smaller.
bsdsocket.library395,328 to 352,960,tls.library242,312 to 188,312,usergroup.library7,684 to 7,172, andanxnet.device33,228 to 30,540. Nothing about the code changed; the toolchain can now do link-time optimisation, andanxnet.devicewas additionally being built-O2for the whole image where the rest of the tree is-Os-- measured on the A1200 with an A2065, that cost 21 KB for no read-throughput difference that survives interleaving - The network is faster on the same hardware. An A1200 with an A2065 reads 595 KB/s where it read 543, and writes 331 KB/s where it wrote 321. Nothing about the stack changed; the toolchain can now do link-time optimisation, and the whole-program view is worth about ten per cent on the receive path. Measured interleaved over twenty-six runs, thirteen per arm, with the two distributions not overlapping at all
- Building from source needs the toolchain that
tools/fetch-toolchain.shinstalls, and refuses an older one rather than producing something subtly wrong. The previous pin cannot do link-time optimisation at all -- itsldanswers-plugin PLUGIN (ignored)-- and its own gcc revision no longer exists upstream, sotools/build-toolchain.shcould not fetch it either
0.25.1
- Programs built against ixemul.library work.
wgetand every other GeekGadgets client reaches the network throughixnet.library, which opensbsdsocket.libraryand then looks forusergroup.library; not finding one, it closed the stack it had just opened and reported no network at all, so every socket call in that program answered "Function not implemented" while the interface was up andpingworked. The library now holdsusergroup.libraryopen for as long as it is loaded, which is what the other stacks do
0.25.0
-
A DHCPv6 lease is renewed once, when it is due, rather than rebound twenty-five times a second forever. A server that answers with T1 and T2 of zero is telling the client to pick its own renewal times; the client read zero as "renew now" and re-entered the rebind state on every pass, which also meant a renewal never actually reached the wire and the address's lifetime shrank each time. On the lab's network that was 2544 rebinds in five minutes, and is now none
-
The remote desktop shows the screen and not the memory beside it. A graphics card rounds a screen's bitmap up to the board's own pitch, and the console took its width from the bitmap, so a 1368-pixel-wide screen was served as 1600: two hundred and thirty-two columns of whatever the card had off the right-hand edge, on every frame, and seventeen per cent more data to send than the screen contains. A planar screen had the same, rounded up to sixteen
-
An encrypted connection is three to five times faster and no longer takes the machine off the network while it runs. A 4096-bit certificate -- which is what every Let's Encrypt chain ends at -- was handed to the reference arithmetic instead of the 68k routines, one silent block of about ninety seconds per handshake, and the routines that did run gave the rest of the machine a turn only seventeen times in an operation.
fetch https://www.gnu.org/goes from 100 seconds to twenty or thirty, and a machine that used to stop answering for its own address for a minute at a time now answers throughout -
NetSetupno longer writes uninitialised memory into the interface file. A call that did not passIPV6=emitted aCONFIGURE6line holding whatever was on the stack, into a file the stack reads on the next boot -
A DHCP server's domain is accepted in the forms servers actually send it: an underscore, which a great many consumer routers use, and the fully qualified form ending in a dot, which is stored without it. Refusing either left the machine with no default domain and no search suffix at all, because both come from that one option
-
A malformed DHCPv6 option no longer costs the client the configuration it already had. The DNS servers and the search list are now replaced only after the whole message has parsed, so one bad option in a Reply cannot leave the machine with neither
-
A DHCPv6 exchange that fails on a new network no longer republishes the previous network's DNS servers, and a setup that fails once no longer disables DHCPv6 for the life of the machine
-
A DHCP option that could not be read asks to be read again on the next pass, for the host name, the domain and the search list as well as the servers. One that can never succeed keeps what it has and says so once, rather than retrying forever
-
A router's advertised DNS servers and search domains expire when their lifetime runs out, and belong to the interface and the source that advertised them, so one card's advertisement no longer withdraws another's
-
Multicast name service clears its cache when asked, keeps a browse alive while more than one program is using it, retries a publication that failed, and gets its goodbye onto the wire at shutdown. A lookup across two cards no longer spends the whole timeout on the first
-
A second network card that cannot attach is dropped rather than taking the whole stack down, and
AddNetInterfacekeeps a card that could not get a link-local address instead of removing it -
telnetto a name whose first address does not answer no longer takes three minutes. The retry now draws from the timeout the caller asked for rather than starting a fresh one -
nslookupreports a record it cannot read and carries on, rather than abandoning the answer -
httpdserves a drawer containing a name too long to list, minus that entry, instead of dropping the connection for every client that asks -
The WebSocket console refuses malformed control frames, oversized control words and invalid UTF-8, and keeps pipelined input under backpressure
-
getnameinfo()no longer fails when the port has no name inDEVS:Internet/services. The flag that requires a name is about the host, and the peer's port on an accepted connection never has one -
The release archive contains
C:sshagain. The packer only copied a client somebody else had built, so an archive made any other way was simply missing it -
A connected UDP socket becomes readable again. The readability test and
FIONREADread the source port from a packet still on the receive queue, where the UDP header has not yet been stripped, so the port never matched the peer and the socket looked permanently empty;sntptimed out on every attempt andiperfin UDP mode burned each slice -
FIONREADon a datagram socket reports the payload without its UDP header, and agrees with what a peeking read returns -
A UDP socket reports an ICMP error as readable and clears it through
SO_ERROR, instead of leaving a program waiting for a datagram that will never arrive -
A datagram socket honours
shutdown(): a socket shut down for reading reports no bytes, and the disconnected state is consistent between two tasks looking at it -
A UDP or raw socket only accepts what its bind and its connect name. Datagrams from other peers, and to other local addresses, were delivered to a socket that had asked for one endpoint
-
An IPv6 link-local address keeps its zone through bind, connect, accept and receive, and a local zone is no longer confused with the peer's. An address on a machine with two cards named whichever interface the stack looked at first
-
IPv6 multicast honours the scope zone of the address, and a UDP disconnect clears the zone it was using
-
The path MTU is measured on the interface actually selected for the destination, not the first one
-
getnameinfo()withNI_NAMEREQDreturns the numeric port when the service has no name. The flag is about the host half -- the peer port on an accepted connection is ephemeral and is never inDEVS:Internet/services, so the whole call failed and the caller lost the host name that had in fact resolved -
Undefined flags to
getnameinfo()are refused rather than ignored -
A TCP socket reports its queue depths correctly. The receive walk followed a field that holds a sentinel on a ready packet -- an odd address, so a
NetStatusquery on a socket with two or more queued segments took an address error -- and Send-Q counted headers as application data -
Encrypted connections work above descriptor 255, no longer race two tasks creating a session at once, and honour
nfdswhen waiting on buffered data -
A resumed encrypted session is bound to the parameters that were cached with it, so it cannot come back with different ones
-
The router-advertised DNS servers and search domains expire when their lifetime runs out, and are owned per interface and per source, so one card's advertisement no longer withdraws another's
-
A DHCP lease's DNS servers, host name, default domain and search suffix are reconciled against what the lease actually offers, and a server withdrawn from a renewed lease is withdrawn from the resolver
-
A statically configured DNS server survives a lease withdrawal
-
Multicast service discovery retries a publication that failed, reports every publication failure rather than the first, keeps a shared browse alive while more than one program is using it, and gets its goodbye onto the wire at shutdown
-
A multicast name lookup across two cards no longer sp...
AmiNetXDuo 0.25.1 (NetX Duo 6.5.1, ThreadX 6.5.1)
AmiNetXDuo 0.25.1 (NetX Duo 6.5.1, ThreadX 6.5.1)
Drop AmiNetXDuo-0.25.1.lha on a Workbench
window and run Install-AmiNetXDuo.
- Programs built against ixemul.library work.
wgetand every other GeekGadgets client reaches the network throughixnet.library, which opensbsdsocket.libraryand then looks forusergroup.library; not finding one, it closed the stack it had just opened and reported no network at all, so every socket call in that program answered "Function not implemented" while the interface was up andpingworked. The library now holdsusergroup.libraryopen for as long as it is loaded, which is what the other stacks do
0.25.0
-
A DHCPv6 lease is renewed once, when it is due, rather than rebound twenty-five times a second forever. A server that answers with T1 and T2 of zero is telling the client to pick its own renewal times; the client read zero as "renew now" and re-entered the rebind state on every pass, which also meant a renewal never actually reached the wire and the address's lifetime shrank each time. On the lab's network that was 2544 rebinds in five minutes, and is now none
-
The remote desktop shows the screen and not the memory beside it. A graphics card rounds a screen's bitmap up to the board's own pitch, and the console took its width from the bitmap, so a 1368-pixel-wide screen was served as 1600: two hundred and thirty-two columns of whatever the card had off the right-hand edge, on every frame, and seventeen per cent more data to send than the screen contains. A planar screen had the same, rounded up to sixteen
-
An encrypted connection is three to five times faster and no longer takes the machine off the network while it runs. A 4096-bit certificate -- which is what every Let's Encrypt chain ends at -- was handed to the reference arithmetic instead of the 68k routines, one silent block of about ninety seconds per handshake, and the routines that did run gave the rest of the machine a turn only seventeen times in an operation.
fetch https://www.gnu.org/goes from 100 seconds to twenty or thirty, and a machine that used to stop answering for its own address for a minute at a time now answers throughout -
NetSetupno longer writes uninitialised memory into the interface file. A call that did not passIPV6=emitted aCONFIGURE6line holding whatever was on the stack, into a file the stack reads on the next boot -
A DHCP server's domain is accepted in the forms servers actually send it: an underscore, which a great many consumer routers use, and the fully qualified form ending in a dot, which is stored without it. Refusing either left the machine with no default domain and no search suffix at all, because both come from that one option
-
A malformed DHCPv6 option no longer costs the client the configuration it already had. The DNS servers and the search list are now replaced only after the whole message has parsed, so one bad option in a Reply cannot leave the machine with neither
-
A DHCPv6 exchange that fails on a new network no longer republishes the previous network's DNS servers, and a setup that fails once no longer disables DHCPv6 for the life of the machine
-
A DHCP option that could not be read asks to be read again on the next pass, for the host name, the domain and the search list as well as the servers. One that can never succeed keeps what it has and says so once, rather than retrying forever
-
A router's advertised DNS servers and search domains expire when their lifetime runs out, and belong to the interface and the source that advertised them, so one card's advertisement no longer withdraws another's
-
Multicast name service clears its cache when asked, keeps a browse alive while more than one program is using it, retries a publication that failed, and gets its goodbye onto the wire at shutdown. A lookup across two cards no longer spends the whole timeout on the first
-
A second network card that cannot attach is dropped rather than taking the whole stack down, and
AddNetInterfacekeeps a card that could not get a link-local address instead of removing it -
telnetto a name whose first address does not answer no longer takes three minutes. The retry now draws from the timeout the caller asked for rather than starting a fresh one -
nslookupreports a record it cannot read and carries on, rather than abandoning the answer -
httpdserves a drawer containing a name too long to list, minus that entry, instead of dropping the connection for every client that asks -
The WebSocket console refuses malformed control frames, oversized control words and invalid UTF-8, and keeps pipelined input under backpressure
-
getnameinfo()no longer fails when the port has no name inDEVS:Internet/services. The flag that requires a name is about the host, and the peer's port on an accepted connection never has one -
The release archive contains
C:sshagain. The packer only copied a client somebody else had built, so an archive made any other way was simply missing it -
A connected UDP socket becomes readable again. The readability test and
FIONREADread the source port from a packet still on the receive queue, where the UDP header has not yet been stripped, so the port never matched the peer and the socket looked permanently empty;sntptimed out on every attempt andiperfin UDP mode burned each slice -
FIONREADon a datagram socket reports the payload without its UDP header, and agrees with what a peeking read returns -
A UDP socket reports an ICMP error as readable and clears it through
SO_ERROR, instead of leaving a program waiting for a datagram that will never arrive -
A datagram socket honours
shutdown(): a socket shut down for reading reports no bytes, and the disconnected state is consistent between two tasks looking at it -
A UDP or raw socket only accepts what its bind and its connect name. Datagrams from other peers, and to other local addresses, were delivered to a socket that had asked for one endpoint
-
An IPv6 link-local address keeps its zone through bind, connect, accept and receive, and a local zone is no longer confused with the peer's. An address on a machine with two cards named whichever interface the stack looked at first
-
IPv6 multicast honours the scope zone of the address, and a UDP disconnect clears the zone it was using
-
The path MTU is measured on the interface actually selected for the destination, not the first one
-
getnameinfo()withNI_NAMEREQDreturns the numeric port when the service has no name. The flag is about the host half -- the peer port on an accepted connection is ephemeral and is never inDEVS:Internet/services, so the whole call failed and the caller lost the host name that had in fact resolved -
Undefined flags to
getnameinfo()are refused rather than ignored -
A TCP socket reports its queue depths correctly. The receive walk followed a field that holds a sentinel on a ready packet -- an odd address, so a
NetStatusquery on a socket with two or more queued segments took an address error -- and Send-Q counted headers as application data -
Encrypted connections work above descriptor 255, no longer race two tasks creating a session at once, and honour
nfdswhen waiting on buffered data -
A resumed encrypted session is bound to the parameters that were cached with it, so it cannot come back with different ones
-
The router-advertised DNS servers and search domains expire when their lifetime runs out, and are owned per interface and per source, so one card's advertisement no longer withdraws another's
-
A DHCP lease's DNS servers, host name, default domain and search suffix are reconciled against what the lease actually offers, and a server withdrawn from a renewed lease is withdrawn from the resolver
-
A statically configured DNS server survives a lease withdrawal
-
Multicast service discovery retries a publication that failed, reports every publication failure rather than the first, keeps a shared browse alive while more than one program is using it, and gets its goodbye onto the wire at shutdown
-
A multicast name lookup across two cards no longer spends the whole timeout on the first one
-
httpdconditional requests compare entity tags exactly, distinguish weak from strong, and keep a complete tag list rather than the last entry -
httpdparses byte ranges without guessing, and refuses a malformed request version, a malformed header field name, an unsupported expectation, an undelimited transfer coding and an invalid WebDAVOverwritedirective -
httpdkeeps the old file until its replacement is complete, never truncates an existing file to hold a temporary, and reports a failure on the final write instead of returning success -
httpdrefuses aMOVEorCOPYwhose destination is inside its source, never deletes the source after a partial copy, and refuses a name it would have to truncate anywhere in the tree -
httpdaborts a directory listing when the scan fails, rather than serving the part it managed to read as though it were complete -
httpdmatches a WebSocket negotiation token exactly and requires an exact takeover query -
The WebSocket console rejects a non-minimal frame length, a prohibited or malformed close code, invalid UTF-8 in a text message or close reason, and enforces the message ceiling across a fragmented message
-
The WebSocket console keeps pipelined input under backpressure, evicts only at a frame boundary, preserves a queued close over a ping, and stops polling an input socket that is blocked
-
telnet,whoisandnettracefinish a write that the stack accepted only in part, instead of sending a truncated request -
telnetrenders a bare carriage return as the NVT defines it -
nslookupconfines a name to its own RDATA field, so a malformed record cannot read past it -
tftpremoves a partial download when the local write fails, and accepts the transfer port only from the server it asked -
ncandiperfhonour IPv6 for a wildc...
m68k-amigaos-gcc 16.2.1 (LTO-capable)
m68k-amigaos cross toolchain, the first build that can compile with -flto.
- gcc 60f21496 (tip of amiga16.2, DATESTAMP 20260819152818); the previous pin 6f4ca1b4 no longer exists upstream
- binutils ab4e5183 configured
--enable-plugins, plus two bfd patches for LTO (tools/patches/binutils/) lib/bfd-plugins/liblto_plugin.solinked, so barear,ranlibandnmare plugin-aware
Fetched by tools/fetch-toolchain.sh, which verifies the sha256.
AmiNetXDuo 0.25.0 (NetX Duo 6.5.1, ThreadX 6.5.1)
AmiNetXDuo 0.25.0 (NetX Duo 6.5.1, ThreadX 6.5.1)
Drop AmiNetXDuo-0.25.0.lha on a Workbench
window and run Install-AmiNetXDuo.
-
A DHCPv6 lease is renewed once, when it is due, rather than rebound twenty-five times a second forever. A server that answers with T1 and T2 of zero is telling the client to pick its own renewal times; the client read zero as "renew now" and re-entered the rebind state on every pass, which also meant a renewal never actually reached the wire and the address's lifetime shrank each time. On the lab's network that was 2544 rebinds in five minutes, and is now none
-
The remote desktop shows the screen and not the memory beside it. A graphics card rounds a screen's bitmap up to the board's own pitch, and the console took its width from the bitmap, so a 1368-pixel-wide screen was served as 1600: two hundred and thirty-two columns of whatever the card had off the right-hand edge, on every frame, and seventeen per cent more data to send than the screen contains. A planar screen had the same, rounded up to sixteen
-
An encrypted connection is three to five times faster and no longer takes the machine off the network while it runs. A 4096-bit certificate -- which is what every Let's Encrypt chain ends at -- was handed to the reference arithmetic instead of the 68k routines, one silent block of about ninety seconds per handshake, and the routines that did run gave the rest of the machine a turn only seventeen times in an operation.
fetch https://www.gnu.org/goes from 100 seconds to twenty or thirty, and a machine that used to stop answering for its own address for a minute at a time now answers throughout -
NetSetupno longer writes uninitialised memory into the interface file. A call that did not passIPV6=emitted aCONFIGURE6line holding whatever was on the stack, into a file the stack reads on the next boot -
A DHCP server's domain is accepted in the forms servers actually send it: an underscore, which a great many consumer routers use, and the fully qualified form ending in a dot, which is stored without it. Refusing either left the machine with no default domain and no search suffix at all, because both come from that one option
-
A malformed DHCPv6 option no longer costs the client the configuration it already had. The DNS servers and the search list are now replaced only after the whole message has parsed, so one bad option in a Reply cannot leave the machine with neither
-
A DHCPv6 exchange that fails on a new network no longer republishes the previous network's DNS servers, and a setup that fails once no longer disables DHCPv6 for the life of the machine
-
A DHCP option that could not be read asks to be read again on the next pass, for the host name, the domain and the search list as well as the servers. One that can never succeed keeps what it has and says so once, rather than retrying forever
-
A router's advertised DNS servers and search domains expire when their lifetime runs out, and belong to the interface and the source that advertised them, so one card's advertisement no longer withdraws another's
-
Multicast name service clears its cache when asked, keeps a browse alive while more than one program is using it, retries a publication that failed, and gets its goodbye onto the wire at shutdown. A lookup across two cards no longer spends the whole timeout on the first
-
A second network card that cannot attach is dropped rather than taking the whole stack down, and
AddNetInterfacekeeps a card that could not get a link-local address instead of removing it -
telnetto a name whose first address does not answer no longer takes three minutes. The retry now draws from the timeout the caller asked for rather than starting a fresh one -
nslookupreports a record it cannot read and carries on, rather than abandoning the answer -
httpdserves a drawer containing a name too long to list, minus that entry, instead of dropping the connection for every client that asks -
The WebSocket console refuses malformed control frames, oversized control words and invalid UTF-8, and keeps pipelined input under backpressure
-
getnameinfo()no longer fails when the port has no name inDEVS:Internet/services. The flag that requires a name is about the host, and the peer's port on an accepted connection never has one -
The release archive contains
C:sshagain. The packer only copied a client somebody else had built, so an archive made any other way was simply missing it -
A connected UDP socket becomes readable again. The readability test and
FIONREADread the source port from a packet still on the receive queue, where the UDP header has not yet been stripped, so the port never matched the peer and the socket looked permanently empty;sntptimed out on every attempt andiperfin UDP mode burned each slice -
FIONREADon a datagram socket reports the payload without its UDP header, and agrees with what a peeking read returns -
A UDP socket reports an ICMP error as readable and clears it through
SO_ERROR, instead of leaving a program waiting for a datagram that will never arrive -
A datagram socket honours
shutdown(): a socket shut down for reading reports no bytes, and the disconnected state is consistent between two tasks looking at it -
A UDP or raw socket only accepts what its bind and its connect name. Datagrams from other peers, and to other local addresses, were delivered to a socket that had asked for one endpoint
-
An IPv6 link-local address keeps its zone through bind, connect, accept and receive, and a local zone is no longer confused with the peer's. An address on a machine with two cards named whichever interface the stack looked at first
-
IPv6 multicast honours the scope zone of the address, and a UDP disconnect clears the zone it was using
-
The path MTU is measured on the interface actually selected for the destination, not the first one
-
getnameinfo()withNI_NAMEREQDreturns the numeric port when the service has no name. The flag is about the host half -- the peer port on an accepted connection is ephemeral and is never inDEVS:Internet/services, so the whole call failed and the caller lost the host name that had in fact resolved -
Undefined flags to
getnameinfo()are refused rather than ignored -
A TCP socket reports its queue depths correctly. The receive walk followed a field that holds a sentinel on a ready packet -- an odd address, so a
NetStatusquery on a socket with two or more queued segments took an address error -- and Send-Q counted headers as application data -
Encrypted connections work above descriptor 255, no longer race two tasks creating a session at once, and honour
nfdswhen waiting on buffered data -
A resumed encrypted session is bound to the parameters that were cached with it, so it cannot come back with different ones
-
The router-advertised DNS servers and search domains expire when their lifetime runs out, and are owned per interface and per source, so one card's advertisement no longer withdraws another's
-
A DHCP lease's DNS servers, host name, default domain and search suffix are reconciled against what the lease actually offers, and a server withdrawn from a renewed lease is withdrawn from the resolver
-
A statically configured DNS server survives a lease withdrawal
-
Multicast service discovery retries a publication that failed, reports every publication failure rather than the first, keeps a shared browse alive while more than one program is using it, and gets its goodbye onto the wire at shutdown
-
A multicast name lookup across two cards no longer spends the whole timeout on the first one
-
httpdconditional requests compare entity tags exactly, distinguish weak from strong, and keep a complete tag list rather than the last entry -
httpdparses byte ranges without guessing, and refuses a malformed request version, a malformed header field name, an unsupported expectation, an undelimited transfer coding and an invalid WebDAVOverwritedirective -
httpdkeeps the old file until its replacement is complete, never truncates an existing file to hold a temporary, and reports a failure on the final write instead of returning success -
httpdrefuses aMOVEorCOPYwhose destination is inside its source, never deletes the source after a partial copy, and refuses a name it would have to truncate anywhere in the tree -
httpdaborts a directory listing when the scan fails, rather than serving the part it managed to read as though it were complete -
httpdmatches a WebSocket negotiation token exactly and requires an exact takeover query -
The WebSocket console rejects a non-minimal frame length, a prohibited or malformed close code, invalid UTF-8 in a text message or close reason, and enforces the message ceiling across a fragmented message
-
The WebSocket console keeps pipelined input under backpressure, evicts only at a frame boundary, preserves a queued close over a ping, and stops polling an input socket that is blocked
-
telnet,whoisandnettracefinish a write that the stack accepted only in part, instead of sending a truncated request -
telnetrenders a bare carriage return as the NVT defines it -
nslookupconfines a name to its own RDATA field, so a malformed record cannot read past it -
tftpremoves a partial download when the local write fails, and accepts the transfer port only from the server it asked -
ncandiperfhonour IPv6 for a wildcard listener and in server mode;iperfignores a truncated UDP datagram and pins a UDP run to its first peer -
nctimes out a UDP listener that never receives a first datagram -
Every command-line tool refuses a negative or overflowing numeric argument -- timeouts, units, ports, scope indices, port ranges, capture geometry and workloads -- rather than narrowing it into something else
-
A service entry without a protocol, an oversized protocol number and an oversized service port are refused by the name database
-
`SIOCGIFCON...
AmiNetXDuo 0.24.1 (NetX Duo 6.5.1, ThreadX 6.5.1)
AmiNetXDuo 0.24.1 (NetX Duo 6.5.1, ThreadX 6.5.1)
Drop AmiNetXDuo-0.24.1.lha on a Workbench
window and run Install-AmiNetXDuo.
- The installer finds the card that is in the machine. It looked for four driver names that are not files anyone ships --
ariadne2.device,amiganet.device,xsurf.device,xsurf100.device-- and had no entry at all for the Hydra or the LAN Rover, so a machine with an Ariadne II, Hydra, LAN Rover, X-Surf or X-Surf 100 could not be installed at Novice level, and at Intermediate the card list defaulted to the A2065 andDEVICE=a2065.devicewas written for whatever card was really there - The PCMCIA question is asked of somebody who chose PCMCIA. It was keyed on a position in the card list, and the list grew
- The ReadMe arrives with its icon, so it is visible in the drawer on a stock Workbench. It was copied without one, while the installer's own closing text tells the reader the ReadMe in that drawer covers the rest
0.24.0
- An interface with only IPv6 on it comes up.
CONFIGURE=NONEwas read as "static, with no address", so such a machine waited thirty seconds for a lease nobody asked for, took an RFC 3927 169.254 address it had no use for, waited fifteen seconds more and then failed to openbsdsocket.libraryat all -- leaving it with no network of either family, while five commands reported that it had no address CONFIGURE6 = DHCPasks a DHCPv6 server for an address, andCONFIGURE6 = AUTOfollows the router: a router that sets the managed bit sends the machine to the server, one that sets only the other-configuration bit is asked for name servers alone. The address is renewed, and released when the interface goes down- The stack announces the multicast groups it listens to. A switch that snoops MLD forwards multicast only where a listener has reported, so on such a segment neighbour discovery for this machine was being pruned and the first report now goes out before the machine has finished proving its own address
- A source address is chosen by the RFC 6724 rules rather than by taking the first that fits: same address, then scope, then a deprecated address only as a last resort, then the longest matching prefix, with the policy table that puts native IPv6 ahead of 6to4 and IPv4-mapped
- A listening socket no longer halves the receive window of every connection it accepts. The window was divided by the number of sockets the stack had created, and a server has two before a connection exists, so
iperf -son an 8 MB A1200 advertised 36 KB where it had 72 KB to offer - IPv6 receive is four to five times faster: 386 to 1959 kbit/s on an 8 MB A1200, with IPv4 unchanged beside it. The three read queues now share one budget instead of each holding a private number, and the IPv6 one was two frames deep because it had been sized for neighbour discovery rather than for the whole protocol
- A flood of connection attempts no longer stops the machine answering. A half-open connection costs 80 bytes in a cache instead of a socket and a held packet, and past that the machine answers without keeping any state at all. Measured on nine cards: a legitimate connection completes five times out of five during a flood that previously blocked all five
NetCapturewrites what is on the wire to a.pcapfile that Wireshark and tcpdump open, filtered by host, port or protocol.NetTracealready did this for a transfer it ran itself; this one captures what other programs are doingChangeRouteTagList()changes a route. It was in the vector table and did nothing, so a route could be added and deleted but not altered- A small write is no longer sent into a window too small to carry it, which is the sender half of RFC 1122's silly-window avoidance.
setsockopt(TCP_NODELAY, 0)is now refused rather than accepted: there is no Nagle in this stack to turn on, and reporting success said there was - A connection that nothing answered is reported as timed out, not refused. Every tool said
connection refusedwhen it had simply run out of retries, because the stack filed the same error for silence as for a reset.whoison an address with no server took 191 seconds to say the wrong thing - The 68060 build works. One file wrapped its 68020 instructions in a
.chipdirective that names 68000 again afterwards rather than restoring, so every instruction the compiler emitted after it was assembled for the wrong processor. A 68060 arm is now built in CI so it cannot break unnoticed again iperf -usays what rate it is sending at, and-b 0saysflat out. It defaults to 1000 kbit/s, which read as a fault when a measurement came back at exactly thatanxnet.devicedrives the X-Surf. The card carries its chip on a private ISA bus, where it decodes nothing until Plug and Play has isolated it and given it an address, so the driver had been claiming a card it could not use- A CI arm that tested nothing no longer reports that it passed, and the emulator arm runs again. It had been failing since the toolchain changed, because the cache pointer to the current toolchain never moved and every build on that machine quietly used the old one
anxnet.deviceposts the SANA-II events it accepts.S2EVENT_ERROR,_TX,_RX,_BUFFand_HARDWAREwere taken in the mask and never sent, so a program waiting on one waited forever.S2EVENT_SOFTWAREis now refused rather than accepted and never sentS2_PacketFilterfilters. The hook was stored and never called, so a program that installed one believed it was filtering and was not- A PCMCIA card is no longer configured and then switched back off.
CardMiscControlwrites the Gayle status register outright rather than setting bits, and the value passed one step after the configuration write cleared it, taking the socket out of I/O mode and re-enabling write protection. Every register read after that was bus noise. Emulation cannot show this: it ignores those two bits anxnet.devicerecognises the 3Com EtherLink III (3c589) in the PCMCIA slot of an A600 or A1200. It has never been run on the card it is written for: if it works, or does not, that is worth reporting- The driver's watchdog resets the chip the unit actually has. It called the DP8390 routine for every card, so on an A2065 or an Ariadne a wedged transmitter was never freed
- The console serves HAM6, HAM8 and extra half-brite screens. They were the modes a picture is most likely to be on, and they were the ones it could not show
- The console follows a screen change instead of ending on it. Opening a preferences program used to close the session, because the screen it was serving went away
- The console gives the machine back three quarters of its time. A frame is produced a band at a time and the share is counted over the whole session rather than over one band, so a program underneath keeps running while somebody is watching it
httpd -Cserves a graphics card. An RTG screen under Picasso96 or CyberGraphX appears in the browser like a chipset one, at 8, 15, 16, 24 and 32 bits, and a mode change is carried through- The console measures its own readback at the start of an RTG session and reports what each route managed, because a graphics card is far slower to read than to write and how much slower has never been published for any Amiga board
- The pointer sent to the Amiga lands where it is pointed on every screen mode. It was scaled from the display's mode bits, which say SUPERHIRES and LACE for a Productivity screen that is neither, so on those modes the two pointers diverged further the further right you pointed and moved in jumps. It now asks the display database, which is what Intuition itself does
AmiNetXDuo 0.24.0 (NetX Duo 6.5.1, ThreadX 6.5.1)
AmiNetXDuo 0.24.0 (NetX Duo 6.5.1, ThreadX 6.5.1)
Drop AmiNetXDuo-0.24.0.lha on a Workbench
window and run Install-AmiNetXDuo.
- An interface with only IPv6 on it comes up.
CONFIGURE=NONEwas read as "static, with no address", so such a machine waited thirty seconds for a lease nobody asked for, took an RFC 3927 169.254 address it had no use for, waited fifteen seconds more and then failed to openbsdsocket.libraryat all -- leaving it with no network of either family, while five commands reported that it had no address CONFIGURE6 = DHCPasks a DHCPv6 server for an address, andCONFIGURE6 = AUTOfollows the router: a router that sets the managed bit sends the machine to the server, one that sets only the other-configuration bit is asked for name servers alone. The address is renewed, and released when the interface goes down- The stack announces the multicast groups it listens to. A switch that snoops MLD forwards multicast only where a listener has reported, so on such a segment neighbour discovery for this machine was being pruned and the first report now goes out before the machine has finished proving its own address
- A source address is chosen by the RFC 6724 rules rather than by taking the first that fits: same address, then scope, then a deprecated address only as a last resort, then the longest matching prefix, with the policy table that puts native IPv6 ahead of 6to4 and IPv4-mapped
- A listening socket no longer halves the receive window of every connection it accepts. The window was divided by the number of sockets the stack had created, and a server has two before a connection exists, so
iperf -son an 8 MB A1200 advertised 36 KB where it had 72 KB to offer - IPv6 receive is four to five times faster: 386 to 1959 kbit/s on an 8 MB A1200, with IPv4 unchanged beside it. The three read queues now share one budget instead of each holding a private number, and the IPv6 one was two frames deep because it had been sized for neighbour discovery rather than for the whole protocol
- A flood of connection attempts no longer stops the machine answering. A half-open connection costs 80 bytes in a cache instead of a socket and a held packet, and past that the machine answers without keeping any state at all. Measured on nine cards: a legitimate connection completes five times out of five during a flood that previously blocked all five
NetCapturewrites what is on the wire to a.pcapfile that Wireshark and tcpdump open, filtered by host, port or protocol.NetTracealready did this for a transfer it ran itself; this one captures what other programs are doingChangeRouteTagList()changes a route. It was in the vector table and did nothing, so a route could be added and deleted but not altered- A small write is no longer sent into a window too small to carry it, which is the sender half of RFC 1122's silly-window avoidance.
setsockopt(TCP_NODELAY, 0)is now refused rather than accepted: there is no Nagle in this stack to turn on, and reporting success said there was - A connection that nothing answered is reported as timed out, not refused. Every tool said
connection refusedwhen it had simply run out of retries, because the stack filed the same error for silence as for a reset.whoison an address with no server took 191 seconds to say the wrong thing - The 68060 build works. One file wrapped its 68020 instructions in a
.chipdirective that names 68000 again afterwards rather than restoring, so every instruction the compiler emitted after it was assembled for the wrong processor. A 68060 arm is now built in CI so it cannot break unnoticed again iperf -usays what rate it is sending at, and-b 0saysflat out. It defaults to 1000 kbit/s, which read as a fault when a measurement came back at exactly thatanxnet.devicedrives the X-Surf. The card carries its chip on a private ISA bus, where it decodes nothing until Plug and Play has isolated it and given it an address, so the driver had been claiming a card it could not use- A CI arm that tested nothing no longer reports that it passed, and the emulator arm runs again. It had been failing since the toolchain changed, because the cache pointer to the current toolchain never moved and every build on that machine quietly used the old one
anxnet.deviceposts the SANA-II events it accepts.S2EVENT_ERROR,_TX,_RX,_BUFFand_HARDWAREwere taken in the mask and never sent, so a program waiting on one waited forever.S2EVENT_SOFTWAREis now refused rather than accepted and never sentS2_PacketFilterfilters. The hook was stored and never called, so a program that installed one believed it was filtering and was not- A PCMCIA card is no longer configured and then switched back off.
CardMiscControlwrites the Gayle status register outright rather than setting bits, and the value passed one step after the configuration write cleared it, taking the socket out of I/O mode and re-enabling write protection. Every register read after that was bus noise. Emulation cannot show this: it ignores those two bits anxnet.devicerecognises the 3Com EtherLink III (3c589) in the PCMCIA slot of an A600 or A1200. It has never been run on the card it is written for: if it works, or does not, that is worth reporting- The driver's watchdog resets the chip the unit actually has. It called the DP8390 routine for every card, so on an A2065 or an Ariadne a wedged transmitter was never freed
- The console serves HAM6, HAM8 and extra half-brite screens. They were the modes a picture is most likely to be on, and they were the ones it could not show
- The console follows a screen change instead of ending on it. Opening a preferences program used to close the session, because the screen it was serving went away
- The console gives the machine back three quarters of its time. A frame is produced a band at a time and the share is counted over the whole session rather than over one band, so a program underneath keeps running while somebody is watching it
httpd -Cserves a graphics card. An RTG screen under Picasso96 or CyberGraphX appears in the browser like a chipset one, at 8, 15, 16, 24 and 32 bits, and a mode change is carried through- The console measures its own readback at the start of an RTG session and reports what each route managed, because a graphics card is far slower to read than to write and how much slower has never been published for any Amiga board
- The pointer sent to the Amiga lands where it is pointed on every screen mode. It was scaled from the display's mode bits, which say SUPERHIRES and LACE for a Productivity screen that is neither, so on those modes the two pointers diverged further the further right you pointed and moved in jumps. It now asks the display database, which is what Intuition itself does
AmiNetXDuo 0.23.0 (NetX Duo 6.5.1, ThreadX 6.5.1)
AmiNetXDuo 0.23.0 (NetX Duo 6.5.1, ThreadX 6.5.1)
Drop AmiNetXDuo-0.23.0.lha on a Workbench
window and run Install-AmiNetXDuo.
httpd -Cserves this machine's display at/console. This is work in progress, and it serves the chipset's own planar screens only -- a screen on a graphics card is not shown. The browser shows the frontmost screen, so a Preferences editor that opens its own screen appears, and a change of resolution, depth or overscan is carried through. The mouse and keyboard work. A screen where nothing changes costs five bytes a frame; an idle 640x256 four-colour Workbench runs at about 33 frames a second on an A1200 and about four times that on an A3000. There is no password, and anyone who can reach the port has the screen, the keyboard, the mouse and a button that reboots the machine- The console can save a PNG of the screen, and record what it receives to a file that carries the time each frame was taken and where the pointer was
- PCMCIA cards that this driver refused now attach. The socket was never put into I/O mode before the configuration register was written, so on a write-protected socket the write was swallowed; the chip's reset register was addressed in the wrong Gayle window; a card whose CIS carries no CISTPL_FUNCID was rejected outright; and the configuration register was written at the doubled address first.
cnet.device, whose source is public domain, is what each of these was checked against anxnet.deviceno longer holds the PCMCIA slot on a machine where it found no card. Its card.resource handle was queued whether or not the slot could be owned and was never taken back out, so opening the driver once could lockcnet.deviceand every other PCMCIA driver out until the machine was rebooted- PCMCIA cards that only answer 16-bit reads on their odd-numbered registers now work. Detection probes for it and switches, so there is no second binary and nothing for you to choose
- A card whose address PROM is blank now takes its station address from the CIS if the card carries one there, and otherwise derives a stable one from this machine rather than refusing. The derived address is locally administered, is the same on every boot, and
HARDWAREADDRESSin the interface file still overrides it CheckNetDevicesays whatanxnet.devicefound: every card it looked at, the step each one reached, and why any was refused. It works when no card came up at all, which is when it is wanted, and it needs no special build- The cross toolchain is published for macOS as well as Linux, so the tree can be built on either without a container.
tools/fetch-toolchain.shpicks the one for your machine and checks it;tools/build-toolchain.shreproduces it from source, pinned to exact commits rather than branch names - A 64-bit divide by a value of 2^32 or more no longer takes the machine down. The three 64-bit shift helpers were each compiled into a call to themselves and recursed until the stack was gone; nothing in the shipped libraries divides by that much, so it was reachable rather than reached