2 * Routines for ppp packet disassembly
5 * $Id: packet-ppp.c,v 1.114 2003/07/11 09:30:48 guy Exp $
7 * Ethereal - Network traffic analyzer
8 * By Gerald Combs <gerald@ethereal.com>
10 * This file created and by Mike Hall <mlh@io.com>
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License
15 * as published by the Free Software Foundation; either version 2
16 * of the License, or (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
35 #include <epan/packet.h>
36 #include "packet-ppp.h"
40 #include <epan/atalk-utils.h>
41 #include "packet-chdlc.h"
42 #include "packet-ip.h"
43 #include "packet-ipx.h"
44 #include "packet-vines.h"
47 #define ppp_min(a, b) ((a<b) ? a : b)
49 static int proto_ppp = -1;
50 static int hf_ppp_address = -1;
51 static int hf_ppp_control = -1;
52 static int hf_ppp_protocol = -1;
54 static gint ett_ppp = -1;
56 static int proto_lcp = -1;
58 static gint ett_lcp = -1;
59 static gint ett_lcp_options = -1;
60 static gint ett_lcp_authprot_opt = -1;
61 static gint ett_lcp_qualprot_opt = -1;
62 static gint ett_lcp_fcs_alternatives_opt = -1;
63 static gint ett_lcp_numbered_mode_opt = -1;
64 static gint ett_lcp_callback_opt = -1;
65 static gint ett_lcp_multilink_ep_disc_opt = -1;
66 static gint ett_lcp_internationalization_opt = -1;
68 static int proto_ipcp = -1;
70 static gint ett_ipcp = -1;
71 static gint ett_ipcp_options = -1;
72 static gint ett_ipcp_ipaddrs_opt = -1;
73 static gint ett_ipcp_compressprot_opt = -1;
75 static int proto_ccp = -1;
77 static gint ett_ccp = -1;
78 static gint ett_ccp_options = -1;
79 static gint ett_ccp_stac_opt = -1;
80 static gint ett_ccp_mppc_opt = -1;
81 static gint ett_ccp_bsdcomp_opt = -1;
82 static gint ett_ccp_lzsdcp_opt = -1;
83 static gint ett_ccp_mvrca_opt = -1;
84 static gint ett_ccp_deflate_opt = -1;
86 static int proto_cbcp = -1;
88 static gint ett_cbcp = -1;
89 static gint ett_cbcp_options = -1;
90 static gint ett_cbcp_callback_opt = -1;
91 static gint ett_cbcp_callback_opt_addr = -1;
93 static int proto_bacp = -1;
95 static gint ett_bacp = -1;
96 static gint ett_bacp_options = -1;
97 static gint ett_bacp_favored_peer_opt = -1;
99 static int proto_bap = -1;
101 static gint ett_bap = -1;
102 static gint ett_bap_options = -1;
103 static gint ett_bap_link_type_opt = -1;
104 static gint ett_bap_phone_delta_opt = -1;
105 static gint ett_bap_phone_delta_subopt = -1;
106 static gint ett_bap_call_status_opt = -1;
108 static int proto_comp_data = -1;
110 static gint ett_comp_data = -1;
112 static int proto_pppmuxcp = -1;
114 static gint ett_pppmuxcp = -1;
115 static gint ett_pppmuxcp_options = -1;
117 static int proto_pppmux = -1;
119 static gint ett_pppmux = -1;
120 static gint ett_pppmux_subframe = -1;
121 static gint ett_pppmux_subframe_hdr = -1;
122 static gint ett_pppmux_subframe_flags = -1;
123 static gint ett_pppmux_subframe_info = -1;
125 static int proto_mp = -1;
126 static int hf_mp_frag_first = -1;
127 static int hf_mp_frag_last = -1;
128 static int hf_mp_sequence_num = -1;
130 static int ett_mp = -1;
131 static int ett_mp_flags = -1;
133 static int proto_mplscp = -1;
134 static gint ett_mplscp = -1;
135 static gint ett_mplscp_options = -1;
137 static int proto_cdpcp = -1;
138 static gint ett_cdpcp = -1;
139 static gint ett_cdpcp_options = -1;
141 static int proto_pap = -1; /* PAP vars */
142 static gint ett_pap = -1;
143 static gint ett_pap_data = -1;
144 static gint ett_pap_peer_id = -1;
145 static gint ett_pap_password = -1;
146 static gint ett_pap_message = -1;
148 static int proto_chap = -1; /* CHAP vars */
149 static gint ett_chap = -1;
150 static gint ett_chap_data = -1;
151 static gint ett_chap_value = -1;
152 static gint ett_chap_name = -1;
153 static gint ett_chap_message = -1;
155 static int proto_ipv6cp = -1; /* IPv6CP vars */
157 static gint ett_ipv6cp = -1;
158 static gint ett_ipv6cp_options = -1;
159 static gint ett_ipv6cp_if_id_opt = -1;
160 static gint ett_ipv6cp_compressprot_opt = -1;
162 static dissector_table_t ppp_subdissector_table;
163 static dissector_handle_t chdlc_handle;
164 static dissector_handle_t data_handle;
167 static gint ppp_fcs_decode = 0; /* 0 = No FCS, 1 = 16 bit FCS, 2 = 32 bit FCS */
171 gboolean ppp_vj_decomp = TRUE; /* Default to VJ header decompression */
174 * For Default Protocol ID negotiated with PPPMuxCP. We need to
175 * this ID so that if the first subframe doesn't have protocol
179 static guint pppmux_def_prot_id = 0;
181 /* PPP definitions */
184 * Used by the GTP dissector as well.
186 const value_string ppp_vals[] = {
187 {PPP_PADDING, "Padding Protocol" },
188 {PPP_ROHC_SCID, "ROHC small-CID" },
189 {PPP_ROHC_LCID, "ROHC large-CID" },
192 {PPP_DEC4, "DECnet Phase IV" },
193 {PPP_AT, "Appletalk" },
194 {PPP_IPX, "Netware IPX/SPX"},
195 {PPP_VJC_COMP, "VJ compressed TCP"},
196 {PPP_VJC_UNCOMP,"VJ uncompressed TCP"},
197 {PPP_BPDU, "Bridging PDU"},
198 {PPP_ST, "Stream Protocol (ST-II)" },
199 {PPP_VINES, "Vines" },
200 {PPP_AT_EDDP, "AppleTalk EDDP" },
201 {PPP_AT_SB, "AppleTalk SmartBuffered" },
202 {PPP_MP, "Multilink"},
203 {PPP_NB, "NETBIOS Framing" },
204 {PPP_CISCO, "Cisco Systems" },
205 {PPP_ASCOM, "Ascom Timeplex" },
206 {PPP_LBLB, "Fujitsu Link Backup and Load Balancing" },
207 {PPP_RL, "DCA Remote Lan" },
208 {PPP_SDTP, "Serial Data Transport Protocol" },
209 {PPP_LLC, "SNA over LLC" },
211 {PPP_IPV6HC, "IPv6 Header Compression " },
212 {PPP_KNX, "KNX Bridging Data" },
213 {PPP_ENCRYPT, "Encryption" },
214 {PPP_ILE, "Individual Link Encryption" },
216 {PPP_MUX, "PPP Multiplexing"},
217 {PPP_RTP_FH, "RTP IPHC Full Header" },
218 {PPP_RTP_CTCP, "RTP IPHC Compressed TCP" },
219 {PPP_RTP_CNTCP, "RTP IPHC Compressed Non TCP" },
220 {PPP_RTP_CUDP8, "RTP IPHC Compressed UDP 8" },
221 {PPP_RTP_CRTP8, "RTP IPHC Compressed RTP 8" },
222 {PPP_STAMPEDE, "Stampede Bridging" },
223 {PPP_MPPLUS, "MP+ Protocol" },
224 {PPP_NTCITS_IPI,"NTCITS IPI" },
225 {PPP_ML_SLCOMP, "single link compression in multilink" },
226 {PPP_COMP, "compressed packet" },
227 {PPP_STP_HELLO, "802.1d Hello Packet" },
228 {PPP_IBM_SR, "IBM Source Routing BPDU" },
229 {PPP_DEC_LB, "DEC LANBridge100 Spanning Tree"},
230 {PPP_CDP, "Cisco Discovery Protocol" },
231 {PPP_NETCS, "Netcs Twin Routing" },
232 {PPP_STP, "Scheduled Transfer Protocol" },
233 {PPP_EDP, "Extreme Discovery Protocol" },
234 {PPP_OSCP, "Optical Supervisory Channel Protocol" },
235 {PPP_OSCP2, "Optical Supervisory Channel Protocol" },
236 {PPP_LUXCOM, "Luxcom" },
237 {PPP_SIGMA, "Sigma Network Systems" },
238 {PPP_ACSP, "Apple Client Server Protocol" },
239 {PPP_MPLS_UNI, "MPLS Unicast"},
240 {PPP_MPLS_MULTI, "MPLS Multicast"},
241 {PPP_P12844, "IEEE p1284.4 standard - data packets" },
242 {PPP_ETSI, "ETSI TETRA Networks Procotol Type 1" },
243 {PPP_MFTP, "Multichannel Flow Treatment Protocol" },
244 {PPP_RTP_CTCPND,"RTP IPHC Compressed TCP No Delta" },
245 {PPP_RTP_CS, "RTP IPHC Context State" },
246 {PPP_RTP_CUDP16,"RTP IPHC Compressed UDP 16" },
247 {PPP_RTP_CRDP16,"RTP IPHC Compressed RTP 16" },
248 {PPP_CCCP, "Cray Communications Control Protocol" },
249 {PPP_CDPD_MNRP, "CDPD Mobile Network Registration Protocol" },
250 {PPP_EXPANDAP, "Expand accelarator protocol" },
251 {PPP_ODSICP, "ODSICP NCP" },
252 {PPP_DOCSIS, "DOCSIS DLL" },
253 {PPP_LZS, "Stacker LZS" },
254 {PPP_REFTEK, "RefTek Protocol" },
255 {PPP_FC, "Fibre Channel" },
256 {PPP_EMIT, "EMIT Protocols" },
257 {PPP_IPCP, "IP Control Protocol" },
258 {PPP_OSICP, "OSI Control Protocol" },
259 {PPP_XNSIDPCP, "Xerox NS IDP Control Protocol" },
260 {PPP_DECNETCP, "DECnet Phase IV Control Protocol" },
261 {PPP_ATCP, "AppleTalk Control Protocol" },
262 {PPP_IPXCP, "IPX Control Protocol" },
263 {PPP_BRIDGENCP, "Bridging NCP" },
264 {PPP_SPCP, "Stream Protocol Control Protocol" },
265 {PPP_BVCP, "Banyan Vines Control Protocol" },
266 {PPP_MLCP, "Multi-Link Control Protocol" },
267 {PPP_NBCP, "NETBIOS Framing Control Protocol" },
268 {PPP_CISCOCP, "Cisco Systems Control Protocol" },
269 {PPP_ASCOMCP, "Ascom Timeplex" },
270 {PPP_LBLBCP, "Fujitsu LBLB Control Protocol" },
271 {PPP_RLNCP, "DCA Remote Lan Network Control Protocol" },
272 {PPP_SDCP, "Serial Data Control Protocol" },
273 {PPP_LLCCP, "SNA over LLC Control Protocol" },
274 {PPP_SNACP, "SNA Control Protocol" },
275 {PPP_KNXCP, "KNX Bridging Control Protocol" },
276 {PPP_ECP, "Encryption Control Protocol" },
277 {PPP_ILECP, "Individual Encryption Control Protocol" },
278 {PPP_IPV6CP, "IPv6 Control Protocol" },
279 {PPP_MUXCP, "PPPMux Control Protocol"},
280 {PPP_STAMPEDECP,"Stampede Bridging Control Protocol" },
281 {PPP_MPPCP, "MP+ Contorol Protocol" },
282 {PPP_IPICP, "NTCITS IPI Control Protocol" },
283 {PPP_SLCC, "single link compression in multilink control" },
284 {PPP_CCP, "Compression Control Protocol" },
285 {PPP_CDPCP, "CDP Control Protocol" },
286 {PPP_NETCSCP, "Netcs Twin Routing" },
287 {PPP_STPCP, "STP - Control Protocol" },
288 {PPP_EDPCP, "EDP Control Protocol" },
289 {PPP_ACSPC, "Apple Client Server Protocol Control" },
290 {PPP_MPLSCP, "MPLS Control Protocol" },
291 {PPP_P12844CP, "IEEE p1284.4 standard - Protocol Control" },
292 {PPP_ETSICP, "ETSI TETRA TNP1 Control Protocol" },
293 {PPP_MFTPCP, "Multichannel Flow Treatment Protocol" },
294 {PPP_LCP, "Link Control Protocol" },
295 {PPP_PAP, "Password Authentication Protocol" },
296 {PPP_LQR, "Link Quality Report protocol" },
297 {PPP_SPAP, "Shiva Password Authentication Protocol" },
298 {PPP_CBCP, "Callback Control Protocol" },
299 {PPP_BACP, "Bandwidth Allocation Control Protocol" },
300 {PPP_BAP, "Bandwidth Allocation Protocol" },
301 {PPP_CONTCP, "Container Control Protocol" },
302 {PPP_CHAP, "Challenge Handshake Authentication Protocol" },
303 {PPP_RSAAP, "RSA Authentication Protocol" },
304 {PPP_EAP, "Extensible Authentication Protocol" },
305 {PPP_SIEP, "Mitsubishi Security Information Exchange Protocol"},
306 {PPP_SBAP, "Stampede Bridging Authorization Protocol" },
307 {PPP_PRPAP, "Proprietary Authentication Protocol" },
308 {PPP_PRPAP2, "Proprietary Authentication Protocol" },
309 {PPP_PRPNIAP, "Proprietary Node ID Authentication Protocol" },
313 /* CP (LCP, IPCP, etc.) codes.
316 #define CONFREQ 1 /* Configuration Request */
317 #define CONFACK 2 /* Configuration Ack */
318 #define CONFNAK 3 /* Configuration Nak */
319 #define CONFREJ 4 /* Configuration Reject */
320 #define TERMREQ 5 /* Termination Request */
321 #define TERMACK 6 /* Termination Ack */
322 #define CODEREJ 7 /* Code Reject */
324 static const value_string cp_vals[] = {
325 {CONFREQ, "Configuration Request" },
326 {CONFACK, "Configuration Ack" },
327 {CONFNAK, "Configuration Nak" },
328 {CONFREJ, "Configuration Reject" },
329 {TERMREQ, "Termination Request" },
330 {TERMACK, "Termination Ack" },
331 {CODEREJ, "Code Reject" },
335 * LCP-specific packet types.
337 #define PROTREJ 8 /* Protocol Reject */
338 #define ECHOREQ 9 /* Echo Request */
339 #define ECHOREP 10 /* Echo Reply */
340 #define DISCREQ 11 /* Discard Request */
341 #define IDENT 12 /* Identification */
342 #define TIMEREMAIN 13 /* Time remaining */
345 * CCP-specific packet types.
347 #define RESETREQ 14 /* Reset Request */
348 #define RESETACK 15 /* Reset Ack */
351 * CBCP-specific packet types.
353 #define CBREQ 1 /* Callback Request */
354 #define CBRES 2 /* Callback Response */
355 #define CBACK 3 /* Callback Ack */
357 #define CBCP_OPT 6 /* Use callback control protocol */
360 * BAP-specific packet types.
362 #define BAP_CREQ 1 /* Call Request */
363 #define BAP_CRES 2 /* Call Response */
364 #define BAP_CBREQ 3 /* Callback Request */
365 #define BAP_CBRES 4 /* Callback Response */
366 #define BAP_LDQREQ 5 /* Link Drop Query Request */
367 #define BAP_LDQRES 6 /* Link Drop Query Response */
368 #define BAP_CSI 7 /* Call Status Indication */
369 #define BAP_CSRES 8 /* Call Status Response */
371 static const value_string lcp_vals[] = {
372 {CONFREQ, "Configuration Request" },
373 {CONFACK, "Configuration Ack" },
374 {CONFNAK, "Configuration Nak" },
375 {CONFREJ, "Configuration Reject" },
376 {TERMREQ, "Termination Request" },
377 {TERMACK, "Termination Ack" },
378 {CODEREJ, "Code Reject" },
379 {PROTREJ, "Protocol Reject" },
380 {ECHOREQ, "Echo Request" },
381 {ECHOREP, "Echo Reply" },
382 {DISCREQ, "Discard Request" },
383 {IDENT, "Identification" },
384 {TIMEREMAIN, "Time Remaining" },
388 static const value_string ccp_vals[] = {
389 {CONFREQ, "Configuration Request" },
390 {CONFACK, "Configuration Ack" },
391 {CONFNAK, "Configuration Nak" },
392 {CONFREJ, "Configuration Reject" },
393 {TERMREQ, "Termination Request" },
394 {TERMACK, "Termination Ack" },
395 {CODEREJ, "Code Reject" },
396 {RESETREQ, "Reset Request" },
397 {RESETACK, "Reset Ack" },
401 static const value_string cbcp_vals[] = {
402 {CBREQ, "Callback Request" },
403 {CBRES, "Callback Response" },
404 {CBACK, "Callback Ack" },
408 static const value_string bap_vals[] = {
409 {BAP_CREQ, "Call Request" },
410 {BAP_CRES, "Call Response" },
411 {BAP_CBREQ, "Callback Request" },
412 {BAP_CBRES, "Callback Response" },
413 {BAP_LDQREQ, "Link Drop Query Request" },
414 {BAP_LDQRES, "Link Drop Query Response" },
415 {BAP_CSI, "Call Status Indication" },
416 {BAP_CSRES, "Call Status Response" },
420 #define BAP_RESP_CODE_REQACK 0x00
421 #define BAP_RESP_CODE_REQNAK 0x01
422 #define BAP_RESP_CODE_REQREJ 0x02
423 #define BAP_RESP_CODE_REQFULLNAK 0x03
424 static const value_string bap_resp_code_vals[] = {
425 {BAP_RESP_CODE_REQACK, "Request Ack" },
426 {BAP_RESP_CODE_REQNAK, "Request Nak" },
427 {BAP_RESP_CODE_REQREJ, "Request Rej" },
428 {BAP_RESP_CODE_REQFULLNAK, "Request Full Nak" },
432 #define BAP_LINK_TYPE_ISDN 0 /* ISDN */
433 #define BAP_LINK_TYPE_X25 1 /* X.25 */
434 #define BAP_LINK_TYPE_ANALOG 2 /* Analog */
435 #define BAP_LINK_TYPE_SD 3 /* Switched Digital (non-ISDN) */
436 #define BAP_LINK_TYPE_ISDNOV 4 /* ISDN data over voice */
437 #define BAP_LINK_TYPE_RESV5 5 /* Reserved */
438 #define BAP_LINK_TYPE_RESV6 6 /* Reserved */
439 #define BAP_LINK_TYPE_RESV7 7 /* Reserved */
440 static const value_string bap_link_type_vals[] = {
441 {BAP_LINK_TYPE_ISDN, "ISDN" },
442 {BAP_LINK_TYPE_X25, "X.25" },
443 {BAP_LINK_TYPE_ANALOG, "Analog" },
444 {BAP_LINK_TYPE_SD, "Switched Digital (non-ISDN)" },
445 {BAP_LINK_TYPE_ISDNOV, "ISDN data over voice" },
446 {BAP_LINK_TYPE_RESV5, "Reserved" },
447 {BAP_LINK_TYPE_RESV6, "Reserved" },
448 {BAP_LINK_TYPE_RESV7, "Reserved" },
452 #define BAP_PHONE_DELTA_SUBOPT_UNIQ_DIGIT 1 /* Unique Digit */
453 #define BAP_PHONE_DELTA_SUBOPT_SUBSC_NUM 2 /* Subscriber Number */
454 #define BAP_PHONE_DELTA_SUBOPT_PHONENUM_SUBADDR 3 /* Phone Number Sub Address */
455 static const value_string bap_phone_delta_subopt_vals[] = {
456 {BAP_PHONE_DELTA_SUBOPT_UNIQ_DIGIT, "Unique Digit" },
457 {BAP_PHONE_DELTA_SUBOPT_SUBSC_NUM, "Subscriber Number" },
458 {BAP_PHONE_DELTA_SUBOPT_PHONENUM_SUBADDR, "Phone Number Sub Address" },
463 * Cause codes for Cause.
465 * The following code table is taken from packet-q931.c but is slightly
466 * adapted to BAP protocol.
468 static const value_string q931_cause_code_vals[] = {
469 { 0x00, "Call successful" },
470 { 0x01, "Unallocated (unassigned) number" },
471 { 0x02, "No route to specified transit network" },
472 { 0x03, "No route to destination" },
473 { 0x04, "Send special information tone" },
474 { 0x05, "Misdialled trunk prefix" },
475 { 0x06, "Channel unacceptable" },
476 { 0x07, "Call awarded and being delivered in an established channel" },
477 { 0x08, "Prefix 0 dialed but not allowed" },
478 { 0x09, "Prefix 1 dialed but not allowed" },
479 { 0x0A, "Prefix 1 dialed but not required" },
480 { 0x0B, "More digits received than allowed, call is proceeding" },
481 { 0x10, "Normal call clearing" },
482 { 0x11, "User busy" },
483 { 0x12, "No user responding" },
484 { 0x13, "No answer from user (user alerted)" },
485 { 0x14, "Subscriber absent" },
486 { 0x15, "Call rejected" },
487 { 0x16, "Number changed" },
488 { 0x17, "Reverse charging rejected" },
489 { 0x18, "Call suspended" },
490 { 0x19, "Call resumed" },
491 { 0x1A, "Non-selected user clearing" },
492 { 0x1B, "Destination out of order" },
493 { 0x1C, "Invalid number format (incomplete number)" },
494 { 0x1D, "Facility rejected" },
495 { 0x1E, "Response to STATUS ENQUIRY" },
496 { 0x1F, "Normal unspecified" },
497 { 0x21, "Circuit out of order" },
498 { 0x22, "No circuit/channel available" },
499 { 0x23, "Destination unattainable" },
500 { 0x25, "Degraded service" },
501 { 0x26, "Network out of order" },
502 { 0x27, "Transit delay range cannot be achieved" },
503 { 0x28, "Throughput range cannot be achieved" },
504 { 0x29, "Temporary failure" },
505 { 0x2A, "Switching equipment congestion" },
506 { 0x2B, "Access information discarded" },
507 { 0x2C, "Requested circuit/channel not available" },
508 { 0x2D, "Pre-empted" },
509 { 0x2E, "Precedence call blocked" },
510 { 0x2F, "Resources unavailable, unspecified" },
511 { 0x31, "Quality of service unavailable" },
512 { 0x32, "Requested facility not subscribed" },
513 { 0x33, "Reverse charging not allowed" },
514 { 0x34, "Outgoing calls barred" },
515 { 0x35, "Outgoing calls barred within CUG" },
516 { 0x36, "Incoming calls barred" },
517 { 0x37, "Incoming calls barred within CUG" },
518 { 0x38, "Call waiting not subscribed" },
519 { 0x39, "Bearer capability not authorized" },
520 { 0x3A, "Bearer capability not presently available" },
521 { 0x3E, "Inconsistency in designated outgoing access information and subscriber class" },
522 { 0x3F, "Service or option not available, unspecified" },
523 { 0x41, "Bearer capability not implemented" },
524 { 0x42, "Channel type not implemented" },
525 { 0x43, "Transit network selection not implemented" },
526 { 0x44, "Message not implemented" },
527 { 0x45, "Requested facility not implemented" },
528 { 0x46, "Only restricted digital information bearer capability is available" },
529 { 0x4F, "Service or option not implemented, unspecified" },
530 { 0x51, "Invalid call reference value" },
531 { 0x52, "Identified channel does not exist" },
532 { 0x53, "Call identity does not exist for suspended call" },
533 { 0x54, "Call identity in use" },
534 { 0x55, "No call suspended" },
535 { 0x56, "Call having the requested call identity has been cleared" },
536 { 0x57, "Called user not member of CUG" },
537 { 0x58, "Incompatible destination" },
538 { 0x59, "Non-existent abbreviated address entry" },
539 { 0x5A, "Destination address missing, and direct call not subscribed" },
540 { 0x5B, "Invalid transit network selection (national use)" },
541 { 0x5C, "Invalid facility parameter" },
542 { 0x5D, "Mandatory information element is missing" },
543 { 0x5F, "Invalid message, unspecified" },
544 { 0x60, "Mandatory information element is missing" },
545 { 0x61, "Message type non-existent or not implemented" },
546 { 0x62, "Message not compatible with call state or message type non-existent or not implemented" },
547 { 0x63, "Information element nonexistant or not implemented" },
548 { 0x64, "Invalid information element contents" },
549 { 0x65, "Message not compatible with call state" },
550 { 0x66, "Recovery on timer expiry" },
551 { 0x67, "Parameter non-existent or not implemented - passed on" },
552 { 0x6E, "Message with unrecognized parameter discarded" },
553 { 0x6F, "Protocol error, unspecified" },
554 { 0x7F, "Internetworking, unspecified" },
555 { 0xFF, "Non-specific failure" },
559 static const value_string bap_call_status_opt_action_vals[] = {
565 #define STAC_CM_NONE 0
566 #define STAC_CM_LCB 1
567 #define STAC_CM_CRC 2
569 #define STAC_CM_EXTMODE 4
570 static const value_string stac_checkmode_vals[] = {
571 {STAC_CM_NONE, "None" },
572 {STAC_CM_LCB, "LCB" },
573 {STAC_CM_CRC, "CRC" },
574 {STAC_CM_SN, "Sequence Number" },
575 {STAC_CM_EXTMODE, "Extended Mode" },
579 #define LZSDCP_CM_NONE 0
580 #define LZSDCP_CM_LCB 1
581 #define LZSDCP_CM_SN 2
582 #define LZSDCP_CM_SN_LCB 3
583 static const value_string lzsdcp_checkmode_vals[] = {
584 {LZSDCP_CM_NONE, "None" },
585 {LZSDCP_CM_LCB, "LCB" },
586 {LZSDCP_CM_SN, "Sequence Number" },
587 {LZSDCP_CM_SN_LCB, "Sequence Number + LCB" },
591 #define LZSDCP_PM_NONE 0
592 #define LZSDCP_PM_PROC_UNCOMP 1
593 static const value_string lzsdcp_processmode_vals[] = {
594 {LZSDCP_PM_NONE, "None" },
595 {LZSDCP_PM_PROC_UNCOMP, "Process-Uncompressed" },
602 #define CI_MRU 1 /* Maximum Receive Unit */
603 #define CI_ASYNCMAP 2 /* Async Control Character Map */
604 #define CI_AUTHTYPE 3 /* Authentication Type */
605 #define CI_QUALITY 4 /* Quality Protocol */
606 #define CI_MAGICNUMBER 5 /* Magic Number */
607 #define CI_PCOMPRESSION 7 /* Protocol Field Compression */
608 #define CI_ACCOMPRESSION 8 /* Address/Control Field Compression */
609 #define CI_FCS_ALTERNATIVES 9 /* FCS Alternatives (RFC 1570) */
610 #define CI_SELF_DESCRIBING_PAD 10 /* Self-Describing Pad (RFC 1570) */
611 #define CI_NUMBERED_MODE 11 /* Numbered Mode (RFC 1663) */
612 #define CI_CALLBACK 13 /* Callback (RFC 1570) */
613 #define CI_COMPOUND_FRAMES 15 /* Compound frames (RFC 1570) */
614 #define CI_MULTILINK_MRRU 17 /* Multilink MRRU (RFC 1717) */
615 #define CI_MULTILINK_SSNH 18 /* Multilink Short Sequence Number
617 #define CI_MULTILINK_EP_DISC 19 /* Multilink Endpoint Discriminator
619 #define CI_DCE_IDENTIFIER 21 /* DCE Identifier */
620 #define CI_MULTILINK_PLUS_PROC 22 /* Multilink Plus Procedure */
621 #define CI_LINK_DISC_FOR_BACP 23 /* Link Discriminator for BACP
623 #define CI_LCP_AUTHENTICATION 24 /* LCP Authentication Option */
624 #define CI_COBS 25 /* Consistent Overhead Byte
626 #define CI_PREFIX_ELISION 26 /* Prefix elision */
627 #define CI_MULTILINK_HDR_FMT 27 /* Multilink header format */
628 #define CI_INTERNATIONALIZATION 28 /* Internationalization (RFC 2484) */
629 #define CI_SDL_ON_SONET_SDH 29 /* Simple Data Link on SONET/SDH */
631 static void dissect_lcp_mru_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
632 int offset, guint length, packet_info *pinfo,
634 static void dissect_lcp_async_map_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
635 int offset, guint length, packet_info *pinfo,
637 static void dissect_lcp_protocol_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
638 int offset, guint length, packet_info *pinfo,
640 static void dissect_lcp_authprot_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
641 int offset, guint length, packet_info *pinfo,
643 static void dissect_lcp_magicnumber_opt(const ip_tcp_opt *optp,
644 tvbuff_t *tvb, int offset, guint length,
645 packet_info *pinfo, proto_tree *tree);
646 static void dissect_lcp_fcs_alternatives_opt(const ip_tcp_opt *optp,
647 tvbuff_t *tvb, int offset, guint length,
648 packet_info *pinfo, proto_tree *tree);
649 static void dissect_lcp_numbered_mode_opt(const ip_tcp_opt *optp,
650 tvbuff_t *tvb, int offset, guint length,
651 packet_info *pinfo, proto_tree *tree);
652 static void dissect_lcp_self_describing_pad_opt(const ip_tcp_opt *optp,
653 tvbuff_t *tvb, int offset, guint length,
654 packet_info *pinfo, proto_tree *tree);
655 static void dissect_lcp_callback_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
656 int offset, guint length, packet_info *pinfo,
658 static void dissect_lcp_multilink_mrru_opt(const ip_tcp_opt *optp,
659 tvbuff_t *tvb, int offset, guint length,
660 packet_info *pinfo, proto_tree *tree);
661 static void dissect_lcp_multilink_ep_disc_opt(const ip_tcp_opt *optp,
662 tvbuff_t *tvb, int offset, guint length,
663 packet_info *pinfo, proto_tree *tree);
664 static void dissect_lcp_bap_link_discriminator_opt(const ip_tcp_opt *optp,
665 tvbuff_t *tvb, int offset, guint length,
666 packet_info *pinfo, proto_tree *tree);
667 static void dissect_lcp_internationalization_opt(const ip_tcp_opt *optp,
668 tvbuff_t *tvb, int offset, guint length,
669 packet_info *pinfo, proto_tree *tree);
670 static void dissect_mp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
672 static const ip_tcp_opt lcp_opts[] = {
675 "Maximum Receive Unit",
683 "Async Control Character Map",
687 dissect_lcp_async_map_opt
691 "Authentication protocol",
692 &ett_lcp_authprot_opt,
695 dissect_lcp_authprot_opt
700 &ett_lcp_qualprot_opt,
703 dissect_lcp_protocol_opt
711 dissect_lcp_magicnumber_opt
715 "Protocol field compression",
723 "Address/control field compression",
732 &ett_lcp_fcs_alternatives_opt,
735 dissect_lcp_fcs_alternatives_opt
738 CI_SELF_DESCRIBING_PAD,
739 "Maximum octets of self-describing padding",
743 dissect_lcp_self_describing_pad_opt
748 &ett_lcp_numbered_mode_opt,
751 dissect_lcp_numbered_mode_opt
756 &ett_lcp_callback_opt,
759 dissect_lcp_callback_opt,
775 dissect_lcp_multilink_mrru_opt
779 "Use short sequence number headers",
786 CI_MULTILINK_EP_DISC,
787 "Multilink endpoint discriminator",
788 &ett_lcp_multilink_ep_disc_opt,
791 dissect_lcp_multilink_ep_disc_opt,
802 CI_MULTILINK_PLUS_PROC,
803 "Multilink Plus Procedure",
810 CI_LINK_DISC_FOR_BACP,
811 "Link discriminator for BAP",
815 dissect_lcp_bap_link_discriminator_opt
818 CI_LCP_AUTHENTICATION,
819 "LCP authentication",
827 "Consistent Overhead Byte Stuffing",
842 CI_MULTILINK_HDR_FMT,
843 "Multilink header format",
850 CI_INTERNATIONALIZATION,
851 "Internationalization",
852 &ett_lcp_internationalization_opt,
855 dissect_lcp_internationalization_opt
859 "Simple data link on SONET/SDH",
867 #define N_LCP_OPTS (sizeof lcp_opts / sizeof lcp_opts[0])
872 #define CHAP_ALG_MD5 0x05 /* CHAP with MD5 */
873 #define CHAP_ALG_MSV1 0x80 /* MS-CHAPv1 */
874 #define CHAP_ALG_MSV2 0x81 /* MS-CHAPv2 */
876 static const value_string chap_alg_vals[] = {
877 {CHAP_ALG_MD5, "CHAP with MD5" },
878 {CHAP_ALG_MSV1, "MS-CHAP" },
879 {CHAP_ALG_MSV2, "MS-CHAP-2" },
887 #define CI_ADDRS 1 /* IP Addresses (deprecated) (RFC 1172) */
888 #define CI_COMPRESSTYPE 2 /* Compression Type (RFC 1332) */
889 #define CI_ADDR 3 /* IP Address (RFC 1332) */
890 #define CI_MOBILE_IPv4 4 /* Mobile IPv4 (RFC 2290) */
891 #define CI_MS_DNS1 129 /* Primary DNS value (RFC 1877) */
892 #define CI_MS_WINS1 130 /* Primary WINS value (RFC 1877) */
893 #define CI_MS_DNS2 131 /* Secondary DNS value (RFC 1877) */
894 #define CI_MS_WINS2 132 /* Secondary WINS value (RFC 1877) */
896 static void dissect_ipcp_addrs_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
897 int offset, guint length, packet_info *pinfo,
899 static void dissect_ipcp_addr_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
900 int offset, guint length, packet_info *pinfo,
903 static const ip_tcp_opt ipcp_opts[] = {
906 "IP addresses (deprecated)",
907 &ett_ipcp_ipaddrs_opt,
910 dissect_ipcp_addrs_opt
914 "IP compression protocol",
915 &ett_ipcp_compressprot_opt,
918 dissect_lcp_protocol_opt
926 dissect_ipcp_addr_opt
930 "Mobile node's home IP address",
934 dissect_ipcp_addr_opt
938 "Primary DNS server IP address",
942 dissect_ipcp_addr_opt
946 "Primary WINS server IP address",
950 dissect_ipcp_addr_opt
954 "Secondary DNS server IP address",
958 dissect_ipcp_addr_opt
962 "Secondary WINS server IP address",
966 dissect_ipcp_addr_opt
970 #define N_IPCP_OPTS (sizeof ipcp_opts / sizeof ipcp_opts[0])
975 #define CI_CCP_OUI 0 /* OUI (RFC1962) */
976 #define CI_CCP_PREDICT1 1 /* Predictor type 1 (RFC1962) */
977 #define CI_CCP_PREDICT2 2 /* Predictor type 2 (RFC1962) */
978 #define CI_CCP_PUDDLE 3 /* Puddle Jumper (RFC1962) */
979 #define CI_CCP_HPPPC 16 /* Hewlett-Packard PPC (RFC1962) */
980 #define CI_CCP_STAC 17 /* stac Electronics LZS (RFC1974) */
981 #define CI_CCP_MPPC 18 /* Microsoft PPC (RFC2218/3078) */
982 #define CI_CCP_GFZA 19 /* Gandalf FZA (RFC1962) */
983 #define CI_CCP_V42BIS 20 /* V.42bis compression */
984 #define CI_CCP_BSDLZW 21 /* BSD LZW Compress (RFC1977) */
985 #define CI_CCP_LZSDCP 23 /* LZS-DCP (RFC1967) */
986 #define CI_CCP_MVRCA 24 /* MVRCA (Magnalink) (RFC1975) */
987 #define CI_CCP_DEFLATE 26 /* Deflate (RFC1979) */
988 #define CI_CCP_RESERVED 255 /* Reserved (RFC1962) */
991 * Microsoft Point-To-Point Compression (MPPC) and Encryption (MPPE)
994 #define MPPC_SUPPORTED_BITS_C 0x00000001 /* MPPC negotiation */
995 #define MPPE_SUPPORTED_BITS_D 0x00000010 /* Obsolete */
996 #define MPPE_SUPPORTED_BITS_L 0x00000020 /* 40-bit encryption */
997 #define MPPE_SUPPORTED_BITS_S 0x00000040 /* 128-bit encryption */
998 #define MPPE_SUPPORTED_BITS_M 0x00000080 /* 56-bit encryption */
999 #define MPPE_SUPPORTED_BITS_H 0x01000000 /* stateless mode */
1001 static void dissect_ccp_stac_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1002 int offset, guint length, packet_info *pinfo,
1005 static void dissect_ccp_mppc_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1006 int offset, guint length, packet_info *pinfo,
1009 static void dissect_ccp_bsdcomp_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1010 int offset, guint length, packet_info *pinfo,
1013 static void dissect_ccp_lzsdcp_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1014 int offset, guint length, packet_info *pinfo,
1017 static void dissect_ccp_mvrca_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1018 int offset, guint length, packet_info *pinfo,
1021 static void dissect_ccp_deflate_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1022 int offset, guint length, packet_info *pinfo,
1025 static const ip_tcp_opt ccp_opts[] = {
1028 "Stac Electronics LZS",
1032 /* In RFC 1974, this is a fixed-length field of size 5,
1033 but in Ascend Proprietary STAC compression this field
1034 is 6 octets. Sigh... */
1035 dissect_ccp_stac_opt
1043 dissect_ccp_mppc_opt
1048 &ett_ccp_bsdcomp_opt,
1051 dissect_ccp_bsdcomp_opt
1056 &ett_ccp_lzsdcp_opt,
1059 dissect_ccp_lzsdcp_opt
1063 "MVRCA (Magnalink)",
1067 dissect_ccp_mvrca_opt
1072 &ett_ccp_deflate_opt,
1074 4, /* RFC1979 says the length is 3 but it's actually 4. */
1075 dissect_ccp_deflate_opt
1079 #define N_CCP_OPTS (sizeof ccp_opts / sizeof ccp_opts[0])
1084 #define CI_CBCP_NO_CALLBACK 1 /* No callback */
1085 #define CI_CBCP_CB_USER 2 /* Callback to a user-specified number */
1086 #define CI_CBCP_CB_PRE 3 /* Callback to a pre-specified or
1087 administrator specified number */
1088 #define CI_CBCP_CB_ANY 4 /* Callback to any of a list of numbers */
1090 static void dissect_cbcp_no_callback_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1091 int offset, guint length, packet_info *pinfo,
1094 static void dissect_cbcp_callback_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1095 int offset, guint length, packet_info *pinfo,
1098 static const ip_tcp_opt cbcp_opts[] = {
1100 CI_CBCP_NO_CALLBACK,
1105 dissect_cbcp_no_callback_opt
1109 "Callback to a user-specified number",
1110 &ett_cbcp_callback_opt,
1113 dissect_cbcp_callback_opt
1117 "Callback to a pre-specified or admin-specified number",
1118 &ett_cbcp_callback_opt,
1121 dissect_cbcp_callback_opt
1125 "Callback to any of a list of numbers",
1126 &ett_cbcp_callback_opt,
1129 dissect_cbcp_callback_opt
1134 #define N_CBCP_OPTS (sizeof cbcp_opts / sizeof cbcp_opts[0])
1139 #define CI_BACP_FAVORED_PEER 1 /* Favored-Peer */
1141 static void dissect_bacp_favored_peer_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1142 int offset, guint length, packet_info *pinfo,
1145 static const ip_tcp_opt bacp_opts[] = {
1147 CI_BACP_FAVORED_PEER,
1149 &ett_bacp_favored_peer_opt,
1152 dissect_bacp_favored_peer_opt
1156 #define N_BACP_OPTS (sizeof bacp_opts / sizeof bacp_opts[0])
1161 #define CI_BAP_LINK_TYPE 1 /* Link Type */
1162 #define CI_BAP_PHONE_DELTA 2 /* Phone-Delta */
1163 #define CI_BAP_NO_PHONE_NUM_NEEDED 3 /* No Phone Number Needed */
1164 #define CI_BAP_REASON 4 /* Reason */
1165 #define CI_BAP_LINK_DISC 5 /* Link Discriminator */
1166 #define CI_BAP_CALL_STATUS 6 /* Call Status */
1168 static void dissect_bap_link_type_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1169 int offset, guint length, packet_info *pinfo,
1172 static void dissect_bap_phone_delta_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1173 int offset, guint length, packet_info *pinfo,
1176 static void dissect_bap_link_disc_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1177 int offset, guint length, packet_info *pinfo,
1180 static void dissect_bap_reason_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1181 int offset, guint length, packet_info *pinfo,
1184 static void dissect_bap_call_status_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1185 int offset, guint length, packet_info *pinfo,
1188 static const ip_tcp_opt bap_opts[] = {
1192 &ett_bap_link_type_opt,
1195 dissect_bap_link_type_opt
1200 &ett_bap_phone_delta_opt,
1203 dissect_bap_phone_delta_opt
1206 CI_BAP_NO_PHONE_NUM_NEEDED,
1207 "No Phone Number Needed",
1219 dissect_bap_reason_opt
1223 "Link Discriminator",
1227 dissect_bap_link_disc_opt
1232 &ett_bap_call_status_opt,
1235 dissect_bap_call_status_opt
1239 #define N_BAP_OPTS (sizeof bap_opts / sizeof bap_opts[0])
1241 static void dissect_ppp(tvbuff_t *tvb, packet_info *pinfo,
1244 static const value_string pap_vals[] = {
1245 {CONFREQ, "Authenticate-Request" },
1246 {CONFACK, "Authenticate-Ack" },
1247 {CONFNAK, "Authenticate-Nak" },
1250 static void dissect_pap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
1252 #define CHAP_CHAL 1 /* CHAP Challenge */
1253 #define CHAP_RESP 2 /* CHAP Response */
1254 #define CHAP_SUCC 3 /* CHAP Success */
1255 #define CHAP_FAIL 4 /* CHAP Failure */
1257 static const value_string chap_vals[] = {
1258 {CHAP_CHAL, "Challenge" },
1259 {CHAP_RESP, "Response" },
1260 {CHAP_SUCC, "Success" },
1261 {CHAP_FAIL, "Failure" },
1264 static void dissect_chap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
1266 static const value_string pppmuxcp_vals[] = {
1267 {CONFREQ, "Configuration Request" },
1268 {CONFACK, "Configuration Ack" },
1276 #define CI_DEFAULT_PID 1
1278 static void dissect_pppmuxcp_def_pid_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1279 int offset, guint length, packet_info *pinfo, proto_tree *tree);
1282 static const ip_tcp_opt pppmuxcp_opts[] = {
1285 "Default Protocol ID",
1289 dissect_pppmuxcp_def_pid_opt
1293 #define N_PPPMUXCP_OPTS (sizeof pppmuxcp_opts / sizeof pppmuxcp_opts[0])
1298 #define CI_IPV6CP_IF_ID 1 /* Interface Identifier (RFC 2472) */
1299 #define CI_IPV6CP_COMPRESSTYPE 2 /* Compression Type (RFC 2472) */
1301 static void dissect_ipv6cp_if_id_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1302 int offset, guint length, packet_info *pinfo,
1305 static const ip_tcp_opt ipv6cp_opts[] = {
1308 "Interface Identifier",
1309 &ett_ipv6cp_if_id_opt,
1312 dissect_ipv6cp_if_id_opt
1316 "IPv6 compression protocol",
1317 &ett_ipcp_compressprot_opt,
1320 dissect_lcp_protocol_opt
1324 #define N_IPV6CP_OPTS (sizeof ipv6cp_opts / sizeof ipv6cp_opts[0])
1327 static const unsigned int fcstab_32[256] =
1329 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
1330 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
1331 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
1332 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
1333 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
1334 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
1335 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
1336 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
1337 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
1338 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
1339 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
1340 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
1341 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
1342 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
1343 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
1344 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
1345 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
1346 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
1347 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
1348 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
1349 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
1350 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
1351 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
1352 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
1353 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
1354 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
1355 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
1356 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
1357 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
1358 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
1359 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
1360 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
1361 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
1362 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
1363 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
1364 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
1365 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
1366 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
1367 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
1368 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
1369 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
1370 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
1371 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
1372 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
1373 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
1374 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
1375 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
1376 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
1377 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
1378 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
1379 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
1380 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
1381 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
1382 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
1383 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
1384 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
1385 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
1386 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
1387 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
1388 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
1389 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
1390 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
1391 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
1392 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
1395 static const unsigned short fcstab_16[256] = {
1396 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
1397 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
1398 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
1399 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
1400 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
1401 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
1402 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
1403 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
1404 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
1405 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
1406 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
1407 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
1408 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
1409 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
1410 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
1411 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
1412 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
1413 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
1414 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
1415 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
1416 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
1417 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
1418 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
1419 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
1420 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
1421 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
1422 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
1423 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
1424 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
1425 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
1426 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
1427 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
1431 *******************************************************************************
1432 * DETAILS : Calculate a new FCS-16 given the current FCS-16 and the new data.
1433 *******************************************************************************
1436 fcs16(register guint16 fcs, tvbuff_t * tvbuff)
1439 guint len = tvb_length(tvbuff)-2;
1442 /* Check for Invalid Length */
1446 val = tvb_get_guint8(tvbuff, offset++);
1447 fcs = (guint16)((fcs >> 8) & 0x00ff) ^
1448 fcstab_16[((guint16)(fcs ^ (guint16)((val) & 0x00ff)) & 0x00ff)];
1451 return (fcs ^ 0xffff);
1455 *******************************************************************************
1456 * DETAILS : Calculate a new FCS-32 given the current FCS-32 and the new data.
1457 *******************************************************************************
1460 fcs32(guint32 fcs, tvbuff_t * tvbuff)
1463 guint len = tvb_length(tvbuff)-4;
1466 /* Check for invalid Length */
1468 return (0x00000000);
1471 val = tvb_get_guint8(tvbuff, offset++);
1472 fcs = (((fcs) >> 8) ^ fcstab_32[((fcs) ^ (val)) & 0xff]);
1474 return (fcs ^ 0xffffffff);
1478 capture_ppp_hdlc( const guchar *pd, int offset, int len, packet_counts *ld ) {
1479 if (!BYTES_ARE_IN_FRAME(offset, len, 2)) {
1483 if (pd[0] == CHDLC_ADDR_UNICAST || pd[0] == CHDLC_ADDR_MULTICAST) {
1484 capture_chdlc(pd, offset, len, ld);
1487 if (!BYTES_ARE_IN_FRAME(offset, len, 4)) {
1491 switch (pntohs(&pd[offset + 2])) {
1493 capture_ip(pd, offset + 4, len, ld);
1508 dissect_lcp_mru_opt(const ip_tcp_opt *optp, tvbuff_t *tvb, int offset,
1509 guint length, packet_info *pinfo _U_,
1512 proto_tree_add_text(tree, tvb, offset, length, "%s: %u", optp->name,
1513 tvb_get_ntohs(tvb, offset + 2));
1517 dissect_lcp_async_map_opt(const ip_tcp_opt *optp, tvbuff_t *tvb, int offset,
1518 guint length, packet_info *pinfo _U_,
1523 static const char *ctrlchars[32] = {
1524 "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
1525 "BS", "HT", "NL", "VT", "NP (FF)", "CR", "SO", "SI",
1526 "DLE", "DC1 (XON)", "DC2", "DC3 (XOFF)", "DC4", "NAK", "SYN", "ETB",
1527 "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US"
1529 char mapbuf[32*(10+2)+1];
1534 * XXX - walk through the map and show the characters to map?
1535 * Put them in a subtree of this item, and have the top-level item
1536 * either say "None", "All", or give a list of the characters?)
1538 map = tvb_get_ntohl(tvb, offset + 2);
1539 if (map == 0x00000000)
1540 mapstr = "None"; /* don't map any control characters */
1541 else if (map == 0xffffffff)
1542 mapstr = "All"; /* map all control characters */
1545 * Show the names of the control characters being mapped.
1548 for (i = 0; i < 32; i++) {
1549 if (map & (1 << i)) {
1550 if (mapp != &mapbuf[0]) {
1554 strcpy(mapp, ctrlchars[i]);
1555 mapp += strlen(ctrlchars[i]);
1560 proto_tree_add_text(tree, tvb, offset, length, "%s: 0x%08x (%s)", optp->name,
1565 dissect_lcp_protocol_opt(const ip_tcp_opt *optp, tvbuff_t *tvb, int offset,
1566 guint length, packet_info *pinfo _U_,
1571 proto_tree *field_tree = NULL;
1573 tf = proto_tree_add_text(tree, tvb, offset, length, "%s: %u byte%s",
1574 optp->name, length, plurality(length, "", "s"));
1575 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
1578 protocol = tvb_get_ntohs(tvb, offset);
1579 proto_tree_add_text(field_tree, tvb, offset, 2, "%s: %s (0x%02x)", optp->name,
1580 val_to_str(protocol, ppp_vals, "Unknown"), protocol);
1584 proto_tree_add_text(field_tree, tvb, offset, length, "Data (%d byte%s)", length,
1585 plurality(length, "", "s"));
1589 dissect_lcp_authprot_opt(const ip_tcp_opt *optp, tvbuff_t *tvb, int offset,
1590 guint length, packet_info *pinfo _U_,
1596 proto_tree *field_tree = NULL;
1598 tf = proto_tree_add_text(tree, tvb, offset, length, "%s: %u byte%s",
1599 optp->name, length, plurality(length, "", "s"));
1600 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
1603 protocol = tvb_get_ntohs(tvb, offset);
1604 proto_tree_add_text(field_tree, tvb, offset, 2, "%s: %s (0x%02x)", optp->name,
1605 val_to_str(protocol, ppp_vals, "Unknown"), protocol);
1609 if (protocol == PPP_CHAP) {
1610 algorithm = tvb_get_guint8(tvb, offset);
1611 proto_tree_add_text(field_tree, tvb, offset, length,
1612 "Algorithm: %s (0x%02x)",
1613 val_to_str(algorithm, chap_alg_vals, "Unknown"),
1617 proto_tree_add_text(field_tree, tvb, offset, length, "Data (%d byte%s)", length,
1618 plurality(length, "", "s"));
1624 dissect_lcp_magicnumber_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1625 int offset, guint length, packet_info *pinfo _U_,
1628 proto_tree_add_text(tree, tvb, offset, length, "%s: 0x%08x", optp->name,
1629 tvb_get_ntohl(tvb, offset + 2));
1633 dissect_lcp_fcs_alternatives_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1634 int offset, guint length, packet_info *pinfo _U_,
1638 proto_tree *field_tree = NULL;
1639 guint8 alternatives;
1641 alternatives = tvb_get_guint8(tvb, offset + 2);
1642 tf = proto_tree_add_text(tree, tvb, offset, length, "%s: 0x%02x",
1643 optp->name, alternatives);
1644 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
1646 if (alternatives & 0x1)
1647 proto_tree_add_text(field_tree, tvb, offset + 2, 1, "%s",
1648 decode_boolean_bitfield(alternatives, 0x1, 8, "Null FCS", NULL));
1649 if (alternatives & 0x2)
1650 proto_tree_add_text(field_tree, tvb, offset + 2, 1, "%s",
1651 decode_boolean_bitfield(alternatives, 0x2, 8, "CCITT 16-bit FCS", NULL));
1652 if (alternatives & 0x4)
1653 proto_tree_add_text(field_tree, tvb, offset + 2, 1, "%s",
1654 decode_boolean_bitfield(alternatives, 0x4, 8, "CCITT 32-bit FCS", NULL));
1658 dissect_lcp_self_describing_pad_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1659 int offset, guint length, packet_info *pinfo _U_,
1662 proto_tree_add_text(tree, tvb, offset, length, "%s: %u", optp->name,
1663 tvb_get_guint8(tvb, offset + 2));
1667 dissect_lcp_numbered_mode_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1668 int offset, guint length, packet_info *pinfo _U_,
1672 proto_tree *field_tree = NULL;
1674 tf = proto_tree_add_text(tree, tvb, offset, length, "%s: %u byte%s",
1675 optp->name, length, plurality(length, "", "s"));
1676 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
1679 proto_tree_add_text(field_tree, tvb, offset, 1, "Window: %u",
1680 tvb_get_guint8(tvb, offset));
1684 proto_tree_add_text(field_tree, tvb, offset, length, "Address (%d byte%s)",
1685 length, plurality(length, "", "s"));
1688 static const value_string callback_op_vals[] = {
1689 {0, "Location is determined by user authentication" },
1690 {1, "Message is dialing string" },
1691 {2, "Message is location identifier" },
1692 {3, "Message is E.164" },
1693 {4, "Message is distinguished name" },
1695 {6, "Location is determined during CBCP negotiation" },
1700 dissect_lcp_callback_opt(const ip_tcp_opt *optp, tvbuff_t *tvb, int offset,
1701 guint length, packet_info *pinfo _U_,
1705 proto_tree *field_tree = NULL;
1708 tf = proto_tree_add_text(tree, tvb, offset, length, "%s: %u byte%s",
1709 optp->name, length, plurality(length, "", "s"));
1710 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
1713 operation = tvb_get_guint8(tvb, offset);
1714 proto_tree_add_text(field_tree, tvb, offset, 1, "Operation: %s (0x%02x)",
1715 val_to_str(operation, callback_op_vals, "Unknown"),
1720 proto_tree_add_text(field_tree, tvb, offset, length, "Message (%d byte%s)",
1721 length, plurality(length, "", "s"));
1725 dissect_lcp_multilink_mrru_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1726 int offset, guint length, packet_info *pinfo _U_,
1729 proto_tree_add_text(tree, tvb, offset, length, "%s: %u", optp->name,
1730 tvb_get_ntohs(tvb, offset + 2));
1733 #define CLASS_NULL 0
1734 #define CLASS_LOCAL 1
1736 #define CLASS_IEEE_802_1 3
1737 #define CLASS_PPP_MAGIC_NUMBER 4
1738 #define CLASS_PSDN_DIRECTORY_NUMBER 5
1740 static const value_string multilink_ep_disc_class_vals[] = {
1741 {CLASS_NULL, "Null" },
1742 {CLASS_LOCAL, "Locally assigned address" },
1743 {CLASS_IP, "IP address" },
1744 {CLASS_IEEE_802_1, "IEEE 802.1 globally assigned MAC address" },
1745 {CLASS_PPP_MAGIC_NUMBER, "PPP magic-number block" },
1746 {CLASS_PSDN_DIRECTORY_NUMBER, "Public switched network directory number" },
1751 dissect_lcp_multilink_ep_disc_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1752 int offset, guint length, packet_info *pinfo _U_,
1756 proto_tree *field_tree = NULL;
1757 guint8 ep_disc_class;
1759 tf = proto_tree_add_text(tree, tvb, offset, length, "%s: %u byte%s",
1760 optp->name, length, plurality(length, "", "s"));
1761 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
1764 ep_disc_class = tvb_get_guint8(tvb, offset);
1765 proto_tree_add_text(field_tree, tvb, offset, 1, "Class: %s (%u)",
1766 val_to_str(ep_disc_class, multilink_ep_disc_class_vals, "Unknown"),
1771 switch (ep_disc_class) {
1774 proto_tree_add_text(field_tree, tvb, offset, length,
1775 "Address (%d byte%s), should have been empty",
1776 length, plurality(length, "", "s"));
1781 proto_tree_add_text(field_tree, tvb, offset, length,
1782 "Address (%d byte%s), should have been <20",
1783 length, plurality(length, "", "s"));
1785 proto_tree_add_text(field_tree, tvb, offset, length,
1786 "Address (%d byte%s)",
1787 length, plurality(length, "", "s"));
1793 proto_tree_add_text(field_tree, tvb, offset, length,
1794 "Address (%d byte%s), should have been 4",
1795 length, plurality(length, "", "s"));
1797 proto_tree_add_text(field_tree, tvb, offset, length,
1798 "Address: %s", ip_to_str(tvb_get_ptr(tvb, offset, 4)));
1802 case CLASS_IEEE_802_1:
1804 proto_tree_add_text(field_tree, tvb, offset, length,
1805 "Address (%d byte%s), should have been 6",
1806 length, plurality(length, "", "s"));
1808 proto_tree_add_text(field_tree, tvb, offset, length,
1809 "Address: %s", ether_to_str(tvb_get_ptr(tvb, offset, 6)));
1813 case CLASS_PPP_MAGIC_NUMBER:
1814 /* XXX - dissect as 32-bit magic numbers */
1816 proto_tree_add_text(field_tree, tvb, offset, length,
1817 "Address (%d byte%s), should have been <20",
1818 length, plurality(length, "", "s"));
1820 proto_tree_add_text(field_tree, tvb, offset, length,
1821 "Address (%d byte%s)",
1822 length, plurality(length, "", "s"));
1826 case CLASS_PSDN_DIRECTORY_NUMBER:
1828 proto_tree_add_text(field_tree, tvb, offset, length,
1829 "Address (%d byte%s), should have been <20",
1830 length, plurality(length, "", "s"));
1832 proto_tree_add_text(field_tree, tvb, offset, length,
1833 "Address (%d byte%s)",
1834 length, plurality(length, "", "s"));
1839 proto_tree_add_text(field_tree, tvb, offset, length,
1840 "Address (%d byte%s)",
1841 length, plurality(length, "", "s"));
1848 dissect_lcp_bap_link_discriminator_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1849 int offset, guint length, packet_info *pinfo _U_,
1852 proto_tree_add_text(tree, tvb, offset, length,
1853 "%s: 0x%04x", optp->name,
1854 tvb_get_ntohs(tvb, offset + 2));
1857 /* Character set numbers from the IANA charset registry. */
1858 static const value_string charset_num_vals[] = {
1864 dissect_lcp_internationalization_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1865 int offset, guint length, packet_info *pinfo _U_,
1869 proto_tree *field_tree = NULL;
1872 tf = proto_tree_add_text(tree, tvb, offset, length, "%s: %u byte%s",
1873 optp->name, length, plurality(length, "", "s"));
1874 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
1877 charset = tvb_get_ntohl(tvb, offset);
1878 proto_tree_add_text(field_tree, tvb, offset, 4, "Character set: %s (0x%04x)",
1879 val_to_str(charset, charset_num_vals, "Unknown"),
1884 /* XXX - should be displayed as an ASCII string */
1885 proto_tree_add_text(field_tree, tvb, offset, length, "Language tag (%d byte%s)",
1886 length, plurality(length, "", "s"));
1891 dissect_ipcp_addrs_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1892 int offset, guint length, packet_info *pinfo _U_,
1896 proto_tree *field_tree = NULL;
1898 tf = proto_tree_add_text(tree, tvb, offset, length, "%s: %u byte%s",
1899 optp->name, length, plurality(length, "", "s"));
1900 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
1903 proto_tree_add_text(field_tree, tvb, offset, 4,
1904 "Source IP address: %s",
1905 ip_to_str(tvb_get_ptr(tvb, offset, 4)));
1908 proto_tree_add_text(field_tree, tvb, offset, 4,
1909 "Destination IP address: %s",
1910 ip_to_str(tvb_get_ptr(tvb, offset, 4)));
1913 static void dissect_ipcp_addr_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1914 int offset, guint length, packet_info *pinfo _U_,
1917 proto_tree_add_text(tree, tvb, offset, length, "%s: %s", optp->name,
1918 ip_to_str(tvb_get_ptr(tvb, offset + 2, 4)));
1921 static void dissect_pppmuxcp_def_pid_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1922 int offset, guint length, packet_info *pinfo _U_,
1925 pppmux_def_prot_id = tvb_get_ntohs(tvb, offset + 2);
1926 proto_tree_add_text(tree, tvb, offset + 2, length - 2, "%s: %s (0x%02x)",optp->name,
1927 val_to_str(pppmux_def_prot_id, ppp_vals, "Unknown"), pppmux_def_prot_id);
1932 dissect_ccp_stac_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1933 int offset, guint length, packet_info *pinfo _U_,
1937 proto_tree *field_tree;
1941 proto_tree_add_text(tree, tvb, offset, length,
1942 "%s (Ascend Proprietary version)", optp->name);
1943 /* We don't know how to decode the following 4 octets, since
1944 there's no public document that describe their usage. */
1946 tf = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
1947 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
1949 proto_tree_add_text(field_tree, tvb, offset + 2, 2,
1950 "History Count: %u", tvb_get_ntohs(tvb, offset + 2));
1951 check_mode = tvb_get_guint8(tvb, offset + 4);
1952 proto_tree_add_text(field_tree, tvb, offset + 4, 1,
1953 "Check Mode: %s (0x%02X)",
1954 val_to_str(check_mode, stac_checkmode_vals, "Unknown"),
1960 dissect_ccp_mppc_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1961 int offset, guint length, packet_info *pinfo _U_,
1965 proto_tree *flags_tree;
1966 guint32 supported_bits;
1968 supported_bits = tvb_get_ntohl(tvb, offset + 2);
1969 tf = proto_tree_add_text(tree, tvb, offset, length,
1970 "%s: Supported Bits: 0x%08X", optp->name, supported_bits);
1971 flags_tree = proto_item_add_subtree(tf, *optp->subtree_index);
1972 proto_tree_add_text(flags_tree, tvb, offset + 2, 4, "%s",
1973 decode_boolean_bitfield(supported_bits, MPPC_SUPPORTED_BITS_C, 8*4,
1974 "Desire to negotiate MPPC", "NO Desire to negotiate MPPC"));
1975 proto_tree_add_text(flags_tree, tvb, offset + 2, 4, "%s",
1976 decode_boolean_bitfield(supported_bits, MPPE_SUPPORTED_BITS_D, 8*4,
1977 "Obsolete (should NOT be 1)", "Obsolete (should ALWAYS be 0)"));
1978 proto_tree_add_text(flags_tree, tvb, offset + 2, 4, "%s",
1979 decode_boolean_bitfield(supported_bits, MPPE_SUPPORTED_BITS_L, 8*4,
1980 "40-bit encryption ON", "40-bit encryption OFF"));
1981 proto_tree_add_text(flags_tree, tvb, offset + 2, 4, "%s",
1982 decode_boolean_bitfield(supported_bits, MPPE_SUPPORTED_BITS_S, 8*4,
1983 "128-bit encryption ON", "128-bit encryption OFF"));
1984 proto_tree_add_text(flags_tree, tvb, offset + 2, 4, "%s",
1985 decode_boolean_bitfield(supported_bits, MPPE_SUPPORTED_BITS_M, 8*4,
1986 "56-bit encryption ON", "56-bit encryption OFF"));
1987 proto_tree_add_text(flags_tree, tvb, offset + 2, 4, "%s",
1988 decode_boolean_bitfield(supported_bits, MPPE_SUPPORTED_BITS_H, 8*4,
1989 "Stateless mode ON", "Stateless mode OFF"));
1993 dissect_ccp_bsdcomp_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
1994 int offset, guint length, packet_info *pinfo _U_,
1998 proto_tree *field_tree;
2000 tf = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
2001 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
2003 proto_tree_add_text(field_tree, tvb, offset + 2, 1,
2004 "Version: %u", tvb_get_guint8(tvb, offset + 2) >> 5);
2005 proto_tree_add_text(field_tree, tvb, offset + 2, 1,
2007 tvb_get_guint8(tvb, offset + 2) & 0x1f);
2011 dissect_ccp_lzsdcp_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
2012 int offset, guint length, packet_info *pinfo _U_,
2016 proto_tree *field_tree;
2018 guint8 process_mode;
2020 tf = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
2021 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
2023 proto_tree_add_text(field_tree, tvb, offset + 2, 2,
2024 "History Count: %u", tvb_get_ntohs(tvb, offset + 2));
2025 check_mode = tvb_get_guint8(tvb, offset + 4);
2026 proto_tree_add_text(field_tree, tvb, offset + 4, 1,
2027 "Check Mode: %s (0x%02X)",
2028 val_to_str(check_mode, lzsdcp_checkmode_vals, "Unknown"),
2030 process_mode = tvb_get_guint8(tvb, offset + 5);
2031 proto_tree_add_text(field_tree, tvb, offset + 5, 1,
2032 "Process Mode: %s (0x%02X)",
2033 val_to_str(process_mode, lzsdcp_processmode_vals, "Unkown"),
2038 dissect_ccp_mvrca_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
2039 int offset, guint length, packet_info *pinfo _U_,
2043 proto_tree *field_tree;
2045 tf = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
2046 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
2048 proto_tree_add_text(field_tree, tvb, offset + 2, 1,
2049 "Features: %u", tvb_get_guint8(tvb, offset + 2) >> 5);
2050 proto_tree_add_text(field_tree, tvb, offset + 2, 1,
2051 "Packet by Packet flag: %s",
2052 tvb_get_guint8(tvb, offset + 2) & 0x20 ? "true" : "false");
2053 proto_tree_add_text(field_tree, tvb, offset + 2, 1,
2054 "History: %u", tvb_get_guint8(tvb, offset + 2) & 0x20);
2055 proto_tree_add_text(field_tree, tvb, offset + 3, 1,
2056 "Number of contexts: %u", tvb_get_guint8(tvb, offset + 3));
2060 dissect_ccp_deflate_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
2061 int offset, guint length, packet_info *pinfo _U_,
2065 proto_tree *field_tree;
2068 tf = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
2069 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
2071 proto_tree_add_text(field_tree, tvb, offset + 2, 1,
2072 "Window: %u", hi_nibble(tvb_get_guint8(tvb, offset + 2)));
2073 method = lo_nibble(tvb_get_guint8(tvb, offset + 2));
2074 proto_tree_add_text(field_tree, tvb, offset + 2, 1,
2075 "Method: %s (0x%02x)",
2076 method == 0x08 ? "zlib compression" : "other", method);
2077 proto_tree_add_text(field_tree, tvb, offset + 3, 1,
2078 "Sequence number check method: %u",
2079 tvb_get_guint8(tvb, offset + 2) & 0x03);
2083 dissect_cbcp_no_callback_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
2084 int offset, guint length, packet_info *pinfo _U_,
2087 proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
2091 dissect_cbcp_callback_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
2092 int offset, guint length, packet_info *pinfo _U_,
2096 proto_tree *field_tree;
2098 proto_tree *addr_tree;
2102 tf = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
2103 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
2105 proto_tree_add_text(field_tree, tvb, offset + 2, 1,
2106 "Callback delay: %u", tvb_get_guint8(tvb, offset + 2));
2110 while (length > 0) {
2111 ta = proto_tree_add_text(field_tree, tvb, offset, length,
2112 "Callback Address");
2113 addr_type = tvb_get_guint8(tvb, offset);
2114 addr_tree = proto_item_add_subtree(tf, ett_cbcp_callback_opt_addr);
2115 proto_tree_add_text(addr_tree, tvb, offset, 1,
2116 "Address Type: %s (%u)",
2117 ((addr_type == 1) ? "PSTN/ISDN" : "Other"), addr_type);
2120 addr_len = tvb_strsize(tvb, offset);
2121 proto_tree_add_text(addr_tree, tvb, offset, addr_len,
2123 tvb_format_text(tvb, offset, addr_len - 1));
2124 offset += (addr_len + 1);
2125 length -= (addr_len + 1);
2130 dissect_bacp_favored_peer_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
2131 int offset, guint length, packet_info *pinfo _U_,
2135 proto_tree *field_tree;
2137 tf = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
2138 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
2140 proto_tree_add_text(field_tree, tvb, offset + 2, 4,
2141 "Magic number: 0x%08x", tvb_get_ntohl(tvb, offset + 2));
2145 dissect_bap_link_type_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
2146 int offset, guint length, packet_info *pinfo _U_,
2150 proto_tree *field_tree;
2153 tf = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
2154 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
2156 proto_tree_add_text(field_tree, tvb, offset + 2, 2,
2157 "Link Speed: %u kbps", tvb_get_ntohs(tvb, offset + 2));
2158 link_type = tvb_get_guint8(tvb, offset + 4);
2159 proto_tree_add_text(field_tree, tvb, offset + 4, 1,
2160 "Link Type: %s (%u)", val_to_str(link_type, bap_link_type_vals,
2161 "Unknown"), link_type);
2165 dissect_bap_phone_delta_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
2166 int offset, guint length, packet_info *pinfo _U_,
2170 proto_tree *field_tree;
2172 proto_tree *suboption_tree;
2176 tf = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
2177 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
2182 while (length > 0) {
2183 subopt_type = tvb_get_guint8(tvb, offset);
2184 subopt_len = tvb_get_guint8(tvb, offset + 1);
2185 ti = proto_tree_add_text(field_tree, tvb, offset, subopt_len,
2186 "Sub-Option (%d byte%s)",
2187 subopt_len, plurality(subopt_len, "", "s"));
2188 suboption_tree = proto_item_add_subtree(ti, ett_bap_phone_delta_subopt);
2190 proto_tree_add_text(suboption_tree, tvb, offset, 1,
2191 "Sub-Option Type: %s (%u)",
2192 val_to_str(subopt_type, bap_phone_delta_subopt_vals, "Unknown"),
2195 proto_tree_add_text(suboption_tree, tvb, offset + 1, 1,
2196 "Sub-Option Length: %u", subopt_len);
2198 switch (subopt_type) {
2199 case BAP_PHONE_DELTA_SUBOPT_UNIQ_DIGIT:
2200 proto_tree_add_text(suboption_tree, tvb, offset + 2, 1, "Uniq Digit: %u",
2201 tvb_get_guint8(tvb, offset + 2));
2203 case BAP_PHONE_DELTA_SUBOPT_SUBSC_NUM:
2204 if (subopt_len > 2) {
2205 proto_tree_add_text(suboption_tree, tvb, offset + 2, subopt_len - 2,
2206 "Subscriber Number: %s",
2207 tvb_format_text(tvb, offset + 2, subopt_len - 2));
2209 proto_tree_add_text(suboption_tree, tvb, offset + 1, 1,
2210 "Invalid suboption length: %u", subopt_len);
2213 case BAP_PHONE_DELTA_SUBOPT_PHONENUM_SUBADDR:
2214 if (subopt_len > 2) {
2215 proto_tree_add_text(suboption_tree, tvb, offset + 2, subopt_len - 2,
2216 "Phone Number Sub Address: %s",
2217 tvb_format_text(tvb, offset + 2, subopt_len - 2));
2221 proto_tree_add_text(suboption_tree, tvb, offset + 2, subopt_len - 2,
2225 offset += subopt_len;
2226 length -= subopt_len;
2231 dissect_bap_reason_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
2232 int offset, guint length, packet_info *pinfo _U_,
2236 proto_tree_add_text(tree, tvb, offset, length, "%s: %s",
2238 tvb_format_text(tvb, offset + 2, length - 2));
2243 dissect_bap_link_disc_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
2244 int offset, guint length, packet_info *pinfo _U_,
2247 proto_tree_add_text(tree, tvb, offset, length, "%s: 0x%04x",
2248 optp->name, tvb_get_ntohs(tvb, offset + 2));
2252 dissect_bap_call_status_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
2253 int offset, guint length, packet_info *pinfo _U_,
2257 proto_tree *field_tree;
2258 guint8 status, action;
2260 tf = proto_tree_add_text(tree, tvb, offset, length, "%s", optp->name);
2261 field_tree = proto_item_add_subtree(tf, *optp->subtree_index);
2263 status = tvb_get_guint8(tvb, offset + 2);
2264 proto_tree_add_text(field_tree, tvb, offset + 2, 1,
2265 "Status: %s (0x%02x)",
2266 val_to_str(status, q931_cause_code_vals, "Unknown"), status);
2268 action = tvb_get_guint8(tvb, offset + 3);
2269 proto_tree_add_text(field_tree, tvb, offset + 3, 1,
2270 "Action: %s (0x%02x)",
2271 val_to_str(action, bap_call_status_opt_action_vals, "Unknown"), action);
2275 dissect_cp( tvbuff_t *tvb, int proto_id, int proto_subtree_index,
2276 const value_string *proto_vals, int options_subtree_index,
2277 const ip_tcp_opt *opts, int nopts, packet_info *pinfo,
2281 proto_tree *fh_tree = NULL;
2283 proto_tree *field_tree;
2290 code = tvb_get_guint8(tvb, 0);
2291 id = tvb_get_guint8(tvb, 1);
2292 length = tvb_get_ntohs(tvb, 2);
2294 if(check_col(pinfo->cinfo, COL_PROTOCOL))
2295 col_set_str(pinfo->cinfo, COL_PROTOCOL,
2296 proto_get_protocol_short_name(proto_id));
2298 if(check_col(pinfo->cinfo, COL_INFO))
2299 col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s",
2300 proto_get_protocol_short_name(proto_id),
2301 val_to_str(code, proto_vals, "Unknown"));
2304 ti = proto_tree_add_item(tree, proto_id, tvb, 0, length, FALSE);
2305 fh_tree = proto_item_add_subtree(ti, proto_subtree_index);
2306 proto_tree_add_text(fh_tree, tvb, 0, 1, "Code: %s (0x%02x)",
2307 val_to_str(code, proto_vals, "Unknown"), code);
2308 proto_tree_add_text(fh_tree, tvb, 1, 1, "Identifier: 0x%02x",
2310 proto_tree_add_text(fh_tree, tvb, 2, 2, "Length: %u",
2323 tf = proto_tree_add_text(fh_tree, tvb, offset, length,
2324 "Options: (%d byte%s)", length, plurality(length, "", "s"));
2325 field_tree = proto_item_add_subtree(tf, options_subtree_index);
2326 dissect_ip_tcp_options(tvb, offset, length, opts, nopts, -1,
2337 proto_tree_add_text(fh_tree, tvb, offset, 4, "Magic number: 0x%08x",
2338 tvb_get_ntohl(tvb, offset));
2342 proto_tree_add_text(fh_tree, tvb, offset, length, "Message (%d byte%s)",
2343 length, plurality(length, "", "s"));
2349 proto_tree_add_text(fh_tree, tvb, offset, 4, "Magic number: 0x%08x",
2350 tvb_get_ntohl(tvb, offset));
2353 proto_tree_add_text(fh_tree, tvb, offset, 4, "Seconds remaining: %u",
2354 tvb_get_ntohl(tvb, offset));
2358 proto_tree_add_text(fh_tree, tvb, offset, length, "Message (%d byte%s)",
2359 length, plurality(length, "", "s"));
2365 gboolean save_in_error_pkt;
2368 protocol = tvb_get_ntohs(tvb, offset);
2369 proto_tree_add_text(fh_tree, tvb, offset, 2,
2370 "Rejected protocol: %s (0x%04x)",
2371 val_to_str(protocol, ppp_vals, "Unknown"),
2376 proto_tree_add_text(fh_tree, tvb, offset, length,
2377 "Rejected packet (%d byte%s)",
2378 length, plurality(length, "", "s"));
2380 /* Save the current value of the "we're inside an error packet"
2381 flag, and set that flag; subdissectors may treat packets
2382 that are the payload of error packets differently from
2384 save_in_error_pkt = pinfo->in_error_pkt;
2385 pinfo->in_error_pkt = TRUE;
2387 /* Decode the rejected packet. */
2388 next_tvb = tvb_new_subset(tvb, offset, length, length);
2389 if (!dissector_try_port(ppp_subdissector_table, protocol,
2390 next_tvb, pinfo, fh_tree)) {
2391 call_dissector(data_handle, next_tvb, pinfo, fh_tree);
2394 /* Restore the "we're inside an error packet" flag. */
2395 pinfo->in_error_pkt = save_in_error_pkt;
2401 /* decode the rejected LCP packet here. */
2403 proto_tree_add_text(fh_tree, tvb, offset, length, "Rejected packet (%d byte%s)",
2404 length, plurality(length, "", "s"));
2410 proto_tree_add_text(fh_tree, tvb, offset, length, "Data (%d byte%s)",
2411 length, plurality(length, "", "s"));
2416 proto_tree_add_text(fh_tree, tvb, offset, length, "Stuff (%d byte%s)",
2417 length, plurality(length, "", "s"));
2422 /* Protocol field compression */
2423 #define PFC_BIT 0x01
2426 dissect_ppp_common( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
2427 proto_tree *fh_tree, proto_item *ti )
2433 ppp_prot = tvb_get_guint8(tvb, 0);
2434 if (ppp_prot & PFC_BIT) {
2435 /* Compressed protocol field - just the byte we fetched. */
2438 /* Uncompressed protocol field - fetch all of it. */
2439 ppp_prot = tvb_get_ntohs(tvb, 0);
2443 /* If "ti" is not null, it refers to the top-level "proto_ppp" item
2444 for PPP, and was given a length equal to the length of any
2445 stuff in the header preceding the protocol type, e.g. an HDLC
2446 header; add the length of the protocol type field to it. */
2448 proto_item_set_len(ti, proto_item_get_len(ti) + proto_len);
2451 proto_tree_add_uint(fh_tree, hf_ppp_protocol, tvb, 0, proto_len, ppp_prot);
2453 next_tvb = tvb_new_subset(tvb, proto_len, -1, -1);
2455 /* do lookup with the subdissector table */
2456 if (!dissector_try_port(ppp_subdissector_table, ppp_prot, next_tvb, pinfo, tree)) {
2457 if (check_col(pinfo->cinfo, COL_PROTOCOL))
2458 col_add_fstr(pinfo->cinfo, COL_PROTOCOL, "0x%04x", ppp_prot);
2459 if (check_col(pinfo->cinfo, COL_INFO))
2460 col_add_fstr(pinfo->cinfo, COL_INFO, "PPP %s (0x%04x)",
2461 val_to_str(ppp_prot, ppp_vals, "Unknown"), ppp_prot);
2462 call_dissector(data_handle,next_tvb, pinfo, tree);
2467 dissect_lcp_options(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2469 dissect_ip_tcp_options(tvb, 0, tvb_reported_length(tvb), lcp_opts, N_LCP_OPTS,
2477 dissect_lcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2479 dissect_cp(tvb, proto_lcp, ett_lcp, lcp_vals, ett_lcp_options,
2480 lcp_opts, N_LCP_OPTS, pinfo, tree);
2487 dissect_ipcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2489 dissect_cp(tvb, proto_ipcp, ett_ipcp, cp_vals, ett_ipcp_options,
2490 ipcp_opts, N_IPCP_OPTS, pinfo, tree);
2497 dissect_ccp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2499 dissect_cp(tvb, proto_ccp, ett_ccp, ccp_vals, ett_ccp_options,
2500 ccp_opts, N_CCP_OPTS, pinfo, tree);
2504 * Callback Control Protocol - see
2506 * http://www.linet.gr.jp/~manabe/PPxP/doc/Standards/draft-gidwani-ppp-callback-cp-00.txt
2509 dissect_cbcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2511 dissect_cp(tvb, proto_cbcp, ett_cbcp, cbcp_vals, ett_cbcp_options,
2512 cbcp_opts, N_CBCP_OPTS, pinfo, tree);
2516 * RFC 2125 (BACP and BAP).
2519 dissect_bacp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2521 dissect_cp(tvb, proto_bacp, ett_bacp, cp_vals, ett_bacp_options,
2522 bacp_opts, N_BACP_OPTS, pinfo, tree);
2526 dissect_bap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2529 proto_tree *fh_tree = NULL;
2531 proto_tree *field_tree;
2538 type = tvb_get_guint8(tvb, 0);
2539 id = tvb_get_guint8(tvb, 1);
2540 length = tvb_get_ntohs(tvb, 2);
2542 if(check_col(pinfo->cinfo, COL_PROTOCOL))
2543 col_set_str(pinfo->cinfo, COL_PROTOCOL,
2544 proto_get_protocol_short_name(proto_bap));
2546 if(check_col(pinfo->cinfo, COL_INFO))
2547 col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s",
2548 proto_get_protocol_short_name(proto_bap),
2549 val_to_str(type, bap_vals, "Unknown"));
2552 ti = proto_tree_add_item(tree, proto_bap, tvb, 0, length, FALSE);
2553 fh_tree = proto_item_add_subtree(ti, ett_bap_options);
2554 proto_tree_add_text(fh_tree, tvb, 0, 1, "Type: %s (0x%02x)",
2555 val_to_str(type, bap_vals, "Unknown"), type);
2556 proto_tree_add_text(fh_tree, tvb, 1, 1, "Identifier: 0x%02x",
2558 proto_tree_add_text(fh_tree, tvb, 2, 2, "Length: %u",
2564 if (type == BAP_CRES || type == BAP_CBRES ||
2565 type == BAP_LDQRES || type == BAP_CSRES) {
2566 resp_code = tvb_get_guint8(tvb, offset);
2567 proto_tree_add_text(fh_tree, tvb, offset, 1, "Response Code: %s (0x%02x)",
2568 val_to_str(resp_code, bap_resp_code_vals, "Unknown"), resp_code);
2575 tf = proto_tree_add_text(fh_tree, tvb, offset, length,
2576 "Data (%d byte%s)", length, plurality(length, "", "s"));
2577 field_tree = proto_item_add_subtree(tf, ett_bap_options);
2578 dissect_ip_tcp_options(tvb, offset, length, bap_opts, N_BAP_OPTS, -1,
2585 dissect_comp_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2588 proto_tree *comp_data_tree;
2590 if (check_col(pinfo->cinfo, COL_PROTOCOL))
2591 col_set_str(pinfo->cinfo, COL_PROTOCOL,
2592 proto_get_protocol_short_name(proto_comp_data));
2594 if(check_col(pinfo->cinfo, COL_INFO))
2595 col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s",
2596 proto_get_protocol_short_name(proto_comp_data),
2597 val_to_str(PPP_COMP, ppp_vals, "Unknown"));
2600 ti = proto_tree_add_item(tree, proto_comp_data, tvb, 0, -1, FALSE);
2601 comp_data_tree = proto_item_add_subtree(ti, ett_comp_data);
2606 * RFC 3153 (both PPPMuxCP and PPPMux).
2609 dissect_pppmuxcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2611 dissect_cp(tvb,proto_pppmuxcp,ett_pppmuxcp,pppmuxcp_vals,
2612 ett_pppmuxcp_options,pppmuxcp_opts,N_PPPMUXCP_OPTS,pinfo,tree);
2615 #define PPPMUX_FLAGS_MASK 0xc0
2616 #define PPPMUX_PFF_BIT_SET 0x80
2617 #define PPPMUX_LXT_BIT_SET 0x40
2620 dissect_pppmux(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2622 proto_tree *mux_tree, *hdr_tree, *sub_tree, *flag_tree;
2623 proto_tree *info_tree;
2624 proto_item *ti = NULL,*sub_ti = NULL;
2629 int offset = 0, length_remaining;
2630 int length_field = 0, pid_field = 0,hdr_length = 0;
2632 if (check_col(pinfo->cinfo, COL_PROTOCOL))
2633 col_set_str(pinfo->cinfo,COL_PROTOCOL, "PPP PPPMux");
2635 if (check_col(pinfo->cinfo, COL_INFO))
2636 col_set_str(pinfo->cinfo, COL_INFO, "PPP Multiplexing");
2638 length_remaining = tvb_reported_length(tvb);
2641 ti = proto_tree_add_item(tree, proto_pppmux, tvb, 0, -1, FALSE);
2642 mux_tree = proto_item_add_subtree(ti,ett_pppmux);
2644 while (length_remaining > 0) {
2646 flags = tvb_get_guint8(tvb,offset) & PPPMUX_FLAGS_MASK;
2648 if (flags && PPPMUX_LXT_BIT_SET ) {
2649 length = tvb_get_ntohs(tvb,offset) & 0x3fff;
2652 length = tvb_get_guint8(tvb,offset) & 0x3f;
2656 if (flags && PPPMUX_PFF_BIT_SET) {
2657 byte = tvb_get_guint8(tvb,offset + length_field);
2658 if (byte && PFC_BIT) { /* Compressed PID field*/
2661 } else { /*PID field is 2 bytes*/
2662 pid = tvb_get_ntohs(tvb,offset + length_field);
2666 if (!pid){ /*No Last PID, hence use the default */
2667 if (pppmux_def_prot_id)
2668 pid = pppmux_def_prot_id;
2672 hdr_length = length_field + pid_field;
2674 ti = proto_tree_add_text(mux_tree, tvb, offset, length + length_field,
2675 "PPPMux Sub-frame");
2676 sub_tree = proto_item_add_subtree(ti,ett_pppmux_subframe);
2677 sub_ti = proto_tree_add_text(sub_tree, tvb, offset,
2678 hdr_length,"Header field");
2680 hdr_tree = proto_item_add_subtree(sub_ti,ett_pppmux_subframe_hdr);
2681 ti = proto_tree_add_text(hdr_tree, tvb, offset, length_field, "PFF/LXT: 0x%02X",
2684 flag_tree = proto_item_add_subtree(ti,ett_pppmux_subframe_flags);
2685 proto_tree_add_text(flag_tree,tvb,offset,length_field,"%s",
2686 decode_boolean_bitfield(flags,0x80,8,"PID Present","PID not present"));
2687 proto_tree_add_text(flag_tree,tvb,offset,length_field,"%s",
2688 decode_boolean_bitfield(flags,0x40,8,"2 bytes ength field ","1 byte length field"));
2690 ti = proto_tree_add_text(hdr_tree,tvb,offset,length_field,"Sub-frame Length = %u",length);
2692 if (flags && PPPMUX_PFF_BIT_SET)
2693 proto_tree_add_text(hdr_tree,tvb,offset + length_field,pid_field,"%s: %s(0x%02x)",
2694 "Protocol ID",val_to_str(pid,ppp_vals,"Unknown"), pid);
2696 offset += hdr_length;
2697 length_remaining -= hdr_length;
2698 length -= pid_field;
2700 sub_ti = proto_tree_add_text(sub_tree,tvb,offset,length,"Information Field");
2701 info_tree = proto_item_add_subtree(sub_ti,ett_pppmux_subframe_info);
2703 next_tvb = tvb_new_subset(tvb,offset,length,-1);
2705 if (!dissector_try_port(ppp_subdissector_table, pid, next_tvb, pinfo, info_tree)) {
2706 call_dissector(data_handle, next_tvb, pinfo, info_tree);
2709 length_remaining -= length;
2710 } /* While length_remaining */
2719 dissect_mplscp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2721 dissect_cp(tvb, proto_mplscp, ett_mplscp, cp_vals, ett_mplscp_options,
2722 NULL, 0, pinfo, tree);
2726 * Cisco Discovery Protocol Control Protocol.
2727 * XXX - where is this documented?
2730 dissect_cdpcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2732 dissect_cp(tvb, proto_cdpcp, ett_cdpcp, cp_vals, ett_cdpcp_options,
2733 NULL, 0, pinfo, tree);
2736 #define MP_FRAG_MASK 0xC0
2737 #define MP_FRAG(bits) ((bits) & MP_FRAG_MASK)
2738 #define MP_FRAG_FIRST 0x80
2739 #define MP_FRAG_LAST 0x40
2740 #define MP_FRAG_RESERVED 0x3f
2742 static const true_false_string frag_truth = {
2747 /* According to RFC 1717, the length the MP header isn't indicated anywhere
2748 in the header itself. It starts out at four bytes and can be
2749 negotiated down to two using LCP. We currently assume that all
2750 headers are four bytes. - gcc
2753 dissect_mp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
2755 proto_tree *mp_tree, *hdr_tree;
2756 proto_item *ti = NULL;
2761 if (check_col(pinfo->cinfo, COL_PROTOCOL))
2762 col_set_str(pinfo->cinfo, COL_PROTOCOL, "PPP MP");
2764 if (check_col(pinfo->cinfo, COL_INFO))
2765 col_set_str(pinfo->cinfo, COL_INFO, "PPP Multilink");
2767 flags = tvb_get_guint8(tvb, 0);
2777 case MP_FRAG_FIRST|MP_FRAG_LAST:
2778 flag_str = "First, Last";
2781 flag_str = "Unknown";
2784 ti = proto_tree_add_item(tree, proto_mp, tvb, 0, 4, FALSE);
2785 mp_tree = proto_item_add_subtree(ti, ett_mp);
2786 ti = proto_tree_add_text(mp_tree, tvb, 0, 1, "Fragment: 0x%2X (%s)",
2788 hdr_tree = proto_item_add_subtree(ti, ett_mp_flags);
2789 proto_tree_add_boolean(hdr_tree, hf_mp_frag_first, tvb, 0, 1, flags);
2790 proto_tree_add_boolean(hdr_tree, hf_mp_frag_last, tvb, 0, 1, flags),
2791 proto_tree_add_text(hdr_tree, tvb, 0, 1, "%s",
2792 decode_boolean_bitfield(flags, MP_FRAG_RESERVED, sizeof(flags) * 8,
2793 "reserved", "reserved"));
2794 proto_tree_add_item(mp_tree, hf_mp_sequence_num, tvb, 1, 3, FALSE);
2797 if (tvb_reported_length_remaining(tvb, 4) > 0) {
2798 next_tvb = tvb_new_subset(tvb, 4, -1, -1);
2799 dissect_ppp(next_tvb, pinfo, tree);
2804 * Handles PPP without HDLC framing, just a protocol field (RFC 1661).
2807 dissect_ppp( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) {
2808 proto_item *ti = NULL;
2809 proto_tree *fh_tree = NULL;
2812 ti = proto_tree_add_item(tree, proto_ppp, tvb, 0, -1, FALSE);
2813 fh_tree = proto_item_add_subtree(ti, ett_ppp);
2816 dissect_ppp_common(tvb, pinfo, tree, fh_tree, ti);
2820 * Handles link-layer encapsulations where the frame might be
2821 * a PPP in HDLC-like Framing frame (RFC 1662) or a Cisco HDLC frame.
2824 dissect_ppp_hdlc( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
2826 proto_item *ti = NULL;
2827 proto_tree *fh_tree = NULL;
2830 gint len, reported_len;
2836 byte0 = tvb_get_guint8(tvb, 0);
2837 if (byte0 == CHDLC_ADDR_UNICAST || byte0 == CHDLC_ADDR_MULTICAST) {
2838 /* Cisco HDLC encapsulation */
2839 call_dissector(chdlc_handle, tvb, pinfo, tree);
2844 * XXX - should we have a routine that always dissects PPP, for use
2845 * when we know the packets are PPP, not CHDLC?
2848 /* PPP HDLC encapsulation */
2852 /* address and control are compressed (NULL) */
2856 /* load the top pane info. This should be overwritten by
2857 the next protocol in the stack */
2859 if(check_col(pinfo->cinfo, COL_PROTOCOL))
2860 col_set_str(pinfo->cinfo, COL_PROTOCOL, "PPP" );
2862 switch (pinfo->p2p_dir) {
2865 if(check_col(pinfo->cinfo, COL_RES_DL_SRC))
2866 col_set_str(pinfo->cinfo, COL_RES_DL_SRC, "DTE");
2867 if(check_col(pinfo->cinfo, COL_RES_DL_DST))
2868 col_set_str(pinfo->cinfo, COL_RES_DL_DST, "DCE");
2872 if(check_col(pinfo->cinfo, COL_RES_DL_SRC))
2873 col_set_str(pinfo->cinfo, COL_RES_DL_SRC, "DCE");
2874 if(check_col(pinfo->cinfo, COL_RES_DL_DST))
2875 col_set_str(pinfo->cinfo, COL_RES_DL_DST, "DTE");
2879 if(check_col(pinfo->cinfo, COL_RES_DL_SRC))
2880 col_set_str(pinfo->cinfo, COL_RES_DL_SRC, "N/A");
2881 if(check_col(pinfo->cinfo, COL_RES_DL_DST))
2882 col_set_str(pinfo->cinfo, COL_RES_DL_DST, "N/A");
2887 ti = proto_tree_add_item(tree, proto_ppp, tvb, 0, proto_offset, FALSE);
2888 fh_tree = proto_item_add_subtree(ti, ett_ppp);
2889 if (byte0 == 0xff) {
2890 proto_tree_add_item(fh_tree, hf_ppp_address, tvb, 0, 1, FALSE);
2891 proto_tree_add_item(fh_tree, hf_ppp_control, tvb, 1, 1, FALSE);
2896 * Remove the FCS, if any, from the packet data.
2898 switch (ppp_fcs_decode) {
2901 next_tvb = tvb_new_subset(tvb, proto_offset, -1, -1);
2906 * Do we have the entire packet, and does it include a 2-byte FCS?
2908 len = tvb_length_remaining(tvb, proto_offset);
2909 reported_len = tvb_reported_length_remaining(tvb, proto_offset);
2910 if (reported_len < 2 || len < 0) {
2912 * The packet is claimed not to even have enough data for a 2-byte FCS,
2913 * or we're already past the end of the captured data.
2914 * Don't slice anything off.
2916 next_tvb = tvb_new_subset(tvb, proto_offset, -1, -1);
2917 } else if (len < reported_len) {
2919 * The packet is claimed to have enough data for a 2-byte FCS, but
2920 * we didn't capture all of the packet.
2921 * Slice off the 2-byte FCS from the reported length, and trim the
2922 * captured length so it's no more than the reported length; that
2923 * will slice off what of the FCS, if any, is in the captured
2927 if (len > reported_len)
2929 next_tvb = tvb_new_subset(tvb, proto_offset, len, reported_len);
2932 * We have the entire packet, and it includes a 2-byte FCS.
2937 next_tvb = tvb_new_subset(tvb, proto_offset, len, reported_len);
2940 * Compute the FCS and put it into the tree.
2942 rx_fcs_offset = proto_offset + len;
2943 rx_fcs_exp = fcs16(0xFFFF, tvb);
2944 rx_fcs_got = tvb_get_letohs(tvb, rx_fcs_offset);
2945 if (rx_fcs_got != rx_fcs_exp) {
2946 proto_tree_add_text(fh_tree, tvb, rx_fcs_offset, 2,
2947 "FCS 16: 0x%04x (incorrect, should be 0x%04x)",
2948 rx_fcs_got, rx_fcs_exp);
2950 proto_tree_add_text(fh_tree, tvb, rx_fcs_offset, 2,
2951 "FCS 16: 0x%04x (correct)",
2959 * Do we have the entire packet, and does it include a 4-byte FCS?
2961 len = tvb_length_remaining(tvb, proto_offset);
2962 reported_len = tvb_reported_length_remaining(tvb, proto_offset);
2963 if (reported_len < 4) {
2965 * The packet is claimed not to even have enough data for a 4-byte FCS.
2966 * Just pass on the tvbuff as is.
2968 next_tvb = tvb_new_subset(tvb, proto_offset, -1, -1);
2969 } else if (len < reported_len) {
2971 * The packet is claimed to have enough data for a 4-byte FCS, but
2972 * we didn't capture all of the packet.
2973 * Slice off the 4-byte FCS from the reported length, and trim the
2974 * captured length so it's no more than the reported length; that
2975 * will slice off what of the FCS, if any, is in the captured
2979 if (len > reported_len)
2981 next_tvb = tvb_new_subset(tvb, proto_offset, len, reported_len);
2984 * We have the entire packet, and it includes a 4-byte FCS.
2989 next_tvb = tvb_new_subset(tvb, proto_offset, len, reported_len);
2992 * Compute the FCS and put it into the tree.
2994 rx_fcs_offset = proto_offset + len;
2995 rx_fcs_exp = fcs32(0xFFFFFFFF, tvb);
2996 rx_fcs_got = tvb_get_letohl(tvb, rx_fcs_offset);
2997 if (rx_fcs_got != rx_fcs_exp) {
2998 proto_tree_add_text(fh_tree, tvb, rx_fcs_offset, 4,
2999 "FCS 32: 0x%08x (incorrect, should be 0x%08x)",
3000 rx_fcs_got, rx_fcs_exp);
3002 proto_tree_add_text(fh_tree, tvb, rx_fcs_offset, 4,
3003 "FCS 32: 0x%08x (correct)",
3010 g_assert_not_reached();
3014 dissect_ppp_common(next_tvb, pinfo, tree, fh_tree, ti);
3018 * Handles PAP just as a protocol field
3021 dissect_pap( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) {
3023 proto_tree *fh_tree = NULL;
3025 proto_tree *field_tree;
3027 proto_tree *message_tree;
3029 proto_tree *peer_id_tree;
3031 proto_tree *passwd_tree;
3034 guint8 id, peer_id_length, password_length, msg_length;
3037 code = tvb_get_guint8(tvb, 0);
3038 id = tvb_get_guint8(tvb, 1);
3039 length = tvb_get_ntohs(tvb, 2);
3041 if(check_col(pinfo->cinfo, COL_PROTOCOL))
3042 col_set_str(pinfo->cinfo, COL_PROTOCOL,
3043 proto_get_protocol_short_name(proto_pap));
3045 if(check_col(pinfo->cinfo, COL_INFO))
3046 col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s",
3047 proto_get_protocol_short_name(proto_pap),
3048 val_to_str(code, pap_vals, "Unknown"));
3051 ti = proto_tree_add_item(tree, proto_pap, tvb, 0, length, FALSE);
3052 fh_tree = proto_item_add_subtree(ti, ett_pap);
3053 proto_tree_add_text(fh_tree, tvb, 0, 1, "Code: %s (0x%02x)",
3054 val_to_str(code, pap_vals, "Unknown"), code);
3055 proto_tree_add_text(fh_tree, tvb, 1, 1, "Identifier: 0x%02x",
3057 proto_tree_add_text(fh_tree, tvb, 2, 2, "Length: %u",
3067 tf = proto_tree_add_text(fh_tree, tvb, offset, length,
3068 "Data (%d byte%s)", length, plurality(length, "", "s"));
3069 field_tree = proto_item_add_subtree(tf, ett_pap_data);
3070 peer_id_length = tvb_get_guint8(tvb, offset);
3071 tp = proto_tree_add_text(field_tree, tvb, offset, 1,
3072 "Peer ID length: %d byte%s", peer_id_length, plurality(peer_id_length, "", "s"));
3074 peer_id_tree = proto_item_add_subtree(tp, ett_pap_peer_id);
3075 proto_tree_add_text(peer_id_tree, tvb, ++offset, ppp_min(peer_id_length, length),
3076 "Peer-ID (%d byte%s)", peer_id_length, plurality(peer_id_length, "", "s"));
3077 offset+=peer_id_length;
3078 length-=peer_id_length;
3080 password_length = tvb_get_guint8(tvb, offset);
3082 tpw = proto_tree_add_text(field_tree, tvb, offset, 1,
3083 "Password length: %d byte%s", password_length, plurality(password_length, "", "s"));
3084 passwd_tree = proto_item_add_subtree(tpw, ett_pap_password);
3085 proto_tree_add_text(passwd_tree, tvb, ++offset, ppp_min(password_length, length),
3086 "Password (%d byte%s)", password_length, plurality(password_length, "", "s"));
3098 tf = proto_tree_add_text(fh_tree, tvb, offset, length,
3099 "Data (%d byte%s)", length, plurality(length, "", "s"));
3100 field_tree = proto_item_add_subtree(tf, ett_pap_data);
3101 msg_length = tvb_get_guint8(tvb, offset);
3102 tm = proto_tree_add_text(field_tree, tvb, offset, 1,
3103 "Message length: %d byte%s", msg_length, plurality(msg_length, "", "s"));
3105 message_tree = proto_item_add_subtree(tm, ett_pap_message);
3106 proto_tree_add_text(message_tree, tvb, ++offset, ppp_min(msg_length, length),
3107 "Message (%d byte%s)", msg_length, plurality(msg_length, "", "s"));
3114 proto_tree_add_text(fh_tree, tvb, offset, length, "Stuff (%d byte%s)",
3115 length, plurality(length, "", "s"));
3121 * Handles CHAP just as a protocol field
3124 dissect_chap( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree ) {
3126 proto_tree *fh_tree = NULL;
3128 proto_tree *field_tree;
3130 proto_tree *value_tree;
3132 guint8 code, id, value_size;
3137 code = tvb_get_guint8(tvb, 0);
3138 id = tvb_get_guint8(tvb, 1);
3139 length = tvb_get_ntohs(tvb, 2);
3141 if(check_col(pinfo->cinfo, COL_PROTOCOL))
3142 col_set_str(pinfo->cinfo, COL_PROTOCOL,
3143 proto_get_protocol_short_name(proto_chap));
3145 if(check_col(pinfo->cinfo, COL_INFO))
3146 col_add_fstr(pinfo->cinfo, COL_INFO, "%s %s",
3147 proto_get_protocol_short_name(proto_chap),
3148 val_to_str(code, chap_vals, "Unknown"));
3151 ti = proto_tree_add_item(tree, proto_chap, tvb, 0, length, FALSE);
3152 fh_tree = proto_item_add_subtree(ti, ett_chap);
3153 proto_tree_add_text(fh_tree, tvb, 0, 1, "Code: %s (0x%02x)",
3154 val_to_str(code, chap_vals, "Unknown"), code);
3155 proto_tree_add_text(fh_tree, tvb, 1, 1, "Identifier: 0x%02x",
3157 proto_tree_add_text(fh_tree, tvb, 2, 2, "Length: %u",
3168 tf = proto_tree_add_text(fh_tree, tvb, offset, length,
3169 "Data (%d byte%s)", length,
3170 plurality(length, "", "s"));
3171 field_tree = proto_item_add_subtree(tf, ett_chap_data);
3172 value_size = tvb_get_guint8(tvb, offset);
3173 name_length = length - value_size - 1;
3174 tv = proto_tree_add_text(field_tree, tvb, offset, 1,
3175 "Value Size: %d byte%s",
3176 value_size, plurality(value_size, "", "s"));
3178 value_tree = proto_item_add_subtree(tv, ett_chap_value);
3179 proto_tree_add_text(value_tree, tvb, ++offset,
3180 ppp_min(value_size, length),
3181 "Value (%d byte%s)",
3182 value_size, plurality(value_size, "", "s"));
3186 proto_tree_add_text(field_tree, tvb, offset,
3187 ppp_min(name_length, length),
3188 "Name (%d byte%s)", name_length,
3189 plurality(name_length, "", "s"));
3200 tf = proto_tree_add_text(fh_tree, tvb, offset, length,
3201 "Data (%d byte%s)", length,
3202 plurality(length, "", "s"));
3203 field_tree = proto_item_add_subtree(tf, ett_chap_data);
3204 tv = proto_tree_add_text(field_tree, tvb, offset, length,
3205 "Message: %d byte%s",
3206 length, plurality(length, "", "s"));
3212 proto_tree_add_text(fh_tree, tvb, offset, length, "Stuff (%d byte%s)",
3213 length, plurality(length, "", "s"));
3222 dissect_ipv6cp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
3224 dissect_cp(tvb, proto_ipv6cp, ett_ipv6cp, cp_vals, ett_ipv6cp_options,
3225 ipv6cp_opts, N_IPV6CP_OPTS, pinfo, tree);
3228 static void dissect_ipv6cp_if_id_opt(const ip_tcp_opt *optp, tvbuff_t *tvb,
3229 int offset, guint length, packet_info *pinfo _U_,
3232 proto_tree_add_text(tree, tvb, offset, length, "%s: %02x%02x:%02x%02x:%02x%x:%02x%02x",
3234 tvb_get_guint8(tvb, offset + 2),
3235 tvb_get_guint8(tvb, offset + 3),
3236 tvb_get_guint8(tvb, offset + 4),
3237 tvb_get_guint8(tvb, offset + 5),
3238 tvb_get_guint8(tvb, offset + 6),
3239 tvb_get_guint8(tvb, offset + 7),
3240 tvb_get_guint8(tvb, offset + 8),
3241 tvb_get_guint8(tvb, offset + 9)
3246 proto_register_ppp(void)
3248 static hf_register_info hf[] = {
3250 { "Address", "ppp.address", FT_UINT8, BASE_HEX,
3251 NULL, 0x0, "", HFILL }},
3254 { "Control", "ppp.control", FT_UINT8, BASE_HEX,
3255 NULL, 0x0, "", HFILL }},
3258 { "Protocol", "ppp.protocol", FT_UINT16, BASE_HEX,
3259 VALS(ppp_vals), 0x0, "", HFILL }},
3261 static gint *ett[] = {
3265 static enum_val_t ppp_options[] = {
3272 module_t *ppp_module;
3274 proto_ppp = proto_register_protocol("Point-to-Point Protocol", "PPP", "ppp");
3275 proto_register_field_array(proto_ppp, hf, array_length(hf));
3276 proto_register_subtree_array(ett, array_length(ett));
3278 /* subdissector code */
3279 ppp_subdissector_table = register_dissector_table("ppp.protocol",
3280 "PPP protocol", FT_UINT16, BASE_HEX);
3282 register_dissector("ppp_hdlc", dissect_ppp_hdlc, proto_ppp);
3283 register_dissector("ppp_lcp_options", dissect_lcp_options, proto_ppp);
3284 register_dissector("ppp", dissect_ppp, proto_ppp);
3286 /* Register the preferences for the ppp protocol */
3287 ppp_module = prefs_register_protocol(proto_ppp, NULL);
3289 prefs_register_enum_preference(ppp_module,
3291 "PPP Frame Checksum Type",
3292 "The type of PPP frame checksum (none, 16-bit, 32-bit)",
3294 ppp_options, FALSE);
3295 prefs_register_bool_preference(ppp_module,
3297 "Decompress Van Jacobson-compressed frames",
3298 "Whether Van Jacobson-compressed PPP frames should be decompressed",
3300 prefs_register_uint_preference(ppp_module,
3302 "PPPMuxCP Default PID",
3303 "Default Protocol ID to be used for PPPMuxCP",
3304 16, &pppmux_def_prot_id);
3308 proto_reg_handoff_ppp(void)
3310 dissector_handle_t ppp_hdlc_handle, ppp_handle;
3313 * Get a handle for the CHDLC dissector.
3315 chdlc_handle = find_dissector("chdlc");
3316 data_handle = find_dissector("data");
3318 ppp_hdlc_handle = find_dissector("ppp_hdlc");
3319 ppp_handle = find_dissector("ppp");
3320 dissector_add("wtap_encap", WTAP_ENCAP_PPP, ppp_hdlc_handle);
3321 dissector_add("wtap_encap", WTAP_ENCAP_PPP_WITH_PHDR, ppp_hdlc_handle);
3322 dissector_add("fr.ietf", NLPID_PPP, ppp_handle);
3323 dissector_add("gre.proto", ETHERTYPE_PPP, ppp_hdlc_handle);
3327 proto_register_mp(void)
3329 static hf_register_info hf[] = {
3330 { &hf_mp_frag_first,
3331 { "First fragment", "mp.first", FT_BOOLEAN, 8,
3332 TFS(&frag_truth), MP_FRAG_FIRST, "", HFILL }},
3335 { "Last fragment", "mp.last", FT_BOOLEAN, 8,
3336 TFS(&frag_truth), MP_FRAG_LAST, "", HFILL }},
3338 { &hf_mp_sequence_num,
3339 { "Sequence number", "mp.seq", FT_UINT24, BASE_DEC, NULL, 0x0,
3342 static gint *ett[] = {
3347 proto_mp = proto_register_protocol("PPP Multilink Protocol", "PPP MP", "mp");
3348 proto_register_field_array(proto_mp, hf, array_length(hf));
3349 proto_register_subtree_array(ett, array_length(ett));
3353 proto_reg_handoff_mp(void)
3355 dissector_handle_t mp_handle;
3357 mp_handle = create_dissector_handle(dissect_mp, proto_mp);
3358 dissector_add("ppp.protocol", PPP_MP, mp_handle);
3362 proto_register_lcp(void)
3364 static gint *ett[] = {
3367 &ett_lcp_authprot_opt,
3368 &ett_lcp_qualprot_opt,
3369 &ett_lcp_fcs_alternatives_opt,
3370 &ett_lcp_numbered_mode_opt,
3371 &ett_lcp_callback_opt,
3372 &ett_lcp_multilink_ep_disc_opt,
3373 &ett_lcp_internationalization_opt,
3376 proto_lcp = proto_register_protocol("PPP Link Control Protocol", "PPP LCP",
3378 proto_register_subtree_array(ett, array_length(ett));
3382 proto_reg_handoff_lcp(void)
3384 dissector_handle_t lcp_handle;
3386 lcp_handle = create_dissector_handle(dissect_lcp, proto_lcp);
3387 dissector_add("ppp.protocol", PPP_LCP, lcp_handle);
3390 * NDISWAN on Windows translates Ethernet frames from higher-level
3391 * protocols into PPP frames to hand to the PPP driver, and translates
3392 * PPP frames from the PPP driver to hand to the higher-level protocols.
3394 * Apparently the PPP driver, on at least some versions of Windows,
3395 * passes frames for internal-to-PPP protocols up through NDISWAN;
3396 * the protocol type field appears to be passed through unchanged
3397 * (unlike what's done with, for example, the protocol type field
3398 * for IP, which is mapped from its PPP value to its Ethernet value).
3400 * This means that we may see, on Ethernet captures, frames for
3401 * protocols internal to PPP, so we register PPP_LCP with the
3402 * "ethertype" dissector table as well as the PPP protocol dissector
3405 dissector_add("ethertype", PPP_LCP, lcp_handle);
3409 proto_register_ipcp(void)
3411 static gint *ett[] = {
3414 &ett_ipcp_ipaddrs_opt,
3415 &ett_ipcp_compressprot_opt,
3418 proto_ipcp = proto_register_protocol("PPP IP Control Protocol", "PPP IPCP",
3420 proto_register_subtree_array(ett, array_length(ett));
3424 proto_reg_handoff_ipcp(void)
3426 dissector_handle_t ipcp_handle;
3428 ipcp_handle = create_dissector_handle(dissect_ipcp, proto_ipcp);
3429 dissector_add("ppp.protocol", PPP_IPCP, ipcp_handle);
3432 * See above comment about NDISWAN for an explanation of why we're
3433 * registering with the "ethertype" dissector table.
3435 dissector_add("ethertype", PPP_IPCP, ipcp_handle);
3439 proto_register_ccp(void)
3441 static gint *ett[] = {
3446 &ett_ccp_bsdcomp_opt,
3447 &ett_ccp_lzsdcp_opt,
3449 &ett_ccp_deflate_opt,
3452 proto_ccp = proto_register_protocol("PPP Compression Control Protocol",
3454 proto_register_subtree_array(ett, array_length(ett));
3458 proto_reg_handoff_ccp(void)
3460 dissector_handle_t ccp_handle;
3462 ccp_handle = create_dissector_handle(dissect_ccp, proto_ccp);
3463 dissector_add("ppp.protocol", PPP_CCP, ccp_handle);
3466 * See above comment about NDISWAN for an explanation of why we're
3467 * registering with the "ethertype" dissector table.
3469 dissector_add("ethertype", PPP_CCP, ccp_handle);
3473 proto_register_cbcp(void)
3475 static gint *ett[] = {
3478 &ett_cbcp_callback_opt,
3479 &ett_cbcp_callback_opt_addr
3482 proto_cbcp = proto_register_protocol("PPP Callback Control Protocol",
3483 "PPP CBCP", "cbcp");
3484 proto_register_subtree_array(ett, array_length(ett));
3488 proto_reg_handoff_cbcp(void)
3490 dissector_handle_t cbcp_handle;
3492 cbcp_handle = create_dissector_handle(dissect_cbcp, proto_cbcp);
3493 dissector_add("ppp.protocol", PPP_CBCP, cbcp_handle);
3496 * See above comment about NDISWAN for an explanation of why we're
3497 * registering with the "ethertype" dissector table.
3499 dissector_add("ethertype", PPP_CBCP, cbcp_handle);
3503 proto_register_bacp(void)
3505 static gint *ett[] = {
3508 &ett_bacp_favored_peer_opt
3511 proto_bacp = proto_register_protocol("PPP Bandwidth Allocation Control Protocol",
3512 "PPP BACP", "bacp");
3513 proto_register_subtree_array(ett, array_length(ett));
3517 proto_reg_handoff_bacp(void)
3519 dissector_handle_t bacp_handle;
3521 bacp_handle = create_dissector_handle(dissect_bacp, proto_bacp);
3522 dissector_add("ppp.protocol", PPP_BACP, bacp_handle);
3525 * See above comment about NDISWAN for an explanation of why we're
3526 * registering with the "ethertype" dissector table.
3528 dissector_add("ethertype", PPP_BACP, bacp_handle);
3532 proto_register_bap(void)
3534 static gint *ett[] = {
3537 &ett_bap_link_type_opt,
3538 &ett_bap_phone_delta_opt,
3539 &ett_bap_phone_delta_subopt,
3540 &ett_bap_call_status_opt
3543 proto_bap = proto_register_protocol("PPP Bandwidth Allocation Protocol",
3545 proto_register_subtree_array(ett, array_length(ett));
3549 proto_reg_handoff_bap(void)
3551 dissector_handle_t bap_handle;
3553 bap_handle = create_dissector_handle(dissect_bap, proto_bap);
3554 dissector_add("ppp.protocol", PPP_BAP, bap_handle);
3557 * See above comment about NDISWAN for an explanation of why we're
3558 * registering with the "ethertype" dissector table.
3560 dissector_add("ethertype", PPP_BAP, bap_handle);
3564 proto_register_comp_data(void)
3566 static gint *ett[] = {
3570 proto_comp_data = proto_register_protocol("PPP Compressed Datagram",
3571 "PPP Comp", "comp_data");
3572 proto_register_subtree_array(ett, array_length(ett));
3576 proto_reg_handoff_comp_data(void)
3578 dissector_handle_t comp_data_handle;
3580 comp_data_handle = create_dissector_handle(dissect_comp_data,
3582 dissector_add("ppp.protocol", PPP_COMP, comp_data_handle);
3585 * See above comment about NDISWAN for an explanation of why we're
3586 * registering with the "ethertype" dissector table.
3588 dissector_add("ethertype", PPP_COMP, comp_data_handle);
3592 proto_register_pap(void)
3594 static gint *ett[] = {
3602 proto_pap = proto_register_protocol("PPP Password Authentication Protocol", "PPP PAP",
3604 proto_register_subtree_array(ett, array_length(ett));
3608 proto_reg_handoff_pap(void)
3610 dissector_handle_t pap_handle;
3612 pap_handle = create_dissector_handle(dissect_pap, proto_pap);
3613 dissector_add("ppp.protocol", PPP_PAP, pap_handle);
3616 * See above comment about NDISWAN for an explanation of why we're
3617 * registering with the "ethertype" dissector table.
3619 dissector_add("ethertype", PPP_PAP, pap_handle);
3623 proto_register_chap(void)
3625 static gint *ett[] = {
3633 proto_chap = proto_register_protocol("PPP Challenge Handshake Authentication Protocol", "PPP CHAP",
3635 proto_register_subtree_array(ett, array_length(ett));
3639 proto_reg_handoff_chap(void)
3641 dissector_handle_t chap_handle;
3643 chap_handle = create_dissector_handle(dissect_chap, proto_chap);
3644 dissector_add("ppp.protocol", PPP_CHAP, chap_handle);
3647 * See above comment about NDISWAN for an explanation of why we're
3648 * registering with the "ethertype" dissector table.
3650 dissector_add("ethertype", PPP_CHAP, chap_handle);
3654 proto_register_pppmuxcp(void)
3656 static gint *ett[] = {
3658 &ett_pppmuxcp_options,
3661 proto_pppmuxcp = proto_register_protocol("PPPMux Control Protocol",
3664 proto_register_subtree_array(ett, array_length(ett));
3669 proto_reg_handoff_pppmuxcp(void)
3671 dissector_handle_t muxcp_handle;
3673 muxcp_handle = create_dissector_handle(dissect_pppmuxcp, proto_pppmuxcp);
3674 dissector_add("ppp.protocol", PPP_MUXCP, muxcp_handle);
3677 * See above comment about NDISWAN for an explanation of why we're
3678 * registering with the "ethertype" dissector table.
3680 dissector_add("ethertype", PPP_MUXCP, muxcp_handle);
3685 proto_register_pppmux(void)
3687 static gint *ett[] = {
3689 &ett_pppmux_subframe,
3690 &ett_pppmux_subframe_hdr,
3691 &ett_pppmux_subframe_flags,
3692 &ett_pppmux_subframe_info,
3695 proto_pppmux = proto_register_protocol("PPP Multiplexing",
3698 proto_register_subtree_array(ett, array_length(ett));
3702 proto_reg_handoff_pppmux(void)
3704 dissector_handle_t pppmux_handle;
3706 pppmux_handle = create_dissector_handle(dissect_pppmux, proto_pppmux);
3707 dissector_add("ppp.protocol", PPP_MUX, pppmux_handle);
3710 * See above comment about NDISWAN for an explanation of why we're
3711 * registering with the "ethertype" dissector table.
3713 dissector_add("ethertype", PPP_MUX, pppmux_handle);
3717 proto_register_mplscp(void)
3719 static gint *ett[] = {
3721 &ett_mplscp_options,
3724 proto_mplscp = proto_register_protocol("PPP MPLS Control Protocol",
3725 "PPP MPLSCP", "mplscp");
3726 proto_register_subtree_array(ett, array_length(ett));
3730 proto_reg_handoff_mplscp(void)
3732 dissector_handle_t mplscp_handle;
3734 mplscp_handle = create_dissector_handle(dissect_mplscp, proto_mplscp);
3735 dissector_add("ppp.protocol", PPP_MPLSCP, mplscp_handle);
3738 * See above comment about NDISWAN for an explanation of why we're
3739 * registering with the "ethertype" dissector table.
3741 dissector_add("ethertype", PPP_MPLSCP, mplscp_handle);
3745 proto_register_cdpcp(void)
3747 static gint *ett[] = {
3752 proto_cdpcp = proto_register_protocol("PPP CDP Control Protocol",
3753 "PPP CDPCP", "cdpcp");
3754 proto_register_subtree_array(ett, array_length(ett));
3758 proto_reg_handoff_cdpcp(void)
3760 dissector_handle_t cdpcp_handle;
3762 cdpcp_handle = create_dissector_handle(dissect_cdpcp, proto_cdpcp);
3763 dissector_add("ppp.protocol", PPP_CDPCP, cdpcp_handle);
3766 * See above comment about NDISWAN for an explanation of why we're
3767 * registering with the "ethertype" dissector table.
3769 dissector_add("ethertype", PPP_CDPCP, cdpcp_handle);
3773 proto_register_ipv6cp(void)
3775 static gint *ett[] = {
3777 &ett_ipv6cp_options,
3778 &ett_ipv6cp_if_id_opt,
3779 &ett_ipv6cp_compressprot_opt,
3782 proto_ipv6cp = proto_register_protocol("PPP IPv6 Control Protocol",
3783 "PPP IPV6CP", "ipv6cp");
3784 proto_register_subtree_array(ett, array_length(ett));
3788 proto_reg_handoff_ipv6cp(void)
3790 dissector_handle_t ipv6cp_handle;
3792 ipv6cp_handle = create_dissector_handle(dissect_ipv6cp, proto_ipv6cp);
3793 dissector_add("ppp.protocol", PPP_IPV6CP, ipv6cp_handle);
3796 * See above comment about NDISWAN for an explanation of why we're
3797 * registering with the "ethertype" dissector table.
3799 dissector_add("ethertype", PPP_IPV6CP, ipv6cp_handle);