code wiki / (root) / nx_listener_census_gate.nx

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}