]> git.lizzy.rs Git - plan9front.git/blob - sys/lib/acid/network
ip/tftpd: add a syslog message about what error we return to the client on a NAK
[plan9front.git] / sys / lib / acid / network
1 _ni=0;  // network indent level
2
3 defn
4 _ni() {
5         loop 1,_ni do {
6                 print("\t");
7         }
8 }
9
10 defn
11 ipdev(n) {
12         _ipfs(ipfs[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
19 defn
20 _ipfs(fs) {
21         complex Fs fs;
22         local i;
23
24         print("ipfs(", fs\A, ")  #I", fs.dev\D, "\n");
25         i=0;
26         _ni = _ni+1;
27         while i < fs.np do {
28                 _proto(fs.p[i]);
29                 i = i + 1;
30         }
31         _ni = _ni-1;
32 }
33
34 defn
35 ipfs(fs) {
36         _ni = 0;
37         _ipfs(fs);
38 }
39
40 defn
41 _proto(p) {
42         local c;
43         complex Proto p;
44         _ni();
45         print("proto(", p\A, ") ", *(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];
51                 complex Conv c;
52                 if c != 0 && c.inuse then 
53                         _conv(c);
54                 i = i + 1;
55         }
56         _ni = _ni - 1;
57 }
58
59 defn
60 proto(p) {
61         _ni = 0;
62         _proto(p);
63 }
64
65 defn
66 _conv(c) {
67         complex Conv c;
68         _ni();
69         local p;
70         p = c.p;
71         complex Proto p;
72         print("conv(", c\A, ") ", *(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
78 defn
79 conv(c) {
80         _ni = 0;
81         _conv(c);
82 }
83
84 defn
85 iptostr(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
91 defn
92 qtostr(q)
93 {
94         complex Queue q;
95
96         return "queue("+itoa(q, "%ux")+") ["+itoa(q.len, "%d")+","+itoa(q.dlen, "%d")+","+itoa(qblocks(q), "%d")+"]";
97 }
98
99 defn
100 qblocks(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
115 defn
116 _queue(q)
117 {
118         complex Queue q;
119         local b;
120
121         print("queue(", q\A, ") 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
144 defn
145 queue(q)
146 {
147         _ni = 0;
148         _queue(q);
149 }
150
151 defn
152 _block(b)
153 {
154         complex Block b;
155
156         _ni();
157         print("block(", b\A, ") base ", b.base, " rp ", b.rp, "/", b.rp-b.base\D, " wp ", b.wp, "/", b.wp-b.base\D, " lim ", b.lim, "/", b.lim-b.base\D, "\n");
158 }
159
160 defn
161 block(b)
162 {
163         _ni = 0;
164         block(b);
165 }
166
167 print("/sys/lib/acid/network");
168 needacid("tcp");
169 needacid("qio");