Which firmware serves *ENUM0? — Ethernet controller firmware identity¶
Date: 2026-08-10 Author: static file inspection only (no Ghidra, no live machine)
The hypothesis being tested¶
The ND-500 machine, through the NDIX Unix port (repo nd500x / source in NDIX-C),
talks to an Ethernet controller over XMSG by attaching to a media server named *ENUM0.
Separately, the COSMOS ENCOS Ethernet II firmware we have decoded serves a DIFFERENT
server named *XM-ENNS0. The question: which firmware actually serves *ENUM0 — the
ENCOS firmware (some bank/mode we missed), the ND TCP/IP firmware (product 211185), a
firmware present on disk but not yet analysed, or a firmware we do not have at all.
Method¶
grep -a/grep -aoEover every raw firmware image (.bin,.bpun,.brf,.prog,.dseg) under the Ethernet install tree.- Read of the NDIX C source in
E:\Dev\Ronny\NDIX-C\kernel\MASTER\if\. - No Ghidra, no emulator, no live machine. Static inspection only.
Table: firmware image -> server name(s) found¶
Command used per file:
grep -aoE "\*?(ENUM|ENNS|XM-ENNS|TCP)[A-Z0-9-]*" <file> | sort | uniq -c
| Firmware image (full path) | *ENUM0 |
*XM-ENNS0 |
*TCP |
Notes |
|---|---|---|---|---|
E:\Dev\Ronny\NDInsight\Installation\Communication\Ethernet\x\stripped\encos-ser-all-banks-68k.bin |
NO | YES (1) | no | ENCOS 512KB image (4 DRAM banks) |
...\x\stripped\encos-ser-b0-68k.bin |
NO | no | no | |
...\x\stripped\encos-ser-b1-68k.bin |
NO | YES (1) | no | the name lives in bank 1 |
...\x\stripped\encos-ser-b2-68k.bin |
NO | no | no | |
...\x\stripped\encos-ser-b3-68k.bin |
NO | no | no | |
...\x\encos-ser-b1-b01.bpun |
NO | YES (1) | no | raw on-card BPUN, bank 1 |
...\x\encos-ser-i-b01.dseg |
NO | YES (1) | no | |
...\x\encos-mon-i-b01.prog |
NO | YES (ENNS0..3) | no | SINTRAN-side loader; names all 4 cards |
...\x\encos-mon-ii-b01.prog |
NO | YES (ENNS0..3) | no | SINTRAN-side loader |
...\x\encos-in-b01.prog |
NO | ENNS0 (bare) |
no | |
...\x\encos-err-i-b01.brf / encos-err-ii-b01.brf |
NO | ENNS0 (bare) |
no | |
...\x\stripped\tcp-ser-all-banks-b05-68k.bin |
NO | no | YES *TCP (1) |
TCP/IP 211185 B05 512KB image |
...\x\stripped\tcp-ser-b3-b05-68k.bin |
NO | no | YES *TCP |
host seam name lives in bank 3 |
...\x\stripped\tcp-ser-b0/b1/b2-b05-68k.bin |
NO | no | (bare TCP only) |
No firmware image on disk contains the string *ENUM0 (or ENUM at all).
The only server names present in any ND Ethernet controller image we hold are
*XM-ENNS0 (ENCOS) and *TCP (TCP/IP 211185).
VERIFIED evidence for the ENCOS binary (the anchor fact)¶
File: E:\Dev\Ronny\NDInsight\Installation\Communication\Ethernet\x\stripped\encos-ser-all-banks-68k.bin
(524288 bytes = 512KB, confirmed by ls -l).
grep -aoE "\*(ENUM|ENNS|XM-ENNS)[A-Z0-9-]*" returns exactly one line: *XM-ENNS0.
grep -aoE "E(NUM|NNS)[A-Z0-9-]*" returns exactly one line: ENNS0.
No ENUM substring exists anywhere in the image. VERIFIED.
NDIX attach evidence — what name NDIX actually asks for¶
Source dir: E:\Dev\Ronny\NDIX-C\kernel\MASTER\if\
The name is built, not stored literally — *ENUMi with i = unit number¶
E:\Dev\Ronny\NDIX-C\kernel\MASTER\if\if_etregs.h, lines 55-56 (VERIFIED):
#define ET_NAM "*ENUMi"
#define SZ_NAM (sizeof(ET_NAM) - 1)
So ET_NAM is the 6-character template *ENUMi and SZ_NAM = 6.
E:\Dev\Ronny\NDIX-C\kernel\MASTER\if\if_et.c, in etinit() (VERIFIED, lines 375-376):
bcopy(ET_NAM, port, SZ_NAM);
port[SZ_NAM - 1] = '0' + unit; /* "*ENUMi" */
The last character (i) is overwritten with '0' + unit. For the first/only
controller (unit 0) the name becomes exactly *ENUM0. VERIFIED.
The same construction appears three times in the file for the three operations: - detach request build (lines 303-304), - attach request build (lines 375-376), - the down/detach path (line 1331).
How NDIX attaches (the handshake)¶
In etinit() (VERIFIED from if_et.c):
- Opens/keeps an XMSG port (
XFOPN, line 341; port number saved ines->es_portno). - Builds an XROUT letter with an XMSG header of subtype
XSLETand one parameter block carrying the server name*ENUM0(xmh(&xh,0,XSLET,SZ_NAM+2)line 370; the name is copied into the letter at line 378). - Appends an "Attach To Server" request block (
struct ac_areq) whose header type isaq.EXMHDtype = EXMTYattach(line 357), carrying the 6-byte Ethernet address (bcopy(es->es_addr, aq.EXMHDaddress, 6), line 360). - Writes the letter (
XFWRI, line 388) then sends it to XROUT (XFSND|XFROU, line 393). - Waits for the reply on
XFRRE|XFWTF(line 398) and checks the reply header type isEXMTYstatus(line 404).
So NDIX reaches the controller's media server purely as an XMSG/XROUT named-server
lookup ("attach to the server called *ENUM0"). It does not use raw shared memory for
this seam. The request-block shape (EXMTYattach / EXMTYdetach / EXMTYstatus,
EXMHDaddress) is defined in E:\Dev\Ronny\NDIX-C\kernel\MASTER\if\if_access.h.
Framing: NDIX expects DIX / Ethernet-II, not 802.3¶
VERIFIED from if_et.c and E:\Dev\Ronny\NDIX-C\kernel\MASTER\netinet\if_ether.h:
- It switches on the 16-bit
ether_typefield:ETHERTYPE_IP(0x0800),ETHERTYPE_ARP(0x0806), and trailer typesETHERTYPE_TRAIL(0x1000) (if_et.clines 691-697, 735, 740; values inif_ether.hlines 23-31). A live 16-bit EtherType field in the header is the DIX / Ethernet-II format, not the 802.3 length+LLC format. - Trailer protocol handling (
ETHERTYPE_TRAIL .. TRAIL+NTRAILER) is present but marked in the code as "minimal functionality and not used by anyone" (line 695). Inbound trailer packets are decoded; the transmit path just pads. - Minimum frame:
ETHERMIN=(60-14)= 46 payload bytes (if_ether.hline 35), i.e. the standard DIX 60-byte-minimum frame after the 14-byte header.etoutput()pads short frames up to this minimum (if_et.clines 954-955). This is the standard DIX minimum, NOT a 58-byte value. (The "58-byte minimum" figure in the task brief is NOT what the NDIX source shows; I did not find 58 anywhere.)
XFWAK bit — a KNOWN, already-settled vintage difference (not re-litigated)¶
E:\Dev\Ronny\NDIX-C\kernel\MASTER\if\xmsg.h line 112:
#define XFWAK 0x8000 (used in if_et.c lines 486, 758 as XFRREN|XFWAK|XFRMR).
NDIX therefore uses bit 15 (0x8000) for XFWAK, whereas official ND / ENCOS uses bit 14
(0x4000). This is the previously-settled difference — noted here only as a signal that
NDIX was built against a different / older XMSG option-bit convention than the ENCOS
firmware we hold. Not re-analysed.
Conclusion¶
VERIFIED facts:
- NDIX attaches to a server whose name is built as
*ENUM0(template*ENUMiinif_etregs.h, last char set to'0'+unitinif_et.cetinit()). It reaches it as an XMSG/XROUT named-server "attach" (EXMTYattach) and expects a DIX / Ethernet-II framed interface (live 16-bit EtherType, IP/ARP, DIX 60-byte minimum). - The ENCOS Ethernet II firmware serves
*XM-ENNS0and contains noENUMstring at all — confirmed on the 512KB all-banks image, the per-bank images, and the raw BPUN. - The ND TCP/IP 211185 B05 firmware serves
*TCP(host seam name in bank 3) and contains noENUMstring. - No firmware image we hold under the Ethernet install tree contains
*ENUM0/ENUM. The only controller server names present on disk are*XM-ENNS0and*TCP.
Answer to the hypothesis — option (d), with high confidence:
*ENUM0 is served by a firmware we do NOT have on disk. It is not the ENCOS
firmware (that serves *XM-ENNS0, and has no ENUM bytes in any bank or mode we can
see), and it is not the TCP/IP 211185 firmware (that serves *TCP). Ruling out (a)
and (b) is VERIFIED by the byte evidence above. Ruling out (c) — "present on disk but not
yet analysed" — is VERIFIED to the extent of the files under the Ethernet install tree:
none of them contain the string. So the controller NDIX was written to talk to ran a
third, distinct media firmware that registered the XMSG server *ENUM0.
SPECULATION (clearly marked, not verified):
- The three server-name families look like three different products/vintages of the same
ND-110063 Ethernet II board:
*XM-ENNS<n>(ENCOS / COSMOS 802.3),*TCP(211185 TCP/IP DIX gateway), and*ENUM<n>(the NDIX/ND-500-Unix media server). This is consistent with the memory note that PIOCOS is byte-identical across ENCOS and TCP builds ("same OS, different payload"), suggesting*ENUM0is yet another payload on the same PIOC-OS base. I have NOT verified this — it is a plausible pattern, not a proven fact. - The
*ENUMname plus DIX framing plus the XFWAK=0x8000 (older bit) convention suggests the NDIX media firmware is an ND-internal Unix-project build that predates or forks the COSMOS ENCOS line. UNVERIFIED.
What would settle it: obtain the on-card firmware image that came with the ND-500 /
NDIX Unix distribution (the media server that registers *ENUM0). Search the NDIX
distribution media / root images (E:\Dev\Ronny\NDIX-C\rootfs_dev*.img and any ND-500
Unix floppy/HDD dumps) for a downloadable controller image and grep it for ENUM. That
image is the missing firmware; none of the COSMOS Ethernet install files are it.