code wiki / _hdl_build / _pe_dchan_reorder.nx
_pe_dchan_reorder.nx source
↩ module page · 109 lines · 6212 B
1// _pe_dchan_reorder.nx -- X-ROOM-DC-003 rung-3 RELIABILITY DATA PLANE (the ACTION layer the spec
2// flagged as the emitter frontier: "seq-number arithmetic + payload reorder-buffer ... wired at
3// integration"). COMPOSES the organ-authored FSM control core _pe_dchan_arq (states/transitions =
4// WHEN to retransmit) with the data-plane ACTIONS (WHAT: in-order delivery under loss+reorder).
5// dp_recv: a sliding-window reorder buffer -- buffer out-of-order seqs, deliver contiguous from
6// base, dedup old seqs, drop out-of-window, cumulative-ack = base (next expected). This is the
7// N-party correctness layer (a 2-peer TCP room gets order free; N>2 / late-join needs this).
8// HONEST AUTHORSHIP (memory discipline): the FSM TABLE is organ-emitted (_pe_dchan_arq); these
9// ACTIONS are hand-built -- a DECLARED SCAFFOLD, emitter-of-emitters back-fill OWED (X-AUT-012 class).
10// Gate is self-validating: FSM send/ack/timeout-retransmit control + reorder/loss/dup data plane,
11// with a neg-control (a broken pass-through would deliver out-of-order -> RED).
12import "_pe_dchan_arq.nx"
13
14func dr_w(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 }
15func dr_n(fd: i64, v: i64) -> i64 {
16 let bb: *u8 = sys_mmap(28); var m: i64 = v; if m < 0 { sys_write(fd, "-" as *u8, 1); m = 0 - m }
17 let t: *u8 = sys_mmap(28); var k: i64 = 0; if m == 0 { t[0] = 48 as u8; k = 1 }
18 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
19 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(fd, bb, k); return 0
20}
21// receive one (seq,payload) into the reorder buffer over window WIN. present[]/payl[] are WIN-sized
22// ring slots; base_box[0] = next-expected seq. On a contiguous run, deliver into got[] (append at
23// ng_box[0]). dedup seq<base, drop seq>=base+WIN. Returns the cumulative ack (= new base).
24func dp_recv(seq: i64, payload: i64, present: *i64, payl: *i64, base_box: *i64, WIN: i64, got: *i64, ng_box: *i64) -> i64 {
25 let base: i64 = base_box[0]
26 if seq < base { return base } // old/duplicate -> already delivered, re-ack
27 if seq >= base + WIN { return base } // out of window -> cannot buffer (sender backs off)
28 let slot: i64 = seq % WIN
29 present[slot] = 1
30 payl[slot] = payload
31 var b: i64 = base_box[0]
32 var go: i64 = 1
33 while go == 1 {
34 let bs: i64 = b % WIN
35 if present[bs] == 1 {
36 got[ng_box[0]] = payl[bs] // DELIVER in order
37 ng_box[0] = ng_box[0] + 1
38 present[bs] = 0
39 b = b + 1
40 } else { go = 0 }
41 }
42 base_box[0] = b
43 return b
44}
45func main(argc: i64, argv: *i64) -> i64 {
46 // ---- PART A: FSM CONTROL (the organ-authored core) -- a send/ack/timeout cycle ----
47 // ESTABLISHED_IDLE(2) --app-send(2)--> AWAIT_ACK(3) --timeout(4)retransmit--> AWAIT_ACK(3)
48 // --data-ack(3)--> ESTABLISHED_IDLE(2)
49 var ctl_ok: i64 = 1
50 if _pe_dchan_arq_step(2, 2) != 3 { ctl_ok = 0 } // send -> AWAIT_ACK
51 if _pe_dchan_arq_step(3, 4) != 3 { ctl_ok = 0 } // timeout -> retransmit (self-loop)
52 if _pe_dchan_arq_step(3, 3) != 2 { ctl_ok = 0 } // ack -> ESTABLISHED_IDLE
53 if _pe_dchan_arq_step(2, 5) != 4 { ctl_ok = 0 } // close -> CLOSED
54 // a full connect+send+ack run ends ESTABLISHED_IDLE(2): open,synack,send,ack
55 let ev: *i64 = sys_mmap(8 * 4) as *i64
56 ev[0] = 0; ev[1] = 1; ev[2] = 2; ev[3] = 3
57 if _pe_dchan_arq_run(ev, 4, 0) != 2 { ctl_ok = 0 }
58
59 // ---- PART B: DATA PLANE -- reorder/loss/dup, must deliver 0..N-1 in order exactly once ----
60 let WIN: i64 = 8
61 let N: i64 = 16
62 let present: *i64 = sys_mmap(WIN * 8) as *i64
63 let payl: *i64 = sys_mmap(WIN * 8) as *i64
64 let got: *i64 = sys_mmap(64 * 8) as *i64
65 let base_box: *i64 = sys_mmap(8) as *i64
66 let ng_box: *i64 = sys_mmap(8) as *i64
67 base_box[0] = 0; ng_box[0] = 0
68 // schedule: every adjacent pair swapped (reorder), dups (2,6 twice), gap-then-fill (11 before 10
69 // = loss-of-10-then-retransmit). payload == seq so we can assert delivered == 0..N-1.
70 let sched: *i64 = sys_mmap(40 * 8) as *i64
71 let SL: i64 = 19
72 sched[0]=1; sched[1]=0; sched[2]=3; sched[3]=2; sched[4]=2; sched[5]=5; sched[6]=4
73 sched[7]=7; sched[8]=6; sched[9]=6; sched[10]=9; sched[11]=8; sched[12]=11; sched[13]=10
74 sched[14]=13; sched[15]=12; sched[16]=15; sched[17]=14; sched[18]=14
75 var i: i64 = 0
76 while i < SL { dp_recv(sched[i], sched[i], present, payl, base_box, WIN, got, ng_box); i = i + 1 }
77 // assert: delivered count == N, and got[k]==k (in order, complete, exactly once)
78 var data_ok: i64 = 1
79 if ng_box[0] != N { data_ok = 0 }
80 var k: i64 = 0
81 while k < N { if got[k] != k { data_ok = 0 } k = k + 1 }
82
83 // ---- NEG control: out-of-window seq must NOT deliver (drop) ----
84 let p2: *i64 = sys_mmap(WIN * 8) as *i64
85 let y2: *i64 = sys_mmap(WIN * 8) as *i64
86 let g2: *i64 = sys_mmap(8 * 8) as *i64
87 let bb2: *i64 = sys_mmap(8) as *i64
88 let ng2: *i64 = sys_mmap(8) as *i64
89 bb2[0] = 0; ng2[0] = 0
90 dp_recv(WIN + 5, 999, p2, y2, bb2, WIN, g2, ng2) // seq 13 with base 0, WIN 8 -> out of window
91 var neg_ok: i64 = 0
92 if ng2[0] == 0 { neg_ok = 1 } // nothing delivered = correctly dropped
93
94 let ok: i64 = ctl_ok * data_ok * neg_ok
95 dr_w(1, "DCHAN-RELIABILITY ctl_ok=" as *u8); dr_n(1, ctl_ok)
96 dr_w(1, " delivered=" as *u8); dr_n(1, ng_box[0]); dr_w(1, " data_ok=" as *u8); dr_n(1, data_ok)
97 dr_w(1, " neg_ok=" as *u8); dr_n(1, neg_ok); dr_w(1, "\n" as *u8)
98 let lf: i64 = sys_openat_append("knowledge/status/dchan_reliability.log" as *u8, 420)
99 if lf >= 0 {
100 dr_w(lf, "DCHAN-RELIABILITY X-ROOM-DC-003 ctl_ok=" as *u8); dr_n(lf, ctl_ok)
101 dr_w(lf, " delivered=" as *u8); dr_n(lf, ng_box[0]); dr_w(lf, " data_ok=" as *u8); dr_n(lf, data_ok)
102 dr_w(lf, " neg_ok=" as *u8); dr_n(lf, neg_ok)
103 if ok == 1 { dr_w(lf, " verdict=GREEN\n" as *u8) } else { dr_w(lf, " verdict=RED\n" as *u8) }
104 sys_close(lf)
105 }
106 if ok == 1 { sys_exit(0) }
107 sys_exit(1)
108 return 1
109}