]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/tcpdump/print-pptp.c
Add the llvm-cov and llvm-profdata tools, when WITH_CLANG_EXTRAS is
[FreeBSD/FreeBSD.git] / contrib / tcpdump / print-pptp.c
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 }