2012-02-29 12:36:55 +08:00
/*
* Copyright ( c ) 1988 , 1989 , 1990 , 1991 , 1992 , 1993 , 1994 , 1995 , 1996 , 1997
* The Regents of the University of California . All rights reserved .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that : ( 1 ) source code distributions
* retain the above copyright notice and this paragraph in its entirety , ( 2 )
* distributions including binary code include the above copyright notice and
* this paragraph in its entirety in the documentation or other materials
* provided with the distribution , and ( 3 ) all advertising materials mentioning
* features or use of this software display the following acknowledgement :
* ` ` This product includes software developed by the University of California ,
* Lawrence Berkeley Laboratory and its contributors . ' ' Neither the name of
* the University nor the names of its contributors may be used to endorse
* or promote products derived from this software without specific prior
* written permission .
* THIS SOFTWARE IS PROVIDED ` ` AS IS ' ' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES , INCLUDING , WITHOUT LIMITATION , THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .
*/
2016-08-15 21:27:28 +08:00
/* \summary: Transparent Inter-Process Communication (TIPC) protocol printer */
/*
* specification :
2020-02-06 17:03:34 +08:00
* https : //web.archive.org/web/20150302152944/http://tipc.sourceforge.net/doc/draft-spec-tipc-07.html
* https : //web.archive.org/web/20161025110514/http://tipc.sourceforge.net/doc/tipc_message_formats.html
2016-08-15 21:27:28 +08:00
*/
2012-02-29 12:36:55 +08:00
# ifdef HAVE_CONFIG_H
2018-01-22 04:27:08 +08:00
# include <config.h>
2012-02-29 12:36:55 +08:00
# endif
2018-01-20 22:59:49 +08:00
# include "netdissect-stdinc.h"
2012-02-29 12:36:55 +08:00
2015-09-06 05:35:58 +08:00
# include "netdissect.h"
2012-02-29 12:36:55 +08:00
# include "ethertype.h"
2015-09-07 21:01:46 +08:00
# include "extract.h"
2012-02-29 12:36:55 +08:00
2013-12-26 22:08:06 +08:00
2012-02-29 12:36:55 +08:00
# define TIPC_USER_LOW_IMPORTANCE 0
# define TIPC_USER_MEDIUM_IMPORTANCE 1
# define TIPC_USER_HIGH_IMPORTANCE 2
# define TIPC_USER_CRITICAL_IMPORTANCE 3
# define TIPC_USER_BCAST_PROTOCOL 5
# define TIPC_USER_MSG_BUNDLER 6
# define TIPC_USER_LINK_PROTOCOL 7
# define TIPC_USER_CONN_MANAGER 8
# define TIPC_USER_CHANGEOVER_PROTOCOL 10
# define TIPC_USER_NAME_DISTRIBUTOR 11
# define TIPC_USER_MSG_FRAGMENTER 12
# define TIPC_USER_LINK_CONFIG 13
# define TIPC_CONN_MSG 0
# define TIPC_DIRECT_MSG 1
# define TIPC_NAMED_MSG 2
# define TIPC_MCAST_MSG 3
# define TIPC_ZONE(addr) (((addr) >> 24) & 0xFF)
# define TIPC_CLUSTER(addr) (((addr) >> 12) & 0xFFF)
# define TIPC_NODE(addr) (((addr) >> 0) & 0xFFF)
struct tipc_pkthdr {
2017-12-31 10:42:03 +08:00
nd_uint32_t w0 ;
nd_uint32_t w1 ;
2012-02-29 12:36:55 +08:00
} ;
# define TIPC_VER(w0) (((w0) >> 29) & 0x07)
# define TIPC_USER(w0) (((w0) >> 25) & 0x0F)
# define TIPC_HSIZE(w0) (((w0) >> 21) & 0x0F)
2019-07-12 21:03:19 +08:00
# define TIPC_MSIZE(w0) (((w0) >> 0) & 0x1FFFF)
2012-02-29 12:36:55 +08:00
# define TIPC_MTYPE(w1) (((w1) >> 29) & 0x07)
# define TIPC_BROADCAST_ACK(w1) (((w1) >> 0) & 0xFFFF)
# define TIPC_LINK_ACK(w2) (((w2) >> 16) & 0xFFFF)
# define TIPC_LINK_SEQ(w2) (((w2) >> 0) & 0xFFFF)
static const struct tok tipcuser_values [ ] = {
{ TIPC_USER_LOW_IMPORTANCE , " Low Importance Data payload " } ,
{ TIPC_USER_MEDIUM_IMPORTANCE , " Medium Importance Data payload " } ,
{ TIPC_USER_HIGH_IMPORTANCE , " High Importance Data payload " } ,
{ TIPC_USER_CRITICAL_IMPORTANCE , " Critical Importance Data payload " } ,
{ TIPC_USER_BCAST_PROTOCOL , " Broadcast Link Protocol internal " } ,
{ TIPC_USER_MSG_BUNDLER , " Message Bundler Protocol internal " } ,
{ TIPC_USER_LINK_PROTOCOL , " Link State Protocol internal " } ,
{ TIPC_USER_CONN_MANAGER , " Connection Manager internal " } ,
{ TIPC_USER_CHANGEOVER_PROTOCOL , " Link Changeover Protocol internal " } ,
{ TIPC_USER_NAME_DISTRIBUTOR , " Name Table Update Protocol internal " } ,
{ TIPC_USER_MSG_FRAGMENTER , " Message Fragmentation Protocol internal " } ,
{ TIPC_USER_LINK_CONFIG , " Neighbor Detection Protocol internal " } ,
{ 0 , NULL }
} ;
static const struct tok tipcmtype_values [ ] = {
{ TIPC_CONN_MSG , " CONN_MSG " } ,
{ TIPC_DIRECT_MSG , " MCAST_MSG " } ,
{ TIPC_NAMED_MSG , " NAMED_MSG " } ,
{ TIPC_MCAST_MSG , " DIRECT_MSG " } ,
{ 0 , NULL }
} ;
2012-02-29 13:12:26 +08:00
static const struct tok tipc_linkconf_mtype_values [ ] = {
{ 0 , " Link request " } ,
{ 1 , " Link response " } ,
{ 0 , NULL }
} ;
2012-02-29 12:36:55 +08:00
struct payload_tipc_pkthdr {
2017-12-31 10:42:03 +08:00
nd_uint32_t w0 ;
nd_uint32_t w1 ;
nd_uint32_t w2 ;
nd_uint32_t prev_node ;
nd_uint32_t orig_port ;
nd_uint32_t dest_port ;
nd_uint32_t orig_node ;
nd_uint32_t dest_node ;
nd_uint32_t name_type ;
nd_uint32_t w9 ;
nd_uint32_t wA ;
2012-02-29 12:36:55 +08:00
} ;
struct internal_tipc_pkthdr {
2017-12-31 10:42:03 +08:00
nd_uint32_t w0 ;
nd_uint32_t w1 ;
nd_uint32_t w2 ;
nd_uint32_t prev_node ;
nd_uint32_t w4 ;
nd_uint32_t w5 ;
nd_uint32_t orig_node ;
nd_uint32_t dest_node ;
nd_uint32_t trans_seq ;
nd_uint32_t w9 ;
2012-02-29 12:36:55 +08:00
} ;
# define TIPC_SEQ_GAP(w1) (((w1) >> 16) & 0x1FFF)
# define TIPC_BC_GAP_AFTER(w2) (((w2) >> 16) & 0xFFFF)
# define TIPC_BC_GAP_TO(w2) (((w2) >> 0) & 0xFFFF)
# define TIPC_LAST_SENT_FRAG(w4) (((w4) >> 16) & 0xFFFF)
# define TIPC_NEXT_SENT_FRAG(w4) (((w4) >> 0) & 0xFFFF)
# define TIPC_SESS_NO(w5) (((w5) >> 16) & 0xFFFF)
# define TIPC_MSG_CNT(w9) (((w9) >> 16) & 0xFFFF)
# define TIPC_LINK_TOL(w9) (((w9) >> 0) & 0xFFFF)
struct link_conf_tipc_pkthdr {
2017-12-31 10:42:03 +08:00
nd_uint32_t w0 ;
nd_uint32_t w1 ;
nd_uint32_t dest_domain ;
nd_uint32_t prev_node ;
nd_uint32_t ntwrk_id ;
nd_uint32_t w5 ;
nd_byte media_address [ 16 ] ;
2012-02-29 12:36:55 +08:00
} ;
# define TIPC_NODE_SIG(w1) (((w1) >> 0) & 0xFFFF)
# define TIPC_MEDIA_ID(w5) (((w5) >> 0) & 0xFF)
static void
2012-02-29 17:09:40 +08:00
print_payload ( netdissect_options * ndo , const struct payload_tipc_pkthdr * ap )
2012-02-29 12:36:55 +08:00
{
2014-04-23 15:20:40 +08:00
uint32_t w0 , w1 , w2 ;
2012-02-29 12:36:55 +08:00
u_int user ;
u_int hsize ;
u_int msize ;
u_int mtype ;
u_int broadcast_ack ;
u_int link_ack ;
u_int link_seq ;
u_int prev_node ;
u_int orig_port ;
u_int dest_port ;
u_int orig_node ;
u_int dest_node ;
2018-06-16 23:23:21 +08:00
w0 = GET_BE_U_4 ( ap - > w0 ) ;
2012-02-29 12:36:55 +08:00
user = TIPC_USER ( w0 ) ;
hsize = TIPC_HSIZE ( w0 ) ;
msize = TIPC_MSIZE ( w0 ) ;
2018-06-16 23:23:21 +08:00
w1 = GET_BE_U_4 ( ap - > w1 ) ;
2012-02-29 12:36:55 +08:00
mtype = TIPC_MTYPE ( w1 ) ;
2018-06-16 23:23:21 +08:00
prev_node = GET_BE_U_4 ( ap - > prev_node ) ;
orig_port = GET_BE_U_4 ( ap - > orig_port ) ;
dest_port = GET_BE_U_4 ( ap - > dest_port ) ;
2012-02-29 17:09:40 +08:00
if ( hsize < = 6 ) {
2018-01-07 18:47:30 +08:00
ND_PRINT ( " TIPC v%u.0 %u.%u.%u:%u > %u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s " ,
2012-02-29 17:09:40 +08:00
TIPC_VER ( w0 ) ,
2012-02-29 13:12:26 +08:00
TIPC_ZONE ( prev_node ) , TIPC_CLUSTER ( prev_node ) , TIPC_NODE ( prev_node ) ,
2012-02-29 17:09:40 +08:00
orig_port , dest_port ,
hsize * 4 , msize ,
tok2str ( tipcuser_values , " unknown " , user ) ,
2018-01-07 18:47:30 +08:00
tok2str ( tipcmtype_values , " Unknown " , mtype ) ) ;
2012-02-29 17:09:40 +08:00
} else {
2018-06-16 23:23:21 +08:00
orig_node = GET_BE_U_4 ( ap - > orig_node ) ;
dest_node = GET_BE_U_4 ( ap - > dest_node ) ;
2018-01-07 18:47:30 +08:00
ND_PRINT ( " TIPC v%u.0 %u.%u.%u:%u > %u.%u.%u:%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s " ,
2012-02-29 17:09:40 +08:00
TIPC_VER ( w0 ) ,
TIPC_ZONE ( orig_node ) , TIPC_CLUSTER ( orig_node ) , TIPC_NODE ( orig_node ) ,
orig_port ,
TIPC_ZONE ( dest_node ) , TIPC_CLUSTER ( dest_node ) , TIPC_NODE ( dest_node ) ,
dest_port ,
hsize * 4 , msize ,
tok2str ( tipcuser_values , " unknown " , user ) ,
2018-01-07 18:47:30 +08:00
tok2str ( tipcmtype_values , " Unknown " , mtype ) ) ;
2012-02-29 17:09:40 +08:00
if ( ndo - > ndo_vflag ) {
broadcast_ack = TIPC_BROADCAST_ACK ( w1 ) ;
2018-06-16 23:23:21 +08:00
w2 = GET_BE_U_4 ( ap - > w2 ) ;
2012-02-29 17:09:40 +08:00
link_ack = TIPC_LINK_ACK ( w2 ) ;
link_seq = TIPC_LINK_SEQ ( w2 ) ;
2018-01-07 18:47:30 +08:00
ND_PRINT ( " \n \t Previous Node %u.%u.%u, Broadcast Ack %u, Link Ack %u, Link Sequence %u " ,
2012-02-29 17:09:40 +08:00
TIPC_ZONE ( prev_node ) , TIPC_CLUSTER ( prev_node ) , TIPC_NODE ( prev_node ) ,
2018-01-07 18:47:30 +08:00
broadcast_ack , link_ack , link_seq ) ;
2012-02-29 17:09:40 +08:00
}
2012-02-29 13:12:26 +08:00
}
2012-02-29 12:36:55 +08:00
}
2014-01-02 10:27:54 +08:00
2012-02-29 12:36:55 +08:00
static void
2012-02-29 17:09:40 +08:00
print_internal ( netdissect_options * ndo , const struct internal_tipc_pkthdr * ap )
2012-02-29 12:36:55 +08:00
{
2014-04-23 15:20:40 +08:00
uint32_t w0 , w1 , w2 , w4 , w5 , w9 ;
2012-02-29 17:09:40 +08:00
u_int user ;
2012-02-29 12:36:55 +08:00
u_int hsize ;
u_int msize ;
u_int mtype ;
u_int seq_gap ;
u_int broadcast_ack ;
u_int bc_gap_after ;
u_int bc_gap_to ;
u_int prev_node ;
u_int last_sent_frag ;
u_int next_sent_frag ;
u_int sess_no ;
u_int orig_node ;
u_int dest_node ;
u_int trans_seq ;
u_int msg_cnt ;
u_int link_tol ;
2018-06-16 23:23:21 +08:00
w0 = GET_BE_U_4 ( ap - > w0 ) ;
2012-02-29 17:09:40 +08:00
user = TIPC_USER ( w0 ) ;
2012-02-29 12:36:55 +08:00
hsize = TIPC_HSIZE ( w0 ) ;
msize = TIPC_MSIZE ( w0 ) ;
2018-06-16 23:23:21 +08:00
w1 = GET_BE_U_4 ( ap - > w1 ) ;
2012-02-29 12:36:55 +08:00
mtype = TIPC_MTYPE ( w1 ) ;
2018-06-16 23:23:21 +08:00
orig_node = GET_BE_U_4 ( ap - > orig_node ) ;
dest_node = GET_BE_U_4 ( ap - > dest_node ) ;
2018-01-07 18:47:30 +08:00
ND_PRINT ( " TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s (0x%08x) " ,
2012-02-29 17:09:40 +08:00
TIPC_VER ( w0 ) ,
2012-02-29 12:36:55 +08:00
TIPC_ZONE ( orig_node ) , TIPC_CLUSTER ( orig_node ) , TIPC_NODE ( orig_node ) ,
2012-02-29 17:09:40 +08:00
TIPC_ZONE ( dest_node ) , TIPC_CLUSTER ( dest_node ) , TIPC_NODE ( dest_node ) ,
hsize * 4 , msize ,
tok2str ( tipcuser_values , " unknown " , user ) ,
2018-01-07 18:47:30 +08:00
tok2str ( tipcmtype_values , " Unknown " , mtype ) , w1 ) ;
2012-02-29 17:09:40 +08:00
2012-02-29 13:12:26 +08:00
if ( ndo - > ndo_vflag ) {
2012-02-29 17:09:40 +08:00
seq_gap = TIPC_SEQ_GAP ( w1 ) ;
broadcast_ack = TIPC_BROADCAST_ACK ( w1 ) ;
2018-06-16 23:23:21 +08:00
w2 = GET_BE_U_4 ( ap - > w2 ) ;
2012-02-29 17:09:40 +08:00
bc_gap_after = TIPC_BC_GAP_AFTER ( w2 ) ;
bc_gap_to = TIPC_BC_GAP_TO ( w2 ) ;
2018-06-16 23:23:21 +08:00
prev_node = GET_BE_U_4 ( ap - > prev_node ) ;
w4 = GET_BE_U_4 ( ap - > w4 ) ;
2012-02-29 17:09:40 +08:00
last_sent_frag = TIPC_LAST_SENT_FRAG ( w4 ) ;
next_sent_frag = TIPC_NEXT_SENT_FRAG ( w4 ) ;
2018-06-16 23:23:21 +08:00
w5 = GET_BE_U_4 ( ap - > w5 ) ;
2012-02-29 17:09:40 +08:00
sess_no = TIPC_SESS_NO ( w5 ) ;
2018-06-16 23:23:21 +08:00
trans_seq = GET_BE_U_4 ( ap - > trans_seq ) ;
w9 = GET_BE_U_4 ( ap - > w9 ) ;
2012-02-29 17:09:40 +08:00
msg_cnt = TIPC_MSG_CNT ( w9 ) ;
link_tol = TIPC_LINK_TOL ( w9 ) ;
2018-01-07 18:47:30 +08:00
ND_PRINT ( " \n \t Previous 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 " ,
2012-02-29 13:12:26 +08:00
TIPC_ZONE ( prev_node ) , TIPC_CLUSTER ( prev_node ) , TIPC_NODE ( prev_node ) ,
sess_no , broadcast_ack , seq_gap , bc_gap_after , bc_gap_to ,
last_sent_frag , next_sent_frag , trans_seq , msg_cnt ,
2018-01-07 18:47:30 +08:00
link_tol ) ;
2012-02-29 13:12:26 +08:00
}
2012-02-29 12:36:55 +08:00
}
static void
2012-02-29 17:09:40 +08:00
print_link_conf ( netdissect_options * ndo , const struct link_conf_tipc_pkthdr * ap )
2012-02-29 12:36:55 +08:00
{
2014-04-23 15:20:40 +08:00
uint32_t w0 , w1 , w5 ;
2012-02-29 12:36:55 +08:00
u_int user ;
2012-02-29 17:09:40 +08:00
u_int hsize ;
u_int msize ;
2012-02-29 12:36:55 +08:00
u_int mtype ;
u_int node_sig ;
u_int prev_node ;
u_int dest_domain ;
u_int ntwrk_id ;
u_int media_id ;
2018-06-16 23:23:21 +08:00
w0 = GET_BE_U_4 ( ap - > w0 ) ;
2012-02-29 12:36:55 +08:00
user = TIPC_USER ( w0 ) ;
2012-02-29 17:09:40 +08:00
hsize = TIPC_HSIZE ( w0 ) ;
msize = TIPC_MSIZE ( w0 ) ;
2018-06-16 23:23:21 +08:00
w1 = GET_BE_U_4 ( ap - > w1 ) ;
2012-02-29 12:36:55 +08:00
mtype = TIPC_MTYPE ( w1 ) ;
2018-06-16 23:23:21 +08:00
dest_domain = GET_BE_U_4 ( ap - > dest_domain ) ;
prev_node = GET_BE_U_4 ( ap - > prev_node ) ;
2012-02-29 12:36:55 +08:00
2018-01-07 18:47:30 +08:00
ND_PRINT ( " TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s " ,
2012-02-29 17:09:40 +08:00
TIPC_VER ( w0 ) ,
2012-02-29 12:36:55 +08:00
TIPC_ZONE ( prev_node ) , TIPC_CLUSTER ( prev_node ) , TIPC_NODE ( prev_node ) ,
2012-02-29 17:09:40 +08:00
TIPC_ZONE ( dest_domain ) , TIPC_CLUSTER ( dest_domain ) , TIPC_NODE ( dest_domain ) ,
hsize * 4 , msize ,
tok2str ( tipcuser_values , " unknown " , user ) ,
2018-01-07 18:47:30 +08:00
tok2str ( tipc_linkconf_mtype_values , " Unknown " , mtype ) ) ;
2012-02-29 13:12:26 +08:00
if ( ndo - > ndo_vflag ) {
2012-02-29 17:09:40 +08:00
node_sig = TIPC_NODE_SIG ( w1 ) ;
2018-06-16 23:23:21 +08:00
ntwrk_id = GET_BE_U_4 ( ap - > ntwrk_id ) ;
w5 = GET_BE_U_4 ( ap - > w5 ) ;
2012-02-29 17:09:40 +08:00
media_id = TIPC_MEDIA_ID ( w5 ) ;
2018-01-07 18:47:30 +08:00
ND_PRINT ( " \n \t NodeSignature %u, network_id %u, media_id %u " ,
node_sig , ntwrk_id , media_id ) ;
2012-02-29 13:12:26 +08:00
}
2012-02-29 12:36:55 +08:00
}
void
tipc_print ( netdissect_options * ndo , const u_char * bp , u_int length _U_ ,
u_int caplen _U_ )
{
2012-02-29 17:09:40 +08:00
const struct tipc_pkthdr * ap ;
2014-04-23 15:20:40 +08:00
uint32_t w0 ;
2012-02-29 13:12:26 +08:00
u_int user ;
2012-02-29 12:36:55 +08:00
2018-03-14 23:54:17 +08:00
ndo - > ndo_protocol = " tipc " ;
2015-04-27 08:24:42 +08:00
ap = ( const struct tipc_pkthdr * ) bp ;
2018-06-16 23:23:21 +08:00
w0 = GET_BE_U_4 ( ap - > w0 ) ;
2012-02-29 13:12:26 +08:00
user = TIPC_USER ( w0 ) ;
2012-02-29 12:36:55 +08:00
2012-02-29 13:12:26 +08:00
switch ( user )
2012-02-29 12:36:55 +08:00
{
case TIPC_USER_LOW_IMPORTANCE :
case TIPC_USER_MEDIUM_IMPORTANCE :
case TIPC_USER_HIGH_IMPORTANCE :
case TIPC_USER_CRITICAL_IMPORTANCE :
case TIPC_USER_NAME_DISTRIBUTOR :
case TIPC_USER_CONN_MANAGER :
2015-04-27 08:24:42 +08:00
print_payload ( ndo , ( const struct payload_tipc_pkthdr * ) bp ) ;
2014-01-02 10:27:54 +08:00
break ;
2012-02-29 12:36:55 +08:00
case TIPC_USER_LINK_CONFIG :
2015-04-27 08:24:42 +08:00
print_link_conf ( ndo , ( const struct link_conf_tipc_pkthdr * ) bp ) ;
2012-02-29 12:36:55 +08:00
break ;
case TIPC_USER_BCAST_PROTOCOL :
case TIPC_USER_MSG_BUNDLER :
case TIPC_USER_LINK_PROTOCOL :
case TIPC_USER_CHANGEOVER_PROTOCOL :
case TIPC_USER_MSG_FRAGMENTER :
2015-04-27 08:24:42 +08:00
print_internal ( ndo , ( const struct internal_tipc_pkthdr * ) bp ) ;
2012-02-29 12:36:55 +08:00
break ;
}
}