print-ppp.c

来自「TCPDUMP的C语言源代码,是在数据链路层的应用」· C语言 代码 · 共 1,758 行 · 第 1/3 页

C
1,758
字号
/* * 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 + =
减小字号Ctrl + -
显示快捷键?