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