/* copdump.c */ #include #include #include #include "copuser.h" #define MAX_SND_WND 256 static inline int bet_seq( unsigned int sseq, unsigned int tseq, unsigned int lseq) { if (sseq == lseq) return(0); if (sseq < lseq) { if ((sseq <= tseq) && (tseq < lseq)) return(1); else return(0); } else { if ((sseq > tseq) && (tseq >= lseq)) return(0); else return(1); } } static inline unsigned inc_seq( unsigned char seq) { seq = (seq + 1) % MAX_SND_WND; return(seq); } phdrlog_t logbuf[64 * 1024]; char codes[6] = {'R', 'T', 'X', 'Y', 'Z', 'A'}; main() { int len; int uwin; int i; int lastack = 0; int basejif; phdrlog_t *loc = logbuf; len = read(0, logbuf, sizeof(logbuf)); basejif = loc->jiffies; len /= sizeof(phdrlog_t); printf("Op CP - Seq Ack Win - nxs nxa nxr \n"); for (i = 0; i < len; i++) { printf("%c %2d - %3d %3d %3d - %3d %3d %3d - %3d - %6d", codes[loc->op], loc->cpuid, loc->seq, loc->ack, loc->win, loc->nxtsnd, loc->nxtack, loc->nxtrcv, lastack, loc->jiffies - basejif); if (loc->op == 0) // Recv.. { if (!bet_seq(lastack, loc->ack, inc_seq(loc->nxtsnd))) { printf("ZZZ"); } else if (loc->ack != lastack) { lastack = loc->ack; if (loc->nxtsnd < loc->ack) loc->nxtsnd += 256; uwin = loc->win - (loc->nxtsnd - loc->ack); if (uwin < 0) printf("XXX"); } } printf("\n"); loc += 1; } }