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