]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/tcpdump/print-l2tp.c
ping: use the monotonic clock to measure durations
[FreeBSD/FreeBSD.git] / contrib / tcpdump / print-l2tp.c
1 /*
2  * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that: (1) source code distributions
7  * retain the above copyright notice and this paragraph in its entirety, (2)
8  * distributions including binary code include the above copyright notice and
9  * this paragraph in its entirety in the documentation or other materials
10  * provided with the distribution, and (3) all advertising materials mentioning
11  * features or use of this software display the following acknowledgement:
12  * ``This product includes software developed by the University of California,
13  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14  * the University nor the names of its contributors may be used to endorse
15  * or promote products derived from this software without specific prior
16  * written permission.
17  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20  *
21  * L2TP support contributed by Motonori Shindo (mshindo@mshindo.net)
22  */
23
24 /* \summary: Layer Two Tunneling Protocol (L2TP) printer */
25
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
29
30 #include <netdissect-stdinc.h>
31
32 #include "netdissect.h"
33 #include "extract.h"
34
35 #define L2TP_FLAG_TYPE          0x8000  /* Type (0=Data, 1=Control) */
36 #define L2TP_FLAG_LENGTH        0x4000  /* Length */
37 #define L2TP_FLAG_SEQUENCE      0x0800  /* Sequence */
38 #define L2TP_FLAG_OFFSET        0x0200  /* Offset */
39 #define L2TP_FLAG_PRIORITY      0x0100  /* Priority */
40
41 #define L2TP_VERSION_MASK       0x000f  /* Version Mask */
42 #define L2TP_VERSION_L2F        0x0001  /* L2F */
43 #define L2TP_VERSION_L2TP       0x0002  /* L2TP */
44
45 #define L2TP_AVP_HDR_FLAG_MANDATORY     0x8000  /* Mandatory Flag */
46 #define L2TP_AVP_HDR_FLAG_HIDDEN        0x4000  /* Hidden Flag */
47 #define L2TP_AVP_HDR_LEN_MASK           0x03ff  /* Length Mask */
48
49 #define L2TP_FRAMING_CAP_SYNC_MASK      0x00000001      /* Synchronous */
50 #define L2TP_FRAMING_CAP_ASYNC_MASK     0x00000002      /* Asynchronous */
51
52 #define L2TP_FRAMING_TYPE_SYNC_MASK     0x00000001      /* Synchronous */
53 #define L2TP_FRAMING_TYPE_ASYNC_MASK    0x00000002      /* Asynchronous */
54
55 #define L2TP_BEARER_CAP_DIGITAL_MASK    0x00000001      /* Digital */
56 #define L2TP_BEARER_CAP_ANALOG_MASK     0x00000002      /* Analog */
57
58 #define L2TP_BEARER_TYPE_DIGITAL_MASK   0x00000001      /* Digital */
59 #define L2TP_BEARER_TYPE_ANALOG_MASK    0x00000002      /* Analog */
60
61 /* Authen Type */
62 #define L2TP_AUTHEN_TYPE_RESERVED       0x0000  /* Reserved */
63 #define L2TP_AUTHEN_TYPE_TEXTUAL        0x0001  /* Textual username/password exchange */
64 #define L2TP_AUTHEN_TYPE_CHAP           0x0002  /* PPP CHAP */
65 #define L2TP_AUTHEN_TYPE_PAP            0x0003  /* PPP PAP */
66 #define L2TP_AUTHEN_TYPE_NO_AUTH        0x0004  /* No Authentication */
67 #define L2TP_AUTHEN_TYPE_MSCHAPv1       0x0005  /* MSCHAPv1 */
68
69 #define L2TP_PROXY_AUTH_ID_MASK         0x00ff
70
71 static const char tstr[] = " [|l2tp]";
72
73 #define L2TP_MSGTYPE_SCCRQ      1  /* Start-Control-Connection-Request */
74 #define L2TP_MSGTYPE_SCCRP      2  /* Start-Control-Connection-Reply */
75 #define L2TP_MSGTYPE_SCCCN      3  /* Start-Control-Connection-Connected */
76 #define L2TP_MSGTYPE_STOPCCN    4  /* Stop-Control-Connection-Notification */
77 #define L2TP_MSGTYPE_HELLO      6  /* Hello */
78 #define L2TP_MSGTYPE_OCRQ       7  /* Outgoing-Call-Request */
79 #define L2TP_MSGTYPE_OCRP       8  /* Outgoing-Call-Reply */
80 #define L2TP_MSGTYPE_OCCN       9  /* Outgoing-Call-Connected */
81 #define L2TP_MSGTYPE_ICRQ       10 /* Incoming-Call-Request */
82 #define L2TP_MSGTYPE_ICRP       11 /* Incoming-Call-Reply */
83 #define L2TP_MSGTYPE_ICCN       12 /* Incoming-Call-Connected */
84 #define L2TP_MSGTYPE_CDN        14 /* Call-Disconnect-Notify */
85 #define L2TP_MSGTYPE_WEN        15 /* WAN-Error-Notify */
86 #define L2TP_MSGTYPE_SLI        16 /* Set-Link-Info */
87
88 static const struct tok l2tp_msgtype2str[] = {
89         { L2TP_MSGTYPE_SCCRQ,   "SCCRQ" },
90         { L2TP_MSGTYPE_SCCRP,   "SCCRP" },
91         { L2TP_MSGTYPE_SCCCN,   "SCCCN" },
92         { L2TP_MSGTYPE_STOPCCN, "StopCCN" },
93         { L2TP_MSGTYPE_HELLO,   "HELLO" },
94         { L2TP_MSGTYPE_OCRQ,    "OCRQ" },
95         { L2TP_MSGTYPE_OCRP,    "OCRP" },
96         { L2TP_MSGTYPE_OCCN,    "OCCN" },
97         { L2TP_MSGTYPE_ICRQ,    "ICRQ" },
98         { L2TP_MSGTYPE_ICRP,    "ICRP" },
99         { L2TP_MSGTYPE_ICCN,    "ICCN" },
100         { L2TP_MSGTYPE_CDN,     "CDN" },
101         { L2TP_MSGTYPE_WEN,     "WEN" },
102         { L2TP_MSGTYPE_SLI,     "SLI" },
103         { 0,                    NULL }
104 };
105
106 #define L2TP_AVP_MSGTYPE                0  /* Message Type */
107 #define L2TP_AVP_RESULT_CODE            1  /* Result Code */
108 #define L2TP_AVP_PROTO_VER              2  /* Protocol Version */
109 #define L2TP_AVP_FRAMING_CAP            3  /* Framing Capabilities */
110 #define L2TP_AVP_BEARER_CAP             4  /* Bearer Capabilities */
111 #define L2TP_AVP_TIE_BREAKER            5  /* Tie Breaker */
112 #define L2TP_AVP_FIRM_VER               6  /* Firmware Revision */
113 #define L2TP_AVP_HOST_NAME              7  /* Host Name */
114 #define L2TP_AVP_VENDOR_NAME            8  /* Vendor Name */
115 #define L2TP_AVP_ASSND_TUN_ID           9  /* Assigned Tunnel ID */
116 #define L2TP_AVP_RECV_WIN_SIZE          10 /* Receive Window Size */
117 #define L2TP_AVP_CHALLENGE              11 /* Challenge */
118 #define L2TP_AVP_Q931_CC                12 /* Q.931 Cause Code */
119 #define L2TP_AVP_CHALLENGE_RESP         13 /* Challenge Response */
120 #define L2TP_AVP_ASSND_SESS_ID          14 /* Assigned Session ID */
121 #define L2TP_AVP_CALL_SER_NUM           15 /* Call Serial Number */
122 #define L2TP_AVP_MINIMUM_BPS            16 /* Minimum BPS */
123 #define L2TP_AVP_MAXIMUM_BPS            17 /* Maximum BPS */
124 #define L2TP_AVP_BEARER_TYPE            18 /* Bearer Type */
125 #define L2TP_AVP_FRAMING_TYPE           19 /* Framing Type */
126 #define L2TP_AVP_PACKET_PROC_DELAY      20 /* Packet Processing Delay (OBSOLETE) */
127 #define L2TP_AVP_CALLED_NUMBER          21 /* Called Number */
128 #define L2TP_AVP_CALLING_NUMBER         22 /* Calling Number */
129 #define L2TP_AVP_SUB_ADDRESS            23 /* Sub-Address */
130 #define L2TP_AVP_TX_CONN_SPEED          24 /* (Tx) Connect Speed */
131 #define L2TP_AVP_PHY_CHANNEL_ID         25 /* Physical Channel ID */
132 #define L2TP_AVP_INI_RECV_LCP           26 /* Initial Received LCP CONFREQ */
133 #define L2TP_AVP_LAST_SENT_LCP          27 /* Last Sent LCP CONFREQ */
134 #define L2TP_AVP_LAST_RECV_LCP          28 /* Last Received LCP CONFREQ */
135 #define L2TP_AVP_PROXY_AUTH_TYPE        29 /* Proxy Authen Type */
136 #define L2TP_AVP_PROXY_AUTH_NAME        30 /* Proxy Authen Name */
137 #define L2TP_AVP_PROXY_AUTH_CHAL        31 /* Proxy Authen Challenge */
138 #define L2TP_AVP_PROXY_AUTH_ID          32 /* Proxy Authen ID */
139 #define L2TP_AVP_PROXY_AUTH_RESP        33 /* Proxy Authen Response */
140 #define L2TP_AVP_CALL_ERRORS            34 /* Call Errors */
141 #define L2TP_AVP_ACCM                   35 /* ACCM */
142 #define L2TP_AVP_RANDOM_VECTOR          36 /* Random Vector */
143 #define L2TP_AVP_PRIVATE_GRP_ID         37 /* Private Group ID */
144 #define L2TP_AVP_RX_CONN_SPEED          38 /* (Rx) Connect Speed */
145 #define L2TP_AVP_SEQ_REQUIRED           39 /* Sequencing Required */
146 #define L2TP_AVP_PPP_DISCON_CC          46 /* PPP Disconnect Cause Code */
147
148 static const struct tok l2tp_avp2str[] = {
149         { L2TP_AVP_MSGTYPE,             "MSGTYPE" },
150         { L2TP_AVP_RESULT_CODE,         "RESULT_CODE" },
151         { L2TP_AVP_PROTO_VER,           "PROTO_VER" },
152         { L2TP_AVP_FRAMING_CAP,         "FRAMING_CAP" },
153         { L2TP_AVP_BEARER_CAP,          "BEARER_CAP" },
154         { L2TP_AVP_TIE_BREAKER,         "TIE_BREAKER" },
155         { L2TP_AVP_FIRM_VER,            "FIRM_VER" },
156         { L2TP_AVP_HOST_NAME,           "HOST_NAME" },
157         { L2TP_AVP_VENDOR_NAME,         "VENDOR_NAME" },
158         { L2TP_AVP_ASSND_TUN_ID,        "ASSND_TUN_ID" },
159         { L2TP_AVP_RECV_WIN_SIZE,       "RECV_WIN_SIZE" },
160         { L2TP_AVP_CHALLENGE,           "CHALLENGE" },
161         { L2TP_AVP_Q931_CC,             "Q931_CC", },
162         { L2TP_AVP_CHALLENGE_RESP,      "CHALLENGE_RESP" },
163         { L2TP_AVP_ASSND_SESS_ID,       "ASSND_SESS_ID" },
164         { L2TP_AVP_CALL_SER_NUM,        "CALL_SER_NUM" },
165         { L2TP_AVP_MINIMUM_BPS,         "MINIMUM_BPS" },
166         { L2TP_AVP_MAXIMUM_BPS,         "MAXIMUM_BPS" },
167         { L2TP_AVP_BEARER_TYPE,         "BEARER_TYPE" },
168         { L2TP_AVP_FRAMING_TYPE,        "FRAMING_TYPE" },
169         { L2TP_AVP_PACKET_PROC_DELAY,   "PACKET_PROC_DELAY" },
170         { L2TP_AVP_CALLED_NUMBER,       "CALLED_NUMBER" },
171         { L2TP_AVP_CALLING_NUMBER,      "CALLING_NUMBER" },
172         { L2TP_AVP_SUB_ADDRESS,         "SUB_ADDRESS" },
173         { L2TP_AVP_TX_CONN_SPEED,       "TX_CONN_SPEED" },
174         { L2TP_AVP_PHY_CHANNEL_ID,      "PHY_CHANNEL_ID" },
175         { L2TP_AVP_INI_RECV_LCP,        "INI_RECV_LCP" },
176         { L2TP_AVP_LAST_SENT_LCP,       "LAST_SENT_LCP" },
177         { L2TP_AVP_LAST_RECV_LCP,       "LAST_RECV_LCP" },
178         { L2TP_AVP_PROXY_AUTH_TYPE,     "PROXY_AUTH_TYPE" },
179         { L2TP_AVP_PROXY_AUTH_NAME,     "PROXY_AUTH_NAME" },
180         { L2TP_AVP_PROXY_AUTH_CHAL,     "PROXY_AUTH_CHAL" },
181         { L2TP_AVP_PROXY_AUTH_ID,       "PROXY_AUTH_ID" },
182         { L2TP_AVP_PROXY_AUTH_RESP,     "PROXY_AUTH_RESP" },
183         { L2TP_AVP_CALL_ERRORS,         "CALL_ERRORS" },
184         { L2TP_AVP_ACCM,                "ACCM" },
185         { L2TP_AVP_RANDOM_VECTOR,       "RANDOM_VECTOR" },
186         { L2TP_AVP_PRIVATE_GRP_ID,      "PRIVATE_GRP_ID" },
187         { L2TP_AVP_RX_CONN_SPEED,       "RX_CONN_SPEED" },
188         { L2TP_AVP_SEQ_REQUIRED,        "SEQ_REQUIRED" },
189         { L2TP_AVP_PPP_DISCON_CC,       "PPP_DISCON_CC" },
190         { 0,                            NULL }
191 };
192
193 static const struct tok l2tp_authentype2str[] = {
194         { L2TP_AUTHEN_TYPE_RESERVED,    "Reserved" },
195         { L2TP_AUTHEN_TYPE_TEXTUAL,     "Textual" },
196         { L2TP_AUTHEN_TYPE_CHAP,        "CHAP" },
197         { L2TP_AUTHEN_TYPE_PAP,         "PAP" },
198         { L2TP_AUTHEN_TYPE_NO_AUTH,     "No Auth" },
199         { L2TP_AUTHEN_TYPE_MSCHAPv1,    "MS-CHAPv1" },
200         { 0,                            NULL }
201 };
202
203 #define L2TP_PPP_DISCON_CC_DIRECTION_GLOBAL     0
204 #define L2TP_PPP_DISCON_CC_DIRECTION_AT_PEER    1
205 #define L2TP_PPP_DISCON_CC_DIRECTION_AT_LOCAL   2
206
207 static const struct tok l2tp_cc_direction2str[] = {
208         { L2TP_PPP_DISCON_CC_DIRECTION_GLOBAL,  "global error" },
209         { L2TP_PPP_DISCON_CC_DIRECTION_AT_PEER, "at peer" },
210         { L2TP_PPP_DISCON_CC_DIRECTION_AT_LOCAL,"at local" },
211         { 0,                                    NULL }
212 };
213
214 #if 0
215 static char *l2tp_result_code_StopCCN[] = {
216          "Reserved",
217          "General request to clear control connection",
218          "General error--Error Code indicates the problem",
219          "Control channel already exists",
220          "Requester is not authorized to establish a control channel",
221          "The protocol version of the requester is not supported",
222          "Requester is being shut down",
223          "Finite State Machine error"
224 #define L2TP_MAX_RESULT_CODE_STOPCC_INDEX       8
225 };
226 #endif
227
228 #if 0
229 static char *l2tp_result_code_CDN[] = {
230         "Reserved",
231         "Call disconnected due to loss of carrier",
232         "Call disconnected for the reason indicated in error code",
233         "Call disconnected for administrative reasons",
234         "Call failed due to lack of appropriate facilities being " \
235         "available (temporary condition)",
236         "Call failed due to lack of appropriate facilities being " \
237         "available (permanent condition)",
238         "Invalid destination",
239         "Call failed due to no carrier detected",
240         "Call failed due to detection of a busy signal",
241         "Call failed due to lack of a dial tone",
242         "Call was not established within time allotted by LAC",
243         "Call was connected but no appropriate framing was detected"
244 #define L2TP_MAX_RESULT_CODE_CDN_INDEX  12
245 };
246 #endif
247
248 #if 0
249 static char *l2tp_error_code_general[] = {
250         "No general error",
251         "No control connection exists yet for this LAC-LNS pair",
252         "Length is wrong",
253         "One of the field values was out of range or " \
254         "reserved field was non-zero"
255         "Insufficient resources to handle this operation now",
256         "The Session ID is invalid in this context",
257         "A generic vendor-specific error occurred in the LAC",
258         "Try another"
259 #define L2TP_MAX_ERROR_CODE_GENERAL_INDEX       8
260 };
261 #endif
262
263 /******************************/
264 /* generic print out routines */
265 /******************************/
266 static void
267 print_string(netdissect_options *ndo, const u_char *dat, u_int length)
268 {
269         u_int i;
270         for (i=0; i<length; i++) {
271                 ND_PRINT((ndo, "%c", *dat++));
272         }
273 }
274
275 static void
276 print_octets(netdissect_options *ndo, const u_char *dat, u_int length)
277 {
278         u_int i;
279         for (i=0; i<length; i++) {
280                 ND_PRINT((ndo, "%02x", *dat++));
281         }
282 }
283
284 static void
285 print_16bits_val(netdissect_options *ndo, const uint16_t *dat)
286 {
287         ND_PRINT((ndo, "%u", EXTRACT_16BITS(dat)));
288 }
289
290 static void
291 print_32bits_val(netdissect_options *ndo, const uint32_t *dat)
292 {
293         ND_PRINT((ndo, "%lu", (u_long)EXTRACT_32BITS(dat)));
294 }
295
296 /***********************************/
297 /* AVP-specific print out routines */
298 /***********************************/
299 static void
300 l2tp_msgtype_print(netdissect_options *ndo, const u_char *dat, u_int length)
301 {
302         const uint16_t *ptr = (const uint16_t *)dat;
303
304         if (length < 2) {
305                 ND_PRINT((ndo, "AVP too short"));
306                 return;
307         }
308         ND_PRINT((ndo, "%s", tok2str(l2tp_msgtype2str, "MSGTYPE-#%u",
309             EXTRACT_16BITS(ptr))));
310 }
311
312 static void
313 l2tp_result_code_print(netdissect_options *ndo, const u_char *dat, u_int length)
314 {
315         const uint16_t *ptr = (const uint16_t *)dat;
316
317         /* Result Code */
318         if (length < 2) {
319                 ND_PRINT((ndo, "AVP too short"));
320                 return;
321         }
322         ND_PRINT((ndo, "%u", EXTRACT_16BITS(ptr)));
323         ptr++;
324         length -= 2;
325
326         /* Error Code (opt) */
327         if (length == 0)
328                 return;
329         if (length < 2) {
330                 ND_PRINT((ndo, " AVP too short"));
331                 return;
332         }
333         ND_PRINT((ndo, "/%u", EXTRACT_16BITS(ptr)));
334         ptr++;
335         length -= 2;
336
337         /* Error Message (opt) */
338         if (length == 0)
339                 return;
340         ND_PRINT((ndo, " "));
341         print_string(ndo, (const u_char *)ptr, length);
342 }
343
344 static void
345 l2tp_proto_ver_print(netdissect_options *ndo, const uint16_t *dat, u_int length)
346 {
347         if (length < 2) {
348                 ND_PRINT((ndo, "AVP too short"));
349                 return;
350         }
351         ND_PRINT((ndo, "%u.%u", (EXTRACT_16BITS(dat) >> 8),
352             (EXTRACT_16BITS(dat) & 0xff)));
353 }
354
355 static void
356 l2tp_framing_cap_print(netdissect_options *ndo, const u_char *dat, u_int length)
357 {
358         const uint32_t *ptr = (const uint32_t *)dat;
359
360         if (length < 4) {
361                 ND_PRINT((ndo, "AVP too short"));
362                 return;
363         }
364         if (EXTRACT_32BITS(ptr) &  L2TP_FRAMING_CAP_ASYNC_MASK) {
365                 ND_PRINT((ndo, "A"));
366         }
367         if (EXTRACT_32BITS(ptr) &  L2TP_FRAMING_CAP_SYNC_MASK) {
368                 ND_PRINT((ndo, "S"));
369         }
370 }
371
372 static void
373 l2tp_bearer_cap_print(netdissect_options *ndo, const u_char *dat, u_int length)
374 {
375         const uint32_t *ptr = (const uint32_t *)dat;
376
377         if (length < 4) {
378                 ND_PRINT((ndo, "AVP too short"));
379                 return;
380         }
381         if (EXTRACT_32BITS(ptr) &  L2TP_BEARER_CAP_ANALOG_MASK) {
382                 ND_PRINT((ndo, "A"));
383         }
384         if (EXTRACT_32BITS(ptr) &  L2TP_BEARER_CAP_DIGITAL_MASK) {
385                 ND_PRINT((ndo, "D"));
386         }
387 }
388
389 static void
390 l2tp_q931_cc_print(netdissect_options *ndo, const u_char *dat, u_int length)
391 {
392         if (length < 3) {
393                 ND_PRINT((ndo, "AVP too short"));
394                 return;
395         }
396         print_16bits_val(ndo, (const uint16_t *)dat);
397         ND_PRINT((ndo, ", %02x", dat[2]));
398         dat += 3;
399         length -= 3;
400         if (length != 0) {
401                 ND_PRINT((ndo, " "));
402                 print_string(ndo, dat, length);
403         }
404 }
405
406 static void
407 l2tp_bearer_type_print(netdissect_options *ndo, const u_char *dat, u_int length)
408 {
409         const uint32_t *ptr = (const uint32_t *)dat;
410
411         if (length < 4) {
412                 ND_PRINT((ndo, "AVP too short"));
413                 return;
414         }
415         if (EXTRACT_32BITS(ptr) &  L2TP_BEARER_TYPE_ANALOG_MASK) {
416                 ND_PRINT((ndo, "A"));
417         }
418         if (EXTRACT_32BITS(ptr) &  L2TP_BEARER_TYPE_DIGITAL_MASK) {
419                 ND_PRINT((ndo, "D"));
420         }
421 }
422
423 static void
424 l2tp_framing_type_print(netdissect_options *ndo, const u_char *dat, u_int length)
425 {
426         const uint32_t *ptr = (const uint32_t *)dat;
427
428         if (length < 4) {
429                 ND_PRINT((ndo, "AVP too short"));
430                 return;
431         }
432         if (EXTRACT_32BITS(ptr) &  L2TP_FRAMING_TYPE_ASYNC_MASK) {
433                 ND_PRINT((ndo, "A"));
434         }
435         if (EXTRACT_32BITS(ptr) &  L2TP_FRAMING_TYPE_SYNC_MASK) {
436                 ND_PRINT((ndo, "S"));
437         }
438 }
439
440 static void
441 l2tp_packet_proc_delay_print(netdissect_options *ndo)
442 {
443         ND_PRINT((ndo, "obsolete"));
444 }
445
446 static void
447 l2tp_proxy_auth_type_print(netdissect_options *ndo, const u_char *dat, u_int length)
448 {
449         const uint16_t *ptr = (const uint16_t *)dat;
450
451         if (length < 2) {
452                 ND_PRINT((ndo, "AVP too short"));
453                 return;
454         }
455         ND_PRINT((ndo, "%s", tok2str(l2tp_authentype2str,
456                              "AuthType-#%u", EXTRACT_16BITS(ptr))));
457 }
458
459 static void
460 l2tp_proxy_auth_id_print(netdissect_options *ndo, const u_char *dat, u_int length)
461 {
462         const uint16_t *ptr = (const uint16_t *)dat;
463
464         if (length < 2) {
465                 ND_PRINT((ndo, "AVP too short"));
466                 return;
467         }
468         ND_PRINT((ndo, "%u", EXTRACT_16BITS(ptr) & L2TP_PROXY_AUTH_ID_MASK));
469 }
470
471 static void
472 l2tp_call_errors_print(netdissect_options *ndo, const u_char *dat, u_int length)
473 {
474         const uint16_t *ptr = (const uint16_t *)dat;
475         uint16_t val_h, val_l;
476
477         if (length < 2) {
478                 ND_PRINT((ndo, "AVP too short"));
479                 return;
480         }
481         ptr++;          /* skip "Reserved" */
482         length -= 2;
483
484         if (length < 4) {
485                 ND_PRINT((ndo, "AVP too short"));
486                 return;
487         }
488         val_h = EXTRACT_16BITS(ptr); ptr++; length -= 2;
489         val_l = EXTRACT_16BITS(ptr); ptr++; length -= 2;
490         ND_PRINT((ndo, "CRCErr=%u ", (val_h<<16) + val_l));
491
492         if (length < 4) {
493                 ND_PRINT((ndo, "AVP too short"));
494                 return;
495         }
496         val_h = EXTRACT_16BITS(ptr); ptr++; length -= 2;
497         val_l = EXTRACT_16BITS(ptr); ptr++; length -= 2;
498         ND_PRINT((ndo, "FrameErr=%u ", (val_h<<16) + val_l));
499
500         if (length < 4) {
501                 ND_PRINT((ndo, "AVP too short"));
502                 return;
503         }
504         val_h = EXTRACT_16BITS(ptr); ptr++; length -= 2;
505         val_l = EXTRACT_16BITS(ptr); ptr++; length -= 2;
506         ND_PRINT((ndo, "HardOver=%u ", (val_h<<16) + val_l));
507
508         if (length < 4) {
509                 ND_PRINT((ndo, "AVP too short"));
510                 return;
511         }
512         val_h = EXTRACT_16BITS(ptr); ptr++; length -= 2;
513         val_l = EXTRACT_16BITS(ptr); ptr++; length -= 2;
514         ND_PRINT((ndo, "BufOver=%u ", (val_h<<16) + val_l));
515
516         if (length < 4) {
517                 ND_PRINT((ndo, "AVP too short"));
518                 return;
519         }
520         val_h = EXTRACT_16BITS(ptr); ptr++; length -= 2;
521         val_l = EXTRACT_16BITS(ptr); ptr++; length -= 2;
522         ND_PRINT((ndo, "Timeout=%u ", (val_h<<16) + val_l));
523
524         if (length < 4) {
525                 ND_PRINT((ndo, "AVP too short"));
526                 return;
527         }
528         val_h = EXTRACT_16BITS(ptr); ptr++;
529         val_l = EXTRACT_16BITS(ptr); ptr++;
530         ND_PRINT((ndo, "AlignErr=%u ", (val_h<<16) + val_l));
531 }
532
533 static void
534 l2tp_accm_print(netdissect_options *ndo, const u_char *dat, u_int length)
535 {
536         const uint16_t *ptr = (const uint16_t *)dat;
537         uint16_t val_h, val_l;
538
539         if (length < 2) {
540                 ND_PRINT((ndo, "AVP too short"));
541                 return;
542         }
543         ptr++;          /* skip "Reserved" */
544         length -= 2;
545
546         if (length < 4) {
547                 ND_PRINT((ndo, "AVP too short"));
548                 return;
549         }
550         val_h = EXTRACT_16BITS(ptr); ptr++; length -= 2;
551         val_l = EXTRACT_16BITS(ptr); ptr++; length -= 2;
552         ND_PRINT((ndo, "send=%08x ", (val_h<<16) + val_l));
553
554         if (length < 4) {
555                 ND_PRINT((ndo, "AVP too short"));
556                 return;
557         }
558         val_h = EXTRACT_16BITS(ptr); ptr++;
559         val_l = EXTRACT_16BITS(ptr); ptr++;
560         ND_PRINT((ndo, "recv=%08x ", (val_h<<16) + val_l));
561 }
562
563 static void
564 l2tp_ppp_discon_cc_print(netdissect_options *ndo, const u_char *dat, u_int length)
565 {
566         const uint16_t *ptr = (const uint16_t *)dat;
567
568         if (length < 5) {
569                 ND_PRINT((ndo, "AVP too short"));
570                 return;
571         }
572         /* Disconnect Code */
573         ND_PRINT((ndo, "%04x, ", EXTRACT_16BITS(dat)));
574         dat += 2;
575         length -= 2;
576         /* Control Protocol Number */
577         ND_PRINT((ndo, "%04x ",  EXTRACT_16BITS(dat)));
578         dat += 2;
579         length -= 2;
580         /* Direction */
581         ND_PRINT((ndo, "%s", tok2str(l2tp_cc_direction2str,
582                              "Direction-#%u", EXTRACT_8BITS(ptr))));
583         ptr++;
584         length--;
585
586         if (length != 0) {
587                 ND_PRINT((ndo, " "));
588                 print_string(ndo, (const u_char *)ptr, length);
589         }
590 }
591
592 static void
593 l2tp_avp_print(netdissect_options *ndo, const u_char *dat, int length)
594 {
595         u_int len;
596         const uint16_t *ptr = (const uint16_t *)dat;
597         uint16_t attr_type;
598         int hidden = FALSE;
599
600         if (length <= 0) {
601                 return;
602         }
603
604         ND_PRINT((ndo, " "));
605
606         ND_TCHECK(*ptr);        /* Flags & Length */
607         len = EXTRACT_16BITS(ptr) & L2TP_AVP_HDR_LEN_MASK;
608
609         /* If it is not long enough to contain the header, we'll give up. */
610         if (len < 6)
611                 goto trunc;
612
613         /* If it goes past the end of the remaining length of the packet,
614            we'll give up. */
615         if (len > (u_int)length)
616                 goto trunc;
617
618         /* If it goes past the end of the remaining length of the captured
619            data, we'll give up. */
620         ND_TCHECK2(*ptr, len);
621
622         /*
623          * After this point, we don't need to check whether we go past
624          * the length of the captured data; however, we *do* need to
625          * check whether we go past the end of the AVP.
626          */
627
628         if (EXTRACT_16BITS(ptr) & L2TP_AVP_HDR_FLAG_MANDATORY) {
629                 ND_PRINT((ndo, "*"));
630         }
631         if (EXTRACT_16BITS(ptr) & L2TP_AVP_HDR_FLAG_HIDDEN) {
632                 hidden = TRUE;
633                 ND_PRINT((ndo, "?"));
634         }
635         ptr++;
636
637         if (EXTRACT_16BITS(ptr)) {
638                 /* Vendor Specific Attribute */
639                 ND_PRINT((ndo, "VENDOR%04x:", EXTRACT_16BITS(ptr))); ptr++;
640                 ND_PRINT((ndo, "ATTR%04x", EXTRACT_16BITS(ptr))); ptr++;
641                 ND_PRINT((ndo, "("));
642                 print_octets(ndo, (const u_char *)ptr, len-6);
643                 ND_PRINT((ndo, ")"));
644         } else {
645                 /* IETF-defined Attributes */
646                 ptr++;
647                 attr_type = EXTRACT_16BITS(ptr); ptr++;
648                 ND_PRINT((ndo, "%s", tok2str(l2tp_avp2str, "AVP-#%u", attr_type)));
649                 ND_PRINT((ndo, "("));
650                 if (hidden) {
651                         ND_PRINT((ndo, "???"));
652                 } else {
653                         switch (attr_type) {
654                         case L2TP_AVP_MSGTYPE:
655                                 l2tp_msgtype_print(ndo, (const u_char *)ptr, len-6);
656                                 break;
657                         case L2TP_AVP_RESULT_CODE:
658                                 l2tp_result_code_print(ndo, (const u_char *)ptr, len-6);
659                                 break;
660                         case L2TP_AVP_PROTO_VER:
661                                 l2tp_proto_ver_print(ndo, ptr, len-6);
662                                 break;
663                         case L2TP_AVP_FRAMING_CAP:
664                                 l2tp_framing_cap_print(ndo, (const u_char *)ptr, len-6);
665                                 break;
666                         case L2TP_AVP_BEARER_CAP:
667                                 l2tp_bearer_cap_print(ndo, (const u_char *)ptr, len-6);
668                                 break;
669                         case L2TP_AVP_TIE_BREAKER:
670                                 if (len-6 < 8) {
671                                         ND_PRINT((ndo, "AVP too short"));
672                                         break;
673                                 }
674                                 print_octets(ndo, (const u_char *)ptr, 8);
675                                 break;
676                         case L2TP_AVP_FIRM_VER:
677                         case L2TP_AVP_ASSND_TUN_ID:
678                         case L2TP_AVP_RECV_WIN_SIZE:
679                         case L2TP_AVP_ASSND_SESS_ID:
680                                 if (len-6 < 2) {
681                                         ND_PRINT((ndo, "AVP too short"));
682                                         break;
683                                 }
684                                 print_16bits_val(ndo, ptr);
685                                 break;
686                         case L2TP_AVP_HOST_NAME:
687                         case L2TP_AVP_VENDOR_NAME:
688                         case L2TP_AVP_CALLING_NUMBER:
689                         case L2TP_AVP_CALLED_NUMBER:
690                         case L2TP_AVP_SUB_ADDRESS:
691                         case L2TP_AVP_PROXY_AUTH_NAME:
692                         case L2TP_AVP_PRIVATE_GRP_ID:
693                                 print_string(ndo, (const u_char *)ptr, len-6);
694                                 break;
695                         case L2TP_AVP_CHALLENGE:
696                         case L2TP_AVP_INI_RECV_LCP:
697                         case L2TP_AVP_LAST_SENT_LCP:
698                         case L2TP_AVP_LAST_RECV_LCP:
699                         case L2TP_AVP_PROXY_AUTH_CHAL:
700                         case L2TP_AVP_PROXY_AUTH_RESP:
701                         case L2TP_AVP_RANDOM_VECTOR:
702                                 print_octets(ndo, (const u_char *)ptr, len-6);
703                                 break;
704                         case L2TP_AVP_Q931_CC:
705                                 l2tp_q931_cc_print(ndo, (const u_char *)ptr, len-6);
706                                 break;
707                         case L2TP_AVP_CHALLENGE_RESP:
708                                 if (len-6 < 16) {
709                                         ND_PRINT((ndo, "AVP too short"));
710                                         break;
711                                 }
712                                 print_octets(ndo, (const u_char *)ptr, 16);
713                                 break;
714                         case L2TP_AVP_CALL_SER_NUM:
715                         case L2TP_AVP_MINIMUM_BPS:
716                         case L2TP_AVP_MAXIMUM_BPS:
717                         case L2TP_AVP_TX_CONN_SPEED:
718                         case L2TP_AVP_PHY_CHANNEL_ID:
719                         case L2TP_AVP_RX_CONN_SPEED:
720                                 if (len-6 < 4) {
721                                         ND_PRINT((ndo, "AVP too short"));
722                                         break;
723                                 }
724                                 print_32bits_val(ndo, (const uint32_t *)ptr);
725                                 break;
726                         case L2TP_AVP_BEARER_TYPE:
727                                 l2tp_bearer_type_print(ndo, (const u_char *)ptr, len-6);
728                                 break;
729                         case L2TP_AVP_FRAMING_TYPE:
730                                 l2tp_framing_type_print(ndo, (const u_char *)ptr, len-6);
731                                 break;
732                         case L2TP_AVP_PACKET_PROC_DELAY:
733                                 l2tp_packet_proc_delay_print(ndo);
734                                 break;
735                         case L2TP_AVP_PROXY_AUTH_TYPE:
736                                 l2tp_proxy_auth_type_print(ndo, (const u_char *)ptr, len-6);
737                                 break;
738                         case L2TP_AVP_PROXY_AUTH_ID:
739                                 l2tp_proxy_auth_id_print(ndo, (const u_char *)ptr, len-6);
740                                 break;
741                         case L2TP_AVP_CALL_ERRORS:
742                                 l2tp_call_errors_print(ndo, (const u_char *)ptr, len-6);
743                                 break;
744                         case L2TP_AVP_ACCM:
745                                 l2tp_accm_print(ndo, (const u_char *)ptr, len-6);
746                                 break;
747                         case L2TP_AVP_SEQ_REQUIRED:
748                                 break;  /* No Attribute Value */
749                         case L2TP_AVP_PPP_DISCON_CC:
750                                 l2tp_ppp_discon_cc_print(ndo, (const u_char *)ptr, len-6);
751                                 break;
752                         default:
753                                 break;
754                         }
755                 }
756                 ND_PRINT((ndo, ")"));
757         }
758
759         l2tp_avp_print(ndo, dat+len, length-len);
760         return;
761
762  trunc:
763         ND_PRINT((ndo, "|..."));
764 }
765
766
767 void
768 l2tp_print(netdissect_options *ndo, const u_char *dat, u_int length)
769 {
770         const u_char *ptr = dat;
771         u_int cnt = 0;                  /* total octets consumed */
772         uint16_t pad;
773         int flag_t, flag_l, flag_s, flag_o;
774         uint16_t l2tp_len;
775
776         flag_t = flag_l = flag_s = flag_o = FALSE;
777
778         ND_TCHECK2(*ptr, 2);    /* Flags & Version */
779         if ((EXTRACT_16BITS(ptr) & L2TP_VERSION_MASK) == L2TP_VERSION_L2TP) {
780                 ND_PRINT((ndo, " l2tp:"));
781         } else if ((EXTRACT_16BITS(ptr) & L2TP_VERSION_MASK) == L2TP_VERSION_L2F) {
782                 ND_PRINT((ndo, " l2f:"));
783                 return;         /* nothing to do */
784         } else {
785                 ND_PRINT((ndo, " Unknown Version, neither L2F(1) nor L2TP(2)"));
786                 return;         /* nothing we can do */
787         }
788
789         ND_PRINT((ndo, "["));
790         if (EXTRACT_16BITS(ptr) & L2TP_FLAG_TYPE) {
791                 flag_t = TRUE;
792                 ND_PRINT((ndo, "T"));
793         }
794         if (EXTRACT_16BITS(ptr) & L2TP_FLAG_LENGTH) {
795                 flag_l = TRUE;
796                 ND_PRINT((ndo, "L"));
797         }
798         if (EXTRACT_16BITS(ptr) & L2TP_FLAG_SEQUENCE) {
799                 flag_s = TRUE;
800                 ND_PRINT((ndo, "S"));
801         }
802         if (EXTRACT_16BITS(ptr) & L2TP_FLAG_OFFSET) {
803                 flag_o = TRUE;
804                 ND_PRINT((ndo, "O"));
805         }
806         if (EXTRACT_16BITS(ptr) & L2TP_FLAG_PRIORITY)
807                 ND_PRINT((ndo, "P"));
808         ND_PRINT((ndo, "]"));
809
810         ptr += 2;
811         cnt += 2;
812
813         if (flag_l) {
814                 ND_TCHECK2(*ptr, 2);    /* Length */
815                 l2tp_len = EXTRACT_16BITS(ptr);
816                 ptr += 2;
817                 cnt += 2;
818         } else {
819                 l2tp_len = 0;
820         }
821
822         ND_TCHECK2(*ptr, 2);            /* Tunnel ID */
823         ND_PRINT((ndo, "(%u/", EXTRACT_16BITS(ptr)));
824         ptr += 2;
825         cnt += 2;
826         ND_TCHECK2(*ptr, 2);            /* Session ID */
827         ND_PRINT((ndo, "%u)",  EXTRACT_16BITS(ptr)));
828         ptr += 2;
829         cnt += 2;
830
831         if (flag_s) {
832                 ND_TCHECK2(*ptr, 2);    /* Ns */
833                 ND_PRINT((ndo, "Ns=%u,", EXTRACT_16BITS(ptr)));
834                 ptr += 2;
835                 cnt += 2;
836                 ND_TCHECK2(*ptr, 2);    /* Nr */
837                 ND_PRINT((ndo, "Nr=%u",  EXTRACT_16BITS(ptr)));
838                 ptr += 2;
839                 cnt += 2;
840         }
841
842         if (flag_o) {
843                 ND_TCHECK2(*ptr, 2);    /* Offset Size */
844                 pad =  EXTRACT_16BITS(ptr);
845                 ptr += (2 + pad);
846                 cnt += (2 + pad);
847         }
848
849         if (flag_l) {
850                 if (length < l2tp_len) {
851                         ND_PRINT((ndo, " Length %u larger than packet", l2tp_len));
852                         return;
853                 }
854                 length = l2tp_len;
855         }
856         if (length < cnt) {
857                 ND_PRINT((ndo, " Length %u smaller than header length", length));
858                 return;
859         }
860         if (flag_t) {
861                 if (!flag_l) {
862                         ND_PRINT((ndo, " No length"));
863                         return;
864                 }
865                 if (length - cnt == 0) {
866                         ND_PRINT((ndo, " ZLB"));
867                 } else {
868                         l2tp_avp_print(ndo, ptr, length - cnt);
869                 }
870         } else {
871                 ND_PRINT((ndo, " {"));
872                 ppp_print(ndo, ptr, length - cnt);
873                 ND_PRINT((ndo, "}"));
874         }
875
876         return;
877
878  trunc:
879         ND_PRINT((ndo, "%s", tstr));
880 }