1d09a7e67SXin LI /* 2d09a7e67SXin LI * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 3d09a7e67SXin LI * The Regents of the University of California. All rights reserved. 4d09a7e67SXin LI * 5d09a7e67SXin LI * Redistribution and use in source and binary forms, with or without 6d09a7e67SXin LI * modification, are permitted provided that: (1) source code distributions 7d09a7e67SXin LI * retain the above copyright notice and this paragraph in its entirety, (2) 8d09a7e67SXin LI * distributions including binary code include the above copyright notice and 9d09a7e67SXin LI * this paragraph in its entirety in the documentation or other materials 10d09a7e67SXin LI * provided with the distribution, and (3) all advertising materials mentioning 11d09a7e67SXin LI * features or use of this software display the following acknowledgement: 12d09a7e67SXin LI * ``This product includes software developed by the University of California, 13d09a7e67SXin LI * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 14d09a7e67SXin LI * the University nor the names of its contributors may be used to endorse 15d09a7e67SXin LI * or promote products derived from this software without specific prior 16d09a7e67SXin LI * written permission. 17d09a7e67SXin LI * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 18d09a7e67SXin LI * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 19d09a7e67SXin LI * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20d09a7e67SXin LI */ 21d09a7e67SXin LI 22*3340d773SGleb Smirnoff /* \summary: Transparent Inter-Process Communication (TIPC) protocol printer */ 23*3340d773SGleb Smirnoff 24*3340d773SGleb Smirnoff /* 25*3340d773SGleb Smirnoff * specification: 26*3340d773SGleb Smirnoff * http://tipc.sourceforge.net/doc/draft-spec-tipc-07.html 27*3340d773SGleb Smirnoff * http://tipc.sourceforge.net/doc/tipc_message_formats.html 28*3340d773SGleb Smirnoff */ 29*3340d773SGleb Smirnoff 30d09a7e67SXin LI #ifdef HAVE_CONFIG_H 31d09a7e67SXin LI #include "config.h" 32d09a7e67SXin LI #endif 33d09a7e67SXin LI 34*3340d773SGleb Smirnoff #include <netdissect-stdinc.h> 35d09a7e67SXin LI 36*3340d773SGleb Smirnoff #include "netdissect.h" 37d09a7e67SXin LI #include "ether.h" 38d09a7e67SXin LI #include "ethertype.h" 39*3340d773SGleb Smirnoff #include "extract.h" 40d09a7e67SXin LI 413c602fabSXin LI static const char tstr[] = "[|TIPC]"; 423c602fabSXin LI 43d09a7e67SXin LI #define TIPC_USER_LOW_IMPORTANCE 0 44d09a7e67SXin LI #define TIPC_USER_MEDIUM_IMPORTANCE 1 45d09a7e67SXin LI #define TIPC_USER_HIGH_IMPORTANCE 2 46d09a7e67SXin LI #define TIPC_USER_CRITICAL_IMPORTANCE 3 47d09a7e67SXin LI #define TIPC_USER_BCAST_PROTOCOL 5 48d09a7e67SXin LI #define TIPC_USER_MSG_BUNDLER 6 49d09a7e67SXin LI #define TIPC_USER_LINK_PROTOCOL 7 50d09a7e67SXin LI #define TIPC_USER_CONN_MANAGER 8 51d09a7e67SXin LI #define TIPC_USER_CHANGEOVER_PROTOCOL 10 52d09a7e67SXin LI #define TIPC_USER_NAME_DISTRIBUTOR 11 53d09a7e67SXin LI #define TIPC_USER_MSG_FRAGMENTER 12 54d09a7e67SXin LI #define TIPC_USER_LINK_CONFIG 13 55d09a7e67SXin LI 56d09a7e67SXin LI #define TIPC_CONN_MSG 0 57d09a7e67SXin LI #define TIPC_DIRECT_MSG 1 58d09a7e67SXin LI #define TIPC_NAMED_MSG 2 59d09a7e67SXin LI #define TIPC_MCAST_MSG 3 60d09a7e67SXin LI 61d09a7e67SXin LI #define TIPC_ZONE(addr) (((addr) >> 24) & 0xFF) 62d09a7e67SXin LI #define TIPC_CLUSTER(addr) (((addr) >> 12) & 0xFFF) 63d09a7e67SXin LI #define TIPC_NODE(addr) (((addr) >> 0) & 0xFFF) 64d09a7e67SXin LI 65d09a7e67SXin LI struct tipc_pkthdr { 663c602fabSXin LI uint32_t w0; 673c602fabSXin LI uint32_t w1; 68d09a7e67SXin LI }; 69d09a7e67SXin LI 70d09a7e67SXin LI #define TIPC_VER(w0) (((w0) >> 29) & 0x07) 71d09a7e67SXin LI #define TIPC_USER(w0) (((w0) >> 25) & 0x0F) 72d09a7e67SXin LI #define TIPC_HSIZE(w0) (((w0) >> 21) & 0x0F) 73d09a7e67SXin LI #define TIPC_MSIZE(w0) (((w0) >> 0) & 0xFFFF) 74d09a7e67SXin LI #define TIPC_MTYPE(w1) (((w1) >> 29) & 0x07) 75d09a7e67SXin LI #define TIPC_BROADCAST_ACK(w1) (((w1) >> 0) & 0xFFFF) 76d09a7e67SXin LI #define TIPC_LINK_ACK(w2) (((w2) >> 16) & 0xFFFF) 77d09a7e67SXin LI #define TIPC_LINK_SEQ(w2) (((w2) >> 0) & 0xFFFF) 78d09a7e67SXin LI 79d09a7e67SXin LI static const struct tok tipcuser_values[] = { 80d09a7e67SXin LI { TIPC_USER_LOW_IMPORTANCE, "Low Importance Data payload" }, 81d09a7e67SXin LI { TIPC_USER_MEDIUM_IMPORTANCE, "Medium Importance Data payload" }, 82d09a7e67SXin LI { TIPC_USER_HIGH_IMPORTANCE, "High Importance Data payload" }, 83d09a7e67SXin LI { TIPC_USER_CRITICAL_IMPORTANCE, "Critical Importance Data payload" }, 84d09a7e67SXin LI { TIPC_USER_BCAST_PROTOCOL, "Broadcast Link Protocol internal" }, 85d09a7e67SXin LI { TIPC_USER_MSG_BUNDLER, "Message Bundler Protocol internal" }, 86d09a7e67SXin LI { TIPC_USER_LINK_PROTOCOL, "Link State Protocol internal" }, 87d09a7e67SXin LI { TIPC_USER_CONN_MANAGER, "Connection Manager internal" }, 88d09a7e67SXin LI { TIPC_USER_CHANGEOVER_PROTOCOL, "Link Changeover Protocol internal" }, 89d09a7e67SXin LI { TIPC_USER_NAME_DISTRIBUTOR, "Name Table Update Protocol internal" }, 90d09a7e67SXin LI { TIPC_USER_MSG_FRAGMENTER, "Message Fragmentation Protocol internal" }, 91d09a7e67SXin LI { TIPC_USER_LINK_CONFIG, "Neighbor Detection Protocol internal" }, 92d09a7e67SXin LI { 0, NULL } 93d09a7e67SXin LI }; 94d09a7e67SXin LI 95d09a7e67SXin LI static const struct tok tipcmtype_values[] = { 96d09a7e67SXin LI { TIPC_CONN_MSG, "CONN_MSG" }, 97d09a7e67SXin LI { TIPC_DIRECT_MSG, "MCAST_MSG" }, 98d09a7e67SXin LI { TIPC_NAMED_MSG, "NAMED_MSG" }, 99d09a7e67SXin LI { TIPC_MCAST_MSG, "DIRECT_MSG" }, 100d09a7e67SXin LI { 0, NULL } 101d09a7e67SXin LI }; 102d09a7e67SXin LI 103d09a7e67SXin LI static const struct tok tipc_linkconf_mtype_values[] = { 104d09a7e67SXin LI { 0, "Link request" }, 105d09a7e67SXin LI { 1, "Link response" }, 106d09a7e67SXin LI { 0, NULL } 107d09a7e67SXin LI }; 108d09a7e67SXin LI 109d09a7e67SXin LI struct payload_tipc_pkthdr { 1103c602fabSXin LI uint32_t w0; 1113c602fabSXin LI uint32_t w1; 1123c602fabSXin LI uint32_t w2; 1133c602fabSXin LI uint32_t prev_node; 1143c602fabSXin LI uint32_t orig_port; 1153c602fabSXin LI uint32_t dest_port; 1163c602fabSXin LI uint32_t orig_node; 1173c602fabSXin LI uint32_t dest_node; 1183c602fabSXin LI uint32_t name_type; 1193c602fabSXin LI uint32_t w9; 1203c602fabSXin LI uint32_t wA; 121d09a7e67SXin LI }; 122d09a7e67SXin LI 123d09a7e67SXin LI struct internal_tipc_pkthdr { 1243c602fabSXin LI uint32_t w0; 1253c602fabSXin LI uint32_t w1; 1263c602fabSXin LI uint32_t w2; 1273c602fabSXin LI uint32_t prev_node; 1283c602fabSXin LI uint32_t w4; 1293c602fabSXin LI uint32_t w5; 1303c602fabSXin LI uint32_t orig_node; 1313c602fabSXin LI uint32_t dest_node; 1323c602fabSXin LI uint32_t trans_seq; 1333c602fabSXin LI uint32_t w9; 134d09a7e67SXin LI }; 135d09a7e67SXin LI 136d09a7e67SXin LI #define TIPC_SEQ_GAP(w1) (((w1) >> 16) & 0x1FFF) 137d09a7e67SXin LI #define TIPC_BC_GAP_AFTER(w2) (((w2) >> 16) & 0xFFFF) 138d09a7e67SXin LI #define TIPC_BC_GAP_TO(w2) (((w2) >> 0) & 0xFFFF) 139d09a7e67SXin LI #define TIPC_LAST_SENT_FRAG(w4) (((w4) >> 16) & 0xFFFF) 140d09a7e67SXin LI #define TIPC_NEXT_SENT_FRAG(w4) (((w4) >> 0) & 0xFFFF) 141d09a7e67SXin LI #define TIPC_SESS_NO(w5) (((w5) >> 16) & 0xFFFF) 142d09a7e67SXin LI #define TIPC_MSG_CNT(w9) (((w9) >> 16) & 0xFFFF) 143d09a7e67SXin LI #define TIPC_LINK_TOL(w9) (((w9) >> 0) & 0xFFFF) 144d09a7e67SXin LI 145d09a7e67SXin LI struct link_conf_tipc_pkthdr { 1463c602fabSXin LI uint32_t w0; 1473c602fabSXin LI uint32_t w1; 1483c602fabSXin LI uint32_t dest_domain; 1493c602fabSXin LI uint32_t prev_node; 1503c602fabSXin LI uint32_t ntwrk_id; 1513c602fabSXin LI uint32_t w5; 1523c602fabSXin LI uint8_t media_address[16]; 153d09a7e67SXin LI }; 154d09a7e67SXin LI 155d09a7e67SXin LI #define TIPC_NODE_SIG(w1) (((w1) >> 0) & 0xFFFF) 156d09a7e67SXin LI #define TIPC_MEDIA_ID(w5) (((w5) >> 0) & 0xFF) 157d09a7e67SXin LI 158d09a7e67SXin LI static void 159d09a7e67SXin LI print_payload(netdissect_options *ndo, const struct payload_tipc_pkthdr *ap) 160d09a7e67SXin LI { 1613c602fabSXin LI uint32_t w0, w1, w2; 162d09a7e67SXin LI u_int user; 163d09a7e67SXin LI u_int hsize; 164d09a7e67SXin LI u_int msize; 165d09a7e67SXin LI u_int mtype; 166d09a7e67SXin LI u_int broadcast_ack; 167d09a7e67SXin LI u_int link_ack; 168d09a7e67SXin LI u_int link_seq; 169d09a7e67SXin LI u_int prev_node; 170d09a7e67SXin LI u_int orig_port; 171d09a7e67SXin LI u_int dest_port; 172d09a7e67SXin LI u_int orig_node; 173d09a7e67SXin LI u_int dest_node; 174d09a7e67SXin LI 175d09a7e67SXin LI ND_TCHECK(ap->dest_port); 176d09a7e67SXin LI w0 = EXTRACT_32BITS(&ap->w0); 177d09a7e67SXin LI user = TIPC_USER(w0); 178d09a7e67SXin LI hsize = TIPC_HSIZE(w0); 179d09a7e67SXin LI msize = TIPC_MSIZE(w0); 180d09a7e67SXin LI w1 = EXTRACT_32BITS(&ap->w1); 181d09a7e67SXin LI mtype = TIPC_MTYPE(w1); 182d09a7e67SXin LI prev_node = EXTRACT_32BITS(&ap->prev_node); 183d09a7e67SXin LI orig_port = EXTRACT_32BITS(&ap->orig_port); 184d09a7e67SXin LI dest_port = EXTRACT_32BITS(&ap->dest_port); 185d09a7e67SXin LI if (hsize <= 6) { 186d09a7e67SXin LI ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u:%u > %u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s", 187d09a7e67SXin LI TIPC_VER(w0), 188d09a7e67SXin LI TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node), 189d09a7e67SXin LI orig_port, dest_port, 190d09a7e67SXin LI hsize*4, msize, 191d09a7e67SXin LI tok2str(tipcuser_values, "unknown", user), 192d09a7e67SXin LI tok2str(tipcmtype_values, "Unknown", mtype))); 193d09a7e67SXin LI } else { 194d09a7e67SXin LI ND_TCHECK(ap->dest_node); 195d09a7e67SXin LI orig_node = EXTRACT_32BITS(&ap->orig_node); 196d09a7e67SXin LI dest_node = EXTRACT_32BITS(&ap->dest_node); 197d09a7e67SXin LI ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u:%u > %u.%u.%u:%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s", 198d09a7e67SXin LI TIPC_VER(w0), 199d09a7e67SXin LI TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node), 200d09a7e67SXin LI orig_port, 201d09a7e67SXin LI TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node), 202d09a7e67SXin LI dest_port, 203d09a7e67SXin LI hsize*4, msize, 204d09a7e67SXin LI tok2str(tipcuser_values, "unknown", user), 205d09a7e67SXin LI tok2str(tipcmtype_values, "Unknown", mtype))); 206d09a7e67SXin LI 207d09a7e67SXin LI if (ndo->ndo_vflag) { 208d09a7e67SXin LI broadcast_ack = TIPC_BROADCAST_ACK(w1); 209d09a7e67SXin LI w2 = EXTRACT_32BITS(&ap->w2); 210d09a7e67SXin LI link_ack = TIPC_LINK_ACK(w2); 211d09a7e67SXin LI link_seq = TIPC_LINK_SEQ(w2); 212d09a7e67SXin LI ND_PRINT((ndo, "\n\tPrevious Node %u.%u.%u, Broadcast Ack %u, Link Ack %u, Link Sequence %u", 213d09a7e67SXin LI TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node), 214d09a7e67SXin LI broadcast_ack, link_ack, link_seq)); 215d09a7e67SXin LI } 216d09a7e67SXin LI } 217d09a7e67SXin LI return; 218d09a7e67SXin LI 219d09a7e67SXin LI trunc: 2203c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 221d09a7e67SXin LI } 222d09a7e67SXin LI 223d09a7e67SXin LI static void 224d09a7e67SXin LI print_internal(netdissect_options *ndo, const struct internal_tipc_pkthdr *ap) 225d09a7e67SXin LI { 2263c602fabSXin LI uint32_t w0, w1, w2, w4, w5, w9; 227d09a7e67SXin LI u_int user; 228d09a7e67SXin LI u_int hsize; 229d09a7e67SXin LI u_int msize; 230d09a7e67SXin LI u_int mtype; 231d09a7e67SXin LI u_int seq_gap; 232d09a7e67SXin LI u_int broadcast_ack; 233d09a7e67SXin LI u_int bc_gap_after; 234d09a7e67SXin LI u_int bc_gap_to; 235d09a7e67SXin LI u_int prev_node; 236d09a7e67SXin LI u_int last_sent_frag; 237d09a7e67SXin LI u_int next_sent_frag; 238d09a7e67SXin LI u_int sess_no; 239d09a7e67SXin LI u_int orig_node; 240d09a7e67SXin LI u_int dest_node; 241d09a7e67SXin LI u_int trans_seq; 242d09a7e67SXin LI u_int msg_cnt; 243d09a7e67SXin LI u_int link_tol; 244d09a7e67SXin LI 245d09a7e67SXin LI ND_TCHECK(ap->dest_node); 246d09a7e67SXin LI w0 = EXTRACT_32BITS(&ap->w0); 247d09a7e67SXin LI user = TIPC_USER(w0); 248d09a7e67SXin LI hsize = TIPC_HSIZE(w0); 249d09a7e67SXin LI msize = TIPC_MSIZE(w0); 250d09a7e67SXin LI w1 = EXTRACT_32BITS(&ap->w1); 251d09a7e67SXin LI mtype = TIPC_MTYPE(w1); 252d09a7e67SXin LI orig_node = EXTRACT_32BITS(&ap->orig_node); 253d09a7e67SXin LI dest_node = EXTRACT_32BITS(&ap->dest_node); 254d09a7e67SXin LI ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s (0x%08x)", 255d09a7e67SXin LI TIPC_VER(w0), 256d09a7e67SXin LI TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node), 257d09a7e67SXin LI TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node), 258d09a7e67SXin LI hsize*4, msize, 259d09a7e67SXin LI tok2str(tipcuser_values, "unknown", user), 260d09a7e67SXin LI tok2str(tipcmtype_values, "Unknown", mtype), w1)); 261d09a7e67SXin LI 262d09a7e67SXin LI if (ndo->ndo_vflag) { 263d09a7e67SXin LI ND_TCHECK(*ap); 264d09a7e67SXin LI seq_gap = TIPC_SEQ_GAP(w1); 265d09a7e67SXin LI broadcast_ack = TIPC_BROADCAST_ACK(w1); 266d09a7e67SXin LI w2 = EXTRACT_32BITS(&ap->w2); 267d09a7e67SXin LI bc_gap_after = TIPC_BC_GAP_AFTER(w2); 268d09a7e67SXin LI bc_gap_to = TIPC_BC_GAP_TO(w2); 269d09a7e67SXin LI prev_node = EXTRACT_32BITS(&ap->prev_node); 270d09a7e67SXin LI w4 = EXTRACT_32BITS(&ap->w4); 271d09a7e67SXin LI last_sent_frag = TIPC_LAST_SENT_FRAG(w4); 272d09a7e67SXin LI next_sent_frag = TIPC_NEXT_SENT_FRAG(w4); 273d09a7e67SXin LI w5 = EXTRACT_32BITS(&ap->w5); 274d09a7e67SXin LI sess_no = TIPC_SESS_NO(w5); 275d09a7e67SXin LI trans_seq = EXTRACT_32BITS(&ap->trans_seq); 276d09a7e67SXin LI w9 = EXTRACT_32BITS(&ap->w9); 277d09a7e67SXin LI msg_cnt = TIPC_MSG_CNT(w9); 278d09a7e67SXin LI link_tol = TIPC_LINK_TOL(w9); 279d09a7e67SXin LI ND_PRINT((ndo, "\n\tPrevious Node %u.%u.%u, Session No. %u, Broadcast Ack %u, Sequence Gap %u, Broadcast Gap After %u, Broadcast Gap To %u, Last Sent Packet No. %u, Next sent Packet No. %u, Transport Sequence %u, msg_count %u, Link Tolerance %u", 280d09a7e67SXin LI TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node), 281d09a7e67SXin LI sess_no, broadcast_ack, seq_gap, bc_gap_after, bc_gap_to, 282d09a7e67SXin LI last_sent_frag, next_sent_frag, trans_seq, msg_cnt, 283d09a7e67SXin LI link_tol)); 284d09a7e67SXin LI } 285d09a7e67SXin LI return; 286d09a7e67SXin LI 287d09a7e67SXin LI trunc: 2883c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 289d09a7e67SXin LI } 290d09a7e67SXin LI 291d09a7e67SXin LI static void 292d09a7e67SXin LI print_link_conf(netdissect_options *ndo, const struct link_conf_tipc_pkthdr *ap) 293d09a7e67SXin LI { 2943c602fabSXin LI uint32_t w0, w1, w5; 295d09a7e67SXin LI u_int user; 296d09a7e67SXin LI u_int hsize; 297d09a7e67SXin LI u_int msize; 298d09a7e67SXin LI u_int mtype; 299d09a7e67SXin LI u_int node_sig; 300d09a7e67SXin LI u_int prev_node; 301d09a7e67SXin LI u_int dest_domain; 302d09a7e67SXin LI u_int ntwrk_id; 303d09a7e67SXin LI u_int media_id; 304d09a7e67SXin LI 305d09a7e67SXin LI ND_TCHECK(ap->prev_node); 306d09a7e67SXin LI w0 = EXTRACT_32BITS(&ap->w0); 307d09a7e67SXin LI user = TIPC_USER(w0); 308d09a7e67SXin LI hsize = TIPC_HSIZE(w0); 309d09a7e67SXin LI msize = TIPC_MSIZE(w0); 310d09a7e67SXin LI w1 = EXTRACT_32BITS(&ap->w1); 311d09a7e67SXin LI mtype = TIPC_MTYPE(w1); 312d09a7e67SXin LI dest_domain = EXTRACT_32BITS(&ap->dest_domain); 313d09a7e67SXin LI prev_node = EXTRACT_32BITS(&ap->prev_node); 314d09a7e67SXin LI 315d09a7e67SXin LI ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s", 316d09a7e67SXin LI TIPC_VER(w0), 317d09a7e67SXin LI TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node), 318d09a7e67SXin LI TIPC_ZONE(dest_domain), TIPC_CLUSTER(dest_domain), TIPC_NODE(dest_domain), 319d09a7e67SXin LI hsize*4, msize, 320d09a7e67SXin LI tok2str(tipcuser_values, "unknown", user), 321d09a7e67SXin LI tok2str(tipc_linkconf_mtype_values, "Unknown", mtype))); 322d09a7e67SXin LI if (ndo->ndo_vflag) { 323d09a7e67SXin LI ND_TCHECK(ap->w5); 324d09a7e67SXin LI node_sig = TIPC_NODE_SIG(w1); 325d09a7e67SXin LI ntwrk_id = EXTRACT_32BITS(&ap->ntwrk_id); 326d09a7e67SXin LI w5 = EXTRACT_32BITS(&ap->w5); 327d09a7e67SXin LI media_id = TIPC_MEDIA_ID(w5); 328d09a7e67SXin LI ND_PRINT((ndo, "\n\tNodeSignature %u, network_id %u, media_id %u", 329d09a7e67SXin LI node_sig, ntwrk_id, media_id)); 330d09a7e67SXin LI } 331d09a7e67SXin LI return; 332d09a7e67SXin LI 333d09a7e67SXin LI trunc: 3343c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 335d09a7e67SXin LI } 336d09a7e67SXin LI 337d09a7e67SXin LI void 338d09a7e67SXin LI tipc_print(netdissect_options *ndo, const u_char *bp, u_int length _U_, 339d09a7e67SXin LI u_int caplen _U_) 340d09a7e67SXin LI { 341d09a7e67SXin LI const struct tipc_pkthdr *ap; 3423c602fabSXin LI uint32_t w0; 343d09a7e67SXin LI u_int user; 344d09a7e67SXin LI 345*3340d773SGleb Smirnoff ap = (const struct tipc_pkthdr *)bp; 346d09a7e67SXin LI ND_TCHECK(ap->w0); 347d09a7e67SXin LI w0 = EXTRACT_32BITS(&ap->w0); 348d09a7e67SXin LI user = TIPC_USER(w0); 349d09a7e67SXin LI 350d09a7e67SXin LI switch (user) 351d09a7e67SXin LI { 352d09a7e67SXin LI case TIPC_USER_LOW_IMPORTANCE: 353d09a7e67SXin LI case TIPC_USER_MEDIUM_IMPORTANCE: 354d09a7e67SXin LI case TIPC_USER_HIGH_IMPORTANCE: 355d09a7e67SXin LI case TIPC_USER_CRITICAL_IMPORTANCE: 356d09a7e67SXin LI case TIPC_USER_NAME_DISTRIBUTOR: 357d09a7e67SXin LI case TIPC_USER_CONN_MANAGER: 358*3340d773SGleb Smirnoff print_payload(ndo, (const struct payload_tipc_pkthdr *)bp); 359d09a7e67SXin LI break; 360d09a7e67SXin LI 361d09a7e67SXin LI case TIPC_USER_LINK_CONFIG: 362*3340d773SGleb Smirnoff print_link_conf(ndo, (const struct link_conf_tipc_pkthdr *)bp); 363d09a7e67SXin LI break; 364d09a7e67SXin LI 365d09a7e67SXin LI case TIPC_USER_BCAST_PROTOCOL: 366d09a7e67SXin LI case TIPC_USER_MSG_BUNDLER: 367d09a7e67SXin LI case TIPC_USER_LINK_PROTOCOL: 368d09a7e67SXin LI case TIPC_USER_CHANGEOVER_PROTOCOL: 369d09a7e67SXin LI case TIPC_USER_MSG_FRAGMENTER: 370*3340d773SGleb Smirnoff print_internal(ndo, (const struct internal_tipc_pkthdr *)bp); 371d09a7e67SXin LI break; 372d09a7e67SXin LI 373d09a7e67SXin LI } 374d09a7e67SXin LI return; 375d09a7e67SXin LI 376d09a7e67SXin LI trunc: 3773c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 378d09a7e67SXin LI } 379d09a7e67SXin LI 380d09a7e67SXin LI /* 381d09a7e67SXin LI * Local Variables: 382d09a7e67SXin LI * c-style: bsd 383d09a7e67SXin LI * End: 384d09a7e67SXin LI */ 385d09a7e67SXin LI 386