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