136368Ssklower /*********************************************************** 236368Ssklower Copyright IBM Corporation 1987 336368Ssklower 436368Ssklower All Rights Reserved 536368Ssklower 636368Ssklower Permission to use, copy, modify, and distribute this software and its 736368Ssklower documentation for any purpose and without fee is hereby granted, 836368Ssklower provided that the above copyright notice appear in all copies and that 936368Ssklower both that copyright notice and this permission notice appear in 1036368Ssklower supporting documentation, and that the name of IBM not be 1136368Ssklower used in advertising or publicity pertaining to distribution of the 1236368Ssklower software without specific, written prior permission. 1336368Ssklower 1436368Ssklower IBM DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 1536368Ssklower ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 1636368Ssklower IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 1736368Ssklower ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 1836368Ssklower WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 1936368Ssklower ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 2036368Ssklower SOFTWARE. 2136368Ssklower 2236368Ssklower ******************************************************************/ 2336368Ssklower 2436368Ssklower /* 2536368Ssklower * ARGO Project, Computer Sciences Dept., University of Wisconsin - Madison 2636368Ssklower */ 2736368Ssklower /* $Header: clnp_debug.c,v 4.2 88/06/29 14:58:34 hagens Exp $ */ 2836368Ssklower /* $Source: /usr/argo/sys/netargo/RCS/clnp_debug.c,v $ */ 29*38841Ssklower /* @(#)clnp_debug.c 7.4 (Berkeley) 08/29/89 */ 3036368Ssklower 3136368Ssklower #ifndef lint 3236368Ssklower static char *rcsid = "$Header: clnp_debug.c,v 4.2 88/06/29 14:58:34 hagens Exp $"; 3336368Ssklower #endif lint 3436368Ssklower 3537536Smckusick #include "types.h" 3637536Smckusick #include "param.h" 3737536Smckusick #include "mbuf.h" 3837536Smckusick #include "domain.h" 3937536Smckusick #include "protosw.h" 4037536Smckusick #include "socket.h" 4137536Smckusick #include "socketvar.h" 4237536Smckusick #include "errno.h" 4336368Ssklower 4436368Ssklower #include "../net/if.h" 4536368Ssklower #include "../net/route.h" 4636368Ssklower 4737469Ssklower #include "iso.h" 4837469Ssklower #include "clnp.h" 4937469Ssklower #include "clnp_stat.h" 5037469Ssklower #include "argo_debug.h" 5136368Ssklower 5236368Ssklower #ifdef ARGO_DEBUG 5336368Ssklower 5436368Ssklower #ifdef TESTDEBUG 5536368Ssklower #ifdef notdef 5636368Ssklower struct addr_37 u_37 = { 5736368Ssklower {0x00, 0x02, 0x00, 0x10, 0x20, 0x30, 0x35}, 5836368Ssklower {0x01, 0x02, 0x03, 0x04, 0x50, 0x60, 0x70, 0x80, 0x90} 5936368Ssklower }; 6036368Ssklower struct addr_osinet u_osinet = { 6136368Ssklower {0x00, 0x04}, 6236368Ssklower {0x00, 0x02, 0x00, 0x01, 0x23, 0x42, 0x78, 0x20, 0x01, 0x05, 0x00} 6336368Ssklower }; 6436368Ssklower #endif notdef 6536368Ssklower struct addr_rfc986 u_rfc986 = { 6636368Ssklower {0x00, 0x06}, 6736368Ssklower {0x01, 0xc0, 0x0c, 0x0c, 0xab, 0x11} 6836368Ssklower }; 6936368Ssklower struct addr_rfc986 u_bad = { 7036368Ssklower {0x00, 0x01}, 7136368Ssklower {0x01, 0xc0, 0x0c, 0x0c, 0xab, 0x11} 7236368Ssklower }; 7336368Ssklower #include <stdio.h> 7436368Ssklower main() 7536368Ssklower { 7636368Ssklower struct iso_addr a; 7736368Ssklower 7836368Ssklower a.isoa_afi = AFI_37; 7936368Ssklower a.isoa_u.addr_37 = u_37; 8036368Ssklower a.isoa_len = 17; 8136368Ssklower printf("type 37: %s\n", clnp_iso_addrp(&a)); 8236368Ssklower 8336368Ssklower a.isoa_afi = AFI_OSINET; 8436368Ssklower a.isoa_u.addr_osinet = u_osinet; 8536368Ssklower a.isoa_len = 14; 8636368Ssklower printf("type osinet: %s\n", clnp_iso_addrp(&a)); 8736368Ssklower 8836368Ssklower a.isoa_afi = AFI_RFC986; 8936368Ssklower a.isoa_u.addr_rfc986 = u_rfc986; 9036368Ssklower a.isoa_len = 9; 9136368Ssklower printf("type rfc986: %s\n", clnp_iso_addrp(&a)); 9236368Ssklower 9336368Ssklower a.isoa_afi = 12; 9436368Ssklower a.isoa_u.addr_rfc986 = u_rfc986; 9536368Ssklower a.isoa_len = 9; 9636368Ssklower printf("type bad afi: %s\n", clnp_iso_addrp(&a)); 9736368Ssklower 9836368Ssklower a.isoa_afi = AFI_RFC986; 9936368Ssklower a.isoa_u.addr_rfc986 = u_bad; 10036368Ssklower a.isoa_len = 9; 10136368Ssklower printf("type bad idi: %s\n", clnp_iso_addrp(&a)); 10236368Ssklower } 10336368Ssklower #endif TESTDEBUG 10436368Ssklower 10536368Ssklower unsigned int clnp_debug; 10636368Ssklower static char letters[] = "0123456789abcdef"; 10736368Ssklower 10836368Ssklower /* 10936368Ssklower * Print buffer in hex, return addr of where we left off. 11036368Ssklower * Do not null terminate. 11136368Ssklower */ 11236368Ssklower char * 11336368Ssklower clnp_hexp(src, len, where) 11436368Ssklower char *src; /* src of data to print */ 11536368Ssklower int len; /* lengthof src */ 11636368Ssklower char *where; /* where to put data */ 11736368Ssklower { 11836368Ssklower int i; 11936368Ssklower 12036368Ssklower for (i=0; i<len; i++) { 12136368Ssklower *where++ = letters[src[i] >> 4]; 12236368Ssklower *where++ = letters[src[i] & 0x0f]; 12336368Ssklower } 12436368Ssklower return where; 12536368Ssklower } 12636368Ssklower 12736368Ssklower /* 12836368Ssklower * Return a ptr to a human readable form of an iso addr 12936368Ssklower */ 13036368Ssklower static char iso_addr_b[50]; 13136368Ssklower #define DELIM '.'; 13236368Ssklower 13336368Ssklower char * 13436368Ssklower clnp_iso_addrp(isoa) 13536368Ssklower struct iso_addr *isoa; 13636368Ssklower { 13736368Ssklower char *cp; 13836368Ssklower 13936368Ssklower /* print length */ 14036368Ssklower clnp_sprintf(iso_addr_b, "[%d] ", isoa->isoa_len); 14136368Ssklower 14236368Ssklower /* set cp to end of what we have */ 14336368Ssklower cp = iso_addr_b; 14436368Ssklower while (*cp) 14536368Ssklower cp++; 14636368Ssklower 14736368Ssklower /* print afi */ 14837469Ssklower cp = clnp_hexp(isoa->isoa_genaddr, (int)isoa->isoa_len, cp); 14937469Ssklower #ifdef notdef 15036368Ssklower *cp++ = DELIM; 15136368Ssklower 15236368Ssklower /* print type specific part */ 15336368Ssklower switch(isoa->isoa_afi) { 15436368Ssklower case AFI_37: 15536368Ssklower cp = clnp_hexp(isoa->t37_idi, ADDR37_IDI_LEN, cp); 15636368Ssklower *cp++ = DELIM; 15736368Ssklower cp = clnp_hexp(isoa->t37_dsp, ADDR37_DSP_LEN, cp); 15836368Ssklower break; 15936368Ssklower 16036368Ssklower /* case AFI_OSINET:*/ 16136368Ssklower case AFI_RFC986: { 16236368Ssklower u_short idi; 16336368Ssklower 16436368Ssklower /* osinet and rfc986 have idi in the same place */ 16536368Ssklower /* print idi */ 16636368Ssklower cp = clnp_hexp(isoa->rfc986_idi, ADDROSINET_IDI_LEN, cp); 16736368Ssklower *cp++ = DELIM; 16836368Ssklower CTOH(isoa->rfc986_idi[0], isoa->rfc986_idi[1], idi); 16936368Ssklower 17036368Ssklower if (idi == IDI_OSINET) { 17136368Ssklower struct ovl_osinet *oosi = (struct ovl_osinet *)isoa; 17236368Ssklower cp = clnp_hexp(oosi->oosi_orgid, OVLOSINET_ORGID_LEN, cp); 17336368Ssklower *cp++ = DELIM; 17436368Ssklower cp = clnp_hexp(oosi->oosi_snetid, OVLOSINET_SNETID_LEN, cp); 17536368Ssklower *cp++ = DELIM; 17636368Ssklower cp = clnp_hexp(oosi->oosi_snpa, OVLOSINET_SNPA_LEN, cp); 17736368Ssklower *cp++ = DELIM; 17836368Ssklower cp = clnp_hexp(oosi->oosi_nsap, OVLOSINET_NSAP_LEN, cp); 17936368Ssklower } else if (idi == IDI_RFC986) { 18036368Ssklower struct ovl_rfc986 *o986 = (struct ovl_rfc986 *)isoa; 18136368Ssklower cp = clnp_hexp(&o986->o986_vers, 1, cp); 18236368Ssklower *cp++ = DELIM; 18336368Ssklower #ifdef vax 18436368Ssklower clnp_sprintf(cp, "%d.%d.%d.%d.%d", 18536368Ssklower o986->o986_inetaddr[0] & 0xff, 18636368Ssklower o986->o986_inetaddr[1] & 0xff, 18736368Ssklower o986->o986_inetaddr[2] & 0xff, 18836368Ssklower o986->o986_inetaddr[3] & 0xff, 18936368Ssklower o986->o986_upid & 0xff); 19036368Ssklower return(iso_addr_b); 19136368Ssklower #else 19236368Ssklower cp = clnp_hexp(&o986->o986_inetaddr[0], 1, cp); 19336368Ssklower *cp++ = DELIM; 19436368Ssklower cp = clnp_hexp(&o986->o986_inetaddr[1], 1, cp); 19536368Ssklower *cp++ = DELIM; 19636368Ssklower cp = clnp_hexp(&o986->o986_inetaddr[2], 1, cp); 19736368Ssklower *cp++ = DELIM; 19836368Ssklower cp = clnp_hexp(&o986->o986_inetaddr[3], 1, cp); 19936368Ssklower *cp++ = DELIM; 20036368Ssklower cp = clnp_hexp(&o986->o986_upid, 1, cp); 20136368Ssklower #endif vax 20236368Ssklower } 20336368Ssklower 20436368Ssklower } break; 20536368Ssklower 20636368Ssklower default: 20736368Ssklower *cp++ = '?'; 20836368Ssklower break; 20936368Ssklower } 21037469Ssklower #endif notdef 21136368Ssklower *cp = (char)0; 21236368Ssklower 21336368Ssklower return(iso_addr_b); 21436368Ssklower } 21536368Ssklower 21637469Ssklower char * 21737469Ssklower clnp_saddr_isop(s) 21837469Ssklower register struct sockaddr_iso *s; 21936368Ssklower { 22037469Ssklower register char *cp = clnp_iso_addrp(&s->siso_addr); 22136368Ssklower 22237469Ssklower while (*cp) cp++; 22337469Ssklower *cp++ = '('; 224*38841Ssklower cp = clnp_hexp(TSEL(s), (int)s->siso_tlen, cp); 22537469Ssklower *cp++ = ')'; 22637469Ssklower *cp++ = 0; 22737469Ssklower return (iso_addr_b); 22836368Ssklower } 22936368Ssklower 23036368Ssklower 23136368Ssklower /* 23236368Ssklower * The following hacks are a trimmed down version of sprintf. 23336368Ssklower */ 23436368Ssklower /*VARARGS1*/ 23537469Ssklower /*ARGSUSED*/ 23636368Ssklower clnp_sprintf(buf, fmt, x1, x2) 23737469Ssklower register char *buf, *fmt; 23836368Ssklower unsigned x1, x2; 23936368Ssklower { 24037469Ssklower clnp_prf(buf, fmt, (unsigned int *)&x1); 24136368Ssklower } 24236368Ssklower 24337469Ssklower clnp_prf(buf, fmt, adx) 24436368Ssklower register char *buf; 24536368Ssklower register char *fmt; 24636368Ssklower register unsigned int *adx; 24736368Ssklower { 24836368Ssklower register int b, c, i; 24936368Ssklower char *s; 25036368Ssklower char *clnp_printn(); 25136368Ssklower 25236368Ssklower loop: 25336368Ssklower while ((c = *fmt++) != '%') { 25436368Ssklower if(c == '\0') { 25536368Ssklower *buf++ = (char)0; 25636368Ssklower return; 25736368Ssklower } 25836368Ssklower *buf++ = c; 25936368Ssklower } 26036368Ssklower again: 26136368Ssklower c = *fmt++; 26236368Ssklower switch (c) { 26336368Ssklower case 'l': 26436368Ssklower goto again; 26536368Ssklower case 'x': case 'X': 26636368Ssklower b = 16; 26736368Ssklower goto number; 26836368Ssklower case 'd': case 'D': 26936368Ssklower case 'u': /* what a joke */ 27036368Ssklower b = 10; 27136368Ssklower goto number; 27236368Ssklower case 'o': case 'O': 27336368Ssklower b = 8; 27436368Ssklower number: 27536368Ssklower buf = clnp_printn((unsigned long)*adx, b, buf); 27636368Ssklower break; 27736368Ssklower case 'c': 27836368Ssklower b = *adx; 27936368Ssklower for (i = 24; i >= 0; i -= 8) 28036368Ssklower if (c = (b >> i) & 0x7f) 28136368Ssklower *buf++ = c; 28236368Ssklower break; 28336368Ssklower 28436368Ssklower case 's': 28536368Ssklower s = (char *)*adx; 28636368Ssklower while (*s) 28736368Ssklower *buf++ = *s++; 28836368Ssklower break; 28936368Ssklower 29036368Ssklower case '%': 29136368Ssklower *buf++ = '%'; 29236368Ssklower break; 29336368Ssklower } 29436368Ssklower adx++; 29536368Ssklower goto loop; 29636368Ssklower } 29736368Ssklower 29836368Ssklower char * 29936368Ssklower clnp_printn(n, b, where) 30036368Ssklower unsigned long n; 30136368Ssklower int b; 30236368Ssklower char *where; 30336368Ssklower { 30436368Ssklower char prbuf[11]; 30536368Ssklower register char *cp; 30636368Ssklower 30736368Ssklower if (b == 10 && (int)n < 0) { 30836368Ssklower *where++ = '-'; 30936368Ssklower n = (unsigned)(-(int)n); 31036368Ssklower } 31136368Ssklower cp = prbuf; 31236368Ssklower do { 31336368Ssklower *cp++ = "0123456789abcdef"[n%b]; 31436368Ssklower n /= b; 31536368Ssklower } while (n); 31636368Ssklower do { 31736368Ssklower *where++ = *--cp; 31836368Ssklower } while (cp > prbuf); 31936368Ssklower return(where); 32036368Ssklower } 32136368Ssklower #endif ARGO_DEBUG 322