xref: /freebsd/contrib/tcpdump/print-m3ua.c (revision 3c602fabf9b894ff79f08a80cbb7ad3b1eb84e62)
1*3c602fabSXin LI /* Copyright (c) 2013, The TCPDUMP project
2*3c602fabSXin LI  * All rights reserved.
3*3c602fabSXin LI  *
4*3c602fabSXin LI  * Redistribution and use in source and binary forms, with or without
5*3c602fabSXin LI  * modification, are permitted provided that the following conditions are met:
6*3c602fabSXin LI  *
7*3c602fabSXin LI  * 1. Redistributions of source code must retain the above copyright notice, this
8*3c602fabSXin LI  *    list of conditions and the following disclaimer.
9*3c602fabSXin LI  * 2. Redistributions in binary form must reproduce the above copyright notice,
10*3c602fabSXin LI  *    this list of conditions and the following disclaimer in the documentation
11*3c602fabSXin LI  *    and/or other materials provided with the distribution.
12*3c602fabSXin LI  *
13*3c602fabSXin LI  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
14*3c602fabSXin LI  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15*3c602fabSXin LI  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16*3c602fabSXin LI  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
17*3c602fabSXin LI  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18*3c602fabSXin LI  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19*3c602fabSXin LI  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20*3c602fabSXin LI  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21*3c602fabSXin LI  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22*3c602fabSXin LI  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23*3c602fabSXin LI  */
24*3c602fabSXin LI 
25*3c602fabSXin LI #define NETDISSECT_REWORKED
26*3c602fabSXin LI #ifdef HAVE_CONFIG_H
27*3c602fabSXin LI #include "config.h"
28*3c602fabSXin LI #endif
29*3c602fabSXin LI 
30*3c602fabSXin LI #include <tcpdump-stdinc.h>
31*3c602fabSXin LI 
32*3c602fabSXin LI #include "interface.h"
33*3c602fabSXin LI #include "extract.h"
34*3c602fabSXin LI 
35*3c602fabSXin LI static const char tstr[] = " [|m3ua]";
36*3c602fabSXin LI static const char cstr[] = " (corrupt)";
37*3c602fabSXin LI 
38*3c602fabSXin LI /* RFC 4666 */
39*3c602fabSXin LI 
40*3c602fabSXin LI #define M3UA_REL_1_0 1
41*3c602fabSXin LI 
42*3c602fabSXin LI struct m3ua_common_header {
43*3c602fabSXin LI   uint8_t  v;
44*3c602fabSXin LI   uint8_t  reserved;
45*3c602fabSXin LI   uint8_t  msg_class;
46*3c602fabSXin LI   uint8_t  msg_type;
47*3c602fabSXin LI   uint32_t len;
48*3c602fabSXin LI };
49*3c602fabSXin LI 
50*3c602fabSXin LI struct m3ua_param_header {
51*3c602fabSXin LI   uint16_t tag;
52*3c602fabSXin LI   uint16_t len;
53*3c602fabSXin LI };
54*3c602fabSXin LI 
55*3c602fabSXin LI /* message classes */
56*3c602fabSXin LI #define M3UA_MSGC_MGMT 0
57*3c602fabSXin LI #define M3UA_MSGC_TRANSFER 1
58*3c602fabSXin LI #define M3UA_MSGC_SSNM 2
59*3c602fabSXin LI #define M3UA_MSGC_ASPSM 3
60*3c602fabSXin LI #define M3UA_MSGC_ASPTM 4
61*3c602fabSXin LI /* reserved values */
62*3c602fabSXin LI #define M3UA_MSGC_RKM 9
63*3c602fabSXin LI 
64*3c602fabSXin LI static const struct tok MessageClasses[] = {
65*3c602fabSXin LI 	{ M3UA_MSGC_MGMT,     "Management"            },
66*3c602fabSXin LI 	{ M3UA_MSGC_TRANSFER, "Transfer"              },
67*3c602fabSXin LI 	{ M3UA_MSGC_SSNM,     "SS7"                   },
68*3c602fabSXin LI 	{ M3UA_MSGC_ASPSM,    "ASP"                   },
69*3c602fabSXin LI 	{ M3UA_MSGC_ASPTM,    "ASP"                   },
70*3c602fabSXin LI 	{ M3UA_MSGC_RKM,      "Routing Key Managment" },
71*3c602fabSXin LI 	{ 0, NULL }
72*3c602fabSXin LI };
73*3c602fabSXin LI 
74*3c602fabSXin LI /* management messages */
75*3c602fabSXin LI #define M3UA_MGMT_ERROR 0
76*3c602fabSXin LI #define M3UA_MGMT_NOTIFY 1
77*3c602fabSXin LI 
78*3c602fabSXin LI static const struct tok MgmtMessages[] = {
79*3c602fabSXin LI   { M3UA_MGMT_ERROR, "Error" },
80*3c602fabSXin LI   { M3UA_MGMT_NOTIFY, "Notify" },
81*3c602fabSXin LI   { 0, NULL }
82*3c602fabSXin LI };
83*3c602fabSXin LI 
84*3c602fabSXin LI /* transfer messages */
85*3c602fabSXin LI #define M3UA_TRANSFER_DATA 1
86*3c602fabSXin LI 
87*3c602fabSXin LI static const struct tok TransferMessages[] = {
88*3c602fabSXin LI   { M3UA_TRANSFER_DATA, "Data" },
89*3c602fabSXin LI   { 0, NULL }
90*3c602fabSXin LI };
91*3c602fabSXin LI 
92*3c602fabSXin LI /* SS7 Signaling Network Management messages */
93*3c602fabSXin LI #define M3UA_SSNM_DUNA 1
94*3c602fabSXin LI #define M3UA_SSNM_DAVA 2
95*3c602fabSXin LI #define M3UA_SSNM_DAUD 3
96*3c602fabSXin LI #define M3UA_SSNM_SCON 4
97*3c602fabSXin LI #define M3UA_SSNM_DUPU 5
98*3c602fabSXin LI #define M3UA_SSNM_DRST 6
99*3c602fabSXin LI 
100*3c602fabSXin LI static const struct tok SS7Messages[] = {
101*3c602fabSXin LI   { M3UA_SSNM_DUNA, "Destination Unavailable" },
102*3c602fabSXin LI   { M3UA_SSNM_DAVA, "Destination Available" },
103*3c602fabSXin LI   { M3UA_SSNM_DAUD, "Destination State Audit" },
104*3c602fabSXin LI   { M3UA_SSNM_SCON, "Signalling Congestion" },
105*3c602fabSXin LI   { M3UA_SSNM_DUPU, "Destination User Part Unavailable" },
106*3c602fabSXin LI   { M3UA_SSNM_DRST, "Destination Restricted" },
107*3c602fabSXin LI   { 0, NULL }
108*3c602fabSXin LI };
109*3c602fabSXin LI 
110*3c602fabSXin LI /* ASP State Maintenance messages */
111*3c602fabSXin LI #define M3UA_ASP_UP 1
112*3c602fabSXin LI #define M3UA_ASP_DN 2
113*3c602fabSXin LI #define M3UA_ASP_BEAT 3
114*3c602fabSXin LI #define M3UA_ASP_UP_ACK 4
115*3c602fabSXin LI #define M3UA_ASP_DN_ACK 5
116*3c602fabSXin LI #define M3UA_ASP_BEAT_ACK 6
117*3c602fabSXin LI 
118*3c602fabSXin LI static const struct tok ASPStateMessages[] = {
119*3c602fabSXin LI   { M3UA_ASP_UP, "Up" },
120*3c602fabSXin LI   { M3UA_ASP_DN, "Down" },
121*3c602fabSXin LI   { M3UA_ASP_BEAT, "Heartbeat" },
122*3c602fabSXin LI   { M3UA_ASP_UP_ACK, "Up Acknowledgement" },
123*3c602fabSXin LI   { M3UA_ASP_DN_ACK, "Down Acknowledgement" },
124*3c602fabSXin LI   { M3UA_ASP_BEAT_ACK, "Heartbeat Acknowledgement" },
125*3c602fabSXin LI   { 0, NULL }
126*3c602fabSXin LI };
127*3c602fabSXin LI 
128*3c602fabSXin LI /* ASP Traffic Maintenance messages */
129*3c602fabSXin LI #define M3UA_ASP_AC 1
130*3c602fabSXin LI #define M3UA_ASP_IA 2
131*3c602fabSXin LI #define M3UA_ASP_AC_ACK 3
132*3c602fabSXin LI #define M3UA_ASP_IA_ACK 4
133*3c602fabSXin LI 
134*3c602fabSXin LI static const struct tok ASPTrafficMessages[] = {
135*3c602fabSXin LI   { M3UA_ASP_AC, "Active" },
136*3c602fabSXin LI   { M3UA_ASP_IA, "Inactive" },
137*3c602fabSXin LI   { M3UA_ASP_AC_ACK, "Active Acknowledgement" },
138*3c602fabSXin LI   { M3UA_ASP_IA_ACK, "Inactive Acknowledgement" },
139*3c602fabSXin LI   { 0, NULL }
140*3c602fabSXin LI };
141*3c602fabSXin LI 
142*3c602fabSXin LI /* Routing Key Management messages */
143*3c602fabSXin LI #define M3UA_RKM_REQ 1
144*3c602fabSXin LI #define M3UA_RKM_RSP 2
145*3c602fabSXin LI #define M3UA_RKM_DEREQ 3
146*3c602fabSXin LI #define M3UA_RKM_DERSP 4
147*3c602fabSXin LI 
148*3c602fabSXin LI static const struct tok RoutingKeyMgmtMessages[] = {
149*3c602fabSXin LI   { M3UA_RKM_REQ, "Registration Request" },
150*3c602fabSXin LI   { M3UA_RKM_RSP, "Registration Response" },
151*3c602fabSXin LI   { M3UA_RKM_DEREQ, "Deregistration Request" },
152*3c602fabSXin LI   { M3UA_RKM_DERSP, "Deregistration Response" },
153*3c602fabSXin LI   { 0, NULL }
154*3c602fabSXin LI };
155*3c602fabSXin LI 
156*3c602fabSXin LI /* M3UA Parameters */
157*3c602fabSXin LI #define M3UA_PARAM_INFO 0x0004
158*3c602fabSXin LI #define M3UA_PARAM_ROUTING_CTX 0x0006
159*3c602fabSXin LI #define M3UA_PARAM_DIAGNOSTIC 0x0007
160*3c602fabSXin LI #define M3UA_PARAM_HB_DATA 0x0009
161*3c602fabSXin LI #define M3UA_PARAM_TRAFFIC_MODE_TYPE 0x000b
162*3c602fabSXin LI #define M3UA_PARAM_ERROR_CODE 0x000c
163*3c602fabSXin LI #define M3UA_PARAM_STATUS 0x000d
164*3c602fabSXin LI #define M3UA_PARAM_ASP_ID 0x0011
165*3c602fabSXin LI #define M3UA_PARAM_AFFECTED_POINT_CODE 0x0012
166*3c602fabSXin LI #define M3UA_PARAM_CORR_ID 0x0013
167*3c602fabSXin LI 
168*3c602fabSXin LI #define M3UA_PARAM_NETWORK_APPEARANCE 0x0200
169*3c602fabSXin LI #define M3UA_PARAM_USER 0x0204
170*3c602fabSXin LI #define M3UA_PARAM_CONGESTION_INDICATION 0x0205
171*3c602fabSXin LI #define M3UA_PARAM_CONCERNED_DST 0x0206
172*3c602fabSXin LI #define M3UA_PARAM_ROUTING_KEY 0x0207
173*3c602fabSXin LI #define M3UA_PARAM_REG_RESULT 0x0208
174*3c602fabSXin LI #define M3UA_PARAM_DEREG_RESULT 0x0209
175*3c602fabSXin LI #define M3UA_PARAM_LOCAL_ROUTING_KEY_ID 0x020a
176*3c602fabSXin LI #define M3UA_PARAM_DST_POINT_CODE 0x020b
177*3c602fabSXin LI #define M3UA_PARAM_SI 0x020c
178*3c602fabSXin LI #define M3UA_PARAM_ORIGIN_POINT_CODE_LIST 0x020e
179*3c602fabSXin LI #define M3UA_PARAM_PROTO_DATA 0x0210
180*3c602fabSXin LI #define M3UA_PARAM_REG_STATUS 0x0212
181*3c602fabSXin LI #define M3UA_PARAM_DEREG_STATUS 0x0213
182*3c602fabSXin LI 
183*3c602fabSXin LI static const struct tok ParamName[] = {
184*3c602fabSXin LI   { M3UA_PARAM_INFO, "INFO String" },
185*3c602fabSXin LI   { M3UA_PARAM_ROUTING_CTX, "Routing Context" },
186*3c602fabSXin LI   { M3UA_PARAM_DIAGNOSTIC, "Diagnostic Info" },
187*3c602fabSXin LI   { M3UA_PARAM_HB_DATA, "Heartbeat Data" },
188*3c602fabSXin LI   { M3UA_PARAM_TRAFFIC_MODE_TYPE, "Traffic Mode Type" },
189*3c602fabSXin LI   { M3UA_PARAM_ERROR_CODE, "Error Code" },
190*3c602fabSXin LI   { M3UA_PARAM_STATUS, "Status" },
191*3c602fabSXin LI   { M3UA_PARAM_ASP_ID, "ASP Identifier" },
192*3c602fabSXin LI   { M3UA_PARAM_AFFECTED_POINT_CODE, "Affected Point Code" },
193*3c602fabSXin LI   { M3UA_PARAM_CORR_ID, "Correlation ID" },
194*3c602fabSXin LI   { M3UA_PARAM_NETWORK_APPEARANCE, "Network Appearance" },
195*3c602fabSXin LI   { M3UA_PARAM_USER, "User/Cause" },
196*3c602fabSXin LI   { M3UA_PARAM_CONGESTION_INDICATION, "Congestion Indications" },
197*3c602fabSXin LI   { M3UA_PARAM_CONCERNED_DST, "Concerned Destination" },
198*3c602fabSXin LI   { M3UA_PARAM_ROUTING_KEY, "Routing Key" },
199*3c602fabSXin LI   { M3UA_PARAM_REG_RESULT, "Registration Result" },
200*3c602fabSXin LI   { M3UA_PARAM_DEREG_RESULT, "Deregistration Result" },
201*3c602fabSXin LI   { M3UA_PARAM_LOCAL_ROUTING_KEY_ID, "Local Routing Key Identifier" },
202*3c602fabSXin LI   { M3UA_PARAM_DST_POINT_CODE, "Destination Point Code" },
203*3c602fabSXin LI   { M3UA_PARAM_SI, "Service Indicators" },
204*3c602fabSXin LI   { M3UA_PARAM_ORIGIN_POINT_CODE_LIST, "Originating Point Code List" },
205*3c602fabSXin LI   { M3UA_PARAM_PROTO_DATA, "Protocol Data" },
206*3c602fabSXin LI   { M3UA_PARAM_REG_STATUS, "Registration Status" },
207*3c602fabSXin LI   { M3UA_PARAM_DEREG_STATUS, "Deregistration Status" },
208*3c602fabSXin LI   { 0, NULL }
209*3c602fabSXin LI };
210*3c602fabSXin LI 
211*3c602fabSXin LI static void
212*3c602fabSXin LI tag_value_print(netdissect_options *ndo,
213*3c602fabSXin LI                 const u_char *buf, const uint16_t tag, const uint16_t size)
214*3c602fabSXin LI {
215*3c602fabSXin LI   switch (tag) {
216*3c602fabSXin LI   case M3UA_PARAM_NETWORK_APPEARANCE:
217*3c602fabSXin LI   case M3UA_PARAM_ROUTING_CTX:
218*3c602fabSXin LI   case M3UA_PARAM_CORR_ID:
219*3c602fabSXin LI     /* buf and size don't include the header */
220*3c602fabSXin LI     if (size < 4)
221*3c602fabSXin LI       goto corrupt;
222*3c602fabSXin LI     ND_TCHECK2(*buf, size);
223*3c602fabSXin LI     ND_PRINT((ndo, "0x%08x", EXTRACT_32BITS(buf)));
224*3c602fabSXin LI     break;
225*3c602fabSXin LI   /* ... */
226*3c602fabSXin LI   default:
227*3c602fabSXin LI     ND_PRINT((ndo, "(length %u)", size + (u_int)sizeof(struct m3ua_param_header)));
228*3c602fabSXin LI     ND_TCHECK2(*buf, size);
229*3c602fabSXin LI   }
230*3c602fabSXin LI   return;
231*3c602fabSXin LI 
232*3c602fabSXin LI corrupt:
233*3c602fabSXin LI   ND_PRINT((ndo, "%s", cstr));
234*3c602fabSXin LI   ND_TCHECK2(*buf, size);
235*3c602fabSXin LI   return;
236*3c602fabSXin LI trunc:
237*3c602fabSXin LI   ND_PRINT((ndo, "%s", tstr));
238*3c602fabSXin LI }
239*3c602fabSXin LI 
240*3c602fabSXin LI /*
241*3c602fabSXin LI  *     0                   1                   2                   3
242*3c602fabSXin LI  *     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
243*3c602fabSXin LI  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
244*3c602fabSXin LI  *    |          Parameter Tag        |       Parameter Length        |
245*3c602fabSXin LI  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
246*3c602fabSXin LI  *    \                                                               \
247*3c602fabSXin LI  *    /                       Parameter Value                         /
248*3c602fabSXin LI  *    \                                                               \
249*3c602fabSXin LI  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
250*3c602fabSXin LI  */
251*3c602fabSXin LI static void
252*3c602fabSXin LI m3ua_tags_print(netdissect_options *ndo,
253*3c602fabSXin LI                 const u_char *buf, const u_int size)
254*3c602fabSXin LI {
255*3c602fabSXin LI   const u_char *p = buf;
256*3c602fabSXin LI   int align;
257*3c602fabSXin LI   uint16_t hdr_tag;
258*3c602fabSXin LI   uint16_t hdr_len;
259*3c602fabSXin LI 
260*3c602fabSXin LI   while (p < buf + size) {
261*3c602fabSXin LI     if (p + sizeof(struct m3ua_param_header) > buf + size)
262*3c602fabSXin LI       goto corrupt;
263*3c602fabSXin LI     ND_TCHECK2(*p, sizeof(struct m3ua_param_header));
264*3c602fabSXin LI     /* Parameter Tag */
265*3c602fabSXin LI     hdr_tag = EXTRACT_16BITS(p);
266*3c602fabSXin LI     ND_PRINT((ndo, "\n\t\t\t%s: ", tok2str(ParamName, "Unknown Parameter (0x%04x)", hdr_tag)));
267*3c602fabSXin LI     /* Parameter Length */
268*3c602fabSXin LI     hdr_len = EXTRACT_16BITS(p + 2);
269*3c602fabSXin LI     if (hdr_len < sizeof(struct m3ua_param_header))
270*3c602fabSXin LI       goto corrupt;
271*3c602fabSXin LI     /* Parameter Value */
272*3c602fabSXin LI     align = (p + hdr_len - buf) % 4;
273*3c602fabSXin LI     align = align ? 4 - align : 0;
274*3c602fabSXin LI     ND_TCHECK2(*p, hdr_len + align);
275*3c602fabSXin LI     tag_value_print(ndo, p, hdr_tag, hdr_len - sizeof(struct m3ua_param_header));
276*3c602fabSXin LI     p += hdr_len + align;
277*3c602fabSXin LI   }
278*3c602fabSXin LI   return;
279*3c602fabSXin LI 
280*3c602fabSXin LI corrupt:
281*3c602fabSXin LI   ND_PRINT((ndo, "%s", cstr));
282*3c602fabSXin LI   ND_TCHECK2(*buf, size);
283*3c602fabSXin LI   return;
284*3c602fabSXin LI trunc:
285*3c602fabSXin LI   ND_PRINT((ndo, "%s", tstr));
286*3c602fabSXin LI }
287*3c602fabSXin LI 
288*3c602fabSXin LI /*
289*3c602fabSXin LI  *     0                   1                   2                   3
290*3c602fabSXin LI  *     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
291*3c602fabSXin LI  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
292*3c602fabSXin LI  *    |    Version    |   Reserved    | Message Class | Message Type  |
293*3c602fabSXin LI  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
294*3c602fabSXin LI  *    |                        Message Length                         |
295*3c602fabSXin LI  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
296*3c602fabSXin LI  *    \                                                               \
297*3c602fabSXin LI  *    /                                                               /
298*3c602fabSXin LI  */
299*3c602fabSXin LI void
300*3c602fabSXin LI m3ua_print(netdissect_options *ndo,
301*3c602fabSXin LI            const u_char *buf, const u_int size)
302*3c602fabSXin LI {
303*3c602fabSXin LI   const struct m3ua_common_header *hdr = (const struct m3ua_common_header *) buf;
304*3c602fabSXin LI   const struct tok *dict;
305*3c602fabSXin LI 
306*3c602fabSXin LI   /* size includes the header */
307*3c602fabSXin LI   if (size < sizeof(struct m3ua_common_header))
308*3c602fabSXin LI     goto corrupt;
309*3c602fabSXin LI   ND_TCHECK(*hdr);
310*3c602fabSXin LI   if (hdr->v != M3UA_REL_1_0)
311*3c602fabSXin LI     return;
312*3c602fabSXin LI 
313*3c602fabSXin LI   dict =
314*3c602fabSXin LI     hdr->msg_class == M3UA_MSGC_MGMT     ? MgmtMessages :
315*3c602fabSXin LI     hdr->msg_class == M3UA_MSGC_TRANSFER ? TransferMessages :
316*3c602fabSXin LI     hdr->msg_class == M3UA_MSGC_SSNM     ? SS7Messages :
317*3c602fabSXin LI     hdr->msg_class == M3UA_MSGC_ASPSM    ? ASPStateMessages :
318*3c602fabSXin LI     hdr->msg_class == M3UA_MSGC_ASPTM    ? ASPTrafficMessages :
319*3c602fabSXin LI     hdr->msg_class == M3UA_MSGC_RKM      ? RoutingKeyMgmtMessages :
320*3c602fabSXin LI     NULL;
321*3c602fabSXin LI 
322*3c602fabSXin LI   ND_PRINT((ndo, "\n\t\t%s", tok2str(MessageClasses, "Unknown message class %i", hdr->msg_class)));
323*3c602fabSXin LI   if (dict != NULL)
324*3c602fabSXin LI     ND_PRINT((ndo, " %s Message", tok2str(dict, "Unknown (0x%02x)", hdr->msg_type)));
325*3c602fabSXin LI 
326*3c602fabSXin LI   if (size != EXTRACT_32BITS(&hdr->len))
327*3c602fabSXin LI     ND_PRINT((ndo, "\n\t\t\t@@@@@@ Corrupted length %u of message @@@@@@", EXTRACT_32BITS(&hdr->len)));
328*3c602fabSXin LI   else
329*3c602fabSXin LI     m3ua_tags_print(ndo, buf + sizeof(struct m3ua_common_header), EXTRACT_32BITS(&hdr->len) - sizeof(struct m3ua_common_header));
330*3c602fabSXin LI   return;
331*3c602fabSXin LI 
332*3c602fabSXin LI corrupt:
333*3c602fabSXin LI   ND_PRINT((ndo, "%s", cstr));
334*3c602fabSXin LI   ND_TCHECK2(*buf, size);
335*3c602fabSXin LI   return;
336*3c602fabSXin LI trunc:
337*3c602fabSXin LI   ND_PRINT((ndo, "%s", tstr));
338*3c602fabSXin LI }
339*3c602fabSXin LI 
340