print-l2tp.c

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

C
715
字号
		printf("S");	}}static voidl2tp_packet_proc_delay_print(void){	printf("obsolete");}static voidl2tp_proxy_auth_type_print(const u_char *dat){	u_int16_t *ptr = (u_int16_t *)dat;	printf("%s", tok2str(l2tp_authentype2str,			     "AuthType-#%u", EXTRACT_16BITS(ptr)));}static voidl2tp_proxy_auth_id_print(const u_char *dat){	u_int16_t *ptr = (u_int16_t *)dat;	printf("%u", EXTRACT_16BITS(ptr) & L2TP_PROXY_AUTH_ID_MASK);}static voidl2tp_call_errors_print(const u_char *dat){	u_int16_t *ptr = (u_int16_t *)dat;	u_int16_t val_h, val_l;	ptr++;		/* skip "Reserved" */	val_h = EXTRACT_16BITS(ptr); ptr++;	val_l = EXTRACT_16BITS(ptr); ptr++;	printf("CRCErr=%u ", (val_h<<16) + val_l);	val_h = EXTRACT_16BITS(ptr); ptr++;	val_l = EXTRACT_16BITS(ptr); ptr++;	printf("FrameErr=%u ", (val_h<<16) + val_l);	val_h = EXTRACT_16BITS(ptr); ptr++;	val_l = EXTRACT_16BITS(ptr); ptr++;	printf("HardOver=%u ", (val_h<<16) + val_l);	val_h = EXTRACT_16BITS(ptr); ptr++;	val_l = EXTRACT_16BITS(ptr); ptr++;	printf("BufOver=%u ", (val_h<<16) + val_l);	val_h = EXTRACT_16BITS(ptr); ptr++;	val_l = EXTRACT_16BITS(ptr); ptr++;	printf("Timeout=%u ", (val_h<<16) + val_l);	val_h = EXTRACT_16BITS(ptr); ptr++;	val_l = EXTRACT_16BITS(ptr); ptr++;	printf("AlignErr=%u ", (val_h<<16) + val_l);}static voidl2tp_accm_print(const u_char *dat){	u_int16_t *ptr = (u_int16_t *)dat;	u_int16_t val_h, val_l;	ptr++;		/* skip "Reserved" */	val_h = EXTRACT_16BITS(ptr); ptr++;	val_l = EXTRACT_16BITS(ptr); ptr++;	printf("send=%08x ", (val_h<<16) + val_l);	val_h = EXTRACT_16BITS(ptr); ptr++;	val_l = EXTRACT_16BITS(ptr); ptr++;	printf("recv=%08x ", (val_h<<16) + val_l);}static voidl2tp_ppp_discon_cc_print(const u_char *dat, u_int length){	u_int16_t *ptr = (u_int16_t *)dat;	printf("%04x, ", EXTRACT_16BITS(ptr)); ptr++;	/* Disconnect Code */	printf("%04x ",  EXTRACT_16BITS(ptr)); ptr++;	/* Control Protocol Number */	printf("%s", tok2str(l2tp_cc_direction2str,			     "Direction-#%u", *((u_char *)ptr++)));	if (length > 5) {		printf(" ");		print_string((const u_char *)ptr, length-5);	}}static voidl2tp_avp_print(const u_char *dat, int length){	u_int len;	const u_int16_t *ptr = (u_int16_t *)dat;	u_int16_t attr_type;	int hidden = FALSE;	if (length <= 0) {		return;	}	printf(" ");	TCHECK(*ptr);	/* Flags & Length */	len = EXTRACT_16BITS(ptr) & L2TP_AVP_HDR_LEN_MASK;	/* If it is not long enough to contain the header, we'll give up. */	if (len < 6)		goto trunc;	/* If it goes past the end of the remaining length of the packet,	   we'll give up. */	if (len > (u_int)length)		goto trunc;	/* If it goes past the end of the remaining length of the captured	   data, we'll give up. */	TCHECK2(*ptr, len);	/* After this point, no need to worry about truncation */	if (EXTRACT_16BITS(ptr) & L2TP_AVP_HDR_FLAG_MANDATORY) {		printf("*");	}	if (EXTRACT_16BITS(ptr) & L2TP_AVP_HDR_FLAG_HIDDEN) {		hidden = TRUE;		printf("?");	}	ptr++;	if (EXTRACT_16BITS(ptr)) {		/* Vendor Specific Attribute */	        printf("VENDOR%04x:", EXTRACT_16BITS(ptr)); ptr++;		printf("ATTR%04x", EXTRACT_16BITS(ptr)); ptr++;		printf("(");		print_octets((u_char *)ptr, len-6);		printf(")");	} else {		/* IETF-defined Attributes */		ptr++;		attr_type = EXTRACT_16BITS(ptr); ptr++;		printf("%s", tok2str(l2tp_avp2str, "AVP-#%u", attr_type));		printf("(");		if (hidden) {			printf("???");		} else {			switch (attr_type) {			case L2TP_AVP_MSGTYPE:				l2tp_msgtype_print((u_char *)ptr);				break;			case L2TP_AVP_RESULT_CODE:				l2tp_result_code_print((u_char *)ptr, len-6);				break;			case L2TP_AVP_PROTO_VER:				l2tp_proto_ver_print(ptr);				break;			case L2TP_AVP_FRAMING_CAP:				l2tp_framing_cap_print((u_char *)ptr);				break;			case L2TP_AVP_BEARER_CAP:				l2tp_bearer_cap_print((u_char *)ptr);				break;			case L2TP_AVP_TIE_BREAKER:				print_octets((u_char *)ptr, 8);				break;			case L2TP_AVP_FIRM_VER:			case L2TP_AVP_ASSND_TUN_ID:			case L2TP_AVP_RECV_WIN_SIZE:			case L2TP_AVP_ASSND_SESS_ID:				print_16bits_val(ptr);				break;			case L2TP_AVP_HOST_NAME:			case L2TP_AVP_VENDOR_NAME:			case L2TP_AVP_CALLING_NUMBER:			case L2TP_AVP_CALLED_NUMBER:			case L2TP_AVP_SUB_ADDRESS:			case L2TP_AVP_PROXY_AUTH_NAME:			case L2TP_AVP_PRIVATE_GRP_ID:				print_string((u_char *)ptr, len-6);				break;			case L2TP_AVP_CHALLENGE:			case L2TP_AVP_INI_RECV_LCP:			case L2TP_AVP_LAST_SENT_LCP:			case L2TP_AVP_LAST_RECV_LCP:			case L2TP_AVP_PROXY_AUTH_CHAL:			case L2TP_AVP_PROXY_AUTH_RESP:			case L2TP_AVP_RANDOM_VECTOR:				print_octets((u_char *)ptr, len-6);				break;			case L2TP_AVP_Q931_CC:				l2tp_q931_cc_print((u_char *)ptr, len-6);				break;			case L2TP_AVP_CHALLENGE_RESP:				print_octets((u_char *)ptr, 16);				break;			case L2TP_AVP_CALL_SER_NUM:			case L2TP_AVP_MINIMUM_BPS:			case L2TP_AVP_MAXIMUM_BPS:			case L2TP_AVP_TX_CONN_SPEED:			case L2TP_AVP_PHY_CHANNEL_ID:			case L2TP_AVP_RX_CONN_SPEED:				print_32bits_val((u_int32_t *)ptr);				break;			case L2TP_AVP_BEARER_TYPE:				l2tp_bearer_type_print((u_char *)ptr);				break;			case L2TP_AVP_FRAMING_TYPE:				l2tp_framing_type_print((u_char *)ptr);				break;			case L2TP_AVP_PACKET_PROC_DELAY:				l2tp_packet_proc_delay_print();				break;			case L2TP_AVP_PROXY_AUTH_TYPE:				l2tp_proxy_auth_type_print((u_char *)ptr);				break;			case L2TP_AVP_PROXY_AUTH_ID:				l2tp_proxy_auth_id_print((u_char *)ptr);				break;			case L2TP_AVP_CALL_ERRORS:				l2tp_call_errors_print((u_char *)ptr);				break;			case L2TP_AVP_ACCM:				l2tp_accm_print((u_char *)ptr);				break;			case L2TP_AVP_SEQ_REQUIRED:				break;	/* No Attribute Value */			case L2TP_AVP_PPP_DISCON_CC:				l2tp_ppp_discon_cc_print((u_char *)ptr, len-6);				break;			default:				break;			}		}		printf(")");	}	l2tp_avp_print(dat+len, length-len);	return; trunc:	printf("|...");}voidl2tp_print(const u_char *dat, u_int length){	const u_int16_t *ptr = (u_int16_t *)dat;	u_int cnt = 0;			/* total octets consumed */	u_int16_t pad;	int flag_t, flag_l, flag_s, flag_o;	u_int16_t l2tp_len;	flag_t = flag_l = flag_s = flag_o = FALSE;	TCHECK(*ptr);	/* Flags & Version */	if ((EXTRACT_16BITS(ptr) & L2TP_VERSION_MASK) == L2TP_VERSION_L2TP) {		printf(" l2tp:");	} else if ((EXTRACT_16BITS(ptr) & L2TP_VERSION_MASK) == L2TP_VERSION_L2F) {		printf(" l2f:");		return;		/* nothing to do */	} else {		printf(" Unknown Version, neither L2F(1) nor L2TP(2)");		return;		/* nothing we can do */	}	printf("[");	if (EXTRACT_16BITS(ptr) & L2TP_FLAG_TYPE) {		flag_t = TRUE;		printf("T");	}	if (EXTRACT_16BITS(ptr) & L2TP_FLAG_LENGTH) {		flag_l = TRUE;		printf("L");	}	if (EXTRACT_16BITS(ptr) & L2TP_FLAG_SEQUENCE) {		flag_s = TRUE;		printf("S");	}	if (EXTRACT_16BITS(ptr) & L2TP_FLAG_OFFSET) {		flag_o = TRUE;		printf("O");	}	if (EXTRACT_16BITS(ptr) & L2TP_FLAG_PRIORITY)		printf("P");	printf("]");	ptr++;	cnt += 2;	if (flag_l) {		TCHECK(*ptr);	/* Length */		l2tp_len = EXTRACT_16BITS(ptr); ptr++;		cnt += 2;	} else {		l2tp_len = 0;	}	TCHECK(*ptr);		/* Tunnel ID */	printf("(%u/", EXTRACT_16BITS(ptr)); ptr++;	cnt += 2;	TCHECK(*ptr);		/* Session ID */	printf("%u)",  EXTRACT_16BITS(ptr)); ptr++;	cnt += 2;	if (flag_s) {		TCHECK(*ptr);	/* Ns */		printf("Ns=%u,", EXTRACT_16BITS(ptr)); ptr++;		cnt += 2;		TCHECK(*ptr);	/* Nr */		printf("Nr=%u",  EXTRACT_16BITS(ptr)); ptr++;		cnt += 2;	}	if (flag_o) {		TCHECK(*ptr);	/* Offset Size */		pad =  EXTRACT_16BITS(ptr); ptr++;		ptr += pad / sizeof(*ptr);		cnt += (2 + pad);	}	if (flag_l) {		if (length < l2tp_len) {			printf(" Length %u larger than packet", l2tp_len);			return;		}		length = l2tp_len;	}	if (length < cnt) {		printf(" Length %u smaller than header length", length);		return;	}	if (flag_t) {		if (!flag_l) {			printf(" No length");			return;		}		if (length - cnt == 0) {			printf(" ZLB");		} else {			l2tp_avp_print((u_char *)ptr, length - cnt);		}	} else {		printf(" {");		ppp_print((u_char *)ptr, length - cnt);		printf("}");	}	return; trunc:	printf("%s", tstr);}

⌨️ 快捷键说明

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