xref: /csrg-svn/sys/netiso/clnp_debug.c (revision 37469)
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