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*3c602fabSXin LI #define NETDISSECT_REWORKED 25a90e161bSBill Fenner #ifdef HAVE_CONFIG_H 26a90e161bSBill Fenner #include "config.h" 27a90e161bSBill Fenner #endif 28a90e161bSBill Fenner 295b0fe478SBruce M Simpson #include <tcpdump-stdinc.h> 305b0fe478SBruce M Simpson 31a90e161bSBill Fenner #include "interface.h" 325b0fe478SBruce M Simpson #include "extract.h" 33a90e161bSBill Fenner 34*3c602fabSXin LI static const char tstr[] = " [|pptp]"; 35a90e161bSBill Fenner 36a90e161bSBill Fenner #define PPTP_MSG_TYPE_CTRL 1 /* Control Message */ 37a90e161bSBill Fenner #define PPTP_MSG_TYPE_MGMT 2 /* Management Message (currently not used */ 38a90e161bSBill Fenner #define PPTP_MAGIC_COOKIE 0x1a2b3c4d /* for sanity check */ 39a90e161bSBill Fenner 40a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_SCCRQ 1 41a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_SCCRP 2 42a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_StopCCRQ 3 43a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_StopCCRP 4 44a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_ECHORQ 5 45a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_ECHORP 6 46a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_OCRQ 7 47a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_OCRP 8 48a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_ICRQ 9 49a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_ICRP 10 50a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_ICCN 11 51a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_CCRQ 12 52a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_CDN 13 53a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_WEN 14 54a90e161bSBill Fenner #define PPTP_CTRL_MSG_TYPE_SLI 15 55a90e161bSBill Fenner 56a90e161bSBill Fenner #define PPTP_FRAMING_CAP_ASYNC_MASK 0x00000001 /* Aynchronous */ 57a90e161bSBill Fenner #define PPTP_FRAMING_CAP_SYNC_MASK 0x00000002 /* Synchronous */ 58a90e161bSBill Fenner 59a90e161bSBill Fenner #define PPTP_BEARER_CAP_ANALOG_MASK 0x00000001 /* Analog */ 60a90e161bSBill Fenner #define PPTP_BEARER_CAP_DIGITAL_MASK 0x00000002 /* Digital */ 61a90e161bSBill Fenner 625b0fe478SBruce M Simpson static const char *pptp_message_type_string[] = { 63a90e161bSBill Fenner "NOT_DEFINED", /* 0 Not defined in the RFC2637 */ 64a90e161bSBill Fenner "SCCRQ", /* 1 Start-Control-Connection-Request */ 65a90e161bSBill Fenner "SCCRP", /* 2 Start-Control-Connection-Reply */ 66a90e161bSBill Fenner "StopCCRQ", /* 3 Stop-Control-Connection-Request */ 67a90e161bSBill Fenner "StopCCRP", /* 4 Stop-Control-Connection-Reply */ 68a90e161bSBill Fenner "ECHORQ", /* 5 Echo Request */ 69a90e161bSBill Fenner "ECHORP", /* 6 Echo Reply */ 70a90e161bSBill Fenner 71a90e161bSBill Fenner "OCRQ", /* 7 Outgoing-Call-Request */ 72a90e161bSBill Fenner "OCRP", /* 8 Outgoing-Call-Reply */ 73a90e161bSBill Fenner "ICRQ", /* 9 Incoming-Call-Request */ 74a90e161bSBill Fenner "ICRP", /* 10 Incoming-Call-Reply */ 75a90e161bSBill Fenner "ICCN", /* 11 Incoming-Call-Connected */ 76a90e161bSBill Fenner "CCRQ", /* 12 Call-Clear-Request */ 77a90e161bSBill Fenner "CDN", /* 13 Call-Disconnect-Notify */ 78a90e161bSBill Fenner 79a90e161bSBill Fenner "WEN", /* 14 WAN-Error-Notify */ 80a90e161bSBill Fenner 81a90e161bSBill Fenner "SLI" /* 15 Set-Link-Info */ 82a90e161bSBill Fenner #define PPTP_MAX_MSGTYPE_INDEX 16 83a90e161bSBill Fenner }; 84a90e161bSBill Fenner 85a90e161bSBill Fenner /* common for all PPTP control messages */ 86a90e161bSBill Fenner struct pptp_hdr { 87*3c602fabSXin LI uint16_t length; 88*3c602fabSXin LI uint16_t msg_type; 89*3c602fabSXin LI uint32_t magic_cookie; 90*3c602fabSXin LI uint16_t ctrl_msg_type; 91*3c602fabSXin LI uint16_t reserved0; 92a90e161bSBill Fenner }; 93a90e161bSBill Fenner 94a90e161bSBill Fenner struct pptp_msg_sccrq { 95*3c602fabSXin LI uint16_t proto_ver; 96*3c602fabSXin LI uint16_t reserved1; 97*3c602fabSXin LI uint32_t framing_cap; 98*3c602fabSXin LI uint32_t bearer_cap; 99*3c602fabSXin LI uint16_t max_channel; 100*3c602fabSXin LI uint16_t firm_rev; 101a90e161bSBill Fenner u_char hostname[64]; 102a90e161bSBill Fenner u_char vendor[64]; 103a90e161bSBill Fenner }; 104a90e161bSBill Fenner 105a90e161bSBill Fenner struct pptp_msg_sccrp { 106*3c602fabSXin LI uint16_t proto_ver; 107*3c602fabSXin LI uint8_t result_code; 108*3c602fabSXin LI uint8_t err_code; 109*3c602fabSXin LI uint32_t framing_cap; 110*3c602fabSXin LI uint32_t bearer_cap; 111*3c602fabSXin LI uint16_t max_channel; 112*3c602fabSXin LI uint16_t firm_rev; 113a90e161bSBill Fenner u_char hostname[64]; 114a90e161bSBill Fenner u_char vendor[64]; 115a90e161bSBill Fenner }; 116a90e161bSBill Fenner 117a90e161bSBill Fenner struct pptp_msg_stopccrq { 118*3c602fabSXin LI uint8_t reason; 119*3c602fabSXin LI uint8_t reserved1; 120*3c602fabSXin LI uint16_t reserved2; 121a90e161bSBill Fenner }; 122a90e161bSBill Fenner 123a90e161bSBill Fenner struct pptp_msg_stopccrp { 124*3c602fabSXin LI uint8_t result_code; 125*3c602fabSXin LI uint8_t err_code; 126*3c602fabSXin LI uint16_t reserved1; 127a90e161bSBill Fenner }; 128a90e161bSBill Fenner 129a90e161bSBill Fenner struct pptp_msg_echorq { 130*3c602fabSXin LI uint32_t id; 131a90e161bSBill Fenner }; 132a90e161bSBill Fenner 133a90e161bSBill Fenner struct pptp_msg_echorp { 134*3c602fabSXin LI uint32_t id; 135*3c602fabSXin LI uint8_t result_code; 136*3c602fabSXin LI uint8_t err_code; 137*3c602fabSXin LI uint16_t reserved1; 138a90e161bSBill Fenner }; 139a90e161bSBill Fenner 140a90e161bSBill Fenner struct pptp_msg_ocrq { 141*3c602fabSXin LI uint16_t call_id; 142*3c602fabSXin LI uint16_t call_ser; 143*3c602fabSXin LI uint32_t min_bps; 144*3c602fabSXin LI uint32_t max_bps; 145*3c602fabSXin LI uint32_t bearer_type; 146*3c602fabSXin LI uint32_t framing_type; 147*3c602fabSXin LI uint16_t recv_winsiz; 148*3c602fabSXin LI uint16_t pkt_proc_delay; 149*3c602fabSXin LI uint16_t phone_no_len; 150*3c602fabSXin LI uint16_t reserved1; 151a90e161bSBill Fenner u_char phone_no[64]; 152a90e161bSBill Fenner u_char subaddr[64]; 153a90e161bSBill Fenner }; 154a90e161bSBill Fenner 155a90e161bSBill Fenner struct pptp_msg_ocrp { 156*3c602fabSXin LI uint16_t call_id; 157*3c602fabSXin LI uint16_t peer_call_id; 158*3c602fabSXin LI uint8_t result_code; 159*3c602fabSXin LI uint8_t err_code; 160*3c602fabSXin LI uint16_t cause_code; 161*3c602fabSXin LI uint32_t conn_speed; 162*3c602fabSXin LI uint16_t recv_winsiz; 163*3c602fabSXin LI uint16_t pkt_proc_delay; 164*3c602fabSXin LI uint32_t phy_chan_id; 165a90e161bSBill Fenner }; 166a90e161bSBill Fenner 167a90e161bSBill Fenner struct pptp_msg_icrq { 168*3c602fabSXin LI uint16_t call_id; 169*3c602fabSXin LI uint16_t call_ser; 170*3c602fabSXin LI uint32_t bearer_type; 171*3c602fabSXin LI uint32_t phy_chan_id; 172*3c602fabSXin LI uint16_t dialed_no_len; 173*3c602fabSXin LI uint16_t dialing_no_len; 174a90e161bSBill Fenner u_char dialed_no[64]; /* DNIS */ 175a90e161bSBill Fenner u_char dialing_no[64]; /* CLID */ 176a90e161bSBill Fenner u_char subaddr[64]; 177a90e161bSBill Fenner }; 178a90e161bSBill Fenner 179a90e161bSBill Fenner struct pptp_msg_icrp { 180*3c602fabSXin LI uint16_t call_id; 181*3c602fabSXin LI uint16_t peer_call_id; 182*3c602fabSXin LI uint8_t result_code; 183*3c602fabSXin LI uint8_t err_code; 184*3c602fabSXin LI uint16_t recv_winsiz; 185*3c602fabSXin LI uint16_t pkt_proc_delay; 186*3c602fabSXin LI uint16_t reserved1; 187a90e161bSBill Fenner }; 188a90e161bSBill Fenner 189a90e161bSBill Fenner struct pptp_msg_iccn { 190*3c602fabSXin LI uint16_t peer_call_id; 191*3c602fabSXin LI uint16_t reserved1; 192*3c602fabSXin LI uint32_t conn_speed; 193*3c602fabSXin LI uint16_t recv_winsiz; 194*3c602fabSXin LI uint16_t pkt_proc_delay; 195*3c602fabSXin LI uint32_t framing_type; 196a90e161bSBill Fenner }; 197a90e161bSBill Fenner 198a90e161bSBill Fenner struct pptp_msg_ccrq { 199*3c602fabSXin LI uint16_t call_id; 200*3c602fabSXin LI uint16_t reserved1; 201a90e161bSBill Fenner }; 202a90e161bSBill Fenner 203a90e161bSBill Fenner struct pptp_msg_cdn { 204*3c602fabSXin LI uint16_t call_id; 205*3c602fabSXin LI uint8_t result_code; 206*3c602fabSXin LI uint8_t err_code; 207*3c602fabSXin LI uint16_t cause_code; 208*3c602fabSXin LI uint16_t reserved1; 209a90e161bSBill Fenner u_char call_stats[128]; 210a90e161bSBill Fenner }; 211a90e161bSBill Fenner 212a90e161bSBill Fenner struct pptp_msg_wen { 213*3c602fabSXin LI uint16_t peer_call_id; 214*3c602fabSXin LI uint16_t reserved1; 215*3c602fabSXin LI uint32_t crc_err; 216*3c602fabSXin LI uint32_t framing_err; 217*3c602fabSXin LI uint32_t hardware_overrun; 218*3c602fabSXin LI uint32_t buffer_overrun; 219*3c602fabSXin LI uint32_t timeout_err; 220*3c602fabSXin LI uint32_t align_err; 221a90e161bSBill Fenner }; 222a90e161bSBill Fenner 223a90e161bSBill Fenner struct pptp_msg_sli { 224*3c602fabSXin LI uint16_t peer_call_id; 225*3c602fabSXin LI uint16_t reserved1; 226*3c602fabSXin LI uint32_t send_accm; 227*3c602fabSXin LI uint32_t recv_accm; 228a90e161bSBill Fenner }; 229a90e161bSBill Fenner 230a90e161bSBill Fenner /* attributes that appear more than once in above messages: 231a90e161bSBill Fenner 232a90e161bSBill Fenner Number of 233a90e161bSBill Fenner occurence attributes 234a90e161bSBill Fenner -------------------------------------- 235*3c602fabSXin LI 2 uint32_t bearer_cap; 236*3c602fabSXin LI 2 uint32_t bearer_type; 237*3c602fabSXin LI 6 uint16_t call_id; 238*3c602fabSXin LI 2 uint16_t call_ser; 239*3c602fabSXin LI 2 uint16_t cause_code; 240*3c602fabSXin LI 2 uint32_t conn_speed; 241*3c602fabSXin LI 6 uint8_t err_code; 242*3c602fabSXin LI 2 uint16_t firm_rev; 243*3c602fabSXin LI 2 uint32_t framing_cap; 244*3c602fabSXin LI 2 uint32_t framing_type; 245a90e161bSBill Fenner 2 u_char hostname[64]; 246*3c602fabSXin LI 2 uint32_t id; 247*3c602fabSXin LI 2 uint16_t max_channel; 248*3c602fabSXin LI 5 uint16_t peer_call_id; 249*3c602fabSXin LI 2 uint32_t phy_chan_id; 250*3c602fabSXin LI 4 uint16_t pkt_proc_delay; 251*3c602fabSXin LI 2 uint16_t proto_ver; 252*3c602fabSXin LI 4 uint16_t recv_winsiz; 253*3c602fabSXin LI 2 uint8_t reserved1; 254*3c602fabSXin LI 9 uint16_t reserved1; 255*3c602fabSXin LI 6 uint8_t result_code; 256a90e161bSBill Fenner 2 u_char subaddr[64]; 257a90e161bSBill Fenner 2 u_char vendor[64]; 258a90e161bSBill Fenner 259a90e161bSBill Fenner so I will prepare print out functions for these attributes (except for 260a90e161bSBill Fenner reserved*). 261a90e161bSBill Fenner */ 262a90e161bSBill Fenner 263a90e161bSBill Fenner /******************************************/ 264a90e161bSBill Fenner /* Attribute-specific print out functions */ 265a90e161bSBill Fenner /******************************************/ 266a90e161bSBill Fenner 267a90e161bSBill Fenner /* In these attribute-specific print-out functions, it't not necessary 268*3c602fabSXin LI to do ND_TCHECK because they are already checked in the caller of 269a90e161bSBill Fenner these functions. */ 270a90e161bSBill Fenner 271a90e161bSBill Fenner static void 272*3c602fabSXin LI pptp_bearer_cap_print(netdissect_options *ndo, 273*3c602fabSXin LI const uint32_t *bearer_cap) 274a90e161bSBill Fenner { 275*3c602fabSXin LI ND_PRINT((ndo, " BEARER_CAP(%s%s)", 276*3c602fabSXin LI EXTRACT_32BITS(bearer_cap) & PPTP_BEARER_CAP_DIGITAL_MASK ? "D" : "", 277*3c602fabSXin LI EXTRACT_32BITS(bearer_cap) & PPTP_BEARER_CAP_ANALOG_MASK ? "A" : "")); 278a90e161bSBill Fenner } 279*3c602fabSXin LI 280*3c602fabSXin LI static const struct tok pptp_btype_str[] = { 281*3c602fabSXin LI { 1, "A" }, /* Analog */ 282*3c602fabSXin LI { 2, "D" }, /* Digital */ 283*3c602fabSXin LI { 3, "Any" }, 284*3c602fabSXin LI { 0, NULL } 285*3c602fabSXin LI }; 286*3c602fabSXin LI 287*3c602fabSXin LI static void 288*3c602fabSXin LI pptp_bearer_type_print(netdissect_options *ndo, 289*3c602fabSXin LI const uint32_t *bearer_type) 290*3c602fabSXin LI { 291*3c602fabSXin LI ND_PRINT((ndo, " BEARER_TYPE(%s)", 292*3c602fabSXin LI tok2str(pptp_btype_str, "?", EXTRACT_32BITS(bearer_type)))); 293a90e161bSBill Fenner } 294a90e161bSBill Fenner 295a90e161bSBill Fenner static void 296*3c602fabSXin LI pptp_call_id_print(netdissect_options *ndo, 297*3c602fabSXin LI const uint16_t *call_id) 298a90e161bSBill Fenner { 299*3c602fabSXin LI ND_PRINT((ndo, " CALL_ID(%u)", EXTRACT_16BITS(call_id))); 300a90e161bSBill Fenner } 301a90e161bSBill Fenner 302a90e161bSBill Fenner static void 303*3c602fabSXin LI pptp_call_ser_print(netdissect_options *ndo, 304*3c602fabSXin LI const uint16_t *call_ser) 305a90e161bSBill Fenner { 306*3c602fabSXin LI ND_PRINT((ndo, " CALL_SER_NUM(%u)", EXTRACT_16BITS(call_ser))); 307a90e161bSBill Fenner } 308a90e161bSBill Fenner 309a90e161bSBill Fenner static void 310*3c602fabSXin LI pptp_cause_code_print(netdissect_options *ndo, 311*3c602fabSXin LI const uint16_t *cause_code) 312a90e161bSBill Fenner { 313*3c602fabSXin LI ND_PRINT((ndo, " CAUSE_CODE(%u)", EXTRACT_16BITS(cause_code))); 314a90e161bSBill Fenner } 315a90e161bSBill Fenner 316a90e161bSBill Fenner static void 317*3c602fabSXin LI pptp_conn_speed_print(netdissect_options *ndo, 318*3c602fabSXin LI const uint32_t *conn_speed) 319a90e161bSBill Fenner { 320*3c602fabSXin LI ND_PRINT((ndo, " CONN_SPEED(%u)", EXTRACT_32BITS(conn_speed))); 321*3c602fabSXin LI } 322*3c602fabSXin LI 323*3c602fabSXin LI static const struct tok pptp_errcode_str[] = { 324*3c602fabSXin LI { 0, "None" }, 325*3c602fabSXin LI { 1, "Not-Connected" }, 326*3c602fabSXin LI { 2, "Bad-Format" }, 327*3c602fabSXin LI { 3, "Bad-Value" }, 328*3c602fabSXin LI { 4, "No-Resource" }, 329*3c602fabSXin LI { 5, "Bad-Call-ID" }, 330*3c602fabSXin LI { 6, "PAC-Error" }, 331*3c602fabSXin LI { 0, NULL } 332*3c602fabSXin LI }; 333*3c602fabSXin LI 334*3c602fabSXin LI static void 335*3c602fabSXin LI pptp_err_code_print(netdissect_options *ndo, 336*3c602fabSXin LI const uint8_t *err_code) 337*3c602fabSXin LI { 338*3c602fabSXin LI ND_PRINT((ndo, " ERR_CODE(%u", *err_code)); 339*3c602fabSXin LI if (ndo->ndo_vflag) { 340*3c602fabSXin LI ND_PRINT((ndo, ":%s", tok2str(pptp_errcode_str, "?", *err_code))); 341*3c602fabSXin LI } 342*3c602fabSXin LI ND_PRINT((ndo, ")")); 343a90e161bSBill Fenner } 344a90e161bSBill Fenner 345a90e161bSBill Fenner static void 346*3c602fabSXin LI pptp_firm_rev_print(netdissect_options *ndo, 347*3c602fabSXin LI const uint16_t *firm_rev) 348a90e161bSBill Fenner { 349*3c602fabSXin LI ND_PRINT((ndo, " FIRM_REV(%u)", EXTRACT_16BITS(firm_rev))); 350a90e161bSBill Fenner } 351a90e161bSBill Fenner 352a90e161bSBill Fenner static void 353*3c602fabSXin LI pptp_framing_cap_print(netdissect_options *ndo, 354*3c602fabSXin LI const uint32_t *framing_cap) 355a90e161bSBill Fenner { 356*3c602fabSXin LI ND_PRINT((ndo, " FRAME_CAP(")); 3575b0fe478SBruce M Simpson if (EXTRACT_32BITS(framing_cap) & PPTP_FRAMING_CAP_ASYNC_MASK) { 358*3c602fabSXin LI ND_PRINT((ndo, "A")); /* Async */ 359a90e161bSBill Fenner } 3605b0fe478SBruce M Simpson if (EXTRACT_32BITS(framing_cap) & PPTP_FRAMING_CAP_SYNC_MASK) { 361*3c602fabSXin LI ND_PRINT((ndo, "S")); /* Sync */ 362a90e161bSBill Fenner } 363*3c602fabSXin LI ND_PRINT((ndo, ")")); 364*3c602fabSXin LI } 365*3c602fabSXin LI 366*3c602fabSXin LI static const struct tok pptp_ftype_str[] = { 367*3c602fabSXin LI { 1, "A" }, /* Async */ 368*3c602fabSXin LI { 2, "S" }, /* Sync */ 369*3c602fabSXin LI { 3, "E" }, /* Either */ 370*3c602fabSXin LI { 0, NULL } 371*3c602fabSXin LI }; 372*3c602fabSXin LI 373*3c602fabSXin LI static void 374*3c602fabSXin LI pptp_framing_type_print(netdissect_options *ndo, 375*3c602fabSXin LI const uint32_t *framing_type) 376*3c602fabSXin LI { 377*3c602fabSXin LI ND_PRINT((ndo, " FRAME_TYPE(%s)", 378*3c602fabSXin LI tok2str(pptp_ftype_str, "?", EXTRACT_32BITS(framing_type)))); 379a90e161bSBill Fenner } 380a90e161bSBill Fenner 381a90e161bSBill Fenner static void 382*3c602fabSXin LI pptp_hostname_print(netdissect_options *ndo, 383*3c602fabSXin LI const u_char *hostname) 384a90e161bSBill Fenner { 385*3c602fabSXin LI ND_PRINT((ndo, " HOSTNAME(%.64s)", hostname)); 386a90e161bSBill Fenner } 387a90e161bSBill Fenner 388a90e161bSBill Fenner static void 389*3c602fabSXin LI pptp_id_print(netdissect_options *ndo, 390*3c602fabSXin LI const uint32_t *id) 391a90e161bSBill Fenner { 392*3c602fabSXin LI ND_PRINT((ndo, " ID(%u)", EXTRACT_32BITS(id))); 393a90e161bSBill Fenner } 394a90e161bSBill Fenner 395a90e161bSBill Fenner static void 396*3c602fabSXin LI pptp_max_channel_print(netdissect_options *ndo, 397*3c602fabSXin LI const uint16_t *max_channel) 398a90e161bSBill Fenner { 399*3c602fabSXin LI ND_PRINT((ndo, " MAX_CHAN(%u)", EXTRACT_16BITS(max_channel))); 400a90e161bSBill Fenner } 401a90e161bSBill Fenner 402a90e161bSBill Fenner static void 403*3c602fabSXin LI pptp_peer_call_id_print(netdissect_options *ndo, 404*3c602fabSXin LI const uint16_t *peer_call_id) 405a90e161bSBill Fenner { 406*3c602fabSXin LI ND_PRINT((ndo, " PEER_CALL_ID(%u)", EXTRACT_16BITS(peer_call_id))); 407a90e161bSBill Fenner } 408a90e161bSBill Fenner 409a90e161bSBill Fenner static void 410*3c602fabSXin LI pptp_phy_chan_id_print(netdissect_options *ndo, 411*3c602fabSXin LI const uint32_t *phy_chan_id) 412a90e161bSBill Fenner { 413*3c602fabSXin LI ND_PRINT((ndo, " PHY_CHAN_ID(%u)", EXTRACT_32BITS(phy_chan_id))); 414a90e161bSBill Fenner } 415a90e161bSBill Fenner 416a90e161bSBill Fenner static void 417*3c602fabSXin LI pptp_pkt_proc_delay_print(netdissect_options *ndo, 418*3c602fabSXin LI const uint16_t *pkt_proc_delay) 419a90e161bSBill Fenner { 420*3c602fabSXin LI ND_PRINT((ndo, " PROC_DELAY(%u)", EXTRACT_16BITS(pkt_proc_delay))); 421a90e161bSBill Fenner } 422a90e161bSBill Fenner 423a90e161bSBill Fenner static void 424*3c602fabSXin LI pptp_proto_ver_print(netdissect_options *ndo, 425*3c602fabSXin LI const uint16_t *proto_ver) 426a90e161bSBill Fenner { 427*3c602fabSXin LI ND_PRINT((ndo, " PROTO_VER(%u.%u)", /* Version.Revision */ 4285b0fe478SBruce M Simpson EXTRACT_16BITS(proto_ver) >> 8, 429*3c602fabSXin LI EXTRACT_16BITS(proto_ver) & 0xff)); 430a90e161bSBill Fenner } 431a90e161bSBill Fenner 432a90e161bSBill Fenner static void 433*3c602fabSXin LI pptp_recv_winsiz_print(netdissect_options *ndo, 434*3c602fabSXin LI const uint16_t *recv_winsiz) 435a90e161bSBill Fenner { 436*3c602fabSXin LI ND_PRINT((ndo, " RECV_WIN(%u)", EXTRACT_16BITS(recv_winsiz))); 437*3c602fabSXin LI } 438*3c602fabSXin LI 439*3c602fabSXin LI static const struct tok pptp_scrrp_str[] = { 440*3c602fabSXin LI { 1, "Successful channel establishment" }, 441*3c602fabSXin LI { 2, "General error" }, 442*3c602fabSXin LI { 3, "Command channel already exists" }, 443*3c602fabSXin LI { 4, "Requester is not authorized to establish a command channel" }, 444*3c602fabSXin LI { 5, "The protocol version of the requester is not supported" }, 445*3c602fabSXin LI { 0, NULL } 446*3c602fabSXin LI }; 447*3c602fabSXin LI 448*3c602fabSXin LI static const struct tok pptp_echorp_str[] = { 449*3c602fabSXin LI { 1, "OK" }, 450*3c602fabSXin LI { 2, "General Error" }, 451*3c602fabSXin LI { 0, NULL } 452*3c602fabSXin LI }; 453*3c602fabSXin LI 454*3c602fabSXin LI static const struct tok pptp_ocrp_str[] = { 455*3c602fabSXin LI { 1, "Connected" }, 456*3c602fabSXin LI { 2, "General Error" }, 457*3c602fabSXin LI { 3, "No Carrier" }, 458*3c602fabSXin LI { 4, "Busy" }, 459*3c602fabSXin LI { 5, "No Dial Tone" }, 460*3c602fabSXin LI { 6, "Time-out" }, 461*3c602fabSXin LI { 7, "Do Not Accept" }, 462*3c602fabSXin LI { 0, NULL } 463*3c602fabSXin LI }; 464*3c602fabSXin LI 465*3c602fabSXin LI static const struct tok pptp_icrp_str[] = { 466*3c602fabSXin LI { 1, "Connect" }, 467*3c602fabSXin LI { 2, "General Error" }, 468*3c602fabSXin LI { 3, "Do Not Accept" }, 469*3c602fabSXin LI { 0, NULL } 470*3c602fabSXin LI }; 471*3c602fabSXin LI 472*3c602fabSXin LI static const struct tok pptp_cdn_str[] = { 473*3c602fabSXin LI { 1, "Lost Carrier" }, 474*3c602fabSXin LI { 2, "General Error" }, 475*3c602fabSXin LI { 3, "Admin Shutdown" }, 476*3c602fabSXin LI { 4, "Request" }, 477*3c602fabSXin LI { 0, NULL } 478*3c602fabSXin LI }; 479*3c602fabSXin LI 480*3c602fabSXin LI static void 481*3c602fabSXin LI pptp_result_code_print(netdissect_options *ndo, 482*3c602fabSXin LI const uint8_t *result_code, int ctrl_msg_type) 483*3c602fabSXin LI { 484*3c602fabSXin LI ND_PRINT((ndo, " RESULT_CODE(%u", *result_code)); 485*3c602fabSXin LI if (ndo->ndo_vflag) { 486*3c602fabSXin LI const struct tok *dict = 487*3c602fabSXin LI ctrl_msg_type == PPTP_CTRL_MSG_TYPE_SCCRP ? pptp_scrrp_str : 488*3c602fabSXin LI ctrl_msg_type == PPTP_CTRL_MSG_TYPE_StopCCRP ? pptp_echorp_str : 489*3c602fabSXin LI ctrl_msg_type == PPTP_CTRL_MSG_TYPE_ECHORP ? pptp_echorp_str : 490*3c602fabSXin LI ctrl_msg_type == PPTP_CTRL_MSG_TYPE_OCRP ? pptp_ocrp_str : 491*3c602fabSXin LI ctrl_msg_type == PPTP_CTRL_MSG_TYPE_ICRP ? pptp_icrp_str : 492*3c602fabSXin LI ctrl_msg_type == PPTP_CTRL_MSG_TYPE_CDN ? pptp_cdn_str : 493*3c602fabSXin LI NULL; /* assertion error */ 494*3c602fabSXin LI if (dict != NULL) 495*3c602fabSXin LI ND_PRINT((ndo, ":%s", tok2str(dict, "?", *result_code))); 496*3c602fabSXin LI } 497*3c602fabSXin LI ND_PRINT((ndo, ")")); 498a90e161bSBill Fenner } 499a90e161bSBill Fenner 500a90e161bSBill Fenner static void 501*3c602fabSXin LI pptp_subaddr_print(netdissect_options *ndo, 502*3c602fabSXin LI const u_char *subaddr) 503a90e161bSBill Fenner { 504*3c602fabSXin LI ND_PRINT((ndo, " SUB_ADDR(%.64s)", subaddr)); 505a90e161bSBill Fenner } 506a90e161bSBill Fenner 507a90e161bSBill Fenner static void 508*3c602fabSXin LI pptp_vendor_print(netdissect_options *ndo, 509*3c602fabSXin LI const u_char *vendor) 510a90e161bSBill Fenner { 511*3c602fabSXin LI ND_PRINT((ndo, " VENDOR(%.64s)", vendor)); 512a90e161bSBill Fenner } 513a90e161bSBill Fenner 514a90e161bSBill Fenner /************************************/ 515a90e161bSBill Fenner /* PPTP message print out functions */ 516a90e161bSBill Fenner /************************************/ 517a90e161bSBill Fenner static void 518*3c602fabSXin LI pptp_sccrq_print(netdissect_options *ndo, 519*3c602fabSXin LI const u_char *dat) 520a90e161bSBill Fenner { 521a90e161bSBill Fenner struct pptp_msg_sccrq *ptr = (struct pptp_msg_sccrq *)dat; 522a90e161bSBill Fenner 523*3c602fabSXin LI ND_TCHECK(ptr->proto_ver); 524*3c602fabSXin LI pptp_proto_ver_print(ndo, &ptr->proto_ver); 525*3c602fabSXin LI ND_TCHECK(ptr->reserved1); 526*3c602fabSXin LI ND_TCHECK(ptr->framing_cap); 527*3c602fabSXin LI pptp_framing_cap_print(ndo, &ptr->framing_cap); 528*3c602fabSXin LI ND_TCHECK(ptr->bearer_cap); 529*3c602fabSXin LI pptp_bearer_cap_print(ndo, &ptr->bearer_cap); 530*3c602fabSXin LI ND_TCHECK(ptr->max_channel); 531*3c602fabSXin LI pptp_max_channel_print(ndo, &ptr->max_channel); 532*3c602fabSXin LI ND_TCHECK(ptr->firm_rev); 533*3c602fabSXin LI pptp_firm_rev_print(ndo, &ptr->firm_rev); 534*3c602fabSXin LI ND_TCHECK(ptr->hostname); 535*3c602fabSXin LI pptp_hostname_print(ndo, &ptr->hostname[0]); 536*3c602fabSXin LI ND_TCHECK(ptr->vendor); 537*3c602fabSXin LI pptp_vendor_print(ndo, &ptr->vendor[0]); 538a90e161bSBill Fenner 539a90e161bSBill Fenner return; 540a90e161bSBill Fenner 541a90e161bSBill Fenner trunc: 542*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 543a90e161bSBill Fenner } 544a90e161bSBill Fenner 545a90e161bSBill Fenner static void 546*3c602fabSXin LI pptp_sccrp_print(netdissect_options *ndo, 547*3c602fabSXin LI const u_char *dat) 548a90e161bSBill Fenner { 549a90e161bSBill Fenner struct pptp_msg_sccrp *ptr = (struct pptp_msg_sccrp *)dat; 550a90e161bSBill Fenner 551*3c602fabSXin LI ND_TCHECK(ptr->proto_ver); 552*3c602fabSXin LI pptp_proto_ver_print(ndo, &ptr->proto_ver); 553*3c602fabSXin LI ND_TCHECK(ptr->result_code); 554*3c602fabSXin LI pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_SCCRP); 555*3c602fabSXin LI ND_TCHECK(ptr->err_code); 556*3c602fabSXin LI pptp_err_code_print(ndo, &ptr->err_code); 557*3c602fabSXin LI ND_TCHECK(ptr->framing_cap); 558*3c602fabSXin LI pptp_framing_cap_print(ndo, &ptr->framing_cap); 559*3c602fabSXin LI ND_TCHECK(ptr->bearer_cap); 560*3c602fabSXin LI pptp_bearer_cap_print(ndo, &ptr->bearer_cap); 561*3c602fabSXin LI ND_TCHECK(ptr->max_channel); 562*3c602fabSXin LI pptp_max_channel_print(ndo, &ptr->max_channel); 563*3c602fabSXin LI ND_TCHECK(ptr->firm_rev); 564*3c602fabSXin LI pptp_firm_rev_print(ndo, &ptr->firm_rev); 565*3c602fabSXin LI ND_TCHECK(ptr->hostname); 566*3c602fabSXin LI pptp_hostname_print(ndo, &ptr->hostname[0]); 567*3c602fabSXin LI ND_TCHECK(ptr->vendor); 568*3c602fabSXin LI pptp_vendor_print(ndo, &ptr->vendor[0]); 569a90e161bSBill Fenner 570a90e161bSBill Fenner return; 571a90e161bSBill Fenner 572a90e161bSBill Fenner trunc: 573*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 574a90e161bSBill Fenner } 575a90e161bSBill Fenner 576a90e161bSBill Fenner static void 577*3c602fabSXin LI pptp_stopccrq_print(netdissect_options *ndo, 578*3c602fabSXin LI const u_char *dat) 579a90e161bSBill Fenner { 580a90e161bSBill Fenner struct pptp_msg_stopccrq *ptr = (struct pptp_msg_stopccrq *)dat; 581a90e161bSBill Fenner 582*3c602fabSXin LI ND_TCHECK(ptr->reason); 583*3c602fabSXin LI ND_PRINT((ndo, " REASON(%u", ptr->reason)); 584*3c602fabSXin LI if (ndo->ndo_vflag) { 585a90e161bSBill Fenner switch (ptr->reason) { 586a90e161bSBill Fenner case 1: 587*3c602fabSXin LI ND_PRINT((ndo, ":None")); 588a90e161bSBill Fenner break; 589a90e161bSBill Fenner case 2: 590*3c602fabSXin LI ND_PRINT((ndo, ":Stop-Protocol")); 591a90e161bSBill Fenner break; 592a90e161bSBill Fenner case 3: 593*3c602fabSXin LI ND_PRINT((ndo, ":Stop-Local-Shutdown")); 594a90e161bSBill Fenner break; 595a90e161bSBill Fenner default: 596*3c602fabSXin LI ND_PRINT((ndo, ":?")); 597a90e161bSBill Fenner break; 598a90e161bSBill Fenner } 599a90e161bSBill Fenner } 600*3c602fabSXin LI ND_PRINT((ndo, ")")); 601*3c602fabSXin LI ND_TCHECK(ptr->reserved1); 602*3c602fabSXin LI ND_TCHECK(ptr->reserved2); 603a90e161bSBill Fenner 604a90e161bSBill Fenner return; 605a90e161bSBill Fenner 606a90e161bSBill Fenner trunc: 607*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 608a90e161bSBill Fenner } 609a90e161bSBill Fenner 610a90e161bSBill Fenner static void 611*3c602fabSXin LI pptp_stopccrp_print(netdissect_options *ndo, 612*3c602fabSXin LI const u_char *dat) 613a90e161bSBill Fenner { 614a90e161bSBill Fenner struct pptp_msg_stopccrp *ptr = (struct pptp_msg_stopccrp *)dat; 615a90e161bSBill Fenner 616*3c602fabSXin LI ND_TCHECK(ptr->result_code); 617*3c602fabSXin LI pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_StopCCRP); 618*3c602fabSXin LI ND_TCHECK(ptr->err_code); 619*3c602fabSXin LI pptp_err_code_print(ndo, &ptr->err_code); 620*3c602fabSXin LI ND_TCHECK(ptr->reserved1); 621a90e161bSBill Fenner 622a90e161bSBill Fenner return; 623a90e161bSBill Fenner 624a90e161bSBill Fenner trunc: 625*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 626a90e161bSBill Fenner } 627a90e161bSBill Fenner 628a90e161bSBill Fenner static void 629*3c602fabSXin LI pptp_echorq_print(netdissect_options *ndo, 630*3c602fabSXin LI const u_char *dat) 631a90e161bSBill Fenner { 632a90e161bSBill Fenner struct pptp_msg_echorq *ptr = (struct pptp_msg_echorq *)dat; 633a90e161bSBill Fenner 634*3c602fabSXin LI ND_TCHECK(ptr->id); 635*3c602fabSXin LI pptp_id_print(ndo, &ptr->id); 636a90e161bSBill Fenner 637a90e161bSBill Fenner return; 638a90e161bSBill Fenner 639a90e161bSBill Fenner trunc: 640*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 641a90e161bSBill Fenner } 642a90e161bSBill Fenner 643a90e161bSBill Fenner static void 644*3c602fabSXin LI pptp_echorp_print(netdissect_options *ndo, 645*3c602fabSXin LI const u_char *dat) 646a90e161bSBill Fenner { 647a90e161bSBill Fenner struct pptp_msg_echorp *ptr = (struct pptp_msg_echorp *)dat; 648a90e161bSBill Fenner 649*3c602fabSXin LI ND_TCHECK(ptr->id); 650*3c602fabSXin LI pptp_id_print(ndo, &ptr->id); 651*3c602fabSXin LI ND_TCHECK(ptr->result_code); 652*3c602fabSXin LI pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_ECHORP); 653*3c602fabSXin LI ND_TCHECK(ptr->err_code); 654*3c602fabSXin LI pptp_err_code_print(ndo, &ptr->err_code); 655*3c602fabSXin LI ND_TCHECK(ptr->reserved1); 656a90e161bSBill Fenner 657a90e161bSBill Fenner return; 658a90e161bSBill Fenner 659a90e161bSBill Fenner trunc: 660*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 661a90e161bSBill Fenner } 662a90e161bSBill Fenner 663a90e161bSBill Fenner static void 664*3c602fabSXin LI pptp_ocrq_print(netdissect_options *ndo, 665*3c602fabSXin LI const u_char *dat) 666a90e161bSBill Fenner { 667a90e161bSBill Fenner struct pptp_msg_ocrq *ptr = (struct pptp_msg_ocrq *)dat; 668a90e161bSBill Fenner 669*3c602fabSXin LI ND_TCHECK(ptr->call_id); 670*3c602fabSXin LI pptp_call_id_print(ndo, &ptr->call_id); 671*3c602fabSXin LI ND_TCHECK(ptr->call_ser); 672*3c602fabSXin LI pptp_call_ser_print(ndo, &ptr->call_ser); 673*3c602fabSXin LI ND_TCHECK(ptr->min_bps); 674*3c602fabSXin LI ND_PRINT((ndo, " MIN_BPS(%u)", EXTRACT_32BITS(&ptr->min_bps))); 675*3c602fabSXin LI ND_TCHECK(ptr->max_bps); 676*3c602fabSXin LI ND_PRINT((ndo, " MAX_BPS(%u)", EXTRACT_32BITS(&ptr->max_bps))); 677*3c602fabSXin LI ND_TCHECK(ptr->bearer_type); 678*3c602fabSXin LI pptp_bearer_type_print(ndo, &ptr->bearer_type); 679*3c602fabSXin LI ND_TCHECK(ptr->framing_type); 680*3c602fabSXin LI pptp_framing_type_print(ndo, &ptr->framing_type); 681*3c602fabSXin LI ND_TCHECK(ptr->recv_winsiz); 682*3c602fabSXin LI pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz); 683*3c602fabSXin LI ND_TCHECK(ptr->pkt_proc_delay); 684*3c602fabSXin LI pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay); 685*3c602fabSXin LI ND_TCHECK(ptr->phone_no_len); 686*3c602fabSXin LI ND_PRINT((ndo, " PHONE_NO_LEN(%u)", EXTRACT_16BITS(&ptr->phone_no_len))); 687*3c602fabSXin LI ND_TCHECK(ptr->reserved1); 688*3c602fabSXin LI ND_TCHECK(ptr->phone_no); 689*3c602fabSXin LI ND_PRINT((ndo, " PHONE_NO(%.64s)", ptr->phone_no)); 690*3c602fabSXin LI ND_TCHECK(ptr->subaddr); 691*3c602fabSXin LI pptp_subaddr_print(ndo, &ptr->subaddr[0]); 692a90e161bSBill Fenner 693a90e161bSBill Fenner return; 694a90e161bSBill Fenner 695a90e161bSBill Fenner trunc: 696*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 697a90e161bSBill Fenner } 698a90e161bSBill Fenner 699a90e161bSBill Fenner static void 700*3c602fabSXin LI pptp_ocrp_print(netdissect_options *ndo, 701*3c602fabSXin LI const u_char *dat) 702a90e161bSBill Fenner { 703a90e161bSBill Fenner struct pptp_msg_ocrp *ptr = (struct pptp_msg_ocrp *)dat; 704a90e161bSBill Fenner 705*3c602fabSXin LI ND_TCHECK(ptr->call_id); 706*3c602fabSXin LI pptp_call_id_print(ndo, &ptr->call_id); 707*3c602fabSXin LI ND_TCHECK(ptr->peer_call_id); 708*3c602fabSXin LI pptp_peer_call_id_print(ndo, &ptr->peer_call_id); 709*3c602fabSXin LI ND_TCHECK(ptr->result_code); 710*3c602fabSXin LI pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_OCRP); 711*3c602fabSXin LI ND_TCHECK(ptr->err_code); 712*3c602fabSXin LI pptp_err_code_print(ndo, &ptr->err_code); 713*3c602fabSXin LI ND_TCHECK(ptr->cause_code); 714*3c602fabSXin LI pptp_cause_code_print(ndo, &ptr->cause_code); 715*3c602fabSXin LI ND_TCHECK(ptr->conn_speed); 716*3c602fabSXin LI pptp_conn_speed_print(ndo, &ptr->conn_speed); 717*3c602fabSXin LI ND_TCHECK(ptr->recv_winsiz); 718*3c602fabSXin LI pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz); 719*3c602fabSXin LI ND_TCHECK(ptr->pkt_proc_delay); 720*3c602fabSXin LI pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay); 721*3c602fabSXin LI ND_TCHECK(ptr->phy_chan_id); 722*3c602fabSXin LI pptp_phy_chan_id_print(ndo, &ptr->phy_chan_id); 723a90e161bSBill Fenner 724a90e161bSBill Fenner return; 725a90e161bSBill Fenner 726a90e161bSBill Fenner trunc: 727*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 728a90e161bSBill Fenner } 729a90e161bSBill Fenner 730a90e161bSBill Fenner static void 731*3c602fabSXin LI pptp_icrq_print(netdissect_options *ndo, 732*3c602fabSXin LI const u_char *dat) 733a90e161bSBill Fenner { 734a90e161bSBill Fenner struct pptp_msg_icrq *ptr = (struct pptp_msg_icrq *)dat; 735a90e161bSBill Fenner 736*3c602fabSXin LI ND_TCHECK(ptr->call_id); 737*3c602fabSXin LI pptp_call_id_print(ndo, &ptr->call_id); 738*3c602fabSXin LI ND_TCHECK(ptr->call_ser); 739*3c602fabSXin LI pptp_call_ser_print(ndo, &ptr->call_ser); 740*3c602fabSXin LI ND_TCHECK(ptr->bearer_type); 741*3c602fabSXin LI pptp_bearer_type_print(ndo, &ptr->bearer_type); 742*3c602fabSXin LI ND_TCHECK(ptr->phy_chan_id); 743*3c602fabSXin LI pptp_phy_chan_id_print(ndo, &ptr->phy_chan_id); 744*3c602fabSXin LI ND_TCHECK(ptr->dialed_no_len); 745*3c602fabSXin LI ND_PRINT((ndo, " DIALED_NO_LEN(%u)", EXTRACT_16BITS(&ptr->dialed_no_len))); 746*3c602fabSXin LI ND_TCHECK(ptr->dialing_no_len); 747*3c602fabSXin LI ND_PRINT((ndo, " DIALING_NO_LEN(%u)", EXTRACT_16BITS(&ptr->dialing_no_len))); 748*3c602fabSXin LI ND_TCHECK(ptr->dialed_no); 749*3c602fabSXin LI ND_PRINT((ndo, " DIALED_NO(%.64s)", ptr->dialed_no)); 750*3c602fabSXin LI ND_TCHECK(ptr->dialing_no); 751*3c602fabSXin LI ND_PRINT((ndo, " DIALING_NO(%.64s)", ptr->dialing_no)); 752*3c602fabSXin LI ND_TCHECK(ptr->subaddr); 753*3c602fabSXin LI pptp_subaddr_print(ndo, &ptr->subaddr[0]); 754a90e161bSBill Fenner 755a90e161bSBill Fenner return; 756a90e161bSBill Fenner 757a90e161bSBill Fenner trunc: 758*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 759a90e161bSBill Fenner } 760a90e161bSBill Fenner 761a90e161bSBill Fenner static void 762*3c602fabSXin LI pptp_icrp_print(netdissect_options *ndo, 763*3c602fabSXin LI const u_char *dat) 764a90e161bSBill Fenner { 765a90e161bSBill Fenner struct pptp_msg_icrp *ptr = (struct pptp_msg_icrp *)dat; 766a90e161bSBill Fenner 767*3c602fabSXin LI ND_TCHECK(ptr->call_id); 768*3c602fabSXin LI pptp_call_id_print(ndo, &ptr->call_id); 769*3c602fabSXin LI ND_TCHECK(ptr->peer_call_id); 770*3c602fabSXin LI pptp_peer_call_id_print(ndo, &ptr->peer_call_id); 771*3c602fabSXin LI ND_TCHECK(ptr->result_code); 772*3c602fabSXin LI pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_ICRP); 773*3c602fabSXin LI ND_TCHECK(ptr->err_code); 774*3c602fabSXin LI pptp_err_code_print(ndo, &ptr->err_code); 775*3c602fabSXin LI ND_TCHECK(ptr->recv_winsiz); 776*3c602fabSXin LI pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz); 777*3c602fabSXin LI ND_TCHECK(ptr->pkt_proc_delay); 778*3c602fabSXin LI pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay); 779*3c602fabSXin LI ND_TCHECK(ptr->reserved1); 780a90e161bSBill Fenner 781a90e161bSBill Fenner return; 782a90e161bSBill Fenner 783a90e161bSBill Fenner trunc: 784*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 785a90e161bSBill Fenner } 786a90e161bSBill Fenner 787a90e161bSBill Fenner static void 788*3c602fabSXin LI pptp_iccn_print(netdissect_options *ndo, 789*3c602fabSXin LI const u_char *dat) 790a90e161bSBill Fenner { 791a90e161bSBill Fenner struct pptp_msg_iccn *ptr = (struct pptp_msg_iccn *)dat; 792a90e161bSBill Fenner 793*3c602fabSXin LI ND_TCHECK(ptr->peer_call_id); 794*3c602fabSXin LI pptp_peer_call_id_print(ndo, &ptr->peer_call_id); 795*3c602fabSXin LI ND_TCHECK(ptr->reserved1); 796*3c602fabSXin LI ND_TCHECK(ptr->conn_speed); 797*3c602fabSXin LI pptp_conn_speed_print(ndo, &ptr->conn_speed); 798*3c602fabSXin LI ND_TCHECK(ptr->recv_winsiz); 799*3c602fabSXin LI pptp_recv_winsiz_print(ndo, &ptr->recv_winsiz); 800*3c602fabSXin LI ND_TCHECK(ptr->pkt_proc_delay); 801*3c602fabSXin LI pptp_pkt_proc_delay_print(ndo, &ptr->pkt_proc_delay); 802*3c602fabSXin LI ND_TCHECK(ptr->framing_type); 803*3c602fabSXin LI pptp_framing_type_print(ndo, &ptr->framing_type); 804a90e161bSBill Fenner 805a90e161bSBill Fenner return; 806a90e161bSBill Fenner 807a90e161bSBill Fenner trunc: 808*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 809a90e161bSBill Fenner } 810a90e161bSBill Fenner 811a90e161bSBill Fenner static void 812*3c602fabSXin LI pptp_ccrq_print(netdissect_options *ndo, 813*3c602fabSXin LI const u_char *dat) 814a90e161bSBill Fenner { 815a90e161bSBill Fenner struct pptp_msg_ccrq *ptr = (struct pptp_msg_ccrq *)dat; 816a90e161bSBill Fenner 817*3c602fabSXin LI ND_TCHECK(ptr->call_id); 818*3c602fabSXin LI pptp_call_id_print(ndo, &ptr->call_id); 819*3c602fabSXin LI ND_TCHECK(ptr->reserved1); 820a90e161bSBill Fenner 821a90e161bSBill Fenner return; 822a90e161bSBill Fenner 823a90e161bSBill Fenner trunc: 824*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 825a90e161bSBill Fenner } 826a90e161bSBill Fenner 827a90e161bSBill Fenner static void 828*3c602fabSXin LI pptp_cdn_print(netdissect_options *ndo, 829*3c602fabSXin LI const u_char *dat) 830a90e161bSBill Fenner { 831a90e161bSBill Fenner struct pptp_msg_cdn *ptr = (struct pptp_msg_cdn *)dat; 832a90e161bSBill Fenner 833*3c602fabSXin LI ND_TCHECK(ptr->call_id); 834*3c602fabSXin LI pptp_call_id_print(ndo, &ptr->call_id); 835*3c602fabSXin LI ND_TCHECK(ptr->result_code); 836*3c602fabSXin LI pptp_result_code_print(ndo, &ptr->result_code, PPTP_CTRL_MSG_TYPE_CDN); 837*3c602fabSXin LI ND_TCHECK(ptr->err_code); 838*3c602fabSXin LI pptp_err_code_print(ndo, &ptr->err_code); 839*3c602fabSXin LI ND_TCHECK(ptr->cause_code); 840*3c602fabSXin LI pptp_cause_code_print(ndo, &ptr->cause_code); 841*3c602fabSXin LI ND_TCHECK(ptr->reserved1); 842*3c602fabSXin LI ND_TCHECK(ptr->call_stats); 843*3c602fabSXin LI ND_PRINT((ndo, " CALL_STATS(%.128s)", ptr->call_stats)); 844a90e161bSBill Fenner 845a90e161bSBill Fenner return; 846a90e161bSBill Fenner 847a90e161bSBill Fenner trunc: 848*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 849a90e161bSBill Fenner } 850a90e161bSBill Fenner 851a90e161bSBill Fenner static void 852*3c602fabSXin LI pptp_wen_print(netdissect_options *ndo, 853*3c602fabSXin LI const u_char *dat) 854a90e161bSBill Fenner { 855a90e161bSBill Fenner struct pptp_msg_wen *ptr = (struct pptp_msg_wen *)dat; 856a90e161bSBill Fenner 857*3c602fabSXin LI ND_TCHECK(ptr->peer_call_id); 858*3c602fabSXin LI pptp_peer_call_id_print(ndo, &ptr->peer_call_id); 859*3c602fabSXin LI ND_TCHECK(ptr->reserved1); 860*3c602fabSXin LI ND_TCHECK(ptr->crc_err); 861*3c602fabSXin LI ND_PRINT((ndo, " CRC_ERR(%u)", EXTRACT_32BITS(&ptr->crc_err))); 862*3c602fabSXin LI ND_TCHECK(ptr->framing_err); 863*3c602fabSXin LI ND_PRINT((ndo, " FRAMING_ERR(%u)", EXTRACT_32BITS(&ptr->framing_err))); 864*3c602fabSXin LI ND_TCHECK(ptr->hardware_overrun); 865*3c602fabSXin LI ND_PRINT((ndo, " HARDWARE_OVERRUN(%u)", EXTRACT_32BITS(&ptr->hardware_overrun))); 866*3c602fabSXin LI ND_TCHECK(ptr->buffer_overrun); 867*3c602fabSXin LI ND_PRINT((ndo, " BUFFER_OVERRUN(%u)", EXTRACT_32BITS(&ptr->buffer_overrun))); 868*3c602fabSXin LI ND_TCHECK(ptr->timeout_err); 869*3c602fabSXin LI ND_PRINT((ndo, " TIMEOUT_ERR(%u)", EXTRACT_32BITS(&ptr->timeout_err))); 870*3c602fabSXin LI ND_TCHECK(ptr->align_err); 871*3c602fabSXin LI ND_PRINT((ndo, " ALIGN_ERR(%u)", EXTRACT_32BITS(&ptr->align_err))); 872a90e161bSBill Fenner 873a90e161bSBill Fenner return; 874a90e161bSBill Fenner 875a90e161bSBill Fenner trunc: 876*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 877a90e161bSBill Fenner } 878a90e161bSBill Fenner 879a90e161bSBill Fenner static void 880*3c602fabSXin LI pptp_sli_print(netdissect_options *ndo, 881*3c602fabSXin LI const u_char *dat) 882a90e161bSBill Fenner { 883a90e161bSBill Fenner struct pptp_msg_sli *ptr = (struct pptp_msg_sli *)dat; 884a90e161bSBill Fenner 885*3c602fabSXin LI ND_TCHECK(ptr->peer_call_id); 886*3c602fabSXin LI pptp_peer_call_id_print(ndo, &ptr->peer_call_id); 887*3c602fabSXin LI ND_TCHECK(ptr->reserved1); 888*3c602fabSXin LI ND_TCHECK(ptr->send_accm); 889*3c602fabSXin LI ND_PRINT((ndo, " SEND_ACCM(0x%08x)", EXTRACT_32BITS(&ptr->send_accm))); 890*3c602fabSXin LI ND_TCHECK(ptr->recv_accm); 891*3c602fabSXin LI ND_PRINT((ndo, " RECV_ACCM(0x%08x)", EXTRACT_32BITS(&ptr->recv_accm))); 892a90e161bSBill Fenner 893a90e161bSBill Fenner return; 894a90e161bSBill Fenner 895a90e161bSBill Fenner trunc: 896*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 897a90e161bSBill Fenner } 898a90e161bSBill Fenner 899a90e161bSBill Fenner void 900*3c602fabSXin LI pptp_print(netdissect_options *ndo, 901*3c602fabSXin LI const u_char *dat) 902a90e161bSBill Fenner { 903a90e161bSBill Fenner const struct pptp_hdr *hdr; 904*3c602fabSXin LI uint32_t mc; 905*3c602fabSXin LI uint16_t ctrl_msg_type; 906a90e161bSBill Fenner 907*3c602fabSXin LI ND_PRINT((ndo, ": pptp")); 908a90e161bSBill Fenner 909a90e161bSBill Fenner hdr = (struct pptp_hdr *)dat; 910a90e161bSBill Fenner 911*3c602fabSXin LI ND_TCHECK(hdr->length); 912*3c602fabSXin LI if (ndo->ndo_vflag) { 913*3c602fabSXin LI ND_PRINT((ndo, " Length=%u", EXTRACT_16BITS(&hdr->length))); 914a90e161bSBill Fenner } 915*3c602fabSXin LI ND_TCHECK(hdr->msg_type); 916*3c602fabSXin LI if (ndo->ndo_vflag) { 9175b0fe478SBruce M Simpson switch(EXTRACT_16BITS(&hdr->msg_type)) { 918a90e161bSBill Fenner case PPTP_MSG_TYPE_CTRL: 919*3c602fabSXin LI ND_PRINT((ndo, " CTRL-MSG")); 920a90e161bSBill Fenner break; 921a90e161bSBill Fenner case PPTP_MSG_TYPE_MGMT: 922*3c602fabSXin LI ND_PRINT((ndo, " MGMT-MSG")); 923a90e161bSBill Fenner break; 924a90e161bSBill Fenner default: 925*3c602fabSXin LI ND_PRINT((ndo, " UNKNOWN-MSG-TYPE")); 926a90e161bSBill Fenner break; 927a90e161bSBill Fenner } 928a90e161bSBill Fenner } 929a90e161bSBill Fenner 930*3c602fabSXin LI ND_TCHECK(hdr->magic_cookie); 9315b0fe478SBruce M Simpson mc = EXTRACT_32BITS(&hdr->magic_cookie); 932a90e161bSBill Fenner if (mc != PPTP_MAGIC_COOKIE) { 933*3c602fabSXin LI ND_PRINT((ndo, " UNEXPECTED Magic-Cookie!!(%08x)", mc)); 934a90e161bSBill Fenner } 935*3c602fabSXin LI if (ndo->ndo_vflag || mc != PPTP_MAGIC_COOKIE) { 936*3c602fabSXin LI ND_PRINT((ndo, " Magic-Cookie=%08x", mc)); 937a90e161bSBill Fenner } 938*3c602fabSXin LI ND_TCHECK(hdr->ctrl_msg_type); 9395b0fe478SBruce M Simpson ctrl_msg_type = EXTRACT_16BITS(&hdr->ctrl_msg_type); 940a90e161bSBill Fenner if (ctrl_msg_type < PPTP_MAX_MSGTYPE_INDEX) { 941*3c602fabSXin LI ND_PRINT((ndo, " CTRL_MSGTYPE=%s", 942*3c602fabSXin LI pptp_message_type_string[ctrl_msg_type])); 943a90e161bSBill Fenner } else { 944*3c602fabSXin LI ND_PRINT((ndo, " UNKNOWN_CTRL_MSGTYPE(%u)", ctrl_msg_type)); 945a90e161bSBill Fenner } 946*3c602fabSXin LI ND_TCHECK(hdr->reserved0); 947a90e161bSBill Fenner 948a90e161bSBill Fenner dat += 12; 949a90e161bSBill Fenner 950a90e161bSBill Fenner switch(ctrl_msg_type) { 951a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_SCCRQ: 952*3c602fabSXin LI pptp_sccrq_print(ndo, dat); 953a90e161bSBill Fenner break; 954a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_SCCRP: 955*3c602fabSXin LI pptp_sccrp_print(ndo, dat); 956a90e161bSBill Fenner break; 957a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_StopCCRQ: 958*3c602fabSXin LI pptp_stopccrq_print(ndo, dat); 959a90e161bSBill Fenner break; 960a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_StopCCRP: 961*3c602fabSXin LI pptp_stopccrp_print(ndo, dat); 962a90e161bSBill Fenner break; 963a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_ECHORQ: 964*3c602fabSXin LI pptp_echorq_print(ndo, dat); 965a90e161bSBill Fenner break; 966a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_ECHORP: 967*3c602fabSXin LI pptp_echorp_print(ndo, dat); 968a90e161bSBill Fenner break; 969a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_OCRQ: 970*3c602fabSXin LI pptp_ocrq_print(ndo, dat); 971a90e161bSBill Fenner break; 972a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_OCRP: 973*3c602fabSXin LI pptp_ocrp_print(ndo, dat); 974a90e161bSBill Fenner break; 975a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_ICRQ: 976*3c602fabSXin LI pptp_icrq_print(ndo, dat); 977a90e161bSBill Fenner break; 978a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_ICRP: 979*3c602fabSXin LI pptp_icrp_print(ndo, dat); 980a90e161bSBill Fenner break; 981a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_ICCN: 982*3c602fabSXin LI pptp_iccn_print(ndo, dat); 983a90e161bSBill Fenner break; 984a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_CCRQ: 985*3c602fabSXin LI pptp_ccrq_print(ndo, dat); 986a90e161bSBill Fenner break; 987a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_CDN: 988*3c602fabSXin LI pptp_cdn_print(ndo, dat); 989a90e161bSBill Fenner break; 990a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_WEN: 991*3c602fabSXin LI pptp_wen_print(ndo, dat); 992a90e161bSBill Fenner break; 993a90e161bSBill Fenner case PPTP_CTRL_MSG_TYPE_SLI: 994*3c602fabSXin LI pptp_sli_print(ndo, dat); 995a90e161bSBill Fenner break; 996a90e161bSBill Fenner default: 997a90e161bSBill Fenner /* do nothing */ 998a90e161bSBill Fenner break; 999a90e161bSBill Fenner } 1000a90e161bSBill Fenner 1001a90e161bSBill Fenner return; 1002a90e161bSBill Fenner 1003a90e161bSBill Fenner trunc: 1004*3c602fabSXin LI ND_PRINT((ndo, "%s", tstr)); 1005a90e161bSBill Fenner } 1006