nx_listener_census_gate.nx source
↩ module page · 105 lines · 10385 B
1// Pure IPv4/IPv6 parser controls plus real same-port/different-address listeners.
2// No signals, production writes, port takeover or changes to existing CLI behavior.
3import "nx_os_introspect.nx"
4import "nx_http_server.nx"
5import "nx_gate_verdict.nx"
6const LC_FIXTURE_PORT: i64 = 48879 // BEEF in the deterministic proc-format fixtures
7const LC_FIXTURE_ROWS: i64 = 4
8const LC_V4_ADDRESS_BYTES: i64 = 16
9func lc_parse(b: *u8, family: i64, rows: *i64, addresses: *u8, capacity: i64, st: *i64) -> i64 {
10 return pon_listener_parse(b,pon_strlen(b),family,LC_FIXTURE_PORT,rows,addresses,capacity,st)
11}
12func lc_has(rows: *i64, addresses: *u8, count: i64, inode: i64, family: i64, address: *u8) -> i64 {
13 var i: i64=0; let wanted: i64=pon_strlen(address)
14 while i < count {
15 let r: i64=i*PON_L_ROW_SLOTS
16 if rows[r+PON_L_INODE] == inode && rows[r+PON_L_FAMILY] == family && rows[r+PON_L_ADDRESS_N] == wanted {
17 var p: i64=0; var matched: i64=1
18 while p < wanted { if addresses[i*PON_L_ADDRESS_STRIDE+p] != address[p] { matched=0 }; p=p+1 }
19 if matched == 1 { return 1 }
20 }; i=i+1
21 }; return 0
22}
23func lc_inode(fd: i64) -> i64 {
24 let path: *u8=sys_mmap(SYS_PATH_MAX); let link: *u8=sys_mmap(SYS_PATH_MAX)
25 if (path as i64) <= 0 || (link as i64) <= 0 { return 0-1 }
26 let pre: *u8="/proc/self/fd/" as *u8
27 var n: i64=0; while pre[n] != (0 as u8) { path[n]=pre[n]; n=n+1 }
28 pon_obs_number(path,n,fd)
29 let got: i64=sys_readlinkat(path,link,SYS_PATH_MAX)
30 var inode: i64=0-1
31 if got > 0 && got < SYS_PATH_MAX { inode=pon_obs_socket_inode(link,got) }
32 sys_munmap(path,SYS_PATH_MAX); sys_munmap(link,SYS_PATH_MAX); return inode
33}
34func main(argc: i64, argv: *i64) -> i64 {
35 if argc != 3 { gv_puts("usage: listener-census-gate unused-port read-capacity-bytes\n" as *u8); return 3 }
36 let port: i64=pon_obs_uint(argv[1] as *u8,0,pon_strlen(argv[1] as *u8))
37 let read_cap: i64=pon_obs_uint(argv[2] as *u8,0,pon_strlen(argv[2] as *u8))
38 if port <= 0 || port > PON_L_PORT_MAX || read_cap <= 0 || read_cap >= PON_OBS_I64_MAX/2 { return 3 }
39 let ctr: *i64=gv_ctr(); gv_head("LISTENER-CENSUS / exact address and inode observations" as *u8)
40 let rows: *i64=sys_mmap(LC_FIXTURE_ROWS*PON_L_ROW_SLOTS*PON_OBS_I64_BYTES) as *i64
41 let addresses: *u8=sys_mmap(LC_FIXTURE_ROWS*PON_L_ADDRESS_STRIDE)
42 let st: *i64=sys_mmap(PON_L_STATE_SLOTS*PON_OBS_I64_BYTES) as *i64
43 if (rows as i64) <= 0 || (addresses as i64) <= 0 || (st as i64) <= 0 { return 3 }
44 let v4: *u8="sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode\n0: 0100007F:BEEF 00000000:0000 0A 0:0 00:0 0 0 0 101\n1: 0200007F:BEEF 00000000:0000 0A 0:0 00:0 0 0 0 102\n2: 0100007F:BEEF 00000000:0000 01 0:0 00:0 0 0 0 103\n3: 0100007F:CAFE 00000000:0000 0A 0:0 00:0 0 0 0 104\n" as *u8
45 let v6: *u8="sl local_address remote_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode\n0: 00000000000000000000000001000000:BEEF 00000000000000000000000000000000:0000 0A 0:0 00:0 0 0 0 201\n" as *u8
46 let h4: *u8=" sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode \n" as *u8
47 let h6: *u8=" sl local_address remote_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode\n" as *u8
48 pon_listener_init(st)
49 gv_check("two-byte pseudo-header cannot certify empty table" as *u8,lc_parse("sl" as *u8,PON_L_FAMILY4,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_UNKNOWN && st[PON_L_STORED] == 0,ctr)
50 pon_listener_init(st)
51 gv_check("newline does not legitimize abbreviated header" as *u8,lc_parse("sl\n" as *u8,PON_L_FAMILY4,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_UNKNOWN && st[PON_L_FIRST_STAGE] == PON_L_STAGE_PARSE,ctr)
52 pon_listener_init(st)
53 gv_check("actual full IPv4 header-only table is complete and empty" as *u8,lc_parse(h4,PON_L_FAMILY4,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_COMPLETE && st[PON_L_MATCHES] == 0,ctr)
54 pon_listener_init(st)
55 gv_check("actual full IPv6 header-only table is complete and empty" as *u8,lc_parse(h6,PON_L_FAMILY6,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_COMPLETE && st[PON_L_MATCHES] == 0,ctr)
56 pon_listener_init(st)
57 gv_check("IPv6 requires its observed remote-address header alias" as *u8,lc_parse(h4,PON_L_FAMILY6,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_UNKNOWN,ctr)
58 pon_listener_init(st)
59 lc_parse(v4,PON_L_FAMILY4,rows,addresses,LC_FIXTURE_ROWS,st)
60 gv_check("bad second-family header preserves prior rows and uncertainty" as *u8,lc_parse("sl\n" as *u8,PON_L_FAMILY6,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_UNKNOWN && st[PON_L_STORED] == 2 && lc_has(rows,addresses,st[PON_L_STORED],101,PON_L_FAMILY4,"0100007F" as *u8) == 1,ctr)
61 pon_listener_init(st)
62 lc_parse("sl\n" as *u8,PON_L_FAMILY4,rows,addresses,LC_FIXTURE_ROWS,st)
63 gv_check("valid second-family rows cannot erase prior uncertainty" as *u8,lc_parse(v6,PON_L_FAMILY6,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_UNKNOWN && st[PON_L_STORED] == 1 && lc_has(rows,addresses,st[PON_L_STORED],201,PON_L_FAMILY6,"00000000000000000000000001000000" as *u8) == 1,ctr)
64 pon_listener_init(st)
65 gv_check("IPv4 parser complete" as *u8,lc_parse(v4,PON_L_FAMILY4,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_COMPLETE,ctr)
66 gv_check("all same-port addresses retained without unrelated state or port" as *u8,st[PON_L_STORED] == 2 && st[PON_L_MATCHES] == 2,ctr)
67 gv_check("first raw address and inode exact" as *u8,lc_has(rows,addresses,st[PON_L_STORED],101,PON_L_FAMILY4,"0100007F" as *u8),ctr)
68 gv_check("second raw address and inode exact" as *u8,lc_has(rows,addresses,st[PON_L_STORED],102,PON_L_FAMILY4,"0200007F" as *u8),ctr)
69 gv_check("IPv6 appends without collapsing IPv4" as *u8,lc_parse(v6,PON_L_FAMILY6,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_COMPLETE && st[PON_L_STORED] == 3,ctr)
70 gv_check("IPv6 full kernel address and inode exact" as *u8,lc_has(rows,addresses,st[PON_L_STORED],201,PON_L_FAMILY6,"00000000000000000000000001000000" as *u8),ctr)
71 gv_check("repeated matching source rows remain distinct" as *u8,lc_parse(v6,PON_L_FAMILY6,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_COMPLETE && st[PON_L_STORED] == 4,ctr)
72 gv_check("row capacity refuses while retaining matching census" as *u8,lc_parse(v6,PON_L_FAMILY6,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_CAPACITY && st[PON_L_MATCHES] == 5 && st[PON_L_STORED] == 4,ctr)
73 pon_listener_init(st)
74 gv_check("malformed port is unknown parse state" as *u8,lc_parse("sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode\n0: 0100007F:BEZG 0 0A\n" as *u8,PON_L_FAMILY4,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_UNKNOWN && st[PON_L_FIRST_STAGE] == PON_L_STAGE_PARSE,ctr)
75 pon_listener_init(st)
76 gv_check("overflow inode is refused" as *u8,lc_parse("sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode\n0: 0100007F:BEEF 0 0A 0 0 0 0 0 9223372036854775808\n" as *u8,PON_L_FAMILY4,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_UNKNOWN && st[PON_L_STORED] == 0,ctr)
77 pon_listener_init(st)
78 gv_check("missing header does not become complete" as *u8,lc_parse("0: 0100007F:BEEF 0 0A 0 0 0 0 0 101\n" as *u8,PON_L_FAMILY4,rows,addresses,LC_FIXTURE_ROWS,st) == PON_OBS_UNKNOWN,ctr)
79 pon_listener_init(st)
80 gv_check("actual missing proc file preserves open error" as *u8,pon_listener_file("/proc/self/nishi-listener-census-not-a-proc-entry" as *u8,PON_L_FAMILY4,port,rows,addresses,LC_FIXTURE_ROWS,read_cap,st) == PON_OBS_UNKNOWN && st[PON_L_FIRST_STAGE] == PON_L_STAGE_OPEN && st[PON_L_FILES_COMPLETE] == 0,ctr)
81 let addr: *u8=sys_mmap(LC_V4_ADDRESS_BYTES); let verdict: *i64=sys_mmap(PON_OBS_I64_BYTES) as *i64
82 if (addr as i64) <= 0 || (verdict as i64) <= 0 { return 3 }
83 nx_http_server_addr_loopback(addr,port)
84 let first: i64=nx_http_server_listen(addr,1,verdict)
85 gv_check("first private loopback listener binds" as *u8,first >= 0,ctr)
86 if first < 0 { return gv_verdict("LISTENER-CENSUS" as *u8,ctr,"occupied port refused; no takeover" as *u8) }
87 nx_http_server_make_sockaddr(addr,port,127,0,0,2)
88 let second: i64=nx_http_server_listen(addr,1,verdict)
89 gv_check("second address same-port listener binds" as *u8,second >= 0,ctr)
90 if second < 0 { sys_close(first); return gv_verdict("LISTENER-CENSUS" as *u8,ctr,"second address unavailable; own first listener closed" as *u8) }
91 let inode1: i64=lc_inode(first); let inode2: i64=lc_inode(second)
92 gv_check("two actual fd inodes obtained" as *u8,inode1 > 0 && inode2 > 0 && inode1 != inode2,ctr)
93 let rc: i64=pon_observe_listeners(port,rows,addresses,LC_FIXTURE_ROWS,read_cap,st)
94 gv_check("actual IPv4 and IPv6 files fully observed" as *u8,rc == PON_OBS_COMPLETE && st[PON_L_FILES_COMPLETE] == 2,ctr)
95 gv_check("actual first address inode retained" as *u8,lc_has(rows,addresses,st[PON_L_STORED],inode1,PON_L_FAMILY4,"0100007F" as *u8),ctr)
96 gv_check("actual second address inode retained" as *u8,lc_has(rows,addresses,st[PON_L_STORED],inode2,PON_L_FAMILY4,"0200007F" as *u8),ctr)
97 gv_puts("listener_state=" as *u8); gv_num(rc); gv_puts(" matches=" as *u8); gv_num(st[PON_L_MATCHES]); gv_puts(" bytes=" as *u8); gv_num(st[PON_L_BYTES]); gv_puts(" error=" as *u8); gv_num(st[PON_L_FIRST_ERROR]); gv_puts(" stage=" as *u8); gv_num(st[PON_L_FIRST_STAGE]); gv_puts("\n" as *u8)
98 let short: i64=pon_observe_listeners(port,rows,addresses,LC_FIXTURE_ROWS,1,st)
99 gv_check("real input byte capacity refuses without parsing prefix" as *u8,short == PON_OBS_CAPACITY && st[PON_L_STORED] == 0 && st[PON_L_FILES_COMPLETE] == 0 && st[PON_L_FIRST_STAGE] == PON_L_STAGE_READ,ctr)
100 let zero: i64=pon_observe_listeners(port,0 as *i64,0 as *u8,0,read_cap,st)
101 gv_check("real output row capacity refuses with observed match count" as *u8,zero == PON_OBS_CAPACITY && st[PON_L_MATCHES] >= 2 && st[PON_L_STORED] == 0,ctr)
102 gv_check("second owned listener closed" as *u8,sys_close(second) == 0,ctr)
103 gv_check("first owned listener closed" as *u8,sys_close(first) == 0,ctr)
104 return gv_verdict("LISTENER-CENSUS" as *u8,ctr,"all matching socket rows; no process identity or restart authority; IPv6 parser tested synthetically" as *u8)
105}