1*36368Ssklower /*********************************************************** 2*36368Ssklower Copyright IBM Corporation 1987 3*36368Ssklower 4*36368Ssklower All Rights Reserved 5*36368Ssklower 6*36368Ssklower Permission to use, copy, modify, and distribute this software and its 7*36368Ssklower documentation for any purpose and without fee is hereby granted, 8*36368Ssklower provided that the above copyright notice appear in all copies and that 9*36368Ssklower both that copyright notice and this permission notice appear in 10*36368Ssklower supporting documentation, and that the name of IBM not be 11*36368Ssklower used in advertising or publicity pertaining to distribution of the 12*36368Ssklower software without specific, written prior permission. 13*36368Ssklower 14*36368Ssklower IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 15*36368Ssklower ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 16*36368Ssklower IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 17*36368Ssklower ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 18*36368Ssklower WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 19*36368Ssklower ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 20*36368Ssklower SOFTWARE. 21*36368Ssklower 22*36368Ssklower ******************************************************************/ 23*36368Ssklower 24*36368Ssklower /* 25*36368Ssklower * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison 26*36368Ssklower */ 27*36368Ssklower /* $Header: clnp_debug.c,v 4.2 88/06/29 14:58:34 hagens Exp $ */ 28*36368Ssklower /* $Source: /usr/argo/sys/netargo/RCS/clnp_debug.c,v $ */ 29*36368Ssklower 30*36368Ssklower #ifndef lint 31*36368Ssklower static char *rcsid = "$Header: clnp_debug.c,v 4.2 88/06/29 14:58:34 hagens Exp $"; 32*36368Ssklower #endif lint 33*36368Ssklower 34*36368Ssklower #include "../h/types.h" 35*36368Ssklower #include "../h/param.h" 36*36368Ssklower #include "../h/mbuf.h" 37*36368Ssklower #include "../h/domain.h" 38*36368Ssklower #include "../h/protosw.h" 39*36368Ssklower #include "../h/socket.h" 40*36368Ssklower #include "../h/socketvar.h" 41*36368Ssklower #include "../h/errno.h" 42*36368Ssklower 43*36368Ssklower #include "../net/if.h" 44*36368Ssklower #include "../net/route.h" 45*36368Ssklower 46*36368Ssklower #include "../netiso/iso.h" 47*36368Ssklower #include "../netiso/clnp.h" 48*36368Ssklower #include "../netiso/clnp_stat.h" 49*36368Ssklower #include "../netiso/argo_debug.h" 50*36368Ssklower 51*36368Ssklower #ifdef ARGO_DEBUG 52*36368Ssklower 53*36368Ssklower #ifdef TESTDEBUG 54*36368Ssklower #ifdef notdef 55*36368Ssklower struct addr_37 u_37 = { 56*36368Ssklower {0x00, 0x02, 0x00, 0x10, 0x20, 0x30, 0x35}, 57*36368Ssklower {0x01, 0x02, 0x03, 0x04, 0x50, 0x60, 0x70, 0x80, 0x90} 58*36368Ssklower }; 59*36368Ssklower struct addr_osinet u_osinet = { 60*36368Ssklower {0x00, 0x04}, 61*36368Ssklower {0x00, 0x02, 0x00, 0x01, 0x23, 0x42, 0x78, 0x20, 0x01, 0x05, 0x00} 62*36368Ssklower }; 63*36368Ssklower #endif notdef 64*36368Ssklower struct addr_rfc986 u_rfc986 = { 65*36368Ssklower {0x00, 0x06}, 66*36368Ssklower {0x01, 0xc0, 0x0c, 0x0c, 0xab, 0x11} 67*36368Ssklower }; 68*36368Ssklower struct addr_rfc986 u_bad = { 69*36368Ssklower {0x00, 0x01}, 70*36368Ssklower {0x01, 0xc0, 0x0c, 0x0c, 0xab, 0x11} 71*36368Ssklower }; 72*36368Ssklower #include <stdio.h> 73*36368Ssklower main() 74*36368Ssklower { 75*36368Ssklower struct iso_addr a; 76*36368Ssklower 77*36368Ssklower a.isoa_afi = AFI_37; 78*36368Ssklower a.isoa_u.addr_37 = u_37; 79*36368Ssklower a.isoa_len = 17; 80*36368Ssklower printf("type 37: %s\n", clnp_iso_addrp(&a)); 81*36368Ssklower 82*36368Ssklower a.isoa_afi = AFI_OSINET; 83*36368Ssklower a.isoa_u.addr_osinet = u_osinet; 84*36368Ssklower a.isoa_len = 14; 85*36368Ssklower printf("type osinet: %s\n", clnp_iso_addrp(&a)); 86*36368Ssklower 87*36368Ssklower a.isoa_afi = AFI_RFC986; 88*36368Ssklower a.isoa_u.addr_rfc986 = u_rfc986; 89*36368Ssklower a.isoa_len = 9; 90*36368Ssklower printf("type rfc986: %s\n", clnp_iso_addrp(&a)); 91*36368Ssklower 92*36368Ssklower a.isoa_afi = 12; 93*36368Ssklower a.isoa_u.addr_rfc986 = u_rfc986; 94*36368Ssklower a.isoa_len = 9; 95*36368Ssklower printf("type bad afi: %s\n", clnp_iso_addrp(&a)); 96*36368Ssklower 97*36368Ssklower a.isoa_afi = AFI_RFC986; 98*36368Ssklower a.isoa_u.addr_rfc986 = u_bad; 99*36368Ssklower a.isoa_len = 9; 100*36368Ssklower printf("type bad idi: %s\n", clnp_iso_addrp(&a)); 101*36368Ssklower } 102*36368Ssklower #endif TESTDEBUG 103*36368Ssklower 104*36368Ssklower unsigned int clnp_debug; 105*36368Ssklower static char letters[] = "0123456789abcdef"; 106*36368Ssklower 107*36368Ssklower /* 108*36368Ssklower * Print buffer in hex, return addr of where we left off. 109*36368Ssklower * Do not null terminate. 110*36368Ssklower */ 111*36368Ssklower char * 112*36368Ssklower clnp_hexp(src, len, where) 113*36368Ssklower char *src; /* src of data to print */ 114*36368Ssklower int len; /* lengthof src */ 115*36368Ssklower char *where; /* where to put data */ 116*36368Ssklower { 117*36368Ssklower int i; 118*36368Ssklower 119*36368Ssklower for (i=0; i<len; i++) { 120*36368Ssklower *where++ = letters[src[i] >> 4]; 121*36368Ssklower *where++ = letters[src[i] & 0x0f]; 122*36368Ssklower } 123*36368Ssklower return where; 124*36368Ssklower } 125*36368Ssklower 126*36368Ssklower /* 127*36368Ssklower * Return a ptr to a human readable form of an iso addr 128*36368Ssklower */ 129*36368Ssklower static char iso_addr_b[50]; 130*36368Ssklower #define DELIM '.'; 131*36368Ssklower 132*36368Ssklower char * 133*36368Ssklower clnp_iso_addrp(isoa) 134*36368Ssklower struct iso_addr *isoa; 135*36368Ssklower { 136*36368Ssklower char *cp; 137*36368Ssklower 138*36368Ssklower /* print length */ 139*36368Ssklower clnp_sprintf(iso_addr_b, "[%d] ", isoa->isoa_len); 140*36368Ssklower 141*36368Ssklower /* set cp to end of what we have */ 142*36368Ssklower cp = iso_addr_b; 143*36368Ssklower while (*cp) 144*36368Ssklower cp++; 145*36368Ssklower 146*36368Ssklower /* print afi */ 147*36368Ssklower cp = clnp_hexp(&isoa->isoa_afi, 1, cp); 148*36368Ssklower *cp++ = DELIM; 149*36368Ssklower 150*36368Ssklower /* print type specific part */ 151*36368Ssklower switch(isoa->isoa_afi) { 152*36368Ssklower case AFI_37: 153*36368Ssklower cp = clnp_hexp(isoa->t37_idi, ADDR37_IDI_LEN, cp); 154*36368Ssklower *cp++ = DELIM; 155*36368Ssklower cp = clnp_hexp(isoa->t37_dsp, ADDR37_DSP_LEN, cp); 156*36368Ssklower break; 157*36368Ssklower 158*36368Ssklower /* case AFI_OSINET:*/ 159*36368Ssklower case AFI_RFC986: { 160*36368Ssklower u_short idi; 161*36368Ssklower 162*36368Ssklower /* osinet and rfc986 have idi in the same place */ 163*36368Ssklower /* print idi */ 164*36368Ssklower cp = clnp_hexp(isoa->rfc986_idi, ADDROSINET_IDI_LEN, cp); 165*36368Ssklower *cp++ = DELIM; 166*36368Ssklower CTOH(isoa->rfc986_idi[0], isoa->rfc986_idi[1], idi); 167*36368Ssklower 168*36368Ssklower if (idi == IDI_OSINET) { 169*36368Ssklower struct ovl_osinet *oosi = (struct ovl_osinet *)isoa; 170*36368Ssklower cp = clnp_hexp(oosi->oosi_orgid, OVLOSINET_ORGID_LEN, cp); 171*36368Ssklower *cp++ = DELIM; 172*36368Ssklower cp = clnp_hexp(oosi->oosi_snetid, OVLOSINET_SNETID_LEN, cp); 173*36368Ssklower *cp++ = DELIM; 174*36368Ssklower cp = clnp_hexp(oosi->oosi_snpa, OVLOSINET_SNPA_LEN, cp); 175*36368Ssklower *cp++ = DELIM; 176*36368Ssklower cp = clnp_hexp(oosi->oosi_nsap, OVLOSINET_NSAP_LEN, cp); 177*36368Ssklower } else if (idi == IDI_RFC986) { 178*36368Ssklower struct ovl_rfc986 *o986 = (struct ovl_rfc986 *)isoa; 179*36368Ssklower cp = clnp_hexp(&o986->o986_vers, 1, cp); 180*36368Ssklower *cp++ = DELIM; 181*36368Ssklower #ifdef vax 182*36368Ssklower clnp_sprintf(cp, "%d.%d.%d.%d.%d", 183*36368Ssklower o986->o986_inetaddr[0] & 0xff, 184*36368Ssklower o986->o986_inetaddr[1] & 0xff, 185*36368Ssklower o986->o986_inetaddr[2] & 0xff, 186*36368Ssklower o986->o986_inetaddr[3] & 0xff, 187*36368Ssklower o986->o986_upid & 0xff); 188*36368Ssklower return(iso_addr_b); 189*36368Ssklower #else 190*36368Ssklower cp = clnp_hexp(&o986->o986_inetaddr[0], 1, cp); 191*36368Ssklower *cp++ = DELIM; 192*36368Ssklower cp = clnp_hexp(&o986->o986_inetaddr[1], 1, cp); 193*36368Ssklower *cp++ = DELIM; 194*36368Ssklower cp = clnp_hexp(&o986->o986_inetaddr[2], 1, cp); 195*36368Ssklower *cp++ = DELIM; 196*36368Ssklower cp = clnp_hexp(&o986->o986_inetaddr[3], 1, cp); 197*36368Ssklower *cp++ = DELIM; 198*36368Ssklower cp = clnp_hexp(&o986->o986_upid, 1, cp); 199*36368Ssklower #endif vax 200*36368Ssklower } 201*36368Ssklower 202*36368Ssklower } break; 203*36368Ssklower 204*36368Ssklower default: 205*36368Ssklower *cp++ = '?'; 206*36368Ssklower break; 207*36368Ssklower } 208*36368Ssklower *cp = (char)0; 209*36368Ssklower 210*36368Ssklower return(iso_addr_b); 211*36368Ssklower } 212*36368Ssklower 213*36368Ssklower #define MAX_COLUMNS 8 214*36368Ssklower /* 215*36368Ssklower * Dump the buffer to the screen in a readable format. Format is: 216*36368Ssklower * 217*36368Ssklower * hex/dec where hex is the hex format, dec is the decimal format. 218*36368Ssklower * columns of hex/dec numbers will be printed, followed by the 219*36368Ssklower * character representations (if printable). 220*36368Ssklower */ 221*36368Ssklower dump_buf(buf, len) 222*36368Ssklower char *buf; 223*36368Ssklower int len; 224*36368Ssklower { 225*36368Ssklower int i,j; 226*36368Ssklower 227*36368Ssklower printf("Dump buf 0x%x len 0x%x\n", buf, len); 228*36368Ssklower for (i = 0; i < len; i += MAX_COLUMNS) { 229*36368Ssklower printf("+%d:\t", i); 230*36368Ssklower for (j = 0; j < MAX_COLUMNS; j++) { 231*36368Ssklower if (i + j < len) { 232*36368Ssklower printf("%x/%d\t", buf[i+j]&0xff, buf[i+j]); 233*36368Ssklower } else { 234*36368Ssklower printf(" "); 235*36368Ssklower } 236*36368Ssklower } 237*36368Ssklower 238*36368Ssklower for (j = 0; j < MAX_COLUMNS; j++) { 239*36368Ssklower if (i + j < len) { 240*36368Ssklower if (((buf[i+j]) > 31) && ((buf[i+j]) < 128)) 241*36368Ssklower printf("%c", buf[i+j]&0xff); 242*36368Ssklower else 243*36368Ssklower printf("."); 244*36368Ssklower } 245*36368Ssklower } 246*36368Ssklower printf("\n"); 247*36368Ssklower } 248*36368Ssklower } 249*36368Ssklower 250*36368Ssklower 251*36368Ssklower /* 252*36368Ssklower * The following hacks are a trimmed down version of sprintf. 253*36368Ssklower */ 254*36368Ssklower /*VARARGS1*/ 255*36368Ssklower clnp_sprintf(buf, fmt, x1, x2) 256*36368Ssklower register char *fmt; 257*36368Ssklower unsigned x1, x2; 258*36368Ssklower { 259*36368Ssklower clnp_prf(buf, fmt, &x1, 0); 260*36368Ssklower } 261*36368Ssklower 262*36368Ssklower clnp_prf(buf, fmt, adx, dummy) 263*36368Ssklower register char *buf; 264*36368Ssklower register char *fmt; 265*36368Ssklower register unsigned int *adx; 266*36368Ssklower int dummy; 267*36368Ssklower { 268*36368Ssklower register int b, c, i; 269*36368Ssklower char *s; 270*36368Ssklower char *clnp_printn(); 271*36368Ssklower 272*36368Ssklower loop: 273*36368Ssklower while ((c = *fmt++) != '%') { 274*36368Ssklower if(c == '\0') { 275*36368Ssklower *buf++ = (char)0; 276*36368Ssklower return; 277*36368Ssklower } 278*36368Ssklower *buf++ = c; 279*36368Ssklower } 280*36368Ssklower again: 281*36368Ssklower c = *fmt++; 282*36368Ssklower switch (c) { 283*36368Ssklower case 'l': 284*36368Ssklower goto again; 285*36368Ssklower case 'x': case 'X': 286*36368Ssklower b = 16; 287*36368Ssklower goto number; 288*36368Ssklower case 'd': case 'D': 289*36368Ssklower case 'u': /* what a joke */ 290*36368Ssklower b = 10; 291*36368Ssklower goto number; 292*36368Ssklower case 'o': case 'O': 293*36368Ssklower b = 8; 294*36368Ssklower number: 295*36368Ssklower buf = clnp_printn((unsigned long)*adx, b, buf); 296*36368Ssklower break; 297*36368Ssklower case 'c': 298*36368Ssklower b = *adx; 299*36368Ssklower for (i = 24; i >= 0; i -= 8) 300*36368Ssklower if (c = (b >> i) & 0x7f) 301*36368Ssklower *buf++ = c; 302*36368Ssklower break; 303*36368Ssklower 304*36368Ssklower case 's': 305*36368Ssklower s = (char *)*adx; 306*36368Ssklower while (*s) 307*36368Ssklower *buf++ = *s++; 308*36368Ssklower break; 309*36368Ssklower 310*36368Ssklower case '%': 311*36368Ssklower *buf++ = '%'; 312*36368Ssklower break; 313*36368Ssklower } 314*36368Ssklower adx++; 315*36368Ssklower goto loop; 316*36368Ssklower } 317*36368Ssklower 318*36368Ssklower char * 319*36368Ssklower clnp_printn(n, b, where) 320*36368Ssklower unsigned long n; 321*36368Ssklower int b; 322*36368Ssklower char *where; 323*36368Ssklower { 324*36368Ssklower char prbuf[11]; 325*36368Ssklower register char *cp; 326*36368Ssklower 327*36368Ssklower if (b == 10 && (int)n < 0) { 328*36368Ssklower *where++ = '-'; 329*36368Ssklower n = (unsigned)(-(int)n); 330*36368Ssklower } 331*36368Ssklower cp = prbuf; 332*36368Ssklower do { 333*36368Ssklower *cp++ = "0123456789abcdef"[n%b]; 334*36368Ssklower n /= b; 335*36368Ssklower } while (n); 336*36368Ssklower do { 337*36368Ssklower *where++ = *--cp; 338*36368Ssklower } while (cp > prbuf); 339*36368Ssklower return(where); 340*36368Ssklower } 341*36368Ssklower #endif ARGO_DEBUG 342