Bug Summary

File:src/usr.sbin/tcpdump/print-l2tp.c
Warning:line 661, column 3
Value stored to 'flag_p' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple amd64-unknown-openbsd7.0 -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name print-l2tp.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 1 -pic-is-pie -mframe-pointer=all -relaxed-aliasing -fno-rounding-math -mconstructor-aliases -munwind-tables -target-cpu x86-64 -target-feature +retpoline-indirect-calls -target-feature +retpoline-indirect-branches -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/usr/src/usr.sbin/tcpdump/obj -resource-dir /usr/local/lib/clang/13.0.0 -I /usr/src/usr.sbin/tcpdump/../../sbin/pfctl -I /usr/src/usr.sbin/tcpdump/../hostapd -I /usr/src/usr.sbin/tcpdump/../../lib/libpcap -D CSLIP -D PPP -D HAVE_FDDI -D ETHER_SERVICE -D HAVE_ETHER_NTOHOST -D INET6 -I /usr/src/usr.sbin/tcpdump/../../sbin/pfctl -D FAKE_PF_KERNEL -internal-isystem /usr/local/lib/clang/13.0.0/include -internal-externc-isystem /usr/include -O2 -fdebug-compilation-dir=/usr/src/usr.sbin/tcpdump/obj -ferror-limit 19 -fwrapv -D_RET_PROTECTOR -ret-protector -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-valloc -fno-builtin-free -fno-builtin-strdup -fno-builtin-strndup -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /home/ben/Projects/vmm/scan-build/2022-01-12-194120-40624-1 -x c /usr/src/usr.sbin/tcpdump/print-l2tp.c
1/* $OpenBSD: print-l2tp.c,v 1.11 2022/01/05 05:46:18 dlg Exp $ */
2
3/*
4 * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that: (1) source code distributions
9 * retain the above copyright notice and this paragraph in its entirety, (2)
10 * distributions including binary code include the above copyright notice and
11 * this paragraph in its entirety in the documentation or other materials
12 * provided with the distribution, and (3) all advertising materials mentioning
13 * features or use of this software display the following acknowledgement:
14 * ``This product includes software developed by the University of California,
15 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
16 * the University nor the names of its contributors may be used to endorse
17 * or promote products derived from this software without specific prior
18 * written permission.
19 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
20 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
22 *
23 * L2TP support contributed by Motonori Shindo (mshindo@ascend.co.jp)
24 */
25
26#include <sys/types.h>
27#include <stdio.h>
28#include <string.h>
29
30#include "l2tp.h"
31#include "interface.h"
32
33static char tstr[] = " [|l2tp]";
34
35#ifndef TRUE1
36#define TRUE1 1
37#endif
38
39#ifndef FALSE0
40#define FALSE0 0
41#endif
42
43static u_char *l2tp_message_type_string[] = {
44 "RESERVED_0", /* 0 Reserved */
45 "SCCRQ", /* 1 Start-Control-Connection-Request */
46 "SCCRP", /* 2 Start-Control-Connection-Reply */
47 "SCCCN", /* 3 Start-Control-Connection-Connected */
48 "StopCCN", /* 4 Stop-Control-Connection-Notification */
49 "RESERVED_5", /* 5 Reserved */
50 "HELLO", /* 6 Hello */
51 "OCRQ", /* 7 Outgoing-Call-Request */
52 "OCRP", /* 8 Outgoing-Call-Reply */
53 "OCCN", /* 9 Outgoing-Call-Connected */
54 "ICRQ", /* 10 Incoming-Call-Request */
55 "ICRP", /* 11 Incoming-Call-Reply */
56 "ICCN", /* 12 Incoming-Call-Connected */
57 "RESERVED_13", /* 13 Reserved */
58 "CDN", /* 14 Call-Disconnect-Notify */
59 "WEN", /* 15 WAN-Error-Notify */
60 "SLI" /* 16 Set-Link-Info */
61#define L2TP_MAX_MSGTYPE_INDEX17 17
62};
63
64static void l2tp_msgtype_print(const u_char *dat, u_int length);
65static void l2tp_result_code_print(const u_char *dat, u_int length);
66static void l2tp_proto_ver_print(const u_char *dat, u_int length);
67static void l2tp_framing_cap_print(const u_char *dat, u_int length);
68static void l2tp_bearer_cap_print(const u_char *dat, u_int length);
69static void l2tp_tie_breaker_print(const u_char *dat, u_int length);
70static void l2tp_firm_ver_print(const u_char *dat, u_int length);
71static void l2tp_host_name_print(const u_char *dat, u_int length);
72static void l2tp_vendor_name_print(const u_char *dat, u_int length);
73static void l2tp_assnd_tun_id_print(const u_char *dat, u_int length);
74static void l2tp_recv_win_size_print(const u_char *dat, u_int length);
75static void l2tp_challenge_print(const u_char *dat, u_int length);
76static void l2tp_q931_cc_print(const u_char *dat, u_int length);
77static void l2tp_challenge_resp_print(const u_char *dat, u_int length);
78static void l2tp_assnd_sess_id_print(const u_char *dat, u_int length);
79static void l2tp_call_ser_num_print(const u_char *dat, u_int length);
80static void l2tp_minimum_bps_print(const u_char *dat, u_int length);
81static void l2tp_maximum_bps_print(const u_char *dat, u_int length);
82static void l2tp_bearer_type_print(const u_char *dat, u_int length);
83static void l2tp_framing_type_print(const u_char *dat, u_int length);
84static void l2tp_packet_proc_delay_print(const u_char *dat, u_int length);
85static void l2tp_called_number_print(const u_char *dat, u_int length);
86static void l2tp_calling_number_print(const u_char *dat, u_int length);
87static void l2tp_sub_address_print(const u_char *dat, u_int length);
88static void l2tp_tx_conn_speed_print(const u_char *dat, u_int length);
89static void l2tp_phy_channel_id_print(const u_char *dat, u_int length);
90static void l2tp_ini_recv_lcp_print(const u_char *dat, u_int length);
91static void l2tp_last_sent_lcp_print(const u_char *dat, u_int length);
92static void l2tp_last_recv_lcp_print(const u_char *dat, u_int length);
93static void l2tp_proxy_auth_type_print(const u_char *dat, u_int length);
94static void l2tp_proxy_auth_name_print(const u_char *dat, u_int length);
95static void l2tp_proxy_auth_chal_print(const u_char *dat, u_int length);
96static void l2tp_proxy_auth_id_print(const u_char *dat, u_int length);
97static void l2tp_proxy_auth_resp_print(const u_char *dat, u_int length);
98static void l2tp_call_errors_print(const u_char *dat, u_int length);
99static void l2tp_accm_print(const u_char *dat, u_int length);
100static void l2tp_random_vector_print(const u_char *dat, u_int length);
101static void l2tp_private_grp_id_print(const u_char *dat, u_int length);
102static void l2tp_rx_conn_speed_print(const u_char *dat, u_int length);
103static void l2tp_seq_required_print(const u_char *dat, u_int length);
104static void l2tp_avp_print(const u_char *dat, u_int length);
105
106static struct l2tp_avp_vec l2tp_avp[] = {
107 {"MSGTYPE", l2tp_msgtype_print}, /* 0 Message Type */
108 {"RESULT_CODE", l2tp_result_code_print}, /* 1 Result Code */
109 {"PROTO_VER", l2tp_proto_ver_print}, /* 2 Protocol Version */
110 {"FRAMING_CAP", l2tp_framing_cap_print}, /* 3 Framing Capabilities */
111 {"BEARER_CAP", l2tp_bearer_cap_print}, /* 4 Bearer Capabilities */
112 {"TIE_BREAKER", l2tp_tie_breaker_print}, /* 5 Tie Breaker */
113 {"FIRM_VER", l2tp_firm_ver_print}, /* 6 Firmware Revision */
114 {"HOST_NAME", l2tp_host_name_print}, /* 7 Host Name */
115 {"VENDOR_NAME", l2tp_vendor_name_print}, /* 8 Vendor Name */
116 {"ASSND_TUN_ID", l2tp_assnd_tun_id_print}, /* 9 Assigned Tunnel ID */
117 {"RECV_WIN_SIZE", l2tp_recv_win_size_print}, /* 10 Receive Window Size */
118 {"CHALLENGE", l2tp_challenge_print}, /* 11 Challenge */
119 {"Q931_CC", l2tp_q931_cc_print}, /* 12 Q.931 Cause Code */
120 {"CHALLENGE_RESP", l2tp_challenge_resp_print},/* 13 Challenge Response */
121 {"ASSND_SESS_ID", l2tp_assnd_sess_id_print}, /* 14 Assigned Session ID */
122 {"CALL_SER_NUM", l2tp_call_ser_num_print}, /* 15 Call Serial Number */
123 {"MINIMUM_BPS", l2tp_minimum_bps_print},/* 16 Minimum BPS */
124 {"MAXIMUM_BPS", l2tp_maximum_bps_print}, /* 17 Maximum BPS */
125 {"BEARER_TYPE", l2tp_bearer_type_print},/* 18 Bearer Type */
126 {"FRAMING_TYPE", l2tp_framing_type_print}, /* 19 Framing Type */
127 {"PACKET_PROC_DELAY", l2tp_packet_proc_delay_print}, /* 20 Packet Processing Delay (OBSOLETE) */
128 {"CALLED_NUMBER", l2tp_called_number_print}, /* 21 Called Number */
129 {"CALLING_NUMBER", l2tp_calling_number_print},/* 22 Calling Number */
130 {"SUB_ADDRESS", l2tp_sub_address_print},/* 23 Sub-Address */
131 {"TX_CONN_SPEED", l2tp_tx_conn_speed_print}, /* 24 (Tx) Connect Speed */
132 {"PHY_CHANNEL_ID", l2tp_phy_channel_id_print},/* 25 Physical Channel ID */
133 {"INI_RECV_LCP", l2tp_ini_recv_lcp_print}, /* 26 Initial Received LCP CONFREQ */
134 {"LAST_SENT_LCP", l2tp_last_sent_lcp_print}, /* 27 Last Sent LCP CONFREQ */
135 {"LAST_RECV_LCP", l2tp_last_recv_lcp_print}, /* 28 Last Received LCP CONFREQ */
136 {"PROXY_AUTH_TYPE", l2tp_proxy_auth_type_print},/* 29 Proxy Authen Type */
137 {"PROXY_AUTH_NAME", l2tp_proxy_auth_name_print},/* 30 Proxy Authen Name */
138 {"PROXY_AUTH_CHAL", l2tp_proxy_auth_chal_print},/* 31 Proxy Authen Challenge */
139 {"PROXY_AUTH_ID", l2tp_proxy_auth_id_print}, /* 32 Proxy Authen ID */
140 {"PROXY_AUTH_RESP", l2tp_proxy_auth_resp_print},/* 33 Proxy Authen Response */
141 {"CALL_ERRORS", l2tp_call_errors_print}, /* 34 Call Errors */
142 {"ACCM", l2tp_accm_print}, /* 35 ACCM */
143 {"RANDOM_VECTOR", l2tp_random_vector_print}, /* 36 Random Vector */
144 {"PRIVATE_GRP_ID", l2tp_private_grp_id_print},/* 37 Private Group ID */
145 {"RX_CONN_SPEED", l2tp_rx_conn_speed_print}, /* 38 (Rx) Connect Speed */
146 {"SEQ_REQUIRED", l2tp_seq_required_print}, /* 39 Sequencing Required */
147#define L2TP_MAX_AVP_INDEX40 40
148};
149
150#if 0
151static char *l2tp_result_code_StopCCN[] = {
152 "Reserved",
153 "General request to clear control connection",
154 "General error--Error Code indicates the problem",
155 "Control channel already exists",
156 "Requester is not authorized to establish a control channel",
157 "The protocol version of the requester is not supported",
158 "Requester is being shut down",
159 "Finite State Machine error"
160#define L2TP_MAX_RESULT_CODE_STOPCC_INDEX 8
161};
162#endif
163
164#if 0
165static char *l2tp_result_code_CDN[] = {
166 "Reserved",
167 "Call disconnected due to loss of carrier",
168 "Call disconnected for the reason indicated in error code",
169 "Call disconnected for administrative reasons",
170 "Call failed due to lack of appropriate facilities being " \
171 "available (temporary condition)",
172 "Call failed due to lack of appropriate facilities being " \
173 "available (permanent condition)",
174 "Invalid destination",
175 "Call failed due to no carrier detected",
176 "Call failed due to detection of a busy signal",
177 "Call failed due to lack of a dial tone",
178 "Call was not established within time allotted by LAC",
179 "Call was connected but no appropriate framing was detected"
180#define L2TP_MAX_RESULT_CODE_CDN_INDEX 12
181};
182#endif
183
184#if 0
185static char *l2tp_error_code_general[] = {
186 "No general error",
187 "No control connection exists yet for this LAC-LNS pair",
188 "Length is wrong",
189 "One of the field values was out of range or " \
190 "reserved field was non-zero"
191 "Insufficient resources to handle this operation now",
192 "The Session ID is invalid in this context",
193 "A generic vendor-specific error occurred in the LAC",
194 "Try another"
195#define L2TP_MAX_ERROR_CODE_GENERAL_INDEX 8
196};
197#endif
198
199/******************************/
200/* generic print out routines */
201/******************************/
202static void
203print_string(const u_char *dat, u_int length)
204{
205 int i;
206 for (i=0; i<length; i++) {
207 printf("%c", *dat++);
208 }
209}
210
211static void
212print_octets(const u_char *dat, u_int length)
213{
214 int i;
215 for (i=0; i<length; i++) {
216 printf("%02x", *dat++);
217 }
218}
219
220static void
221print_short(const u_short *dat)
222{
223 printf("%u", ntohs(*dat)(__uint16_t)(__builtin_constant_p(*dat) ? (__uint16_t)(((__uint16_t
)(*dat) & 0xffU) << 8 | ((__uint16_t)(*dat) & 0xff00U
) >> 8) : __swap16md(*dat))
);
224}
225
226static void
227print_int(const u_int *dat)
228{
229 printf("%lu", (u_long)ntohl(*dat)(__uint32_t)(__builtin_constant_p(*dat) ? (__uint32_t)(((__uint32_t
)(*dat) & 0xff) << 24 | ((__uint32_t)(*dat) & 0xff00
) << 8 | ((__uint32_t)(*dat) & 0xff0000) >> 8
| ((__uint32_t)(*dat) & 0xff000000) >> 24) : __swap32md
(*dat))
);
230}
231
232/**********************************/
233/* AVP-specific print out routines*/
234/**********************************/
235static void
236l2tp_msgtype_print(const u_char *dat, u_int length)
237{
238 u_short *ptr = (u_short *)dat;
239
240 if (ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
< L2TP_MAX_MSGTYPE_INDEX17) {
241 printf("%s", l2tp_message_type_string[ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
]);
242 }
243}
244
245static void
246l2tp_result_code_print(const u_char *dat, u_int length)
247{
248 /* we just print out the result and error code number */
249 u_short *ptr = (u_short *)dat;
250
251 if (length == 2) { /* result code */
252 printf("%d", ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
);
253 } else if (length == 4) { /* result & error code */
254 printf("%d/%d", ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
, ntohs(*(ptr+1))(__uint16_t)(__builtin_constant_p(*(ptr+1)) ? (__uint16_t)(((
__uint16_t)(*(ptr+1)) & 0xffU) << 8 | ((__uint16_t)
(*(ptr+1)) & 0xff00U) >> 8) : __swap16md(*(ptr+1)))
);
255 } else if (length > 4) { /* result & error code & msg */
256 printf("%u/%u ", ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
, ntohs(*(ptr+1))(__uint16_t)(__builtin_constant_p(*(ptr+1)) ? (__uint16_t)(((
__uint16_t)(*(ptr+1)) & 0xffU) << 8 | ((__uint16_t)
(*(ptr+1)) & 0xff00U) >> 8) : __swap16md(*(ptr+1)))
);
257 print_string((u_char *)(ptr+2), length - 4);
258 }
259}
260
261static void
262l2tp_proto_ver_print(const u_char *dat, u_int length)
263{
264 printf("%d.%d", *dat, *(dat+1));
265}
266
267
268static void
269l2tp_framing_cap_print(const u_char *dat, u_int length)
270{
271 u_int *ptr = (u_int *)dat;
272
273 if (ntohl(*ptr)(__uint32_t)(__builtin_constant_p(*ptr) ? (__uint32_t)(((__uint32_t
)(*ptr) & 0xff) << 24 | ((__uint32_t)(*ptr) & 0xff00
) << 8 | ((__uint32_t)(*ptr) & 0xff0000) >> 8
| ((__uint32_t)(*ptr) & 0xff000000) >> 24) : __swap32md
(*ptr))
& L2TP_FRAMING_CAP_ASYNC_MASK0x00000002) {
274 printf("A");
275 }
276 if (ntohl(*ptr)(__uint32_t)(__builtin_constant_p(*ptr) ? (__uint32_t)(((__uint32_t
)(*ptr) & 0xff) << 24 | ((__uint32_t)(*ptr) & 0xff00
) << 8 | ((__uint32_t)(*ptr) & 0xff0000) >> 8
| ((__uint32_t)(*ptr) & 0xff000000) >> 24) : __swap32md
(*ptr))
& L2TP_FRAMING_CAP_SYNC_MASK0x00000001) {
277 printf("S");
278 }
279}
280
281static void
282l2tp_bearer_cap_print(const u_char *dat, u_int length)
283{
284 u_int *ptr = (u_int *)dat;
285
286 if (ntohl(*ptr)(__uint32_t)(__builtin_constant_p(*ptr) ? (__uint32_t)(((__uint32_t
)(*ptr) & 0xff) << 24 | ((__uint32_t)(*ptr) & 0xff00
) << 8 | ((__uint32_t)(*ptr) & 0xff0000) >> 8
| ((__uint32_t)(*ptr) & 0xff000000) >> 24) : __swap32md
(*ptr))
& L2TP_BEARER_CAP_ANALOG_MASK0x00000002) {
287 printf("A");
288 }
289 if (ntohl(*ptr)(__uint32_t)(__builtin_constant_p(*ptr) ? (__uint32_t)(((__uint32_t
)(*ptr) & 0xff) << 24 | ((__uint32_t)(*ptr) & 0xff00
) << 8 | ((__uint32_t)(*ptr) & 0xff0000) >> 8
| ((__uint32_t)(*ptr) & 0xff000000) >> 24) : __swap32md
(*ptr))
& L2TP_BEARER_CAP_DIGITAL_MASK0x00000001) {
290 printf("D");
291 }
292}
293
294static void
295l2tp_tie_breaker_print(const u_char *dat, u_int length)
296{
297 print_octets(dat, (length < 8 ? length : 8));
298}
299
300static void
301l2tp_firm_ver_print(const u_char *dat, u_int length)
302{
303 print_short((u_short *)dat);
304}
305
306static void
307l2tp_host_name_print(const u_char *dat, u_int length)
308{
309 print_string(dat, length);
310}
311
312static void
313l2tp_vendor_name_print(const u_char *dat, u_int length)
314{
315 print_string(dat, length);
316}
317
318static void
319l2tp_assnd_tun_id_print(const u_char *dat, u_int length)
320{
321 print_short((u_short *)dat);
322}
323
324static void
325l2tp_recv_win_size_print(const u_char *dat, u_int length)
326{
327 print_short((u_short *)dat);
328}
329
330static void
331l2tp_challenge_print(const u_char *dat, u_int length)
332{
333 print_octets(dat, length);
334}
335
336static void
337l2tp_q931_cc_print(const u_char *dat, u_int length)
338{
339 print_short((u_short *)dat);
340 print_short((u_short *)(dat + 2));
341 if (length > 3) {
342 printf(" ");
343 print_string(dat+3, length-3);
344 }
345}
346
347static void
348l2tp_challenge_resp_print(const u_char *dat, u_int length)
349{
350 print_octets(dat, 16); /* XXX length should be 16? */
351}
352
353static void
354l2tp_assnd_sess_id_print(const u_char *dat, u_int length)
355{
356 print_short((u_short *)dat);
357}
358
359static void
360l2tp_call_ser_num_print(const u_char *dat, u_int length)
361{
362 print_int((u_int *)dat);
363}
364
365static void
366l2tp_minimum_bps_print(const u_char *dat, u_int length)
367{
368 print_int((u_int *)dat);
369}
370
371static void
372l2tp_maximum_bps_print(const u_char *dat, u_int length)
373{
374 print_int((u_int *)dat);
375}
376
377static void
378l2tp_bearer_type_print(const u_char *dat, u_int length)
379{
380 u_int *ptr = (u_int *)dat;
381
382 if (ntohl(*ptr)(__uint32_t)(__builtin_constant_p(*ptr) ? (__uint32_t)(((__uint32_t
)(*ptr) & 0xff) << 24 | ((__uint32_t)(*ptr) & 0xff00
) << 8 | ((__uint32_t)(*ptr) & 0xff0000) >> 8
| ((__uint32_t)(*ptr) & 0xff000000) >> 24) : __swap32md
(*ptr))
& L2TP_BEARER_TYPE_ANALOG_MASK0x00000002) {
383 printf("A");
384 }
385 if (ntohl(*ptr)(__uint32_t)(__builtin_constant_p(*ptr) ? (__uint32_t)(((__uint32_t
)(*ptr) & 0xff) << 24 | ((__uint32_t)(*ptr) & 0xff00
) << 8 | ((__uint32_t)(*ptr) & 0xff0000) >> 8
| ((__uint32_t)(*ptr) & 0xff000000) >> 24) : __swap32md
(*ptr))
& L2TP_BEARER_TYPE_DIGITAL_MASK0x00000001) {
386 printf("D");
387 }
388}
389
390static void
391l2tp_framing_type_print(const u_char *dat, u_int length)
392{
393 u_int *ptr = (u_int *)dat;
394
395 if (ntohl(*ptr)(__uint32_t)(__builtin_constant_p(*ptr) ? (__uint32_t)(((__uint32_t
)(*ptr) & 0xff) << 24 | ((__uint32_t)(*ptr) & 0xff00
) << 8 | ((__uint32_t)(*ptr) & 0xff0000) >> 8
| ((__uint32_t)(*ptr) & 0xff000000) >> 24) : __swap32md
(*ptr))
& L2TP_FRAMING_TYPE_ASYNC_MASK0x00000002) {
396 printf("A");
397 }
398 if (ntohl(*ptr)(__uint32_t)(__builtin_constant_p(*ptr) ? (__uint32_t)(((__uint32_t
)(*ptr) & 0xff) << 24 | ((__uint32_t)(*ptr) & 0xff00
) << 8 | ((__uint32_t)(*ptr) & 0xff0000) >> 8
| ((__uint32_t)(*ptr) & 0xff000000) >> 24) : __swap32md
(*ptr))
& L2TP_FRAMING_TYPE_SYNC_MASK0x00000001) {
399 printf("S");
400 }
401}
402
403static void
404l2tp_packet_proc_delay_print(const u_char *dat, u_int length)
405{
406 printf("obsolete");
407}
408
409static void
410l2tp_called_number_print(const u_char *dat, u_int length)
411{
412 print_string(dat, length);
413}
414
415static void
416l2tp_calling_number_print(const u_char *dat, u_int length)
417{
418 print_string(dat, length);
419}
420
421static void
422l2tp_sub_address_print(const u_char *dat, u_int length)
423{
424 print_string(dat, length);
425}
426
427static void
428l2tp_tx_conn_speed_print(const u_char *dat, u_int length)
429{
430 print_int((u_int *)dat);
431}
432
433static void
434l2tp_phy_channel_id_print(const u_char *dat, u_int length)
435{
436 print_int((u_int *)dat);
437}
438
439static void
440l2tp_ini_recv_lcp_print(const u_char *dat, u_int length)
441{
442 print_octets(dat, length);
443}
444
445static void
446l2tp_last_sent_lcp_print(const u_char *dat, u_int length)
447{
448 print_octets(dat, length);
449}
450
451static void
452l2tp_last_recv_lcp_print(const u_char *dat, u_int length)
453{
454 print_octets(dat, length);
455}
456
457static void
458l2tp_proxy_auth_type_print(const u_char *dat, u_int length)
459{
460 u_short *ptr = (u_short *)dat;
461
462 switch (ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
) {
463 case L2TP_AUTHEN_TYPE_RESERVED0x0000:
464 printf("Reserved");
465 break;
466 case L2TP_AUTHEN_TYPE_TEXTUAL0x0001:
467 printf("Textual");
468 break;
469 case L2TP_AUTHEN_TYPE_CHAP0x0002:
470 printf("CHAP");
471 break;
472 case L2TP_AUTHEN_TYPE_PAP0x0003:
473 printf("PAP");
474 break;
475 case L2TP_AUTHEN_TYPE_NO_AUTH0x0004:
476 printf("No Auth");
477 break;
478 case L2TP_AUTHEN_TYPE_MSCHAP0x0005:
479 printf("MS-CHAP");
480 break;
481 default:
482 printf("unknown");
483 }
484}
485
486static void
487l2tp_proxy_auth_name_print(const u_char *dat, u_int length)
488{
489 print_octets(dat, length);
490}
491
492static void
493l2tp_proxy_auth_chal_print(const u_char *dat, u_int length)
494{
495 print_octets(dat, length);
496}
497
498static void
499l2tp_proxy_auth_id_print(const u_char *dat, u_int length)
500{
501 u_short *ptr = (u_short *)dat;
502
503 printf("%d", ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
& L2TP_PROXY_AUTH_ID_MASK0x00ff);
504}
505
506static void
507l2tp_proxy_auth_resp_print(const u_char *dat, u_int length)
508{
509 print_octets(dat, length);
510}
511
512static void
513l2tp_call_errors_print(const u_char *dat, u_int length)
514{
515 struct l2tp_call_errors *ptr = (struct l2tp_call_errors *)dat;
516
517 printf("CRCErr=%d FrameErr=%d HardOver=%d BufOver=%d ",
518 ptr->crc_errs,
519 ptr->framing_errs,
520 ptr->hardware_overruns,
521 ptr->buffer_overruns);
522 printf("Timeout=%d AlingErr=%d",
523 ptr->timeout_errs,
524 ptr->alignment_errs);
525}
526
527static void
528l2tp_accm_print(const u_char *dat, u_int length)
529{
530 struct l2tp_accm *ptr = (struct l2tp_accm *)dat;
531
532 printf("send=%x recv=%x", ptr->send_accm, ptr->recv_accm);
533}
534
535static void
536l2tp_random_vector_print(const u_char *dat, u_int length)
537{
538 print_octets(dat, length);
539}
540
541static void
542l2tp_private_grp_id_print(const u_char *dat, u_int length)
543{
544 print_string(dat, length);
545 /* XXX print_octets is more appropriate?? */
546}
547
548static void
549l2tp_rx_conn_speed_print(const u_char *dat, u_int length)
550{
551 print_int((u_int *)dat);
552}
553
554static void
555l2tp_seq_required_print(const u_char *dat, u_int length)
556{
557 return;
558}
559
560static void
561l2tp_avp_print(const u_char *dat, u_int length)
562{
563 u_int len;
564 const u_short *ptr = (u_short *)dat;
565 int hidden = FALSE0;
566
567 printf(" ");
568 if (length > 0 && (snapend - dat) >= 2) {
569 /* there must be at least two octets for the length
570 to be decoded */
571 if ((len = (ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
& L2TP_AVP_HDR_LEN_MASK0x03ff)) <=
572 (snapend - dat)) {
573 if (ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
& L2TP_AVP_HDR_FLAG_MANDATORY0x8000) {
574 printf("*");
575 }
576 if (ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
& L2TP_AVP_HDR_FLAG_HIDDEN0x4000) {
577 hidden = TRUE1;
578 printf("?");
579 }
580 } else {
581 printf("|...");
582 return;
583 }
584 ptr++;
585
586 if (ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
) { /* IETF == 0 */
587 printf("vendor=%04x", ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
);
588 }
589 ptr++;
590
591 if (ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
< L2TP_MAX_AVP_INDEX40) {
592 printf("%s", l2tp_avp[ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
].name);
593 printf("(");
594 if (!hidden && len >= 6) {
595 (l2tp_avp[ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
].print)
596 ((u_char *)ptr+2, len-6);
597 } else {
598 printf("???");
599 }
600 printf(")");
601 } else {
602 printf(" invalid AVP %u", ntohs(*ptr)(__uint16_t)(__builtin_constant_p(*ptr) ? (__uint16_t)(((__uint16_t
)(*ptr) & 0xffU) << 8 | ((__uint16_t)(*ptr) & 0xff00U
) >> 8) : __swap16md(*ptr))
);
603 }
604
605 if (length >= len && len > 0)
606 l2tp_avp_print(dat + len, length - len);
607 } else if (length == 0) {
608 return;
609 } else {
610 printf("|...");
611 }
612}
613
614
615void
616l2tp_print(const u_char *dat, u_int length)
617{
618 u_int cnt = 0; /* total octets consumed */
619 u_short pad, val;
620 int flag_t, flag_l, flag_s, flag_o, flag_p;
621
622 flag_t = flag_l = flag_s = flag_o = flag_p = FALSE0;
623
624 if (length < 6 || snapend - dat < 6) {
625 /* flag/ver, tunnel_id, session_id must be present for
626 this packet to be properly decoded */
627 printf("%s", tstr);
628 return;
629 }
630
631 TCHECK2(*dat, sizeof(val))if (!(snapend - (sizeof(val)) <= snapend && (const
u_char *)&(*dat) <= snapend - (sizeof(val)))) goto trunc
;
632 memcpy(&val, dat, sizeof(val));
633 if ((ntohs(val)(__uint16_t)(__builtin_constant_p(val) ? (__uint16_t)(((__uint16_t
)(val) & 0xffU) << 8 | ((__uint16_t)(val) & 0xff00U
) >> 8) : __swap16md(val))
& L2TP_VERSION_MASK0x000f) == L2TP_VERSION_L2TP0x0002) {
634 printf("l2tp:");
635 } else if ((ntohs(val)(__uint16_t)(__builtin_constant_p(val) ? (__uint16_t)(((__uint16_t
)(val) & 0xffU) << 8 | ((__uint16_t)(val) & 0xff00U
) >> 8) : __swap16md(val))
& L2TP_VERSION_MASK0x000f) == L2TP_VERSION_L2F0x0001) {
636 printf("l2f:");
637 return; /* nothing to do */
638 } else {
639 printf("Unknown Version, neither L2F(1) nor L2TP(2)");
640 return; /* nothing we can do */
641 }
642
643 printf("[");
644 if (ntohs(val)(__uint16_t)(__builtin_constant_p(val) ? (__uint16_t)(((__uint16_t
)(val) & 0xffU) << 8 | ((__uint16_t)(val) & 0xff00U
) >> 8) : __swap16md(val))
& L2TP_FLAG_TYPE0x8000) {
645 flag_t = TRUE1;
646 printf("T");
647 }
648 if (ntohs(val)(__uint16_t)(__builtin_constant_p(val) ? (__uint16_t)(((__uint16_t
)(val) & 0xffU) << 8 | ((__uint16_t)(val) & 0xff00U
) >> 8) : __swap16md(val))
& L2TP_FLAG_LENGTH0x4000) {
649 flag_l = TRUE1;
650 printf("L");
651 }
652 if (ntohs(val)(__uint16_t)(__builtin_constant_p(val) ? (__uint16_t)(((__uint16_t
)(val) & 0xffU) << 8 | ((__uint16_t)(val) & 0xff00U
) >> 8) : __swap16md(val))
& L2TP_FLAG_SEQUENCE0x0800) {
653 flag_s = TRUE1;
654 printf("S");
655 }
656 if (ntohs(val)(__uint16_t)(__builtin_constant_p(val) ? (__uint16_t)(((__uint16_t
)(val) & 0xffU) << 8 | ((__uint16_t)(val) & 0xff00U
) >> 8) : __swap16md(val))
& L2TP_FLAG_OFFSET0x0200) {
657 flag_o = TRUE1;
658 printf("O");
659 }
660 if (ntohs(val)(__uint16_t)(__builtin_constant_p(val) ? (__uint16_t)(((__uint16_t
)(val) & 0xffU) << 8 | ((__uint16_t)(val) & 0xff00U
) >> 8) : __swap16md(val))
& L2TP_FLAG_PRIORITY0x0100) {
661 flag_p = TRUE1;
Value stored to 'flag_p' is never read
662 printf("P");
663 }
664 printf("]");
665
666 dat += 2;
667 cnt += 2;
668
669 if (flag_l) {
670 TCHECK2(*dat, sizeof(val))if (!(snapend - (sizeof(val)) <= snapend && (const
u_char *)&(*dat) <= snapend - (sizeof(val)))) goto trunc
;
671 memcpy(&val, dat, sizeof(val));
672 dat += 2;
673 cnt += 2;
674 }
675
676 TCHECK2(*dat, sizeof(val))if (!(snapend - (sizeof(val)) <= snapend && (const
u_char *)&(*dat) <= snapend - (sizeof(val)))) goto trunc
;
677 memcpy(&val, dat, sizeof(val));
678 printf("(%d/", ntohs(val)(__uint16_t)(__builtin_constant_p(val) ? (__uint16_t)(((__uint16_t
)(val) & 0xffU) << 8 | ((__uint16_t)(val) & 0xff00U
) >> 8) : __swap16md(val))
); /* Tunnel ID */
679 dat += 2;
680 cnt += 2;
681 TCHECK2(*dat, sizeof(val))if (!(snapend - (sizeof(val)) <= snapend && (const
u_char *)&(*dat) <= snapend - (sizeof(val)))) goto trunc
;
682 memcpy(&val, dat, sizeof(val));
683 printf("%d)", ntohs(val)(__uint16_t)(__builtin_constant_p(val) ? (__uint16_t)(((__uint16_t
)(val) & 0xffU) << 8 | ((__uint16_t)(val) & 0xff00U
) >> 8) : __swap16md(val))
); /* Session ID */
684 dat += 2;
685 cnt += 2;
686
687 if (flag_s) {
688 TCHECK2(*dat, sizeof(val))if (!(snapend - (sizeof(val)) <= snapend && (const
u_char *)&(*dat) <= snapend - (sizeof(val)))) goto trunc
;
689 memcpy(&val, dat, sizeof(val));
690 printf("Ns=%d,", ntohs(val)(__uint16_t)(__builtin_constant_p(val) ? (__uint16_t)(((__uint16_t
)(val) & 0xffU) << 8 | ((__uint16_t)(val) & 0xff00U
) >> 8) : __swap16md(val))
);
691 dat += 2;
692 cnt += 2;
693 TCHECK2(*dat, sizeof(val))if (!(snapend - (sizeof(val)) <= snapend && (const
u_char *)&(*dat) <= snapend - (sizeof(val)))) goto trunc
;
694 memcpy(&val, dat, sizeof(val));
695 printf("Nr=%d", ntohs(val)(__uint16_t)(__builtin_constant_p(val) ? (__uint16_t)(((__uint16_t
)(val) & 0xffU) << 8 | ((__uint16_t)(val) & 0xff00U
) >> 8) : __swap16md(val))
);
696 dat += 2;
697 cnt += 2;
698 }
699
700 if (flag_o) {
701 TCHECK2(*dat, sizeof(val))if (!(snapend - (sizeof(val)) <= snapend && (const
u_char *)&(*dat) <= snapend - (sizeof(val)))) goto trunc
;
702 memcpy(&val, dat, sizeof(val));
703 pad = ntohs(val)(__uint16_t)(__builtin_constant_p(val) ? (__uint16_t)(((__uint16_t
)(val) & 0xffU) << 8 | ((__uint16_t)(val) & 0xff00U
) >> 8) : __swap16md(val))
;
704 dat += 2;
705 cnt += 2;
706 TCHECK2(*dat, pad)if (!(snapend - (pad) <= snapend && (const u_char *
)&(*dat) <= snapend - (pad))) goto trunc
;
707 dat += pad;
708 cnt += pad;
709 }
710
711 if (flag_t) {
712 if (length - cnt == 0) {
713 printf(" ZLB");
714 } else {
715 if (length >= cnt)
716 l2tp_avp_print(dat, length - cnt);
717 }
718 } else {
719#if 0
720 printf(" {");
721 ppp_hdlc_print(dat, length - cnt);
722 printf("}");
723#else
724 printf("[hdlc|]");
725#endif
726 }
727
728trunc:
729 printf("[|l2tp]");
730}