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