blob: ea6f992209c071f5e7bfbec4fcf27198d665fa65 [file] [log] [blame]
rsc0a61c072004-04-19 18:18:37 +00001_ni=0; // network indent level
2
3defn
4_ni() {
5 loop 1,_ni do {
6 print("\t");
7 }
8}
9
10defn
11ipdev(n) {
12 _ipfs(*(ipfs+4*n));
13}
14
15// the funny _foo/foo pairs exist so that if we get
16// interrupted in the middle of one of these, _ni will
17// get reset to 0 next time an external call happens.
18
19defn
20_ipfs(fs) {
21 complex Fs fs;
22 local i;
23
24 print("ipfs(", fs\X, ") #I", fs.dev\D, "\n");
25 i=0;
26 _ni = _ni+1;
27 while i < fs.np do {
28 _proto(*(fs.p+i*4));
29 i = i + 1;
30 }
31 _ni = _ni-1;
32}
33
34defn
35ipfs(fs) {
36 _ni = 0;
37 _ipfs(fs);
38}
39
40defn
41_proto(p) {
42 local c;
43 complex Proto p;
44 _ni();
45 print("proto(", p\X, ") ", *(p.name\s), "\n");
46 _ni = _ni+1;
47 local i;
48 i = 0;
49 while i < p.nc do {
50 c = *(p.conv+i*4);
51 complex Conv c;
52 if c != 0 && c.inuse then
53 _conv(*(p.conv+i*4));
54 i = i + 1;
55 }
56 _ni = _ni - 1;
57}
58
59defn
60proto(p) {
61 _ni = 0;
62 _proto(p);
63}
64
65defn
66_conv(c) {
67 complex Conv c;
68 _ni();
69 local p;
70 p = c.p;
71 complex Proto p;
72 print("conv(", c\X, ") ", *(p.name\s), "/", c.x\D, " ",
73 iptostr(*(c.laddr+12)), "!", c.lport\D, " ", iptostr(*(c.raddr+12)),
74 "!", c.rport\D, " rq ", qtostr(c.rq), " wq ", qtostr(c.wq),
75 " eq ", qtostr(c.eq), "\n");
76}
77
78defn
79conv(c) {
80 _ni = 0;
81 _conv(c);
82}
83
84defn
85iptostr(a)
86{
87 // BUG: little endian
88 return itoa(a&0xFF)+"."+itoa((a>>8)&0xFF)+"."+itoa((a>>16)&0xFF)+"."+itoa((a>>24)&0xFF);
89}
90
91defn
92qtostr(q)
93{
94 complex Queue q;
95
96 return "queue("+itoa(q, "%lux")+") ["+itoa(q.len, "%d")+","+itoa(q.dlen, "%d")+","+itoa(qblocks(q), "%d")+"]";
97}
98
99defn
100qblocks(q)
101{
102 complex Queue q;
103 local b, n;
104
105 b = q.bfirst;
106 n = 0;
107 while b != 0 do {
108 n = n + 1;
109 complex Block b;
110 b = b.next;
111 }
112 return n;
113}
114
115defn
116_queue(q)
117{
118 complex Queue q;
119 local b;
120
121 print("queue(", q\X, ") len ", q.len\D, " dlen ", q.dlen\D, " limit ", q.limit\D, " nblocks ", qblocks(q)\D);
122 if q.state & Qstarve then
123 print(" starve");
124 if q.state & Qmsg then
125 print(" msg");
126 if q.state & Qclosed then
127 print(" closed");
128 if q.state & Qflow then
129 print(" flow");
130 if q.state & Qcoalesce then
131 print(" coalesce");
132 print("\n");
133
134 b = q.bfirst;
135 _ni = _ni+1;
136 while b != 0 do {
137 _block(b);
138 complex Block b;
139 b = b.next;
140 }
141 _ni = _ni - 1;
142}
143
144defn
145queue(q)
146{
147 _ni = 0;
148 _queue(q);
149}
150
151defn
152_block(b)
153{
154 complex Block b;
155
156 _ni();
157 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");
158}
159
160defn
161block(b)
162{
163 _ni = 0;
164 block(b);
165}
166
167print(acidfile);
168needacid("tcp");
169needacid("qio");