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