xref: /csrg-svn/sys/netccitt/hd_debug.c (revision 63216)
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