date and time created 90/05/11 11:19:33 by sklower
[unix-history] / usr / src / sys / netccitt / hd_debug.c
CommitLineData
74eec871
KS
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
22struct hdlctrace {
23 struct hdcb *ht_hdp;
24 short ht_dir;
25 struct mbuf *ht_frame;
26 struct timeval ht_time;
27} hdtrace[NTRACE];
28
29int lasttracelogged, freezetrace;
30#endif
31
32hd_trace (hdp, direction, frame)
33struct hdcb *hdp;
34register 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
125static
126hd_savetrace (hdp, dir, frame)
127struct hdcb *hdp;
128struct 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
146hd_dumptrace (hdp)
147struct 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