xref: /freebsd/contrib/tcpdump/print-decnet.c (revision 4edb46e9a85ca35d3bed523171d11a748861ce82)
14edb46e9SPaul Traina /*
24edb46e9SPaul Traina  * Copyright (c) 1992, 1993, 1994, 1995, 1996
34edb46e9SPaul Traina  *	The Regents of the University of California.  All rights reserved.
44edb46e9SPaul Traina  *
54edb46e9SPaul Traina  * Redistribution and use in source and binary forms, with or without
64edb46e9SPaul Traina  * modification, are permitted provided that: (1) source code distributions
74edb46e9SPaul Traina  * retain the above copyright notice and this paragraph in its entirety, (2)
84edb46e9SPaul Traina  * distributions including binary code include the above copyright notice and
94edb46e9SPaul Traina  * this paragraph in its entirety in the documentation or other materials
104edb46e9SPaul Traina  * provided with the distribution, and (3) all advertising materials mentioning
114edb46e9SPaul Traina  * features or use of this software display the following acknowledgement:
124edb46e9SPaul Traina  * ``This product includes software developed by the University of California,
134edb46e9SPaul Traina  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
144edb46e9SPaul Traina  * the University nor the names of its contributors may be used to endorse
154edb46e9SPaul Traina  * or promote products derived from this software without specific prior
164edb46e9SPaul Traina  * written permission.
174edb46e9SPaul Traina  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
184edb46e9SPaul Traina  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
194edb46e9SPaul Traina  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
204edb46e9SPaul Traina  */
214edb46e9SPaul Traina 
224edb46e9SPaul Traina #ifndef lint
234edb46e9SPaul Traina static char rcsid[] =
244edb46e9SPaul Traina     "@(#) $Header: print-decnet.c,v 1.22 96/07/23 14:17:22 leres Exp $ (LBL)";
254edb46e9SPaul Traina #endif
264edb46e9SPaul Traina 
274edb46e9SPaul Traina #include <sys/param.h>
284edb46e9SPaul Traina #include <sys/time.h>
294edb46e9SPaul Traina #include <sys/socket.h>
304edb46e9SPaul Traina 
314edb46e9SPaul Traina #if __STDC__
324edb46e9SPaul Traina struct mbuf;
334edb46e9SPaul Traina struct rtentry;
344edb46e9SPaul Traina #endif
354edb46e9SPaul Traina #include <net/if.h>
364edb46e9SPaul Traina 
374edb46e9SPaul Traina #ifdef	HAVE_LIBDNET
384edb46e9SPaul Traina #include <netdnet/dnetdb.h>
394edb46e9SPaul Traina #endif
404edb46e9SPaul Traina 
414edb46e9SPaul Traina #include <ctype.h>
424edb46e9SPaul Traina #include <stdio.h>
434edb46e9SPaul Traina #include <stdlib.h>
444edb46e9SPaul Traina #include <string.h>
454edb46e9SPaul Traina #include <unistd.h>
464edb46e9SPaul Traina 
474edb46e9SPaul Traina #include "decnet.h"
484edb46e9SPaul Traina #include "extract.h"
494edb46e9SPaul Traina #include "interface.h"
504edb46e9SPaul Traina #include "addrtoname.h"
514edb46e9SPaul Traina 
524edb46e9SPaul Traina /* Forwards */
534edb46e9SPaul Traina static void print_decnet_ctlmsg(const union routehdr *, u_int);
544edb46e9SPaul Traina static void print_t_info(int);
554edb46e9SPaul Traina static void print_l1_routes(const char *, u_int);
564edb46e9SPaul Traina static void print_l2_routes(const char *, u_int);
574edb46e9SPaul Traina static void print_i_info(int);
584edb46e9SPaul Traina static void print_elist(const char *, u_int);
594edb46e9SPaul Traina static void print_nsp(const u_char *, u_int);
604edb46e9SPaul Traina static void print_reason(int);
614edb46e9SPaul Traina #ifdef	PRINT_NSPDATA
624edb46e9SPaul Traina static void pdata(u_char *, int);
634edb46e9SPaul Traina #endif
644edb46e9SPaul Traina 
654edb46e9SPaul Traina #ifdef	HAVE_LIBDNET
664edb46e9SPaul Traina extern char *dnet_htoa(struct dn_naddr *);
674edb46e9SPaul Traina #endif
684edb46e9SPaul Traina 
694edb46e9SPaul Traina void
704edb46e9SPaul Traina decnet_print(register const u_char *ap, register u_int length,
714edb46e9SPaul Traina 	     register u_int caplen)
724edb46e9SPaul Traina {
734edb46e9SPaul Traina 	static union routehdr rhcopy;
744edb46e9SPaul Traina 	register union routehdr *rhp = &rhcopy;
754edb46e9SPaul Traina 	register int mflags;
764edb46e9SPaul Traina 	int dst, src, hops;
774edb46e9SPaul Traina 	u_int rhlen, nsplen, pktlen;
784edb46e9SPaul Traina 	const u_char *nspp;
794edb46e9SPaul Traina 
804edb46e9SPaul Traina 	if (length < sizeof(struct shorthdr)) {
814edb46e9SPaul Traina 		(void)printf("[|decnet]");
824edb46e9SPaul Traina 		return;
834edb46e9SPaul Traina 	}
844edb46e9SPaul Traina 
854edb46e9SPaul Traina 	pktlen = EXTRACT_LE_16BITS(ap);
864edb46e9SPaul Traina 
874edb46e9SPaul Traina 	rhlen = min(length, caplen);
884edb46e9SPaul Traina 	rhlen = min(rhlen, sizeof(*rhp));
894edb46e9SPaul Traina 	memcpy((char *)rhp, (char *)&(ap[sizeof(short)]), rhlen);
904edb46e9SPaul Traina 
914edb46e9SPaul Traina 	mflags = EXTRACT_LE_8BITS(rhp->rh_short.sh_flags);
924edb46e9SPaul Traina 
934edb46e9SPaul Traina 	if (mflags & RMF_PAD) {
944edb46e9SPaul Traina 	    /* pad bytes of some sort in front of message */
954edb46e9SPaul Traina 	    u_int padlen = mflags & RMF_PADMASK;
964edb46e9SPaul Traina 	    if (vflag)
974edb46e9SPaul Traina 		(void) printf("[pad:%d] ", padlen);
984edb46e9SPaul Traina 	    ap += padlen;
994edb46e9SPaul Traina 	    length -= padlen;
1004edb46e9SPaul Traina 	    caplen -= padlen;
1014edb46e9SPaul Traina 	    rhlen = min(length, caplen);
1024edb46e9SPaul Traina 	    rhlen = min(rhlen, sizeof(*rhp));
1034edb46e9SPaul Traina 	    memcpy((char *)rhp, (char *)&(ap[sizeof(short)]), rhlen);
1044edb46e9SPaul Traina 	    mflags = EXTRACT_LE_8BITS(rhp->rh_short.sh_flags);
1054edb46e9SPaul Traina 	}
1064edb46e9SPaul Traina 
1074edb46e9SPaul Traina 	if (mflags & RMF_FVER) {
1084edb46e9SPaul Traina 		(void) printf("future-version-decnet");
1094edb46e9SPaul Traina 		default_print(ap, length);
1104edb46e9SPaul Traina 		return;
1114edb46e9SPaul Traina 	}
1124edb46e9SPaul Traina 
1134edb46e9SPaul Traina 	/* is it a control message? */
1144edb46e9SPaul Traina 	if (mflags & RMF_CTLMSG) {
1154edb46e9SPaul Traina 		print_decnet_ctlmsg(rhp, min(length, caplen));
1164edb46e9SPaul Traina 		return;
1174edb46e9SPaul Traina 	}
1184edb46e9SPaul Traina 
1194edb46e9SPaul Traina 	switch (mflags & RMF_MASK) {
1204edb46e9SPaul Traina 	case RMF_LONG:
1214edb46e9SPaul Traina 	    dst =
1224edb46e9SPaul Traina 		EXTRACT_LE_16BITS(rhp->rh_long.lg_dst.dne_remote.dne_nodeaddr);
1234edb46e9SPaul Traina 	    src =
1244edb46e9SPaul Traina 		EXTRACT_LE_16BITS(rhp->rh_long.lg_src.dne_remote.dne_nodeaddr);
1254edb46e9SPaul Traina 	    hops = EXTRACT_LE_8BITS(rhp->rh_long.lg_visits);
1264edb46e9SPaul Traina 	    nspp = &(ap[sizeof(short) + sizeof(struct longhdr)]);
1274edb46e9SPaul Traina 	    nsplen = min((length - sizeof(struct longhdr)),
1284edb46e9SPaul Traina 			 (caplen - sizeof(struct longhdr)));
1294edb46e9SPaul Traina 	    break;
1304edb46e9SPaul Traina 	case RMF_SHORT:
1314edb46e9SPaul Traina 	    dst = EXTRACT_LE_16BITS(rhp->rh_short.sh_dst);
1324edb46e9SPaul Traina 	    src = EXTRACT_LE_16BITS(rhp->rh_short.sh_src);
1334edb46e9SPaul Traina 	    hops = (EXTRACT_LE_8BITS(rhp->rh_short.sh_visits) & VIS_MASK)+1;
1344edb46e9SPaul Traina 	    nspp = &(ap[sizeof(short) + sizeof(struct shorthdr)]);
1354edb46e9SPaul Traina 	    nsplen = min((length - sizeof(struct shorthdr)),
1364edb46e9SPaul Traina 			 (caplen - sizeof(struct shorthdr)));
1374edb46e9SPaul Traina 	    break;
1384edb46e9SPaul Traina 	default:
1394edb46e9SPaul Traina 	    (void) printf("unknown message flags under mask");
1404edb46e9SPaul Traina 	    default_print((u_char *)ap, length);
1414edb46e9SPaul Traina 	    return;
1424edb46e9SPaul Traina 	}
1434edb46e9SPaul Traina 
1444edb46e9SPaul Traina 	(void)printf("%s > %s %d ",
1454edb46e9SPaul Traina 			dnaddr_string(src), dnaddr_string(dst), pktlen);
1464edb46e9SPaul Traina 	if (vflag) {
1474edb46e9SPaul Traina 	    if (mflags & RMF_RQR)
1484edb46e9SPaul Traina 		(void)printf("RQR ");
1494edb46e9SPaul Traina 	    if (mflags & RMF_RTS)
1504edb46e9SPaul Traina 		(void)printf("RTS ");
1514edb46e9SPaul Traina 	    if (mflags & RMF_IE)
1524edb46e9SPaul Traina 		(void)printf("IE ");
1534edb46e9SPaul Traina 	    (void)printf("%d hops ", hops);
1544edb46e9SPaul Traina 	}
1554edb46e9SPaul Traina 
1564edb46e9SPaul Traina 	print_nsp(nspp, nsplen);
1574edb46e9SPaul Traina }
1584edb46e9SPaul Traina 
1594edb46e9SPaul Traina static void
1604edb46e9SPaul Traina print_decnet_ctlmsg(register const union routehdr *rhp, u_int length)
1614edb46e9SPaul Traina {
1624edb46e9SPaul Traina 	int mflags = EXTRACT_LE_8BITS(rhp->rh_short.sh_flags);
1634edb46e9SPaul Traina 	register union controlmsg *cmp = (union controlmsg *)rhp;
1644edb46e9SPaul Traina 	int src, dst, info, blksize, eco, ueco, hello, other, vers;
1654edb46e9SPaul Traina 	etheraddr srcea, rtea;
1664edb46e9SPaul Traina 	int priority;
1674edb46e9SPaul Traina 	char *rhpx = (char *)rhp;
1684edb46e9SPaul Traina 
1694edb46e9SPaul Traina 	switch (mflags & RMF_CTLMASK) {
1704edb46e9SPaul Traina 	case RMF_INIT:
1714edb46e9SPaul Traina 	    (void)printf("init ");
1724edb46e9SPaul Traina 	    src = EXTRACT_LE_16BITS(cmp->cm_init.in_src);
1734edb46e9SPaul Traina 	    info = EXTRACT_LE_8BITS(cmp->cm_init.in_info);
1744edb46e9SPaul Traina 	    blksize = EXTRACT_LE_16BITS(cmp->cm_init.in_blksize);
1754edb46e9SPaul Traina 	    vers = EXTRACT_LE_8BITS(cmp->cm_init.in_vers);
1764edb46e9SPaul Traina 	    eco = EXTRACT_LE_8BITS(cmp->cm_init.in_eco);
1774edb46e9SPaul Traina 	    ueco = EXTRACT_LE_8BITS(cmp->cm_init.in_ueco);
1784edb46e9SPaul Traina 	    hello = EXTRACT_LE_16BITS(cmp->cm_init.in_hello);
1794edb46e9SPaul Traina 	    print_t_info(info);
1804edb46e9SPaul Traina 	    (void)printf(
1814edb46e9SPaul Traina 		"src %sblksize %d vers %d eco %d ueco %d hello %d",
1824edb46e9SPaul Traina 			dnaddr_string(src), blksize, vers, eco, ueco,
1834edb46e9SPaul Traina 			hello);
1844edb46e9SPaul Traina 	    break;
1854edb46e9SPaul Traina 	case RMF_VER:
1864edb46e9SPaul Traina 	    (void)printf("verification ");
1874edb46e9SPaul Traina 	    src = EXTRACT_LE_16BITS(cmp->cm_ver.ve_src);
1884edb46e9SPaul Traina 	    other = EXTRACT_LE_8BITS(cmp->cm_ver.ve_fcnval);
1894edb46e9SPaul Traina 	    (void)printf("src %s fcnval %o", dnaddr_string(src), other);
1904edb46e9SPaul Traina 	    break;
1914edb46e9SPaul Traina 	case RMF_TEST:
1924edb46e9SPaul Traina 	    (void)printf("test ");
1934edb46e9SPaul Traina 	    src = EXTRACT_LE_16BITS(cmp->cm_test.te_src);
1944edb46e9SPaul Traina 	    other = EXTRACT_LE_8BITS(cmp->cm_test.te_data);
1954edb46e9SPaul Traina 	    (void)printf("src %s data %o", dnaddr_string(src), other);
1964edb46e9SPaul Traina 	    break;
1974edb46e9SPaul Traina 	case RMF_L1ROUT:
1984edb46e9SPaul Traina 	    (void)printf("lev-1-routing ");
1994edb46e9SPaul Traina 	    src = EXTRACT_LE_16BITS(cmp->cm_l1rou.r1_src);
2004edb46e9SPaul Traina 	    (void)printf("src %s ", dnaddr_string(src));
2014edb46e9SPaul Traina 	    print_l1_routes(&(rhpx[sizeof(struct l1rout)]),
2024edb46e9SPaul Traina 				length - sizeof(struct l1rout));
2034edb46e9SPaul Traina 	    break;
2044edb46e9SPaul Traina 	case RMF_L2ROUT:
2054edb46e9SPaul Traina 	    (void)printf("lev-2-routing ");
2064edb46e9SPaul Traina 	    src = EXTRACT_LE_16BITS(cmp->cm_l2rout.r2_src);
2074edb46e9SPaul Traina 	    (void)printf("src %s ", dnaddr_string(src));
2084edb46e9SPaul Traina 	    print_l2_routes(&(rhpx[sizeof(struct l2rout)]),
2094edb46e9SPaul Traina 				length - sizeof(struct l2rout));
2104edb46e9SPaul Traina 	    break;
2114edb46e9SPaul Traina 	case RMF_RHELLO:
2124edb46e9SPaul Traina 	    (void)printf("router-hello ");
2134edb46e9SPaul Traina 	    vers = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_vers);
2144edb46e9SPaul Traina 	    eco = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_eco);
2154edb46e9SPaul Traina 	    ueco = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_ueco);
2164edb46e9SPaul Traina 	    memcpy((char *)&srcea, (char *)&(cmp->cm_rhello.rh_src),
2174edb46e9SPaul Traina 		sizeof(srcea));
2184edb46e9SPaul Traina 	    src = EXTRACT_LE_16BITS(srcea.dne_remote.dne_nodeaddr);
2194edb46e9SPaul Traina 	    info = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_info);
2204edb46e9SPaul Traina 	    blksize = EXTRACT_LE_16BITS(cmp->cm_rhello.rh_blksize);
2214edb46e9SPaul Traina 	    priority = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_priority);
2224edb46e9SPaul Traina 	    hello = EXTRACT_LE_16BITS(cmp->cm_rhello.rh_hello);
2234edb46e9SPaul Traina 	    print_i_info(info);
2244edb46e9SPaul Traina 	    (void)printf(
2254edb46e9SPaul Traina 	    "vers %d eco %d ueco %d src %s blksize %d pri %d hello %d",
2264edb46e9SPaul Traina 			vers, eco, ueco, dnaddr_string(src),
2274edb46e9SPaul Traina 			blksize, priority, hello);
2284edb46e9SPaul Traina 	    print_elist(&(rhpx[sizeof(struct rhellomsg)]),
2294edb46e9SPaul Traina 				length - sizeof(struct rhellomsg));
2304edb46e9SPaul Traina 	    break;
2314edb46e9SPaul Traina 	case RMF_EHELLO:
2324edb46e9SPaul Traina 	    (void)printf("endnode-hello ");
2334edb46e9SPaul Traina 	    vers = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_vers);
2344edb46e9SPaul Traina 	    eco = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_eco);
2354edb46e9SPaul Traina 	    ueco = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_ueco);
2364edb46e9SPaul Traina 	    memcpy((char *)&srcea, (char *)&(cmp->cm_ehello.eh_src),
2374edb46e9SPaul Traina 		sizeof(srcea));
2384edb46e9SPaul Traina 	    src = EXTRACT_LE_16BITS(srcea.dne_remote.dne_nodeaddr);
2394edb46e9SPaul Traina 	    info = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_info);
2404edb46e9SPaul Traina 	    blksize = EXTRACT_LE_16BITS(cmp->cm_ehello.eh_blksize);
2414edb46e9SPaul Traina 	    /*seed*/
2424edb46e9SPaul Traina 	    memcpy((char *)&rtea, (char *)&(cmp->cm_ehello.eh_router),
2434edb46e9SPaul Traina 		sizeof(rtea));
2444edb46e9SPaul Traina 	    dst = EXTRACT_LE_16BITS(rtea.dne_remote.dne_nodeaddr);
2454edb46e9SPaul Traina 	    hello = EXTRACT_LE_16BITS(cmp->cm_ehello.eh_hello);
2464edb46e9SPaul Traina 	    other = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_data);
2474edb46e9SPaul Traina 	    print_i_info(info);
2484edb46e9SPaul Traina 	    (void)printf(
2494edb46e9SPaul Traina 	"vers %d eco %d ueco %d src %s blksize %d rtr %s hello %d data %o",
2504edb46e9SPaul Traina 			vers, eco, ueco, dnaddr_string(src),
2514edb46e9SPaul Traina 			blksize, dnaddr_string(dst), hello, other);
2524edb46e9SPaul Traina 	    break;
2534edb46e9SPaul Traina 
2544edb46e9SPaul Traina 	default:
2554edb46e9SPaul Traina 	    (void)printf("unknown control message");
2564edb46e9SPaul Traina 	    default_print((u_char *)rhp, length);
2574edb46e9SPaul Traina 	    break;
2584edb46e9SPaul Traina 	}
2594edb46e9SPaul Traina }
2604edb46e9SPaul Traina 
2614edb46e9SPaul Traina static void
2624edb46e9SPaul Traina print_t_info(int info)
2634edb46e9SPaul Traina {
2644edb46e9SPaul Traina 	int ntype = info & 3;
2654edb46e9SPaul Traina 	switch (ntype) {
2664edb46e9SPaul Traina 	case 0: (void)printf("reserved-ntype? "); break;
2674edb46e9SPaul Traina 	case TI_L2ROUT: (void)printf("l2rout "); break;
2684edb46e9SPaul Traina 	case TI_L1ROUT: (void)printf("l1rout "); break;
2694edb46e9SPaul Traina 	case TI_ENDNODE: (void)printf("endnode "); break;
2704edb46e9SPaul Traina 	}
2714edb46e9SPaul Traina 	if (info & TI_VERIF)
2724edb46e9SPaul Traina 	    (void)printf("verif ");
2734edb46e9SPaul Traina 	if (info & TI_BLOCK)
2744edb46e9SPaul Traina 	    (void)printf("blo ");
2754edb46e9SPaul Traina }
2764edb46e9SPaul Traina 
2774edb46e9SPaul Traina static void
2784edb46e9SPaul Traina print_l1_routes(const char *rp, u_int len)
2794edb46e9SPaul Traina {
2804edb46e9SPaul Traina 	int count;
2814edb46e9SPaul Traina 	int id;
2824edb46e9SPaul Traina 	int info;
2834edb46e9SPaul Traina 
2844edb46e9SPaul Traina 	/* The last short is a checksum */
2854edb46e9SPaul Traina 	while (len > (3 * sizeof(short))) {
2864edb46e9SPaul Traina 	    count = EXTRACT_LE_16BITS(rp);
2874edb46e9SPaul Traina 	    if (count > 1024)
2884edb46e9SPaul Traina 		return;	/* seems to be bogus from here on */
2894edb46e9SPaul Traina 	    rp += sizeof(short);
2904edb46e9SPaul Traina 	    len -= sizeof(short);
2914edb46e9SPaul Traina 	    id = EXTRACT_LE_16BITS(rp);
2924edb46e9SPaul Traina 	    rp += sizeof(short);
2934edb46e9SPaul Traina 	    len -= sizeof(short);
2944edb46e9SPaul Traina 	    info = EXTRACT_LE_16BITS(rp);
2954edb46e9SPaul Traina 	    rp += sizeof(short);
2964edb46e9SPaul Traina 	    len -= sizeof(short);
2974edb46e9SPaul Traina 	    (void)printf("{ids %d-%d cost %d hops %d} ", id, id + count,
2984edb46e9SPaul Traina 			    RI_COST(info), RI_HOPS(info));
2994edb46e9SPaul Traina 	}
3004edb46e9SPaul Traina }
3014edb46e9SPaul Traina 
3024edb46e9SPaul Traina static void
3034edb46e9SPaul Traina print_l2_routes(const char *rp, u_int len)
3044edb46e9SPaul Traina {
3054edb46e9SPaul Traina 	int count;
3064edb46e9SPaul Traina 	int area;
3074edb46e9SPaul Traina 	int info;
3084edb46e9SPaul Traina 
3094edb46e9SPaul Traina 	/* The last short is a checksum */
3104edb46e9SPaul Traina 	while (len > (3 * sizeof(short))) {
3114edb46e9SPaul Traina 	    count = EXTRACT_LE_16BITS(rp);
3124edb46e9SPaul Traina 	    if (count > 1024)
3134edb46e9SPaul Traina 		return;	/* seems to be bogus from here on */
3144edb46e9SPaul Traina 	    rp += sizeof(short);
3154edb46e9SPaul Traina 	    len -= sizeof(short);
3164edb46e9SPaul Traina 	    area = EXTRACT_LE_16BITS(rp);
3174edb46e9SPaul Traina 	    rp += sizeof(short);
3184edb46e9SPaul Traina 	    len -= sizeof(short);
3194edb46e9SPaul Traina 	    info = EXTRACT_LE_16BITS(rp);
3204edb46e9SPaul Traina 	    rp += sizeof(short);
3214edb46e9SPaul Traina 	    len -= sizeof(short);
3224edb46e9SPaul Traina 	    (void)printf("{areas %d-%d cost %d hops %d} ", area, area + count,
3234edb46e9SPaul Traina 			    RI_COST(info), RI_HOPS(info));
3244edb46e9SPaul Traina 	}
3254edb46e9SPaul Traina }
3264edb46e9SPaul Traina 
3274edb46e9SPaul Traina static void
3284edb46e9SPaul Traina print_i_info(int info)
3294edb46e9SPaul Traina {
3304edb46e9SPaul Traina 	int ntype = info & II_TYPEMASK;
3314edb46e9SPaul Traina 	switch (ntype) {
3324edb46e9SPaul Traina 	case 0: (void)printf("reserved-ntype? "); break;
3334edb46e9SPaul Traina 	case II_L2ROUT: (void)printf("l2rout "); break;
3344edb46e9SPaul Traina 	case II_L1ROUT: (void)printf("l1rout "); break;
3354edb46e9SPaul Traina 	case II_ENDNODE: (void)printf("endnode "); break;
3364edb46e9SPaul Traina 	}
3374edb46e9SPaul Traina 	if (info & II_VERIF)
3384edb46e9SPaul Traina 	    (void)printf("verif ");
3394edb46e9SPaul Traina 	if (info & II_NOMCAST)
3404edb46e9SPaul Traina 	    (void)printf("nomcast ");
3414edb46e9SPaul Traina 	if (info & II_BLOCK)
3424edb46e9SPaul Traina 	    (void)printf("blo ");
3434edb46e9SPaul Traina }
3444edb46e9SPaul Traina 
3454edb46e9SPaul Traina static void
3464edb46e9SPaul Traina print_elist(const char *elp, u_int len)
3474edb46e9SPaul Traina {
3484edb46e9SPaul Traina 	/* Not enough examples available for me to debug this */
3494edb46e9SPaul Traina }
3504edb46e9SPaul Traina 
3514edb46e9SPaul Traina static void
3524edb46e9SPaul Traina print_nsp(const u_char *nspp, u_int nsplen)
3534edb46e9SPaul Traina {
3544edb46e9SPaul Traina 	const struct nsphdr *nsphp = (struct nsphdr *)nspp;
3554edb46e9SPaul Traina 	int dst, src, flags;
3564edb46e9SPaul Traina 
3574edb46e9SPaul Traina 	flags = EXTRACT_LE_8BITS(nsphp->nh_flags);
3584edb46e9SPaul Traina 	dst = EXTRACT_LE_16BITS(nsphp->nh_dst);
3594edb46e9SPaul Traina 	src = EXTRACT_LE_16BITS(nsphp->nh_src);
3604edb46e9SPaul Traina 
3614edb46e9SPaul Traina 	switch (flags & NSP_TYPEMASK) {
3624edb46e9SPaul Traina 	case MFT_DATA:
3634edb46e9SPaul Traina 	    switch (flags & NSP_SUBMASK) {
3644edb46e9SPaul Traina 	    case MFS_BOM:
3654edb46e9SPaul Traina 	    case MFS_MOM:
3664edb46e9SPaul Traina 	    case MFS_EOM:
3674edb46e9SPaul Traina 	    case MFS_BOM+MFS_EOM:
3684edb46e9SPaul Traina 		printf("data %d>%d ", src, dst);
3694edb46e9SPaul Traina 		{
3704edb46e9SPaul Traina 		    struct seghdr *shp = (struct seghdr *)nspp;
3714edb46e9SPaul Traina 		    int ack;
3724edb46e9SPaul Traina #ifdef	PRINT_NSPDATA
3734edb46e9SPaul Traina 		    u_char *dp;
3744edb46e9SPaul Traina #endif
3754edb46e9SPaul Traina 		    u_int data_off = sizeof(struct minseghdr);
3764edb46e9SPaul Traina 
3774edb46e9SPaul Traina 		    ack = EXTRACT_LE_16BITS(shp->sh_seq[0]);
3784edb46e9SPaul Traina 		    if (ack & SGQ_ACK) {	/* acknum field */
3794edb46e9SPaul Traina 			if ((ack & SGQ_NAK) == SGQ_NAK)
3804edb46e9SPaul Traina 			    (void)printf("nak %d ", ack & SGQ_MASK);
3814edb46e9SPaul Traina 			else
3824edb46e9SPaul Traina 			    (void)printf("ack %d ", ack & SGQ_MASK);
3834edb46e9SPaul Traina 		        ack = EXTRACT_LE_16BITS(shp->sh_seq[1]);
3844edb46e9SPaul Traina 			data_off += sizeof(short);
3854edb46e9SPaul Traina 			if (ack & SGQ_OACK) {	/* ackoth field */
3864edb46e9SPaul Traina 			    if ((ack & SGQ_ONAK) == SGQ_ONAK)
3874edb46e9SPaul Traina 				(void)printf("onak %d ", ack & SGQ_MASK);
3884edb46e9SPaul Traina 			    else
3894edb46e9SPaul Traina 				(void)printf("oack %d ", ack & SGQ_MASK);
3904edb46e9SPaul Traina 			    ack = EXTRACT_LE_16BITS(shp->sh_seq[2]);
3914edb46e9SPaul Traina 			    data_off += sizeof(short);
3924edb46e9SPaul Traina 			}
3934edb46e9SPaul Traina 		    }
3944edb46e9SPaul Traina 		    (void)printf("seg %d ", ack & SGQ_MASK);
3954edb46e9SPaul Traina #ifdef	PRINT_NSPDATA
3964edb46e9SPaul Traina 		    dp = &(nspp[data_off]);
3974edb46e9SPaul Traina 		    pdata(dp, 10);
3984edb46e9SPaul Traina #endif
3994edb46e9SPaul Traina 		}
4004edb46e9SPaul Traina 		break;
4014edb46e9SPaul Traina 	    case MFS_ILS+MFS_INT:
4024edb46e9SPaul Traina 		printf("intr ");
4034edb46e9SPaul Traina 		{
4044edb46e9SPaul Traina 		    struct seghdr *shp = (struct seghdr *)nspp;
4054edb46e9SPaul Traina 		    int ack;
4064edb46e9SPaul Traina #ifdef	PRINT_NSPDATA
4074edb46e9SPaul Traina 		    u_char *dp;
4084edb46e9SPaul Traina #endif
4094edb46e9SPaul Traina 		    u_int data_off = sizeof(struct minseghdr);
4104edb46e9SPaul Traina 
4114edb46e9SPaul Traina 		    ack = EXTRACT_LE_16BITS(shp->sh_seq[0]);
4124edb46e9SPaul Traina 		    if (ack & SGQ_ACK) {	/* acknum field */
4134edb46e9SPaul Traina 			if ((ack & SGQ_NAK) == SGQ_NAK)
4144edb46e9SPaul Traina 			    (void)printf("nak %d ", ack & SGQ_MASK);
4154edb46e9SPaul Traina 			else
4164edb46e9SPaul Traina 			    (void)printf("ack %d ", ack & SGQ_MASK);
4174edb46e9SPaul Traina 		        ack = EXTRACT_LE_16BITS(shp->sh_seq[1]);
4184edb46e9SPaul Traina 			data_off += sizeof(short);
4194edb46e9SPaul Traina 			if (ack & SGQ_OACK) {	/* ackdat field */
4204edb46e9SPaul Traina 			    if ((ack & SGQ_ONAK) == SGQ_ONAK)
4214edb46e9SPaul Traina 				(void)printf("nakdat %d ", ack & SGQ_MASK);
4224edb46e9SPaul Traina 			    else
4234edb46e9SPaul Traina 				(void)printf("ackdat %d ", ack & SGQ_MASK);
4244edb46e9SPaul Traina 			    ack = EXTRACT_LE_16BITS(shp->sh_seq[2]);
4254edb46e9SPaul Traina 			    data_off += sizeof(short);
4264edb46e9SPaul Traina 			}
4274edb46e9SPaul Traina 		    }
4284edb46e9SPaul Traina 		    (void)printf("seg %d ", ack & SGQ_MASK);
4294edb46e9SPaul Traina #ifdef	PRINT_NSPDATA
4304edb46e9SPaul Traina 		    dp = &(nspp[data_off]);
4314edb46e9SPaul Traina 		    pdata(dp, 10);
4324edb46e9SPaul Traina #endif
4334edb46e9SPaul Traina 		}
4344edb46e9SPaul Traina 		break;
4354edb46e9SPaul Traina 	    case MFS_ILS:
4364edb46e9SPaul Traina 		(void)printf("link-service %d>%d ", src, dst);
4374edb46e9SPaul Traina 		{
4384edb46e9SPaul Traina 		    struct seghdr *shp = (struct seghdr *)nspp;
4394edb46e9SPaul Traina 		    struct lsmsg *lsmp =
4404edb46e9SPaul Traina 			(struct lsmsg *)&(nspp[sizeof(struct seghdr)]);
4414edb46e9SPaul Traina 		    int ack;
4424edb46e9SPaul Traina 		    int lsflags, fcval;
4434edb46e9SPaul Traina 
4444edb46e9SPaul Traina 		    ack = EXTRACT_LE_16BITS(shp->sh_seq[0]);
4454edb46e9SPaul Traina 		    if (ack & SGQ_ACK) {	/* acknum field */
4464edb46e9SPaul Traina 			if ((ack & SGQ_NAK) == SGQ_NAK)
4474edb46e9SPaul Traina 			    (void)printf("nak %d ", ack & SGQ_MASK);
4484edb46e9SPaul Traina 			else
4494edb46e9SPaul Traina 			    (void)printf("ack %d ", ack & SGQ_MASK);
4504edb46e9SPaul Traina 		        ack = EXTRACT_LE_16BITS(shp->sh_seq[1]);
4514edb46e9SPaul Traina 			if (ack & SGQ_OACK) {	/* ackdat field */
4524edb46e9SPaul Traina 			    if ((ack & SGQ_ONAK) == SGQ_ONAK)
4534edb46e9SPaul Traina 				(void)printf("nakdat %d ", ack & SGQ_MASK);
4544edb46e9SPaul Traina 			    else
4554edb46e9SPaul Traina 				(void)printf("ackdat %d ", ack & SGQ_MASK);
4564edb46e9SPaul Traina 			    ack = EXTRACT_LE_16BITS(shp->sh_seq[2]);
4574edb46e9SPaul Traina 			}
4584edb46e9SPaul Traina 		    }
4594edb46e9SPaul Traina 		    (void)printf("seg %d ", ack & SGQ_MASK);
4604edb46e9SPaul Traina 		    lsflags = EXTRACT_LE_8BITS(lsmp->ls_lsflags);
4614edb46e9SPaul Traina 		    fcval = EXTRACT_LE_8BITS(lsmp->ls_fcval);
4624edb46e9SPaul Traina 		    switch (lsflags & LSI_MASK) {
4634edb46e9SPaul Traina 		    case LSI_DATA:
4644edb46e9SPaul Traina 			(void)printf("dat seg count %d ", fcval);
4654edb46e9SPaul Traina 			switch (lsflags & LSM_MASK) {
4664edb46e9SPaul Traina 			case LSM_NOCHANGE:
4674edb46e9SPaul Traina 			    break;
4684edb46e9SPaul Traina 			case LSM_DONOTSEND:
4694edb46e9SPaul Traina 			    (void)printf("donotsend-data ");
4704edb46e9SPaul Traina 			    break;
4714edb46e9SPaul Traina 			case LSM_SEND:
4724edb46e9SPaul Traina 			    (void)printf("send-data ");
4734edb46e9SPaul Traina 			    break;
4744edb46e9SPaul Traina 			default:
4754edb46e9SPaul Traina 			    (void)printf("reserved-fcmod? %x", lsflags);
4764edb46e9SPaul Traina 			    break;
4774edb46e9SPaul Traina 			}
4784edb46e9SPaul Traina 			break;
4794edb46e9SPaul Traina 		    case LSI_INTR:
4804edb46e9SPaul Traina 			(void)printf("intr req count %d ", fcval);
4814edb46e9SPaul Traina 			break;
4824edb46e9SPaul Traina 		    default:
4834edb46e9SPaul Traina 			(void)printf("reserved-fcval-int? %x", lsflags);
4844edb46e9SPaul Traina 			break;
4854edb46e9SPaul Traina 		    }
4864edb46e9SPaul Traina 		}
4874edb46e9SPaul Traina 		break;
4884edb46e9SPaul Traina 	    default:
4894edb46e9SPaul Traina 		(void)printf("reserved-subtype? %x %d > %d", flags, src, dst);
4904edb46e9SPaul Traina 		break;
4914edb46e9SPaul Traina 	    }
4924edb46e9SPaul Traina 	    break;
4934edb46e9SPaul Traina 	case MFT_ACK:
4944edb46e9SPaul Traina 	    switch (flags & NSP_SUBMASK) {
4954edb46e9SPaul Traina 	    case MFS_DACK:
4964edb46e9SPaul Traina 		(void)printf("data-ack %d>%d ", src, dst);
4974edb46e9SPaul Traina 		{
4984edb46e9SPaul Traina 		    struct ackmsg *amp = (struct ackmsg *)nspp;
4994edb46e9SPaul Traina 		    int ack;
5004edb46e9SPaul Traina 
5014edb46e9SPaul Traina 		    ack = EXTRACT_LE_16BITS(amp->ak_acknum[0]);
5024edb46e9SPaul Traina 		    if (ack & SGQ_ACK) {	/* acknum field */
5034edb46e9SPaul Traina 			if ((ack & SGQ_NAK) == SGQ_NAK)
5044edb46e9SPaul Traina 			    (void)printf("nak %d ", ack & SGQ_MASK);
5054edb46e9SPaul Traina 			else
5064edb46e9SPaul Traina 			    (void)printf("ack %d ", ack & SGQ_MASK);
5074edb46e9SPaul Traina 		        ack = EXTRACT_LE_16BITS(amp->ak_acknum[1]);
5084edb46e9SPaul Traina 			if (ack & SGQ_OACK) {	/* ackoth field */
5094edb46e9SPaul Traina 			    if ((ack & SGQ_ONAK) == SGQ_ONAK)
5104edb46e9SPaul Traina 				(void)printf("onak %d ", ack & SGQ_MASK);
5114edb46e9SPaul Traina 			    else
5124edb46e9SPaul Traina 				(void)printf("oack %d ", ack & SGQ_MASK);
5134edb46e9SPaul Traina 			}
5144edb46e9SPaul Traina 		    }
5154edb46e9SPaul Traina 		}
5164edb46e9SPaul Traina 		break;
5174edb46e9SPaul Traina 	    case MFS_IACK:
5184edb46e9SPaul Traina 		(void)printf("ils-ack %d>%d ", src, dst);
5194edb46e9SPaul Traina 		{
5204edb46e9SPaul Traina 		    struct ackmsg *amp = (struct ackmsg *)nspp;
5214edb46e9SPaul Traina 		    int ack;
5224edb46e9SPaul Traina 
5234edb46e9SPaul Traina 		    ack = EXTRACT_LE_16BITS(amp->ak_acknum[0]);
5244edb46e9SPaul Traina 		    if (ack & SGQ_ACK) {	/* acknum field */
5254edb46e9SPaul Traina 			if ((ack & SGQ_NAK) == SGQ_NAK)
5264edb46e9SPaul Traina 			    (void)printf("nak %d ", ack & SGQ_MASK);
5274edb46e9SPaul Traina 			else
5284edb46e9SPaul Traina 			    (void)printf("ack %d ", ack & SGQ_MASK);
5294edb46e9SPaul Traina 		        ack = EXTRACT_LE_16BITS(amp->ak_acknum[1]);
5304edb46e9SPaul Traina 			if (ack & SGQ_OACK) {	/* ackdat field */
5314edb46e9SPaul Traina 			    if ((ack & SGQ_ONAK) == SGQ_ONAK)
5324edb46e9SPaul Traina 				(void)printf("nakdat %d ", ack & SGQ_MASK);
5334edb46e9SPaul Traina 			    else
5344edb46e9SPaul Traina 				(void)printf("ackdat %d ", ack & SGQ_MASK);
5354edb46e9SPaul Traina 			}
5364edb46e9SPaul Traina 		    }
5374edb46e9SPaul Traina 		}
5384edb46e9SPaul Traina 		break;
5394edb46e9SPaul Traina 	    case MFS_CACK:
5404edb46e9SPaul Traina 		(void)printf("conn-ack %d", dst);
5414edb46e9SPaul Traina 		break;
5424edb46e9SPaul Traina 	    default:
5434edb46e9SPaul Traina 		(void)printf("reserved-acktype? %x %d > %d", flags, src, dst);
5444edb46e9SPaul Traina 		break;
5454edb46e9SPaul Traina 	    }
5464edb46e9SPaul Traina 	    break;
5474edb46e9SPaul Traina 	case MFT_CTL:
5484edb46e9SPaul Traina 	    switch (flags & NSP_SUBMASK) {
5494edb46e9SPaul Traina 	    case MFS_CI:
5504edb46e9SPaul Traina 	    case MFS_RCI:
5514edb46e9SPaul Traina 		if ((flags & NSP_SUBMASK) == MFS_CI)
5524edb46e9SPaul Traina 		    (void)printf("conn-initiate ");
5534edb46e9SPaul Traina 		else
5544edb46e9SPaul Traina 		    (void)printf("retrans-conn-initiate ");
5554edb46e9SPaul Traina 		(void)printf("%d>%d ", src, dst);
5564edb46e9SPaul Traina 		{
5574edb46e9SPaul Traina 		    struct cimsg *cimp = (struct cimsg *)nspp;
5584edb46e9SPaul Traina 		    int services, info, segsize;
5594edb46e9SPaul Traina #ifdef	PRINT_NSPDATA
5604edb46e9SPaul Traina 		    u_char *dp;
5614edb46e9SPaul Traina #endif
5624edb46e9SPaul Traina 
5634edb46e9SPaul Traina 		    services = EXTRACT_LE_8BITS(cimp->ci_services);
5644edb46e9SPaul Traina 		    info = EXTRACT_LE_8BITS(cimp->ci_info);
5654edb46e9SPaul Traina 		    segsize = EXTRACT_LE_16BITS(cimp->ci_segsize);
5664edb46e9SPaul Traina 
5674edb46e9SPaul Traina 		    switch (services & COS_MASK) {
5684edb46e9SPaul Traina 		    case COS_NONE:
5694edb46e9SPaul Traina 			break;
5704edb46e9SPaul Traina 		    case COS_SEGMENT:
5714edb46e9SPaul Traina 			(void)printf("seg ");
5724edb46e9SPaul Traina 			break;
5734edb46e9SPaul Traina 		    case COS_MESSAGE:
5744edb46e9SPaul Traina 			(void)printf("msg ");
5754edb46e9SPaul Traina 			break;
5764edb46e9SPaul Traina 		    case COS_CRYPTSER:
5774edb46e9SPaul Traina 			(void)printf("crypt ");
5784edb46e9SPaul Traina 			break;
5794edb46e9SPaul Traina 		    }
5804edb46e9SPaul Traina 		    switch (info & COI_MASK) {
5814edb46e9SPaul Traina 		    case COI_32:
5824edb46e9SPaul Traina 			(void)printf("ver 3.2 ");
5834edb46e9SPaul Traina 			break;
5844edb46e9SPaul Traina 		    case COI_31:
5854edb46e9SPaul Traina 			(void)printf("ver 3.1 ");
5864edb46e9SPaul Traina 			break;
5874edb46e9SPaul Traina 		    case COI_40:
5884edb46e9SPaul Traina 			(void)printf("ver 4.0 ");
5894edb46e9SPaul Traina 			break;
5904edb46e9SPaul Traina 		    case COI_41:
5914edb46e9SPaul Traina 			(void)printf("ver 4.1 ");
5924edb46e9SPaul Traina 			break;
5934edb46e9SPaul Traina 		    }
5944edb46e9SPaul Traina 		    (void)printf("segsize %d ", segsize);
5954edb46e9SPaul Traina #ifdef	PRINT_NSPDATA
5964edb46e9SPaul Traina 		    dp = &(nspp[sizeof(struct cimsg)]);
5974edb46e9SPaul Traina 		    pdata(dp, nsplen - sizeof(struct cimsg));
5984edb46e9SPaul Traina #endif
5994edb46e9SPaul Traina 		}
6004edb46e9SPaul Traina 		break;
6014edb46e9SPaul Traina 	    case MFS_CC:
6024edb46e9SPaul Traina 		(void)printf("conn-confirm %d>%d ", src, dst);
6034edb46e9SPaul Traina 		{
6044edb46e9SPaul Traina 		    struct ccmsg *ccmp = (struct ccmsg *)nspp;
6054edb46e9SPaul Traina 		    int services, info;
6064edb46e9SPaul Traina 		    u_int segsize, optlen;
6074edb46e9SPaul Traina #ifdef	PRINT_NSPDATA
6084edb46e9SPaul Traina 		    u_char *dp;
6094edb46e9SPaul Traina #endif
6104edb46e9SPaul Traina 
6114edb46e9SPaul Traina 		    services = EXTRACT_LE_8BITS(ccmp->cc_services);
6124edb46e9SPaul Traina 		    info = EXTRACT_LE_8BITS(ccmp->cc_info);
6134edb46e9SPaul Traina 		    segsize = EXTRACT_LE_16BITS(ccmp->cc_segsize);
6144edb46e9SPaul Traina 		    optlen = EXTRACT_LE_8BITS(ccmp->cc_optlen);
6154edb46e9SPaul Traina 
6164edb46e9SPaul Traina 		    switch (services & COS_MASK) {
6174edb46e9SPaul Traina 		    case COS_NONE:
6184edb46e9SPaul Traina 			break;
6194edb46e9SPaul Traina 		    case COS_SEGMENT:
6204edb46e9SPaul Traina 			(void)printf("seg ");
6214edb46e9SPaul Traina 			break;
6224edb46e9SPaul Traina 		    case COS_MESSAGE:
6234edb46e9SPaul Traina 			(void)printf("msg ");
6244edb46e9SPaul Traina 			break;
6254edb46e9SPaul Traina 		    case COS_CRYPTSER:
6264edb46e9SPaul Traina 			(void)printf("crypt ");
6274edb46e9SPaul Traina 			break;
6284edb46e9SPaul Traina 		    }
6294edb46e9SPaul Traina 		    switch (info & COI_MASK) {
6304edb46e9SPaul Traina 		    case COI_32:
6314edb46e9SPaul Traina 			(void)printf("ver 3.2 ");
6324edb46e9SPaul Traina 			break;
6334edb46e9SPaul Traina 		    case COI_31:
6344edb46e9SPaul Traina 			(void)printf("ver 3.1 ");
6354edb46e9SPaul Traina 			break;
6364edb46e9SPaul Traina 		    case COI_40:
6374edb46e9SPaul Traina 			(void)printf("ver 4.0 ");
6384edb46e9SPaul Traina 			break;
6394edb46e9SPaul Traina 		    case COI_41:
6404edb46e9SPaul Traina 			(void)printf("ver 4.1 ");
6414edb46e9SPaul Traina 			break;
6424edb46e9SPaul Traina 		    }
6434edb46e9SPaul Traina 		    (void)printf("segsize %d ", segsize);
6444edb46e9SPaul Traina 		    if (optlen) {
6454edb46e9SPaul Traina 			(void)printf("optlen %d ", optlen);
6464edb46e9SPaul Traina #ifdef	PRINT_NSPDATA
6474edb46e9SPaul Traina 			optlen = min(optlen, nsplen - sizeof(struct ccmsg));
6484edb46e9SPaul Traina 			dp = &(nspp[sizeof(struct ccmsg)]);
6494edb46e9SPaul Traina 			pdata(dp, optlen);
6504edb46e9SPaul Traina #endif
6514edb46e9SPaul Traina 		    }
6524edb46e9SPaul Traina 		}
6534edb46e9SPaul Traina 		break;
6544edb46e9SPaul Traina 	    case MFS_DI:
6554edb46e9SPaul Traina 		(void)printf("disconn-initiate %d>%d ", src, dst);
6564edb46e9SPaul Traina 		{
6574edb46e9SPaul Traina 		    struct dimsg *dimp = (struct dimsg *)nspp;
6584edb46e9SPaul Traina 		    int reason;
6594edb46e9SPaul Traina 		    u_int optlen;
6604edb46e9SPaul Traina #ifdef	PRINT_NSPDATA
6614edb46e9SPaul Traina 		    u_char *dp;
6624edb46e9SPaul Traina #endif
6634edb46e9SPaul Traina 
6644edb46e9SPaul Traina 		    reason = EXTRACT_LE_16BITS(dimp->di_reason);
6654edb46e9SPaul Traina 		    optlen = EXTRACT_LE_8BITS(dimp->di_optlen);
6664edb46e9SPaul Traina 
6674edb46e9SPaul Traina 		    print_reason(reason);
6684edb46e9SPaul Traina 		    if (optlen) {
6694edb46e9SPaul Traina 			(void)printf("optlen %d ", optlen);
6704edb46e9SPaul Traina #ifdef	PRINT_NSPDATA
6714edb46e9SPaul Traina 			optlen = min(optlen, nsplen - sizeof(struct dimsg));
6724edb46e9SPaul Traina 			dp = &(nspp[sizeof(struct dimsg)]);
6734edb46e9SPaul Traina 			pdata(dp, optlen);
6744edb46e9SPaul Traina #endif
6754edb46e9SPaul Traina 		    }
6764edb46e9SPaul Traina 		}
6774edb46e9SPaul Traina 		break;
6784edb46e9SPaul Traina 	    case MFS_DC:
6794edb46e9SPaul Traina 		(void)printf("disconn-confirm %d>%d ", src, dst);
6804edb46e9SPaul Traina 		{
6814edb46e9SPaul Traina 		    struct dcmsg *dcmp = (struct dcmsg *)nspp;
6824edb46e9SPaul Traina 		    int reason;
6834edb46e9SPaul Traina 
6844edb46e9SPaul Traina 		    reason = EXTRACT_LE_16BITS(dcmp->dc_reason);
6854edb46e9SPaul Traina 
6864edb46e9SPaul Traina 		    print_reason(reason);
6874edb46e9SPaul Traina 		}
6884edb46e9SPaul Traina 		break;
6894edb46e9SPaul Traina 	    default:
6904edb46e9SPaul Traina 		(void)printf("reserved-ctltype? %x %d > %d", flags, src, dst);
6914edb46e9SPaul Traina 		break;
6924edb46e9SPaul Traina 	    }
6934edb46e9SPaul Traina 	    break;
6944edb46e9SPaul Traina 	default:
6954edb46e9SPaul Traina 	    (void)printf("reserved-type? %x %d > %d", flags, src, dst);
6964edb46e9SPaul Traina 	    break;
6974edb46e9SPaul Traina 	}
6984edb46e9SPaul Traina }
6994edb46e9SPaul Traina 
7004edb46e9SPaul Traina static struct tok reason2str[] = {
7014edb46e9SPaul Traina 	{ UC_OBJREJECT,		"object rejected connect" },
7024edb46e9SPaul Traina 	{ UC_RESOURCES,		"insufficient resources" },
7034edb46e9SPaul Traina 	{ UC_NOSUCHNODE,	"unrecognized node name" },
7044edb46e9SPaul Traina 	{ DI_SHUT,		"node is shutting down" },
7054edb46e9SPaul Traina 	{ UC_NOSUCHOBJ,		"unrecognized object" },
7064edb46e9SPaul Traina 	{ UC_INVOBJFORMAT,	"invalid object name format" },
7074edb46e9SPaul Traina 	{ UC_OBJTOOBUSY,	"object too busy" },
7084edb46e9SPaul Traina 	{ DI_PROTOCOL,		"protocol error discovered" },
7094edb46e9SPaul Traina 	{ DI_TPA,		"third party abort" },
7104edb46e9SPaul Traina 	{ UC_USERABORT,		"user abort" },
7114edb46e9SPaul Traina 	{ UC_INVNODEFORMAT,	"invalid node name format" },
7124edb46e9SPaul Traina 	{ UC_LOCALSHUT,		"local node shutting down" },
7134edb46e9SPaul Traina 	{ DI_LOCALRESRC,	"insufficient local resources" },
7144edb46e9SPaul Traina 	{ DI_REMUSERRESRC,	"insufficient remote user resources" },
7154edb46e9SPaul Traina 	{ UC_ACCESSREJECT,	"invalid access control information" },
7164edb46e9SPaul Traina 	{ DI_BADACCNT,		"bad ACCOUNT information" },
7174edb46e9SPaul Traina 	{ UC_NORESPONSE,	"no response from object" },
7184edb46e9SPaul Traina 	{ UC_UNREACHABLE,	"node unreachable" },
7194edb46e9SPaul Traina 	{ DC_NOLINK,		"no link terminate" },
7204edb46e9SPaul Traina 	{ DC_COMPLETE,		"disconnect complete" },
7214edb46e9SPaul Traina 	{ DI_BADIMAGE,		"bad image data in connect" },
7224edb46e9SPaul Traina 	{ DI_SERVMISMATCH,	"cryptographic service mismatch" },
7234edb46e9SPaul Traina 	{ 0,			NULL }
7244edb46e9SPaul Traina };
7254edb46e9SPaul Traina 
7264edb46e9SPaul Traina static void
7274edb46e9SPaul Traina print_reason(register int reason)
7284edb46e9SPaul Traina {
7294edb46e9SPaul Traina 	printf("%s ", tok2str(reason2str, "reason-%d", reason));
7304edb46e9SPaul Traina }
7314edb46e9SPaul Traina 
7324edb46e9SPaul Traina char *
7334edb46e9SPaul Traina dnnum_string(u_short dnaddr)
7344edb46e9SPaul Traina {
7354edb46e9SPaul Traina 	char *str;
7364edb46e9SPaul Traina 	int area = (dnaddr & AREAMASK) >> AREASHIFT;
7374edb46e9SPaul Traina 	int node = dnaddr & NODEMASK;
7384edb46e9SPaul Traina 
7394edb46e9SPaul Traina 	str = (char *)malloc(sizeof("00.0000"));
7404edb46e9SPaul Traina 	if (str == NULL)
7414edb46e9SPaul Traina 		error("dnnum_string: malloc");
7424edb46e9SPaul Traina 	sprintf(str, "%d.%d", area, node);
7434edb46e9SPaul Traina 	return(str);
7444edb46e9SPaul Traina }
7454edb46e9SPaul Traina 
7464edb46e9SPaul Traina char *
7474edb46e9SPaul Traina dnname_string(u_short dnaddr)
7484edb46e9SPaul Traina {
7494edb46e9SPaul Traina #ifdef	HAVE_LIBDNET
7504edb46e9SPaul Traina 	struct dn_naddr dna;
7514edb46e9SPaul Traina 
7524edb46e9SPaul Traina 	dna.a_len = sizeof(short);
7534edb46e9SPaul Traina 	memcpy((char *)dna.a_addr, (char *)&dnaddr, sizeof(short));
7544edb46e9SPaul Traina 	return (savestr(dnet_htoa(&dna)));
7554edb46e9SPaul Traina #else
7564edb46e9SPaul Traina 	return(dnnum_string(dnaddr));	/* punt */
7574edb46e9SPaul Traina #endif
7584edb46e9SPaul Traina }
7594edb46e9SPaul Traina 
7604edb46e9SPaul Traina #ifdef	PRINT_NSPDATA
7614edb46e9SPaul Traina static void
7624edb46e9SPaul Traina pdata(u_char *dp, u_int maxlen)
7634edb46e9SPaul Traina {
7644edb46e9SPaul Traina 	char c;
7654edb46e9SPaul Traina 	u_int x = maxlen;
7664edb46e9SPaul Traina 
7674edb46e9SPaul Traina 	while (x-- > 0) {
7684edb46e9SPaul Traina 	    c = *dp++;
7694edb46e9SPaul Traina 	    if (isprint(c))
7704edb46e9SPaul Traina 		putchar(c);
7714edb46e9SPaul Traina 	    else
7724edb46e9SPaul Traina 		printf("\\%o", c & 0xFF);
7734edb46e9SPaul Traina 	}
7744edb46e9SPaul Traina }
7754edb46e9SPaul Traina #endif
776