?? 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[] _U_ = "@(#) $Header: /tcpdump/master/tcpdump/print-ppp.c,v 1.114 2005-12-05 11:35:58 hannes Exp $ (LBL)";#endif#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <tcpdump-stdinc.h>#ifdef __bsdi__#include <net/slcompress.h>#include <net/if_ppp.h>#endif#include <pcap.h>#include <stdio.h>#include <stdlib.h>#include "interface.h"#include "extract.h"#include "addrtoname.h"#include "ppp.h"#include "chdlc.h"#include "ethertype.h"#include "oui.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. *//* Protocol Codes defined in ppp.h */struct tok ppptype2str[] = { { PPP_IP, "IP" }, { PPP_OSI, "OSI" }, { PPP_NS, "NS" }, { PPP_DECNET, "DECNET" }, { PPP_APPLE, "APPLE" }, { PPP_IPX, "IPX" }, { PPP_VJC, "VJC IP" }, { PPP_VJNC, "VJNC IP" }, { PPP_BRPDU, "BRPDU" }, { PPP_STII, "STII" }, { PPP_VINES, "VINES" }, { PPP_MPLS_UCAST, "MPLS" }, { PPP_MPLS_MCAST, "MPLS" }, { PPP_COMP, "Compressed"}, { PPP_ML, "MLPPP"}, { PPP_IPV6, "IP6"}, { PPP_HELLO, "HELLO" }, { PPP_LUXCOM, "LUXCOM" }, { PPP_SNS, "SNS" }, { PPP_IPCP, "IPCP" }, { PPP_OSICP, "OSICP" }, { PPP_NSCP, "NSCP" }, { PPP_DECNETCP, "DECNETCP" }, { PPP_APPLECP, "APPLECP" }, { PPP_IPXCP, "IPXCP" }, { PPP_STIICP, "STIICP" }, { PPP_VINESCP, "VINESCP" }, { PPP_IPV6CP, "IP6CP" }, { PPP_MPLSCP, "MPLSCP" }, { PPP_LCP, "LCP" }, { PPP_PAP, "PAP" }, { PPP_LQM, "LQM" }, { PPP_CHAP, "CHAP" }, { PPP_EAP, "EAP" }, { PPP_SPAP, "SPAP" }, { PPP_SPAP_OLD, "Old-SPAP" }, { PPP_BACP, "BACP" }, { PPP_BAP, "BAP" }, { PPP_MPCP, "MLPPP-CP" }, { 0, NULL }};/* Control Protocols (LCP/IPCP/CCP etc.) Codes defined in RFC 1661 */#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) RFC1570 */#define CPCODES_TIME_REM 13 /* Time-Remaining (LCP only) RFC1570 */#define CPCODES_RESET_REQ 14 /* Reset-Request (CCP only) RFC1962 */#define CPCODES_RESET_REP 15 /* Reset-Reply (CCP only) */struct tok cpcodes[] = { {CPCODES_VEXT, "Vendor-Extension"}, /* RFC2153 */ {CPCODES_CONF_REQ, "Conf-Request"}, {CPCODES_CONF_ACK, "Conf-Ack"}, {CPCODES_CONF_NAK, "Conf-Nack"}, {CPCODES_CONF_REJ, "Conf-Reject"}, {CPCODES_TERM_REQ, "Term-Request"}, {CPCODES_TERM_ACK, "Term-Ack"}, {CPCODES_CODE_REJ, "Code-Reject"}, {CPCODES_PROT_REJ, "Prot-Reject"}, {CPCODES_ECHO_REQ, "Echo-Request"}, {CPCODES_ECHO_RPL, "Echo-Reply"}, {CPCODES_DISC_REQ, "Disc-Req"}, {CPCODES_ID, "Ident"}, /* RFC1570 */ {CPCODES_TIME_REM, "Time-Rem"}, /* RFC1570 */ {CPCODES_RESET_REQ, "Reset-Req"}, /* RFC1962 */ {CPCODES_RESET_REP, "Reset-Ack"}, /* RFC1962 */ {0, NULL}};/* 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) */ "12-Bit seq #", /* (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) */};/* 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 */const struct tok ccpconfopts_values[] = { { CCPOPT_OUI, "OUI" }, { CCPOPT_PRED1, "Pred-1" }, { CCPOPT_PRED2, "Pred-2" }, { CCPOPT_PJUMP, "Puddle" }, { CCPOPT_HPPPC, "HP-PPC" }, { CCPOPT_STACLZS, "Stac-LZS" }, { CCPOPT_MPPC, "MPPC" }, { CCPOPT_GFZA, "Gand-FZA" }, { CCPOPT_V42BIS, "V.42bis" }, { CCPOPT_BSDCOMP, "BSD-Comp" }, { CCPOPT_LZSDCP, "LZS-DCP" }, { CCPOPT_MVRCA, "MVRCA" }, { CCPOPT_DEC, "DEC" }, { CCPOPT_DEFLATE, "Deflate" }, { CCPOPT_RESV, "Reserved"}, {0, NULL}};/* BACP Config Options */#define BACPOPT_FPEER 1 /* RFC2125 */const struct tok bacconfopts_values[] = { { BACPOPT_FPEER, "Favored-Peer" }, {0, NULL}};/* 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 */struct tok ipcpopt_values[] = { { IPCPOPT_2ADDR, "IP-Addrs" }, { IPCPOPT_IPCOMP, "IP-Comp" }, { IPCPOPT_ADDR, "IP-Addr" }, { IPCPOPT_MOBILE4, "Home-Addr" }, { IPCPOPT_PRIDNS, "Pri-DNS" }, { IPCPOPT_PRINBNS, "Pri-NBNS" }, { IPCPOPT_SECDNS, "Sec-DNS" }, { IPCPOPT_SECNBNS, "Sec-NBNS" }, { 0, NULL }};#define IPCPOPT_IPCOMP_HDRCOMP 0x61 /* rfc3544 */#define IPCPOPT_IPCOMP_MINLEN 14struct tok ipcpopt_compproto_values[] = { { PPP_VJC, "VJ-Comp" }, { IPCPOPT_IPCOMP_HDRCOMP, "IP Header Compression" }, { 0, NULL }};struct tok ipcpopt_compproto_subopt_values[] = { { 1, "RTP-Compression" }, { 2, "Enhanced RTP-Compression" }, { 0, NULL }};/* IP6CP Config Options */#define IP6CP_IFID 1struct tok ip6cpopt_values[] = { { IP6CP_IFID, "Interface-ID" }, { 0, NULL }};/* ATCP - to be supported *//* OSINLCP - to be supported *//* BVCP - to be supported *//* BCP - to be supported *//* IPXCP - to be supported *//* MPLSCP - to be supported *//* Auth Algorithms *//* 0-4 Reserved (RFC1994) */#define AUTHALG_CHAPMD5 5 /* RFC1994 */#define AUTHALG_MSCHAP1 128 /* RFC2433 */#define AUTHALG_MSCHAP2 129 /* RFC2795 */struct tok authalg_values[] = { { AUTHALG_CHAPMD5, "MD5" }, { AUTHALG_MSCHAP1, "MS-CHAPv1" }, { AUTHALG_MSCHAP2, "MS-CHAPv2" }, { 0, NULL }};/* 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 */struct tok ppp_callback_values[] = { { CALLBACK_AUTH, "UserAuth" }, { CALLBACK_DSTR, "DialString" }, { CALLBACK_LID, "LocalID" }, { CALLBACK_E164, "E.164" }, { CALLBACK_X500, "X.500" }, { CALLBACK_CBCP, "CBCP" }, { 0, NULL }};/* CHAP */#define CHAP_CHAL 1#define CHAP_RESP 2#define CHAP_SUCC 3#define CHAP_FAIL 4struct tok chapcode_values[] = { { CHAP_CHAL, "Challenge" }, { CHAP_RESP, "Response" }, { CHAP_SUCC, "Success" }, { CHAP_FAIL, "Fail" }, { 0, NULL}};/* PAP */#define PAP_AREQ 1#define PAP_AACK 2#define PAP_ANAK 3struct tok papcode_values[] = { { PAP_AREQ, "Auth-Req" }, { PAP_AACK, "Auth-ACK" }, { PAP_ANAK, "Auth-NACK" }, { 0, NULL }};/* 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 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 void handle_mlppp(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_ip6cp_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 void ppp_hdlc(const u_char *p, int length);/* generic Control Protocol (e.g. LCP, IPCP, CCP, etc.) handler */static voidhandle_ctrl_proto(u_int proto, const u_char *pptr, int length){ const char *typestr; u_int code, len; int (*pfunc)(const u_char *, int); int x, j; const u_char *tptr; tptr=pptr; typestr = tok2str(ppptype2str, "unknown ctrl-proto (0x%04x)", proto); printf("%s, ",typestr); if (length < 4) /* FIXME weak boundary checking */ goto trunc; TCHECK2(*tptr, 2); code = *tptr++; printf("%s (0x%02x), id %u, length %u", tok2str(cpcodes, "Unknown Opcode",code), code, *tptr++, /* ID */ length+2); if (!vflag) return; if (length <= 4) return; /* there may be a NULL confreq etc. */ TCHECK2(*tptr, 2); len = EXTRACT_16BITS(tptr); tptr += 2; printf("\n\tencoded length %u (=Option(s) length %u)",len,len-4); if (vflag>1) print_unknown_data(pptr-2,"\n\t",6); switch (code) { case CPCODES_VEXT: if (length < 11) break; TCHECK2(*tptr, 4); printf("\n\t Magic-Num 0x%08x", EXTRACT_32BITS(tptr)); tptr += 4; TCHECK2(*tptr, 3); printf(" Vendor: %s (%u)", tok2str(oui_values,"Unknown",EXTRACT_24BITS(tptr)), EXTRACT_24BITS(tptr)); /* 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_IPV6CP: pfunc = print_ip6cp_config_options; break; case PPP_CCP: pfunc = print_ccp_config_options; break; case PPP_BACP: pfunc = print_bacp_config_options; break; default: /* * No print routine for the options for * this protocol. */ pfunc = NULL; break; } if (pfunc == NULL) /* catch the above null pointer if unknown CP */ break; if ((j = (*pfunc)(tptr, len)) == 0) break; x -= j; tptr += j; } while (x > 0); break; case CPCODES_TERM_REQ: case CPCODES_TERM_ACK: /* XXX: need to decode Data? */ break; case CPCODES_CODE_REJ: /* XXX: need to decode Rejected-Packet? */ break; case CPCODES_PROT_REJ: if (length < 6) break; TCHECK2(*tptr, 2); printf("\n\t Rejected %s Protocol (0x%04x)", tok2str(ppptype2str,"unknown", EXTRACT_16BITS(tptr)), EXTRACT_16BITS(tptr)); /* XXX: need to decode Rejected-Information? - hexdump for now */ if (len > 6) { printf("\n\t Rejected Packet"); print_unknown_data(tptr+2,"\n\t ",len-2); } break; case CPCODES_ECHO_REQ: case CPCODES_ECHO_RPL: case CPCODES_DISC_REQ: if (length < 8) break; TCHECK2(*tptr, 4); printf("\n\t Magic-Num 0x%08x", EXTRACT_32BITS(tptr)); /* XXX: need to decode Data? - hexdump for now */ if (len > 8) { printf("\n\t -----trailing data-----"); TCHECK2(tptr[4], len-8); print_unknown_data(tptr+4,"\n\t ",len-8); } break; case CPCODES_ID: if (length < 8) break; TCHECK2(*tptr, 4); printf("\n\t Magic-Num 0x%08x", EXTRACT_32BITS(tptr)); /* RFC 1661 says this is intended to be human readable */ if (len > 8) { printf("\n\t Message\n\t "); fn_printn(tptr+4,len-4,snapend); } break; case CPCODES_TIME_REM: if (length < 12) break; TCHECK2(*tptr, 4); printf("\n\t Magic-Num 0x%08x", EXTRACT_32BITS(tptr)); TCHECK2(*(tptr + 4), 4); printf(", Seconds-Remaining %us", EXTRACT_32BITS(tptr + 4)); /* XXX: need to decode Message? */ break; default: /* XXX this is dirty but we do not get the * original pointer passed to the begin * the PPP packet */ if (vflag <= 1) print_unknown_data(pptr-2,"\n\t ",length+2); break; } return;trunc: printf("[|%s]", typestr);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -