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 $ */ 2936368Ssklower 3036368Ssklower #ifndef lint 3136368Ssklower static char *rcsid = "$Header: clnp_debug.c,v 4.2 88/06/29 14:58:34 hagens Exp $"; 3236368Ssklower #endif lint 3336368Ssklower 3436368Ssklower #include "../h/types.h" 3536368Ssklower #include "../h/param.h" 3636368Ssklower #include "../h/mbuf.h" 3736368Ssklower #include "../h/domain.h" 3836368Ssklower #include "../h/protosw.h" 3936368Ssklower #include "../h/socket.h" 4036368Ssklower #include "../h/socketvar.h" 4136368Ssklower #include "../h/errno.h" 4236368Ssklower 4336368Ssklower #include "../net/if.h" 4436368Ssklower #include "../net/route.h" 4536368Ssklower 46*37469Ssklower #include "iso.h" 47*37469Ssklower #include "clnp.h" 48*37469Ssklower #include "clnp_stat.h" 49*37469Ssklower #include "argo_debug.h" 5036368Ssklower 5136368Ssklower #ifdef ARGO_DEBUG 5236368Ssklower 5336368Ssklower #ifdef TESTDEBUG 5436368Ssklower #ifdef notdef 5536368Ssklower struct addr_37 u_37 = { 5636368Ssklower {0x00, 0x02, 0x00, 0x10, 0x20, 0x30, 0x35}, 5736368Ssklower {0x01, 0x02, 0x03, 0x04, 0x50, 0x60, 0x70, 0x80, 0x90} 5836368Ssklower }; 5936368Ssklower struct addr_osinet u_osinet = { 6036368Ssklower {0x00, 0x04}, 6136368Ssklower {0x00, 0x02, 0x00, 0x01, 0x23, 0x42, 0x78, 0x20, 0x01, 0x05, 0x00} 6236368Ssklower }; 6336368Ssklower #endif notdef 6436368Ssklower struct addr_rfc986 u_rfc986 = { 6536368Ssklower {0x00, 0x06}, 6636368Ssklower {0x01, 0xc0, 0x0c, 0x0c, 0xab, 0x11} 6736368Ssklower }; 6836368Ssklower struct addr_rfc986 u_bad = { 6936368Ssklower {0x00, 0x01}, 7036368Ssklower {0x01, 0xc0, 0x0c, 0x0c, 0xab, 0x11} 7136368Ssklower }; 7236368Ssklower #include <stdio.h> 7336368Ssklower main() 7436368Ssklower { 7536368Ssklower struct iso_addr a; 7636368Ssklower 7736368Ssklower a.isoa_afi = AFI_37; 7836368Ssklower a.isoa_u.addr_37 = u_37; 7936368Ssklower a.isoa_len = 17; 8036368Ssklower printf("type 37: %s\n", clnp_iso_addrp(&a)); 8136368Ssklower 8236368Ssklower a.isoa_afi = AFI_OSINET; 8336368Ssklower a.isoa_u.addr_osinet = u_osinet; 8436368Ssklower a.isoa_len = 14; 8536368Ssklower printf("type osinet: %s\n", clnp_iso_addrp(&a)); 8636368Ssklower 8736368Ssklower a.isoa_afi = AFI_RFC986; 8836368Ssklower a.isoa_u.addr_rfc986 = u_rfc986; 8936368Ssklower a.isoa_len = 9; 9036368Ssklower printf("type rfc986: %s\n", clnp_iso_addrp(&a)); 9136368Ssklower 9236368Ssklower a.isoa_afi = 12; 9336368Ssklower a.isoa_u.addr_rfc986 = u_rfc986; 9436368Ssklower a.isoa_len = 9; 9536368Ssklower printf("type bad afi: %s\n", clnp_iso_addrp(&a)); 9636368Ssklower 9736368Ssklower a.isoa_afi = AFI_RFC986; 9836368Ssklower a.isoa_u.addr_rfc986 = u_bad; 9936368Ssklower a.isoa_len = 9; 10036368Ssklower printf("type bad idi: %s\n", clnp_iso_addrp(&a)); 10136368Ssklower } 10236368Ssklower #endif TESTDEBUG 10336368Ssklower 10436368Ssklower unsigned int clnp_debug; 10536368Ssklower static char letters[] = "0123456789abcdef"; 10636368Ssklower 10736368Ssklower /* 10836368Ssklower * Print buffer in hex, return addr of where we left off. 10936368Ssklower * Do not null terminate. 11036368Ssklower */ 11136368Ssklower char * 11236368Ssklower clnp_hexp(src, len, where) 11336368Ssklower char *src; /* src of data to print */ 11436368Ssklower int len; /* lengthof src */ 11536368Ssklower char *where; /* where to put data */ 11636368Ssklower { 11736368Ssklower int i; 11836368Ssklower 11936368Ssklower for (i=0; i<len; i++) { 12036368Ssklower *where++ = letters[src[i] >> 4]; 12136368Ssklower *where++ = letters[src[i] & 0x0f]; 12236368Ssklower } 12336368Ssklower return where; 12436368Ssklower } 12536368Ssklower 12636368Ssklower /* 12736368Ssklower * Return a ptr to a human readable form of an iso addr 12836368Ssklower */ 12936368Ssklower static char iso_addr_b[50]; 13036368Ssklower #define DELIM '.'; 13136368Ssklower 13236368Ssklower char * 13336368Ssklower clnp_iso_addrp(isoa) 13436368Ssklower struct iso_addr *isoa; 13536368Ssklower { 13636368Ssklower char *cp; 13736368Ssklower 13836368Ssklower /* print length */ 13936368Ssklower clnp_sprintf(iso_addr_b, "[%d] ", isoa->isoa_len); 14036368Ssklower 14136368Ssklower /* set cp to end of what we have */ 14236368Ssklower cp = iso_addr_b; 14336368Ssklower while (*cp) 14436368Ssklower cp++; 14536368Ssklower 14636368Ssklower /* print afi */ 147*37469Ssklower cp = clnp_hexp(isoa->isoa_genaddr, (int)isoa->isoa_len, cp); 148*37469Ssklower #ifdef notdef 14936368Ssklower *cp++ = DELIM; 15036368Ssklower 15136368Ssklower /* print type specific part */ 15236368Ssklower switch(isoa->isoa_afi) { 15336368Ssklower case AFI_37: 15436368Ssklower cp = clnp_hexp(isoa->t37_idi, ADDR37_IDI_LEN, cp); 15536368Ssklower *cp++ = DELIM; 15636368Ssklower cp = clnp_hexp(isoa->t37_dsp, ADDR37_DSP_LEN, cp); 15736368Ssklower break; 15836368Ssklower 15936368Ssklower /* case AFI_OSINET:*/ 16036368Ssklower case AFI_RFC986: { 16136368Ssklower u_short idi; 16236368Ssklower 16336368Ssklower /* osinet and rfc986 have idi in the same place */ 16436368Ssklower /* print idi */ 16536368Ssklower cp = clnp_hexp(isoa->rfc986_idi, ADDROSINET_IDI_LEN, cp); 16636368Ssklower *cp++ = DELIM; 16736368Ssklower CTOH(isoa->rfc986_idi[0], isoa->rfc986_idi[1], idi); 16836368Ssklower 16936368Ssklower if (idi == IDI_OSINET) { 17036368Ssklower struct ovl_osinet *oosi = (struct ovl_osinet *)isoa; 17136368Ssklower cp = clnp_hexp(oosi->oosi_orgid, OVLOSINET_ORGID_LEN, cp); 17236368Ssklower *cp++ = DELIM; 17336368Ssklower cp = clnp_hexp(oosi->oosi_snetid, OVLOSINET_SNETID_LEN, cp); 17436368Ssklower *cp++ = DELIM; 17536368Ssklower cp = clnp_hexp(oosi->oosi_snpa, OVLOSINET_SNPA_LEN, cp); 17636368Ssklower *cp++ = DELIM; 17736368Ssklower cp = clnp_hexp(oosi->oosi_nsap, OVLOSINET_NSAP_LEN, cp); 17836368Ssklower } else if (idi == IDI_RFC986) { 17936368Ssklower struct ovl_rfc986 *o986 = (struct ovl_rfc986 *)isoa; 18036368Ssklower cp = clnp_hexp(&o986->o986_vers, 1, cp); 18136368Ssklower *cp++ = DELIM; 18236368Ssklower #ifdef vax 18336368Ssklower clnp_sprintf(cp, "%d.%d.%d.%d.%d", 18436368Ssklower o986->o986_inetaddr[0] & 0xff, 18536368Ssklower o986->o986_inetaddr[1] & 0xff, 18636368Ssklower o986->o986_inetaddr[2] & 0xff, 18736368Ssklower o986->o986_inetaddr[3] & 0xff, 18836368Ssklower o986->o986_upid & 0xff); 18936368Ssklower return(iso_addr_b); 19036368Ssklower #else 19136368Ssklower cp = clnp_hexp(&o986->o986_inetaddr[0], 1, cp); 19236368Ssklower *cp++ = DELIM; 19336368Ssklower cp = clnp_hexp(&o986->o986_inetaddr[1], 1, cp); 19436368Ssklower *cp++ = DELIM; 19536368Ssklower cp = clnp_hexp(&o986->o986_inetaddr[2], 1, cp); 19636368Ssklower *cp++ = DELIM; 19736368Ssklower cp = clnp_hexp(&o986->o986_inetaddr[3], 1, cp); 19836368Ssklower *cp++ = DELIM; 19936368Ssklower cp = clnp_hexp(&o986->o986_upid, 1, cp); 20036368Ssklower #endif vax 20136368Ssklower } 20236368Ssklower 20336368Ssklower } break; 20436368Ssklower 20536368Ssklower default: 20636368Ssklower *cp++ = '?'; 20736368Ssklower break; 20836368Ssklower } 209*37469Ssklower #endif notdef 21036368Ssklower *cp = (char)0; 21136368Ssklower 21236368Ssklower return(iso_addr_b); 21336368Ssklower } 21436368Ssklower 215*37469Ssklower char * 216*37469Ssklower clnp_saddr_isop(s) 217*37469Ssklower register struct sockaddr_iso *s; 21836368Ssklower { 219*37469Ssklower register char *cp = clnp_iso_addrp(&s->siso_addr); 22036368Ssklower 221*37469Ssklower while (*cp) cp++; 222*37469Ssklower *cp++ = '('; 223*37469Ssklower cp = clnp_hexp(TSEL(s), (int)s->siso_tsuffixlen, cp); 224*37469Ssklower *cp++ = ')'; 225*37469Ssklower *cp++ = 0; 226*37469Ssklower return (iso_addr_b); 22736368Ssklower } 22836368Ssklower 22936368Ssklower 23036368Ssklower /* 23136368Ssklower * The following hacks are a trimmed down version of sprintf. 23236368Ssklower */ 23336368Ssklower /*VARARGS1*/ 234*37469Ssklower /*ARGSUSED*/ 23536368Ssklower clnp_sprintf(buf, fmt, x1, x2) 236*37469Ssklower register char *buf, *fmt; 23736368Ssklower unsigned x1, x2; 23836368Ssklower { 239*37469Ssklower clnp_prf(buf, fmt, (unsigned int *)&x1); 24036368Ssklower } 24136368Ssklower 242*37469Ssklower clnp_prf(buf, fmt, adx) 24336368Ssklower register char *buf; 24436368Ssklower register char *fmt; 24536368Ssklower register unsigned int *adx; 24636368Ssklower { 24736368Ssklower register int b, c, i; 24836368Ssklower char *s; 24936368Ssklower char *clnp_printn(); 25036368Ssklower 25136368Ssklower loop: 25236368Ssklower while ((c = *fmt++) != '%') { 25336368Ssklower if(c == '\0') { 25436368Ssklower *buf++ = (char)0; 25536368Ssklower return; 25636368Ssklower } 25736368Ssklower *buf++ = c; 25836368Ssklower } 25936368Ssklower again: 26036368Ssklower c = *fmt++; 26136368Ssklower switch (c) { 26236368Ssklower case 'l': 26336368Ssklower goto again; 26436368Ssklower case 'x': case 'X': 26536368Ssklower b = 16; 26636368Ssklower goto number; 26736368Ssklower case 'd': case 'D': 26836368Ssklower case 'u': /* what a joke */ 26936368Ssklower b = 10; 27036368Ssklower goto number; 27136368Ssklower case 'o': case 'O': 27236368Ssklower b = 8; 27336368Ssklower number: 27436368Ssklower buf = clnp_printn((unsigned long)*adx, b, buf); 27536368Ssklower break; 27636368Ssklower case 'c': 27736368Ssklower b = *adx; 27836368Ssklower for (i = 24; i >= 0; i -= 8) 27936368Ssklower if (c = (b >> i) & 0x7f) 28036368Ssklower *buf++ = c; 28136368Ssklower break; 28236368Ssklower 28336368Ssklower case 's': 28436368Ssklower s = (char *)*adx; 28536368Ssklower while (*s) 28636368Ssklower *buf++ = *s++; 28736368Ssklower break; 28836368Ssklower 28936368Ssklower case '%': 29036368Ssklower *buf++ = '%'; 29136368Ssklower break; 29236368Ssklower } 29336368Ssklower adx++; 29436368Ssklower goto loop; 29536368Ssklower } 29636368Ssklower 29736368Ssklower char * 29836368Ssklower clnp_printn(n, b, where) 29936368Ssklower unsigned long n; 30036368Ssklower int b; 30136368Ssklower char *where; 30236368Ssklower { 30336368Ssklower char prbuf[11]; 30436368Ssklower register char *cp; 30536368Ssklower 30636368Ssklower if (b == 10 && (int)n < 0) { 30736368Ssklower *where++ = '-'; 30836368Ssklower n = (unsigned)(-(int)n); 30936368Ssklower } 31036368Ssklower cp = prbuf; 31136368Ssklower do { 31236368Ssklower *cp++ = "0123456789abcdef"[n%b]; 31336368Ssklower n /= b; 31436368Ssklower } while (n); 31536368Ssklower do { 31636368Ssklower *where++ = *--cp; 31736368Ssklower } while (cp > prbuf); 31836368Ssklower return(where); 31936368Ssklower } 32036368Ssklower #endif ARGO_DEBUG 321