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