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