198524Sfenner/*
298524Sfenner * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997
398524Sfenner *      The Regents of the University of California.  All rights reserved.
498524Sfenner *
598524Sfenner * Redistribution and use in source and binary forms, with or without
698524Sfenner * modification, are permitted provided that: (1) source code distributions
798524Sfenner * retain the above copyright notice and this paragraph in its entirety, (2)
898524Sfenner * distributions including binary code include the above copyright notice and
998524Sfenner * this paragraph in its entirety in the documentation or other materials
1098524Sfenner * provided with the distribution, and (3) all advertising materials mentioning
1198524Sfenner * features or use of this software display the following acknowledgement:
1298524Sfenner * ``This product includes software developed by the University of California,
1398524Sfenner * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
1498524Sfenner * the University nor the names of its contributors may be used to endorse
1598524Sfenner * or promote products derived from this software without specific prior
1698524Sfenner * written permission.
1798524Sfenner * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
1898524Sfenner * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
1998524Sfenner * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
2098524Sfenner *
2198524Sfenner * PPTP support contributed by Motonori Shindo (mshindo@mshindo.net)
2298524Sfenner */
2398524Sfenner
2498524Sfenner
2598524Sfenner#ifndef lint
26127668Sbmsstatic const char rcsid[] _U_ =
27190207Srpaulo     "@(#) $Header: /tcpdump/master/tcpdump/print-pptp.c,v 1.12 2006-06-23 02:03:09 hannes Exp $";
2898524Sfenner#endif
2998524Sfenner
3098524Sfenner#ifdef HAVE_CONFIG_H
3198524Sfenner#include "config.h"
3298524Sfenner#endif
3398524Sfenner
34127668Sbms#include <tcpdump-stdinc.h>
35127668Sbms
3698524Sfenner#include <stdio.h>
3798524Sfenner
3898524Sfenner#include "interface.h"
39127668Sbms#include "extract.h"
4098524Sfenner
4198524Sfennerstatic char tstr[] = " [|pptp]";
4298524Sfenner
4398524Sfenner#define PPTP_MSG_TYPE_CTRL	1	/* Control Message */
4498524Sfenner#define PPTP_MSG_TYPE_MGMT	2	/* Management Message (currently not used */
4598524Sfenner#define PPTP_MAGIC_COOKIE	0x1a2b3c4d	/* for sanity check */
4698524Sfenner
4798524Sfenner#define PPTP_CTRL_MSG_TYPE_SCCRQ	1
4898524Sfenner#define PPTP_CTRL_MSG_TYPE_SCCRP	2
49127668Sbms#define PPTP_CTRL_MSG_TYPE_StopCCRQ	3
5098524Sfenner#define PPTP_CTRL_MSG_TYPE_StopCCRP	4
5198524Sfenner#define PPTP_CTRL_MSG_TYPE_ECHORQ	5
5298524Sfenner#define PPTP_CTRL_MSG_TYPE_ECHORP	6
5398524Sfenner#define PPTP_CTRL_MSG_TYPE_OCRQ		7
5498524Sfenner#define PPTP_CTRL_MSG_TYPE_OCRP		8
5598524Sfenner#define PPTP_CTRL_MSG_TYPE_ICRQ		9
5698524Sfenner#define PPTP_CTRL_MSG_TYPE_ICRP		10
5798524Sfenner#define PPTP_CTRL_MSG_TYPE_ICCN		11
5898524Sfenner#define PPTP_CTRL_MSG_TYPE_CCRQ		12
5998524Sfenner#define PPTP_CTRL_MSG_TYPE_CDN		13
6098524Sfenner#define PPTP_CTRL_MSG_TYPE_WEN		14
6198524Sfenner#define PPTP_CTRL_MSG_TYPE_SLI		15
6298524Sfenner
6398524Sfenner#define PPTP_FRAMING_CAP_ASYNC_MASK	0x00000001      /* Aynchronous */
6498524Sfenner#define PPTP_FRAMING_CAP_SYNC_MASK	0x00000002      /* Synchronous */
6598524Sfenner
6698524Sfenner#define PPTP_BEARER_CAP_ANALOG_MASK	0x00000001      /* Analog */
6798524Sfenner#define PPTP_BEARER_CAP_DIGITAL_MASK	0x00000002      /* Digital */
6898524Sfenner
69127668Sbmsstatic const char *pptp_message_type_string[] = {
7098524Sfenner	"NOT_DEFINED",		/* 0  Not defined in the RFC2637 */
7198524Sfenner	"SCCRQ",		/* 1  Start-Control-Connection-Request */
7298524Sfenner	"SCCRP",		/* 2  Start-Control-Connection-Reply */
7398524Sfenner	"StopCCRQ",		/* 3  Stop-Control-Connection-Request */
7498524Sfenner	"StopCCRP",		/* 4  Stop-Control-Connection-Reply */
7598524Sfenner	"ECHORQ",		/* 5  Echo Request */
7698524Sfenner	"ECHORP",		/* 6  Echo Reply */
7798524Sfenner
7898524Sfenner	"OCRQ",			/* 7  Outgoing-Call-Request */
7998524Sfenner	"OCRP",			/* 8  Outgoing-Call-Reply */
8098524Sfenner	"ICRQ",			/* 9  Incoming-Call-Request */
8198524Sfenner	"ICRP",			/* 10 Incoming-Call-Reply */
8298524Sfenner	"ICCN",			/* 11 Incoming-Call-Connected */
8398524Sfenner	"CCRQ",			/* 12 Call-Clear-Request */
8498524Sfenner	"CDN",			/* 13 Call-Disconnect-Notify */
8598524Sfenner
8698524Sfenner	"WEN",			/* 14 WAN-Error-Notify */
8798524Sfenner
8898524Sfenner	"SLI"			/* 15 Set-Link-Info */
8998524Sfenner#define PPTP_MAX_MSGTYPE_INDEX	16
9098524Sfenner};
9198524Sfenner
9298524Sfenner/* common for all PPTP control messages */
9398524Sfennerstruct pptp_hdr {
9498524Sfenner	u_int16_t length;
9598524Sfenner	u_int16_t msg_type;
9698524Sfenner	u_int32_t magic_cookie;
9798524Sfenner	u_int16_t ctrl_msg_type;
9898524Sfenner	u_int16_t reserved0;
9998524Sfenner};
10098524Sfenner
10198524Sfennerstruct pptp_msg_sccrq {
10298524Sfenner	u_int16_t proto_ver;
10398524Sfenner	u_int16_t reserved1;
10498524Sfenner	u_int32_t framing_cap;
10598524Sfenner	u_int32_t bearer_cap;
10698524Sfenner	u_int16_t max_channel;
10798524Sfenner	u_int16_t firm_rev;
10898524Sfenner	u_char hostname[64];
10998524Sfenner	u_char vendor[64];
11098524Sfenner};
11198524Sfenner
11298524Sfennerstruct pptp_msg_sccrp {
11398524Sfenner	u_int16_t proto_ver;
11498524Sfenner	u_int8_t result_code;
11598524Sfenner	u_int8_t err_code;
11698524Sfenner	u_int32_t framing_cap;
11798524Sfenner	u_int32_t bearer_cap;
11898524Sfenner	u_int16_t max_channel;
11998524Sfenner	u_int16_t firm_rev;
12098524Sfenner	u_char hostname[64];
12198524Sfenner	u_char vendor[64];
12298524Sfenner};
12398524Sfenner
12498524Sfennerstruct pptp_msg_stopccrq {
12598524Sfenner	u_int8_t reason;
12698524Sfenner	u_int8_t reserved1;
12798524Sfenner	u_int16_t reserved2;
12898524Sfenner};
12998524Sfenner
13098524Sfennerstruct pptp_msg_stopccrp {
13198524Sfenner	u_int8_t result_code;
13298524Sfenner	u_int8_t err_code;
13398524Sfenner	u_int16_t reserved1;
13498524Sfenner};
13598524Sfenner
13698524Sfennerstruct pptp_msg_echorq {
13798524Sfenner	u_int32_t id;
13898524Sfenner};
13998524Sfenner
14098524Sfennerstruct pptp_msg_echorp {
14198524Sfenner	u_int32_t id;
14298524Sfenner	u_int8_t result_code;
14398524Sfenner	u_int8_t err_code;
14498524Sfenner	u_int16_t reserved1;
14598524Sfenner};
14698524Sfenner
14798524Sfennerstruct pptp_msg_ocrq {
14898524Sfenner	u_int16_t call_id;
14998524Sfenner	u_int16_t call_ser;
15098524Sfenner	u_int32_t min_bps;
15198524Sfenner	u_int32_t max_bps;
15298524Sfenner	u_int32_t bearer_type;
15398524Sfenner	u_int32_t framing_type;
15498524Sfenner	u_int16_t recv_winsiz;
15598524Sfenner	u_int16_t pkt_proc_delay;
15698524Sfenner	u_int16_t phone_no_len;
15798524Sfenner	u_int16_t reserved1;
15898524Sfenner	u_char phone_no[64];
15998524Sfenner	u_char subaddr[64];
16098524Sfenner};
16198524Sfenner
16298524Sfennerstruct pptp_msg_ocrp {
16398524Sfenner	u_int16_t call_id;
16498524Sfenner	u_int16_t peer_call_id;
16598524Sfenner	u_int8_t result_code;
16698524Sfenner	u_int8_t err_code;
16798524Sfenner	u_int16_t cause_code;
16898524Sfenner	u_int32_t conn_speed;
16998524Sfenner	u_int16_t recv_winsiz;
17098524Sfenner	u_int16_t pkt_proc_delay;
17198524Sfenner	u_int32_t phy_chan_id;
17298524Sfenner};
17398524Sfenner
17498524Sfennerstruct pptp_msg_icrq {
17598524Sfenner	u_int16_t call_id;
17698524Sfenner	u_int16_t call_ser;
17798524Sfenner	u_int32_t bearer_type;
17898524Sfenner	u_int32_t phy_chan_id;
179127668Sbms	u_int16_t dialed_no_len;
180127668Sbms	u_int16_t dialing_no_len;
18198524Sfenner	u_char dialed_no[64];		/* DNIS */
18298524Sfenner	u_char dialing_no[64];		/* CLID */
18398524Sfenner	u_char subaddr[64];
18498524Sfenner};
18598524Sfenner
18698524Sfennerstruct pptp_msg_icrp {
18798524Sfenner	u_int16_t call_id;
18898524Sfenner	u_int16_t peer_call_id;
18998524Sfenner	u_int8_t result_code;
19098524Sfenner	u_int8_t err_code;
19198524Sfenner	u_int16_t recv_winsiz;
19298524Sfenner	u_int16_t pkt_proc_delay;
19398524Sfenner	u_int16_t reserved1;
19498524Sfenner};
19598524Sfenner
19698524Sfennerstruct pptp_msg_iccn {
19798524Sfenner	u_int16_t peer_call_id;
19898524Sfenner	u_int16_t reserved1;
19998524Sfenner	u_int32_t conn_speed;
20098524Sfenner	u_int16_t recv_winsiz;
20198524Sfenner	u_int16_t pkt_proc_delay;
20298524Sfenner	u_int32_t framing_type;
20398524Sfenner};
20498524Sfenner
20598524Sfennerstruct pptp_msg_ccrq {
20698524Sfenner	u_int16_t call_id;
20798524Sfenner	u_int16_t reserved1;
20898524Sfenner};
20998524Sfenner
21098524Sfennerstruct pptp_msg_cdn {
21198524Sfenner	u_int16_t call_id;
21298524Sfenner	u_int8_t result_code;
21398524Sfenner	u_int8_t err_code;
21498524Sfenner	u_int16_t cause_code;
21598524Sfenner	u_int16_t reserved1;
21698524Sfenner	u_char call_stats[128];
21798524Sfenner};
21898524Sfenner
21998524Sfennerstruct pptp_msg_wen {
22098524Sfenner	u_int16_t peer_call_id;
22198524Sfenner	u_int16_t reserved1;
22298524Sfenner	u_int32_t crc_err;
22398524Sfenner	u_int32_t framing_err;
22498524Sfenner	u_int32_t hardware_overrun;
22598524Sfenner	u_int32_t buffer_overrun;
22698524Sfenner	u_int32_t timeout_err;
22798524Sfenner	u_int32_t align_err;
22898524Sfenner};
22998524Sfenner
23098524Sfennerstruct pptp_msg_sli {
23198524Sfenner	u_int16_t peer_call_id;
23298524Sfenner	u_int16_t reserved1;
23398524Sfenner	u_int32_t send_accm;
23498524Sfenner	u_int32_t recv_accm;
23598524Sfenner};
23698524Sfenner
23798524Sfenner/* attributes that appear more than once in above messages:
23898524Sfenner
239127668Sbms   Number of
24098524Sfenner   occurence    attributes
24198524Sfenner  --------------------------------------
24298524Sfenner      2         u_int32_t bearer_cap;
24398524Sfenner      2         u_int32_t bearer_type;
24498524Sfenner      6         u_int16_t call_id;
24598524Sfenner      2         u_int16_t call_ser;
24698524Sfenner      2         u_int16_t cause_code;
24798524Sfenner      2         u_int32_t conn_speed;
24898524Sfenner      6         u_int8_t err_code;
24998524Sfenner      2         u_int16_t firm_rev;
25098524Sfenner      2         u_int32_t framing_cap;
25198524Sfenner      2         u_int32_t framing_type;
25298524Sfenner      2         u_char hostname[64];
25398524Sfenner      2         u_int32_t id;
25498524Sfenner      2         u_int16_t max_channel;
25598524Sfenner      5         u_int16_t peer_call_id;
25698524Sfenner      2         u_int32_t phy_chan_id;
25798524Sfenner      4         u_int16_t pkt_proc_delay;
25898524Sfenner      2         u_int16_t proto_ver;
25998524Sfenner      4         u_int16_t recv_winsiz;
26098524Sfenner      2         u_int8_t reserved1;
26198524Sfenner      9         u_int16_t reserved1;
26298524Sfenner      6         u_int8_t result_code;
26398524Sfenner      2         u_char subaddr[64];
26498524Sfenner      2         u_char vendor[64];
26598524Sfenner
266127668Sbms  so I will prepare print out functions for these attributes (except for
26798524Sfenner  reserved*).
26898524Sfenner*/
26998524Sfenner
27098524Sfenner/******************************************/
27198524Sfenner/* Attribute-specific print out functions */
27298524Sfenner/******************************************/
27398524Sfenner
27498524Sfenner/* In these attribute-specific print-out functions, it't not necessary
27598524Sfenner   to do TCHECK because they are already checked in the caller of
27698524Sfenner   these functions. */
27798524Sfenner
27898524Sfennerstatic void
27998524Sfennerpptp_bearer_cap_print(const u_int32_t *bearer_cap)
28098524Sfenner{
28198524Sfenner	printf(" BEARER_CAP(");
282127668Sbms	if (EXTRACT_32BITS(bearer_cap) & PPTP_BEARER_CAP_DIGITAL_MASK) {
28398524Sfenner                printf("D");
28498524Sfenner        }
285127668Sbms        if (EXTRACT_32BITS(bearer_cap) & PPTP_BEARER_CAP_ANALOG_MASK) {
28698524Sfenner                printf("A");
28798524Sfenner        }
28898524Sfenner	printf(")");
28998524Sfenner}
29098524Sfenner
29198524Sfennerstatic void
29298524Sfennerpptp_bearer_type_print(const u_int32_t *bearer_type)
29398524Sfenner{
29498524Sfenner	printf(" BEARER_TYPE(");
295127668Sbms	switch (EXTRACT_32BITS(bearer_type)) {
29698524Sfenner	case 1:
29798524Sfenner		printf("A");	/* Analog */
29898524Sfenner		break;
29998524Sfenner	case 2:
30098524Sfenner		printf("D");	/* Digital */
30198524Sfenner		break;
302127668Sbms	case 3:
30398524Sfenner		printf("Any");
30498524Sfenner		break;
30598524Sfenner	default:
30698524Sfenner		printf("?");
30798524Sfenner		break;
30898524Sfenner        }
30998524Sfenner	printf(")");
31098524Sfenner}
31198524Sfenner
31298524Sfennerstatic void
31398524Sfennerpptp_call_id_print(const u_int16_t *call_id)
31498524Sfenner{
315127668Sbms	printf(" CALL_ID(%u)", EXTRACT_16BITS(call_id));
31698524Sfenner}
31798524Sfenner
31898524Sfennerstatic void
31998524Sfennerpptp_call_ser_print(const u_int16_t *call_ser)
32098524Sfenner{
321127668Sbms	printf(" CALL_SER_NUM(%u)", EXTRACT_16BITS(call_ser));
32298524Sfenner}
32398524Sfenner
32498524Sfennerstatic void
32598524Sfennerpptp_cause_code_print(const u_int16_t *cause_code)
32698524Sfenner{
327127668Sbms	printf(" CAUSE_CODE(%u)", EXTRACT_16BITS(cause_code));
32898524Sfenner}
32998524Sfenner
33098524Sfennerstatic void
33198524Sfennerpptp_conn_speed_print(const u_int32_t *conn_speed)
33298524Sfenner{
333127668Sbms	printf(" CONN_SPEED(%u)", EXTRACT_32BITS(conn_speed));
33498524Sfenner}
33598524Sfenner
33698524Sfennerstatic void
33798524Sfennerpptp_err_code_print(const u_int8_t *err_code)
33898524Sfenner{
33998524Sfenner	printf(" ERR_CODE(%u", *err_code);
34098524Sfenner	if (vflag) {
34198524Sfenner		switch (*err_code) {
34298524Sfenner		case 0:
34398524Sfenner			printf(":None");
34498524Sfenner			break;
34598524Sfenner		case 1:
34698524Sfenner			printf(":Not-Connected");
34798524Sfenner			break;
34898524Sfenner		case 2:
34998524Sfenner			printf(":Bad-Format");
35098524Sfenner			break;
35198524Sfenner		case 3:
35298524Sfenner			printf(":Bad-Valude");
35398524Sfenner			break;
35498524Sfenner		case 4:
35598524Sfenner			printf(":No-Resource");
35698524Sfenner			break;
35798524Sfenner		case 5:
35898524Sfenner			printf(":Bad-Call-ID");
35998524Sfenner			break;
36098524Sfenner		case 6:
36198524Sfenner			printf(":PAC-Error");
36298524Sfenner			break;
36398524Sfenner		default:
36498524Sfenner			printf(":?");
36598524Sfenner			break;
36698524Sfenner		}
36798524Sfenner	}
36898524Sfenner	printf(")");
36998524Sfenner}
37098524Sfenner
37198524Sfennerstatic void
37298524Sfennerpptp_firm_rev_print(const u_int16_t *firm_rev)
37398524Sfenner{
374127668Sbms	printf(" FIRM_REV(%u)", EXTRACT_16BITS(firm_rev));
37598524Sfenner}
37698524Sfenner
37798524Sfennerstatic void
37898524Sfennerpptp_framing_cap_print(const u_int32_t *framing_cap)
37998524Sfenner{
38098524Sfenner	printf(" FRAME_CAP(");
381127668Sbms	if (EXTRACT_32BITS(framing_cap) & PPTP_FRAMING_CAP_ASYNC_MASK) {
38298524Sfenner                printf("A");		/* Async */
38398524Sfenner        }
384127668Sbms        if (EXTRACT_32BITS(framing_cap) & PPTP_FRAMING_CAP_SYNC_MASK) {
38598524Sfenner                printf("S");		/* Sync */
38698524Sfenner        }
38798524Sfenner	printf(")");
38898524Sfenner}
38998524Sfenner
39098524Sfennerstatic void
39198524Sfennerpptp_framing_type_print(const u_int32_t *framing_type)
39298524Sfenner{
39398524Sfenner	printf(" FRAME_TYPE(");
394127668Sbms	switch (EXTRACT_32BITS(framing_type)) {
39598524Sfenner	case 1:
39698524Sfenner		printf("A");		/* Async */
39798524Sfenner		break;
39898524Sfenner	case 2:
39998524Sfenner		printf("S");		/* Sync */
40098524Sfenner		break;
40198524Sfenner	case 3:
40298524Sfenner		printf("E");		/* Either */
40398524Sfenner		break;
40498524Sfenner	default:
40598524Sfenner		printf("?");
40698524Sfenner		break;
40798524Sfenner	}
40898524Sfenner	printf(")");
40998524Sfenner}
41098524Sfenner
41198524Sfennerstatic void
41298524Sfennerpptp_hostname_print(const u_char *hostname)
41398524Sfenner{
41498524Sfenner	printf(" HOSTNAME(%.64s)", hostname);
41598524Sfenner}
41698524Sfenner
41798524Sfennerstatic void
41898524Sfennerpptp_id_print(const u_int32_t *id)
41998524Sfenner{
420127668Sbms	printf(" ID(%u)", EXTRACT_32BITS(id));
42198524Sfenner}
42298524Sfenner
42398524Sfennerstatic void
42498524Sfennerpptp_max_channel_print(const u_int16_t *max_channel)
42598524Sfenner{
426127668Sbms	printf(" MAX_CHAN(%u)", EXTRACT_16BITS(max_channel));
42798524Sfenner}
42898524Sfenner
42998524Sfennerstatic void
43098524Sfennerpptp_peer_call_id_print(const u_int16_t *peer_call_id)
43198524Sfenner{
432127668Sbms	printf(" PEER_CALL_ID(%u)", EXTRACT_16BITS(peer_call_id));
43398524Sfenner}
43498524Sfenner
43598524Sfennerstatic void
43698524Sfennerpptp_phy_chan_id_print(const u_int32_t *phy_chan_id)
43798524Sfenner{
438127668Sbms	printf(" PHY_CHAN_ID(%u)", EXTRACT_32BITS(phy_chan_id));
43998524Sfenner}
44098524Sfenner
44198524Sfennerstatic void
44298524Sfennerpptp_pkt_proc_delay_print(const u_int16_t *pkt_proc_delay)
44398524Sfenner{
444127668Sbms	printf(" PROC_DELAY(%u)", EXTRACT_16BITS(pkt_proc_delay));
44598524Sfenner}
44698524Sfenner
44798524Sfennerstatic void
44898524Sfennerpptp_proto_ver_print(const u_int16_t *proto_ver)
44998524Sfenner{
45098524Sfenner	printf(" PROTO_VER(%u.%u)",	/* Version.Revision */
451127668Sbms	       EXTRACT_16BITS(proto_ver) >> 8,
452127668Sbms	       EXTRACT_16BITS(proto_ver) & 0xff);
45398524Sfenner}
45498524Sfenner
45598524Sfennerstatic void
45698524Sfennerpptp_recv_winsiz_print(const u_int16_t *recv_winsiz)
45798524Sfenner{
458127668Sbms	printf(" RECV_WIN(%u)", EXTRACT_16BITS(recv_winsiz));
45998524Sfenner}
46098524Sfenner
46198524Sfennerstatic void
46298524Sfennerpptp_result_code_print(const u_int8_t *result_code, int ctrl_msg_type)
46398524Sfenner{
46498524Sfenner	printf(" RESULT_CODE(%u", *result_code);
46598524Sfenner	if (vflag) {
46698524Sfenner		switch (ctrl_msg_type) {
46798524Sfenner		case PPTP_CTRL_MSG_TYPE_SCCRP:
46898524Sfenner			switch (*result_code) {
46998524Sfenner			case 1:
47098524Sfenner				printf(":Successful channel establishment");
47198524Sfenner				break;
47298524Sfenner			case 2:
47398524Sfenner				printf(":General error");
47498524Sfenner				break;
47598524Sfenner			case 3:
47698524Sfenner				printf(":Command channel already exists");
47798524Sfenner				break;
47898524Sfenner			case 4:
47998524Sfenner				printf(":Requester is not authorized to establish a command channel");
48098524Sfenner				break;
48198524Sfenner			case 5:
48298524Sfenner				printf(":The protocol version of the requester is not supported");
48398524Sfenner				break;
48498524Sfenner			default:
48598524Sfenner				printf(":?");
48698524Sfenner				break;
48798524Sfenner			}
48898524Sfenner			break;
48998524Sfenner		case PPTP_CTRL_MSG_TYPE_StopCCRP:
49098524Sfenner		case PPTP_CTRL_MSG_TYPE_ECHORP:
49198524Sfenner			switch (*result_code) {
49298524Sfenner			case 1:
49398524Sfenner				printf(":OK");
49498524Sfenner				break;
49598524Sfenner			case 2:
49698524Sfenner				printf(":General Error");
49798524Sfenner				break;
49898524Sfenner			default:
49998524Sfenner				printf(":?");
50098524Sfenner				break;
50198524Sfenner			}
50298524Sfenner			break;
50398524Sfenner		case PPTP_CTRL_MSG_TYPE_OCRP:
50498524Sfenner			switch (*result_code) {
50598524Sfenner			case 1:
50698524Sfenner				printf(":Connected");
50798524Sfenner				break;
50898524Sfenner			case 2:
50998524Sfenner				printf(":General Error");
51098524Sfenner				break;
51198524Sfenner			case 3:
51298524Sfenner				printf(":No Carrier");
51398524Sfenner				break;
51498524Sfenner			case 4:
51598524Sfenner				printf(":Busy");
51698524Sfenner				break;
51798524Sfenner			case 5:
51898524Sfenner				printf(":No Dial Tone");
51998524Sfenner				break;
52098524Sfenner			case 6:
52198524Sfenner				printf(":Time-out");
52298524Sfenner				break;
52398524Sfenner			case 7:
52498524Sfenner				printf(":Do Not Accept");
52598524Sfenner				break;
52698524Sfenner			default:
52798524Sfenner				printf(":?");
52898524Sfenner				break;
52998524Sfenner			}
53098524Sfenner			break;
53198524Sfenner		case PPTP_CTRL_MSG_TYPE_ICRP:
53298524Sfenner			switch (*result_code) {
53398524Sfenner			case 1:
53498524Sfenner				printf(":Connect");
53598524Sfenner				break;
53698524Sfenner			case 2:
53798524Sfenner				printf(":General Error");
53898524Sfenner				break;
53998524Sfenner			case 3:
54098524Sfenner				printf(":Do Not Accept");
54198524Sfenner				break;
54298524Sfenner			default:
54398524Sfenner				printf(":?");
54498524Sfenner				break;
54598524Sfenner			}
54698524Sfenner			break;
54798524Sfenner		case PPTP_CTRL_MSG_TYPE_CDN:
54898524Sfenner			switch (*result_code) {
54998524Sfenner			case 1:
55098524Sfenner				printf(":Lost Carrier");
55198524Sfenner				break;
55298524Sfenner			case 2:
55398524Sfenner				printf(":General Error");
55498524Sfenner				break;
55598524Sfenner			case 3:
55698524Sfenner				printf(":Admin Shutdown");
55798524Sfenner				break;
55898524Sfenner			case 4:
55998524Sfenner				printf(":Request");
56098524Sfenner			default:
56198524Sfenner				printf(":?");
56298524Sfenner				break;
56398524Sfenner			break;
56498524Sfenner			}
56598524Sfenner		default:
56698524Sfenner			/* assertion error */
56798524Sfenner			break;
56898524Sfenner		}
56998524Sfenner	}
57098524Sfenner	printf(")");
57198524Sfenner}
57298524Sfenner
57398524Sfennerstatic void
57498524Sfennerpptp_subaddr_print(const u_char *subaddr)
57598524Sfenner{
57698524Sfenner	printf(" SUB_ADDR(%.64s)", subaddr);
57798524Sfenner}
57898524Sfenner
57998524Sfennerstatic void
58098524Sfennerpptp_vendor_print(const u_char *vendor)
58198524Sfenner{
58298524Sfenner	printf(" VENDOR(%.64s)", vendor);
58398524Sfenner}
58498524Sfenner
58598524Sfenner/************************************/
58698524Sfenner/* PPTP message print out functions */
58798524Sfenner/************************************/
58898524Sfennerstatic void
58998524Sfennerpptp_sccrq_print(const u_char *dat)
59098524Sfenner{
59198524Sfenner	struct pptp_msg_sccrq *ptr = (struct pptp_msg_sccrq *)dat;
59298524Sfenner
59398524Sfenner	TCHECK(ptr->proto_ver);
59498524Sfenner	pptp_proto_ver_print(&ptr->proto_ver);
59598524Sfenner	TCHECK(ptr->reserved1);
59698524Sfenner	TCHECK(ptr->framing_cap);
59798524Sfenner	pptp_framing_cap_print(&ptr->framing_cap);
59898524Sfenner	TCHECK(ptr->bearer_cap);
59998524Sfenner	pptp_bearer_cap_print(&ptr->bearer_cap);
60098524Sfenner	TCHECK(ptr->max_channel);
60198524Sfenner	pptp_max_channel_print(&ptr->max_channel);
60298524Sfenner	TCHECK(ptr->firm_rev);
60398524Sfenner	pptp_firm_rev_print(&ptr->firm_rev);
60498524Sfenner	TCHECK(ptr->hostname);
60598524Sfenner	pptp_hostname_print(&ptr->hostname[0]);
60698524Sfenner	TCHECK(ptr->vendor);
60798524Sfenner	pptp_vendor_print(&ptr->vendor[0]);
60898524Sfenner
60998524Sfenner	return;
61098524Sfenner
61198524Sfennertrunc:
61298524Sfenner	printf("%s", tstr);
61398524Sfenner}
61498524Sfenner
61598524Sfennerstatic void
61698524Sfennerpptp_sccrp_print(const u_char *dat)
61798524Sfenner{
61898524Sfenner	struct pptp_msg_sccrp *ptr = (struct pptp_msg_sccrp *)dat;
61998524Sfenner
62098524Sfenner	TCHECK(ptr->proto_ver);
62198524Sfenner	pptp_proto_ver_print(&ptr->proto_ver);
62298524Sfenner	TCHECK(ptr->result_code);
62398524Sfenner	pptp_result_code_print(&ptr->result_code, PPTP_CTRL_MSG_TYPE_SCCRP);
62498524Sfenner	TCHECK(ptr->err_code);
62598524Sfenner	pptp_err_code_print(&ptr->err_code);
62698524Sfenner	TCHECK(ptr->framing_cap);
62798524Sfenner	pptp_framing_cap_print(&ptr->framing_cap);
62898524Sfenner	TCHECK(ptr->bearer_cap);
62998524Sfenner	pptp_bearer_cap_print(&ptr->bearer_cap);
63098524Sfenner	TCHECK(ptr->max_channel);
63198524Sfenner	pptp_max_channel_print(&ptr->max_channel);
63298524Sfenner	TCHECK(ptr->firm_rev);
63398524Sfenner	pptp_firm_rev_print(&ptr->firm_rev);
63498524Sfenner	TCHECK(ptr->hostname);
63598524Sfenner	pptp_hostname_print(&ptr->hostname[0]);
63698524Sfenner	TCHECK(ptr->vendor);
63798524Sfenner	pptp_vendor_print(&ptr->vendor[0]);
63898524Sfenner
63998524Sfenner	return;
64098524Sfenner
64198524Sfennertrunc:
64298524Sfenner	printf("%s", tstr);
64398524Sfenner}
64498524Sfenner
64598524Sfennerstatic void
64698524Sfennerpptp_stopccrq_print(const u_char *dat)
64798524Sfenner{
64898524Sfenner	struct pptp_msg_stopccrq *ptr = (struct pptp_msg_stopccrq *)dat;
64998524Sfenner
65098524Sfenner	TCHECK(ptr->reason);
65198524Sfenner	printf(" REASON(%u", ptr->reason);
65298524Sfenner	if (vflag) {
65398524Sfenner		switch (ptr->reason) {
65498524Sfenner		case 1:
65598524Sfenner			printf(":None");
65698524Sfenner			break;
65798524Sfenner		case 2:
65898524Sfenner			printf(":Stop-Protocol");
65998524Sfenner			break;
66098524Sfenner		case 3:
66198524Sfenner			printf(":Stop-Local-Shutdown");
66298524Sfenner			break;
66398524Sfenner		default:
66498524Sfenner			printf(":?");
66598524Sfenner			break;
66698524Sfenner		}
66798524Sfenner	}
66898524Sfenner	printf(")");
66998524Sfenner	TCHECK(ptr->reserved1);
67098524Sfenner	TCHECK(ptr->reserved2);
67198524Sfenner
67298524Sfenner	return;
67398524Sfenner
67498524Sfennertrunc:
67598524Sfenner	printf("%s", tstr);
67698524Sfenner}
67798524Sfenner
67898524Sfennerstatic void
67998524Sfennerpptp_stopccrp_print(const u_char *dat)
68098524Sfenner{
68198524Sfenner	struct pptp_msg_stopccrp *ptr = (struct pptp_msg_stopccrp *)dat;
68298524Sfenner
68398524Sfenner	TCHECK(ptr->result_code);
68498524Sfenner	pptp_result_code_print(&ptr->result_code, PPTP_CTRL_MSG_TYPE_StopCCRP);
68598524Sfenner	TCHECK(ptr->err_code);
68698524Sfenner	pptp_err_code_print(&ptr->err_code);
68798524Sfenner	TCHECK(ptr->reserved1);
68898524Sfenner
68998524Sfenner	return;
69098524Sfenner
69198524Sfennertrunc:
69298524Sfenner	printf("%s", tstr);
69398524Sfenner}
69498524Sfenner
69598524Sfennerstatic void
69698524Sfennerpptp_echorq_print(const u_char *dat)
69798524Sfenner{
69898524Sfenner	struct pptp_msg_echorq *ptr = (struct pptp_msg_echorq *)dat;
69998524Sfenner
70098524Sfenner	TCHECK(ptr->id);
70198524Sfenner	pptp_id_print(&ptr->id);
702127668Sbms
70398524Sfenner	return;
70498524Sfenner
70598524Sfennertrunc:
70698524Sfenner	printf("%s", tstr);
70798524Sfenner}
70898524Sfenner
70998524Sfennerstatic void
71098524Sfennerpptp_echorp_print(const u_char *dat)
71198524Sfenner{
71298524Sfenner	struct pptp_msg_echorp *ptr = (struct pptp_msg_echorp *)dat;
71398524Sfenner
71498524Sfenner	TCHECK(ptr->id);
71598524Sfenner	pptp_id_print(&ptr->id);
71698524Sfenner	TCHECK(ptr->result_code);
71798524Sfenner	pptp_result_code_print(&ptr->result_code, PPTP_CTRL_MSG_TYPE_ECHORP);
71898524Sfenner	TCHECK(ptr->err_code);
71998524Sfenner	pptp_err_code_print(&ptr->err_code);
72098524Sfenner	TCHECK(ptr->reserved1);
721127668Sbms
72298524Sfenner	return;
72398524Sfenner
72498524Sfennertrunc:
72598524Sfenner	printf("%s", tstr);
72698524Sfenner}
72798524Sfenner
72898524Sfennerstatic void
72998524Sfennerpptp_ocrq_print(const u_char *dat)
73098524Sfenner{
73198524Sfenner	struct pptp_msg_ocrq *ptr = (struct pptp_msg_ocrq *)dat;
73298524Sfenner
73398524Sfenner	TCHECK(ptr->call_id);
73498524Sfenner	pptp_call_id_print(&ptr->call_id);
73598524Sfenner	TCHECK(ptr->call_ser);
73698524Sfenner	pptp_call_ser_print(&ptr->call_ser);
73798524Sfenner	TCHECK(ptr->min_bps);
738127668Sbms	printf(" MIN_BPS(%u)", EXTRACT_32BITS(&ptr->min_bps));
73998524Sfenner	TCHECK(ptr->max_bps);
740127668Sbms	printf(" MAX_BPS(%u)", EXTRACT_32BITS(&ptr->max_bps));
74198524Sfenner	TCHECK(ptr->bearer_type);
74298524Sfenner	pptp_bearer_type_print(&ptr->bearer_type);
74398524Sfenner	TCHECK(ptr->framing_type);
74498524Sfenner	pptp_framing_type_print(&ptr->framing_type);
74598524Sfenner	TCHECK(ptr->recv_winsiz);
74698524Sfenner	pptp_recv_winsiz_print(&ptr->recv_winsiz);
74798524Sfenner	TCHECK(ptr->pkt_proc_delay);
74898524Sfenner	pptp_pkt_proc_delay_print(&ptr->pkt_proc_delay);
74998524Sfenner	TCHECK(ptr->phone_no_len);
750127668Sbms	printf(" PHONE_NO_LEN(%u)", EXTRACT_16BITS(&ptr->phone_no_len));
75198524Sfenner	TCHECK(ptr->reserved1);
75298524Sfenner	TCHECK(ptr->phone_no);
75398524Sfenner	printf(" PHONE_NO(%.64s)", ptr->phone_no);
75498524Sfenner	TCHECK(ptr->subaddr);
75598524Sfenner	pptp_subaddr_print(&ptr->subaddr[0]);
75698524Sfenner
75798524Sfenner	return;
75898524Sfenner
75998524Sfennertrunc:
76098524Sfenner	printf("%s", tstr);
76198524Sfenner}
76298524Sfenner
76398524Sfennerstatic void
76498524Sfennerpptp_ocrp_print(const u_char *dat)
76598524Sfenner{
76698524Sfenner	struct pptp_msg_ocrp *ptr = (struct pptp_msg_ocrp *)dat;
76798524Sfenner
76898524Sfenner	TCHECK(ptr->call_id);
76998524Sfenner	pptp_call_id_print(&ptr->call_id);
77098524Sfenner	TCHECK(ptr->peer_call_id);
77198524Sfenner	pptp_peer_call_id_print(&ptr->peer_call_id);
77298524Sfenner	TCHECK(ptr->result_code);
77398524Sfenner	pptp_result_code_print(&ptr->result_code, PPTP_CTRL_MSG_TYPE_OCRP);
77498524Sfenner	TCHECK(ptr->err_code);
77598524Sfenner	pptp_err_code_print(&ptr->err_code);
77698524Sfenner	TCHECK(ptr->cause_code);
77798524Sfenner	pptp_cause_code_print(&ptr->cause_code);
77898524Sfenner	TCHECK(ptr->conn_speed);
77998524Sfenner	pptp_conn_speed_print(&ptr->conn_speed);
78098524Sfenner	TCHECK(ptr->recv_winsiz);
78198524Sfenner	pptp_recv_winsiz_print(&ptr->recv_winsiz);
78298524Sfenner	TCHECK(ptr->pkt_proc_delay);
78398524Sfenner	pptp_pkt_proc_delay_print(&ptr->pkt_proc_delay);
78498524Sfenner	TCHECK(ptr->phy_chan_id);
78598524Sfenner	pptp_phy_chan_id_print(&ptr->phy_chan_id);
78698524Sfenner
78798524Sfenner	return;
78898524Sfenner
78998524Sfennertrunc:
79098524Sfenner	printf("%s", tstr);
79198524Sfenner}
79298524Sfenner
79398524Sfennerstatic void
79498524Sfennerpptp_icrq_print(const u_char *dat)
79598524Sfenner{
79698524Sfenner	struct pptp_msg_icrq *ptr = (struct pptp_msg_icrq *)dat;
79798524Sfenner
79898524Sfenner	TCHECK(ptr->call_id);
79998524Sfenner	pptp_call_id_print(&ptr->call_id);
80098524Sfenner	TCHECK(ptr->call_ser);
80198524Sfenner	pptp_call_ser_print(&ptr->call_ser);
80298524Sfenner	TCHECK(ptr->bearer_type);
80398524Sfenner	pptp_bearer_type_print(&ptr->bearer_type);
80498524Sfenner	TCHECK(ptr->phy_chan_id);
80598524Sfenner	pptp_phy_chan_id_print(&ptr->phy_chan_id);
80698524Sfenner	TCHECK(ptr->dialed_no_len);
807127668Sbms	printf(" DIALED_NO_LEN(%u)", EXTRACT_16BITS(&ptr->dialed_no_len));
80898524Sfenner	TCHECK(ptr->dialing_no_len);
809127668Sbms	printf(" DIALING_NO_LEN(%u)", EXTRACT_16BITS(&ptr->dialing_no_len));
81098524Sfenner	TCHECK(ptr->dialed_no);
81198524Sfenner	printf(" DIALED_NO(%.64s)", ptr->dialed_no);
81298524Sfenner	TCHECK(ptr->dialing_no);
81398524Sfenner	printf(" DIALING_NO(%.64s)", ptr->dialing_no);
81498524Sfenner	TCHECK(ptr->subaddr);
81598524Sfenner	pptp_subaddr_print(&ptr->subaddr[0]);
81698524Sfenner
81798524Sfenner	return;
81898524Sfenner
81998524Sfennertrunc:
82098524Sfenner	printf("%s", tstr);
82198524Sfenner}
82298524Sfenner
82398524Sfennerstatic void
82498524Sfennerpptp_icrp_print(const u_char *dat)
82598524Sfenner{
82698524Sfenner	struct pptp_msg_icrp *ptr = (struct pptp_msg_icrp *)dat;
827127668Sbms
82898524Sfenner	TCHECK(ptr->call_id);
82998524Sfenner	pptp_call_id_print(&ptr->call_id);
83098524Sfenner	TCHECK(ptr->peer_call_id);
83198524Sfenner	pptp_peer_call_id_print(&ptr->peer_call_id);
83298524Sfenner	TCHECK(ptr->result_code);
83398524Sfenner	pptp_result_code_print(&ptr->result_code, PPTP_CTRL_MSG_TYPE_ICRP);
83498524Sfenner	TCHECK(ptr->err_code);
83598524Sfenner	pptp_err_code_print(&ptr->err_code);
83698524Sfenner	TCHECK(ptr->recv_winsiz);
83798524Sfenner	pptp_recv_winsiz_print(&ptr->recv_winsiz);
83898524Sfenner	TCHECK(ptr->pkt_proc_delay);
83998524Sfenner	pptp_pkt_proc_delay_print(&ptr->pkt_proc_delay);
84098524Sfenner	TCHECK(ptr->reserved1);
84198524Sfenner
84298524Sfenner	return;
84398524Sfenner
84498524Sfennertrunc:
84598524Sfenner	printf("%s", tstr);
84698524Sfenner}
84798524Sfenner
84898524Sfennerstatic void
84998524Sfennerpptp_iccn_print(const u_char *dat)
85098524Sfenner{
85198524Sfenner	struct pptp_msg_iccn *ptr = (struct pptp_msg_iccn *)dat;
85298524Sfenner
85398524Sfenner	TCHECK(ptr->peer_call_id);
85498524Sfenner	pptp_peer_call_id_print(&ptr->peer_call_id);
85598524Sfenner	TCHECK(ptr->reserved1);
85698524Sfenner	TCHECK(ptr->conn_speed);
85798524Sfenner	pptp_conn_speed_print(&ptr->conn_speed);
85898524Sfenner	TCHECK(ptr->recv_winsiz);
85998524Sfenner	pptp_recv_winsiz_print(&ptr->recv_winsiz);
86098524Sfenner	TCHECK(ptr->pkt_proc_delay);
86198524Sfenner	pptp_pkt_proc_delay_print(&ptr->pkt_proc_delay);
86298524Sfenner	TCHECK(ptr->framing_type);
86398524Sfenner	pptp_framing_type_print(&ptr->framing_type);
86498524Sfenner
86598524Sfenner	return;
86698524Sfenner
86798524Sfennertrunc:
86898524Sfenner	printf("%s", tstr);
86998524Sfenner}
87098524Sfenner
87198524Sfennerstatic void
87298524Sfennerpptp_ccrq_print(const u_char *dat)
87398524Sfenner{
87498524Sfenner	struct pptp_msg_ccrq *ptr = (struct pptp_msg_ccrq *)dat;
87598524Sfenner
87698524Sfenner	TCHECK(ptr->call_id);
87798524Sfenner	pptp_call_id_print(&ptr->call_id);
87898524Sfenner	TCHECK(ptr->reserved1);
87998524Sfenner
88098524Sfenner	return;
88198524Sfenner
88298524Sfennertrunc:
88398524Sfenner	printf("%s", tstr);
88498524Sfenner}
88598524Sfenner
88698524Sfennerstatic void
88798524Sfennerpptp_cdn_print(const u_char *dat)
88898524Sfenner{
88998524Sfenner	struct pptp_msg_cdn *ptr = (struct pptp_msg_cdn *)dat;
89098524Sfenner
89198524Sfenner	TCHECK(ptr->call_id);
89298524Sfenner	pptp_call_id_print(&ptr->call_id);
89398524Sfenner	TCHECK(ptr->result_code);
89498524Sfenner	pptp_result_code_print(&ptr->result_code, PPTP_CTRL_MSG_TYPE_CDN);
89598524Sfenner	TCHECK(ptr->err_code);
89698524Sfenner	pptp_err_code_print(&ptr->err_code);
89798524Sfenner	TCHECK(ptr->cause_code);
89898524Sfenner	pptp_cause_code_print(&ptr->cause_code);
89998524Sfenner	TCHECK(ptr->reserved1);
90098524Sfenner	TCHECK(ptr->call_stats);
90198524Sfenner	printf(" CALL_STATS(%.128s)", ptr->call_stats);
90298524Sfenner
90398524Sfenner	return;
90498524Sfenner
90598524Sfennertrunc:
90698524Sfenner	printf("%s", tstr);
90798524Sfenner}
90898524Sfenner
90998524Sfennerstatic void
91098524Sfennerpptp_wen_print(const u_char *dat)
91198524Sfenner{
91298524Sfenner	struct pptp_msg_wen *ptr = (struct pptp_msg_wen *)dat;
91398524Sfenner
91498524Sfenner	TCHECK(ptr->peer_call_id);
91598524Sfenner	pptp_peer_call_id_print(&ptr->peer_call_id);
91698524Sfenner	TCHECK(ptr->reserved1);
91798524Sfenner	TCHECK(ptr->crc_err);
918127668Sbms	printf(" CRC_ERR(%u)", EXTRACT_32BITS(&ptr->crc_err));
91998524Sfenner	TCHECK(ptr->framing_err);
920127668Sbms	printf(" FRAMING_ERR(%u)", EXTRACT_32BITS(&ptr->framing_err));
92198524Sfenner	TCHECK(ptr->hardware_overrun);
922127668Sbms	printf(" HARDWARE_OVERRUN(%u)", EXTRACT_32BITS(&ptr->hardware_overrun));
92398524Sfenner	TCHECK(ptr->buffer_overrun);
924127668Sbms	printf(" BUFFER_OVERRUN(%u)", EXTRACT_32BITS(&ptr->buffer_overrun));
92598524Sfenner	TCHECK(ptr->timeout_err);
926127668Sbms	printf(" TIMEOUT_ERR(%u)", EXTRACT_32BITS(&ptr->timeout_err));
92798524Sfenner	TCHECK(ptr->align_err);
928127668Sbms	printf(" ALIGN_ERR(%u)", EXTRACT_32BITS(&ptr->align_err));
92998524Sfenner
93098524Sfenner	return;
93198524Sfenner
93298524Sfennertrunc:
93398524Sfenner	printf("%s", tstr);
93498524Sfenner}
93598524Sfenner
93698524Sfennerstatic void
93798524Sfennerpptp_sli_print(const u_char *dat)
93898524Sfenner{
93998524Sfenner	struct pptp_msg_sli *ptr = (struct pptp_msg_sli *)dat;
94098524Sfenner
94198524Sfenner	TCHECK(ptr->peer_call_id);
94298524Sfenner	pptp_peer_call_id_print(&ptr->peer_call_id);
94398524Sfenner	TCHECK(ptr->reserved1);
94498524Sfenner	TCHECK(ptr->send_accm);
945127668Sbms	printf(" SEND_ACCM(0x%08x)", EXTRACT_32BITS(&ptr->send_accm));
94698524Sfenner	TCHECK(ptr->recv_accm);
947127668Sbms	printf(" RECV_ACCM(0x%08x)", EXTRACT_32BITS(&ptr->recv_accm));
94898524Sfenner
94998524Sfenner	return;
95098524Sfenner
95198524Sfennertrunc:
95298524Sfenner	printf("%s", tstr);
95398524Sfenner}
95498524Sfenner
95598524Sfennervoid
956127668Sbmspptp_print(const u_char *dat)
95798524Sfenner{
95898524Sfenner	const struct pptp_hdr *hdr;
95998524Sfenner	u_int32_t mc;
96098524Sfenner	u_int16_t ctrl_msg_type;
96198524Sfenner
96298524Sfenner	printf(": pptp");
96398524Sfenner
96498524Sfenner	hdr = (struct pptp_hdr *)dat;
96598524Sfenner
96698524Sfenner	TCHECK(hdr->length);
96798524Sfenner	if (vflag) {
968127668Sbms		printf(" Length=%u", EXTRACT_16BITS(&hdr->length));
96998524Sfenner	}
97098524Sfenner	TCHECK(hdr->msg_type);
97198524Sfenner	if (vflag) {
972127668Sbms		switch(EXTRACT_16BITS(&hdr->msg_type)) {
97398524Sfenner		case PPTP_MSG_TYPE_CTRL:
97498524Sfenner			printf(" CTRL-MSG");
97598524Sfenner			break;
97698524Sfenner		case PPTP_MSG_TYPE_MGMT:
97798524Sfenner			printf(" MGMT-MSG");
97898524Sfenner			break;
97998524Sfenner		default:
98098524Sfenner			printf(" UNKNOWN-MSG-TYPE");
98198524Sfenner			break;
98298524Sfenner		}
98398524Sfenner	}
98498524Sfenner
98598524Sfenner	TCHECK(hdr->magic_cookie);
986127668Sbms	mc = EXTRACT_32BITS(&hdr->magic_cookie);
98798524Sfenner	if (mc != PPTP_MAGIC_COOKIE) {
98898524Sfenner		printf(" UNEXPECTED Magic-Cookie!!(%08x)", mc);
98998524Sfenner	}
99098524Sfenner	if (vflag || mc != PPTP_MAGIC_COOKIE) {
99198524Sfenner		printf(" Magic-Cookie=%08x", mc);
99298524Sfenner	}
99398524Sfenner	TCHECK(hdr->ctrl_msg_type);
994127668Sbms	ctrl_msg_type = EXTRACT_16BITS(&hdr->ctrl_msg_type);
99598524Sfenner	if (ctrl_msg_type < PPTP_MAX_MSGTYPE_INDEX) {
996127668Sbms		printf(" CTRL_MSGTYPE=%s",
99798524Sfenner		       pptp_message_type_string[ctrl_msg_type]);
99898524Sfenner	} else {
99998524Sfenner		printf(" UNKNOWN_CTRL_MSGTYPE(%u)", ctrl_msg_type);
100098524Sfenner	}
100198524Sfenner	TCHECK(hdr->reserved0);
100298524Sfenner
100398524Sfenner	dat += 12;
100498524Sfenner
100598524Sfenner	switch(ctrl_msg_type) {
100698524Sfenner	case PPTP_CTRL_MSG_TYPE_SCCRQ:
100798524Sfenner		pptp_sccrq_print(dat);
100898524Sfenner		break;
100998524Sfenner	case PPTP_CTRL_MSG_TYPE_SCCRP:
101098524Sfenner		pptp_sccrp_print(dat);
101198524Sfenner		break;
101298524Sfenner	case PPTP_CTRL_MSG_TYPE_StopCCRQ:
101398524Sfenner		pptp_stopccrq_print(dat);
101498524Sfenner		break;
101598524Sfenner	case PPTP_CTRL_MSG_TYPE_StopCCRP:
101698524Sfenner		pptp_stopccrp_print(dat);
101798524Sfenner		break;
101898524Sfenner	case PPTP_CTRL_MSG_TYPE_ECHORQ:
101998524Sfenner		pptp_echorq_print(dat);
102098524Sfenner		break;
102198524Sfenner	case PPTP_CTRL_MSG_TYPE_ECHORP:
102298524Sfenner		pptp_echorp_print(dat);
102398524Sfenner		break;
102498524Sfenner	case PPTP_CTRL_MSG_TYPE_OCRQ:
102598524Sfenner		pptp_ocrq_print(dat);
102698524Sfenner		break;
102798524Sfenner	case PPTP_CTRL_MSG_TYPE_OCRP:
102898524Sfenner		pptp_ocrp_print(dat);
102998524Sfenner		break;
103098524Sfenner	case PPTP_CTRL_MSG_TYPE_ICRQ:
103198524Sfenner		pptp_icrq_print(dat);
103298524Sfenner		break;
103398524Sfenner	case PPTP_CTRL_MSG_TYPE_ICRP:
103498524Sfenner		pptp_icrp_print(dat);
103598524Sfenner		break;
103698524Sfenner	case PPTP_CTRL_MSG_TYPE_ICCN:
103798524Sfenner		pptp_iccn_print(dat);
103898524Sfenner		break;
103998524Sfenner	case PPTP_CTRL_MSG_TYPE_CCRQ:
104098524Sfenner		pptp_ccrq_print(dat);
104198524Sfenner		break;
104298524Sfenner	case PPTP_CTRL_MSG_TYPE_CDN:
104398524Sfenner		pptp_cdn_print(dat);
104498524Sfenner		break;
104598524Sfenner	case PPTP_CTRL_MSG_TYPE_WEN:
104698524Sfenner		pptp_wen_print(dat);
104798524Sfenner		break;
104898524Sfenner	case PPTP_CTRL_MSG_TYPE_SLI:
104998524Sfenner		pptp_sli_print(dat);
105098524Sfenner		break;
105198524Sfenner	default:
105298524Sfenner		/* do nothing */
105398524Sfenner		break;
105498524Sfenner	}
105598524Sfenner
105698524Sfenner	return;
105798524Sfenner
105898524Sfennertrunc:
105998524Sfenner	printf("%s", tstr);
1060127668Sbms}
1061