source: rtems-libbsd/freebsd/contrib/tcpdump/print-tipc.c @ 8440506

4.1155-freebsd-126-freebsd-12freebsd-9.3
Last change on this file since 8440506 was 8440506, checked in by Chris Johns <chrisj@…>, on 06/15/15 at 07:42:23

Add tcpdump and libpcap.

  • Update the file builder generator to handle generator specific cflags and includes. The tcpdump and libpcap have localised headers and need specific headers paths to see them. There are also module specific flags and these need to be passed to the lex and yacc generators.
  • Add the tcpdump support.
  • Property mode set to 100644
File size: 11.8 KB
Line 
1#include <machine/rtems-bsd-user-space.h>
2
3/*
4 * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997
5 *      The Regents of the University of California.  All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that: (1) source code distributions
9 * retain the above copyright notice and this paragraph in its entirety, (2)
10 * distributions including binary code include the above copyright notice and
11 * this paragraph in its entirety in the documentation or other materials
12 * provided with the distribution, and (3) all advertising materials mentioning
13 * features or use of this software display the following acknowledgement:
14 * ``This product includes software developed by the University of California,
15 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
16 * the University nor the names of its contributors may be used to endorse
17 * or promote products derived from this software without specific prior
18 * written permission.
19 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
20 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
22 */
23
24#ifndef lint
25static const char rcsid[] _U_ =
26    "@(#) $Header: /tcpdump/master/tcpdump/print-arp.c,v 1.66 2006-03-03 22:53:21 hannes Exp $ (LBL)";
27#endif
28
29#ifdef HAVE_CONFIG_H
30#include "config.h"
31#endif
32
33#include <tcpdump-stdinc.h>
34
35#include <stdio.h>
36#include <string.h>
37
38#include "netdissect.h"
39#include "addrtoname.h"
40#include "ether.h"
41#include "ethertype.h"
42#include "extract.h"                    /* must come after interface.h */
43
44/*
45 * Transparent Inter-Process Communication (TIPC) protocol.
46 *
47 *      http://tipc.sourceforge.net/doc/draft-spec-tipc-07.html
48 *      http://tipc.sourceforge.net/doc/tipc_message_formats.html
49 */
50
51#define TIPC_USER_LOW_IMPORTANCE        0
52#define TIPC_USER_MEDIUM_IMPORTANCE     1
53#define TIPC_USER_HIGH_IMPORTANCE       2
54#define TIPC_USER_CRITICAL_IMPORTANCE   3
55#define TIPC_USER_BCAST_PROTOCOL        5
56#define TIPC_USER_MSG_BUNDLER           6
57#define TIPC_USER_LINK_PROTOCOL         7
58#define TIPC_USER_CONN_MANAGER          8
59#define TIPC_USER_CHANGEOVER_PROTOCOL   10
60#define TIPC_USER_NAME_DISTRIBUTOR      11
61#define TIPC_USER_MSG_FRAGMENTER        12
62#define TIPC_USER_LINK_CONFIG           13
63
64#define TIPC_CONN_MSG                   0
65#define TIPC_DIRECT_MSG                 1
66#define TIPC_NAMED_MSG                  2
67#define TIPC_MCAST_MSG                  3
68
69#define TIPC_ZONE(addr)         (((addr) >> 24) & 0xFF)
70#define TIPC_CLUSTER(addr)      (((addr) >> 12) & 0xFFF)
71#define TIPC_NODE(addr)         (((addr) >> 0) & 0xFFF)
72
73struct tipc_pkthdr {
74        u_int32_t w0;
75        u_int32_t w1;
76};
77
78#define TIPC_VER(w0)            (((w0) >> 29) & 0x07)
79#define TIPC_USER(w0)           (((w0) >> 25) & 0x0F)
80#define TIPC_HSIZE(w0)          (((w0) >> 21) & 0x0F)
81#define TIPC_MSIZE(w0)          (((w0) >> 0) & 0xFFFF)
82#define TIPC_MTYPE(w1)          (((w1) >> 29) & 0x07)
83#define TIPC_BROADCAST_ACK(w1)  (((w1) >> 0) & 0xFFFF)
84#define TIPC_LINK_ACK(w2)       (((w2) >> 16) & 0xFFFF)
85#define TIPC_LINK_SEQ(w2)       (((w2) >> 0) & 0xFFFF)
86
87static const struct tok tipcuser_values[] = {
88    { TIPC_USER_LOW_IMPORTANCE,      "Low Importance Data payload" },
89    { TIPC_USER_MEDIUM_IMPORTANCE,   "Medium Importance Data payload" },
90    { TIPC_USER_HIGH_IMPORTANCE,     "High Importance Data payload" },
91    { TIPC_USER_CRITICAL_IMPORTANCE, "Critical Importance Data payload" },
92    { TIPC_USER_BCAST_PROTOCOL,      "Broadcast Link Protocol internal" },
93    { TIPC_USER_MSG_BUNDLER,         "Message Bundler Protocol internal" },
94    { TIPC_USER_LINK_PROTOCOL,       "Link State Protocol internal" },
95    { TIPC_USER_CONN_MANAGER,        "Connection Manager internal" },
96    { TIPC_USER_CHANGEOVER_PROTOCOL, "Link Changeover Protocol internal" },
97    { TIPC_USER_NAME_DISTRIBUTOR,    "Name Table Update Protocol internal" },
98    { TIPC_USER_MSG_FRAGMENTER,      "Message Fragmentation Protocol internal" },
99    { TIPC_USER_LINK_CONFIG,         "Neighbor Detection Protocol internal" },
100    { 0, NULL }
101};
102
103static const struct tok tipcmtype_values[] = {
104    { TIPC_CONN_MSG,   "CONN_MSG" },
105    { TIPC_DIRECT_MSG, "MCAST_MSG" },
106    { TIPC_NAMED_MSG,  "NAMED_MSG" },
107    { TIPC_MCAST_MSG,  "DIRECT_MSG" },
108    { 0, NULL }
109};
110
111static const struct tok tipc_linkconf_mtype_values[] = {
112    { 0,   "Link request" },
113    { 1,   "Link response" },
114    { 0, NULL }
115};
116
117struct payload_tipc_pkthdr {
118        u_int32_t w0;
119        u_int32_t w1;
120        u_int32_t w2;
121        u_int32_t prev_node;
122        u_int32_t orig_port;
123        u_int32_t dest_port;
124        u_int32_t orig_node;
125        u_int32_t dest_node;
126        u_int32_t name_type;
127        u_int32_t w9;
128        u_int32_t wA;
129};
130
131struct  internal_tipc_pkthdr {
132        u_int32_t w0;
133        u_int32_t w1;
134        u_int32_t w2;
135        u_int32_t prev_node;
136        u_int32_t w4;
137        u_int32_t w5;
138        u_int32_t orig_node;
139        u_int32_t dest_node;
140        u_int32_t trans_seq;
141        u_int32_t w9;
142};
143
144#define TIPC_SEQ_GAP(w1)        (((w1) >> 16) & 0x1FFF)
145#define TIPC_BC_GAP_AFTER(w2)   (((w2) >> 16) & 0xFFFF)
146#define TIPC_BC_GAP_TO(w2)      (((w2) >> 0) & 0xFFFF)
147#define TIPC_LAST_SENT_FRAG(w4) (((w4) >> 16) & 0xFFFF)
148#define TIPC_NEXT_SENT_FRAG(w4) (((w4) >> 0) & 0xFFFF)
149#define TIPC_SESS_NO(w5)        (((w5) >> 16) & 0xFFFF)
150#define TIPC_MSG_CNT(w9)        (((w9) >> 16) & 0xFFFF)
151#define TIPC_LINK_TOL(w9)       (((w9) >> 0) & 0xFFFF)
152
153struct link_conf_tipc_pkthdr {
154        u_int32_t w0;
155        u_int32_t w1;
156        u_int32_t dest_domain;
157        u_int32_t prev_node;
158        u_int32_t ntwrk_id;
159        u_int32_t w5;
160        u_int8_t media_address[16];
161};
162
163#define TIPC_NODE_SIG(w1)       (((w1) >> 0) & 0xFFFF)
164#define TIPC_MEDIA_ID(w5)       (((w5) >> 0) & 0xFF)
165
166static void
167print_payload(netdissect_options *ndo, const struct payload_tipc_pkthdr *ap)
168{
169        u_int32_t w0, w1, w2;
170        u_int user;
171        u_int hsize;
172        u_int msize;
173        u_int mtype;
174        u_int broadcast_ack;
175        u_int link_ack;
176        u_int link_seq;
177        u_int prev_node;
178        u_int orig_port;
179        u_int dest_port;
180        u_int orig_node;
181        u_int dest_node;
182
183        ND_TCHECK(ap->dest_port);
184        w0 = EXTRACT_32BITS(&ap->w0);
185        user = TIPC_USER(w0);
186        hsize = TIPC_HSIZE(w0);
187        msize = TIPC_MSIZE(w0);
188        w1 = EXTRACT_32BITS(&ap->w1);
189        mtype = TIPC_MTYPE(w1);
190        prev_node = EXTRACT_32BITS(&ap->prev_node);
191        orig_port = EXTRACT_32BITS(&ap->orig_port);
192        dest_port = EXTRACT_32BITS(&ap->dest_port);
193        if (hsize <= 6) {
194                ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u:%u > %u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
195                    TIPC_VER(w0),
196                    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
197                    orig_port, dest_port,
198                    hsize*4, msize,
199                    tok2str(tipcuser_values, "unknown", user),
200                    tok2str(tipcmtype_values, "Unknown", mtype)));
201        } else {
202                ND_TCHECK(ap->dest_node);
203                orig_node = EXTRACT_32BITS(&ap->orig_node);
204                dest_node = EXTRACT_32BITS(&ap->dest_node);
205                ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u:%u > %u.%u.%u:%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
206                    TIPC_VER(w0),
207                    TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node),
208                    orig_port,
209                    TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node),
210                    dest_port,
211                    hsize*4, msize,
212                    tok2str(tipcuser_values, "unknown", user),
213                    tok2str(tipcmtype_values, "Unknown", mtype)));
214
215                if (ndo->ndo_vflag) {
216                        broadcast_ack = TIPC_BROADCAST_ACK(w1);
217                        w2 = EXTRACT_32BITS(&ap->w2);
218                        link_ack = TIPC_LINK_ACK(w2);
219                        link_seq = TIPC_LINK_SEQ(w2);
220                        ND_PRINT((ndo, "\n\tPrevious Node %u.%u.%u, Broadcast Ack %u, Link Ack %u, Link Sequence %u",
221                            TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
222                            broadcast_ack, link_ack, link_seq));
223                }
224        }
225        return;
226
227trunc:
228        ND_PRINT((ndo, "[|TIPC]"));
229}
230         
231static void
232print_internal(netdissect_options *ndo, const struct internal_tipc_pkthdr *ap)
233{
234        u_int32_t w0, w1, w2, w4, w5, w9;
235        u_int user;
236        u_int hsize;
237        u_int msize;
238        u_int mtype;
239        u_int seq_gap;
240        u_int broadcast_ack;
241        u_int bc_gap_after;
242        u_int bc_gap_to;
243        u_int prev_node;
244        u_int last_sent_frag;
245        u_int next_sent_frag;
246        u_int sess_no;
247        u_int orig_node;
248        u_int dest_node;
249        u_int trans_seq;
250        u_int msg_cnt;
251        u_int link_tol;
252
253        ND_TCHECK(ap->dest_node);
254        w0 = EXTRACT_32BITS(&ap->w0);
255        user = TIPC_USER(w0);
256        hsize = TIPC_HSIZE(w0);
257        msize = TIPC_MSIZE(w0);
258        w1 = EXTRACT_32BITS(&ap->w1);
259        mtype = TIPC_MTYPE(w1);
260        orig_node = EXTRACT_32BITS(&ap->orig_node);
261        dest_node = EXTRACT_32BITS(&ap->dest_node);
262        ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s (0x%08x)",
263            TIPC_VER(w0),
264            TIPC_ZONE(orig_node), TIPC_CLUSTER(orig_node), TIPC_NODE(orig_node),
265            TIPC_ZONE(dest_node), TIPC_CLUSTER(dest_node), TIPC_NODE(dest_node),
266            hsize*4, msize,
267            tok2str(tipcuser_values, "unknown", user),
268            tok2str(tipcmtype_values, "Unknown", mtype), w1));
269
270        if (ndo->ndo_vflag) {
271                ND_TCHECK(*ap);
272                seq_gap = TIPC_SEQ_GAP(w1);
273                broadcast_ack = TIPC_BROADCAST_ACK(w1);
274                w2 = EXTRACT_32BITS(&ap->w2);
275                bc_gap_after = TIPC_BC_GAP_AFTER(w2);
276                bc_gap_to = TIPC_BC_GAP_TO(w2);
277                prev_node = EXTRACT_32BITS(&ap->prev_node);
278                w4 = EXTRACT_32BITS(&ap->w4);
279                last_sent_frag = TIPC_LAST_SENT_FRAG(w4);
280                next_sent_frag = TIPC_NEXT_SENT_FRAG(w4);
281                w5 = EXTRACT_32BITS(&ap->w5);
282                sess_no = TIPC_SESS_NO(w5);
283                trans_seq = EXTRACT_32BITS(&ap->trans_seq);
284                w9 = EXTRACT_32BITS(&ap->w9);
285                msg_cnt = TIPC_MSG_CNT(w9);
286                link_tol = TIPC_LINK_TOL(w9);
287                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",
288                    TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
289                    sess_no, broadcast_ack, seq_gap, bc_gap_after, bc_gap_to,
290                    last_sent_frag, next_sent_frag, trans_seq, msg_cnt,
291                    link_tol));
292        }
293        return;
294
295trunc:
296        ND_PRINT((ndo, "[|TIPC]"));
297}
298
299static void
300print_link_conf(netdissect_options *ndo, const struct link_conf_tipc_pkthdr *ap)
301{
302        u_int32_t w0, w1, w5;
303        u_int user;
304        u_int hsize;
305        u_int msize;
306        u_int mtype;
307        u_int node_sig;
308        u_int prev_node;
309        u_int dest_domain;
310        u_int ntwrk_id;
311        u_int media_id;
312
313        ND_TCHECK(ap->prev_node);
314        w0 = EXTRACT_32BITS(&ap->w0);
315        user = TIPC_USER(w0);
316        hsize = TIPC_HSIZE(w0);
317        msize = TIPC_MSIZE(w0);
318        w1 = EXTRACT_32BITS(&ap->w1);
319        mtype = TIPC_MTYPE(w1);
320        prev_node = EXTRACT_32BITS(&ap->prev_node);
321        dest_domain = EXTRACT_32BITS(&ap->dest_domain);
322        prev_node = EXTRACT_32BITS(&ap->prev_node);
323
324        ND_PRINT((ndo, "TIPC v%u.0 %u.%u.%u > %u.%u.%u, headerlength %u bytes, MessageSize %u bytes, %s, messageType %s",
325            TIPC_VER(w0),
326            TIPC_ZONE(prev_node), TIPC_CLUSTER(prev_node), TIPC_NODE(prev_node),
327            TIPC_ZONE(dest_domain), TIPC_CLUSTER(dest_domain), TIPC_NODE(dest_domain),
328            hsize*4, msize,
329            tok2str(tipcuser_values, "unknown", user),
330            tok2str(tipc_linkconf_mtype_values, "Unknown", mtype)));
331        if (ndo->ndo_vflag) {
332                ND_TCHECK(ap->w5);
333                node_sig = TIPC_NODE_SIG(w1);
334                ntwrk_id = EXTRACT_32BITS(&ap->ntwrk_id);
335                w5 = EXTRACT_32BITS(&ap->w5);
336                media_id = TIPC_MEDIA_ID(w5);
337                ND_PRINT((ndo, "\n\tNodeSignature %u, network_id %u, media_id %u",
338                    node_sig, ntwrk_id, media_id));
339        }
340        return;
341
342trunc:
343        ND_PRINT((ndo, "[|TIPC]"));
344}
345
346void
347tipc_print(netdissect_options *ndo, const u_char *bp, u_int length _U_,
348    u_int caplen _U_)
349{
350        const struct tipc_pkthdr *ap;
351        u_int32_t w0;
352        u_int user;
353
354        ap = (struct tipc_pkthdr *)bp;
355        ND_TCHECK(ap->w0);
356        w0 = EXTRACT_32BITS(&ap->w0);
357        user = TIPC_USER(w0);
358
359        switch (user)
360        {
361                case TIPC_USER_LOW_IMPORTANCE:
362                case TIPC_USER_MEDIUM_IMPORTANCE:
363                case TIPC_USER_HIGH_IMPORTANCE:
364                case TIPC_USER_CRITICAL_IMPORTANCE:
365                case TIPC_USER_NAME_DISTRIBUTOR:
366                case TIPC_USER_CONN_MANAGER:
367                        print_payload(ndo, (struct payload_tipc_pkthdr *)bp);
368                        break;                   
369
370                case TIPC_USER_LINK_CONFIG:
371                        print_link_conf(ndo, (struct link_conf_tipc_pkthdr *)bp);
372                        break;
373
374                case TIPC_USER_BCAST_PROTOCOL:
375                case TIPC_USER_MSG_BUNDLER:
376                case TIPC_USER_LINK_PROTOCOL:
377                case TIPC_USER_CHANGEOVER_PROTOCOL:
378                case TIPC_USER_MSG_FRAGMENTER:
379                        print_internal(ndo, (struct internal_tipc_pkthdr *)bp);
380                        break;
381
382        }
383        return;
384
385trunc:
386        ND_PRINT((ndo, "[|TIPC]"));
387}
388
389/*
390 * Local Variables:
391 * c-style: bsd
392 * End:
393 */
394
Note: See TracBrowser for help on using the repository browser.