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