📄 print-ppp.c
字号:
/* * Copyright (c) 1990, 1991, 1993, 1994, 1995, 1996, 1997 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code distributions * retain the above copyright notice and this paragraph in its entirety, (2) * distributions including binary code include the above copyright notice and * this paragraph in its entirety in the documentation or other materials * provided with the distribution, and (3) all advertising materials mentioning * features or use of this software display the following acknowledgement: * ``This product includes software developed by the University of California, * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of * the University nor the names of its contributors may be used to endorse * or promote products derived from this software without specific prior * written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * Extensively modified by Motonori Shindo (mshindo@mshindo.net) for more * complete PPP support. *//* * TODO: * o resolve XXX as much as possible * o MP support * o BAP support */#ifndef lintstatic const char rcsid[] = "@(#) $Header: /tcpdump/master/tcpdump/print-ppp.c,v 1.58 2000/12/27 11:09:08 itojun Exp $ (LBL)";#endif#ifdef HAVE_CONFIG_H#include "config.h"#endif#ifndef WIN32
#include <sys/param.h>#include <sys/time.h>#else
#include <winsock2.h>
#include "bittypes.h"
#include <time.h>
#include "ethertype.h"
#endif /* WIN32 */
#ifdef __bsdi__#include <net/slcompress.h>#include <net/if_ppp.h>#endif#ifndef WIN32
#include <netinet/in.h>#endif /* WIN32 */
#include <ctype.h>#include <netdb.h>#include <pcap.h>#include <stdio.h>#include "interface.h"#include "extract.h"#include "addrtoname.h"#include "ppp.h"#include "chdlc.h"#include "ethertype.h"/* * The following constatns are defined by IANA. Please refer to * http://www.isi.edu/in-notes/iana/assignments/ppp-numbers * for the up-to-date information. *//* Control Protocols (LCP/IPCP/CCP etc.) Codes */#define CPCODES_VEXT 0 /* Vendor-Specific (RFC2153) */#define CPCODES_CONF_REQ 1 /* Configure-Request */#define CPCODES_CONF_ACK 2 /* Configure-Ack */#define CPCODES_CONF_NAK 3 /* Configure-Nak */#define CPCODES_CONF_REJ 4 /* Configure-Reject */#define CPCODES_TERM_REQ 5 /* Terminate-Request */#define CPCODES_TERM_ACK 6 /* Terminate-Ack */#define CPCODES_CODE_REJ 7 /* Code-Reject */#define CPCODES_PROT_REJ 8 /* Protocol-Reject (LCP only) */#define CPCODES_ECHO_REQ 9 /* Echo-Request (LCP only) */#define CPCODES_ECHO_RPL 10 /* Echo-Reply (LCP only) */#define CPCODES_DISC_REQ 11 /* Discard-Request (LCP only) */#define CPCODES_ID 12 /* Identification (LCP only) */#define CPCODES_TIME_REM 13 /* Time-Remaining (LCP only) */#define CPCODES_RESET_REQ 14 /* Reset-Request (CCP only) */#define CPCODES_RESET_REP 15 /* Reset-Reply (CCP only) */#define CPCODES_MIN CPCODES_VEXT#define CPCODES_MAX CPCODES_RESET_REPstatic const char *cpcodes[] = { /* * Control Protocol code values (RFC1661) */ "Vend-Ext", /* (0) RFC2153 */ "Conf-Req", /* (1) */ "Conf-Ack", /* (2) */ "Conf-Nak", /* (3) */ "Conf-Rej", /* (4) */ "Term-Req", /* (5) */ "Term-Ack", /* (6) */ "Code-Rej", /* (7) */ "Prot-Rej", /* (8) */ "Echo-Req", /* (9) */ "Echo-Rep", /* (10) */ "Disc-Req", /* (11) */ "Ident", /* (12) RFC1570 */ "Time-Rem", /* (13) RFC1570 */ "Reset-Req", /* (14) RFC1962 */ "Reset-Ack", /* (15) RFC1962 */};/* LCP Config Options */#define LCPOPT_VEXT 0#define LCPOPT_MRU 1#define LCPOPT_ACCM 2#define LCPOPT_AP 3#define LCPOPT_QP 4#define LCPOPT_MN 5#define LCPOPT_DEP6 6#define LCPOPT_PFC 7#define LCPOPT_ACFC 8#define LCPOPT_FCSALT 9#define LCPOPT_SDP 10#define LCPOPT_NUMMODE 11#define LCPOPT_DEP12 12#define LCPOPT_CBACK 13#define LCPOPT_DEP14 14#define LCPOPT_DEP15 15#define LCPOPT_DEP16 16#define LCPOPT_MLMRRU 17#define LCPOPT_MLSSNHF 18#define LCPOPT_MLED 19#define LCPOPT_PROP 20#define LCPOPT_DCEID 21#define LCPOPT_MPP 22#define LCPOPT_LD 23#define LCPOPT_LCPAOPT 24#define LCPOPT_COBS 25#define LCPOPT_PE 26#define LCPOPT_MLHF 27#define LCPOPT_I18N 28#define LCPOPT_SDLOS 29#define LCPOPT_PPPMUX 30#define LCPOPT_MIN LCPOPT_VEXT#define LCPOPT_MAX LCPOPT_PPPMUXstatic const char *lcpconfopts[] = { "Vend-Ext", /* (0) */ "MRU", /* (1) */ "ACCM", /* (2) */ "Auth-Prot", /* (3) */ "Qual-Prot", /* (4) */ "Magic-Num", /* (5) */ "deprecated(6)", /* used to be a Quality Protocol */ "PFC", /* (7) */ "ACFC", /* (8) */ "FCS-Alt", /* (9) */ "SDP", /* (10) */ "Num-Mode", /* (11) */ "deprecated(12)", /* used to be a Multi-Link-Procedure*/ "Call-Back", /* (13) */ "deprecated(14)", /* used to be a Connect-Time */ "deprecated(15)", /* used to be a Compund-Frames */ "deprecated(16)", /* used to be a Nominal-Data-Encap */ "MRRU", /* (17) */ "SSNHF", /* (18) */ "End-Disc", /* (19) */ "Proprietary", /* (20) */ "DCE-Id", /* (21) */ "MP+", /* (22) */ "Link-Disc", /* (23) */ "LCP-Auth-Opt", /* (24) */ "COBS", /* (25) */ "Prefix-elision", /* (26) */ "Multilink-header-Form",/* (27) */ "I18N", /* (28) */ "SDL-over-SONET/SDH", /* (29) */ "PPP-Muxing", /* (30) */};/* IPV6CP - to be supported *//* ECP - to be supported *//* CCP Config Options */#define CCPOPT_OUI 0 /* RFC1962 */#define CCPOPT_PRED1 1 /* RFC1962 */#define CCPOPT_PRED2 2 /* RFC1962 */#define CCPOPT_PJUMP 3 /* RFC1962 *//* 4-15 unassigned */#define CCPOPT_HPPPC 16 /* RFC1962 */#define CCPOPT_STACLZS 17 /* RFC1974 */#define CCPOPT_MPPC 18 /* RFC2118 */#define CCPOPT_GFZA 19 /* RFC1962 */#define CCPOPT_V42BIS 20 /* RFC1962 */#define CCPOPT_BSDCOMP 21 /* RFC1977 *//* 22 unassigned */#define CCPOPT_LZSDCP 23 /* RFC1967 */#define CCPOPT_MVRCA 24 /* RFC1975 */#define CCPOPT_DEC 25 /* RFC1976 */#define CCPOPT_DEFLATE 26 /* RFC1979 *//* 27-254 unassigned */#define CCPOPT_RESV 255 /* RFC1962 */#define CCPOPT_MIN CCPOPT_OUI#define CCPOPT_MAX CCPOPT_DEFLATE /* XXX: should be CCPOPT_RESV but... */static const char *ccpconfopts[] = { "OUI", /* (0) */ "Pred-1", /* (1) */ "Pred-2", /* (2) */ "Puddle", /* (3) */ "unassigned(4)", /* (4) */ "unassigned(5)", /* (5) */ "unassigned(6)", /* (6) */ "unassigned(7)", /* (7) */ "unassigned(8)", /* (8) */ "unassigned(9)", /* (9) */ "unassigned(10)", /* (10) */ "unassigned(11)", /* (11) */ "unassigned(12)", /* (12) */ "unassigned(13)", /* (13) */ "unassigned(14)", /* (14) */ "unassigned(15)", /* (15) */ "HP-PPC", /* (16) */ "Stac-LZS", /* (17) */ "MPPC", /* (18) */ "Gand-FZA", /* (19) */ "V.42bis", /* (20) */ "BSD-Comp", /* (21) */ "unassigned(22)", /* (22) */ "LZS-DCP", /* (23) */ "MVRCA", /* (24) */ "DEC", /* (25) */ "Deflate", /* (26) */};/* BACP Config Options */#define BACPOPT_FPEER 1 /* RFC2125 *//* SDCP - to be supported *//* IPCP Config Options */#define IPCPOPT_2ADDR 1 /* RFC1172, RFC1332 (deprecated) */#define IPCPOPT_IPCOMP 2 /* RFC1332 */#define IPCPOPT_ADDR 3 /* RFC1332 */#define IPCPOPT_MOBILE4 4 /* RFC2290 */#define IPCPOPT_PRIDNS 129 /* RFC1877 */#define IPCPOPT_PRINBNS 130 /* RFC1877 */#define IPCPOPT_SECDNS 131 /* RFC1877 */#define IPCPOPT_SECNBNS 132 /* RFC1877 *//* ATCP - to be supported *//* OSINLCP - to be supported *//* BVCP - to be supported *//* BCP - to be supported *//* IPXCP - to be supported *//* Auth Algorithms *//* 0-4 Reserved (RFC1994) */#define AUTHALG_CHAPMD5 5 /* RFC1994 */#define AUTHALG_MSCHAP1 128 /* RFC2433 */#define AUTHALG_MSCHAP2 129 /* RFC2795 *//* FCS Alternatives - to be supported *//* Multilink Endpoint Discriminator (RFC1717) */#define MEDCLASS_NULL 0 /* Null Class */#define MEDCLASS_LOCAL 1 /* Locally Assigned */#define MEDCLASS_IPV4 2 /* Internet Protocol (IPv4) */#define MEDCLASS_MAC 3 /* IEEE 802.1 global MAC address */#define MEDCLASS_MNB 4 /* PPP Magic Number Block */#define MEDCLASS_PSNDN 5 /* Public Switched Network Director Number *//* PPP LCP Callback */#define CALLBACK_AUTH 0 /* Location determined by user auth */#define CALLBACK_DSTR 1 /* Dialing string */#define CALLBACK_LID 2 /* Location identifier */#define CALLBACK_E164 3 /* E.164 number */#define CALLBACK_X500 4 /* X.500 distinguished name */#define CALLBACK_CBCP 6 /* Location is determined during CBCP nego *//* CHAP */#define CHAP_CHAL 1#define CHAP_RESP 2#define CHAP_SUCC 3#define CHAP_FAIL 4#define CHAP_CODEMIN CHAP_CHAL#define CHAP_CODEMAX CHAP_FAILstatic const char *chapcode[] = { "Chal", /* (1) */ "Resp", /* (2) */ "Succ", /* (3) */ "Fail", /* (4) */};/* PAP */#define PAP_AREQ 1#define PAP_AACK 2#define PAP_ANAK 3#define PAP_CODEMIN PAP_AREQ#define PAP_CODEMAX PAP_ANAKstatic const char *papcode[] = { "Auth-Req", /* (1) */ "Auth-Ack", /* (2) */ "Auth-Nak", /* (3) */};/* BAP */#define BAP_CALLREQ 1#define BAP_CALLRES 2#define BAP_CBREQ 3#define BAP_CBRES 4#define BAP_LDQREQ 5#define BAP_LDQRES 6#define BAP_CSIND 7#define BAP_CSRES 8static const char *ppp_protoname (u_int proto);static void handle_ctrl_proto (u_int proto,const u_char *p, int length);static void handle_chap (const u_char *p, int length);static void handle_pap (const u_char *p, int length);static void handle_bap (const u_char *p, int length);static int print_lcp_config_options (const u_char *p, int);static int print_ipcp_config_options (const u_char *p, int);static int print_ccp_config_options (const u_char *p, int);static int print_bacp_config_options (const u_char *p, int);static void handle_ppp (u_int proto, const u_char *p, int length);static const char *ppp_protoname(u_int proto){ static char buf[20]; switch (proto) { case PPP_IP: return "IP"; case PPP_IPV6: return "IPv6";#ifdef PPP_XNS case PPP_XNS: return "XNS";#endif case PPP_IPX: return "IPX"; case PPP_VJC: return "VJC"; case PPP_VJNC: return "VJNC";#ifdef PPP_COMP case PPP_COMP: return "COMP";#endif case PPP_IPCP: return "IPCP"; case PPP_IPV6CP: return "IPv6CP"; case PPP_IPXCP: return "IPXCP"; case PPP_CCP: return "CCP"; case PPP_LCP: return "LCP"; case PPP_PAP: return "PAP";#ifdef PPP_LQR case PPP_LQR: return "LQR";#endif case PPP_CHAP: return "CHAP"; case PPP_BACP: return "BACP"; case PPP_BAP: return "BAP"; default: snprintf(buf, sizeof(buf), "unknown-0x%04x", proto); return buf; }}/* generic Control Protocol (e.g. LCP, IPCP, CCP, etc.) handler */static voidhandle_ctrl_proto(u_int proto, const u_char *p, int length){ u_int code, len; int (*pfunc)(const u_char *, int); int x, j; if (length < 1) { printf("[|%s]", ppp_protoname(proto)); return; } else if (length < 4) { printf("[|%s 0x%02x]", ppp_protoname(proto), *p); return; } code = *p; if ((code >= CPCODES_MIN) && (code <= CPCODES_MAX)) printf("%s", cpcodes[code]); else { printf("0x%02x", code); return; } p++; printf("(%u)", *p); /* ID */ p++; len = EXTRACT_16BITS(p); p += 2; if (length <= 4) return; /* there may be a NULL confreq etc. */ switch (code) { case CPCODES_VEXT: if (length < 11) break; printf(", Magic-Num=%08x", EXTRACT_32BITS(p)); p += 4; printf(" OUI=%02x%02x%02x", p[0], p[1], p[2]); /* XXX: need to decode Kind and Value(s)? */ break; case CPCODES_CONF_REQ: case CPCODES_CONF_ACK: case CPCODES_CONF_NAK: case CPCODES_CONF_REJ: x = len - 4; /* Code(1), Identifier(1) and Length(2) */ do { switch (proto) { case PPP_LCP: pfunc = print_lcp_config_options; break; case PPP_IPCP: pfunc = print_ipcp_config_options; break; case PPP_CCP: pfunc = print_ccp_config_options; break; case PPP_BACP: pfunc = print_bacp_config_options; break; default: /* * This should never happen, but we set * "pfunc" to squelch uninitialized * variable warnings from compilers. */ pfunc = NULL; break; } if ((j = (*pfunc)(p, len)) == 0) break; x -= j; p += j; } while (x > 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -