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