141703Ssklower /* 241703Ssklower * Copyright (c) University of British Columbia, 1984 3*63216Sbostic * Copyright (c) 1990, 1993 4*63216Sbostic * The Regents of the University of California. All rights reserved. 541703Ssklower * 641703Ssklower * This code is derived from software contributed to Berkeley by 741703Ssklower * the Laboratory for Computation Vision and the Computer Science Department 841703Ssklower * of the University of British Columbia. 941703Ssklower * 1041703Ssklower * %sccs.include.redist.c% 1141703Ssklower * 12*63216Sbostic * @(#)hd_debug.c 8.1 (Berkeley) 06/10/93 1341703Ssklower */ 1441585Ssklower 1556530Sbostic #include <sys/param.h> 1656530Sbostic #include <sys/systm.h> 1756530Sbostic #include <sys/mbuf.h> 1856530Sbostic #include <sys/domain.h> 1956530Sbostic #include <sys/socket.h> 2056530Sbostic #include <sys/protosw.h> 2156530Sbostic #include <sys/errno.h> 2256530Sbostic #include <sys/time.h> 2356530Sbostic #include <sys/kernel.h> 2441585Ssklower 2556530Sbostic #include <net/if.h> 2641585Ssklower 2756530Sbostic #include <netccitt/hdlc.h> 2856530Sbostic #include <netccitt/hd_var.h> 2956530Sbostic #include <netccitt/x25.h> 3041585Ssklower 3141585Ssklower #ifdef HDLCDEBUG 3241585Ssklower #define NTRACE 32 3341585Ssklower 3441585Ssklower struct hdlctrace { 3541585Ssklower struct hdcb *ht_hdp; 3641585Ssklower short ht_dir; 3741585Ssklower struct mbuf *ht_frame; 3841585Ssklower struct timeval ht_time; 3941585Ssklower } hdtrace[NTRACE]; 4041585Ssklower 4141585Ssklower int lasttracelogged, freezetrace; 4241585Ssklower #endif 4341585Ssklower 4441585Ssklower hd_trace (hdp, direction, frame) 4541585Ssklower struct hdcb *hdp; 4641585Ssklower register struct Hdlc_frame *frame; 4741585Ssklower { 4841585Ssklower register char *s; 4941585Ssklower register int nr, pf, ns, i; 5041585Ssklower struct Hdlc_iframe *iframe = (struct Hdlc_iframe *) frame; 5141585Ssklower 5241585Ssklower #ifdef HDLCDEBUG 5341585Ssklower hd_savetrace (hdp, direction, frame); 5441585Ssklower #endif 5541585Ssklower if (hdp -> hd_xcp -> xc_ltrace) { 5641585Ssklower if (direction == RX) 5741585Ssklower printf ("F-In: "); 5841585Ssklower else if (direction == 2) 5941585Ssklower printf ("F-Xmt: "); 6041585Ssklower else 6141585Ssklower printf ("F-Out: "); 6241585Ssklower 6341585Ssklower nr = iframe -> nr; 6441585Ssklower pf = iframe -> pf; 6541585Ssklower ns = iframe -> ns; 6641585Ssklower 6741585Ssklower switch (hd_decode (hdp, frame)) { 6841585Ssklower case SABM: 6941585Ssklower printf ("SABM : PF=%d\n", pf); 7041585Ssklower break; 7141585Ssklower 7241585Ssklower case DISC: 7341585Ssklower printf ("DISC : PF=%d\n", pf); 7441585Ssklower break; 7541585Ssklower 7641585Ssklower case DM: 7741585Ssklower printf ("DM : PF=%d\n", pf); 7841585Ssklower break; 7941585Ssklower 8041585Ssklower case FRMR: 8141585Ssklower { 8241585Ssklower register struct Frmr_frame *f = (struct Frmr_frame *)frame; 8341585Ssklower 8441585Ssklower printf ("FRMR : PF=%d, TEXT=", pf); 8541585Ssklower for (s = (char *) frame, i = 0; i < 5; ++i, ++s) 8641585Ssklower printf ("%x ", (int) * s & 0xff); 8741585Ssklower printf ("\n"); 8841585Ssklower printf ("control=%x v(s)=%d v(r)=%d w%d x%d y%d z%d\n", 8941585Ssklower f->frmr_control, f->frmr_ns, f->frmr_nr, 9041585Ssklower f->frmr_w, f->frmr_x, f->frmr_y, f->frmr_z); 9141585Ssklower break; 9241585Ssklower } 9341585Ssklower 9441585Ssklower case UA: 9541585Ssklower printf ("UA : PF=%d\n", pf); 9641585Ssklower break; 9741585Ssklower 9841585Ssklower case RR: 9941585Ssklower printf ("RR : N(R)=%d, PF=%d\n", nr, pf); 10041585Ssklower break; 10141585Ssklower 10241585Ssklower case RNR: 10341585Ssklower printf ("RNR : N(R)=%d, PF=%d\n", nr, pf); 10441585Ssklower break; 10541585Ssklower 10641585Ssklower case REJ: 10741585Ssklower printf ("REJ : N(R)=%d, PF=%d\n", nr, pf); 10841585Ssklower break; 10941585Ssklower 11041585Ssklower case IFRAME: 11141585Ssklower { 11241585Ssklower register struct mbuf *m; 11341585Ssklower register int len = 0; 11441585Ssklower 11541585Ssklower for(m = dtom (frame); m; m = m -> m_next) 11641585Ssklower len += m -> m_len; 11741585Ssklower len -= HDHEADERLN; 11841585Ssklower printf ("IFRAME : N(R)=%d, PF=%d, N(S)=%d, DATA(%d)=", 11941585Ssklower nr, pf, ns, len); 12041585Ssklower for (s = (char *)iframe->i_field, i = 0; i < 3; ++i, ++s) 12141585Ssklower printf ("%x ", (int) *s & 0xff); 12241585Ssklower printf ("\n"); 12341585Ssklower break; 12441585Ssklower } 12541585Ssklower 12641585Ssklower default: 12741585Ssklower printf ("ILLEGAL: "); 12841585Ssklower for (s = (char *) frame, i = 0; i < 5; ++i, ++s) 12941585Ssklower printf ("%x ", (int) *s & 0xff); 13041585Ssklower printf ("\n"); 13141585Ssklower } 13241585Ssklower 13341585Ssklower } 13441585Ssklower } 13541585Ssklower 13641585Ssklower #ifdef HDLCDEBUG 13741585Ssklower static 13841585Ssklower hd_savetrace (hdp, dir, frame) 13941585Ssklower struct hdcb *hdp; 14041585Ssklower struct Hdlc_frame *frame; 14141585Ssklower { 14241585Ssklower register struct hdlctrace *htp; 14341585Ssklower register struct mbuf *m; 14441585Ssklower 14541585Ssklower if (freezetrace) 14641585Ssklower return; 14741585Ssklower htp = &hdtrace[lasttracelogged]; 14841585Ssklower lasttracelogged = (lasttracelogged + 1) % NTRACE; 14941585Ssklower if (m = htp->ht_frame) 15041585Ssklower m_freem (m); 15141585Ssklower m = dtom (frame); 15241585Ssklower htp->ht_frame = m_copy (m, 0, m->m_len); 15341585Ssklower htp->ht_hdp = hdp; 15441585Ssklower htp->ht_dir = dir; 15541585Ssklower htp->ht_time = time; 15641585Ssklower } 15741585Ssklower 15841585Ssklower hd_dumptrace (hdp) 15941585Ssklower struct hdcb *hdp; 16041585Ssklower { 16141585Ssklower register int i, ltrace; 16241585Ssklower register struct hdlctrace *htp; 16341585Ssklower 16441585Ssklower freezetrace = 1; 16541585Ssklower hd_status (hdp); 16641585Ssklower printf ("retransmit queue:"); 16741585Ssklower for (i = 0; i < 8; i++) 16849926Ssklower printf (" %x", hdp -> hd_retxq[i]); 16941585Ssklower printf ("\n"); 17041585Ssklower ltrace = hdp -> hd_xcp -> xc_ltrace; 17141585Ssklower hdp -> hd_xcp -> xc_ltrace = 1; 17241585Ssklower for (i = 0; i < NTRACE; i++) { 17341585Ssklower htp = &hdtrace[(lasttracelogged + i) % NTRACE]; 17441585Ssklower if (htp->ht_hdp != hdp || htp->ht_frame == 0) 17541585Ssklower continue; 17641585Ssklower printf ("%d/%d ", htp->ht_time.tv_sec & 0xff, 17741585Ssklower htp->ht_time.tv_usec / 10000); 17841585Ssklower hd_trace (htp->ht_hdp, htp->ht_dir, 17941585Ssklower mtod (htp->ht_frame, struct Hdlc_frame *)); 18041585Ssklower m_freem (htp->ht_frame); 18141585Ssklower htp->ht_frame = 0; 18241585Ssklower } 18341585Ssklower hdp -> hd_xcp -> xc_ltrace = ltrace; 18441585Ssklower freezetrace = 0; 18541585Ssklower } 18641585Ssklower #endif 187