code wiki / _hdl_build / nx_netsync_gate.nx

nx_netsync_gate.nx source

↩ module page · 483 lines · 20109 B

1// nx_netsync_gate.nx -- CERTIFICATION of nx_netsync (gamebench gap-queue rank 1: networking-multiplayer). 2// The existing nx_lockstep/nx_rollback gates prove netcode mechanisms on a TOY stepper; this gate proves 3// the same laws hold when the simulation is the REAL certified world (nx_worldsim) and the snapshots are 4// REAL save files (nx_gamesave) -- the composition the capability actually demands. 5// T1 LOCKSTEP DETERMINISM -- two peers, same commands, different within-tick arrival order, 6// 200 ticks -> checksums equal EVERY tick and shared state word-exact 7// T2 STALL-NOT-GUESS -- missing one peer's input for a tick freezes the session (no advance, no state 8// change) until it arrives; advancing on partial input is THE lockstep desync bug 9// T3 ARRIVAL-CHAOS IMMUNE -- the full 400-command schedule delivered in a shuffled order with 10// duplicates -> final state EXACTLY equals the in-order run; a conflicting resend is REFUSED 11// T4 DESYNC LOCALIZED -- a 1-unit wealth mint injected into one peer at tick 120 is first visible in 12// the checksum stream AT tick 120 (never earlier, never missed) 13// T5 ROLLBACK ON THE REAL SIM -- speculative head with predicted inputs diverges when the prediction 14// was wrong; discard + resim from the confirmed state converges bit-exact to ground truth; a 15// CORRECT prediction triggers no divergence (no false rollback) 16// T6 LATE-JOIN VIA nx_gamesave -- a peer that loads a mid-session snapshot file into a ZEROED arena 17// tracks the original checksum-for-checksum to the end (GX-9 transparency) 18// T7 BOUNDED + LOUD -- out-of-range tick/peer and conflicting input each refuse with a DISTINCT code 19// and change nothing 20// T8 ANTI-VACUITY -- the session actually traded and grew (a frozen or all-no-op world would pass 21// T1-T3 while proving nothing) 22// T9 ARTIFACT -- the final session round-trips through a real save file and RESUMES identically; 23// knowledge/nx_netsync_session.sav is the board evidence 24// license_tier: ORIGINAL expect_exit: 0 25import "nx_syscalls.nx" 26import "nx_netsync.nx" 27import "nx_gamesave.nx" 28import "nx_net_chan.nx" 29const K_MAGIC_25214903917: i64 = 25214903917 30const K_MAGIC_2654435761: i64 = 2654435761 31const K_MAGIC_100000000: i64 = 100000000 32const K_MAGIC_1000000: i64 = 1000000 33const K_MAGIC_4242: i64 = 4242 34const K_MAGIC_20260730: i64 = 20260730 35const K_MAGIC_60621: i64 = 60621 36const K_MAGIC_1785425000: i64 = 1785425000 37const K_MAGIC_9750: i64 = 9750 38const K_MAGIC_60620: i64 = 60620 39const K_MAGIC_38921: i64 = 38921 40const K_MAGIC_31337: i64 = 31337 41 42func pw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 43func pn(v: i64) -> i64 { 44 if v==0 { sys_write(1,"0" as *u8,1); return 0 } 45 var m: i64=v; if m<0 { sys_write(1,"-" as *u8,1); m=0-m } 46 let t: *u8=sys_mmap(32); var k: i64=0 47 while m>0 { t[k]=(48+(m%10)) as u8; m=m/10; k=k+1 } 48 let o: *u8=sys_mmap(32); var q: i64=k-1; var i: i64=0 49 while q>=0 { o[i]=t[q]; i=i+1; q=q-1 } 50 sys_write(1,o,i); return 0 51} 52func lcg(s: *i64) -> i64 { s[0] = ((s[0]*K_MAGIC_25214903917)+11) & 0x7FFFFFFFFFFF; return s[0] } 53 54// the deterministic command schedule -- a pure function of (tick,peer), so every session in this gate 55// independently derives the same "player decisions". ~3/4 of commands are real trade orders. 56func cmd_for(t: i64, p: i64) -> i64 { 57 var x: i64 = t*31 + p*17 + 7 58 x = (x * K_MAGIC_2654435761) & 0x7FFFFFFFFFFFFFFF 59 if x % 4 == 0 { return 0 } 60 let from: i64 = x % 6 61 var to: i64 = (x / 7) % 6 62 if to == from { to = (to + 1) % 6 } 63 let amt: i64 = 100 + ((x / 49) % 300) 64 return from*K_MAGIC_100000000 + to*K_MAGIC_1000000 + amt 65} 66 67const GMAXT: i64 = 300 68const GNFAC: i64 = 6 69// 2 peers, 300 tick capacity, 6 factions 70func mksess(a: *i64, self_id: i64, seed: i64) -> i64 { 71 ns_init(a, 2, self_id, GMAXT, GNFAC, seed) 72 let w: *i64 = ns_world(a) 73 var i: i64 = 0 74 while i < GNFAC { 75 ws_set_res(w, i, 1000 + i*250) 76 ws_set_pop(w, i, 500 + i*100) 77 ws_set_terr(w, i, 3 + i) 78 i = i + 1 79 } 80 return 0 81} 82 83func main() -> i64 { 84 pw("=== nx_netsync_gate: is multiplayer netcode safe to build on the certified parts? ===\n\n") 85 var pass: i64 = 0 86 var checks: i64 = 0 87 let W: i64 = ns_words(2, GMAXT, GNFAC) 88 let AP: *u8 = "knowledge/nx_netsync_session.sav" as *u8 89 let JP: *u8 = "knowledge/nx_netsync_join.sav" as *u8 90 // start clean -- both artifacts must be REGENERATED by this run 91 sys_unlinkat(AP) 92 sys_unlinkat(JP) 93 94 // ---------- T1 lockstep determinism on the real sim ---------- 95 checks = checks + 1 96 let A: *i64 = sys_mmap(W*8) as *i64 97 let B: *i64 = sys_mmap(W*8) as *i64 98 mksess(A, 0, K_MAGIC_4242) 99 mksess(B, 1, K_MAGIC_4242) 100 var ckok: i64 = 1 101 var t: i64 = 0 102 while t < 200 { 103 ns_offer(A, t, 0, cmd_for(t,0)); ns_offer(A, t, 1, cmd_for(t,1)) 104 ns_offer(B, t, 1, cmd_for(t,1)); ns_offer(B, t, 0, cmd_for(t,0)) 105 ns_step(A, 4); ns_step(B, 4) 106 if ns_checksum(A) != ns_checksum(B) { ckok = 0 } 107 t = t + 1 108 } 109 var t1: i64 = 0 110 if ckok==1 { if ns_shared_eq(A,B)==1 { if ns_tick(A)==200 { t1=1 } } } 111 if t1==1 { 112 pw("T1 GREEN lockstep deterministic: 2 peers, 200 ticks, different arrival order -> checksum equal every tick, shared state word-exact (ck=") 113 pn(ns_checksum(A)); pw(")\n"); pass=pass+1 114 } else { pw("T1 RED peers diverged: ckok="); pn(ckok); pw(" tick="); pn(ns_tick(A)); pw("\n") } 115 116 // ---------- T2 stall-not-guess ---------- 117 checks = checks + 1 118 let S: *i64 = sys_mmap(W*8) as *i64 119 mksess(S, 0, 777) 120 t = 0 121 while t < 50 { 122 ns_offer(S, t, 0, cmd_for(t,0)); ns_offer(S, t, 1, cmd_for(t,1)) 123 t = t + 1 124 } 125 ns_offer(S, 50, 0, cmd_for(50,0)) 126 while ns_step(S, 4)==1 {} 127 let stick: i64 = ns_tick(S) 128 let sck: i64 = ns_checksum(S) 129 let z1: i64 = ns_step(S, 4) 130 let z2: i64 = ns_step(S, 4) 131 var t2: i64 = 0 132 if stick==50 { if z1==0 { if z2==0 { if ns_checksum(S)==sck { 133 ns_offer(S, 50, 1, cmd_for(50,1)) 134 if ns_step(S, 4)==1 { if ns_tick(S)==51 { t2=1 } } 135 } } } } 136 if t2==1 { 137 pw("T2 GREEN stalls-not-guesses: missing peer-1 input froze tick at 50 (2 step attempts, state untouched); arrival unfroze to 51\n") 138 pass=pass+1 139 } else { pw("T2 RED advanced on partial input: tick="); pn(stick); pw("\n") } 140 141 // ---------- T3 arrival-chaos immune ---------- 142 checks = checks + 1 143 let list: *i64 = sys_mmap(400*8) as *i64 144 var i: i64 = 0 145 while i < 400 { list[i]=i; i=i+1 } 146 let rs: *i64 = sys_mmap(8) as *i64 147 rs[0] = K_MAGIC_20260730 148 i = 399 149 while i > 0 { 150 let j: i64 = lcg(rs) % (i+1) 151 let tmp: i64 = list[i]; list[i]=list[j]; list[j]=tmp 152 i = i - 1 153 } 154 let C: *i64 = sys_mmap(W*8) as *i64 155 mksess(C, 0, K_MAGIC_4242) 156 var acc: i64 = 0 157 var dup: i64 = 0 158 i = 0 159 while i < 400 { 160 let k: i64 = list[i] 161 let kt: i64 = k / 2 162 let kp: i64 = k % 2 163 let rc: i64 = ns_offer(C, kt, kp, cmd_for(kt,kp)) 164 if rc==1 { acc = acc + 1 } 165 if i % 8 == 0 { 166 let rc2: i64 = ns_offer(C, kt, kp, cmd_for(kt,kp)) 167 if rc2==0 { dup = dup + 1 } 168 } 169 while ns_step(C, 4)==1 {} 170 i = i + 1 171 } 172 let ck3: i64 = ns_checksum(C) 173 let rcx: i64 = ns_offer(C, 10, 0, cmd_for(10,0)+1) 174 var t3: i64 = 0 175 if ns_tick(C)==200 { if ns_shared_eq(C,A)==1 { if acc==400 { if dup==50 { 176 if rcx==NS_E_CONFLICT { if ns_checksum(C)==ck3 { t3=1 } } } } } } 177 if t3==1 { 178 pw("T3 GREEN chaos immune: 400 commands shuffled + 50 duplicates -> identical to in-order run; conflicting resend REFUSED, state untouched\n") 179 pass=pass+1 180 } else { 181 pw("T3 RED chaos diverged: tick="); pn(ns_tick(C)); pw(" eq="); pn(ns_shared_eq(C,A)) 182 pw(" acc="); pn(acc); pw(" dup="); pn(dup); pw(" rcx="); pn(rcx); pw("\n") 183 } 184 185 // ---------- T4 desync localized to the exact tick ---------- 186 checks = checks + 1 187 let A2: *i64 = sys_mmap(W*8) as *i64 188 let B2: *i64 = sys_mmap(W*8) as *i64 189 mksess(A2, 0, 999) 190 mksess(B2, 1, 999) 191 var first_diff: i64 = 0-1 192 t = 0 193 while t < 200 { 194 if t==120 { 195 let wc: *i64 = ns_world(B2) 196 wc[ws_o_res(wc)+0] = wc[ws_o_res(wc)+0] + 1 197 } 198 ns_offer(A2, t, 0, cmd_for(t,0)); ns_offer(A2, t, 1, cmd_for(t,1)) 199 ns_offer(B2, t, 0, cmd_for(t,0)); ns_offer(B2, t, 1, cmd_for(t,1)) 200 ns_step(A2, 4); ns_step(B2, 4) 201 if ns_checksum(A2) != ns_checksum(B2) { if first_diff < 0 { first_diff = t } } 202 t = t + 1 203 } 204 let mint: i64 = ws_total_res(ns_world(B2)) - ws_total_res(ns_world(A2)) 205 var t4: i64 = 0 206 if first_diff==120 { if mint==1 { t4=1 } } 207 if t4==1 { 208 pw("T4 GREEN desync localized: 1-unit mint at tick 120 first flagged AT tick 120 (0 false positives before), audit shows exactly +"); pn(mint); pw(" phantom unit\n") 209 pass=pass+1 210 } else { pw("T4 RED first_diff="); pn(first_diff); pw(" mint="); pn(mint); pw("\n") } 211 212 // ---------- T5 rollback on the real sim ---------- 213 checks = checks + 1 214 var TK: i64 = 250 215 while cmd_for(TK,1)==0 { TK = TK + 1 } 216 let GT: *i64 = sys_mmap(W*8) as *i64 217 mksess(GT, 0, 555) 218 t = 0 219 while t < TK+3 { 220 ns_offer(GT, t, 0, cmd_for(t,0)); ns_offer(GT, t, 1, cmd_for(t,1)) 221 ns_step(GT, 4) 222 t = t + 1 223 } 224 let P: *i64 = sys_mmap(W*8) as *i64 225 mksess(P, 0, 555) 226 t = 0 227 while t < TK { 228 ns_offer(P, t, 0, cmd_for(t,0)); ns_offer(P, t, 1, cmd_for(t,1)) 229 ns_step(P, 4) 230 t = t + 1 231 } 232 let H: *i64 = sys_mmap(W*8) as *i64 233 ns_copy(H, P, W) 234 t = TK 235 while t < TK+3 { 236 ns_offer(H, t, 0, cmd_for(t,0)) 237 ns_offer(H, t, 1, 0) 238 ns_step(H, 4) 239 t = t + 1 240 } 241 var mispred: i64 = 0 242 if cmd_for(TK,1) != 0 { mispred = 1 } 243 var hdiv: i64 = 0 244 if ns_shared_eq(H, GT)==0 { hdiv = 1 } 245 t = TK 246 while t < TK+3 { 247 ns_offer(P, t, 0, cmd_for(t,0)); ns_offer(P, t, 1, cmd_for(t,1)) 248 ns_step(P, 4) 249 t = t + 1 250 } 251 let conv: i64 = ns_shared_eq(P, GT) 252 var TK2: i64 = 250 253 while cmd_for(TK2,1)!=0 { TK2 = TK2 + 1 } 254 let G2: *i64 = sys_mmap(W*8) as *i64 255 mksess(G2, 0, 555) 256 t = 0 257 while t < TK2 { 258 ns_offer(G2, t, 0, cmd_for(t,0)); ns_offer(G2, t, 1, cmd_for(t,1)) 259 ns_step(G2, 4) 260 t = t + 1 261 } 262 let H2: *i64 = sys_mmap(W*8) as *i64 263 ns_copy(H2, G2, W) 264 ns_offer(H2, TK2, 0, cmd_for(TK2,0)); ns_offer(H2, TK2, 1, 0) 265 ns_step(H2, 4) 266 ns_offer(G2, TK2, 0, cmd_for(TK2,0)); ns_offer(G2, TK2, 1, cmd_for(TK2,1)) 267 ns_step(G2, 4) 268 let nofalse: i64 = ns_shared_eq(H2, G2) 269 var t5: i64 = 0 270 if mispred==1 { if hdiv==1 { if conv==1 { if nofalse==1 { t5=1 } } } } 271 if t5==1 { 272 pw("T5 GREEN rollback converges: wrong prediction at tick "); pn(TK) 273 pw(" diverged the speculative head; resim from confirmed state == ground truth bit-exact; correct prediction (tick ") 274 pn(TK2); pw(") rolled nothing back\n"); pass=pass+1 275 } else { 276 pw("T5 RED mispred="); pn(mispred); pw(" hdiv="); pn(hdiv); pw(" conv="); pn(conv) 277 pw(" nofalse="); pn(nofalse); pw("\n") 278 } 279 280 // ---------- T6 late-join via nx_gamesave ---------- 281 checks = checks + 1 282 let A3: *i64 = sys_mmap(W*8) as *i64 283 mksess(A3, 0, 888) 284 t = 0 285 while t < 150 { 286 ns_offer(A3, t, 0, cmd_for(t,0)); ns_offer(A3, t, 1, cmd_for(t,1)) 287 ns_step(A3, 4) 288 t = t + 1 289 } 290 let jw: i64 = gs_save(JP, K_MAGIC_60621, A3, W, K_MAGIC_1785425000) 291 let C3: *i64 = sys_mmap(W*8) as *i64 292 let jr: i64 = gs_load(JP, C3, W, 0 as *i64) 293 C3[1] = 1 294 var jok: i64 = 1 295 t = 150 296 while t < 200 { 297 ns_offer(A3, t, 0, cmd_for(t,0)); ns_offer(A3, t, 1, cmd_for(t,1)) 298 ns_offer(C3, t, 0, cmd_for(t,0)); ns_offer(C3, t, 1, cmd_for(t,1)) 299 ns_step(A3, 4); ns_step(C3, 4) 300 if ns_checksum(A3) != ns_checksum(C3) { jok = 0 } 301 t = t + 1 302 } 303 var t6: i64 = 0 304 if jw > 0 { if jr==W { if jok==1 { if ns_shared_eq(A3,C3)==1 { if ns_tick(C3)==200 { t6=1 } } } } } 305 if t6==1 { 306 pw("T6 GREEN late-join: peer loaded the tick-150 snapshot file ("); pn(jw) 307 pw("B) into a ZEROED arena and tracked the host checksum-for-checksum to tick 200\n"); pass=pass+1 308 } else { pw("T6 RED jw="); pn(jw); pw(" jr="); pn(jr); pw(" jok="); pn(jok); pw("\n") } 309 310 // ---------- T7 bounded + loud ---------- 311 checks = checks + 1 312 let S7: *i64 = sys_mmap(W*8) as *i64 313 mksess(S7, 0, 111) 314 let ckb: i64 = ns_checksum(S7) 315 let r1: i64 = ns_offer(S7, 0-1, 0, 5) 316 let r2: i64 = ns_offer(S7, GMAXT, 0, 5) 317 let r3: i64 = ns_offer(S7, 5, 2, 5) 318 ns_offer(S7, 5, 0, 7) 319 let r4: i64 = ns_offer(S7, 5, 0, 8) 320 let r5: i64 = ns_offer(S7, 5, 0, 7) 321 var t7: i64 = 0 322 if r1==NS_E_TICK { if r2==NS_E_TICK { if r3==NS_E_PEER { if r4==NS_E_CONFLICT { if r5==NS_DUP { 323 if ns_checksum(S7)==ckb { t7=1 } } } } } } 324 if t7==1 { 325 pw("T7 GREEN bounded+loud: tick/peer/conflict refusals distinct ("); pn(r1); pw("/"); pn(r3) 326 pw("/"); pn(r4); pw("), duplicate idempotent ("); pn(r5); pw("), shared state untouched\n"); pass=pass+1 327 } else { 328 pw("T7 RED codes r1="); pn(r1); pw(" r2="); pn(r2); pw(" r3="); pn(r3) 329 pw(" r4="); pn(r4); pw(" r5="); pn(r5); pw("\n") 330 } 331 332 // ---------- T8 anti-vacuity ---------- 333 checks = checks + 1 334 var sched_nz: i64 = 0 335 t = 0 336 while t < 200 { 337 if cmd_for(t,0)!=0 { sched_nz = sched_nz + 1 } 338 if cmd_for(t,1)!=0 { sched_nz = sched_nz + 1 } 339 t = t + 1 340 } 341 let wA: *i64 = ns_world(A) 342 var relmoved: i64 = 0 343 i = 0 344 while i < GNFAC { 345 var jj: i64 = i+1 346 while jj < GNFAC { 347 if ws_rel(wA, i, jj) != 0 { relmoved = 1 } 348 jj = jj + 1 349 } 350 i = i + 1 351 } 352 var t8: i64 = 0 353 if ns_applied(A) >= 50 { if ns_moved(A) > 0 { if ws_total_res(wA) > K_MAGIC_9750 { 354 if relmoved==1 { if sched_nz >= 100 { t8=1 } } } } } 355 if t8==1 { 356 pw("T8 GREEN anti-vacuity: "); pn(ns_applied(A)); pw(" trades moved "); pn(ns_moved(A)) 357 pw(" units over "); pn(sched_nz); pw(" real commands; wealth 9750 -> "); pn(ws_total_res(wA)) 358 pw("; relations moved -- the session actually simulates\n"); pass=pass+1 359 } else { 360 pw("T8 RED applied="); pn(ns_applied(A)); pw(" moved="); pn(ns_moved(A)) 361 pw(" total="); pn(ws_total_res(wA)); pw(" relmoved="); pn(relmoved); pw("\n") 362 } 363 364 // ---------- T9 artifact round-trip + resume ---------- 365 checks = checks + 1 366 let aw: i64 = gs_save(AP, K_MAGIC_60620, A, W, K_MAGIC_1785425000) 367 let RD: *i64 = sys_mmap(W*8) as *i64 368 let ar: i64 = gs_load(AP, RD, W, 0 as *i64) 369 var exact: i64 = 1 370 i = 0 371 while i < W { if RD[i]!=A[i] { exact=0 } i=i+1 } 372 var t9: i64 = 0 373 if aw > 0 { if ar==W { if exact==1 { 374 ns_offer(A, 200, 0, cmd_for(200,0)); ns_offer(A, 200, 1, cmd_for(200,1)) 375 ns_offer(RD, 200, 0, cmd_for(200,0)); ns_offer(RD, 200, 1, cmd_for(200,1)) 376 ns_step(A, 4); ns_step(RD, 4) 377 if ns_shared_eq(A, RD)==1 { t9=1 } 378 } } } 379 if t9==1 { 380 pw("T9 GREEN artifact: "); pn(W); pw("-word session ("); pn(aw) 381 pw("B) round-tripped through knowledge/nx_netsync_session.sav word-exact AND resumed stepping identically\n") 382 pass=pass+1 383 } else { pw("T9 RED aw="); pn(aw); pw(" ar="); pn(ar); pw(" exact="); pn(exact); pw("\n") } 384 385 // ---------- T10 REAL-SOCKET TRANSPORT (closes the declared residual) ---------- 386 // Two PROCESSES, one per peer, exchange commands over a REAL loopback TCP socket using the 387 // nx_net_chan 8-byte big-endian frame protocol -- the wire is the kernel's, not a model. 388 // Property: sessions converge tick-for-tick across the socket; final checksums exchanged OVER 389 // THE WIRE must match and the child must exit clean. A bind failure (port squat) FAILS LOUD 390 // rather than skipping -- the throwaway-port lesson: a tooth must verify its own listener. 391 checks = checks + 1 392 var t10: i64 = 0 393 let NSPORT: i64 = K_MAGIC_38921 394 let lfd: i64 = nx_sock_socket(NX_AF_INET, NX_SOCK_STREAM, NX_IPPROTO_TCP) 395 var bok: i64 = 0 396 if lfd >= 0 { 397 nx_sock_reuseaddr(lfd) 398 let sa: *u8 = sys_mmap(16) 399 nx_sock_sin_init(sa, 0x0100007F, NSPORT) 400 if nx_sock_bind(lfd, sa, 16) >= 0 { if nx_sock_listen(lfd, 1) >= 0 { bok = 1 } } 401 } 402 if bok == 0 { 403 pw("T10 RED cannot bind loopback port 38921 (squatter or perm) -- refusing to skip\n") 404 } 405 if bok == 1 { 406 let pid: i64 = sys_fork() 407 if pid == 0 { 408 let cfd: i64 = nx_sock_socket(NX_AF_INET, NX_SOCK_STREAM, NX_IPPROTO_TCP) 409 let ca: *u8 = sys_mmap(16) 410 nx_sock_sin_init(ca, 0x0100007F, NSPORT) 411 if cfd < 0 { sys_exit(9) } 412 if nx_sock_connect(cfd, ca, 16) < 0 { sys_exit(9) } 413 let nc: *NxNetChan = nx_net_chan_from_fd(cfd) 414 let SC: *i64 = sys_mmap(W*8) as *i64 415 mksess(SC, 1, K_MAGIC_31337) 416 let rvp: *i64 = sys_mmap(16) as *i64 417 var tt: i64 = 0 418 var bad: i64 = 0 419 while tt < 120 { 420 if nx_net_chan_send(nc, cmd_for(tt,1)) != 0 { bad = 1 } 421 if bad == 0 { if nx_net_chan_recv(nc, rvp) != 0 { bad = 1 } } 422 if bad == 0 { 423 ns_offer(SC, tt, 1, cmd_for(tt,1)) 424 ns_offer(SC, tt, 0, rvp[0]) 425 ns_step(SC, 4) 426 } 427 tt = tt + 1 428 } 429 if bad == 1 { sys_exit(8) } 430 let myck: i64 = ns_checksum(SC) 431 if nx_net_chan_send(nc, myck) != 0 { sys_exit(8) } 432 if nx_net_chan_recv(nc, rvp) != 0 { sys_exit(8) } 433 if rvp[0] != myck { sys_exit(7) } 434 sys_exit(0) 435 } 436 let afd: i64 = nx_sock_accept(lfd, 0 as *u8, 0 as *i64) 437 var pok: i64 = 1 438 if afd < 0 { pok = 0 } 439 var pck: i64 = 0 440 var rck: i64 = 0 441 let SP: *i64 = sys_mmap(W*8) as *i64 442 if pok == 1 { 443 let np: *NxNetChan = nx_net_chan_from_fd(afd) 444 mksess(SP, 0, K_MAGIC_31337) 445 let rp: *i64 = sys_mmap(16) as *i64 446 var tp: i64 = 0 447 while tp < 120 { 448 if nx_net_chan_send(np, cmd_for(tp,0)) != 0 { pok = 0 } 449 if pok == 1 { if nx_net_chan_recv(np, rp) != 0 { pok = 0 } } 450 if pok == 1 { 451 ns_offer(SP, tp, 0, cmd_for(tp,0)) 452 ns_offer(SP, tp, 1, rp[0]) 453 ns_step(SP, 4) 454 } 455 tp = tp + 1 456 } 457 pck = ns_checksum(SP) 458 if pok == 1 { if nx_net_chan_recv(np, rp) != 0 { pok = 0 } } 459 if pok == 1 { rck = rp[0] } 460 nx_net_chan_send(np, pck) 461 } 462 let stp: *i64 = sys_mmap(16) as *i64 463 stp[0] = 0 464 sys_wait4(pid, stp, 0) 465 let cexit: i64 = (stp[0] >> 8) & 255 466 if pok == 1 { if cexit == 0 { if rck == pck { if ns_tick(SP) == 120 { if ns_applied(SP) > 0 { 467 t10 = 1 468 } } } } } 469 if t10 == 1 { 470 pw("T10 GREEN real-socket transport: 2 processes, 120 ticks over loopback TCP (nx_net_chan 8B-BE frames), checksums exchanged OVER THE WIRE match (ck=") 471 pn(pck); pw("), child exit 0 -- the residual is closed by execution, not declaration\n") 472 pass = pass + 1 473 } else { 474 pw("T10 RED socket lockstep failed: pok="); pn(pok); pw(" child-exit="); pn(cexit) 475 pw(" pck="); pn(pck); pw(" rck="); pn(rck); pw(" tick="); pn(ns_tick(SP)); pw("\n") 476 } 477 } 478 479 pw("\n=== nx_netsync_gate "); pn(pass); pw("/"); pn(checks) 480 if pass == checks { pw(" verdict=GREEN ===\n"); return 0 } 481 pw(" RED ===\n") 482 return 1 483}