#include #include #include #include "ncp.h" static char * nwflags(int n) { char buf[1024]; snprint(buf, sizeof buf, "%s%s%s%s", (n & (1 << 0))? "bad service connection,": "", (n & (1 << 2))? "no connections avaliable,": "", (n & (1 << 4))? "server is down,": "", (n & (1 << 6))? "broadcast message waiting": ""); return buf; } static int xd(Fmt *f, uchar *buf, int len) { int n, i, j, addr; n = 0; for (addr = 0; addr < len; addr += 16, buf += 16) { n += fmtprint(f, "\t%04x ", addr); for (i = 0; i < 16 && i < (len - addr); i++) n += fmtprint(f, "%02x ", buf[i]); for (j = i; j < 16; j++) n += fmtprint(f, " "); n += fmtprint(f, " "); for (i = 0; i < 16 && i < (len - addr); i++) if (isprint(buf[i])) n += fmtprint(f, "%c", buf[i]); else n += fmtprint(f, "."); n += fmtprint(f, "\n"); } return n; } int ncpfmt(Fmt *f) { ulong len, sig, mtu, vers; uchar *b = va_arg(f->args, void *); uint n, seq, off, conn, task, func, flags, err; sig = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]; len = (b[4] << 24) | (b[5] << 16) | (b[6] << 8) | b[7]; SET(vers); SET(task); if (((b[16] << 8) | b[17]) == 0x2222){ vers = (b[8] << 24) | (b[9] << 16) | (b[10] << 8) | b[11]; mtu = (b[12] << 24) | (b[13] << 16) | (b[14] << 8) | b[15]; seq = b[18]; conn = (b[21] << 8) | b[19]; task = b[20]; func = b[22]; n = fmtprint(f, "\n=> request sig=0x%08lux len=%lud mtu=%lud ver=%ld seq=%d conn=%ud task=%ud func=0x%02ux\n", sig, len, mtu, vers, seq, conn, task, func); off = 23; } else if (((b[8] << 8) | b[9]) == 0x3333){ seq = b[10]; conn = (b[13] << 8) | b[11]; task = b[12]; err = b[14]; flags = b[15]; n = fmtprint(f, "<= reply sig=0x%08lux len=%lud conn=%ud task=%d stat=%q flags=%q err=%r\n", sig, len, conn, task, nwerrstr(err), nwflags(flags)); off = 16; } else if (((b[16] << 8) | b[17]) == 0x1111){ vers = (b[8] << 24) | (b[9] << 16) | (b[10] << 8) | b[11]; mtu = (b[12] << 24) | (b[13] << 16) | (b[14] << 8) | b[15]; seq = b[18]; conn = (b[21] << 8) | b[19]; task = b[20]; func = b[22]; n = fmtprint(f, "=> attach sig=0x%08lux vers=%ld len=%lud mtu=%lud conn=%ud task=%d func=0x%02ux\n", sig, vers, len, mtu, conn, task, func); off = 21; } else if (((b[16] << 8) | b[17]) == 0x1111){ vers = (b[8] << 24) | (b[9] << 16) | (b[10] << 8) | b[11]; mtu = (b[12] << 24) | (b[13] << 16) | (b[14] << 8) | b[15]; seq = b[18]; conn = (b[21] << 8) | b[19]; n = fmtprint(f, "\n=> detach sig=0x%08lux vers=%ld len=%lud mtu=%lud conn=%ud task=%d\n", sig, vers, len, mtu, conn, task); off = 23; } else return fmtprint(f, "unknown packet type 0x%02ux\n", ((b[8] << 8) | b[9])); USED(sig, vers, seq, task); if (off >= len) return n; n += xd(f, b + off, len - off); return n; }