153f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
353f17a9db278d33517d9888dd77848f554522a38JP Abgrall *	The Regents of the University of California.  All rights reserved.
453f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Redistribution and use in source and binary forms, with or without
653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * modification, are permitted provided that: (1) source code distributions
753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * retain the above copyright notice and this paragraph in its entirety, (2)
853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * distributions including binary code include the above copyright notice and
953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * this paragraph in its entirety in the documentation or other materials
1053f17a9db278d33517d9888dd77848f554522a38JP Abgrall * provided with the distribution, and (3) all advertising materials mentioning
1153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * features or use of this software display the following acknowledgement:
1253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * ``This product includes software developed by the University of California,
1353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
1453f17a9db278d33517d9888dd77848f554522a38JP Abgrall * the University nor the names of its contributors may be used to endorse
1553f17a9db278d33517d9888dd77848f554522a38JP Abgrall * or promote products derived from this software without specific prior
1653f17a9db278d33517d9888dd77848f554522a38JP Abgrall * written permission.
1753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
1853f17a9db278d33517d9888dd77848f554522a38JP Abgrall * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
1953f17a9db278d33517d9888dd77848f554522a38JP Abgrall * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
2053f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
2153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
22892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define NETDISSECT_REWORKED
2353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#ifdef HAVE_CONFIG_H
2453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "config.h"
2553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#endif
2653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
2753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include <tcpdump-stdinc.h>
2853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
29892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#include "interface.h"
3053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "ether.h"
3153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "ethertype.h"
3253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#include "extract.h"			/* must come after interface.h */
3353f17a9db278d33517d9888dd77848f554522a38JP Abgrall
34892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic const char tstr[] = "[|TIPC]";
35892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
3653f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
3753f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Transparent Inter-Process Communication (TIPC) protocol.
3853f17a9db278d33517d9888dd77848f554522a38JP Abgrall *
3953f17a9db278d33517d9888dd77848f554522a38JP Abgrall *	http://tipc.sourceforge.net/doc/draft-spec-tipc-07.html
4053f17a9db278d33517d9888dd77848f554522a38JP Abgrall *	http://tipc.sourceforge.net/doc/tipc_message_formats.html
4153f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
4253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
4353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_USER_LOW_IMPORTANCE	0
4453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_USER_MEDIUM_IMPORTANCE	1
4553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_USER_HIGH_IMPORTANCE	2
4653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_USER_CRITICAL_IMPORTANCE	3
4753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_USER_BCAST_PROTOCOL	5
4853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_USER_MSG_BUNDLER		6
4953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_USER_LINK_PROTOCOL		7
5053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_USER_CONN_MANAGER		8
5153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_USER_CHANGEOVER_PROTOCOL	10
5253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_USER_NAME_DISTRIBUTOR	11
5353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_USER_MSG_FRAGMENTER	12
5453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_USER_LINK_CONFIG		13
5553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
5653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_CONN_MSG			0
5753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_DIRECT_MSG			1
5853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_NAMED_MSG			2
5953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_MCAST_MSG			3
6053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
6153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_ZONE(addr)		(((addr) >> 24) & 0xFF)
6253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_CLUSTER(addr)	(((addr) >> 12) & 0xFFF)
6353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_NODE(addr)		(((addr) >> 0) & 0xFFF)
6453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
6553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct tipc_pkthdr {
66892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w0;
67892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w1;
6853f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
6953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
7053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_VER(w0)		(((w0) >> 29) & 0x07)
7153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_USER(w0)		(((w0) >> 25) & 0x0F)
7253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_HSIZE(w0)		(((w0) >> 21) & 0x0F)
7353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_MSIZE(w0)		(((w0) >> 0) & 0xFFFF)
7453f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_MTYPE(w1)		(((w1) >> 29) & 0x07)
7553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_BROADCAST_ACK(w1)	(((w1) >> 0) & 0xFFFF)
7653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_LINK_ACK(w2)	(((w2) >> 16) & 0xFFFF)
7753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_LINK_SEQ(w2)	(((w2) >> 0) & 0xFFFF)
7853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
7953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok tipcuser_values[] = {
8053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_USER_LOW_IMPORTANCE,      "Low Importance Data payload" },
8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_USER_MEDIUM_IMPORTANCE,   "Medium Importance Data payload" },
8253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_USER_HIGH_IMPORTANCE,     "High Importance Data payload" },
8353f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_USER_CRITICAL_IMPORTANCE, "Critical Importance Data payload" },
8453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_USER_BCAST_PROTOCOL,      "Broadcast Link Protocol internal" },
8553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_USER_MSG_BUNDLER,         "Message Bundler Protocol internal" },
8653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_USER_LINK_PROTOCOL,       "Link State Protocol internal" },
8753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_USER_CONN_MANAGER,        "Connection Manager internal" },
8853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_USER_CHANGEOVER_PROTOCOL, "Link Changeover Protocol internal" },
8953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_USER_NAME_DISTRIBUTOR,    "Name Table Update Protocol internal" },
9053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_USER_MSG_FRAGMENTER,      "Message Fragmentation Protocol internal" },
9153f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_USER_LINK_CONFIG,         "Neighbor Detection Protocol internal" },
9253f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL }
9353f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
9453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
9553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok tipcmtype_values[] = {
9653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_CONN_MSG,   "CONN_MSG" },
9753f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_DIRECT_MSG, "MCAST_MSG" },
9853f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_NAMED_MSG,  "NAMED_MSG" },
9953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { TIPC_MCAST_MSG,  "DIRECT_MSG" },
10053f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL }
10153f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
10253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
10353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok tipc_linkconf_mtype_values[] = {
10453f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0,   "Link request" },
10553f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 1,   "Link response" },
10653f17a9db278d33517d9888dd77848f554522a38JP Abgrall    { 0, NULL }
10753f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
10853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
10953f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct payload_tipc_pkthdr {
110892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w0;
111892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w1;
112892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w2;
113892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t prev_node;
114892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t orig_port;
115892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t dest_port;
116892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t orig_node;
117892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t dest_node;
118892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t name_type;
119892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w9;
120892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t wA;
12153f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
12253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
12353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct  internal_tipc_pkthdr {
124892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w0;
125892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w1;
126892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w2;
127892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t prev_node;
128892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w4;
129892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w5;
130892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t orig_node;
131892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t dest_node;
132892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t trans_seq;
133892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w9;
13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
13653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_SEQ_GAP(w1)	(((w1) >> 16) & 0x1FFF)
13753f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_BC_GAP_AFTER(w2)	(((w2) >> 16) & 0xFFFF)
13853f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_BC_GAP_TO(w2)	(((w2) >> 0) & 0xFFFF)
13953f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_LAST_SENT_FRAG(w4)	(((w4) >> 16) & 0xFFFF)
14053f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_NEXT_SENT_FRAG(w4)	(((w4) >> 0) & 0xFFFF)
14153f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_SESS_NO(w5)	(((w5) >> 16) & 0xFFFF)
14253f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_MSG_CNT(w9)	(((w9) >> 16) & 0xFFFF)
14353f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_LINK_TOL(w9)	(((w9) >> 0) & 0xFFFF)
14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
14553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstruct link_conf_tipc_pkthdr {
146892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w0;
147892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w1;
148892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t dest_domain;
149892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t prev_node;
150892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t ntwrk_id;
151892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w5;
152892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t media_address[16];
15353f17a9db278d33517d9888dd77848f554522a38JP Abgrall};
15453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
15553f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_NODE_SIG(w1)	(((w1) >> 0) & 0xFFFF)
15653f17a9db278d33517d9888dd77848f554522a38JP Abgrall#define TIPC_MEDIA_ID(w5)	(((w5) >> 0) & 0xFF)
15753f17a9db278d33517d9888dd77848f554522a38JP Abgrall
15853f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void
15953f17a9db278d33517d9888dd77848f554522a38JP Abgrallprint_payload(netdissect_options *ndo, const struct payload_tipc_pkthdr *ap)
16053f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
161892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w0, w1, w2;
16253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int user;
16353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int hsize;
16453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int msize;
16553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int mtype;
16653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int broadcast_ack;
16753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int link_ack;
16853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int link_seq;
16953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int prev_node;
17053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int orig_port;
17153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int dest_port;
17253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int orig_node;
17353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int dest_node;
17453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
17553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(ap->dest_port);
17653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	w0 = EXTRACT_32BITS(&ap->w0);
17753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	user = TIPC_USER(w0);
17853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	hsize = TIPC_HSIZE(w0);
17953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	msize = TIPC_MSIZE(w0);
18053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	w1 = EXTRACT_32BITS(&ap->w1);
18153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	mtype = TIPC_MTYPE(w1);
18253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	prev_node = EXTRACT_32BITS(&ap->prev_node);
18353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	orig_port = EXTRACT_32BITS(&ap->orig_port);
18453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	dest_port = EXTRACT_32BITS(&ap->dest_port);
18553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (hsize <= 6) {
18653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u:%u > %u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
18753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    TIPC_VER(w0),
18853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
18953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    orig_port, dest_port,
19053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    hsize*4, msize,
19153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    tok2str(tipcuser_values, "unknown", user),
19253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    tok2str(tipcmtype_values, "Unknown", mtype)));
19353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	} else {
19453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_TCHECK(ap->dest_node);
19553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		orig_node = EXTRACT_32BITS(&ap->orig_node);
19653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		dest_node = EXTRACT_32BITS(&ap->dest_node);
19753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u:%u > %u.%u.%u:%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
19853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    TIPC_VER(w0),
19953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node),
20053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    orig_port,
20153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node),
20253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    dest_port,
20353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    hsize*4, msize,
20453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    tok2str(tipcuser_values, "unknown", user),
20553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    tok2str(tipcmtype_values, "Unknown", mtype)));
20653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
20753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		if (ndo->ndo_vflag) {
20853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			broadcast_ack = TIPC_BROADCAST_ACK(w1);
20953f17a9db278d33517d9888dd77848f554522a38JP Abgrall			w2 = EXTRACT_32BITS(&ap->w2);
21053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			link_ack = TIPC_LINK_ACK(w2);
21153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			link_seq = TIPC_LINK_SEQ(w2);
21253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			ND_PRINT((ndo, "\n\tPrevious Node %u.%u.%u, Broadcast Ack %u, Link Ack %u, Link Sequence %u",
21353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
21453f17a9db278d33517d9888dd77848f554522a38JP Abgrall			    broadcast_ack, link_ack, link_seq));
21553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		}
21653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
21753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return;
21853f17a9db278d33517d9888dd77848f554522a38JP Abgrall
21953f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
220892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "%s", tstr));
22153f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
222892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
22353f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void
22453f17a9db278d33517d9888dd77848f554522a38JP Abgrallprint_internal(netdissect_options *ndo, const struct internal_tipc_pkthdr *ap)
22553f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
226892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w0, w1, w2, w4, w5, w9;
22753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int user;
22853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int hsize;
22953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int msize;
23053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int mtype;
23153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int seq_gap;
23253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int broadcast_ack;
23353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int bc_gap_after;
23453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int bc_gap_to;
23553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int prev_node;
23653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int last_sent_frag;
23753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int next_sent_frag;
23853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int sess_no;
23953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int orig_node;
24053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int dest_node;
24153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int trans_seq;
24253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int msg_cnt;
24353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int link_tol;
24453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
24553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(ap->dest_node);
24653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	w0 = EXTRACT_32BITS(&ap->w0);
24753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	user = TIPC_USER(w0);
24853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	hsize = TIPC_HSIZE(w0);
24953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	msize = TIPC_MSIZE(w0);
25053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	w1 = EXTRACT_32BITS(&ap->w1);
25153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	mtype = TIPC_MTYPE(w1);
25253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	orig_node = EXTRACT_32BITS(&ap->orig_node);
25353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	dest_node = EXTRACT_32BITS(&ap->dest_node);
25453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s (0x%08x)",
25553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    TIPC_VER(w0),
25653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node),
25753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node),
25853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    hsize*4, msize,
25953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    tok2str(tipcuser_values, "unknown", user),
26053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    tok2str(tipcmtype_values, "Unknown", mtype), w1));
26153f17a9db278d33517d9888dd77848f554522a38JP Abgrall
26253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (ndo->ndo_vflag) {
26353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_TCHECK(*ap);
26453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		seq_gap = TIPC_SEQ_GAP(w1);
26553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		broadcast_ack = TIPC_BROADCAST_ACK(w1);
26653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		w2 = EXTRACT_32BITS(&ap->w2);
26753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		bc_gap_after = TIPC_BC_GAP_AFTER(w2);
26853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		bc_gap_to = TIPC_BC_GAP_TO(w2);
26953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		prev_node = EXTRACT_32BITS(&ap->prev_node);
27053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		w4 = EXTRACT_32BITS(&ap->w4);
27153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		last_sent_frag = TIPC_LAST_SENT_FRAG(w4);
27253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		next_sent_frag = TIPC_NEXT_SENT_FRAG(w4);
27353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		w5 = EXTRACT_32BITS(&ap->w5);
27453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		sess_no = TIPC_SESS_NO(w5);
27553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		trans_seq = EXTRACT_32BITS(&ap->trans_seq);
27653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		w9 = EXTRACT_32BITS(&ap->w9);
27753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		msg_cnt = TIPC_MSG_CNT(w9);
27853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		link_tol = TIPC_LINK_TOL(w9);
27953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		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",
28053f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
28153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    sess_no, broadcast_ack, seq_gap, bc_gap_after, bc_gap_to,
28253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    last_sent_frag, next_sent_frag, trans_seq, msg_cnt,
28353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    link_tol));
28453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
28553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return;
28653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
28753f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
288892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "%s", tstr));
28953f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
29053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
29153f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic void
29253f17a9db278d33517d9888dd77848f554522a38JP Abgrallprint_link_conf(netdissect_options *ndo, const struct link_conf_tipc_pkthdr *ap)
29353f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
294892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w0, w1, w5;
29553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int user;
29653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int hsize;
29753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int msize;
29853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int mtype;
29953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int node_sig;
30053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int prev_node;
30153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int dest_domain;
30253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int ntwrk_id;
30353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int media_id;
30453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
30553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(ap->prev_node);
30653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	w0 = EXTRACT_32BITS(&ap->w0);
30753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	user = TIPC_USER(w0);
30853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	hsize = TIPC_HSIZE(w0);
30953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	msize = TIPC_MSIZE(w0);
31053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	w1 = EXTRACT_32BITS(&ap->w1);
31153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	mtype = TIPC_MTYPE(w1);
31253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	dest_domain = EXTRACT_32BITS(&ap->dest_domain);
31353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	prev_node = EXTRACT_32BITS(&ap->prev_node);
31453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
31553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
31653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    TIPC_VER(w0),
31753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
31853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    TIPC_ZONE(dest_domain), TIPC_CLUSTER(dest_domain), TIPC_NODE(dest_domain),
31953f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    hsize*4, msize,
32053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    tok2str(tipcuser_values, "unknown", user),
32153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	    tok2str(tipc_linkconf_mtype_values, "Unknown", mtype)));
32253f17a9db278d33517d9888dd77848f554522a38JP Abgrall	if (ndo->ndo_vflag) {
32353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_TCHECK(ap->w5);
32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		node_sig = TIPC_NODE_SIG(w1);
32553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ntwrk_id = EXTRACT_32BITS(&ap->ntwrk_id);
32653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		w5 = EXTRACT_32BITS(&ap->w5);
32753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		media_id = TIPC_MEDIA_ID(w5);
32853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		ND_PRINT((ndo, "\n\tNodeSignature %u, network_id %u, media_id %u",
32953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		    node_sig, ntwrk_id, media_id));
33053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
33153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return;
33253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
33353f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
334892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "%s", tstr));
33553f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
33653f17a9db278d33517d9888dd77848f554522a38JP Abgrall
33753f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid
33853f17a9db278d33517d9888dd77848f554522a38JP Abgralltipc_print(netdissect_options *ndo, const u_char *bp, u_int length _U_,
33953f17a9db278d33517d9888dd77848f554522a38JP Abgrall    u_int caplen _U_)
34053f17a9db278d33517d9888dd77848f554522a38JP Abgrall{
34153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	const struct tipc_pkthdr *ap;
342892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t w0;
34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	u_int user;
34453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
34553f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ap = (struct tipc_pkthdr *)bp;
34653f17a9db278d33517d9888dd77848f554522a38JP Abgrall	ND_TCHECK(ap->w0);
34753f17a9db278d33517d9888dd77848f554522a38JP Abgrall	w0 = EXTRACT_32BITS(&ap->w0);
34853f17a9db278d33517d9888dd77848f554522a38JP Abgrall	user = TIPC_USER(w0);
34953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
35053f17a9db278d33517d9888dd77848f554522a38JP Abgrall	switch (user)
35153f17a9db278d33517d9888dd77848f554522a38JP Abgrall	{
35253f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case TIPC_USER_LOW_IMPORTANCE:
35353f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case TIPC_USER_MEDIUM_IMPORTANCE:
35453f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case TIPC_USER_HIGH_IMPORTANCE:
35553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case TIPC_USER_CRITICAL_IMPORTANCE:
35653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case TIPC_USER_NAME_DISTRIBUTOR:
35753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case TIPC_USER_CONN_MANAGER:
35853f17a9db278d33517d9888dd77848f554522a38JP Abgrall			print_payload(ndo, (struct payload_tipc_pkthdr *)bp);
359892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			break;
36053f17a9db278d33517d9888dd77848f554522a38JP Abgrall
36153f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case TIPC_USER_LINK_CONFIG:
36253f17a9db278d33517d9888dd77848f554522a38JP Abgrall			print_link_conf(ndo, (struct link_conf_tipc_pkthdr *)bp);
36353f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
36453f17a9db278d33517d9888dd77848f554522a38JP Abgrall
36553f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case TIPC_USER_BCAST_PROTOCOL:
36653f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case TIPC_USER_MSG_BUNDLER:
36753f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case TIPC_USER_LINK_PROTOCOL:
36853f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case TIPC_USER_CHANGEOVER_PROTOCOL:
36953f17a9db278d33517d9888dd77848f554522a38JP Abgrall		case TIPC_USER_MSG_FRAGMENTER:
37053f17a9db278d33517d9888dd77848f554522a38JP Abgrall			print_internal(ndo, (struct internal_tipc_pkthdr *)bp);
37153f17a9db278d33517d9888dd77848f554522a38JP Abgrall			break;
37253f17a9db278d33517d9888dd77848f554522a38JP Abgrall
37353f17a9db278d33517d9888dd77848f554522a38JP Abgrall	}
37453f17a9db278d33517d9888dd77848f554522a38JP Abgrall	return;
37553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
37653f17a9db278d33517d9888dd77848f554522a38JP Abgralltrunc:
377892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "%s", tstr));
37853f17a9db278d33517d9888dd77848f554522a38JP Abgrall}
37953f17a9db278d33517d9888dd77848f554522a38JP Abgrall
38053f17a9db278d33517d9888dd77848f554522a38JP Abgrall/*
38153f17a9db278d33517d9888dd77848f554522a38JP Abgrall * Local Variables:
38253f17a9db278d33517d9888dd77848f554522a38JP Abgrall * c-style: bsd
38353f17a9db278d33517d9888dd77848f554522a38JP Abgrall * End:
38453f17a9db278d33517d9888dd77848f554522a38JP Abgrall */
38553f17a9db278d33517d9888dd77848f554522a38JP Abgrall
386