14edb46e9SPaul Traina /* 24644f044SBill Fenner * Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997 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 223340d773SGleb Smirnoff /* \summary: DECnet printer */ 233340d773SGleb Smirnoff 24b0453382SBill Fenner #ifdef HAVE_CONFIG_H 25b0453382SBill Fenner #include "config.h" 264edb46e9SPaul Traina #endif 274edb46e9SPaul Traina 283340d773SGleb Smirnoff #include <netdissect-stdinc.h> 294edb46e9SPaul Traina 304edb46e9SPaul Traina struct mbuf; 314edb46e9SPaul Traina struct rtentry; 324edb46e9SPaul Traina 335b0fe478SBruce M Simpson #ifdef HAVE_NETDNET_DNETDB_H 344edb46e9SPaul Traina #include <netdnet/dnetdb.h> 354edb46e9SPaul Traina #endif 364edb46e9SPaul Traina 374edb46e9SPaul Traina #include <stdio.h> 384edb46e9SPaul Traina #include <stdlib.h> 394edb46e9SPaul Traina #include <string.h> 404edb46e9SPaul Traina 414edb46e9SPaul Traina #include "extract.h" 423340d773SGleb Smirnoff #include "netdissect.h" 434edb46e9SPaul Traina #include "addrtoname.h" 444edb46e9SPaul Traina 453c602fabSXin LI static const char tstr[] = "[|decnet]"; 463c602fabSXin LI 473340d773SGleb Smirnoff #ifndef _WIN32 483c602fabSXin LI typedef uint8_t byte[1]; /* single byte field */ 493c602fabSXin LI #else 503c602fabSXin LI /* 513c602fabSXin LI * the keyword 'byte' generates conflicts in Windows 523c602fabSXin LI */ 533c602fabSXin LI typedef unsigned char Byte[1]; /* single byte field */ 543c602fabSXin LI #define byte Byte 553340d773SGleb Smirnoff #endif /* _WIN32 */ 563c602fabSXin LI typedef uint8_t word[2]; /* 2 byte field */ 573c602fabSXin LI typedef uint8_t longword[4]; /* 4 bytes field */ 583c602fabSXin LI 593c602fabSXin LI /* 603c602fabSXin LI * Definitions for DECNET Phase IV protocol headers 613c602fabSXin LI */ 623c602fabSXin LI union etheraddress { 633c602fabSXin LI uint8_t dne_addr[6]; /* full ethernet address */ 643c602fabSXin LI struct { 653c602fabSXin LI uint8_t dne_hiord[4]; /* DECnet HIORD prefix */ 663c602fabSXin LI uint8_t dne_nodeaddr[2]; /* DECnet node address */ 673c602fabSXin LI } dne_remote; 683c602fabSXin LI }; 693c602fabSXin LI 703c602fabSXin LI typedef union etheraddress etheraddr; /* Ethernet address */ 713c602fabSXin LI 723c602fabSXin LI #define HIORD 0x000400aa /* high 32-bits of address (swapped) */ 733c602fabSXin LI 743c602fabSXin LI #define AREAMASK 0176000 /* mask for area field */ 753c602fabSXin LI #define AREASHIFT 10 /* bit-offset for area field */ 763c602fabSXin LI #define NODEMASK 01777 /* mask for node address field */ 773c602fabSXin LI 783c602fabSXin LI #define DN_MAXADDL 20 /* max size of DECnet address */ 793c602fabSXin LI struct dn_naddr { 803c602fabSXin LI uint16_t a_len; /* length of address */ 813c602fabSXin LI uint8_t a_addr[DN_MAXADDL]; /* address as bytes */ 823c602fabSXin LI }; 833c602fabSXin LI 843c602fabSXin LI /* 853c602fabSXin LI * Define long and short header formats. 863c602fabSXin LI */ 873c602fabSXin LI struct shorthdr 883c602fabSXin LI { 893c602fabSXin LI byte sh_flags; /* route flags */ 903c602fabSXin LI word sh_dst; /* destination node address */ 913c602fabSXin LI word sh_src; /* source node address */ 923c602fabSXin LI byte sh_visits; /* visit count */ 933c602fabSXin LI }; 943c602fabSXin LI 953c602fabSXin LI struct longhdr 963c602fabSXin LI { 973c602fabSXin LI byte lg_flags; /* route flags */ 983c602fabSXin LI byte lg_darea; /* destination area (reserved) */ 993c602fabSXin LI byte lg_dsarea; /* destination subarea (reserved) */ 1003c602fabSXin LI etheraddr lg_dst; /* destination id */ 1013c602fabSXin LI byte lg_sarea; /* source area (reserved) */ 1023c602fabSXin LI byte lg_ssarea; /* source subarea (reserved) */ 1033c602fabSXin LI etheraddr lg_src; /* source id */ 1043c602fabSXin LI byte lg_nextl2; /* next level 2 router (reserved) */ 1053c602fabSXin LI byte lg_visits; /* visit count */ 1063c602fabSXin LI byte lg_service; /* service class (reserved) */ 1073c602fabSXin LI byte lg_pt; /* protocol type (reserved) */ 1083c602fabSXin LI }; 1093c602fabSXin LI 1103c602fabSXin LI union routehdr 1113c602fabSXin LI { 1123c602fabSXin LI struct shorthdr rh_short; /* short route header */ 1133c602fabSXin LI struct longhdr rh_long; /* long route header */ 1143c602fabSXin LI }; 1153c602fabSXin LI 1163c602fabSXin LI /* 1173c602fabSXin LI * Define the values of various fields in the protocol messages. 1183c602fabSXin LI * 1193c602fabSXin LI * 1. Data packet formats. 1203c602fabSXin LI */ 1213c602fabSXin LI #define RMF_MASK 7 /* mask for message type */ 1223c602fabSXin LI #define RMF_SHORT 2 /* short message format */ 1233c602fabSXin LI #define RMF_LONG 6 /* long message format */ 1243c602fabSXin LI #ifndef RMF_RQR 1253c602fabSXin LI #define RMF_RQR 010 /* request return to sender */ 1263c602fabSXin LI #define RMF_RTS 020 /* returning to sender */ 1273c602fabSXin LI #define RMF_IE 040 /* intra-ethernet packet */ 1283c602fabSXin LI #endif /* RMR_RQR */ 1293c602fabSXin LI #define RMF_FVER 0100 /* future version flag */ 1303c602fabSXin LI #define RMF_PAD 0200 /* pad field */ 1313c602fabSXin LI #define RMF_PADMASK 0177 /* pad field mask */ 1323c602fabSXin LI 1333c602fabSXin LI #define VIS_MASK 077 /* visit field mask */ 1343c602fabSXin LI 1353c602fabSXin LI /* 1363c602fabSXin LI * 2. Control packet formats. 1373c602fabSXin LI */ 1383c602fabSXin LI #define RMF_CTLMASK 017 /* mask for message type */ 1393c602fabSXin LI #define RMF_CTLMSG 01 /* control message indicator */ 1403c602fabSXin LI #define RMF_INIT 01 /* initialization message */ 1413c602fabSXin LI #define RMF_VER 03 /* verification message */ 1423c602fabSXin LI #define RMF_TEST 05 /* hello and test message */ 1433c602fabSXin LI #define RMF_L1ROUT 07 /* level 1 routing message */ 1443c602fabSXin LI #define RMF_L2ROUT 011 /* level 2 routing message */ 1453c602fabSXin LI #define RMF_RHELLO 013 /* router hello message */ 1463c602fabSXin LI #define RMF_EHELLO 015 /* endnode hello message */ 1473c602fabSXin LI 1483c602fabSXin LI #define TI_L2ROUT 01 /* level 2 router */ 1493c602fabSXin LI #define TI_L1ROUT 02 /* level 1 router */ 1503c602fabSXin LI #define TI_ENDNODE 03 /* endnode */ 1513c602fabSXin LI #define TI_VERIF 04 /* verification required */ 1523c602fabSXin LI #define TI_BLOCK 010 /* blocking requested */ 1533c602fabSXin LI 1543c602fabSXin LI #define VE_VERS 2 /* version number (2) */ 1553c602fabSXin LI #define VE_ECO 0 /* ECO number */ 1563c602fabSXin LI #define VE_UECO 0 /* user ECO number (0) */ 1573c602fabSXin LI 1583c602fabSXin LI #define P3_VERS 1 /* phase III version number (1) */ 1593c602fabSXin LI #define P3_ECO 3 /* ECO number (3) */ 1603c602fabSXin LI #define P3_UECO 0 /* user ECO number (0) */ 1613c602fabSXin LI 1623c602fabSXin LI #define II_L2ROUT 01 /* level 2 router */ 1633c602fabSXin LI #define II_L1ROUT 02 /* level 1 router */ 1643c602fabSXin LI #define II_ENDNODE 03 /* endnode */ 1653c602fabSXin LI #define II_VERIF 04 /* verification required */ 1663c602fabSXin LI #define II_NOMCAST 040 /* no multicast traffic accepted */ 1673c602fabSXin LI #define II_BLOCK 0100 /* blocking requested */ 1683c602fabSXin LI #define II_TYPEMASK 03 /* mask for node type */ 1693c602fabSXin LI 1703c602fabSXin LI #define TESTDATA 0252 /* test data bytes */ 1713c602fabSXin LI #define TESTLEN 1 /* length of transmitted test data */ 1723c602fabSXin LI 1733c602fabSXin LI /* 1743c602fabSXin LI * Define control message formats. 1753c602fabSXin LI */ 1763c602fabSXin LI struct initmsgIII /* phase III initialization message */ 1773c602fabSXin LI { 1783c602fabSXin LI byte inIII_flags; /* route flags */ 1793c602fabSXin LI word inIII_src; /* source node address */ 1803c602fabSXin LI byte inIII_info; /* routing layer information */ 1813c602fabSXin LI word inIII_blksize; /* maximum data link block size */ 1823c602fabSXin LI byte inIII_vers; /* version number */ 1833c602fabSXin LI byte inIII_eco; /* ECO number */ 1843c602fabSXin LI byte inIII_ueco; /* user ECO number */ 1853c602fabSXin LI byte inIII_rsvd; /* reserved image field */ 1863c602fabSXin LI }; 1873c602fabSXin LI 1883c602fabSXin LI struct initmsg /* initialization message */ 1893c602fabSXin LI { 1903c602fabSXin LI byte in_flags; /* route flags */ 1913c602fabSXin LI word in_src; /* source node address */ 1923c602fabSXin LI byte in_info; /* routing layer information */ 1933c602fabSXin LI word in_blksize; /* maximum data link block size */ 1943c602fabSXin LI byte in_vers; /* version number */ 1953c602fabSXin LI byte in_eco; /* ECO number */ 1963c602fabSXin LI byte in_ueco; /* user ECO number */ 1973c602fabSXin LI word in_hello; /* hello timer */ 1983c602fabSXin LI byte in_rsvd; /* reserved image field */ 1993c602fabSXin LI }; 2003c602fabSXin LI 2013c602fabSXin LI struct verifmsg /* verification message */ 2023c602fabSXin LI { 2033c602fabSXin LI byte ve_flags; /* route flags */ 2043c602fabSXin LI word ve_src; /* source node address */ 2053c602fabSXin LI byte ve_fcnval; /* function value image field */ 2063c602fabSXin LI }; 2073c602fabSXin LI 2083c602fabSXin LI struct testmsg /* hello and test message */ 2093c602fabSXin LI { 2103c602fabSXin LI byte te_flags; /* route flags */ 2113c602fabSXin LI word te_src; /* source node address */ 2123c602fabSXin LI byte te_data; /* test data image field */ 2133c602fabSXin LI }; 2143c602fabSXin LI 2153c602fabSXin LI struct l1rout /* level 1 routing message */ 2163c602fabSXin LI { 2173c602fabSXin LI byte r1_flags; /* route flags */ 2183c602fabSXin LI word r1_src; /* source node address */ 2193c602fabSXin LI byte r1_rsvd; /* reserved field */ 2203c602fabSXin LI }; 2213c602fabSXin LI 2223c602fabSXin LI struct l2rout /* level 2 routing message */ 2233c602fabSXin LI { 2243c602fabSXin LI byte r2_flags; /* route flags */ 2253c602fabSXin LI word r2_src; /* source node address */ 2263c602fabSXin LI byte r2_rsvd; /* reserved field */ 2273c602fabSXin LI }; 2283c602fabSXin LI 2293c602fabSXin LI struct rhellomsg /* router hello message */ 2303c602fabSXin LI { 2313c602fabSXin LI byte rh_flags; /* route flags */ 2323c602fabSXin LI byte rh_vers; /* version number */ 2333c602fabSXin LI byte rh_eco; /* ECO number */ 2343c602fabSXin LI byte rh_ueco; /* user ECO number */ 2353c602fabSXin LI etheraddr rh_src; /* source id */ 2363c602fabSXin LI byte rh_info; /* routing layer information */ 2373c602fabSXin LI word rh_blksize; /* maximum data link block size */ 2383c602fabSXin LI byte rh_priority; /* router's priority */ 2393c602fabSXin LI byte rh_area; /* reserved */ 2403c602fabSXin LI word rh_hello; /* hello timer */ 2413c602fabSXin LI byte rh_mpd; /* reserved */ 2423c602fabSXin LI }; 2433c602fabSXin LI 2443c602fabSXin LI struct ehellomsg /* endnode hello message */ 2453c602fabSXin LI { 2463c602fabSXin LI byte eh_flags; /* route flags */ 2473c602fabSXin LI byte eh_vers; /* version number */ 2483c602fabSXin LI byte eh_eco; /* ECO number */ 2493c602fabSXin LI byte eh_ueco; /* user ECO number */ 2503c602fabSXin LI etheraddr eh_src; /* source id */ 2513c602fabSXin LI byte eh_info; /* routing layer information */ 2523c602fabSXin LI word eh_blksize; /* maximum data link block size */ 2533c602fabSXin LI byte eh_area; /* area (reserved) */ 2543c602fabSXin LI byte eh_seed[8]; /* verification seed */ 2553c602fabSXin LI etheraddr eh_router; /* designated router */ 2563c602fabSXin LI word eh_hello; /* hello timer */ 2573c602fabSXin LI byte eh_mpd; /* (reserved) */ 2583c602fabSXin LI byte eh_data; /* test data image field */ 2593c602fabSXin LI }; 2603c602fabSXin LI 2613c602fabSXin LI union controlmsg 2623c602fabSXin LI { 2633c602fabSXin LI struct initmsg cm_init; /* initialization message */ 2643c602fabSXin LI struct verifmsg cm_ver; /* verification message */ 2653c602fabSXin LI struct testmsg cm_test; /* hello and test message */ 2663c602fabSXin LI struct l1rout cm_l1rou; /* level 1 routing message */ 2673c602fabSXin LI struct l2rout cm_l2rout; /* level 2 routing message */ 2683c602fabSXin LI struct rhellomsg cm_rhello; /* router hello message */ 2693c602fabSXin LI struct ehellomsg cm_ehello; /* endnode hello message */ 2703c602fabSXin LI }; 2713c602fabSXin LI 2723c602fabSXin LI /* Macros for decoding routing-info fields */ 2733c602fabSXin LI #define RI_COST(x) ((x)&0777) 2743c602fabSXin LI #define RI_HOPS(x) (((x)>>10)&037) 2758bdc5a62SPatrick Kelsey 2763c602fabSXin LI /* 2773c602fabSXin LI * NSP protocol fields and values. 2783c602fabSXin LI */ 2793c602fabSXin LI 2803c602fabSXin LI #define NSP_TYPEMASK 014 /* mask to isolate type code */ 2813c602fabSXin LI #define NSP_SUBMASK 0160 /* mask to isolate subtype code */ 2823c602fabSXin LI #define NSP_SUBSHFT 4 /* shift to move subtype code */ 2833c602fabSXin LI 2843c602fabSXin LI #define MFT_DATA 0 /* data message */ 2853c602fabSXin LI #define MFT_ACK 04 /* acknowledgement message */ 2863c602fabSXin LI #define MFT_CTL 010 /* control message */ 2873c602fabSXin LI 2883c602fabSXin LI #define MFS_ILS 020 /* data or I/LS indicator */ 2893c602fabSXin LI #define MFS_BOM 040 /* beginning of message (data) */ 2903c602fabSXin LI #define MFS_MOM 0 /* middle of message (data) */ 2913c602fabSXin LI #define MFS_EOM 0100 /* end of message (data) */ 2923c602fabSXin LI #define MFS_INT 040 /* interrupt message */ 2933c602fabSXin LI 2943c602fabSXin LI #define MFS_DACK 0 /* data acknowledgement */ 2953c602fabSXin LI #define MFS_IACK 020 /* I/LS acknowledgement */ 2963c602fabSXin LI #define MFS_CACK 040 /* connect acknowledgement */ 2973c602fabSXin LI 2983c602fabSXin LI #define MFS_NOP 0 /* no operation */ 2993c602fabSXin LI #define MFS_CI 020 /* connect initiate */ 3003c602fabSXin LI #define MFS_CC 040 /* connect confirm */ 3013c602fabSXin LI #define MFS_DI 060 /* disconnect initiate */ 3023c602fabSXin LI #define MFS_DC 0100 /* disconnect confirm */ 3033c602fabSXin LI #define MFS_RCI 0140 /* retransmitted connect initiate */ 3043c602fabSXin LI 3053c602fabSXin LI #define SGQ_ACK 0100000 /* ack */ 3063c602fabSXin LI #define SGQ_NAK 0110000 /* negative ack */ 3073c602fabSXin LI #define SGQ_OACK 0120000 /* other channel ack */ 3083c602fabSXin LI #define SGQ_ONAK 0130000 /* other channel negative ack */ 3093c602fabSXin LI #define SGQ_MASK 07777 /* mask to isolate seq # */ 3103c602fabSXin LI #define SGQ_OTHER 020000 /* other channel qualifier */ 3113c602fabSXin LI #define SGQ_DELAY 010000 /* ack delay flag */ 3123c602fabSXin LI 3133c602fabSXin LI #define SGQ_EOM 0100000 /* pseudo flag for end-of-message */ 3143c602fabSXin LI 3153c602fabSXin LI #define LSM_MASK 03 /* mask for modifier field */ 3163c602fabSXin LI #define LSM_NOCHANGE 0 /* no change */ 3173c602fabSXin LI #define LSM_DONOTSEND 1 /* do not send data */ 3183c602fabSXin LI #define LSM_SEND 2 /* send data */ 3193c602fabSXin LI 3203c602fabSXin LI #define LSI_MASK 014 /* mask for interpretation field */ 3213c602fabSXin LI #define LSI_DATA 0 /* data segment or message count */ 3223c602fabSXin LI #define LSI_INTR 4 /* interrupt request count */ 3233c602fabSXin LI #define LSI_INTM 0377 /* funny marker for int. message */ 3243c602fabSXin LI 3253c602fabSXin LI #define COS_MASK 014 /* mask for flow control field */ 3263c602fabSXin LI #define COS_NONE 0 /* no flow control */ 3273c602fabSXin LI #define COS_SEGMENT 04 /* segment flow control */ 3283c602fabSXin LI #define COS_MESSAGE 010 /* message flow control */ 3293c602fabSXin LI #define COS_DEFAULT 1 /* default value for field */ 3303c602fabSXin LI 3313c602fabSXin LI #define COI_MASK 3 /* mask for version field */ 3323c602fabSXin LI #define COI_32 0 /* version 3.2 */ 3333c602fabSXin LI #define COI_31 1 /* version 3.1 */ 3343c602fabSXin LI #define COI_40 2 /* version 4.0 */ 3353c602fabSXin LI #define COI_41 3 /* version 4.1 */ 3363c602fabSXin LI 3373c602fabSXin LI #define MNU_MASK 140 /* mask for session control version */ 3383c602fabSXin LI #define MNU_10 000 /* session V1.0 */ 3393c602fabSXin LI #define MNU_20 040 /* session V2.0 */ 3403c602fabSXin LI #define MNU_ACCESS 1 /* access control present */ 3413c602fabSXin LI #define MNU_USRDATA 2 /* user data field present */ 3423c602fabSXin LI #define MNU_INVKPROXY 4 /* invoke proxy field present */ 3433c602fabSXin LI #define MNU_UICPROXY 8 /* use uic-based proxy */ 3443c602fabSXin LI 3453c602fabSXin LI #define DC_NORESOURCES 1 /* no resource reason code */ 3463c602fabSXin LI #define DC_NOLINK 41 /* no link terminate reason code */ 3473c602fabSXin LI #define DC_COMPLETE 42 /* disconnect complete reason code */ 3483c602fabSXin LI 3493c602fabSXin LI #define DI_NOERROR 0 /* user disconnect */ 3503c602fabSXin LI #define DI_SHUT 3 /* node is shutting down */ 3513c602fabSXin LI #define DI_NOUSER 4 /* destination end user does not exist */ 3523c602fabSXin LI #define DI_INVDEST 5 /* invalid end user destination */ 3533c602fabSXin LI #define DI_REMRESRC 6 /* insufficient remote resources */ 3543c602fabSXin LI #define DI_TPA 8 /* third party abort */ 3553c602fabSXin LI #define DI_PROTOCOL 7 /* protocol error discovered */ 3563c602fabSXin LI #define DI_ABORT 9 /* user abort */ 3573c602fabSXin LI #define DI_LOCALRESRC 32 /* insufficient local resources */ 3583c602fabSXin LI #define DI_REMUSERRESRC 33 /* insufficient remote user resources */ 3593c602fabSXin LI #define DI_BADACCESS 34 /* bad access control information */ 3603c602fabSXin LI #define DI_BADACCNT 36 /* bad ACCOUNT information */ 3613c602fabSXin LI #define DI_CONNECTABORT 38 /* connect request cancelled */ 3623c602fabSXin LI #define DI_TIMEDOUT 38 /* remote node or user crashed */ 3633c602fabSXin LI #define DI_UNREACHABLE 39 /* local timers expired due to ... */ 3643c602fabSXin LI #define DI_BADIMAGE 43 /* bad image data in connect */ 3653c602fabSXin LI #define DI_SERVMISMATCH 54 /* cryptographic service mismatch */ 3663c602fabSXin LI 3673c602fabSXin LI #define UC_OBJREJECT 0 /* object rejected connect */ 3683c602fabSXin LI #define UC_USERDISCONNECT 0 /* user disconnect */ 3693c602fabSXin LI #define UC_RESOURCES 1 /* insufficient resources (local or remote) */ 3703c602fabSXin LI #define UC_NOSUCHNODE 2 /* unrecognized node name */ 3713c602fabSXin LI #define UC_REMOTESHUT 3 /* remote node shutting down */ 3723c602fabSXin LI #define UC_NOSUCHOBJ 4 /* unrecognized object */ 3733c602fabSXin LI #define UC_INVOBJFORMAT 5 /* invalid object name format */ 3743c602fabSXin LI #define UC_OBJTOOBUSY 6 /* object too busy */ 3753c602fabSXin LI #define UC_NETWORKABORT 8 /* network abort */ 3763c602fabSXin LI #define UC_USERABORT 9 /* user abort */ 3773c602fabSXin LI #define UC_INVNODEFORMAT 10 /* invalid node name format */ 3783c602fabSXin LI #define UC_LOCALSHUT 11 /* local node shutting down */ 3793c602fabSXin LI #define UC_ACCESSREJECT 34 /* invalid access control information */ 3803c602fabSXin LI #define UC_NORESPONSE 38 /* no response from object */ 3813c602fabSXin LI #define UC_UNREACHABLE 39 /* node unreachable */ 3823c602fabSXin LI 3833c602fabSXin LI /* 3843c602fabSXin LI * NSP message formats. 3853c602fabSXin LI */ 3863c602fabSXin LI struct nsphdr /* general nsp header */ 3873c602fabSXin LI { 3883c602fabSXin LI byte nh_flags; /* message flags */ 3893c602fabSXin LI word nh_dst; /* destination link address */ 3903c602fabSXin LI word nh_src; /* source link address */ 3913c602fabSXin LI }; 3923c602fabSXin LI 3933c602fabSXin LI struct seghdr /* data segment header */ 3943c602fabSXin LI { 3953c602fabSXin LI byte sh_flags; /* message flags */ 3963c602fabSXin LI word sh_dst; /* destination link address */ 3973c602fabSXin LI word sh_src; /* source link address */ 3983c602fabSXin LI word sh_seq[3]; /* sequence numbers */ 3993c602fabSXin LI }; 4003c602fabSXin LI 4013c602fabSXin LI struct minseghdr /* minimum data segment header */ 4023c602fabSXin LI { 4033c602fabSXin LI byte ms_flags; /* message flags */ 4043c602fabSXin LI word ms_dst; /* destination link address */ 4053c602fabSXin LI word ms_src; /* source link address */ 4063c602fabSXin LI word ms_seq; /* sequence number */ 4073c602fabSXin LI }; 4083c602fabSXin LI 4093c602fabSXin LI struct lsmsg /* link service message (after hdr) */ 4103c602fabSXin LI { 4113c602fabSXin LI byte ls_lsflags; /* link service flags */ 4123c602fabSXin LI byte ls_fcval; /* flow control value */ 4133c602fabSXin LI }; 4143c602fabSXin LI 4153c602fabSXin LI struct ackmsg /* acknowledgement message */ 4163c602fabSXin LI { 4173c602fabSXin LI byte ak_flags; /* message flags */ 4183c602fabSXin LI word ak_dst; /* destination link address */ 4193c602fabSXin LI word ak_src; /* source link address */ 4203c602fabSXin LI word ak_acknum[2]; /* acknowledgement numbers */ 4213c602fabSXin LI }; 4223c602fabSXin LI 4233c602fabSXin LI struct minackmsg /* minimum acknowledgement message */ 4243c602fabSXin LI { 4253c602fabSXin LI byte mk_flags; /* message flags */ 4263c602fabSXin LI word mk_dst; /* destination link address */ 4273c602fabSXin LI word mk_src; /* source link address */ 4283c602fabSXin LI word mk_acknum; /* acknowledgement number */ 4293c602fabSXin LI }; 4303c602fabSXin LI 4313c602fabSXin LI struct ciackmsg /* connect acknowledgement message */ 4323c602fabSXin LI { 4333c602fabSXin LI byte ck_flags; /* message flags */ 4343c602fabSXin LI word ck_dst; /* destination link address */ 4353c602fabSXin LI }; 4363c602fabSXin LI 4373c602fabSXin LI struct cimsg /* connect initiate message */ 4383c602fabSXin LI { 4393c602fabSXin LI byte ci_flags; /* message flags */ 4403c602fabSXin LI word ci_dst; /* destination link address (0) */ 4413c602fabSXin LI word ci_src; /* source link address */ 4423c602fabSXin LI byte ci_services; /* requested services */ 4433c602fabSXin LI byte ci_info; /* information */ 4443c602fabSXin LI word ci_segsize; /* maximum segment size */ 4453c602fabSXin LI }; 4463c602fabSXin LI 4473c602fabSXin LI struct ccmsg /* connect confirm message */ 4483c602fabSXin LI { 4493c602fabSXin LI byte cc_flags; /* message flags */ 4503c602fabSXin LI word cc_dst; /* destination link address */ 4513c602fabSXin LI word cc_src; /* source link address */ 4523c602fabSXin LI byte cc_services; /* requested services */ 4533c602fabSXin LI byte cc_info; /* information */ 4543c602fabSXin LI word cc_segsize; /* maximum segment size */ 4553c602fabSXin LI byte cc_optlen; /* optional data length */ 4563c602fabSXin LI }; 4573c602fabSXin LI 4583c602fabSXin LI struct cnmsg /* generic connect message */ 4593c602fabSXin LI { 4603c602fabSXin LI byte cn_flags; /* message flags */ 4613c602fabSXin LI word cn_dst; /* destination link address */ 4623c602fabSXin LI word cn_src; /* source link address */ 4633c602fabSXin LI byte cn_services; /* requested services */ 4643c602fabSXin LI byte cn_info; /* information */ 4653c602fabSXin LI word cn_segsize; /* maximum segment size */ 4663c602fabSXin LI }; 4673c602fabSXin LI 4683c602fabSXin LI struct dimsg /* disconnect initiate message */ 4693c602fabSXin LI { 4703c602fabSXin LI byte di_flags; /* message flags */ 4713c602fabSXin LI word di_dst; /* destination link address */ 4723c602fabSXin LI word di_src; /* source link address */ 4733c602fabSXin LI word di_reason; /* reason code */ 4743c602fabSXin LI byte di_optlen; /* optional data length */ 4753c602fabSXin LI }; 4763c602fabSXin LI 4773c602fabSXin LI struct dcmsg /* disconnect confirm message */ 4783c602fabSXin LI { 4793c602fabSXin LI byte dc_flags; /* message flags */ 4803c602fabSXin LI word dc_dst; /* destination link address */ 4813c602fabSXin LI word dc_src; /* source link address */ 4823c602fabSXin LI word dc_reason; /* reason code */ 4833c602fabSXin LI }; 4843c602fabSXin LI 4854edb46e9SPaul Traina /* Forwards */ 4863c602fabSXin LI static int print_decnet_ctlmsg(netdissect_options *, const union routehdr *, u_int, u_int); 4873c602fabSXin LI static void print_t_info(netdissect_options *, int); 4883c602fabSXin LI static int print_l1_routes(netdissect_options *, const char *, u_int); 4893c602fabSXin LI static int print_l2_routes(netdissect_options *, const char *, u_int); 4903c602fabSXin LI static void print_i_info(netdissect_options *, int); 491f4d0c64aSSam Leffler static int print_elist(const char *, u_int); 4923c602fabSXin LI static int print_nsp(netdissect_options *, const u_char *, u_int); 4933c602fabSXin LI static void print_reason(netdissect_options *, int); 4944edb46e9SPaul Traina 4955b0fe478SBruce M Simpson #ifndef HAVE_NETDNET_DNETDB_H_DNET_HTOA 4964edb46e9SPaul Traina extern char *dnet_htoa(struct dn_naddr *); 4974edb46e9SPaul Traina #endif 4984edb46e9SPaul Traina 4994edb46e9SPaul Traina void 5003c602fabSXin LI decnet_print(netdissect_options *ndo, 5013c602fabSXin LI register const u_char *ap, register u_int length, 5024edb46e9SPaul Traina register u_int caplen) 5034edb46e9SPaul Traina { 504f4d0c64aSSam Leffler register const union routehdr *rhp; 5054edb46e9SPaul Traina register int mflags; 5064edb46e9SPaul Traina int dst, src, hops; 507f4d0c64aSSam Leffler u_int nsplen, pktlen; 5084edb46e9SPaul Traina const u_char *nspp; 5094edb46e9SPaul Traina 5104edb46e9SPaul Traina if (length < sizeof(struct shorthdr)) { 5113c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 5124edb46e9SPaul Traina return; 5134edb46e9SPaul Traina } 5144edb46e9SPaul Traina 5153c602fabSXin LI ND_TCHECK2(*ap, sizeof(short)); 5164edb46e9SPaul Traina pktlen = EXTRACT_LE_16BITS(ap); 517f4d0c64aSSam Leffler if (pktlen < sizeof(struct shorthdr)) { 5183c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 519f4d0c64aSSam Leffler return; 520f4d0c64aSSam Leffler } 521f4d0c64aSSam Leffler if (pktlen > length) { 5223c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 523f4d0c64aSSam Leffler return; 524f4d0c64aSSam Leffler } 525f4d0c64aSSam Leffler length = pktlen; 5264edb46e9SPaul Traina 527f4d0c64aSSam Leffler rhp = (const union routehdr *)&(ap[sizeof(short)]); 5283c602fabSXin LI ND_TCHECK(rhp->rh_short.sh_flags); 5294edb46e9SPaul Traina mflags = EXTRACT_LE_8BITS(rhp->rh_short.sh_flags); 5304edb46e9SPaul Traina 5314edb46e9SPaul Traina if (mflags & RMF_PAD) { 5324edb46e9SPaul Traina /* pad bytes of some sort in front of message */ 5334edb46e9SPaul Traina u_int padlen = mflags & RMF_PADMASK; 5343c602fabSXin LI if (ndo->ndo_vflag) 5353c602fabSXin LI ND_PRINT((ndo, "[pad:%d] ", padlen)); 536f4d0c64aSSam Leffler if (length < padlen + 2) { 5373c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 538f4d0c64aSSam Leffler return; 539f4d0c64aSSam Leffler } 5403c602fabSXin LI ND_TCHECK2(ap[sizeof(short)], padlen); 5414edb46e9SPaul Traina ap += padlen; 5424edb46e9SPaul Traina length -= padlen; 5434edb46e9SPaul Traina caplen -= padlen; 544f4d0c64aSSam Leffler rhp = (const union routehdr *)&(ap[sizeof(short)]); 545*0bff6a5aSEd Maste ND_TCHECK(rhp->rh_short.sh_flags); 5464edb46e9SPaul Traina mflags = EXTRACT_LE_8BITS(rhp->rh_short.sh_flags); 5474edb46e9SPaul Traina } 5484edb46e9SPaul Traina 5494edb46e9SPaul Traina if (mflags & RMF_FVER) { 5503c602fabSXin LI ND_PRINT((ndo, "future-version-decnet")); 5513c602fabSXin LI ND_DEFAULTPRINT(ap, min(length, caplen)); 5524edb46e9SPaul Traina return; 5534edb46e9SPaul Traina } 5544edb46e9SPaul Traina 5554edb46e9SPaul Traina /* is it a control message? */ 5564edb46e9SPaul Traina if (mflags & RMF_CTLMSG) { 5573c602fabSXin LI if (!print_decnet_ctlmsg(ndo, rhp, length, caplen)) 558f4d0c64aSSam Leffler goto trunc; 5594edb46e9SPaul Traina return; 5604edb46e9SPaul Traina } 5614edb46e9SPaul Traina 5624edb46e9SPaul Traina switch (mflags & RMF_MASK) { 5634edb46e9SPaul Traina case RMF_LONG: 564f4d0c64aSSam Leffler if (length < sizeof(struct longhdr)) { 5653c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 566f4d0c64aSSam Leffler return; 567f4d0c64aSSam Leffler } 5683c602fabSXin LI ND_TCHECK(rhp->rh_long); 5694edb46e9SPaul Traina dst = 5704edb46e9SPaul Traina EXTRACT_LE_16BITS(rhp->rh_long.lg_dst.dne_remote.dne_nodeaddr); 5714edb46e9SPaul Traina src = 5724edb46e9SPaul Traina EXTRACT_LE_16BITS(rhp->rh_long.lg_src.dne_remote.dne_nodeaddr); 5734edb46e9SPaul Traina hops = EXTRACT_LE_8BITS(rhp->rh_long.lg_visits); 5744edb46e9SPaul Traina nspp = &(ap[sizeof(short) + sizeof(struct longhdr)]); 575f4d0c64aSSam Leffler nsplen = length - sizeof(struct longhdr); 5764edb46e9SPaul Traina break; 5774edb46e9SPaul Traina case RMF_SHORT: 5783c602fabSXin LI ND_TCHECK(rhp->rh_short); 5794edb46e9SPaul Traina dst = EXTRACT_LE_16BITS(rhp->rh_short.sh_dst); 5804edb46e9SPaul Traina src = EXTRACT_LE_16BITS(rhp->rh_short.sh_src); 5814edb46e9SPaul Traina hops = (EXTRACT_LE_8BITS(rhp->rh_short.sh_visits) & VIS_MASK)+1; 5824edb46e9SPaul Traina nspp = &(ap[sizeof(short) + sizeof(struct shorthdr)]); 583f4d0c64aSSam Leffler nsplen = length - sizeof(struct shorthdr); 5844edb46e9SPaul Traina break; 5854edb46e9SPaul Traina default: 5863c602fabSXin LI ND_PRINT((ndo, "unknown message flags under mask")); 5873340d773SGleb Smirnoff ND_DEFAULTPRINT((const u_char *)ap, min(length, caplen)); 5884edb46e9SPaul Traina return; 5894edb46e9SPaul Traina } 5904edb46e9SPaul Traina 5913c602fabSXin LI ND_PRINT((ndo, "%s > %s %d ", 5923c602fabSXin LI dnaddr_string(ndo, src), dnaddr_string(ndo, dst), pktlen)); 5933c602fabSXin LI if (ndo->ndo_vflag) { 5944edb46e9SPaul Traina if (mflags & RMF_RQR) 5953c602fabSXin LI ND_PRINT((ndo, "RQR ")); 5964edb46e9SPaul Traina if (mflags & RMF_RTS) 5973c602fabSXin LI ND_PRINT((ndo, "RTS ")); 5984edb46e9SPaul Traina if (mflags & RMF_IE) 5993c602fabSXin LI ND_PRINT((ndo, "IE ")); 6003c602fabSXin LI ND_PRINT((ndo, "%d hops ", hops)); 6014edb46e9SPaul Traina } 6024edb46e9SPaul Traina 6033c602fabSXin LI if (!print_nsp(ndo, nspp, nsplen)) 604f4d0c64aSSam Leffler goto trunc; 605f4d0c64aSSam Leffler return; 606f4d0c64aSSam Leffler 607f4d0c64aSSam Leffler trunc: 6083c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 609f4d0c64aSSam Leffler return; 6104edb46e9SPaul Traina } 6114edb46e9SPaul Traina 612f4d0c64aSSam Leffler static int 6133c602fabSXin LI print_decnet_ctlmsg(netdissect_options *ndo, 6143c602fabSXin LI register const union routehdr *rhp, u_int length, 615f4d0c64aSSam Leffler u_int caplen) 6164edb46e9SPaul Traina { 617*0bff6a5aSEd Maste /* Our caller has already checked for mflags */ 6184edb46e9SPaul Traina int mflags = EXTRACT_LE_8BITS(rhp->rh_short.sh_flags); 6193340d773SGleb Smirnoff register const union controlmsg *cmp = (const union controlmsg *)rhp; 6204edb46e9SPaul Traina int src, dst, info, blksize, eco, ueco, hello, other, vers; 6214edb46e9SPaul Traina etheraddr srcea, rtea; 6224edb46e9SPaul Traina int priority; 6233340d773SGleb Smirnoff const char *rhpx = (const char *)rhp; 624f4d0c64aSSam Leffler int ret; 6254edb46e9SPaul Traina 6264edb46e9SPaul Traina switch (mflags & RMF_CTLMASK) { 6274edb46e9SPaul Traina case RMF_INIT: 6283c602fabSXin LI ND_PRINT((ndo, "init ")); 629f4d0c64aSSam Leffler if (length < sizeof(struct initmsg)) 630f4d0c64aSSam Leffler goto trunc; 6313c602fabSXin LI ND_TCHECK(cmp->cm_init); 6324edb46e9SPaul Traina src = EXTRACT_LE_16BITS(cmp->cm_init.in_src); 6334edb46e9SPaul Traina info = EXTRACT_LE_8BITS(cmp->cm_init.in_info); 6344edb46e9SPaul Traina blksize = EXTRACT_LE_16BITS(cmp->cm_init.in_blksize); 6354edb46e9SPaul Traina vers = EXTRACT_LE_8BITS(cmp->cm_init.in_vers); 6364edb46e9SPaul Traina eco = EXTRACT_LE_8BITS(cmp->cm_init.in_eco); 6374edb46e9SPaul Traina ueco = EXTRACT_LE_8BITS(cmp->cm_init.in_ueco); 6384edb46e9SPaul Traina hello = EXTRACT_LE_16BITS(cmp->cm_init.in_hello); 6393c602fabSXin LI print_t_info(ndo, info); 6403c602fabSXin LI ND_PRINT((ndo, 6414edb46e9SPaul Traina "src %sblksize %d vers %d eco %d ueco %d hello %d", 6423c602fabSXin LI dnaddr_string(ndo, src), blksize, vers, eco, ueco, 6433c602fabSXin LI hello)); 644f4d0c64aSSam Leffler ret = 1; 6454edb46e9SPaul Traina break; 6464edb46e9SPaul Traina case RMF_VER: 6473c602fabSXin LI ND_PRINT((ndo, "verification ")); 648f4d0c64aSSam Leffler if (length < sizeof(struct verifmsg)) 649f4d0c64aSSam Leffler goto trunc; 6503c602fabSXin LI ND_TCHECK(cmp->cm_ver); 6514edb46e9SPaul Traina src = EXTRACT_LE_16BITS(cmp->cm_ver.ve_src); 6524edb46e9SPaul Traina other = EXTRACT_LE_8BITS(cmp->cm_ver.ve_fcnval); 6533c602fabSXin LI ND_PRINT((ndo, "src %s fcnval %o", dnaddr_string(ndo, src), other)); 654f4d0c64aSSam Leffler ret = 1; 6554edb46e9SPaul Traina break; 6564edb46e9SPaul Traina case RMF_TEST: 6573c602fabSXin LI ND_PRINT((ndo, "test ")); 658f4d0c64aSSam Leffler if (length < sizeof(struct testmsg)) 659f4d0c64aSSam Leffler goto trunc; 6603c602fabSXin LI ND_TCHECK(cmp->cm_test); 6614edb46e9SPaul Traina src = EXTRACT_LE_16BITS(cmp->cm_test.te_src); 6624edb46e9SPaul Traina other = EXTRACT_LE_8BITS(cmp->cm_test.te_data); 6633c602fabSXin LI ND_PRINT((ndo, "src %s data %o", dnaddr_string(ndo, src), other)); 664f4d0c64aSSam Leffler ret = 1; 6654edb46e9SPaul Traina break; 6664edb46e9SPaul Traina case RMF_L1ROUT: 6673c602fabSXin LI ND_PRINT((ndo, "lev-1-routing ")); 668f4d0c64aSSam Leffler if (length < sizeof(struct l1rout)) 669f4d0c64aSSam Leffler goto trunc; 6703c602fabSXin LI ND_TCHECK(cmp->cm_l1rou); 6714edb46e9SPaul Traina src = EXTRACT_LE_16BITS(cmp->cm_l1rou.r1_src); 6723c602fabSXin LI ND_PRINT((ndo, "src %s ", dnaddr_string(ndo, src))); 6733c602fabSXin LI ret = print_l1_routes(ndo, &(rhpx[sizeof(struct l1rout)]), 6744edb46e9SPaul Traina length - sizeof(struct l1rout)); 6754edb46e9SPaul Traina break; 6764edb46e9SPaul Traina case RMF_L2ROUT: 6773c602fabSXin LI ND_PRINT((ndo, "lev-2-routing ")); 678f4d0c64aSSam Leffler if (length < sizeof(struct l2rout)) 679f4d0c64aSSam Leffler goto trunc; 6803c602fabSXin LI ND_TCHECK(cmp->cm_l2rout); 6814edb46e9SPaul Traina src = EXTRACT_LE_16BITS(cmp->cm_l2rout.r2_src); 6823c602fabSXin LI ND_PRINT((ndo, "src %s ", dnaddr_string(ndo, src))); 6833c602fabSXin LI ret = print_l2_routes(ndo, &(rhpx[sizeof(struct l2rout)]), 6844edb46e9SPaul Traina length - sizeof(struct l2rout)); 6854edb46e9SPaul Traina break; 6864edb46e9SPaul Traina case RMF_RHELLO: 6873c602fabSXin LI ND_PRINT((ndo, "router-hello ")); 688f4d0c64aSSam Leffler if (length < sizeof(struct rhellomsg)) 689f4d0c64aSSam Leffler goto trunc; 6903c602fabSXin LI ND_TCHECK(cmp->cm_rhello); 6914edb46e9SPaul Traina vers = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_vers); 6924edb46e9SPaul Traina eco = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_eco); 6934edb46e9SPaul Traina ueco = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_ueco); 6943340d773SGleb Smirnoff memcpy((char *)&srcea, (const char *)&(cmp->cm_rhello.rh_src), 6954edb46e9SPaul Traina sizeof(srcea)); 6964edb46e9SPaul Traina src = EXTRACT_LE_16BITS(srcea.dne_remote.dne_nodeaddr); 6974edb46e9SPaul Traina info = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_info); 6984edb46e9SPaul Traina blksize = EXTRACT_LE_16BITS(cmp->cm_rhello.rh_blksize); 6994edb46e9SPaul Traina priority = EXTRACT_LE_8BITS(cmp->cm_rhello.rh_priority); 7004edb46e9SPaul Traina hello = EXTRACT_LE_16BITS(cmp->cm_rhello.rh_hello); 7013c602fabSXin LI print_i_info(ndo, info); 7023c602fabSXin LI ND_PRINT((ndo, 7034edb46e9SPaul Traina "vers %d eco %d ueco %d src %s blksize %d pri %d hello %d", 7043c602fabSXin LI vers, eco, ueco, dnaddr_string(ndo, src), 7053c602fabSXin LI blksize, priority, hello)); 706f4d0c64aSSam Leffler ret = print_elist(&(rhpx[sizeof(struct rhellomsg)]), 7074edb46e9SPaul Traina length - sizeof(struct rhellomsg)); 7084edb46e9SPaul Traina break; 7094edb46e9SPaul Traina case RMF_EHELLO: 7103c602fabSXin LI ND_PRINT((ndo, "endnode-hello ")); 711f4d0c64aSSam Leffler if (length < sizeof(struct ehellomsg)) 712f4d0c64aSSam Leffler goto trunc; 7133c602fabSXin LI ND_TCHECK(cmp->cm_ehello); 7144edb46e9SPaul Traina vers = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_vers); 7154edb46e9SPaul Traina eco = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_eco); 7164edb46e9SPaul Traina ueco = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_ueco); 7173340d773SGleb Smirnoff memcpy((char *)&srcea, (const char *)&(cmp->cm_ehello.eh_src), 7184edb46e9SPaul Traina sizeof(srcea)); 7194edb46e9SPaul Traina src = EXTRACT_LE_16BITS(srcea.dne_remote.dne_nodeaddr); 7204edb46e9SPaul Traina info = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_info); 7214edb46e9SPaul Traina blksize = EXTRACT_LE_16BITS(cmp->cm_ehello.eh_blksize); 7224edb46e9SPaul Traina /*seed*/ 7233340d773SGleb Smirnoff memcpy((char *)&rtea, (const char *)&(cmp->cm_ehello.eh_router), 7244edb46e9SPaul Traina sizeof(rtea)); 7254edb46e9SPaul Traina dst = EXTRACT_LE_16BITS(rtea.dne_remote.dne_nodeaddr); 7264edb46e9SPaul Traina hello = EXTRACT_LE_16BITS(cmp->cm_ehello.eh_hello); 7274edb46e9SPaul Traina other = EXTRACT_LE_8BITS(cmp->cm_ehello.eh_data); 7283c602fabSXin LI print_i_info(ndo, info); 7293c602fabSXin LI ND_PRINT((ndo, 7304edb46e9SPaul Traina "vers %d eco %d ueco %d src %s blksize %d rtr %s hello %d data %o", 7313c602fabSXin LI vers, eco, ueco, dnaddr_string(ndo, src), 7323c602fabSXin LI blksize, dnaddr_string(ndo, dst), hello, other)); 733f4d0c64aSSam Leffler ret = 1; 7344edb46e9SPaul Traina break; 7354edb46e9SPaul Traina 7364edb46e9SPaul Traina default: 7373c602fabSXin LI ND_PRINT((ndo, "unknown control message")); 7383340d773SGleb Smirnoff ND_DEFAULTPRINT((const u_char *)rhp, min(length, caplen)); 739f4d0c64aSSam Leffler ret = 1; 7404edb46e9SPaul Traina break; 7414edb46e9SPaul Traina } 742f4d0c64aSSam Leffler return (ret); 743f4d0c64aSSam Leffler 744f4d0c64aSSam Leffler trunc: 745f4d0c64aSSam Leffler return (0); 7464edb46e9SPaul Traina } 7474edb46e9SPaul Traina 7484edb46e9SPaul Traina static void 7493c602fabSXin LI print_t_info(netdissect_options *ndo, 7503c602fabSXin LI int info) 7514edb46e9SPaul Traina { 7524edb46e9SPaul Traina int ntype = info & 3; 7534edb46e9SPaul Traina switch (ntype) { 7543c602fabSXin LI case 0: ND_PRINT((ndo, "reserved-ntype? ")); break; 7553c602fabSXin LI case TI_L2ROUT: ND_PRINT((ndo, "l2rout ")); break; 7563c602fabSXin LI case TI_L1ROUT: ND_PRINT((ndo, "l1rout ")); break; 7573c602fabSXin LI case TI_ENDNODE: ND_PRINT((ndo, "endnode ")); break; 7584edb46e9SPaul Traina } 7594edb46e9SPaul Traina if (info & TI_VERIF) 7603c602fabSXin LI ND_PRINT((ndo, "verif ")); 7614edb46e9SPaul Traina if (info & TI_BLOCK) 7623c602fabSXin LI ND_PRINT((ndo, "blo ")); 7634edb46e9SPaul Traina } 7644edb46e9SPaul Traina 765f4d0c64aSSam Leffler static int 7663c602fabSXin LI print_l1_routes(netdissect_options *ndo, 7673c602fabSXin LI const char *rp, u_int len) 7684edb46e9SPaul Traina { 7694edb46e9SPaul Traina int count; 7704edb46e9SPaul Traina int id; 7714edb46e9SPaul Traina int info; 7724edb46e9SPaul Traina 7734edb46e9SPaul Traina /* The last short is a checksum */ 7744edb46e9SPaul Traina while (len > (3 * sizeof(short))) { 7753c602fabSXin LI ND_TCHECK2(*rp, 3 * sizeof(short)); 7764edb46e9SPaul Traina count = EXTRACT_LE_16BITS(rp); 7774edb46e9SPaul Traina if (count > 1024) 778f4d0c64aSSam Leffler return (1); /* seems to be bogus from here on */ 7794edb46e9SPaul Traina rp += sizeof(short); 7804edb46e9SPaul Traina len -= sizeof(short); 7814edb46e9SPaul Traina id = EXTRACT_LE_16BITS(rp); 7824edb46e9SPaul Traina rp += sizeof(short); 7834edb46e9SPaul Traina len -= sizeof(short); 7844edb46e9SPaul Traina info = EXTRACT_LE_16BITS(rp); 7854edb46e9SPaul Traina rp += sizeof(short); 7864edb46e9SPaul Traina len -= sizeof(short); 7873c602fabSXin LI ND_PRINT((ndo, "{ids %d-%d cost %d hops %d} ", id, id + count, 7883c602fabSXin LI RI_COST(info), RI_HOPS(info))); 7894edb46e9SPaul Traina } 790f4d0c64aSSam Leffler return (1); 791f4d0c64aSSam Leffler 792f4d0c64aSSam Leffler trunc: 793f4d0c64aSSam Leffler return (0); 7944edb46e9SPaul Traina } 7954edb46e9SPaul Traina 796f4d0c64aSSam Leffler static int 7973c602fabSXin LI print_l2_routes(netdissect_options *ndo, 7983c602fabSXin LI const char *rp, u_int len) 7994edb46e9SPaul Traina { 8004edb46e9SPaul Traina int count; 8014edb46e9SPaul Traina int area; 8024edb46e9SPaul Traina int info; 8034edb46e9SPaul Traina 8044edb46e9SPaul Traina /* The last short is a checksum */ 8054edb46e9SPaul Traina while (len > (3 * sizeof(short))) { 8063c602fabSXin LI ND_TCHECK2(*rp, 3 * sizeof(short)); 8074edb46e9SPaul Traina count = EXTRACT_LE_16BITS(rp); 8084edb46e9SPaul Traina if (count > 1024) 809f4d0c64aSSam Leffler return (1); /* seems to be bogus from here on */ 8104edb46e9SPaul Traina rp += sizeof(short); 8114edb46e9SPaul Traina len -= sizeof(short); 8124edb46e9SPaul Traina area = EXTRACT_LE_16BITS(rp); 8134edb46e9SPaul Traina rp += sizeof(short); 8144edb46e9SPaul Traina len -= sizeof(short); 8154edb46e9SPaul Traina info = EXTRACT_LE_16BITS(rp); 8164edb46e9SPaul Traina rp += sizeof(short); 8174edb46e9SPaul Traina len -= sizeof(short); 8183c602fabSXin LI ND_PRINT((ndo, "{areas %d-%d cost %d hops %d} ", area, area + count, 8193c602fabSXin LI RI_COST(info), RI_HOPS(info))); 8204edb46e9SPaul Traina } 821f4d0c64aSSam Leffler return (1); 822f4d0c64aSSam Leffler 823f4d0c64aSSam Leffler trunc: 824f4d0c64aSSam Leffler return (0); 8254edb46e9SPaul Traina } 8264edb46e9SPaul Traina 8274edb46e9SPaul Traina static void 8283c602fabSXin LI print_i_info(netdissect_options *ndo, 8293c602fabSXin LI int info) 8304edb46e9SPaul Traina { 8314edb46e9SPaul Traina int ntype = info & II_TYPEMASK; 8324edb46e9SPaul Traina switch (ntype) { 8333c602fabSXin LI case 0: ND_PRINT((ndo, "reserved-ntype? ")); break; 8343c602fabSXin LI case II_L2ROUT: ND_PRINT((ndo, "l2rout ")); break; 8353c602fabSXin LI case II_L1ROUT: ND_PRINT((ndo, "l1rout ")); break; 8363c602fabSXin LI case II_ENDNODE: ND_PRINT((ndo, "endnode ")); break; 8374edb46e9SPaul Traina } 8384edb46e9SPaul Traina if (info & II_VERIF) 8393c602fabSXin LI ND_PRINT((ndo, "verif ")); 8404edb46e9SPaul Traina if (info & II_NOMCAST) 8413c602fabSXin LI ND_PRINT((ndo, "nomcast ")); 8424edb46e9SPaul Traina if (info & II_BLOCK) 8433c602fabSXin LI ND_PRINT((ndo, "blo ")); 8444edb46e9SPaul Traina } 8454edb46e9SPaul Traina 846f4d0c64aSSam Leffler static int 8475b0fe478SBruce M Simpson print_elist(const char *elp _U_, u_int len _U_) 8484edb46e9SPaul Traina { 8494edb46e9SPaul Traina /* Not enough examples available for me to debug this */ 850f4d0c64aSSam Leffler return (1); 8514edb46e9SPaul Traina } 8524edb46e9SPaul Traina 853f4d0c64aSSam Leffler static int 8543c602fabSXin LI print_nsp(netdissect_options *ndo, 8553c602fabSXin LI const u_char *nspp, u_int nsplen) 8564edb46e9SPaul Traina { 8573340d773SGleb Smirnoff const struct nsphdr *nsphp = (const struct nsphdr *)nspp; 8584edb46e9SPaul Traina int dst, src, flags; 8594edb46e9SPaul Traina 860f4d0c64aSSam Leffler if (nsplen < sizeof(struct nsphdr)) 861f4d0c64aSSam Leffler goto trunc; 8623c602fabSXin LI ND_TCHECK(*nsphp); 8634edb46e9SPaul Traina flags = EXTRACT_LE_8BITS(nsphp->nh_flags); 8644edb46e9SPaul Traina dst = EXTRACT_LE_16BITS(nsphp->nh_dst); 8654edb46e9SPaul Traina src = EXTRACT_LE_16BITS(nsphp->nh_src); 8664edb46e9SPaul Traina 8674edb46e9SPaul Traina switch (flags & NSP_TYPEMASK) { 8684edb46e9SPaul Traina case MFT_DATA: 8694edb46e9SPaul Traina switch (flags & NSP_SUBMASK) { 8704edb46e9SPaul Traina case MFS_BOM: 8714edb46e9SPaul Traina case MFS_MOM: 8724edb46e9SPaul Traina case MFS_EOM: 8734edb46e9SPaul Traina case MFS_BOM+MFS_EOM: 8743c602fabSXin LI ND_PRINT((ndo, "data %d>%d ", src, dst)); 8754edb46e9SPaul Traina { 8763340d773SGleb Smirnoff const struct seghdr *shp = (const struct seghdr *)nspp; 8774edb46e9SPaul Traina int ack; 8784edb46e9SPaul Traina u_int data_off = sizeof(struct minseghdr); 8794edb46e9SPaul Traina 880f4d0c64aSSam Leffler if (nsplen < data_off) 881f4d0c64aSSam Leffler goto trunc; 8823c602fabSXin LI ND_TCHECK(shp->sh_seq[0]); 8834edb46e9SPaul Traina ack = EXTRACT_LE_16BITS(shp->sh_seq[0]); 8844edb46e9SPaul Traina if (ack & SGQ_ACK) { /* acknum field */ 8854edb46e9SPaul Traina if ((ack & SGQ_NAK) == SGQ_NAK) 8863c602fabSXin LI ND_PRINT((ndo, "nak %d ", ack & SGQ_MASK)); 8874edb46e9SPaul Traina else 8883c602fabSXin LI ND_PRINT((ndo, "ack %d ", ack & SGQ_MASK)); 8894edb46e9SPaul Traina data_off += sizeof(short); 890f4d0c64aSSam Leffler if (nsplen < data_off) 891f4d0c64aSSam Leffler goto trunc; 8923c602fabSXin LI ND_TCHECK(shp->sh_seq[1]); 893f4d0c64aSSam Leffler ack = EXTRACT_LE_16BITS(shp->sh_seq[1]); 8944edb46e9SPaul Traina if (ack & SGQ_OACK) { /* ackoth field */ 8954edb46e9SPaul Traina if ((ack & SGQ_ONAK) == SGQ_ONAK) 8963c602fabSXin LI ND_PRINT((ndo, "onak %d ", ack & SGQ_MASK)); 8974edb46e9SPaul Traina else 8983c602fabSXin LI ND_PRINT((ndo, "oack %d ", ack & SGQ_MASK)); 8994edb46e9SPaul Traina data_off += sizeof(short); 900f4d0c64aSSam Leffler if (nsplen < data_off) 901f4d0c64aSSam Leffler goto trunc; 9023c602fabSXin LI ND_TCHECK(shp->sh_seq[2]); 903f4d0c64aSSam Leffler ack = EXTRACT_LE_16BITS(shp->sh_seq[2]); 9044edb46e9SPaul Traina } 9054edb46e9SPaul Traina } 9063c602fabSXin LI ND_PRINT((ndo, "seg %d ", ack & SGQ_MASK)); 9074edb46e9SPaul Traina } 9084edb46e9SPaul Traina break; 9094edb46e9SPaul Traina case MFS_ILS+MFS_INT: 9103c602fabSXin LI ND_PRINT((ndo, "intr ")); 9114edb46e9SPaul Traina { 9123340d773SGleb Smirnoff const struct seghdr *shp = (const struct seghdr *)nspp; 9134edb46e9SPaul Traina int ack; 9144edb46e9SPaul Traina u_int data_off = sizeof(struct minseghdr); 9154edb46e9SPaul Traina 916f4d0c64aSSam Leffler if (nsplen < data_off) 917f4d0c64aSSam Leffler goto trunc; 9183c602fabSXin LI ND_TCHECK(shp->sh_seq[0]); 9194edb46e9SPaul Traina ack = EXTRACT_LE_16BITS(shp->sh_seq[0]); 9204edb46e9SPaul Traina if (ack & SGQ_ACK) { /* acknum field */ 9214edb46e9SPaul Traina if ((ack & SGQ_NAK) == SGQ_NAK) 9223c602fabSXin LI ND_PRINT((ndo, "nak %d ", ack & SGQ_MASK)); 9234edb46e9SPaul Traina else 9243c602fabSXin LI ND_PRINT((ndo, "ack %d ", ack & SGQ_MASK)); 9254edb46e9SPaul Traina data_off += sizeof(short); 926f4d0c64aSSam Leffler if (nsplen < data_off) 927f4d0c64aSSam Leffler goto trunc; 9283c602fabSXin LI ND_TCHECK(shp->sh_seq[1]); 929f4d0c64aSSam Leffler ack = EXTRACT_LE_16BITS(shp->sh_seq[1]); 9304edb46e9SPaul Traina if (ack & SGQ_OACK) { /* ackdat field */ 9314edb46e9SPaul Traina if ((ack & SGQ_ONAK) == SGQ_ONAK) 9323c602fabSXin LI ND_PRINT((ndo, "nakdat %d ", ack & SGQ_MASK)); 9334edb46e9SPaul Traina else 9343c602fabSXin LI ND_PRINT((ndo, "ackdat %d ", ack & SGQ_MASK)); 9354edb46e9SPaul Traina data_off += sizeof(short); 936f4d0c64aSSam Leffler if (nsplen < data_off) 937f4d0c64aSSam Leffler goto trunc; 9383c602fabSXin LI ND_TCHECK(shp->sh_seq[2]); 939f4d0c64aSSam Leffler ack = EXTRACT_LE_16BITS(shp->sh_seq[2]); 9404edb46e9SPaul Traina } 9414edb46e9SPaul Traina } 9423c602fabSXin LI ND_PRINT((ndo, "seg %d ", ack & SGQ_MASK)); 9434edb46e9SPaul Traina } 9444edb46e9SPaul Traina break; 9454edb46e9SPaul Traina case MFS_ILS: 9463c602fabSXin LI ND_PRINT((ndo, "link-service %d>%d ", src, dst)); 9474edb46e9SPaul Traina { 9483340d773SGleb Smirnoff const struct seghdr *shp = (const struct seghdr *)nspp; 9493340d773SGleb Smirnoff const struct lsmsg *lsmp = 9503340d773SGleb Smirnoff (const struct lsmsg *)&(nspp[sizeof(struct seghdr)]); 9514edb46e9SPaul Traina int ack; 9524edb46e9SPaul Traina int lsflags, fcval; 9534edb46e9SPaul Traina 954f4d0c64aSSam Leffler if (nsplen < sizeof(struct seghdr) + sizeof(struct lsmsg)) 955f4d0c64aSSam Leffler goto trunc; 9563c602fabSXin LI ND_TCHECK(shp->sh_seq[0]); 9574edb46e9SPaul Traina ack = EXTRACT_LE_16BITS(shp->sh_seq[0]); 9584edb46e9SPaul Traina if (ack & SGQ_ACK) { /* acknum field */ 9594edb46e9SPaul Traina if ((ack & SGQ_NAK) == SGQ_NAK) 9603c602fabSXin LI ND_PRINT((ndo, "nak %d ", ack & SGQ_MASK)); 9614edb46e9SPaul Traina else 9623c602fabSXin LI ND_PRINT((ndo, "ack %d ", ack & SGQ_MASK)); 9633c602fabSXin LI ND_TCHECK(shp->sh_seq[1]); 9644edb46e9SPaul Traina ack = EXTRACT_LE_16BITS(shp->sh_seq[1]); 9654edb46e9SPaul Traina if (ack & SGQ_OACK) { /* ackdat field */ 9664edb46e9SPaul Traina if ((ack & SGQ_ONAK) == SGQ_ONAK) 9673c602fabSXin LI ND_PRINT((ndo, "nakdat %d ", ack & SGQ_MASK)); 9684edb46e9SPaul Traina else 9693c602fabSXin LI ND_PRINT((ndo, "ackdat %d ", ack & SGQ_MASK)); 9703c602fabSXin LI ND_TCHECK(shp->sh_seq[2]); 9714edb46e9SPaul Traina ack = EXTRACT_LE_16BITS(shp->sh_seq[2]); 9724edb46e9SPaul Traina } 9734edb46e9SPaul Traina } 9743c602fabSXin LI ND_PRINT((ndo, "seg %d ", ack & SGQ_MASK)); 9753c602fabSXin LI ND_TCHECK(*lsmp); 9764edb46e9SPaul Traina lsflags = EXTRACT_LE_8BITS(lsmp->ls_lsflags); 9774edb46e9SPaul Traina fcval = EXTRACT_LE_8BITS(lsmp->ls_fcval); 9784edb46e9SPaul Traina switch (lsflags & LSI_MASK) { 9794edb46e9SPaul Traina case LSI_DATA: 9803c602fabSXin LI ND_PRINT((ndo, "dat seg count %d ", fcval)); 9814edb46e9SPaul Traina switch (lsflags & LSM_MASK) { 9824edb46e9SPaul Traina case LSM_NOCHANGE: 9834edb46e9SPaul Traina break; 9844edb46e9SPaul Traina case LSM_DONOTSEND: 9853c602fabSXin LI ND_PRINT((ndo, "donotsend-data ")); 9864edb46e9SPaul Traina break; 9874edb46e9SPaul Traina case LSM_SEND: 9883c602fabSXin LI ND_PRINT((ndo, "send-data ")); 9894edb46e9SPaul Traina break; 9904edb46e9SPaul Traina default: 9913c602fabSXin LI ND_PRINT((ndo, "reserved-fcmod? %x", lsflags)); 9924edb46e9SPaul Traina break; 9934edb46e9SPaul Traina } 9944edb46e9SPaul Traina break; 9954edb46e9SPaul Traina case LSI_INTR: 9963c602fabSXin LI ND_PRINT((ndo, "intr req count %d ", fcval)); 9974edb46e9SPaul Traina break; 9984edb46e9SPaul Traina default: 9993c602fabSXin LI ND_PRINT((ndo, "reserved-fcval-int? %x", lsflags)); 10004edb46e9SPaul Traina break; 10014edb46e9SPaul Traina } 10024edb46e9SPaul Traina } 10034edb46e9SPaul Traina break; 10044edb46e9SPaul Traina default: 10053c602fabSXin LI ND_PRINT((ndo, "reserved-subtype? %x %d > %d", flags, src, dst)); 10064edb46e9SPaul Traina break; 10074edb46e9SPaul Traina } 10084edb46e9SPaul Traina break; 10094edb46e9SPaul Traina case MFT_ACK: 10104edb46e9SPaul Traina switch (flags & NSP_SUBMASK) { 10114edb46e9SPaul Traina case MFS_DACK: 10123c602fabSXin LI ND_PRINT((ndo, "data-ack %d>%d ", src, dst)); 10134edb46e9SPaul Traina { 10143340d773SGleb Smirnoff const struct ackmsg *amp = (const struct ackmsg *)nspp; 10154edb46e9SPaul Traina int ack; 10164edb46e9SPaul Traina 1017f4d0c64aSSam Leffler if (nsplen < sizeof(struct ackmsg)) 1018f4d0c64aSSam Leffler goto trunc; 10193c602fabSXin LI ND_TCHECK(*amp); 10204edb46e9SPaul Traina ack = EXTRACT_LE_16BITS(amp->ak_acknum[0]); 10214edb46e9SPaul Traina if (ack & SGQ_ACK) { /* acknum field */ 10224edb46e9SPaul Traina if ((ack & SGQ_NAK) == SGQ_NAK) 10233c602fabSXin LI ND_PRINT((ndo, "nak %d ", ack & SGQ_MASK)); 10244edb46e9SPaul Traina else 10253c602fabSXin LI ND_PRINT((ndo, "ack %d ", ack & SGQ_MASK)); 10264edb46e9SPaul Traina ack = EXTRACT_LE_16BITS(amp->ak_acknum[1]); 10274edb46e9SPaul Traina if (ack & SGQ_OACK) { /* ackoth field */ 10284edb46e9SPaul Traina if ((ack & SGQ_ONAK) == SGQ_ONAK) 10293c602fabSXin LI ND_PRINT((ndo, "onak %d ", ack & SGQ_MASK)); 10304edb46e9SPaul Traina else 10313c602fabSXin LI ND_PRINT((ndo, "oack %d ", ack & SGQ_MASK)); 10324edb46e9SPaul Traina } 10334edb46e9SPaul Traina } 10344edb46e9SPaul Traina } 10354edb46e9SPaul Traina break; 10364edb46e9SPaul Traina case MFS_IACK: 10373c602fabSXin LI ND_PRINT((ndo, "ils-ack %d>%d ", src, dst)); 10384edb46e9SPaul Traina { 10393340d773SGleb Smirnoff const struct ackmsg *amp = (const struct ackmsg *)nspp; 10404edb46e9SPaul Traina int ack; 10414edb46e9SPaul Traina 1042f4d0c64aSSam Leffler if (nsplen < sizeof(struct ackmsg)) 1043f4d0c64aSSam Leffler goto trunc; 10443c602fabSXin LI ND_TCHECK(*amp); 10454edb46e9SPaul Traina ack = EXTRACT_LE_16BITS(amp->ak_acknum[0]); 10464edb46e9SPaul Traina if (ack & SGQ_ACK) { /* acknum field */ 10474edb46e9SPaul Traina if ((ack & SGQ_NAK) == SGQ_NAK) 10483c602fabSXin LI ND_PRINT((ndo, "nak %d ", ack & SGQ_MASK)); 10494edb46e9SPaul Traina else 10503c602fabSXin LI ND_PRINT((ndo, "ack %d ", ack & SGQ_MASK)); 10513c602fabSXin LI ND_TCHECK(amp->ak_acknum[1]); 10524edb46e9SPaul Traina ack = EXTRACT_LE_16BITS(amp->ak_acknum[1]); 10534edb46e9SPaul Traina if (ack & SGQ_OACK) { /* ackdat field */ 10544edb46e9SPaul Traina if ((ack & SGQ_ONAK) == SGQ_ONAK) 10553c602fabSXin LI ND_PRINT((ndo, "nakdat %d ", ack & SGQ_MASK)); 10564edb46e9SPaul Traina else 10573c602fabSXin LI ND_PRINT((ndo, "ackdat %d ", ack & SGQ_MASK)); 10584edb46e9SPaul Traina } 10594edb46e9SPaul Traina } 10604edb46e9SPaul Traina } 10614edb46e9SPaul Traina break; 10624edb46e9SPaul Traina case MFS_CACK: 10633c602fabSXin LI ND_PRINT((ndo, "conn-ack %d", dst)); 10644edb46e9SPaul Traina break; 10654edb46e9SPaul Traina default: 10663c602fabSXin LI ND_PRINT((ndo, "reserved-acktype? %x %d > %d", flags, src, dst)); 10674edb46e9SPaul Traina break; 10684edb46e9SPaul Traina } 10694edb46e9SPaul Traina break; 10704edb46e9SPaul Traina case MFT_CTL: 10714edb46e9SPaul Traina switch (flags & NSP_SUBMASK) { 10724edb46e9SPaul Traina case MFS_CI: 10734edb46e9SPaul Traina case MFS_RCI: 10744edb46e9SPaul Traina if ((flags & NSP_SUBMASK) == MFS_CI) 10753c602fabSXin LI ND_PRINT((ndo, "conn-initiate ")); 10764edb46e9SPaul Traina else 10773c602fabSXin LI ND_PRINT((ndo, "retrans-conn-initiate ")); 10783c602fabSXin LI ND_PRINT((ndo, "%d>%d ", src, dst)); 10794edb46e9SPaul Traina { 10803340d773SGleb Smirnoff const struct cimsg *cimp = (const struct cimsg *)nspp; 10814edb46e9SPaul Traina int services, info, segsize; 10824edb46e9SPaul Traina 1083f4d0c64aSSam Leffler if (nsplen < sizeof(struct cimsg)) 1084f4d0c64aSSam Leffler goto trunc; 10853c602fabSXin LI ND_TCHECK(*cimp); 10864edb46e9SPaul Traina services = EXTRACT_LE_8BITS(cimp->ci_services); 10874edb46e9SPaul Traina info = EXTRACT_LE_8BITS(cimp->ci_info); 10884edb46e9SPaul Traina segsize = EXTRACT_LE_16BITS(cimp->ci_segsize); 10894edb46e9SPaul Traina 10904edb46e9SPaul Traina switch (services & COS_MASK) { 10914edb46e9SPaul Traina case COS_NONE: 10924edb46e9SPaul Traina break; 10934edb46e9SPaul Traina case COS_SEGMENT: 10943c602fabSXin LI ND_PRINT((ndo, "seg ")); 10954edb46e9SPaul Traina break; 10964edb46e9SPaul Traina case COS_MESSAGE: 10973c602fabSXin LI ND_PRINT((ndo, "msg ")); 10984edb46e9SPaul Traina break; 10994edb46e9SPaul Traina } 11004edb46e9SPaul Traina switch (info & COI_MASK) { 11014edb46e9SPaul Traina case COI_32: 11023c602fabSXin LI ND_PRINT((ndo, "ver 3.2 ")); 11034edb46e9SPaul Traina break; 11044edb46e9SPaul Traina case COI_31: 11053c602fabSXin LI ND_PRINT((ndo, "ver 3.1 ")); 11064edb46e9SPaul Traina break; 11074edb46e9SPaul Traina case COI_40: 11083c602fabSXin LI ND_PRINT((ndo, "ver 4.0 ")); 11094edb46e9SPaul Traina break; 11104edb46e9SPaul Traina case COI_41: 11113c602fabSXin LI ND_PRINT((ndo, "ver 4.1 ")); 11124edb46e9SPaul Traina break; 11134edb46e9SPaul Traina } 11143c602fabSXin LI ND_PRINT((ndo, "segsize %d ", segsize)); 11154edb46e9SPaul Traina } 11164edb46e9SPaul Traina break; 11174edb46e9SPaul Traina case MFS_CC: 11183c602fabSXin LI ND_PRINT((ndo, "conn-confirm %d>%d ", src, dst)); 11194edb46e9SPaul Traina { 11203340d773SGleb Smirnoff const struct ccmsg *ccmp = (const struct ccmsg *)nspp; 11214edb46e9SPaul Traina int services, info; 11224edb46e9SPaul Traina u_int segsize, optlen; 11234edb46e9SPaul Traina 1124f4d0c64aSSam Leffler if (nsplen < sizeof(struct ccmsg)) 1125f4d0c64aSSam Leffler goto trunc; 11263c602fabSXin LI ND_TCHECK(*ccmp); 11274edb46e9SPaul Traina services = EXTRACT_LE_8BITS(ccmp->cc_services); 11284edb46e9SPaul Traina info = EXTRACT_LE_8BITS(ccmp->cc_info); 11294edb46e9SPaul Traina segsize = EXTRACT_LE_16BITS(ccmp->cc_segsize); 11304edb46e9SPaul Traina optlen = EXTRACT_LE_8BITS(ccmp->cc_optlen); 11314edb46e9SPaul Traina 11324edb46e9SPaul Traina switch (services & COS_MASK) { 11334edb46e9SPaul Traina case COS_NONE: 11344edb46e9SPaul Traina break; 11354edb46e9SPaul Traina case COS_SEGMENT: 11363c602fabSXin LI ND_PRINT((ndo, "seg ")); 11374edb46e9SPaul Traina break; 11384edb46e9SPaul Traina case COS_MESSAGE: 11393c602fabSXin LI ND_PRINT((ndo, "msg ")); 11404edb46e9SPaul Traina break; 11414edb46e9SPaul Traina } 11424edb46e9SPaul Traina switch (info & COI_MASK) { 11434edb46e9SPaul Traina case COI_32: 11443c602fabSXin LI ND_PRINT((ndo, "ver 3.2 ")); 11454edb46e9SPaul Traina break; 11464edb46e9SPaul Traina case COI_31: 11473c602fabSXin LI ND_PRINT((ndo, "ver 3.1 ")); 11484edb46e9SPaul Traina break; 11494edb46e9SPaul Traina case COI_40: 11503c602fabSXin LI ND_PRINT((ndo, "ver 4.0 ")); 11514edb46e9SPaul Traina break; 11524edb46e9SPaul Traina case COI_41: 11533c602fabSXin LI ND_PRINT((ndo, "ver 4.1 ")); 11544edb46e9SPaul Traina break; 11554edb46e9SPaul Traina } 11563c602fabSXin LI ND_PRINT((ndo, "segsize %d ", segsize)); 11574edb46e9SPaul Traina if (optlen) { 11583c602fabSXin LI ND_PRINT((ndo, "optlen %d ", optlen)); 11594edb46e9SPaul Traina } 11604edb46e9SPaul Traina } 11614edb46e9SPaul Traina break; 11624edb46e9SPaul Traina case MFS_DI: 11633c602fabSXin LI ND_PRINT((ndo, "disconn-initiate %d>%d ", src, dst)); 11644edb46e9SPaul Traina { 11653340d773SGleb Smirnoff const struct dimsg *dimp = (const struct dimsg *)nspp; 11664edb46e9SPaul Traina int reason; 11674edb46e9SPaul Traina u_int optlen; 11684edb46e9SPaul Traina 1169f4d0c64aSSam Leffler if (nsplen < sizeof(struct dimsg)) 1170f4d0c64aSSam Leffler goto trunc; 11713c602fabSXin LI ND_TCHECK(*dimp); 11724edb46e9SPaul Traina reason = EXTRACT_LE_16BITS(dimp->di_reason); 11734edb46e9SPaul Traina optlen = EXTRACT_LE_8BITS(dimp->di_optlen); 11744edb46e9SPaul Traina 11753c602fabSXin LI print_reason(ndo, reason); 11764edb46e9SPaul Traina if (optlen) { 11773c602fabSXin LI ND_PRINT((ndo, "optlen %d ", optlen)); 11784edb46e9SPaul Traina } 11794edb46e9SPaul Traina } 11804edb46e9SPaul Traina break; 11814edb46e9SPaul Traina case MFS_DC: 11823c602fabSXin LI ND_PRINT((ndo, "disconn-confirm %d>%d ", src, dst)); 11834edb46e9SPaul Traina { 11843340d773SGleb Smirnoff const struct dcmsg *dcmp = (const struct dcmsg *)nspp; 11854edb46e9SPaul Traina int reason; 11864edb46e9SPaul Traina 11873c602fabSXin LI ND_TCHECK(*dcmp); 11884edb46e9SPaul Traina reason = EXTRACT_LE_16BITS(dcmp->dc_reason); 11894edb46e9SPaul Traina 11903c602fabSXin LI print_reason(ndo, reason); 11914edb46e9SPaul Traina } 11924edb46e9SPaul Traina break; 11934edb46e9SPaul Traina default: 11943c602fabSXin LI ND_PRINT((ndo, "reserved-ctltype? %x %d > %d", flags, src, dst)); 11954edb46e9SPaul Traina break; 11964edb46e9SPaul Traina } 11974edb46e9SPaul Traina break; 11984edb46e9SPaul Traina default: 11993c602fabSXin LI ND_PRINT((ndo, "reserved-type? %x %d > %d", flags, src, dst)); 12004edb46e9SPaul Traina break; 12014edb46e9SPaul Traina } 1202f4d0c64aSSam Leffler return (1); 1203f4d0c64aSSam Leffler 1204f4d0c64aSSam Leffler trunc: 1205f4d0c64aSSam Leffler return (0); 12064edb46e9SPaul Traina } 12074edb46e9SPaul Traina 12083c602fabSXin LI static const struct tok reason2str[] = { 12094edb46e9SPaul Traina { UC_OBJREJECT, "object rejected connect" }, 12104edb46e9SPaul Traina { UC_RESOURCES, "insufficient resources" }, 12114edb46e9SPaul Traina { UC_NOSUCHNODE, "unrecognized node name" }, 12124edb46e9SPaul Traina { DI_SHUT, "node is shutting down" }, 12134edb46e9SPaul Traina { UC_NOSUCHOBJ, "unrecognized object" }, 12144edb46e9SPaul Traina { UC_INVOBJFORMAT, "invalid object name format" }, 12154edb46e9SPaul Traina { UC_OBJTOOBUSY, "object too busy" }, 12164edb46e9SPaul Traina { DI_PROTOCOL, "protocol error discovered" }, 12174edb46e9SPaul Traina { DI_TPA, "third party abort" }, 12184edb46e9SPaul Traina { UC_USERABORT, "user abort" }, 12194edb46e9SPaul Traina { UC_INVNODEFORMAT, "invalid node name format" }, 12204edb46e9SPaul Traina { UC_LOCALSHUT, "local node shutting down" }, 12214edb46e9SPaul Traina { DI_LOCALRESRC, "insufficient local resources" }, 12224edb46e9SPaul Traina { DI_REMUSERRESRC, "insufficient remote user resources" }, 12234edb46e9SPaul Traina { UC_ACCESSREJECT, "invalid access control information" }, 12244edb46e9SPaul Traina { DI_BADACCNT, "bad ACCOUNT information" }, 12254edb46e9SPaul Traina { UC_NORESPONSE, "no response from object" }, 12264edb46e9SPaul Traina { UC_UNREACHABLE, "node unreachable" }, 12274edb46e9SPaul Traina { DC_NOLINK, "no link terminate" }, 12284edb46e9SPaul Traina { DC_COMPLETE, "disconnect complete" }, 12294edb46e9SPaul Traina { DI_BADIMAGE, "bad image data in connect" }, 12304edb46e9SPaul Traina { DI_SERVMISMATCH, "cryptographic service mismatch" }, 12314edb46e9SPaul Traina { 0, NULL } 12324edb46e9SPaul Traina }; 12334edb46e9SPaul Traina 12344edb46e9SPaul Traina static void 12353c602fabSXin LI print_reason(netdissect_options *ndo, 12363c602fabSXin LI register int reason) 12374edb46e9SPaul Traina { 12383c602fabSXin LI ND_PRINT((ndo, "%s ", tok2str(reason2str, "reason-%d", reason))); 12394edb46e9SPaul Traina } 12404edb46e9SPaul Traina 1241a90e161bSBill Fenner const char * 12423340d773SGleb Smirnoff dnnum_string(netdissect_options *ndo, u_short dnaddr) 12434edb46e9SPaul Traina { 12444edb46e9SPaul Traina char *str; 1245685295f4SBill Fenner size_t siz; 12464de76e31SBill Fenner int area = (u_short)(dnaddr & AREAMASK) >> AREASHIFT; 12474edb46e9SPaul Traina int node = dnaddr & NODEMASK; 12484edb46e9SPaul Traina 1249685295f4SBill Fenner str = (char *)malloc(siz = sizeof("00.0000")); 12504edb46e9SPaul Traina if (str == NULL) 12513340d773SGleb Smirnoff (*ndo->ndo_error)(ndo, "dnnum_string: malloc"); 1252685295f4SBill Fenner snprintf(str, siz, "%d.%d", area, node); 12534edb46e9SPaul Traina return(str); 12544edb46e9SPaul Traina } 12554edb46e9SPaul Traina 1256a90e161bSBill Fenner const char * 12573340d773SGleb Smirnoff dnname_string(netdissect_options *ndo, u_short dnaddr) 12584edb46e9SPaul Traina { 12595b0fe478SBruce M Simpson #ifdef HAVE_DNET_HTOA 12604edb46e9SPaul Traina struct dn_naddr dna; 12618bdc5a62SPatrick Kelsey char *dnname; 12624edb46e9SPaul Traina 12634edb46e9SPaul Traina dna.a_len = sizeof(short); 12644edb46e9SPaul Traina memcpy((char *)dna.a_addr, (char *)&dnaddr, sizeof(short)); 12658bdc5a62SPatrick Kelsey dnname = dnet_htoa(&dna); 12668bdc5a62SPatrick Kelsey if(dnname != NULL) 12678bdc5a62SPatrick Kelsey return (strdup(dnname)); 12688bdc5a62SPatrick Kelsey else 12693340d773SGleb Smirnoff return(dnnum_string(ndo, dnaddr)); 12704edb46e9SPaul Traina #else 12713340d773SGleb Smirnoff return(dnnum_string(ndo, dnaddr)); /* punt */ 12724edb46e9SPaul Traina #endif 12734edb46e9SPaul Traina } 1274