Skip to content

Releases: tinic/AmiNetXDuo

AmiNetXDuo 0.25.5 (NetX Duo 6.5.1, ThreadX 6.5.1)

Choose a tag to compare

@tinic tinic released this 26 Aug 02:17

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_OFFLINE are unit commands and every interface on one unit shares one wire, so on a card with two interfaces on UNIT=0 the 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. CheckNetDevice and 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)

Choose a tag to compare

@tinic tinic released this 25 Aug 23:56

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.device for the Pi's gigabit Ethernet and wifipi.device for 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 of bsdsocket.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 with cmake -DAMINETXDUO_MAX_INTERFACES=2
  • An AddNetInterface that 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 GATEWAY cannot be reached still comes up. A next hop on no network this machine is on is refused by the stack, and AddNetInterface treated 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
  • NetShutdown takes 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 stopped S2_OFFLINE ever reaching that interface again -- and a2065.device 2.16 ignores AbortIO(), 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 the TCP: handler was never asked to go down, so the first machine to open TCP: kept a Process, its DOS entry and 371,648 bytes for the rest of that boot, with bsdsocket.library unable 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, Profile and profspin were resolving __udivdi3 out 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() or WaitForChar() 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. And ConfigureNetInterface told a user with a working DHCP client that the machine had none, because the client being mid-allocation answers EBUSY and only one of the four possible errors was being read

0.25.3

  • DEVS:NetInterfaces may 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, so CheckNetConfig went 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, so AddNetInterface wifi0 on a machine that also had eth0 and eth1 was 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 third AddNetInterface is 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 -i and in ShowNetStatus, 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, COPYMODE and MULTICAST, 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's netstat -i was thirty-three lines, twenty-one of them that lecture, before the table, and ShowNetStatus DHCP answered 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 by AddNetInterface once rather than five times, which is how often it reads the file
  • netstat -i names 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 fact ShowNetStatus reports as the defined state
  • 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.device measure time rather than counting instructions. Every one of th...
Read more

AmiNetXDuo 0.25.3 (NetX Duo 6.5.1, ThreadX 6.5.1)

Choose a tag to compare

@tinic tinic released this 25 Aug 23:15

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:NetInterfaces may 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, so CheckNetConfig went 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, so AddNetInterface wifi0 on a machine that also had eth0 and eth1 was 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 third AddNetInterface is 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 -i and in ShowNetStatus, 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, COPYMODE and MULTICAST, 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's netstat -i was thirty-three lines, twenty-one of them that lecture, before the table, and ShowNetStatus DHCP answered 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 by AddNetInterface once rather than five times, which is how often it reads the file
  • netstat -i names 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 fact ShowNetStatus reports as the defined state
  • 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.device measure 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. CheckNetDevice prints 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-PSS is the one signature algorithm in X.509 whose parameters are not NULL, the parser refused the SEQUENCE they 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:03 one boot and 40:4c:00:10:09:db the next, where the card's real address is 00: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. CheckNetDevice counts 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
  • httpd answers 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 an ADDRESS still picks that address's family, which is what naming one asks for
  • httpd <drawer> -C starts from S:User-Startup, which is the machine that most wants it. Intuition's screen list is empty until something opens a screen, and LoadWB is at the end of the st...
Read more

AmiNetXDuo 0.25.2 (NetX Duo 6.5.1, ThreadX 6.5.1)

Choose a tag to compare

@github-actions github-actions released this 22 Aug 00:52

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 opens AmiTCP:libs/usergroup.library as a file finds one. 0.25.1 made ixemul clients work by holding usergroup.library open, which satisfies a path-qualified OpenLibrary because Exec falls back to matching the file part; that does nothing for a program which Locks or Opens the path instead. The installer makes the assign and writes it into S: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.library 395,328 to 352,960, tls.library 242,312 to 188,312, usergroup.library 7,684 to 7,172, and anxnet.device 33,228 to 30,540. Nothing about the code changed; the toolchain can now do link-time optimisation, and anxnet.device was additionally being built -O2 for 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.sh installs, and refuses an older one rather than producing something subtly wrong. The previous pin cannot do link-time optimisation at all -- its ld answers -plugin PLUGIN (ignored) -- and its own gcc revision no longer exists upstream, so tools/build-toolchain.sh could not fetch it either

0.25.1

  • Programs built against ixemul.library work. wget and every other GeekGadgets client reaches the network through ixnet.library, which opens bsdsocket.library and then looks for usergroup.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 and ping worked. The library now holds usergroup.library open 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

  • NetSetup no longer writes uninitialised memory into the interface file. A call that did not pass IPV6= emitted a CONFIGURE6 line 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 AddNetInterface keeps a card that could not get a link-local address instead of removing it

  • telnet to 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

  • nslookup reports a record it cannot read and carries on, rather than abandoning the answer

  • httpd serves 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 in DEVS: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:ssh again. 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 FIONREAD read 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; sntp timed out on every attempt and iperf in UDP mode burned each slice

  • FIONREAD on 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() with NI_NAMEREQD returns 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 in DEVS: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 NetStatus query 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 nfds when 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...

Read more

AmiNetXDuo 0.25.1 (NetX Duo 6.5.1, ThreadX 6.5.1)

Choose a tag to compare

