xref: /freebsd/contrib/tcpdump/print-pptp.c (revision 3340d77368116708ab5b5b95acf6c9c710528300)
1a90e161bSBill Fenner /*
2a90e161bSBill Fenner  * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997
3a90e161bSBill Fenner  *      The Regents of the University of California.  All rights reserved.
4a90e161bSBill Fenner  *
5a90e161bSBill Fenner  * Redistribution and use in source and binary forms, with or without
6a90e161bSBill Fenner  * modification, are permitted provided that: (1) source code distributions
7a90e161bSBill Fenner  * retain the above copyright notice and this paragraph in its entirety, (2)
8a90e161bSBill Fenner  * distributions including binary code include the above copyright notice and
9a90e161bSBill Fenner  * this paragraph in its entirety in the documentation or other materials
10a90e161bSBill Fenner  * provided with the distribution, and (3) all advertising materials mentioning
11a90e161bSBill Fenner  * features or use of this software display the following acknowledgement:
12a90e161bSBill Fenner  * ``This product includes software developed by the University of California,
13a90e161bSBill Fenner  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
14a90e161bSBill Fenner  * the University nor the names of its contributors may be used to endorse
15a90e161bSBill Fenner  * or promote products derived from this software without specific prior
16a90e161bSBill Fenner  * written permission.
17a90e161bSBill Fenner  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
18a90e161bSBill Fenner  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
19a90e161bSBill Fenner  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20a90e161bSBill Fenner  *
21a90e161bSBill Fenner  * PPTP support contributed by Motonori Shindo (mshindo@mshindo.net)
22a90e161bSBill Fenner  */
23a90e161bSBill Fenner 
24*3340d773SGleb Smirnoff /* \summary: Point-to-Point Tunnelling Protocol (PPTP) printer */
25*3340d773SGleb Smirnoff 
26a90e161bSBill Fenner #ifdef HAVE_CONFIG_H
27a90e161bSBill Fenner #include "config.h"
28a90e161bSBill Fenner #endif
29a90e161bSBill Fenner 
30*3340d773SGleb Smirnoff #include <netdissect-stdinc.h>
315b0fe478SBruce M Simpson 
32*3340d773SGleb Smirnoff #include "netdissect.h"
335b0fe478SBruce M Simpson #include "extract.h"
34a90e161bSBill Fenner 
353c602fabSXin LI static const char tstr[] = " [|pptp]";
36a90e161bSBill Fenner 
37a90e161bSBill Fenner #define PPTP_MSG_TYPE_CTRL	1	/* Control Message */
38a90e161bSBill Fenner #define PPTP_MSG_TYPE_MGMT	2	/* Management Message (currently not used */
39a90e161bSBill Fenner #define PPTP_MAGIC_COOKIE	0x1a2b3c4d	/* for sanity check */
40a90e161bSBill Fenner 
41a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_SCCRQ	1
42a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_SCCRP	2
43a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_StopCCRQ	3
44a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_StopCCRP	4
45a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_ECHORQ	5
46a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_ECHORP	6
47a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_OCRQ		7
48a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_OCRP		8
49a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_ICRQ		9
50a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_ICRP		10
51a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_ICCN		11
52a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_CCRQ		12
53a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_CDN		13
54a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_WEN		14
55a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_SLI		15
56a90e161bSBill Fenner 
57a90e161bSBill Fenner #define PPTP_FRAMING_CAP_ASYNC_MASK	0x00000001      /* Aynchronous */
58a90e161bSBill Fenner #define PPTP_FRAMING_CAP_SYNC_MASK	0x00000002      /* Synchronous */
59a90e161bSBill Fenner 
60a90e161bSBill Fenner #define PPTP_BEARER_CAP_ANALOG_MASK	0x00000001      /* Analog */
61a90e161bSBill Fenner #define PPTP_BEARER_CAP_DIGITAL_MASK	0x00000002      /* Digital */
62a90e161bSBill Fenner 
635b0fe478SBruce M Simpson static const char *pptp_message_type_string[] = {
64a90e161bSBill Fenner 	"NOT_DEFINED",		/* 0  Not defined in the RFC2637 */
65a90e161bSBill Fenner 	"SCCRQ",		/* 1  Start-Control-Connection-Request */
66a90e161bSBill Fenner 	"SCCRP",		/* 2  Start-Control-Connection-Reply */
67a90e161bSBill Fenner 	"StopCCRQ",		/* 3  Stop-Control-Connection-Request */
68a90e161bSBill Fenner 	"StopCCRP",		/* 4  Stop-Control-Connection-Reply */
69a90e161bSBill Fenner 	"ECHORQ",		/* 5  Echo Request */
70a90e161bSBill Fenner 	"ECHORP",		/* 6  Echo Reply */
71a90e161bSBill Fenner 
72a90e161bSBill Fenner 	"OCRQ",			/* 7  Outgoing-Call-Request */
73a90e161bSBill Fenner 	"OCRP",			/* 8  Outgoing-Call-Reply */
74a90e161bSBill Fenner 	"ICRQ",			/* 9  Incoming-Call-Request */
75a90e161bSBill Fenner 	"ICRP",			/* 10 Incoming-Call-Reply */
76a90e161bSBill Fenner 	"ICCN",			/* 11 Incoming-Call-Connected */
77a90e161bSBill Fenner 	"CCRQ",			/* 12 Call-Clear-Request */
78a90e161bSBill Fenner 	"CDN",			/* 13 Call-Disconnect-Notify */
79a90e161bSBill Fenner 
80a90e161bSBill Fenner 	"WEN",			/* 14 WAN-Error-Notify */
81a90e161bSBill Fenner 
82a90e161bSBill Fenner 	"SLI"			/* 15 Set-Link-Info */
83a90e161bSBill Fenner #define PPTP_MAX_MSGTYPE_INDEX	16
84a90e161bSBill Fenner };
85a90e161bSBill Fenner 
86a90e161bSBill Fenner /* common for all PPTP control messages */
87a90e161bSBill Fenner struct pptp_hdr {
883c602fabSXin LI 	uint16_t length;
893c602fabSXin LI 	uint16_t msg_type;
903c602fabSXin LI 	uint32_t magic_cookie;
913c602fabSXin LI 	uint16_t ctrl_msg_type;
923c602fabSXin LI 	uint16_t reserved0;
93a90e161bSBill Fenner };
94a90e161bSBill Fenner 
95a90e161bSBill Fenner struct pptp_msg_sccrq {
963c602fabSXin LI 	uint16_t proto_ver;
973c602fabSXin LI 	uint16_t reserved1;
983c602fabSXin LI 	uint32_t framing_cap;
993c602fabSXin LI 	uint32_t bearer_cap;
1003c602fabSXin LI 	uint16_t max_channel;
1013c602fabSXin LI 	uint16_t firm_rev;
102a90e161bSBill Fenner 	u_char hostname[64];
103a90e161bSBill Fenner 	u_char vendor[64];
104a90e161bSBill Fenner };
105a90e161bSBill Fenner 
106a90e161bSBill Fenner struct pptp_msg_sccrp {
1073c602fabSXin LI 	uint16_t proto_ver;
1083c602fabSXin LI 	uint8_t result_code;
1093c602fabSXin LI 	uint8_t err_code;
1103c602fabSXin LI 	uint32_t framing_cap;
1113c602fabSXin LI 	uint32_t bearer_cap;
1123c602fabSXin LI 	uint16_t max_channel;
1133c602fabSXin LI 	uint16_t firm_rev;
114a90e161bSBill Fenner 	u_char hostname[64];
115a90e161bSBill Fenner 	u_char vendor[64];
116a90e161bSBill Fenner };
117a90e161bSBill Fenner 
118a90e161bSBill Fenner struct pptp_msg_stopccrq {
1193c602fabSXin LI 	uint8_t reason;
1203c602fabSXin LI 	uint8_t reserved1;
1213c602fabSXin LI 	uint16_t reserved2;
122a90e161bSBill Fenner };
123a90e161bSBill Fenner 
124a90e161bSBill Fenner struct pptp_msg_stopccrp {
1253c602fabSXin LI 	uint8_t result_code;
1263c602fabSXin LI 	uint8_t err_code;
1273c602fabSXin LI 	uint16_t reserved1;
128a90e161bSBill Fenner };
129a90e161bSBill Fenner 
130a90e161bSBill Fenner struct pptp_msg_echorq {
1313c602fabSXin LI 	uint32_t id;
132a90e161bSBill Fenner };
133a90e161bSBill Fenner 
134a90e161bSBill Fenner struct pptp_msg_echorp {
1353c602fabSXin LI 	uint32_t id;
1363c602fabSXin LI 	uint8_t result_code;
1373c602fabSXin LI 	uint8_t err_code;
1383c602fabSXin LI 	uint16_t reserved1;
139a90e161bSBill Fenner };
140a90e161bSBill Fenner 
141a90e161bSBill Fenner struct pptp_msg_ocrq {
1423c602fabSXin LI 	uint16_t call_id;
1433c602fabSXin LI 	uint16_t call_ser;
1443c602fabSXin LI 	uint32_t min_bps;
1453c602fabSXin LI 	uint32_t max_bps;
1463c602fabSXin LI 	uint32_t bearer_type;
1473c602fabSXin LI 	uint32_t framing_type;
1483c602fabSXin LI 	uint16_t recv_winsiz;
1493c602fabSXin LI 	uint16_t pkt_proc_delay;
1503c602fabSXin LI 	uint16_t phone_no_len;
1513c602fabSXin LI 	uint16_t reserved1;
152a90e161bSBill Fenner 	u_char phone_no[64];
153a90e161bSBill Fenner 	u_char subaddr[64];
154a90e161bSBill Fenner };
155a90e161bSBill Fenner 
156a90e161bSBill Fenner struct pptp_msg_ocrp {
1573c602fabSXin LI 	uint16_t call_id;
1583c602fabSXin LI 	uint16_t peer_call_id;
1593c602fabSXin LI 	uint8_t result_code;
1603c602fabSXin LI 	uint8_t err_code;
1613c602fabSXin LI 	uint16_t cause_code;
1623c602fabSXin LI 	uint32_t conn_speed;
1633c602fabSXin LI 	uint16_t recv_winsiz;
1643c602fabSXin LI 	uint16_t pkt_proc_delay;
1653c602fabSXin LI 	uint32_t phy_chan_id;
166a90e161bSBill Fenner };
167a90e161bSBill Fenner 
168a90e161bSBill Fenner struct pptp_msg_icrq {
1693c602fabSXin LI 	uint16_t call_id;
1703c602fabSXin LI 	uint16_t call_ser;
1713c602fabSXin LI 	uint32_t bearer_type;
1723c602fabSXin LI 	uint32_t phy_chan_id;
1733c602fabSXin LI 	uint16_t dialed_no_len;
1743c602fabSXin LI 	uint16_t dialing_no_len;
175a90e161bSBill Fenner 	u_char dialed_no[64];		/* DNIS */
176a90e161bSBill Fenner 	u_char dialing_no[64];		/* CLID */
177a90e161bSBill Fenner 	u_char subaddr[64];
178a90e161bSBill Fenner };
179a90e161bSBill Fenner 
180a90e161bSBill Fenner struct pptp_msg_icrp {
1813c602fabSXin LI 	uint16_t call_id;
1823c602fabSXin LI 	uint16_t peer_call_id;
1833c602fabSXin LI 	uint8_t result_code;
1843c602fabSXin LI 	uint8_t err_code;
1853c602fabSXin LI 	uint16_t recv_winsiz;
1863c602fabSXin LI 	uint16_t pkt_proc_delay;
1873c602fabSXin LI 	uint16_t reserved1;
188a90e161bSBill Fenner };
189a90e161bSBill Fenner 
190a90e161bSBill Fenner struct pptp_msg_iccn {
1913c602fabSXin LI 	uint16_t peer_call_id;
1923c602fabSXin LI 	uint16_t reserved1;
1933c602fabSXin LI 	uint32_t conn_speed;
1943c602fabSXin LI 	uint16_t recv_winsiz;
1953c602fabSXin LI 	uint16_t pkt_proc_delay;
1963c602fabSXin LI 	uint32_t framing_type;
197a90e161bSBill Fenner };
198a90e161bSBill Fenner 
199a90e161bSBill Fenner struct pptp_msg_ccrq {
2003c602fabSXin LI 	uint16_t call_id;
2013c602fabSXin LI 	uint16_t reserved1;
202a90e161bSBill Fenner };
203a90e161bSBill Fenner 
204a90e161bSBill Fenner struct pptp_msg_cdn {
2053c602fabSXin LI 	uint16_t call_id;
2063c602fabSXin LI 	uint8_t result_code;
2073c602fabSXin LI 	uint8_t err_code;
2083c602fabSXin LI 	uint16_t cause_code;
2093c602fabSXin LI 	uint16_t reserved1;
210a90e161bSBill Fenner 	u_char call_stats[128];
211a90e161bSBill Fenner };
212a90e161bSBill Fenner 
213a90e161bSBill Fenner struct pptp_msg_wen {
2143c602fabSXin LI 	uint16_t peer_call_id;
2153c602fabSXin LI 	uint16_t reserved1;
2163c602fabSXin LI 	uint32_t crc_err;
2173c602fabSXin LI 	uint32_t framing_err;
2183c602fabSXin LI 	uint32_t hardware_overrun;
2193c602fabSXin LI 	uint32_t buffer_overrun;
2203c602fabSXin LI 	uint32_t timeout_err;
2213c602fabSXin LI 	uint32_t align_err;
222a90e161bSBill Fenner };
223a90e161bSBill Fenner 
224a90e161bSBill Fenner struct pptp_msg_sli {
2253c602fabSXin LI 	uint16_t peer_call_id;
2263c602fabSXin LI 	uint16_t reserved1;
2273c602fabSXin LI 	uint32_t send_accm;
2283c602fabSXin LI 	uint32_t recv_accm;
229a90e161bSBill Fenner };
230a90e161bSBill Fenner 
231a90e161bSBill Fenner /* attributes that appear more than once in above messages:
232a90e161bSBill Fenner 
233a90e161bSBill Fenner    Number of
234a90e161bSBill Fenner    occurence    attributes
235a90e161bSBill Fenner   --------------------------------------
2363c602fabSXin LI       2         uint32_t bearer_cap;
2373c602fabSXin LI       2         uint32_t bearer_type;
2383c602fabSXin LI       6         uint16_t call_id;
2393c602fabSXin LI       2         uint16_t call_ser;
2403c602fabSXin LI       2         uint16_t cause_code;
2413c602fabSXin LI       2         uint32_t conn_speed;
2423c602fabSXin LI       6         uint8_t err_code;
2433c602fabSXin LI       2         uint16_t firm_rev;
2443c602fabSXin LI       2         uint32_t framing_cap;
2453c602fabSXin LI       2         uint32_t framing_type;
246a90e161bSBill Fenner       2         u_char hostname[64];
2473c602fabSXin LI       2         uint32_t id;
2483c602fabSXin LI       2         uint16_t max_channel;
2493c602fabSXin LI       5         uint16_t peer_call_id;
2503c602fabSXin LI       2         uint32_t phy_chan_id;
2513c602fabSXin LI       4         uint16_t pkt_proc_delay;
2523c602fabSXin LI       2         uint16_t proto_ver;
2533c602fabSXin LI       4         uint16_t recv_winsiz;
2543c602fabSXin LI       2         uint8_t reserved1;
2553c602fabSXin LI       9         uint16_t reserved1;
2563c602fabSXin LI       6         uint8_t result_code;
257a90e161bSBill Fenner       2         u_char subaddr[64];
258a90e161bSBill Fenner       2         u_char vendor[64];
259a90e161bSBill Fenner 
260a90e161bSBill Fenner   so I will prepare print out functions for these attributes (except for
261a90e161bSBill Fenner   reserved*).
262a90e161bSBill Fenner */
263a90e161bSBill Fenner 
264a90e161bSBill Fenner /******************************************/
265a90e161bSBill Fenner /* Attribute-specific print out functions */
266a90e161bSBill Fenner /******************************************/
267a90e161bSBill Fenner 
268a90e161bSBill Fenner /* In these attribute-specific print-out functions, it't not necessary
2693c602fabSXin LI    to do ND_TCHECK because they are already checked in the caller of
270a90e161bSBill Fenner    these functions. */
271a90e161bSBill Fenner 
272a90e161bSBill Fenner static void
2733c602fabSXin LI pptp_bearer_cap_print(netdissect_options *ndo,
2743c602fabSXin LI                       const uint32_t *bearer_cap)
275a90e161bSBill Fenner {
2763c602fabSXin LI 	ND_PRINT((ndo, " BEARER_CAP(%s%s)",
2773c602fabSXin LI 	          EXTRACT_32BITS(bearer_cap) & PPTP_BEARER_CAP_DIGITAL_MASK ? "D" : "",
2783c602fabSXin LI 	          EXTRACT_32BITS(bearer_cap) & PPTP_BEARER_CAP_ANALOG_MASK ? "A" : ""));
279a90e161bSBill Fenner }
2803c602fabSXin LI 
2813c602fabSXin LI static const struct tok pptp_btype_str[] = {
2823c602fabSXin LI 	{ 1, "A"   }, /* Analog */
2833c602fabSXin LI 	{ 2, "D"   }, /* Digital */
2843c602fabSXin LI 	{ 3, "Any" },
2853c602fabSXin LI 	{ 0, NULL }
2863c602fabSXin LI };
2873c602fabSXin LI 
2883c602fabSXin LI static void
2893c602fabSXin LI pptp_bearer_type_print(netdissect_options *ndo,
2903c602fabSXin LI                        const uint32_t *bearer_type)
2913c602fabSXin LI {
2923c602fabSXin LI 	ND_PRINT((ndo, " BEARER_TYPE(%s)",
2933c602fabSXin LI 	          tok2str(pptp_btype_str, "?", EXTRACT_32BITS(bearer_type))));
294a90e161bSBill Fenner }
295a90e161bSBill Fenner 
296a90e161bSBill Fenner static void
2973c602fabSXin LI pptp_call_id_print(netdissect_options *ndo,
2983c602fabSXin LI                    const uint16_t *call_id)
299a90e161bSBill Fenner {
3003c602fabSXin LI 	ND_PRINT((ndo, " CALL_ID(%u)", EXTRACT_16BITS(call_id)));
301a90e161bSBill Fenner }
302a90e161bSBill Fenner 
303a90e161bSBill Fenner static void
3043c602fabSXin LI pptp_call_ser_print(netdissect_options *ndo,
3053c602fabSXin LI                     const uint16_t *call_ser)
306a90e161bSBill Fenner {
3073c602fabSXin LI 	ND_PRINT((ndo, " CALL_SER_NUM(%u)", EXTRACT_16BITS(call_ser)));
308a90e161bSBill Fenner }
309a90e161bSBill Fenner 
310a90e161bSBill Fenner static void
3113c602fabSXin LI pptp_cause_code_print(netdissect_options *ndo,
3123c602fabSXin LI                       const uint16_t *cause_code)
313a90e161bSBill Fenner {
3143c602fabSXin LI 	ND_PRINT((ndo, " CAUSE_CODE(%u)", EXTRACT_16BITS(cause_code)));
315a90e161bSBill Fenner }
316a90e161bSBill Fenner 
317a90e161bSBill Fenner static void
3183c602fabSXin LI pptp_conn_speed_print(netdissect_options *ndo,
3193c602fabSXin LI                       const uint32_t *conn_speed)
320a90e161bSBill Fenner {
3213c602fabSXin LI 	ND_PRINT((ndo, " CONN_SPEED(%u)", EXTRACT_32BITS(conn_speed)));
3223c602fabSXin LI }
3233c602fabSXin LI 
3243c602fabSXin LI static const struct tok pptp_errcode_str[] = {
3253c602fabSXin LI 	{ 0, "None"          },
3263c602fabSXin LI 	{ 1, "Not-Connected" },
3273c602fabSXin LI 	{ 2, "Bad-Format"    },
3283c602fabSXin LI 	{ 3, "Bad-Value"     },
3293c602fabSXin LI 	{ 4, "No-Resource"   },
3303c602fabSXin LI 	{ 5, "Bad-Call-ID"   },
3313c602fabSXin LI 	{ 6, "PAC-Error"     },
3323c602fabSXin LI 	{ 0, NULL }
3333c602fabSXin LI };
3343c602fabSXin LI 
3353c602fabSXin LI static void
3363c602fabSXin LI pptp_err_code_print(netdissect_options *ndo,
3373c602fabSXin LI                     const uint8_t *err_code)
3383c602fabSXin LI {
3393c602fabSXin LI 	ND_PRINT((ndo, " ERR_CODE(%u", *err_code));
3403c602fabSXin LI 	if (ndo->ndo_vflag) {
3413c602fabSXin LI 		ND_PRINT((ndo, ":%s", tok2str(pptp_errcode_str, "?", *err_code)));
3423c602fabSXin LI 	}
3433c602fabSXin LI 	ND_PRINT((ndo, ")"));
344a90e161bSBill Fenner }
345a90e161bSBill Fenner 
346a90e161bSBill Fenner static void
3473c602fabSXin LI pptp_firm_rev_print(netdissect_options *ndo,
3483c602fabSXin LI                     const uint16_t *firm_rev)
349a90e161bSBill Fenner {
3503c602fabSXin LI 	ND_PRINT((ndo, " FIRM_REV(%u)", EXTRACT_16BITS(firm_rev)));
351a90e161bSBill Fenner }
352a90e161bSBill Fenner 
353a90e161bSBill Fenner static void
3543c602fabSXin LI pptp_framing_cap_print(netdissect_options *ndo,
3553c602fabSXin LI                        const uint32_t *framing_cap)
356a90e161bSBill Fenner {
3573c602fabSXin LI 	ND_PRINT((ndo, " FRAME_CAP("));
3585b0fe478SBruce M Simpson 	if (EXTRACT_32BITS(framing_cap) & PPTP_FRAMING_CAP_ASYNC_MASK) {
3593c602fabSXin LI                 ND_PRINT((ndo, "A"));		/* Async */
360a90e161bSBill Fenner         }
3615b0fe478SBruce M Simpson         if (EXTRACT_32BITS(framing_cap) & PPTP_FRAMING_CAP_SYNC_MASK) {
3623c602fabSXin LI                 ND_PRINT((ndo, "S"));		/* Sync */
363a90e161bSBill Fenner         }
3643c602fabSXin LI 	ND_PRINT((ndo, ")"));
3653c602fabSXin LI }
3663c602fabSXin LI 
3673c602fabSXin LI static const struct tok pptp_ftype_str[] = {
3683c602fabSXin LI 	{ 1, "A" }, /* Async */
3693c602fabSXin LI 	{ 2, "S" }, /* Sync */
3703c602fabSXin LI 	{ 3, "E" }, /* Either */
3713c602fabSXin LI 	{ 0, NULL }
3723c602fabSXin LI };
3733c602fabSXin LI 
3743c602fabSXin LI static void
3753c602fabSXin LI pptp_framing_type_print(netdissect_options *ndo,
3763c602fabSXin LI                         const uint32_t *framing_type)
3773c602fabSXin LI {
3783c602fabSXin LI 	ND_PRINT((ndo, " FRAME_TYPE(%s)",
3793c602fabSXin LI 	          tok2str(pptp_ftype_str, "?", EXTRACT_32BITS(framing_type))));
380a90e161bSBill Fenner }
381a90e161bSBill Fenner 
382a90e161bSBill Fenner static void
3833c602fabSXin LI pptp_hostname_print(netdissect_options *ndo,
3843c602fabSXin LI                     const u_char *hostname)
385a90e161bSBill Fenner {
3863c602fabSXin LI 	ND_PRINT((ndo, " HOSTNAME(%.64s)", hostname));
387a90e161bSBill Fenner }
388a90e161bSBill Fenner 
389a90e161bSBill Fenner static void
3903c602fabSXin LI pptp_id_print(netdissect_options *ndo,
3913c602fabSXin LI               const uint32_t *id)
392a90e161bSBill Fenner {
3933c602fabSXin LI 	ND_PRINT((ndo, " ID(%u)", EXTRACT_32BITS(id)));
394a90e161bSBill Fenner }
395a90e161bSBill Fenner 
396a90e161bSBill Fenner static void
3973c602fabSXin LI pptp_max_channel_print(netdissect_options *ndo,
3983c602fabSXin LI                        const uint16_t *max_channel)
399a90e161bSBill Fenner {
4003c602fabSXin LI 	ND_PRINT((ndo, " MAX_CHAN(%u)", EXTRACT_16BITS(max_channel)));
401a90e161bSBill Fenner }
402a90e161bSBill Fenner 
403a90e161bSBill Fenner static void
4043c602fabSXin LI pptp_peer_call_id_print(netdissect_options *ndo,
4053c602fabSXin LI                         const uint16_t *peer_call_id)
406a90e161bSBill Fenner {
4073c602fabSXin LI 	ND_PRINT((ndo, " PEER_CALL_ID(%u)", EXTRACT_16BITS(peer_call_id)));
408a90e161bSBill Fenner }
409a90e161bSBill Fenner 
410a90e161bSBill Fenner static void
4113c602fabSXin LI pptp_phy_chan_id_print(netdissect_options *ndo,
4123c602fabSXin LI                        const uint32_t *phy_chan_id)
413a90e161bSBill Fenner {
4143c602fabSXin LI 	ND_PRINT((ndo, " PHY_CHAN_ID(%u)", EXTRACT_32BITS(phy_chan_id)));
415a90e161bSBill Fenner }
416a90e161bSBill Fenner 
417a90e161bSBill Fenner static void
4183c602fabSXin LI pptp_pkt_proc_delay_print(netdissect_options *ndo,
4193c602fabSXin LI                           const uint16_t *pkt_proc_delay)
420a90e161bSBill Fenner {
4213c602fabSXin LI 	ND_PRINT((ndo, " PROC_DELAY(%u)", EXTRACT_16BITS(pkt_proc_delay)));
422a90e161bSBill Fenner }
423a90e161bSBill Fenner 
424a90e161bSBill Fenner static void
4253c602fabSXin LI pptp_proto_ver_print(netdissect_options *ndo,
4263c602fabSXin LI                      const uint16_t *proto_ver)
427a90e161bSBill Fenner {
4283c602fabSXin LI 	ND_PRINT((ndo, " PROTO_VER(%u.%u)",	/* Version.Revision */
4295b0fe478SBruce M Simpson 	       EXTRACT_16BITS(proto_ver) >> 8,
4303c602fabSXin LI 	       EXTRACT_16BITS(proto_ver) & 0xff));
431a90e161bSBill Fenner }
432a90e161bSBill Fenner 
433a90e161bSBill Fenner static void
4343c602fabSXin LI pptp_recv_winsiz_print(netdissect_options *ndo,
4353c602fabSXin LI                        const uint16_t *recv_winsiz)
436a90e161bSBill Fenner {
4373c602fabSXin LI 	ND_PRINT((ndo, " RECV_WIN(%u)", EXTRACT_16BITS(recv_winsiz)));
4383c602fabSXin LI }
4393c602fabSXin LI 
4403c602fabSXin LI static const struct tok pptp_scrrp_str[] = {
4413c602fabSXin LI 	{ 1, "Successful channel establishment"                           },
4423c602fabSXin LI 	{ 2, "General error"                                              },
4433c602fabSXin LI 	{ 3, "Command channel already exists"                             },
4443c602fabSXin LI 	{ 4, "Requester is not authorized to establish a command channel" },
4453c602fabSXin LI 	{ 5, "The protocol version of the requester is not supported"     },
4463c602fabSXin LI 	{ 0, NULL }
4473c602fabSXin LI };
4483c602fabSXin LI 
4493c602fabSXin LI static const struct tok pptp_echorp_str[] = {
4503c602fabSXin LI 	{ 1, "OK" },
4513c602fabSXin LI 	{ 2, "General Error" },
4523c602fabSXin LI 	{ 0, NULL }
4533c602fabSXin LI };
4543c602fabSXin LI 
4553c602fabSXin LI static const struct tok pptp_ocrp_str[] = {
4563c602fabSXin LI 	{ 1, "Connected"     },
4573c602fabSXin LI 	{ 2, "General Error" },
4583c602fabSXin LI 	{ 3, "No Carrier"    },
4593c602fabSXin LI 	{ 4, "Busy"          },
4603c602fabSXin LI 	{ 5, "No Dial Tone"  },
4613c602fabSXin LI 	{ 6, "Time-out"      },
4623c602fabSXin LI 	{ 7, "Do Not Accept" },
4633c602fabSXin LI 	{ 0, NULL }
4643c602fabSXin LI };
4653c602fabSXin LI 
4663c602fabSXin LI static const struct tok pptp_icrp_str[] = {
4673c602fabSXin LI 	{ 1, "Connect"       },
4683c602fabSXin LI 	{ 2, "General Error" },
4693c602fabSXin LI 	{ 3, "Do Not Accept" },
4703c602fabSXin LI 	{ 0, NULL }
4713c602fabSXin LI };
4723c602fabSXin LI 
4733c602fabSXin LI static const struct tok pptp_cdn_str[] = {
4743c602fabSXin LI 	{ 1, "Lost Carrier"   },
4753c602fabSXin LI 	{ 2, "General Error"  },
4763c602fabSXin LI 	{ 3, "Admin Shutdown" },
4773c602fabSXin LI 	{ 4, "Request"        },
4783c602fabSXin LI 	{ 0, NULL }
4793c602fabSXin LI };
4803c602fabSXin LI 
4813c602fabSXin LI static void
4823c602fabSXin LI pptp_result_code_print(netdissect_options *ndo,
4833c602fabSXin LI                        const uint8_t *result_code, int ctrl_msg_type)
4843c602fabSXin LI {
4853c602fabSXin LI 	ND_PRINT((ndo, " RESULT_CODE(%u", *result_code));
4863c602fabSXin LI 	if (ndo->ndo_vflag) {
4873c602fabSXin LI 		const struct tok *dict =
4883c602fabSXin LI 			ctrl_msg_type == PPTP_CTRL_MSG_TYPE_SCCRP    ? pptp_scrrp_str :
4893c602fabSXin LI 			ctrl_msg_type == PPTP_CTRL_MSG_TYPE_StopCCRP ? pptp_echorp_str :
4903c602fabSXin LI 			ctrl_msg_type == PPTP_CTRL_MSG_TYPE_ECHORP   ? pptp_echorp_str :
4913c602fabSXin LI 			ctrl_msg_type == PPTP_CTRL_MSG_TYPE_OCRP     ? pptp_ocrp_str :
4923c602fabSXin LI 			ctrl_msg_type == PPTP_CTRL_MSG_TYPE_ICRP     ? pptp_icrp_str :
4933c602fabSXin LI 			ctrl_msg_type == PPTP_CTRL_MSG_TYPE_CDN      ? pptp_cdn_str :
4943c602fabSXin LI 			NULL; /* assertion error */
4953c602fabSXin LI 		if (dict != NULL)
4963c602fabSXin LI 			ND_PRINT((ndo, ":%s", tok2str(dict, "?", *result_code)));
4973c602fabSXin LI 	}
4983c602fabSXin LI 	ND_PRINT((ndo, ")"));
499a90e161bSBill Fenner }
500a90e161bSBill Fenner 
501a90e161bSBill Fenner static void
5023c602fabSXin LI pptp_subaddr_print(netdissect_options *ndo,
5033c602fabSXin LI                    const u_char *subaddr)
504a90e161bSBill Fenner {
5053c602fabSXin LI 	ND_PRINT((ndo, " SUB_ADDR(%.64s)", subaddr));
506a90e161bSBill Fenner }
507a90e161bSBill Fenner 
508a90e161bSBill Fenner static void
5093c602fabSXin LI pptp_vendor_print(netdissect_options *ndo,
5103c602fabSXin LI                   const u_char *vendor)
511a90e161bSBill Fenner {
5123c602fabSXin LI 	ND_PRINT((ndo, " VENDOR(%.64s)", vendor));
513a90e161bSBill Fenner }
514a90e161bSBill Fenner 
515a90e161bSBill Fenner /************************************/
516a90e161bSBill Fenner /* PPTP message print out functions */
517a90e161bSBill Fenner /************************************/
518a90e161bSBill Fenner static void
5193c602fabSXin LI pptp_sccrq_print(netdissect_options *ndo,
5203c602fabSXin LI                  const u_char *dat)
521a90e161bSBill Fenner {
522*3340d773SGleb Smirnoff 	const struct pptp_msg_sccrq *ptr = (const struct pptp_msg_sccrq *)dat;
523a90e161bSBill Fenner 
5243c602fabSXin LI 	ND_TCHECK(ptr->proto_ver);
5253c602fabSXin LI 	pptp_proto_ver_print(ndo, &ptr->proto_ver);
5263c602fabSXin LI 	ND_TCHECK(ptr->reserved1);
5273c602fabSXin LI 	ND_TCHECK(ptr->framing_cap);
5283c602fabSXin LI 	pptp_framing_cap_print(ndo, &ptr->framing_cap);
5293c602fabSXin LI 	ND_TCHECK(ptr->bearer_cap);
5303c602fabSXin LI 	pptp_bearer_cap_print(ndo, &ptr->bearer_cap);
5313c602fabSXin LI 	ND_TCHECK(ptr->max_channel);
5323c602fabSXin LI 	pptp_max_channel_print(ndo, &ptr->max_channel);
5333c602fabSXin LI 	ND_TCHECK(ptr->firm_rev);
5343c602fabSXin LI 	pptp_firm_rev_print(ndo, &ptr->firm_rev);
5353c602fabSXin LI 	ND_TCHECK(ptr->hostname);
5363c602fabSXin LI 	pptp_hostname_print(ndo, &ptr->hostname[0]);
5373c602fabSXin LI 	ND_TCHECK(ptr->vendor);
5383c602fabSXin LI 	pptp_vendor_print(ndo, &ptr->vendor[0]);
539a90e161bSBill Fenner 
540a90e161bSBill Fenner 	return;
541a90e161bSBill Fenner 
542a90e161bSBill Fenner trunc:
5433c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
544a90e161bSBill Fenner }
545a90e161bSBill Fenner 
546a90e161bSBill Fenner static void
5473c602fabSXin LI pptp_sccrp_print(netdissect_options *ndo,
5483c602fabSXin LI                  const u_char *dat)
549a90e161bSBill Fenner {
550*3340d773SGleb Smirnoff 	const struct pptp_msg_sccrp *ptr = (const struct pptp_msg_sccrp *)dat;
551a90e161bSBill Fenner 
5523c602fabSXin LI 	ND_TCHECK(ptr->proto_ver);
5533c602fabSXin LI 	pptp_proto_ver_print(ndo, &ptr->proto_ver);
5543c602fabSXin LI 	ND_TCHECK(ptr->result_code);
5553c602fabSXin LI 	pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_SCCRP);
5563c602fabSXin LI 	ND_TCHECK(ptr->err_code);
5573c602fabSXin LI 	pptp_err_code_print(ndo, &ptr->err_code);
5583c602fabSXin LI 	ND_TCHECK(ptr->framing_cap);
5593c602fabSXin LI 	pptp_framing_cap_print(ndo, &ptr->framing_cap);
5603c602fabSXin LI 	ND_TCHECK(ptr->bearer_cap);
5613c602fabSXin LI 	pptp_bearer_cap_print(ndo, &ptr->bearer_cap);
5623c602fabSXin LI 	ND_TCHECK(ptr->max_channel);
5633c602fabSXin LI 	pptp_max_channel_print(ndo, &ptr->max_channel);
5643c602fabSXin LI 	ND_TCHECK(ptr->firm_rev);
5653c602fabSXin LI 	pptp_firm_rev_print(ndo, &ptr->firm_rev);
5663c602fabSXin LI 	ND_TCHECK(ptr->hostname);
5673c602fabSXin LI 	pptp_hostname_print(ndo, &ptr->hostname[0]);
5683c602fabSXin LI 	ND_TCHECK(ptr->vendor);
5693c602fabSXin LI 	pptp_vendor_print(ndo, &ptr->vendor[0]);
570a90e161bSBill Fenner 
571a90e161bSBill Fenner 	return;
572a90e161bSBill Fenner 
573a90e161bSBill Fenner trunc:
5743c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
575a90e161bSBill Fenner }
576a90e161bSBill Fenner 
577a90e161bSBill Fenner static void
5783c602fabSXin LI pptp_stopccrq_print(netdissect_options *ndo,
5793c602fabSXin LI                     const u_char *dat)
580a90e161bSBill Fenner {
581*3340d773SGleb Smirnoff 	const struct pptp_msg_stopccrq *ptr = (const struct pptp_msg_stopccrq *)dat;
582a90e161bSBill Fenner 
5833c602fabSXin LI 	ND_TCHECK(ptr->reason);
5843c602fabSXin LI 	ND_PRINT((ndo, " REASON(%u", ptr->reason));
5853c602fabSXin LI 	if (ndo->ndo_vflag) {
586a90e161bSBill Fenner 		switch (ptr->reason) {
587a90e161bSBill Fenner 		case 1:
5883c602fabSXin LI 			ND_PRINT((ndo, ":None"));
589a90e161bSBill Fenner 			break;
590a90e161bSBill Fenner 		case 2:
5913c602fabSXin LI 			ND_PRINT((ndo, ":Stop-Protocol"));
592a90e161bSBill Fenner 			break;
593a90e161bSBill Fenner 		case 3:
5943c602fabSXin LI 			ND_PRINT((ndo, ":Stop-Local-Shutdown"));
595a90e161bSBill Fenner 			break;
596a90e161bSBill Fenner 		default:
5973c602fabSXin LI 			ND_PRINT((ndo, ":?"));
598a90e161bSBill Fenner 			break;
599a90e161bSBill Fenner 		}
600a90e161bSBill Fenner 	}
6013c602fabSXin LI 	ND_PRINT((ndo, ")"));
6023c602fabSXin LI 	ND_TCHECK(ptr->reserved1);
6033c602fabSXin LI 	ND_TCHECK(ptr->reserved2);
604a90e161bSBill Fenner 
605a90e161bSBill Fenner 	return;
606a90e161bSBill Fenner 
607a90e161bSBill Fenner trunc:
6083c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
609a90e161bSBill Fenner }
610a90e161bSBill Fenner 
611a90e161bSBill Fenner static void
6123c602fabSXin LI pptp_stopccrp_print(netdissect_options *ndo,
6133c602fabSXin LI                     const u_char *dat)
614a90e161bSBill Fenner {
615*3340d773SGleb Smirnoff 	const struct pptp_msg_stopccrp *ptr = (const struct pptp_msg_stopccrp *)dat;
616a90e161bSBill Fenner 
6173c602fabSXin LI 	ND_TCHECK(ptr->result_code);
6183c602fabSXin LI 	pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_StopCCRP);
6193c602fabSXin LI 	ND_TCHECK(ptr->err_code);
6203c602fabSXin LI 	pptp_err_code_print(ndo, &ptr->err_code);
6213c602fabSXin LI 	ND_TCHECK(ptr->reserved1);
622a90e161bSBill Fenner 
623a90e161bSBill Fenner 	return;
624a90e161bSBill Fenner 
625a90e161bSBill Fenner trunc:
6263c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
627a90e161bSBill Fenner }
628a90e161bSBill Fenner 
629a90e161bSBill Fenner static void
6303c602fabSXin LI pptp_echorq_print(netdissect_options *ndo,
6313c602fabSXin LI                   const u_char *dat)
632a90e161bSBill Fenner {
633*3340d773SGleb Smirnoff 	const struct pptp_msg_echorq *ptr = (const struct pptp_msg_echorq *)dat;
634a90e161bSBill Fenner 
6353c602fabSXin LI 	ND_TCHECK(ptr->id);
6363c602fabSXin LI 	pptp_id_print(ndo, &ptr->id);
637a90e161bSBill Fenner 
638a90e161bSBill Fenner 	return;
639a90e161bSBill Fenner 
640a90e161bSBill Fenner trunc:
6413c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
642a90e161bSBill Fenner }
643a90e161bSBill Fenner 
644a90e161bSBill Fenner static void
6453c602fabSXin LI pptp_echorp_print(netdissect_options *ndo,
6463c602fabSXin LI                   const u_char *dat)
647a90e161bSBill Fenner {
648*3340d773SGleb Smirnoff 	const struct pptp_msg_echorp *ptr = (const struct pptp_msg_echorp *)dat;
649a90e161bSBill Fenner 
6503c602fabSXin LI 	ND_TCHECK(ptr->id);
6513c602fabSXin LI 	pptp_id_print(ndo, &ptr->id);
6523c602fabSXin LI 	ND_TCHECK(ptr->result_code);
6533c602fabSXin LI 	pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_ECHORP);
6543c602fabSXin LI 	ND_TCHECK(ptr->err_code);
6553c602fabSXin LI 	pptp_err_code_print(ndo, &ptr->err_code);
6563c602fabSXin LI 	ND_TCHECK(ptr->reserved1);
657a90e161bSBill Fenner 
658a90e161bSBill Fenner 	return;
659a90e161bSBill Fenner 
660a90e161bSBill Fenner trunc:
6613c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
662a90e161bSBill Fenner }
663a90e161bSBill Fenner 
664a90e161bSBill Fenner static void
6653c602fabSXin LI pptp_ocrq_print(netdissect_options *ndo,
6663c602fabSXin LI                 const u_char *dat)
667a90e161bSBill Fenner {
668*3340d773SGleb Smirnoff 	const struct pptp_msg_ocrq *ptr = (const struct pptp_msg_ocrq *)dat;
669a90e161bSBill Fenner 
6703c602fabSXin LI 	ND_TCHECK(ptr->call_id);
6713c602fabSXin LI 	pptp_call_id_print(ndo, &ptr->call_id);
6723c602fabSXin LI 	ND_TCHECK(ptr->call_ser);
6733c602fabSXin LI 	pptp_call_ser_print(ndo, &ptr->call_ser);
6743c602fabSXin LI 	ND_TCHECK(ptr->min_bps);
6753c602fabSXin LI 	ND_PRINT((ndo, " MIN_BPS(%u)", EXTRACT_32BITS(&ptr->min_bps)));
6763c602fabSXin LI 	ND_TCHECK(ptr->max_bps);
6773c602fabSXin LI 	ND_PRINT((ndo, " MAX_BPS(%u)", EXTRACT_32BITS(&ptr->max_bps)));
6783c602fabSXin LI 	ND_TCHECK(ptr->bearer_type);
6793c602fabSXin LI 	pptp_bearer_type_print(ndo, &ptr->bearer_type);
6803c602fabSXin LI 	ND_TCHECK(ptr->framing_type);
6813c602fabSXin LI 	pptp_framing_type_print(ndo, &ptr->framing_type);
6823c602fabSXin LI 	ND_TCHECK(ptr->recv_winsiz);
6833c602fabSXin LI 	pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz);
6843c602fabSXin LI 	ND_TCHECK(ptr->pkt_proc_delay);
6853c602fabSXin LI 	pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay);
6863c602fabSXin LI 	ND_TCHECK(ptr->phone_no_len);
6873c602fabSXin LI 	ND_PRINT((ndo, " PHONE_NO_LEN(%u)", EXTRACT_16BITS(&ptr->phone_no_len)));
6883c602fabSXin LI 	ND_TCHECK(ptr->reserved1);
6893c602fabSXin LI 	ND_TCHECK(ptr->phone_no);
6903c602fabSXin LI 	ND_PRINT((ndo, " PHONE_NO(%.64s)", ptr->phone_no));
6913c602fabSXin LI 	ND_TCHECK(ptr->subaddr);
6923c602fabSXin LI 	pptp_subaddr_print(ndo, &ptr->subaddr[0]);
693a90e161bSBill Fenner 
694a90e161bSBill Fenner 	return;
695a90e161bSBill Fenner 
696a90e161bSBill Fenner trunc:
6973c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
698a90e161bSBill Fenner }
699a90e161bSBill Fenner 
700a90e161bSBill Fenner static void
7013c602fabSXin LI pptp_ocrp_print(netdissect_options *ndo,
7023c602fabSXin LI                 const u_char *dat)
703a90e161bSBill Fenner {
704*3340d773SGleb Smirnoff 	const struct pptp_msg_ocrp *ptr = (const struct pptp_msg_ocrp *)dat;
705a90e161bSBill Fenner 
7063c602fabSXin LI 	ND_TCHECK(ptr->call_id);
7073c602fabSXin LI 	pptp_call_id_print(ndo, &ptr->call_id);
7083c602fabSXin LI 	ND_TCHECK(ptr->peer_call_id);
7093c602fabSXin LI 	pptp_peer_call_id_print(ndo, &ptr->peer_call_id);
7103c602fabSXin LI 	ND_TCHECK(ptr->result_code);
7113c602fabSXin LI 	pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_OCRP);
7123c602fabSXin LI 	ND_TCHECK(ptr->err_code);
7133c602fabSXin LI 	pptp_err_code_print(ndo, &ptr->err_code);
7143c602fabSXin LI 	ND_TCHECK(ptr->cause_code);
7153c602fabSXin LI 	pptp_cause_code_print(ndo, &ptr->cause_code);
7163c602fabSXin LI 	ND_TCHECK(ptr->conn_speed);
7173c602fabSXin LI 	pptp_conn_speed_print(ndo, &ptr->conn_speed);
7183c602fabSXin LI 	ND_TCHECK(ptr->recv_winsiz);
7193c602fabSXin LI 	pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz);
7203c602fabSXin LI 	ND_TCHECK(ptr->pkt_proc_delay);
7213c602fabSXin LI 	pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay);
7223c602fabSXin LI 	ND_TCHECK(ptr->phy_chan_id);
7233c602fabSXin LI 	pptp_phy_chan_id_print(ndo, &ptr->phy_chan_id);
724a90e161bSBill Fenner 
725a90e161bSBill Fenner 	return;
726a90e161bSBill Fenner 
727a90e161bSBill Fenner trunc:
7283c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
729a90e161bSBill Fenner }
730a90e161bSBill Fenner 
731a90e161bSBill Fenner static void
7323c602fabSXin LI pptp_icrq_print(netdissect_options *ndo,
7333c602fabSXin LI                 const u_char *dat)
734a90e161bSBill Fenner {
735*3340d773SGleb Smirnoff 	const struct pptp_msg_icrq *ptr = (const struct pptp_msg_icrq *)dat;
736a90e161bSBill Fenner 
7373c602fabSXin LI 	ND_TCHECK(ptr->call_id);
7383c602fabSXin LI 	pptp_call_id_print(ndo, &ptr->call_id);
7393c602fabSXin LI 	ND_TCHECK(ptr->call_ser);
7403c602fabSXin LI 	pptp_call_ser_print(ndo, &ptr->call_ser);
7413c602fabSXin LI 	ND_TCHECK(ptr->bearer_type);
7423c602fabSXin LI 	pptp_bearer_type_print(ndo, &ptr->bearer_type);
7433c602fabSXin LI 	ND_TCHECK(ptr->phy_chan_id);
7443c602fabSXin LI 	pptp_phy_chan_id_print(ndo, &ptr->phy_chan_id);
7453c602fabSXin LI 	ND_TCHECK(ptr->dialed_no_len);
7463c602fabSXin LI 	ND_PRINT((ndo, " DIALED_NO_LEN(%u)", EXTRACT_16BITS(&ptr->dialed_no_len)));
7473c602fabSXin LI 	ND_TCHECK(ptr->dialing_no_len);
7483c602fabSXin LI 	ND_PRINT((ndo, " DIALING_NO_LEN(%u)", EXTRACT_16BITS(&ptr->dialing_no_len)));
7493c602fabSXin LI 	ND_TCHECK(ptr->dialed_no);
7503c602fabSXin LI 	ND_PRINT((ndo, " DIALED_NO(%.64s)", ptr->dialed_no));
7513c602fabSXin LI 	ND_TCHECK(ptr->dialing_no);
7523c602fabSXin LI 	ND_PRINT((ndo, " DIALING_NO(%.64s)", ptr->dialing_no));
7533c602fabSXin LI 	ND_TCHECK(ptr->subaddr);
7543c602fabSXin LI 	pptp_subaddr_print(ndo, &ptr->subaddr[0]);
755a90e161bSBill Fenner 
756a90e161bSBill Fenner 	return;
757a90e161bSBill Fenner 
758a90e161bSBill Fenner trunc:
7593c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
760a90e161bSBill Fenner }
761a90e161bSBill Fenner 
762a90e161bSBill Fenner static void
7633c602fabSXin LI pptp_icrp_print(netdissect_options *ndo,
7643c602fabSXin LI                 const u_char *dat)
765a90e161bSBill Fenner {
766*3340d773SGleb Smirnoff 	const struct pptp_msg_icrp *ptr = (const struct pptp_msg_icrp *)dat;
767a90e161bSBill Fenner 
7683c602fabSXin LI 	ND_TCHECK(ptr->call_id);
7693c602fabSXin LI 	pptp_call_id_print(ndo, &ptr->call_id);
7703c602fabSXin LI 	ND_TCHECK(ptr->peer_call_id);
7713c602fabSXin LI 	pptp_peer_call_id_print(ndo, &ptr->peer_call_id);
7723c602fabSXin LI 	ND_TCHECK(ptr->result_code);
7733c602fabSXin LI 	pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_ICRP);
7743c602fabSXin LI 	ND_TCHECK(ptr->err_code);
7753c602fabSXin LI 	pptp_err_code_print(ndo, &ptr->err_code);
7763c602fabSXin LI 	ND_TCHECK(ptr->recv_winsiz);
7773c602fabSXin LI 	pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz);
7783c602fabSXin LI 	ND_TCHECK(ptr->pkt_proc_delay);
7793c602fabSXin LI 	pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay);
7803c602fabSXin LI 	ND_TCHECK(ptr->reserved1);
781a90e161bSBill Fenner 
782a90e161bSBill Fenner 	return;
783a90e161bSBill Fenner 
784a90e161bSBill Fenner trunc:
7853c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
786a90e161bSBill Fenner }
787a90e161bSBill Fenner 
788a90e161bSBill Fenner static void
7893c602fabSXin LI pptp_iccn_print(netdissect_options *ndo,
7903c602fabSXin LI                 const u_char *dat)
791a90e161bSBill Fenner {
792*3340d773SGleb Smirnoff 	const struct pptp_msg_iccn *ptr = (const struct pptp_msg_iccn *)dat;
793a90e161bSBill Fenner 
7943c602fabSXin LI 	ND_TCHECK(ptr->peer_call_id);
7953c602fabSXin LI 	pptp_peer_call_id_print(ndo, &ptr->peer_call_id);
7963c602fabSXin LI 	ND_TCHECK(ptr->reserved1);
7973c602fabSXin LI 	ND_TCHECK(ptr->conn_speed);
7983c602fabSXin LI 	pptp_conn_speed_print(ndo, &ptr->conn_speed);
7993c602fabSXin LI 	ND_TCHECK(ptr->recv_winsiz);
8003c602fabSXin LI 	pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz);
8013c602fabSXin LI 	ND_TCHECK(ptr->pkt_proc_delay);
8023c602fabSXin LI 	pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay);
8033c602fabSXin LI 	ND_TCHECK(ptr->framing_type);
8043c602fabSXin LI 	pptp_framing_type_print(ndo, &ptr->framing_type);
805a90e161bSBill Fenner 
806a90e161bSBill Fenner 	return;
807a90e161bSBill Fenner 
808a90e161bSBill Fenner trunc:
8093c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
810a90e161bSBill Fenner }
811a90e161bSBill Fenner 
812a90e161bSBill Fenner static void
8133c602fabSXin LI pptp_ccrq_print(netdissect_options *ndo,
8143c602fabSXin LI                 const u_char *dat)
815a90e161bSBill Fenner {
816*3340d773SGleb Smirnoff 	const struct pptp_msg_ccrq *ptr = (const struct pptp_msg_ccrq *)dat;
817a90e161bSBill Fenner 
8183c602fabSXin LI 	ND_TCHECK(ptr->call_id);
8193c602fabSXin LI 	pptp_call_id_print(ndo, &ptr->call_id);
8203c602fabSXin LI 	ND_TCHECK(ptr->reserved1);
821a90e161bSBill Fenner 
822a90e161bSBill Fenner 	return;
823a90e161bSBill Fenner 
824a90e161bSBill Fenner trunc:
8253c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
826a90e161bSBill Fenner }
827a90e161bSBill Fenner 
828a90e161bSBill Fenner static void
8293c602fabSXin LI pptp_cdn_print(netdissect_options *ndo,
8303c602fabSXin LI                const u_char *dat)
831a90e161bSBill Fenner {
832*3340d773SGleb Smirnoff 	const struct pptp_msg_cdn *ptr = (const struct pptp_msg_cdn *)dat;
833a90e161bSBill Fenner 
8343c602fabSXin LI 	ND_TCHECK(ptr->call_id);
8353c602fabSXin LI 	pptp_call_id_print(ndo, &ptr->call_id);
8363c602fabSXin LI 	ND_TCHECK(ptr->result_code);
8373c602fabSXin LI 	pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_CDN);
8383c602fabSXin LI 	ND_TCHECK(ptr->err_code);
8393c602fabSXin LI 	pptp_err_code_print(ndo, &ptr->err_code);
8403c602fabSXin LI 	ND_TCHECK(ptr->cause_code);
8413c602fabSXin LI 	pptp_cause_code_print(ndo, &ptr->cause_code);
8423c602fabSXin LI 	ND_TCHECK(ptr->reserved1);
8433c602fabSXin LI 	ND_TCHECK(ptr->call_stats);
8443c602fabSXin LI 	ND_PRINT((ndo, " CALL_STATS(%.128s)", ptr->call_stats));
845a90e161bSBill Fenner 
846a90e161bSBill Fenner 	return;
847a90e161bSBill Fenner 
848a90e161bSBill Fenner trunc:
8493c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
850a90e161bSBill Fenner }
851a90e161bSBill Fenner 
852a90e161bSBill Fenner static void
8533c602fabSXin LI pptp_wen_print(netdissect_options *ndo,
8543c602fabSXin LI                const u_char *dat)
855a90e161bSBill Fenner {
856*3340d773SGleb Smirnoff 	const struct pptp_msg_wen *ptr = (const struct pptp_msg_wen *)dat;
857a90e161bSBill Fenner 
8583c602fabSXin LI 	ND_TCHECK(ptr->peer_call_id);
8593c602fabSXin LI 	pptp_peer_call_id_print(ndo, &ptr->peer_call_id);
8603c602fabSXin LI 	ND_TCHECK(ptr->reserved1);
8613c602fabSXin LI 	ND_TCHECK(ptr->crc_err);
8623c602fabSXin LI 	ND_PRINT((ndo, " CRC_ERR(%u)", EXTRACT_32BITS(&ptr->crc_err)));
8633c602fabSXin LI 	ND_TCHECK(ptr->framing_err);
8643c602fabSXin LI 	ND_PRINT((ndo, " FRAMING_ERR(%u)", EXTRACT_32BITS(&ptr->framing_err)));
8653c602fabSXin LI 	ND_TCHECK(ptr->hardware_overrun);
8663c602fabSXin LI 	ND_PRINT((ndo, " HARDWARE_OVERRUN(%u)", EXTRACT_32BITS(&ptr->hardware_overrun)));
8673c602fabSXin LI 	ND_TCHECK(ptr->buffer_overrun);
8683c602fabSXin LI 	ND_PRINT((ndo, " BUFFER_OVERRUN(%u)", EXTRACT_32BITS(&ptr->buffer_overrun)));
8693c602fabSXin LI 	ND_TCHECK(ptr->timeout_err);
8703c602fabSXin LI 	ND_PRINT((ndo, " TIMEOUT_ERR(%u)", EXTRACT_32BITS(&ptr->timeout_err)));
8713c602fabSXin LI 	ND_TCHECK(ptr->align_err);
8723c602fabSXin LI 	ND_PRINT((ndo, " ALIGN_ERR(%u)", EXTRACT_32BITS(&ptr->align_err)));
873a90e161bSBill Fenner 
874a90e161bSBill Fenner 	return;
875a90e161bSBill Fenner 
876a90e161bSBill Fenner trunc:
8773c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
878a90e161bSBill Fenner }
879a90e161bSBill Fenner 
880a90e161bSBill Fenner static void
8813c602fabSXin LI pptp_sli_print(netdissect_options *ndo,
8823c602fabSXin LI                const u_char *dat)
883a90e161bSBill Fenner {
884*3340d773SGleb Smirnoff 	const struct pptp_msg_sli *ptr = (const struct pptp_msg_sli *)dat;
885a90e161bSBill Fenner 
8863c602fabSXin LI 	ND_TCHECK(ptr->peer_call_id);
8873c602fabSXin LI 	pptp_peer_call_id_print(ndo, &ptr->peer_call_id);
8883c602fabSXin LI 	ND_TCHECK(ptr->reserved1);
8893c602fabSXin LI 	ND_TCHECK(ptr->send_accm);
8903c602fabSXin LI 	ND_PRINT((ndo, " SEND_ACCM(0x%08x)", EXTRACT_32BITS(&ptr->send_accm)));
8913c602fabSXin LI 	ND_TCHECK(ptr->recv_accm);
8923c602fabSXin LI 	ND_PRINT((ndo, " RECV_ACCM(0x%08x)", EXTRACT_32BITS(&ptr->recv_accm)));
893a90e161bSBill Fenner 
894a90e161bSBill Fenner 	return;
895a90e161bSBill Fenner 
896a90e161bSBill Fenner trunc:
8973c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
898a90e161bSBill Fenner }
899a90e161bSBill Fenner 
900a90e161bSBill Fenner void
9013c602fabSXin LI pptp_print(netdissect_options *ndo,
9023c602fabSXin LI            const u_char *dat)
903a90e161bSBill Fenner {
904a90e161bSBill Fenner 	const struct pptp_hdr *hdr;
9053c602fabSXin LI 	uint32_t mc;
9063c602fabSXin LI 	uint16_t ctrl_msg_type;
907a90e161bSBill Fenner 
9083c602fabSXin LI 	ND_PRINT((ndo, ": pptp"));
909a90e161bSBill Fenner 
910*3340d773SGleb Smirnoff 	hdr = (const struct pptp_hdr *)dat;
911a90e161bSBill Fenner 
9123c602fabSXin LI 	ND_TCHECK(hdr->length);
9133c602fabSXin LI 	if (ndo->ndo_vflag) {
9143c602fabSXin LI 		ND_PRINT((ndo, " Length=%u", EXTRACT_16BITS(&hdr->length)));
915a90e161bSBill Fenner 	}
9163c602fabSXin LI 	ND_TCHECK(hdr->msg_type);
9173c602fabSXin LI 	if (ndo->ndo_vflag) {
9185b0fe478SBruce M Simpson 		switch(EXTRACT_16BITS(&hdr->msg_type)) {
919a90e161bSBill Fenner 		case PPTP_MSG_TYPE_CTRL:
9203c602fabSXin LI 			ND_PRINT((ndo, " CTRL-MSG"));
921a90e161bSBill Fenner 			break;
922a90e161bSBill Fenner 		case PPTP_MSG_TYPE_MGMT:
9233c602fabSXin LI 			ND_PRINT((ndo, " MGMT-MSG"));
924a90e161bSBill Fenner 			break;
925a90e161bSBill Fenner 		default:
9263c602fabSXin LI 			ND_PRINT((ndo, " UNKNOWN-MSG-TYPE"));
927a90e161bSBill Fenner 			break;
928a90e161bSBill Fenner 		}
929a90e161bSBill Fenner 	}
930a90e161bSBill Fenner 
9313c602fabSXin LI 	ND_TCHECK(hdr->magic_cookie);
9325b0fe478SBruce M Simpson 	mc = EXTRACT_32BITS(&hdr->magic_cookie);
933a90e161bSBill Fenner 	if (mc != PPTP_MAGIC_COOKIE) {
9343c602fabSXin LI 		ND_PRINT((ndo, " UNEXPECTED Magic-Cookie!!(%08x)", mc));
935a90e161bSBill Fenner 	}
9363c602fabSXin LI 	if (ndo->ndo_vflag || mc != PPTP_MAGIC_COOKIE) {
9373c602fabSXin LI 		ND_PRINT((ndo, " Magic-Cookie=%08x", mc));
938a90e161bSBill Fenner 	}
9393c602fabSXin LI 	ND_TCHECK(hdr->ctrl_msg_type);
9405b0fe478SBruce M Simpson 	ctrl_msg_type = EXTRACT_16BITS(&hdr->ctrl_msg_type);
941a90e161bSBill Fenner 	if (ctrl_msg_type < PPTP_MAX_MSGTYPE_INDEX) {
9423c602fabSXin LI 		ND_PRINT((ndo, " CTRL_MSGTYPE=%s",
9433c602fabSXin LI 		       pptp_message_type_string[ctrl_msg_type]));
944a90e161bSBill Fenner 	} else {
9453c602fabSXin LI 		ND_PRINT((ndo, " UNKNOWN_CTRL_MSGTYPE(%u)", ctrl_msg_type));
946a90e161bSBill Fenner 	}
9473c602fabSXin LI 	ND_TCHECK(hdr->reserved0);
948a90e161bSBill Fenner 
949a90e161bSBill Fenner 	dat += 12;
950a90e161bSBill Fenner 
951a90e161bSBill Fenner 	switch(ctrl_msg_type) {
952a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_SCCRQ:
9533c602fabSXin LI 		pptp_sccrq_print(ndo, dat);
954a90e161bSBill Fenner 		break;
955a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_SCCRP:
9563c602fabSXin LI 		pptp_sccrp_print(ndo, dat);
957a90e161bSBill Fenner 		break;
958a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_StopCCRQ:
9593c602fabSXin LI 		pptp_stopccrq_print(ndo, dat);
960a90e161bSBill Fenner 		break;
961a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_StopCCRP:
9623c602fabSXin LI 		pptp_stopccrp_print(ndo, dat);
963a90e161bSBill Fenner 		break;
964a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_ECHORQ:
9653c602fabSXin LI 		pptp_echorq_print(ndo, dat);
966a90e161bSBill Fenner 		break;
967a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_ECHORP:
9683c602fabSXin LI 		pptp_echorp_print(ndo, dat);
969a90e161bSBill Fenner 		break;
970a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_OCRQ:
9713c602fabSXin LI 		pptp_ocrq_print(ndo, dat);
972a90e161bSBill Fenner 		break;
973a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_OCRP:
9743c602fabSXin LI 		pptp_ocrp_print(ndo, dat);
975a90e161bSBill Fenner 		break;
976a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_ICRQ:
9773c602fabSXin LI 		pptp_icrq_print(ndo, dat);
978a90e161bSBill Fenner 		break;
979a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_ICRP:
9803c602fabSXin LI 		pptp_icrp_print(ndo, dat);
981a90e161bSBill Fenner 		break;
982a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_ICCN:
9833c602fabSXin LI 		pptp_iccn_print(ndo, dat);
984a90e161bSBill Fenner 		break;
985a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_CCRQ:
9863c602fabSXin LI 		pptp_ccrq_print(ndo, dat);
987a90e161bSBill Fenner 		break;
988a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_CDN:
9893c602fabSXin LI 		pptp_cdn_print(ndo, dat);
990a90e161bSBill Fenner 		break;
991a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_WEN:
9923c602fabSXin LI 		pptp_wen_print(ndo, dat);
993a90e161bSBill Fenner 		break;
994a90e161bSBill Fenner 	case PPTP_CTRL_MSG_TYPE_SLI:
9953c602fabSXin LI 		pptp_sli_print(ndo, dat);
996a90e161bSBill Fenner 		break;
997a90e161bSBill Fenner 	default:
998a90e161bSBill Fenner 		/* do nothing */
999a90e161bSBill Fenner 		break;
1000a90e161bSBill Fenner 	}
1001a90e161bSBill Fenner 
1002a90e161bSBill Fenner 	return;
1003a90e161bSBill Fenner 
1004a90e161bSBill Fenner trunc:
10053c602fabSXin LI 	ND_PRINT((ndo, "%s", tstr));
1006a90e161bSBill Fenner }
1007