xref: /plan9/sys/lib/acid/network (revision 5d459b5a09e427ae1acd4e6afcf028853c73946e)
1_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("/sys/lib/acid/network");
168needacid("tcp");
169needacid("qio");
170