From 0a61c07d591273b76da21fb8386b669989da3707 Mon Sep 17 00:00:00 2001 From: rsc Date: Mon, 19 Apr 2004 18:18:37 +0000 Subject: acid files --- acid/network | 169 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 acid/network (limited to 'acid/network') diff --git a/acid/network b/acid/network new file mode 100644 index 00000000..ea6f9922 --- /dev/null +++ b/acid/network @@ -0,0 +1,169 @@ +_ni=0; // network indent level + +defn +_ni() { + loop 1,_ni do { + print("\t"); + } +} + +defn +ipdev(n) { + _ipfs(*(ipfs+4*n)); +} + +// the funny _foo/foo pairs exist so that if we get +// interrupted in the middle of one of these, _ni will +// get reset to 0 next time an external call happens. + +defn +_ipfs(fs) { + complex Fs fs; + local i; + + print("ipfs(", fs\X, ") #I", fs.dev\D, "\n"); + i=0; + _ni = _ni+1; + while i < fs.np do { + _proto(*(fs.p+i*4)); + i = i + 1; + } + _ni = _ni-1; +} + +defn +ipfs(fs) { + _ni = 0; + _ipfs(fs); +} + +defn +_proto(p) { + local c; + complex Proto p; + _ni(); + print("proto(", p\X, ") ", *(p.name\s), "\n"); + _ni = _ni+1; + local i; + i = 0; + while i < p.nc do { + c = *(p.conv+i*4); + complex Conv c; + if c != 0 && c.inuse then + _conv(*(p.conv+i*4)); + i = i + 1; + } + _ni = _ni - 1; +} + +defn +proto(p) { + _ni = 0; + _proto(p); +} + +defn +_conv(c) { + complex Conv c; + _ni(); + local p; + p = c.p; + complex Proto p; + print("conv(", c\X, ") ", *(p.name\s), "/", c.x\D, " ", + iptostr(*(c.laddr+12)), "!", c.lport\D, " ", iptostr(*(c.raddr+12)), + "!", c.rport\D, " rq ", qtostr(c.rq), " wq ", qtostr(c.wq), + " eq ", qtostr(c.eq), "\n"); +} + +defn +conv(c) { + _ni = 0; + _conv(c); +} + +defn +iptostr(a) +{ + // BUG: little endian + return itoa(a&0xFF)+"."+itoa((a>>8)&0xFF)+"."+itoa((a>>16)&0xFF)+"."+itoa((a>>24)&0xFF); +} + +defn +qtostr(q) +{ + complex Queue q; + + return "queue("+itoa(q, "%lux")+") ["+itoa(q.len, "%d")+","+itoa(q.dlen, "%d")+","+itoa(qblocks(q), "%d")+"]"; +} + +defn +qblocks(q) +{ + complex Queue q; + local b, n; + + b = q.bfirst; + n = 0; + while b != 0 do { + n = n + 1; + complex Block b; + b = b.next; + } + return n; +} + +defn +_queue(q) +{ + complex Queue q; + local b; + + print("queue(", q\X, ") len ", q.len\D, " dlen ", q.dlen\D, " limit ", q.limit\D, " nblocks ", qblocks(q)\D); + if q.state & Qstarve then + print(" starve"); + if q.state & Qmsg then + print(" msg"); + if q.state & Qclosed then + print(" closed"); + if q.state & Qflow then + print(" flow"); + if q.state & Qcoalesce then + print(" coalesce"); + print("\n"); + + b = q.bfirst; + _ni = _ni+1; + while b != 0 do { + _block(b); + complex Block b; + b = b.next; + } + _ni = _ni - 1; +} + +defn +queue(q) +{ + _ni = 0; + _queue(q); +} + +defn +_block(b) +{ + complex Block b; + + _ni(); + print("block(", b\X, ") base ", b.base\X, " rp ", b.rp\X, "/", b.rp-b.base\D, " wp ", b.wp\X, "/", b.wp-b.base\D, " lim ", b.lim\X, "/", b.lim-b.base\D, "\n"); +} + +defn +block(b) +{ + _ni = 0; + block(b); +} + +print(acidfile); +needacid("tcp"); +needacid("qio"); -- cgit v1.2.3