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