1 /* 2 * Copyright (c) 1992, 1994, 1996 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that: (1) source code distributions 7 * retain the above copyright notice and this paragraph in its entirety, (2) 8 * distributions including binary code include the above copyright notice and 9 * this paragraph in its entirety in the documentation or other materials 10 * provided with the distribution, and (3) all advertising materials mentioning 11 * features or use of this software display the following acknowledgement: 12 * ``This product includes software developed by the University of California, 13 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14 * the University nor the names of its contributors may be used to endorse 15 * or promote products derived from this software without specific prior 16 * written permission. 17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20 * 21 * @(#) $Header: /tcpdump/master/tcpdump/decnet.h,v 1.11 2002/12/11 07:13:50 guy Exp $ (LBL) 22 */ 23 24 #ifndef WIN32 25 typedef u_int8_t byte[1]; /* single byte field */ 26 #else 27 /* 28 * the keyword 'byte' generates conflicts in Windows 29 */ 30 typedef unsigned char Byte[1]; /* single byte field */ 31 #define byte Byte 32 #endif /* WIN32 */ 33 typedef u_int8_t word[2]; /* 2 byte field */ 34 typedef u_int8_t longword[4]; /* 4 bytes field */ 35 36 /* 37 * Definitions for DECNET Phase IV protocol headers 38 */ 39 union etheraddress { 40 u_int8_t dne_addr[6]; /* full ethernet address */ 41 struct { 42 u_int8_t dne_hiord[4]; /* DECnet HIORD prefix */ 43 u_int8_t dne_nodeaddr[2]; /* DECnet node address */ 44 } dne_remote; 45 }; 46 47 typedef union etheraddress etheraddr; /* Ethernet address */ 48 49 #define HIORD 0x000400aa /* high 32-bits of address (swapped) */ 50 51 #define AREAMASK 0176000 /* mask for area field */ 52 #define AREASHIFT 10 /* bit-offset for area field */ 53 #define NODEMASK 01777 /* mask for node address field */ 54 55 #define DN_MAXADDL 20 /* max size of DECnet address */ 56 struct dn_naddr { 57 u_int16_t a_len; /* length of address */ 58 u_int8_t a_addr[DN_MAXADDL]; /* address as bytes */ 59 }; 60 61 /* 62 * Define long and short header formats. 63 */ 64 struct shorthdr 65 { 66 byte sh_flags; /* route flags */ 67 word sh_dst; /* destination node address */ 68 word sh_src; /* source node address */ 69 byte sh_visits; /* visit count */ 70 }; 71 72 struct longhdr 73 { 74 byte lg_flags; /* route flags */ 75 byte lg_darea; /* destination area (reserved) */ 76 byte lg_dsarea; /* destination subarea (reserved) */ 77 etheraddr lg_dst; /* destination id */ 78 byte lg_sarea; /* source area (reserved) */ 79 byte lg_ssarea; /* source subarea (reserved) */ 80 etheraddr lg_src; /* source id */ 81 byte lg_nextl2; /* next level 2 router (reserved) */ 82 byte lg_visits; /* visit count */ 83 byte lg_service; /* service class (reserved) */ 84 byte lg_pt; /* protocol type (reserved) */ 85 }; 86 87 union routehdr 88 { 89 struct shorthdr rh_short; /* short route header */ 90 struct longhdr rh_long; /* long route header */ 91 }; 92 93 /* 94 * Define the values of various fields in the protocol messages. 95 * 96 * 1. Data packet formats. 97 */ 98 #define RMF_MASK 7 /* mask for message type */ 99 #define RMF_SHORT 2 /* short message format */ 100 #define RMF_LONG 6 /* long message format */ 101 #ifndef RMF_RQR 102 #define RMF_RQR 010 /* request return to sender */ 103 #define RMF_RTS 020 /* returning to sender */ 104 #define RMF_IE 040 /* intra-ethernet packet */ 105 #endif /* RMR_RQR */ 106 #define RMF_FVER 0100 /* future version flag */ 107 #define RMF_PAD 0200 /* pad field */ 108 #define RMF_PADMASK 0177 /* pad field mask */ 109 110 #define VIS_MASK 077 /* visit field mask */ 111 112 /* 113 * 2. Control packet formats. 114 */ 115 #define RMF_CTLMASK 017 /* mask for message type */ 116 #define RMF_CTLMSG 01 /* control message indicator */ 117 #define RMF_INIT 01 /* initialization message */ 118 #define RMF_VER 03 /* verification message */ 119 #define RMF_TEST 05 /* hello and test message */ 120 #define RMF_L1ROUT 07 /* level 1 routing message */ 121 #define RMF_L2ROUT 011 /* level 2 routing message */ 122 #define RMF_RHELLO 013 /* router hello message */ 123 #define RMF_EHELLO 015 /* endnode hello message */ 124 125 #define TI_L2ROUT 01 /* level 2 router */ 126 #define TI_L1ROUT 02 /* level 1 router */ 127 #define TI_ENDNODE 03 /* endnode */ 128 #define TI_VERIF 04 /* verification required */ 129 #define TI_BLOCK 010 /* blocking requested */ 130 131 #define VE_VERS 2 /* version number (2) */ 132 #define VE_ECO 0 /* ECO number */ 133 #define VE_UECO 0 /* user ECO number (0) */ 134 135 #define P3_VERS 1 /* phase III version number (1) */ 136 #define P3_ECO 3 /* ECO number (3) */ 137 #define P3_UECO 0 /* user ECO number (0) */ 138 139 #define II_L2ROUT 01 /* level 2 router */ 140 #define II_L1ROUT 02 /* level 1 router */ 141 #define II_ENDNODE 03 /* endnode */ 142 #define II_VERIF 04 /* verification required */ 143 #define II_NOMCAST 040 /* no multicast traffic accepted */ 144 #define II_BLOCK 0100 /* blocking requested */ 145 #define II_TYPEMASK 03 /* mask for node type */ 146 147 #define TESTDATA 0252 /* test data bytes */ 148 #define TESTLEN 1 /* length of transmitted test data */ 149 150 /* 151 * Define control message formats. 152 */ 153 struct initmsgIII /* phase III initialization message */ 154 { 155 byte inIII_flags; /* route flags */ 156 word inIII_src; /* source node address */ 157 byte inIII_info; /* routing layer information */ 158 word inIII_blksize; /* maximum data link block size */ 159 byte inIII_vers; /* version number */ 160 byte inIII_eco; /* ECO number */ 161 byte inIII_ueco; /* user ECO number */ 162 byte inIII_rsvd; /* reserved image field */ 163 }; 164 165 struct initmsg /* initialization message */ 166 { 167 byte in_flags; /* route flags */ 168 word in_src; /* source node address */ 169 byte in_info; /* routing layer information */ 170 word in_blksize; /* maximum data link block size */ 171 byte in_vers; /* version number */ 172 byte in_eco; /* ECO number */ 173 byte in_ueco; /* user ECO number */ 174 word in_hello; /* hello timer */ 175 byte in_rsvd; /* reserved image field */ 176 }; 177 178 struct verifmsg /* verification message */ 179 { 180 byte ve_flags; /* route flags */ 181 word ve_src; /* source node address */ 182 byte ve_fcnval; /* function value image field */ 183 }; 184 185 struct testmsg /* hello and test message */ 186 { 187 byte te_flags; /* route flags */ 188 word te_src; /* source node address */ 189 byte te_data; /* test data image field */ 190 }; 191 192 struct l1rout /* level 1 routing message */ 193 { 194 byte r1_flags; /* route flags */ 195 word r1_src; /* source node address */ 196 byte r1_rsvd; /* reserved field */ 197 }; 198 199 struct l2rout /* level 2 routing message */ 200 { 201 byte r2_flags; /* route flags */ 202 word r2_src; /* source node address */ 203 byte r2_rsvd; /* reserved field */ 204 }; 205 206 struct rhellomsg /* router hello message */ 207 { 208 byte rh_flags; /* route flags */ 209 byte rh_vers; /* version number */ 210 byte rh_eco; /* ECO number */ 211 byte rh_ueco; /* user ECO number */ 212 etheraddr rh_src; /* source id */ 213 byte rh_info; /* routing layer information */ 214 word rh_blksize; /* maximum data link block size */ 215 byte rh_priority; /* router's priority */ 216 byte rh_area; /* reserved */ 217 word rh_hello; /* hello timer */ 218 byte rh_mpd; /* reserved */ 219 }; 220 221 struct ehellomsg /* endnode hello message */ 222 { 223 byte eh_flags; /* route flags */ 224 byte eh_vers; /* version number */ 225 byte eh_eco; /* ECO number */ 226 byte eh_ueco; /* user ECO number */ 227 etheraddr eh_src; /* source id */ 228 byte eh_info; /* routing layer information */ 229 word eh_blksize; /* maximum data link block size */ 230 byte eh_area; /* area (reserved) */ 231 byte eh_seed[8]; /* verification seed */ 232 etheraddr eh_router; /* designated router */ 233 word eh_hello; /* hello timer */ 234 byte eh_mpd; /* (reserved) */ 235 byte eh_data; /* test data image field */ 236 }; 237 238 union controlmsg 239 { 240 struct initmsg cm_init; /* initialization message */ 241 struct verifmsg cm_ver; /* verification message */ 242 struct testmsg cm_test; /* hello and test message */ 243 struct l1rout cm_l1rou; /* level 1 routing message */ 244 struct l2rout cm_l2rout; /* level 2 routing message */ 245 struct rhellomsg cm_rhello; /* router hello message */ 246 struct ehellomsg cm_ehello; /* endnode hello message */ 247 }; 248 249 /* Macros for decoding routing-info fields */ 250 #define RI_COST(x) ((x)&0777) 251 #define RI_HOPS(x) (((x)>>10)&037) 252 253 /* 254 * NSP protocol fields and values. 255 */ 256 257 #define NSP_TYPEMASK 014 /* mask to isolate type code */ 258 #define NSP_SUBMASK 0160 /* mask to isolate subtype code */ 259 #define NSP_SUBSHFT 4 /* shift to move subtype code */ 260 261 #define MFT_DATA 0 /* data message */ 262 #define MFT_ACK 04 /* acknowledgement message */ 263 #define MFT_CTL 010 /* control message */ 264 265 #define MFS_ILS 020 /* data or I/LS indicator */ 266 #define MFS_BOM 040 /* beginning of message (data) */ 267 #define MFS_MOM 0 /* middle of message (data) */ 268 #define MFS_EOM 0100 /* end of message (data) */ 269 #define MFS_INT 040 /* interrupt message */ 270 271 #define MFS_DACK 0 /* data acknowledgement */ 272 #define MFS_IACK 020 /* I/LS acknowledgement */ 273 #define MFS_CACK 040 /* connect acknowledgement */ 274 275 #define MFS_NOP 0 /* no operation */ 276 #define MFS_CI 020 /* connect initiate */ 277 #define MFS_CC 040 /* connect confirm */ 278 #define MFS_DI 060 /* disconnect initiate */ 279 #define MFS_DC 0100 /* disconnect confirm */ 280 #define MFS_RCI 0140 /* retransmitted connect initiate */ 281 282 #define SGQ_ACK 0100000 /* ack */ 283 #define SGQ_NAK 0110000 /* negative ack */ 284 #define SGQ_OACK 0120000 /* other channel ack */ 285 #define SGQ_ONAK 0130000 /* other channel negative ack */ 286 #define SGQ_MASK 07777 /* mask to isolate seq # */ 287 #define SGQ_OTHER 020000 /* other channel qualifier */ 288 #define SGQ_DELAY 010000 /* ack delay flag */ 289 290 #define SGQ_EOM 0100000 /* pseudo flag for end-of-message */ 291 292 #define LSM_MASK 03 /* mask for modifier field */ 293 #define LSM_NOCHANGE 0 /* no change */ 294 #define LSM_DONOTSEND 1 /* do not send data */ 295 #define LSM_SEND 2 /* send data */ 296 297 #define LSI_MASK 014 /* mask for interpretation field */ 298 #define LSI_DATA 0 /* data segment or message count */ 299 #define LSI_INTR 4 /* interrupt request count */ 300 #define LSI_INTM 0377 /* funny marker for int. message */ 301 302 #define COS_MASK 014 /* mask for flow control field */ 303 #define COS_NONE 0 /* no flow control */ 304 #define COS_SEGMENT 04 /* segment flow control */ 305 #define COS_MESSAGE 010 /* message flow control */ 306 #define COS_CRYPTSER 020 /* cryptographic services requested */ 307 #define COS_DEFAULT 1 /* default value for field */ 308 309 #define COI_MASK 3 /* mask for version field */ 310 #define COI_32 0 /* version 3.2 */ 311 #define COI_31 1 /* version 3.1 */ 312 #define COI_40 2 /* version 4.0 */ 313 #define COI_41 3 /* version 4.1 */ 314 315 #define MNU_MASK 140 /* mask for session control version */ 316 #define MNU_10 000 /* session V1.0 */ 317 #define MNU_20 040 /* session V2.0 */ 318 #define MNU_ACCESS 1 /* access control present */ 319 #define MNU_USRDATA 2 /* user data field present */ 320 #define MNU_INVKPROXY 4 /* invoke proxy field present */ 321 #define MNU_UICPROXY 8 /* use uic-based proxy */ 322 323 #define DC_NORESOURCES 1 /* no resource reason code */ 324 #define DC_NOLINK 41 /* no link terminate reason code */ 325 #define DC_COMPLETE 42 /* disconnect complete reason code */ 326 327 #define DI_NOERROR 0 /* user disconnect */ 328 #define DI_SHUT 3 /* node is shutting down */ 329 #define DI_NOUSER 4 /* destination end user does not exist */ 330 #define DI_INVDEST 5 /* invalid end user destination */ 331 #define DI_REMRESRC 6 /* insufficient remote resources */ 332 #define DI_TPA 8 /* third party abort */ 333 #define DI_PROTOCOL 7 /* protocol error discovered */ 334 #define DI_ABORT 9 /* user abort */ 335 #define DI_LOCALRESRC 32 /* insufficient local resources */ 336 #define DI_REMUSERRESRC 33 /* insufficient remote user resources */ 337 #define DI_BADACCESS 34 /* bad access control information */ 338 #define DI_BADACCNT 36 /* bad ACCOUNT information */ 339 #define DI_CONNECTABORT 38 /* connect request cancelled */ 340 #define DI_TIMEDOUT 38 /* remote node or user crashed */ 341 #define DI_UNREACHABLE 39 /* local timers expired due to ... */ 342 #define DI_BADIMAGE 43 /* bad image data in connect */ 343 #define DI_SERVMISMATCH 54 /* cryptographic service mismatch */ 344 345 #define UC_OBJREJECT 0 /* object rejected connect */ 346 #define UC_USERDISCONNECT 0 /* user disconnect */ 347 #define UC_RESOURCES 1 /* insufficient resources (local or remote) */ 348 #define UC_NOSUCHNODE 2 /* unrecognized node name */ 349 #define UC_REMOTESHUT 3 /* remote node shutting down */ 350 #define UC_NOSUCHOBJ 4 /* unrecognized object */ 351 #define UC_INVOBJFORMAT 5 /* invalid object name format */ 352 #define UC_OBJTOOBUSY 6 /* object too busy */ 353 #define UC_NETWORKABORT 8 /* network abort */ 354 #define UC_USERABORT 9 /* user abort */ 355 #define UC_INVNODEFORMAT 10 /* invalid node name format */ 356 #define UC_LOCALSHUT 11 /* local node shutting down */ 357 #define UC_ACCESSREJECT 34 /* invalid access control information */ 358 #define UC_NORESPONSE 38 /* no response from object */ 359 #define UC_UNREACHABLE 39 /* node unreachable */ 360 361 /* 362 * NSP message formats. 363 */ 364 struct nsphdr /* general nsp header */ 365 { 366 byte nh_flags; /* message flags */ 367 word nh_dst; /* destination link address */ 368 word nh_src; /* source link address */ 369 }; 370 371 struct seghdr /* data segment header */ 372 { 373 byte sh_flags; /* message flags */ 374 word sh_dst; /* destination link address */ 375 word sh_src; /* source link address */ 376 word sh_seq[3]; /* sequence numbers */ 377 }; 378 379 struct minseghdr /* minimum data segment header */ 380 { 381 byte ms_flags; /* message flags */ 382 word ms_dst; /* destination link address */ 383 word ms_src; /* source link address */ 384 word ms_seq; /* sequence number */ 385 }; 386 387 struct lsmsg /* link service message (after hdr) */ 388 { 389 byte ls_lsflags; /* link service flags */ 390 byte ls_fcval; /* flow control value */ 391 }; 392 393 struct ackmsg /* acknowledgement message */ 394 { 395 byte ak_flags; /* message flags */ 396 word ak_dst; /* destination link address */ 397 word ak_src; /* source link address */ 398 word ak_acknum[2]; /* acknowledgement numbers */ 399 }; 400 401 struct minackmsg /* minimum acknowledgement message */ 402 { 403 byte mk_flags; /* message flags */ 404 word mk_dst; /* destination link address */ 405 word mk_src; /* source link address */ 406 word mk_acknum; /* acknowledgement number */ 407 }; 408 409 struct ciackmsg /* connect acknowledgement message */ 410 { 411 byte ck_flags; /* message flags */ 412 word ck_dst; /* destination link address */ 413 }; 414 415 struct cimsg /* connect initiate message */ 416 { 417 byte ci_flags; /* message flags */ 418 word ci_dst; /* destination link address (0) */ 419 word ci_src; /* source link address */ 420 byte ci_services; /* requested services */ 421 byte ci_info; /* information */ 422 word ci_segsize; /* maximum segment size */ 423 }; 424 425 struct ccmsg /* connect confirm message */ 426 { 427 byte cc_flags; /* message flags */ 428 word cc_dst; /* destination link address */ 429 word cc_src; /* source link address */ 430 byte cc_services; /* requested services */ 431 byte cc_info; /* information */ 432 word cc_segsize; /* maximum segment size */ 433 byte cc_optlen; /* optional data length */ 434 }; 435 436 struct cnmsg /* generic connect message */ 437 { 438 byte cn_flags; /* message flags */ 439 word cn_dst; /* destination link address */ 440 word cn_src; /* source link address */ 441 byte cn_services; /* requested services */ 442 byte cn_info; /* information */ 443 word cn_segsize; /* maximum segment size */ 444 }; 445 446 struct dimsg /* disconnect initiate message */ 447 { 448 byte di_flags; /* message flags */ 449 word di_dst; /* destination link address */ 450 word di_src; /* source link address */ 451 word di_reason; /* reason code */ 452 byte di_optlen; /* optional data length */ 453 }; 454 455 struct dcmsg /* disconnect confirm message */ 456 { 457 byte dc_flags; /* message flags */ 458 word dc_dst; /* destination link address */ 459 word dc_src; /* source link address */ 460 word dc_reason; /* reason code */ 461 }; 462