@github-actions github-actions released this 21 Aug 03:40

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. wget and every other GeekGadgets client reaches the network through ixnet.library, which opens bsdsocket.library and then looks for usergroup.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 and ping worked. The library now holds usergroup.library open 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

  • NetSetup no longer writes uninitialised memory into the interface file. A call that did not pass IPV6= emitted a CONFIGURE6 line 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 AddNetInterface keeps a card that could not get a link-local address instead of removing it

  • telnet to 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

  • nslookup reports a record it cannot read and carries on, rather than abandoning the answer

  • httpd serves 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 in DEVS: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:ssh again. 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 FIONREAD read 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; sntp timed out on every attempt and iperf in UDP mode burned each slice

  • FIONREAD on 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() with NI_NAMEREQD returns 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 in DEVS: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 NetStatus query 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 nfds when 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

  • httpd conditional requests compare entity tags exactly, distinguish weak from strong, and keep a complete tag list rather than the last entry

  • httpd parses 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 WebDAV Overwrite directive

  • httpd keeps 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

  • httpd refuses a MOVE or COPY whose 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

  • httpd aborts a directory listing when the scan fails, rather than serving the part it managed to read as though it were complete

  • httpd matches 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, whois and nettrace finish a write that the stack accepted only in part, instead of sending a truncated request

  • telnet renders a bare carriage return as the NVT defines it

  • nslookup confines a name to its own RDATA field, so a malformed record cannot read past it

  • tftp removes a partial download when the local write fails, and accepts the transfer port only from the server it asked

  • nc and iperf honour IPv6 for a wildc...

Read more

m68k-amigaos-gcc 16.2.1 (LTO-capable)

Choose a tag to compare

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.so linked, so bare ar, ranlib and nm are 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)

Choose a tag to compare

@github-actions github-actions released this 20 Aug 22:44

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

  • NetSetup no longer writes uninitialised memory into the interface file. A call that did not pass IPV6= emitted a CONFIGURE6 line 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 AddNetInterface keeps a card that could not get a link-local address instead of removing it

  • telnet to 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

  • nslookup reports a record it cannot read and carries on, rather than abandoning the answer

  • httpd serves 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 in DEVS: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:ssh again. 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 FIONREAD read 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; sntp timed out on every attempt and iperf in UDP mode burned each slice

  • FIONREAD on 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() with NI_NAMEREQD returns 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 in DEVS: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 NetStatus query 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 nfds when 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

  • httpd conditional requests compare entity tags exactly, distinguish weak from strong, and keep a complete tag list rather than the last entry

  • httpd parses 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 WebDAV Overwrite directive

  • httpd keeps 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

  • httpd refuses a MOVE or COPY whose 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

  • httpd aborts a directory listing when the scan fails, rather than serving the part it managed to read as though it were complete

  • httpd matches 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, whois and nettrace finish a write that the stack accepted only in part, instead of sending a truncated request

  • telnet renders a bare carriage return as the NVT defines it

  • nslookup confines a name to its own RDATA field, so a malformed record cannot read past it

  • tftp removes a partial download when the local write fails, and accepts the transfer port only from the server it asked

  • nc and iperf honour IPv6 for a wildcard listener and in server mode; iperf ignores a truncated UDP datagram and pins a UDP run to its first peer

  • nc times 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...

Read more

AmiNetXDuo 0.24.1 (NetX Duo 6.5.1, ThreadX 6.5.1)

Choose a tag to compare

@github-actions github-actions released this 18 Aug 05:57

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 and DEVICE=a2065.device was 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=NONE was 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 open bsdsocket.library at all -- leaving it with no network of either family, while five commands reported that it had no address
  • CONFIGURE6 = DHCP asks a DHCPv6 server for an address, and CONFIGURE6 = AUTO follows 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 -s on 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
  • NetCapture writes what is on the wire to a .pcap file that Wireshark and tcpdump open, filtered by host, port or protocol. NetTrace already did this for a transfer it ran itself; this one captures what other programs are doing
  • ChangeRouteTagList() 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 refused when it had simply run out of retries, because the stack filed the same error for silence as for a reset. whois on 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 .chip directive 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 -u says what rate it is sending at, and -b 0 says flat out. It defaults to 1000 kbit/s, which read as a fault when a measurement came back at exactly that
  • anxnet.device drives 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.device posts the SANA-II events it accepts. S2EVENT_ERROR, _TX, _RX, _BUFF and _HARDWARE were taken in the mask and never sent, so a program waiting on one waited forever. S2EVENT_SOFTWARE is now refused rather than accepted and never sent
  • S2_PacketFilter filters. 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. CardMiscControl writes 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.device recognises 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 -C serves 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)

Choose a tag to compare

@github-actions github-actions released this 18 Aug 05:34

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=NONE was 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 open bsdsocket.library at all -- leaving it with no network of either family, while five commands reported that it had no address
  • CONFIGURE6 = DHCP asks a DHCPv6 server for an address, and CONFIGURE6 = AUTO follows 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 -s on 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
  • NetCapture writes what is on the wire to a .pcap file that Wireshark and tcpdump open, filtered by host, port or protocol. NetTrace already did this for a transfer it ran itself; this one captures what other programs are doing
  • ChangeRouteTagList() 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 refused when it had simply run out of retries, because the stack filed the same error for silence as for a reset. whois on 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 .chip directive 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 -u says what rate it is sending at, and -b 0 says flat out. It defaults to 1000 kbit/s, which read as a fault when a measurement came back at exactly that
  • anxnet.device drives 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.device posts the SANA-II events it accepts. S2EVENT_ERROR, _TX, _RX, _BUFF and _HARDWARE were taken in the mask and never sent, so a program waiting on one waited forever. S2EVENT_SOFTWARE is now refused rather than accepted and never sent
  • S2_PacketFilter filters. 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. CardMiscControl writes 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.device recognises 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 -C serves 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)

Choose a tag to compare

@github-actions github-actions released this 15 Aug 08:08

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 -C serves 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.device no 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 lock cnet.device and 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 HARDWAREADDRESS in the interface file still overrides it
  • CheckNetDevice says what anxnet.device found: 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.sh picks the one for your machine and checks it; tools/build-toolchain.sh reproduces 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