aboutsummaryrefslogtreecommitdiff
path: root/acid/network
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-04-19 18:18:37 +0000
committerrsc <devnull@localhost>2004-04-19 18:18:37 +0000
commit0a61c07d591273b76da21fb8386b669989da3707 (patch)
tree1dd9832f7d646f12c0ff5cf7ff64d1fddc6bd361 /acid/network
parentc8af1ab17b72f500c27688598dbb893f09f62c53 (diff)
downloadplan9port-0a61c07d591273b76da21fb8386b669989da3707.tar.gz
plan9port-0a61c07d591273b76da21fb8386b669989da3707.tar.bz2
plan9port-0a61c07d591273b76da21fb8386b669989da3707.zip
acid files
Diffstat (limited to 'acid/network')
-rw-r--r--acid/network169
1 files changed, 169 insertions, 0 deletions
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");