plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

network (2484B)


      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+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 
     19 defn
     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 
     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\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 
     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\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 
     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, "%lux")+") ["+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\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 
    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\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 
    160 defn
    161 block(b)
    162 {
    163 	_ni = 0;
    164 	block(b);
    165 }
    166 
    167 print(acidfile);
    168 needacid("tcp");
    169 needacid("qio");