print-ppp.c

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

C
1,758
字号
/* LCP config options */static intprint_lcp_config_options(const u_char *p, int length){	int len, opt;	if (length < 2)		return 0;	TCHECK2(*p, 2);	len = p[1];	opt = p[0];	if (length < len)		return 0;	if (len < 2) {		if ((opt >= LCPOPT_MIN) && (opt <= LCPOPT_MAX))			printf("\n\t  %s Option (0x%02x), length %u (bogus, should be >= 2)", lcpconfopts[opt],opt,len);		else			printf("\n\tunknown LCP option 0x%02x", opt);		return 0;	}	if ((opt >= LCPOPT_MIN) && (opt <= LCPOPT_MAX))		printf("\n\t  %s Option (0x%02x), length %u: ", lcpconfopts[opt],opt,len);	else {		printf("\n\tunknown LCP option 0x%02x", opt);		return len;	}	switch (opt) {	case LCPOPT_VEXT:		if (len >= 6) {			TCHECK2(*(p + 2), 3);			printf("Vendor: %s (%u)",                               tok2str(oui_values,"Unknown",EXTRACT_24BITS(p+2)),                               EXTRACT_24BITS(p+2));#if 0			TCHECK(p[5]);			printf(", kind: 0x%02x", p[5]);			printf(", Value: 0x")			for (i = 0; i < len - 6; i++) {				TCHECK(p[6 + i]);				printf("%02x", p[6 + i]);			}#endif		}		break;	case LCPOPT_MRU:		if (len == 4) {			TCHECK2(*(p + 2), 2);			printf("%u", EXTRACT_16BITS(p + 2));		}		break;	case LCPOPT_ACCM:		if (len == 6) {			TCHECK2(*(p + 2), 4);			printf("0x%08x", EXTRACT_32BITS(p + 2));		}		break;	case LCPOPT_AP:		if (len >= 4) {		    TCHECK2(*(p + 2), 2);                    printf("%s", tok2str(ppptype2str,"Unknown Auth Proto (0x04x)",EXTRACT_16BITS(p+2)));		    switch (EXTRACT_16BITS(p+2)) {		    case PPP_CHAP:		        TCHECK(p[4]);                        printf(", %s",tok2str(authalg_values,"Unknown Auth Alg %u",p[4]));			break;		    case PPP_PAP: /* fall through */		    case PPP_EAP:		    case PPP_SPAP:		    case PPP_SPAP_OLD:                        break;		    default:                        print_unknown_data(p,"\n\t",len);		    }		}		break;	case LCPOPT_QP:		if (len >= 4) {			TCHECK2(*(p + 2), 2);		        if (EXTRACT_16BITS(p+2) == PPP_LQM)				printf(" LQR");			else				printf(" unknown");		}		break;	case LCPOPT_MN:		if (len == 6) {			TCHECK2(*(p + 2), 4);			printf("0x%08x", EXTRACT_32BITS(p + 2));		}		break;	case LCPOPT_PFC:		break;	case LCPOPT_ACFC:		break;	case LCPOPT_LD:		if (len == 4) {			TCHECK2(*(p + 2), 2);			printf("0x%04x", EXTRACT_16BITS(p + 2));		}		break;	case LCPOPT_CBACK:		if (len < 3)			break;		TCHECK(p[2]);                printf("Callback Operation %s (%u)",                       tok2str(ppp_callback_values,"Unknown",p[2]),                       p[2]);		break;	case LCPOPT_MLMRRU:		if (len == 4) {			TCHECK2(*(p + 2), 2);			printf("%u", EXTRACT_16BITS(p + 2));		}		break;	case LCPOPT_MLED:		if (len < 3)			break;		TCHECK(p[2]);		switch (p[2]) {		/* class */		case MEDCLASS_NULL:			printf("Null");			break;		case MEDCLASS_LOCAL:			printf("Local"); /* XXX */			break;		case MEDCLASS_IPV4:			if (len != 7)				break;			TCHECK2(*(p + 3), 4);			printf("IPv4 %s", ipaddr_string(p + 3));			break;		case MEDCLASS_MAC:			if (len != 9)				break;			TCHECK(p[8]);			printf("MAC %02x:%02x:%02x:%02x:%02x:%02x",			       p[3], p[4], p[5], p[6], p[7], p[8]);			break;		case MEDCLASS_MNB:			printf("Magic-Num-Block"); /* XXX */			break;		case MEDCLASS_PSNDN:			printf("PSNDN"); /* XXX */			break;		}		break;/* XXX: to be supported */#if 0	case LCPOPT_DEP6:	case LCPOPT_FCSALT:	case LCPOPT_SDP:	case LCPOPT_NUMMODE:	case LCPOPT_DEP12:	case LCPOPT_DEP14:	case LCPOPT_DEP15:	case LCPOPT_DEP16:        case LCPOPT_MLSSNHF:	case LCPOPT_PROP:	case LCPOPT_DCEID:	case LCPOPT_MPP:	case LCPOPT_LCPAOPT:	case LCPOPT_COBS:	case LCPOPT_PE:	case LCPOPT_MLHF:	case LCPOPT_I18N:	case LCPOPT_SDLOS:	case LCPOPT_PPPMUX:		break;#endif        default:                if(vflag<2)                        print_unknown_data(&p[2],"\n\t    ",len-2);                break;	}                 if (vflag>1)                print_unknown_data(&p[2],"\n\t    ",len-2); /* exclude TLV header */	return len;trunc:	printf("[|lcp]");	return 0;}/* ML-PPP*/struct tok ppp_ml_flag_values[] = {    { 0x80, "begin" },    { 0x40, "end" },    { 0, NULL }};static voidhandle_mlppp(const u_char *p, int length) {    if (!eflag)        printf("MLPPP, ");    printf("seq 0x%03x, Flags [%s], length %u",           (EXTRACT_16BITS(p))&0x0fff, /* only support 12-Bit sequence space for now */           bittok2str(ppp_ml_flag_values, "none", *p & 0xc0),           length);    return;}/* CHAP */static voidhandle_chap(const u_char *p, int length){	u_int code, len;	int val_size, name_size, msg_size;	const u_char *p0;	int i;	p0 = p;	if (length < 1) {		printf("[|chap]");		return;	} else if (length < 4) {		TCHECK(*p);		printf("[|chap 0x%02x]", *p);		return;	}	TCHECK(*p);	code = *p;        printf("CHAP, %s (0x%02x)",               tok2str(chapcode_values,"unknown",code),               code);	p++;	TCHECK(*p);	printf(", id %u", *p);		/* ID */	p++;	TCHECK2(*p, 2);	len = EXTRACT_16BITS(p);	p += 2;	/*	 * Note that this is a generic CHAP decoding routine. Since we	 * don't know which flavor of CHAP (i.e. CHAP-MD5, MS-CHAPv1,	 * MS-CHAPv2) is used at this point, we can't decode packet	 * specifically to each algorithms. Instead, we simply decode	 * the GCD (Gratest Common Denominator) for all algorithms.	 */	switch (code) {	case CHAP_CHAL:	case CHAP_RESP:		if (length - (p - p0) < 1)			return;		TCHECK(*p);		val_size = *p;		/* value size */		p++;		if (length - (p - p0) < val_size)			return;		printf(", Value ");		for (i = 0; i < val_size; i++) {			TCHECK(*p);			printf("%02x", *p++);		}		name_size = len - (p - p0);		printf(", Name ");		for (i = 0; i < name_size; i++) {			TCHECK(*p);			safeputchar(*p++);		}		break;	case CHAP_SUCC:	case CHAP_FAIL:		msg_size = len - (p - p0);		printf(", Msg ");		for (i = 0; i< msg_size; i++) {			TCHECK(*p);			safeputchar(*p++);		}		break;	}	return;trunc:	printf("[|chap]");}/* PAP (see RFC 1334) */static voidhandle_pap(const u_char *p, int length){	u_int code, len;	int peerid_len, passwd_len, msg_len;	const u_char *p0;	int i;	p0 = p;	if (length < 1) {		printf("[|pap]");		return;	} else if (length < 4) {		TCHECK(*p);		printf("[|pap 0x%02x]", *p);		return;	}	TCHECK(*p);	code = *p;        printf("PAP, %s (0x%02x)",               tok2str(papcode_values,"unknown",code),               code);	p++;	TCHECK(*p);	printf(", id %u", *p);		/* ID */	p++;	TCHECK2(*p, 2);	len = EXTRACT_16BITS(p);	p += 2;	if ((int)len > length) {		printf(", length %u > packet size", len);		return;	}	length = len;	if (length < (p - p0)) {		printf(", length %u < PAP header length", length);		return;	}	switch (code) {	case PAP_AREQ:		if (length - (p - p0) < 1)			return;		TCHECK(*p);		peerid_len = *p;	/* Peer-ID Length */		p++;		if (length - (p - p0) < peerid_len)			return;		printf(", Peer ");		for (i = 0; i < peerid_len; i++) {			TCHECK(*p);			safeputchar(*p++);		}		if (length - (p - p0) < 1)			return;		TCHECK(*p);		passwd_len = *p;	/* Password Length */		p++;		if (length - (p - p0) < passwd_len)			return;		printf(", Name ");		for (i = 0; i < passwd_len; i++) {			TCHECK(*p);			safeputchar(*p++);		}		break;	case PAP_AACK:	case PAP_ANAK:		if (length - (p - p0) < 1)			return;		TCHECK(*p);		msg_len = *p;		/* Msg-Length */		p++;		if (length - (p - p0) < msg_len)			return;		printf(", Msg ");		for (i = 0; i< msg_len; i++) {			TCHECK(*p);			safeputchar(*p++);		}		break;	}	return;trunc:	printf("[|pap]");}/* BAP */static voidhandle_bap(const u_char *p _U_, int length _U_){	/* XXX: to be supported!! */}/* IPCP config options */static intprint_ipcp_config_options(const u_char *p, int length){	int len, opt;        u_int compproto, ipcomp_subopttotallen, ipcomp_subopt, ipcomp_suboptlen;	if (length < 2)		return 0;	TCHECK2(*p, 2);	len = p[1];	opt = p[0];	if (length < len)		return 0;	if (len < 2) {		printf("\n\t  %s Option (0x%02x), length %u (bogus, should be >= 2)",		       tok2str(ipcpopt_values,"unknown",opt),		       opt,        	       len);		return 0;	}	printf("\n\t  %s Option (0x%02x), length %u: ",	       tok2str(ipcpopt_values,"unknown",opt),	       opt,               len);	switch (opt) {	case IPCPOPT_2ADDR:		/* deprecated */		if (len != 10)			goto invlen;		TCHECK2(*(p + 6), 4);		printf("src %s, dst %s",		       ipaddr_string(p + 2),		       ipaddr_string(p + 6));		break;	case IPCPOPT_IPCOMP:		if (len < 4)			goto invlen;		TCHECK2(*(p + 2), 2);                compproto = EXTRACT_16BITS(p+2);                printf("%s (0x%02x):",                       tok2str(ipcpopt_compproto_values,"Unknown",compproto),                       compproto);		switch (compproto) {                case PPP_VJC:			/* XXX: VJ-Comp parameters should be decoded */                        break;                case IPCPOPT_IPCOMP_HDRCOMP:                        if (len < IPCPOPT_IPCOMP_MINLEN)                                goto invlen;                        TCHECK2(*(p + 2), IPCPOPT_IPCOMP_MINLEN);                        printf("\n\t    TCP Space %u, non-TCP Space %u" \                               ", maxPeriod %u, maxTime %u, maxHdr %u",                               EXTRACT_16BITS(p+4),                               EXTRACT_16BITS(p+6),                               EXTRACT_16BITS(p+8),                               EXTRACT_16BITS(p+10),                               EXTRACT_16BITS(p+12));                        /* suboptions present ? */                        if (len > IPCPOPT_IPCOMP_MINLEN) {                                ipcomp_subopttotallen = len - IPCPOPT_IPCOMP_MINLEN;                                p += IPCPOPT_IPCOMP_MINLEN;                                                                printf("\n\t      Suboptions, length %u", ipcomp_subopttotallen);                                while (ipcomp_subopttotallen >= 2) {                                        TCHECK2(*p, 2);                                        ipcomp_subopt = *p;                                        ipcomp_suboptlen = *(p+1);                                                                                /* sanity check */                                        if (ipcomp_subopt == 0 ||                                            ipcomp_suboptlen == 0 )                                                break;                                        /* XXX: just display the suboptions for now */                                        printf("\n\t\t%s Suboption #%u, length %u",                                               tok2str(ipcpopt_compproto_subopt_values,                                                       "Unknown",                                                       ipcomp_subopt),                                               ipcomp_subopt,                                               ipcomp_suboptlen);                                        ipcomp_subopttotallen -= ipcomp_suboptlen;                                        p += ipcomp_suboptlen;                                }                        }                        break;                default:                        break;		}		break;	case IPCPOPT_ADDR:     /* those options share the same format - fall through */	case IPCPOPT_MOBILE4:	case IPCPOPT_PRIDNS:	case IPCPOPT_PRINBNS:	case IPCPOPT_SECDNS:	case IPCPOPT_SECNBNS:		if (len != 6)			goto invlen;		TCHECK2(*(p + 2), 4);		printf("%s", ipaddr_string(p + 2));		break;	default:                if(vflag<2)                        print_unknown_data(&p[2],"\n\t    ",len-2);		break;	}        if (vflag>1)                print_unknown_data(&p[2],"\n\t    ",len-2); /* exclude TLV header */	return len;invlen:	printf(", invalid-length-%d", opt);	return 0;trunc:	printf("[|ipcp]");	return 0;}/* IP6CP config options */static intprint_ip6cp_config_options(const u_char *p, int length){	int len, opt;	if (length < 2)		return 0;	TCHECK2(*p, 2);	len = p[1];	opt = p[0];	if (length < len)		return 0;	if (len < 2) {		printf("\n\t  %s Option (0x%02x), length %u (bogus, should be >= 2)",		       tok2str(ip6cpopt_values,"unknown",opt),		       opt,	               len);	        return 0;	}	printf("\n\t  %s Option (0x%02x), length %u: ",	       tok2str(ip6cpopt_values,"unknown",opt),	       opt,               len);	switch (opt) {	case IP6CP_IFID:		if (len != 10)			goto invlen;		TCHECK2(*(p + 2), 8);		printf("%04x:%04x:%04x:%04x",		       EXTRACT_16BITS(p + 2),		       EXTRACT_16BITS(p + 4),		       EXTRACT_16BITS(p + 6),		       EXTRACT_16BITS(p + 8));		break;	default:                if(vflag<2)                        print_unknown_data(&p[2],"\n\t    ",len-2);		break;	}        if (vflag>1)                print_unknown_data(&p[2],"\n\t    ",len-2); /* exclude TLV header */	return len;invlen:	printf(", invalid-length-%d", opt);	return 0;trunc:	printf("[|ip6cp]");	return 0;}/* CCP config options */static intprint_ccp_config_options(const u_char *p, int length){	int len, opt;	if (length < 2)		return 0;	TCHECK2(*p, 2);	len = p[1];	opt = p[0];	if (length < len)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?