xref: /csrg-svn/sys/netccitt/hd_debug.c (revision 41585)
1 /* Copyright (c) University of British Columbia, 1984 */
2 
3 #include "../h/param.h"
4 #include "../h/systm.h"
5 #include "../h/mbuf.h"
6 #include "../h/domain.h"
7 #include "../h/socket.h"
8 #include "../h/protosw.h"
9 #include "../h/errno.h"
10 #include "../h/time.h"
11 #include "../h/kernel.h"
12 
13 #include "../net/if.h"
14 
15 #include "../netccitt/hdlc.h"
16 #include "../netccitt/hd_var.h"
17 #include "../netccitt/x25.h"
18 
19 #ifdef HDLCDEBUG
20 #define NTRACE		32
21 
22 struct	hdlctrace {
23 	struct	hdcb *ht_hdp;
24 	short	ht_dir;
25 	struct	mbuf *ht_frame;
26 	struct	timeval ht_time;
27 } hdtrace[NTRACE];
28 
29 int	lasttracelogged, freezetrace;
30 #endif
31 
32 hd_trace (hdp, direction, frame)
33 struct hdcb *hdp;
34 register struct Hdlc_frame *frame;
35 {
36 	register char *s;
37 	register int nr, pf, ns, i;
38 	struct Hdlc_iframe *iframe = (struct Hdlc_iframe *) frame;
39 
40 #ifdef HDLCDEBUG
41 	hd_savetrace (hdp, direction, frame);
42 #endif
43 	if (hdp -> hd_xcp -> xc_ltrace) {
44 		if (direction == RX)
45 			printf ("F-In:  ");
46 		else if (direction == 2)
47 				printf ("F-Xmt: ");
48 			else
49 				printf ("F-Out:   ");
50 
51 		nr = iframe -> nr;
52 		pf = iframe -> pf;
53 		ns = iframe -> ns;
54 
55 		switch (hd_decode (hdp, frame)) {
56 		case SABM:
57 			printf ("SABM   : PF=%d\n", pf);
58 			break;
59 
60 		case DISC:
61 			printf ("DISC   : PF=%d\n", pf);
62 			break;
63 
64 		case DM:
65 			printf ("DM     : PF=%d\n", pf);
66 			break;
67 
68 		case FRMR:
69 			{
70 			register struct Frmr_frame *f = (struct Frmr_frame *)frame;
71 
72 			printf ("FRMR   : PF=%d, TEXT=", pf);
73 			for (s = (char *) frame, i = 0; i < 5; ++i, ++s)
74 				printf ("%x ", (int) * s & 0xff);
75 			printf ("\n");
76 			printf ("control=%x v(s)=%d v(r)=%d w%d x%d y%d z%d\n",
77 				f->frmr_control, f->frmr_ns, f->frmr_nr,
78 				f->frmr_w, f->frmr_x, f->frmr_y, f->frmr_z);
79 			break;
80 			}
81 
82 		case UA:
83 			printf ("UA     : PF=%d\n", pf);
84 			break;
85 
86 		case RR:
87 			printf ("RR     : N(R)=%d, PF=%d\n", nr, pf);
88 			break;
89 
90 		case RNR:
91 			printf ("RNR    : N(R)=%d, PF=%d\n", nr, pf);
92 			break;
93 
94 		case REJ:
95 			printf ("REJ    : N(R)=%d, PF=%d\n", nr, pf);
96 			break;
97 
98 		case IFRAME:
99 			{
100 			register struct mbuf *m;
101 			register int len = 0;
102 
103 			for(m = dtom (frame); m; m = m -> m_next)
104 				len += m -> m_len;
105 			len -= HDHEADERLN;
106 			printf ("IFRAME : N(R)=%d, PF=%d, N(S)=%d, DATA(%d)=",
107 				nr, pf, ns, len);
108 			for (s = (char *)iframe->i_field, i = 0; i < 3; ++i, ++s)
109 				printf ("%x ", (int) *s & 0xff);
110 			printf ("\n");
111 			break;
112 			}
113 
114 		default:
115 			printf ("ILLEGAL: ");
116 			for (s = (char *) frame, i = 0; i < 5; ++i, ++s)
117 				printf ("%x ", (int) *s & 0xff);
118 			printf ("\n");
119 		}
120 
121 	}
122 }
123 
124 #ifdef HDLCDEBUG
125 static
126 hd_savetrace (hdp, dir, frame)
127 struct hdcb *hdp;
128 struct Hdlc_frame *frame;
129 {
130 	register struct hdlctrace *htp;
131 	register struct mbuf *m;
132 
133 	if (freezetrace)
134 		return;
135 	htp = &hdtrace[lasttracelogged];
136 	lasttracelogged = (lasttracelogged + 1) % NTRACE;
137 	if (m = htp->ht_frame)
138 		m_freem (m);
139 	m = dtom (frame);
140 	htp->ht_frame = m_copy (m, 0, m->m_len);
141 	htp->ht_hdp = hdp;
142 	htp->ht_dir = dir;
143 	htp->ht_time = time;
144 }
145 
146 hd_dumptrace (hdp)
147 struct hdcb *hdp;
148 {
149 	register int i, ltrace;
150 	register struct hdlctrace *htp;
151 
152 	freezetrace = 1;
153 	hd_status (hdp);
154 	printf ("retransmit queue:");
155 	for (i = 0; i < 8; i++)
156 		printf (" %X", hdp -> hd_retxq[i]);
157 	printf ("\n");
158 	ltrace = hdp -> hd_xcp -> xc_ltrace;
159 	hdp -> hd_xcp -> xc_ltrace = 1;
160 	for (i = 0; i < NTRACE; i++) {
161 		htp = &hdtrace[(lasttracelogged + i) % NTRACE];
162 		if (htp->ht_hdp != hdp || htp->ht_frame == 0)
163 			continue;
164 		printf ("%d/%d	", htp->ht_time.tv_sec & 0xff,
165 			htp->ht_time.tv_usec / 10000);
166 		hd_trace (htp->ht_hdp, htp->ht_dir,
167 			mtod (htp->ht_frame, struct Hdlc_frame *));
168 		m_freem (htp->ht_frame);
169 		htp->ht_frame = 0;
170 	}
171 	hdp -> hd_xcp -> xc_ltrace = ltrace;
172 	freezetrace = 0;
173 }
174 #endif
175