Subversion Repositories planix.SVN

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

_ni=0;  // network indent level

defn
_ni() {
        loop 1,_ni do {
                print("\t");
        }
}

defn
ipdev(n) {
        _ipfs(*(ipfs+4*n));
}

// the funny _foo/foo pairs exist so that if we get
// interrupted in the middle of one of these, _ni will 
// get reset to 0 next time an external call happens.

defn
_ipfs(fs) {
        complex Fs fs;
        local i;

        print("ipfs(", fs\X, ")  #I", fs.dev\D, "\n");
        i=0;
        _ni = _ni+1;
        while i < fs.np do {
                _proto(*(fs.p+i*4));
                i = i + 1;
        }
        _ni = _ni-1;
}

defn
ipfs(fs) {
        _ni = 0;
        _ipfs(fs);
}

defn
_proto(p) {
        local c;
        complex Proto p;
        _ni();
        print("proto(", p\X, ") ", *(p.name\s), "\n");
        _ni = _ni+1;
        local i;
        i = 0;
        while i < p.nc do {
                c = *(p.conv+i*4);
                complex Conv c;
                if c != 0 && c.inuse then 
                        _conv(*(p.conv+i*4));
                i = i + 1;
        }
        _ni = _ni - 1;
}

defn
proto(p) {
        _ni = 0;
        _proto(p);
}

defn
_conv(c) {
        complex Conv c;
        _ni();
        local p;
        p = c.p;
        complex Proto p;
        print("conv(", c\X, ") ", *(p.name\s), "/", c.x\D, " ", 
                iptostr(*(c.laddr+12)), "!", c.lport\D, " ", iptostr(*(c.raddr+12)), 
                "!", c.rport\D, " rq ", qtostr(c.rq), " wq ", qtostr(c.wq), 
                " eq ", qtostr(c.eq), "\n");
}

defn
conv(c) {
        _ni = 0;
        _conv(c);
}

defn
iptostr(a)
{
        // BUG: little endian
        return itoa(a&0xFF)+"."+itoa((a>>8)&0xFF)+"."+itoa((a>>16)&0xFF)+"."+itoa((a>>24)&0xFF);
}

defn
qtostr(q)
{
        complex Queue q;

        return "queue("+itoa(q, "%lux")+") ["+itoa(q.len, "%d")+","+itoa(q.dlen, "%d")+","+itoa(qblocks(q), "%d")+"]";
}

defn
qblocks(q)
{
        complex Queue q;
        local b, n;

        b = q.bfirst;
        n = 0;
        while b != 0 do { 
                n = n + 1;
                complex Block b;
                b = b.next;
        }
        return n;
}

defn
_queue(q)
{
        complex Queue q;
        local b;

        print("queue(", q\X, ") len ", q.len\D, " dlen ", q.dlen\D, " limit ", q.limit\D, " nblocks ", qblocks(q)\D);
        if q.state & Qstarve then 
                print(" starve");
        if q.state & Qmsg then
                print(" msg");
        if q.state & Qclosed then
                print(" closed");
        if q.state & Qflow then
                print(" flow");
        if q.state & Qcoalesce then
                print(" coalesce");
        print("\n");

        b = q.bfirst;
        _ni = _ni+1;
        while b != 0 do {
                _block(b);
                complex Block b;
                b = b.next;
        }
        _ni = _ni - 1;
}

defn
queue(q)
{
        _ni = 0;
        _queue(q);
}

defn
_block(b)
{
        complex Block b;

        _ni();
        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");
}

defn
block(b)
{
        _ni = 0;
        block(b);
}

print("/sys/lib/acid/network");
needacid("tcp");
needacid("qio");