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