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