xref: /dflybsd-src/contrib/tcpdump/print-m3ua.c (revision 59c07fbdf8168fa08c76c515186d561b5a92690c)
1411677aeSAaron LI /* Copyright (c) 2013, The TCPDUMP project
2411677aeSAaron LI  * All rights reserved.
3411677aeSAaron LI  *
4411677aeSAaron LI  * Redistribution and use in source and binary forms, with or without
5411677aeSAaron LI  * modification, are permitted provided that the following conditions are met:
6411677aeSAaron LI  *
7411677aeSAaron LI  * 1. Redistributions of source code must retain the above copyright notice, this
8411677aeSAaron LI  *    list of conditions and the following disclaimer.
9411677aeSAaron LI  * 2. Redistributions in binary form must reproduce the above copyright notice,
10411677aeSAaron LI  *    this list of conditions and the following disclaimer in the documentation
11411677aeSAaron LI  *    and/or other materials provided with the distribution.
12411677aeSAaron LI  *
13411677aeSAaron LI  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
14411677aeSAaron LI  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15411677aeSAaron LI  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16411677aeSAaron LI  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
17411677aeSAaron LI  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18411677aeSAaron LI  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19411677aeSAaron LI  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20411677aeSAaron LI  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21411677aeSAaron LI  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22411677aeSAaron LI  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23411677aeSAaron LI  */
24411677aeSAaron LI 
25411677aeSAaron LI /* \summary: Message Transfer Part 3 (MTP3) User Adaptation Layer (M3UA) printer */
26411677aeSAaron LI 
27411677aeSAaron LI /* RFC 4666 */
28411677aeSAaron LI 
29411677aeSAaron LI #ifdef HAVE_CONFIG_H
30*ed775ee7SAntonio Huete Jimenez #include <config.h>
31411677aeSAaron LI #endif
32411677aeSAaron LI 
33*ed775ee7SAntonio Huete Jimenez #include "netdissect-stdinc.h"
34411677aeSAaron LI 
35*ed775ee7SAntonio Huete Jimenez #define ND_LONGJMP_FROM_TCHECK
36411677aeSAaron LI #include "netdissect.h"
37411677aeSAaron LI #include "extract.h"
38411677aeSAaron LI 
39411677aeSAaron LI 
40411677aeSAaron LI #define M3UA_REL_1_0 1
41411677aeSAaron LI 
42411677aeSAaron LI struct m3ua_common_header {
43*ed775ee7SAntonio Huete Jimenez   nd_uint8_t  v;
44*ed775ee7SAntonio Huete Jimenez   nd_uint8_t  reserved;
45*ed775ee7SAntonio Huete Jimenez   nd_uint8_t  msg_class;
46*ed775ee7SAntonio Huete Jimenez   nd_uint8_t  msg_type;
47*ed775ee7SAntonio Huete Jimenez   nd_uint32_t len;
48411677aeSAaron LI };
49411677aeSAaron LI 
50411677aeSAaron LI struct m3ua_param_header {
51*ed775ee7SAntonio Huete Jimenez   nd_uint16_t tag;
52*ed775ee7SAntonio Huete Jimenez   nd_uint16_t len;
53411677aeSAaron LI };
54411677aeSAaron LI 
55411677aeSAaron LI /* message classes */
56411677aeSAaron LI #define M3UA_MSGC_MGMT 0
57411677aeSAaron LI #define M3UA_MSGC_TRANSFER 1
58411677aeSAaron LI #define M3UA_MSGC_SSNM 2
59411677aeSAaron LI #define M3UA_MSGC_ASPSM 3
60411677aeSAaron LI #define M3UA_MSGC_ASPTM 4
61411677aeSAaron LI /* reserved values */
62411677aeSAaron LI #define M3UA_MSGC_RKM 9
63411677aeSAaron LI 
64411677aeSAaron LI static const struct tok MessageClasses[] = {
65411677aeSAaron LI 	{ M3UA_MSGC_MGMT,     "Management"            },
66411677aeSAaron LI 	{ M3UA_MSGC_TRANSFER, "Transfer"              },
67411677aeSAaron LI 	{ M3UA_MSGC_SSNM,     "SS7"                   },
68411677aeSAaron LI 	{ M3UA_MSGC_ASPSM,    "ASP"                   },
69411677aeSAaron LI 	{ M3UA_MSGC_ASPTM,    "ASP"                   },
70411677aeSAaron LI 	{ M3UA_MSGC_RKM,      "Routing Key Management"},
71411677aeSAaron LI 	{ 0, NULL }
72411677aeSAaron LI };
73411677aeSAaron LI 
74411677aeSAaron LI /* management messages */
75411677aeSAaron LI #define M3UA_MGMT_ERROR 0
76411677aeSAaron LI #define M3UA_MGMT_NOTIFY 1
77411677aeSAaron LI 
78411677aeSAaron LI static const struct tok MgmtMessages[] = {
79411677aeSAaron LI   { M3UA_MGMT_ERROR, "Error" },
80411677aeSAaron LI   { M3UA_MGMT_NOTIFY, "Notify" },
81411677aeSAaron LI   { 0, NULL }
82411677aeSAaron LI };
83411677aeSAaron LI 
84411677aeSAaron LI /* transfer messages */
85411677aeSAaron LI #define M3UA_TRANSFER_DATA 1
86411677aeSAaron LI 
87411677aeSAaron LI static const struct tok TransferMessages[] = {
88411677aeSAaron LI   { M3UA_TRANSFER_DATA, "Data" },
89411677aeSAaron LI   { 0, NULL }
90411677aeSAaron LI };
91411677aeSAaron LI 
92411677aeSAaron LI /* SS7 Signaling Network Management messages */
93411677aeSAaron LI #define M3UA_SSNM_DUNA 1
94411677aeSAaron LI #define M3UA_SSNM_DAVA 2
95411677aeSAaron LI #define M3UA_SSNM_DAUD 3
96411677aeSAaron LI #define M3UA_SSNM_SCON 4
97411677aeSAaron LI #define M3UA_SSNM_DUPU 5
98411677aeSAaron LI #define M3UA_SSNM_DRST 6
99411677aeSAaron LI 
100411677aeSAaron LI static const struct tok SS7Messages[] = {
101411677aeSAaron LI   { M3UA_SSNM_DUNA, "Destination Unavailable" },
102411677aeSAaron LI   { M3UA_SSNM_DAVA, "Destination Available" },
103411677aeSAaron LI   { M3UA_SSNM_DAUD, "Destination State Audit" },
104411677aeSAaron LI   { M3UA_SSNM_SCON, "Signalling Congestion" },
105411677aeSAaron LI   { M3UA_SSNM_DUPU, "Destination User Part Unavailable" },
106411677aeSAaron LI   { M3UA_SSNM_DRST, "Destination Restricted" },
107411677aeSAaron LI   { 0, NULL }
108411677aeSAaron LI };
109411677aeSAaron LI 
110411677aeSAaron LI /* ASP State Maintenance messages */
111411677aeSAaron LI #define M3UA_ASP_UP 1
112411677aeSAaron LI #define M3UA_ASP_DN 2
113411677aeSAaron LI #define M3UA_ASP_BEAT 3
114411677aeSAaron LI #define M3UA_ASP_UP_ACK 4
115411677aeSAaron LI #define M3UA_ASP_DN_ACK 5
116411677aeSAaron LI #define M3UA_ASP_BEAT_ACK 6
117411677aeSAaron LI 
118411677aeSAaron LI static const struct tok ASPStateMessages[] = {
119411677aeSAaron LI   { M3UA_ASP_UP, "Up" },
120411677aeSAaron LI   { M3UA_ASP_DN, "Down" },
121411677aeSAaron LI   { M3UA_ASP_BEAT, "Heartbeat" },
122411677aeSAaron LI   { M3UA_ASP_UP_ACK, "Up Acknowledgement" },
123411677aeSAaron LI   { M3UA_ASP_DN_ACK, "Down Acknowledgement" },
124411677aeSAaron LI   { M3UA_ASP_BEAT_ACK, "Heartbeat Acknowledgement" },
125411677aeSAaron LI   { 0, NULL }
126411677aeSAaron LI };
127411677aeSAaron LI 
128411677aeSAaron LI /* ASP Traffic Maintenance messages */
129411677aeSAaron LI #define M3UA_ASP_AC 1
130411677aeSAaron LI #define M3UA_ASP_IA 2
131411677aeSAaron LI #define M3UA_ASP_AC_ACK 3
132411677aeSAaron LI #define M3UA_ASP_IA_ACK 4
133411677aeSAaron LI 
134411677aeSAaron LI static const struct tok ASPTrafficMessages[] = {
135411677aeSAaron LI   { M3UA_ASP_AC, "Active" },
136411677aeSAaron LI   { M3UA_ASP_IA, "Inactive" },
137411677aeSAaron LI   { M3UA_ASP_AC_ACK, "Active Acknowledgement" },
138411677aeSAaron LI   { M3UA_ASP_IA_ACK, "Inactive Acknowledgement" },
139411677aeSAaron LI   { 0, NULL }
140411677aeSAaron LI };
141411677aeSAaron LI 
142411677aeSAaron LI /* Routing Key Management messages */
143411677aeSAaron LI #define M3UA_RKM_REQ 1
144411677aeSAaron LI #define M3UA_RKM_RSP 2
145411677aeSAaron LI #define M3UA_RKM_DEREQ 3
146411677aeSAaron LI #define M3UA_RKM_DERSP 4
147411677aeSAaron LI 
148411677aeSAaron LI static const struct tok RoutingKeyMgmtMessages[] = {
149411677aeSAaron LI   { M3UA_RKM_REQ, "Registration Request" },
150411677aeSAaron LI   { M3UA_RKM_RSP, "Registration Response" },
151411677aeSAaron LI   { M3UA_RKM_DEREQ, "Deregistration Request" },
152411677aeSAaron LI   { M3UA_RKM_DERSP, "Deregistration Response" },
153411677aeSAaron LI   { 0, NULL }
154411677aeSAaron LI };
155411677aeSAaron LI 
156*ed775ee7SAntonio Huete Jimenez static const struct uint_tokary m3ua_msgc2tokary[] = {
157*ed775ee7SAntonio Huete Jimenez 	{ M3UA_MSGC_MGMT,     MgmtMessages           },
158*ed775ee7SAntonio Huete Jimenez 	{ M3UA_MSGC_TRANSFER, TransferMessages       },
159*ed775ee7SAntonio Huete Jimenez 	{ M3UA_MSGC_SSNM,     SS7Messages            },
160*ed775ee7SAntonio Huete Jimenez 	{ M3UA_MSGC_ASPSM,    ASPStateMessages       },
161*ed775ee7SAntonio Huete Jimenez 	{ M3UA_MSGC_ASPTM,    ASPTrafficMessages     },
162*ed775ee7SAntonio Huete Jimenez 	{ M3UA_MSGC_RKM,      RoutingKeyMgmtMessages },
163*ed775ee7SAntonio Huete Jimenez 	/* uint2tokary() does not use array termination. */
164*ed775ee7SAntonio Huete Jimenez };
165*ed775ee7SAntonio Huete Jimenez 
166411677aeSAaron LI /* M3UA Parameters */
167411677aeSAaron LI #define M3UA_PARAM_INFO 0x0004
168411677aeSAaron LI #define M3UA_PARAM_ROUTING_CTX 0x0006
169411677aeSAaron LI #define M3UA_PARAM_DIAGNOSTIC 0x0007
170411677aeSAaron LI #define M3UA_PARAM_HB_DATA 0x0009
171411677aeSAaron LI #define M3UA_PARAM_TRAFFIC_MODE_TYPE 0x000b
172411677aeSAaron LI #define M3UA_PARAM_ERROR_CODE 0x000c
173411677aeSAaron LI #define M3UA_PARAM_STATUS 0x000d
174411677aeSAaron LI #define M3UA_PARAM_ASP_ID 0x0011
175411677aeSAaron LI #define M3UA_PARAM_AFFECTED_POINT_CODE 0x0012
176411677aeSAaron LI #define M3UA_PARAM_CORR_ID 0x0013
177411677aeSAaron LI 
178411677aeSAaron LI #define M3UA_PARAM_NETWORK_APPEARANCE 0x0200
179411677aeSAaron LI #define M3UA_PARAM_USER 0x0204
180411677aeSAaron LI #define M3UA_PARAM_CONGESTION_INDICATION 0x0205
181411677aeSAaron LI #define M3UA_PARAM_CONCERNED_DST 0x0206
182411677aeSAaron LI #define M3UA_PARAM_ROUTING_KEY 0x0207
183411677aeSAaron LI #define M3UA_PARAM_REG_RESULT 0x0208
184411677aeSAaron LI #define M3UA_PARAM_DEREG_RESULT 0x0209
185411677aeSAaron LI #define M3UA_PARAM_LOCAL_ROUTING_KEY_ID 0x020a
186411677aeSAaron LI #define M3UA_PARAM_DST_POINT_CODE 0x020b
187411677aeSAaron LI #define M3UA_PARAM_SI 0x020c
188411677aeSAaron LI #define M3UA_PARAM_ORIGIN_POINT_CODE_LIST 0x020e
189411677aeSAaron LI #define M3UA_PARAM_PROTO_DATA 0x0210
190411677aeSAaron LI #define M3UA_PARAM_REG_STATUS 0x0212
191411677aeSAaron LI #define M3UA_PARAM_DEREG_STATUS 0x0213
192411677aeSAaron LI 
193411677aeSAaron LI static const struct tok ParamName[] = {
194411677aeSAaron LI   { M3UA_PARAM_INFO, "INFO String" },
195411677aeSAaron LI   { M3UA_PARAM_ROUTING_CTX, "Routing Context" },
196411677aeSAaron LI   { M3UA_PARAM_DIAGNOSTIC, "Diagnostic Info" },
197411677aeSAaron LI   { M3UA_PARAM_HB_DATA, "Heartbeat Data" },
198411677aeSAaron LI   { M3UA_PARAM_TRAFFIC_MODE_TYPE, "Traffic Mode Type" },
199411677aeSAaron LI   { M3UA_PARAM_ERROR_CODE, "Error Code" },
200411677aeSAaron LI   { M3UA_PARAM_STATUS, "Status" },
201411677aeSAaron LI   { M3UA_PARAM_ASP_ID, "ASP Identifier" },
202411677aeSAaron LI   { M3UA_PARAM_AFFECTED_POINT_CODE, "Affected Point Code" },
203411677aeSAaron LI   { M3UA_PARAM_CORR_ID, "Correlation ID" },
204411677aeSAaron LI   { M3UA_PARAM_NETWORK_APPEARANCE, "Network Appearance" },
205411677aeSAaron LI   { M3UA_PARAM_USER, "User/Cause" },
206411677aeSAaron LI   { M3UA_PARAM_CONGESTION_INDICATION, "Congestion Indications" },
207411677aeSAaron LI   { M3UA_PARAM_CONCERNED_DST, "Concerned Destination" },
208411677aeSAaron LI   { M3UA_PARAM_ROUTING_KEY, "Routing Key" },
209411677aeSAaron LI   { M3UA_PARAM_REG_RESULT, "Registration Result" },
210411677aeSAaron LI   { M3UA_PARAM_DEREG_RESULT, "Deregistration Result" },
211411677aeSAaron LI   { M3UA_PARAM_LOCAL_ROUTING_KEY_ID, "Local Routing Key Identifier" },
212411677aeSAaron LI   { M3UA_PARAM_DST_POINT_CODE, "Destination Point Code" },
213411677aeSAaron LI   { M3UA_PARAM_SI, "Service Indicators" },
214411677aeSAaron LI   { M3UA_PARAM_ORIGIN_POINT_CODE_LIST, "Originating Point Code List" },
215411677aeSAaron LI   { M3UA_PARAM_PROTO_DATA, "Protocol Data" },
216411677aeSAaron LI   { M3UA_PARAM_REG_STATUS, "Registration Status" },
217411677aeSAaron LI   { M3UA_PARAM_DEREG_STATUS, "Deregistration Status" },
218411677aeSAaron LI   { 0, NULL }
219411677aeSAaron LI };
220411677aeSAaron LI 
221411677aeSAaron LI static void
tag_value_print(netdissect_options * ndo,const u_char * buf,const uint16_t tag,const uint16_t size)222411677aeSAaron LI tag_value_print(netdissect_options *ndo,
223411677aeSAaron LI                 const u_char *buf, const uint16_t tag, const uint16_t size)
224411677aeSAaron LI {
225411677aeSAaron LI   switch (tag) {
226411677aeSAaron LI   case M3UA_PARAM_NETWORK_APPEARANCE:
227411677aeSAaron LI   case M3UA_PARAM_ROUTING_CTX:
228411677aeSAaron LI   case M3UA_PARAM_CORR_ID:
229411677aeSAaron LI     /* buf and size don't include the header */
230411677aeSAaron LI     if (size < 4)
231411677aeSAaron LI       goto invalid;
232*ed775ee7SAntonio Huete Jimenez     ND_PRINT("0x%08x", GET_BE_U_4(buf));
233411677aeSAaron LI     break;
234411677aeSAaron LI   /* ... */
235411677aeSAaron LI   default:
236*ed775ee7SAntonio Huete Jimenez     ND_PRINT("(length %zu)", size + sizeof(struct m3ua_param_header));
237411677aeSAaron LI   }
238*ed775ee7SAntonio Huete Jimenez   ND_TCHECK_LEN(buf, size);
239411677aeSAaron LI   return;
240411677aeSAaron LI 
241411677aeSAaron LI invalid:
242*ed775ee7SAntonio Huete Jimenez   nd_print_invalid(ndo);
243*ed775ee7SAntonio Huete Jimenez   ND_TCHECK_LEN(buf, size);
244411677aeSAaron LI }
245411677aeSAaron LI 
246411677aeSAaron LI /*
247411677aeSAaron LI  *     0                   1                   2                   3
248411677aeSAaron 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
249411677aeSAaron LI  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
250411677aeSAaron LI  *    |          Parameter Tag        |       Parameter Length        |
251411677aeSAaron LI  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
252411677aeSAaron LI  *    \                                                               \
253411677aeSAaron LI  *    /                       Parameter Value                         /
254411677aeSAaron LI  *    \                                                               \
255411677aeSAaron LI  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
256411677aeSAaron LI  */
257411677aeSAaron LI static void
m3ua_tags_print(netdissect_options * ndo,const u_char * buf,const u_int size)258411677aeSAaron LI m3ua_tags_print(netdissect_options *ndo,
259411677aeSAaron LI                 const u_char *buf, const u_int size)
260411677aeSAaron LI {
261411677aeSAaron LI   const u_char *p = buf;
262411677aeSAaron LI   int align;
263411677aeSAaron LI   uint16_t hdr_tag;
264411677aeSAaron LI   uint16_t hdr_len;
265411677aeSAaron LI 
266411677aeSAaron LI   while (p < buf + size) {
267411677aeSAaron LI     if (p + sizeof(struct m3ua_param_header) > buf + size)
268411677aeSAaron LI       goto invalid;
269411677aeSAaron LI     /* Parameter Tag */
270*ed775ee7SAntonio Huete Jimenez     hdr_tag = GET_BE_U_2(p);
271*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t\t\t%s: ", tok2str(ParamName, "Unknown Parameter (0x%04x)", hdr_tag));
272411677aeSAaron LI     /* Parameter Length */
273*ed775ee7SAntonio Huete Jimenez     hdr_len = GET_BE_U_2(p + 2);
274411677aeSAaron LI     if (hdr_len < sizeof(struct m3ua_param_header))
275411677aeSAaron LI       goto invalid;
276411677aeSAaron LI     /* Parameter Value */
277411677aeSAaron LI     align = (p + hdr_len - buf) % 4;
278411677aeSAaron LI     align = align ? 4 - align : 0;
279*ed775ee7SAntonio Huete Jimenez     ND_TCHECK_LEN(p, hdr_len + align);
280411677aeSAaron LI     tag_value_print(ndo, p, hdr_tag, hdr_len - sizeof(struct m3ua_param_header));
281411677aeSAaron LI     p += hdr_len + align;
282411677aeSAaron LI   }
283411677aeSAaron LI   return;
284411677aeSAaron LI 
285411677aeSAaron LI invalid:
286*ed775ee7SAntonio Huete Jimenez   nd_print_invalid(ndo);
287*ed775ee7SAntonio Huete Jimenez   ND_TCHECK_LEN(buf, size);
288411677aeSAaron LI }
289411677aeSAaron LI 
290411677aeSAaron LI /*
291411677aeSAaron LI  *     0                   1                   2                   3
292411677aeSAaron 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
293411677aeSAaron LI  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
294411677aeSAaron LI  *    |    Version    |   Reserved    | Message Class | Message Type  |
295411677aeSAaron LI  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
296411677aeSAaron LI  *    |                        Message Length                         |
297411677aeSAaron LI  *    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
298411677aeSAaron LI  *    \                                                               \
299411677aeSAaron LI  *    /                                                               /
300411677aeSAaron LI  */
301411677aeSAaron LI void
m3ua_print(netdissect_options * ndo,const u_char * buf,const u_int size)302411677aeSAaron LI m3ua_print(netdissect_options *ndo,
303411677aeSAaron LI            const u_char *buf, const u_int size)
304411677aeSAaron LI {
305411677aeSAaron LI   const struct m3ua_common_header *hdr = (const struct m3ua_common_header *) buf;
306411677aeSAaron LI   const struct tok *dict;
307*ed775ee7SAntonio Huete Jimenez   uint8_t msg_class;
308411677aeSAaron LI 
309*ed775ee7SAntonio Huete Jimenez   ndo->ndo_protocol = "m3ua";
310411677aeSAaron LI   /* size includes the header */
311411677aeSAaron LI   if (size < sizeof(struct m3ua_common_header))
312411677aeSAaron LI     goto invalid;
313*ed775ee7SAntonio Huete Jimenez   ND_TCHECK_SIZE(hdr);
314*ed775ee7SAntonio Huete Jimenez   if (GET_U_1(hdr->v) != M3UA_REL_1_0)
315411677aeSAaron LI     return;
316411677aeSAaron LI 
317*ed775ee7SAntonio Huete Jimenez   msg_class = GET_U_1(hdr->msg_class);
318*ed775ee7SAntonio Huete Jimenez   dict = uint2tokary(m3ua_msgc2tokary, msg_class);
319411677aeSAaron LI 
320*ed775ee7SAntonio Huete Jimenez   ND_PRINT("\n\t\t%s", tok2str(MessageClasses, "Unknown message class %i", msg_class));
321411677aeSAaron LI   if (dict != NULL)
322*ed775ee7SAntonio Huete Jimenez     ND_PRINT(" %s Message",
323*ed775ee7SAntonio Huete Jimenez              tok2str(dict, "Unknown (0x%02x)", GET_U_1(hdr->msg_type)));
324411677aeSAaron LI 
325*ed775ee7SAntonio Huete Jimenez   if (size != GET_BE_U_4(hdr->len))
326*ed775ee7SAntonio Huete Jimenez     ND_PRINT("\n\t\t\t@@@@@@ Corrupted length %u of message @@@@@@",
327*ed775ee7SAntonio Huete Jimenez              GET_BE_U_4(hdr->len));
328411677aeSAaron LI   else
329*ed775ee7SAntonio Huete Jimenez     m3ua_tags_print(ndo, buf + sizeof(struct m3ua_common_header),
330*ed775ee7SAntonio Huete Jimenez                     GET_BE_U_4(hdr->len) - sizeof(struct m3ua_common_header));
331411677aeSAaron LI   return;
332411677aeSAaron LI 
333411677aeSAaron LI invalid:
334*ed775ee7SAntonio Huete Jimenez   nd_print_invalid(ndo);
335*ed775ee7SAntonio Huete Jimenez   ND_TCHECK_LEN(buf, size);
336411677aeSAaron LI }
337411677aeSAaron LI 
338