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