print-lmp.c

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

C
884
字号
            goto trunc;        hexdump=FALSE;        switch(lmp_obj_header->class_num) {        case LMP_OBJ_CC_ID:            switch(lmp_obj_ctype) {            case LMP_CTYPE_LOC:            case LMP_CTYPE_RMT:                printf("\n\t    Control Channel ID: %u (0x%08x)",                       EXTRACT_32BITS(obj_tptr),                       EXTRACT_32BITS(obj_tptr));                break;            default:                hexdump=TRUE;            }            break;        case LMP_OBJ_LINK_ID:        case LMP_OBJ_INTERFACE_ID:            switch(lmp_obj_ctype) {            case LMP_CTYPE_IPV4_LOC:            case LMP_CTYPE_IPV4_RMT:                printf("\n\t    IPv4 Link ID: %s (0x%08x)",                       ipaddr_string(obj_tptr),                       EXTRACT_32BITS(obj_tptr));                break;#ifdef INET6            case LMP_CTYPE_IPV6_LOC:            case LMP_CTYPE_IPV6_RMT:                printf("\n\t    IPv6 Link ID: %s (0x%08x)",                       ip6addr_string(obj_tptr),                       EXTRACT_32BITS(obj_tptr));                break;#endif            case LMP_CTYPE_UNMD_LOC:            case LMP_CTYPE_UNMD_RMT:                printf("\n\t    Link ID: %u (0x%08x)",                       EXTRACT_32BITS(obj_tptr),                       EXTRACT_32BITS(obj_tptr));                break;            default:                hexdump=TRUE;            }            break;        case LMP_OBJ_MESSAGE_ID:            switch(lmp_obj_ctype) {            case LMP_CTYPE_1:                printf("\n\t    Message ID: %u (0x%08x)",                       EXTRACT_32BITS(obj_tptr),                       EXTRACT_32BITS(obj_tptr));                break;            case LMP_CTYPE_2:                printf("\n\t    Message ID Ack: %u (0x%08x)",                       EXTRACT_32BITS(obj_tptr),                       EXTRACT_32BITS(obj_tptr));                break;            default:                hexdump=TRUE;            }            break;        case LMP_OBJ_NODE_ID:            switch(lmp_obj_ctype) {            case LMP_CTYPE_LOC:            case LMP_CTYPE_RMT:                printf("\n\t    Node ID: %s (0x%08x)",                       ipaddr_string(obj_tptr),                       EXTRACT_32BITS(obj_tptr));                break;            default:                hexdump=TRUE;            }            break;        case LMP_OBJ_CONFIG:            switch(lmp_obj_ctype) {            case LMP_CTYPE_HELLO_CONFIG:                printf("\n\t    Hello Interval: %u\n\t    Hello Dead Interval: %u",                       EXTRACT_16BITS(obj_tptr),                       EXTRACT_16BITS(obj_tptr+2));                break;            default:                hexdump=TRUE;            }            break;	        case LMP_OBJ_HELLO:            switch(lmp_obj_ctype) {	    case LMP_CTYPE_HELLO:                printf("\n\t    Tx Seq: %u, Rx Seq: %u",                       EXTRACT_32BITS(obj_tptr),                       EXTRACT_32BITS(obj_tptr+4));                break;            default:                hexdump=TRUE;            }            break;      	            case LMP_OBJ_TE_LINK:		printf("\n\t    Flags: [%s]",		bittok2str(lmp_obj_te_link_flag_values,			"none",			EXTRACT_16BITS(obj_tptr)>>8));            	    switch(lmp_obj_ctype) {	    case LMP_CTYPE_IPV4:		printf("\n\t    Local Link-ID: %s (0x%08x) \			\n\t    Remote Link-ID: %s (0x%08x)",                       ipaddr_string(obj_tptr+4),                       EXTRACT_32BITS(obj_tptr+4),                       ipaddr_string(obj_tptr+8),                       EXTRACT_32BITS(obj_tptr+8));		break;		#ifdef INET6	    case LMP_CTYPE_IPV6:#endif	    case LMP_CTYPE_UNMD:            default:                hexdump=TRUE;            }            break;	        case LMP_OBJ_DATA_LINK:		printf("\n\t    Flags: [%s]",		bittok2str(lmp_obj_data_link_flag_values,			"none",			EXTRACT_16BITS(obj_tptr)>>8));            	    switch(lmp_obj_ctype) {	    case LMP_CTYPE_IPV4:	    case LMP_CTYPE_UNMD:                printf("\n\t    Local Interface ID: %s (0x%08x) \			\n\t    Remote Interface ID: %s (0x%08x)",                       ipaddr_string(obj_tptr+4),                       EXTRACT_32BITS(obj_tptr+4),                       ipaddr_string(obj_tptr+8),                       EXTRACT_32BITS(obj_tptr+8));				total_subobj_len = lmp_obj_len - 16;	 		offset = 12;		while (total_subobj_len > 0 && hexdump == FALSE ) {			subobj_type = EXTRACT_16BITS(obj_tptr+offset)>>8;			subobj_len  = EXTRACT_16BITS(obj_tptr+offset)&0x00FF;			printf("\n\t    Subobject, Type: %s (%u), Length: %u",				tok2str(lmp_data_link_subobj,					"Unknown",					subobj_type),					subobj_type,					subobj_len);			switch(subobj_type) {			case INT_SWITCHING_TYPE_SUBOBJ:				printf("\n\t      Switching Type: %s (%u)",					tok2str(gmpls_switch_cap_values, 						"Unknown", 						EXTRACT_16BITS(obj_tptr+offset+2)>>8),					EXTRACT_16BITS(obj_tptr+offset+2)>>8);				printf("\n\t      Encoding Type: %s (%u)",					tok2str(gmpls_encoding_values, 						"Unknown", 						EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF),					EXTRACT_16BITS(obj_tptr+offset+2)&0x00FF);				bw.i = EXTRACT_32BITS(obj_tptr+offset+4);				printf("\n\t      Min Reservable Bandwidth: %.3f Mbps",                                       bw.f*8/1000000);				bw.i = EXTRACT_32BITS(obj_tptr+offset+8);				printf("\n\t      Max Reservable Bandwidth: %.3f Mbps",                                       bw.f*8/1000000);				break;				case WAVELENGTH_SUBOBJ:				printf("\n\t      Wavelength: %u",					EXTRACT_32BITS(obj_tptr+offset+4));				break;			default:				/* Any Unknown Subobject ==> Exit loop */				hexdump=TRUE;				break;			}			total_subobj_len-=subobj_len;			offset+=subobj_len;		}				break;#ifdef INET6   	    case LMP_CTYPE_IPV6:#endif            default:                hexdump=TRUE;            }            break;      	            case LMP_OBJ_VERIFY_BEGIN:	    switch(lmp_obj_ctype) {            case LMP_CTYPE_1:		printf("\n\t    Flags: %s",		bittok2str(lmp_obj_begin_verify_flag_values,			"none",			EXTRACT_16BITS(obj_tptr)));		printf("\n\t    Verify Interval: %u",			EXTRACT_16BITS(obj_tptr+2));		printf("\n\t    Data links: %u",			EXTRACT_32BITS(obj_tptr+4));                printf("\n\t    Encoding type: %s",			tok2str(gmpls_encoding_values, "Unknown", *(obj_tptr+8)));                printf("\n\t    Verify Tranport Mechanism: %u (0x%x) %s",			EXTRACT_16BITS(obj_tptr+10),			EXTRACT_16BITS(obj_tptr+10),			EXTRACT_16BITS(obj_tptr+10)&8000 ? "(Payload test messages capable)" : "");                bw.i = EXTRACT_32BITS(obj_tptr+12);		printf("\n\t    Transmission Rate: %.3f Mbps",bw.f*8/1000000);		printf("\n\t    Wavelength: %u",			EXTRACT_32BITS(obj_tptr+16));		break;		            default:                hexdump=TRUE;            }            break;      	        case LMP_OBJ_VERIFY_BEGIN_ACK:	    switch(lmp_obj_ctype) {            case LMP_CTYPE_1:                printf("\n\t    Verify Dead Interval: %u 	\			\n\t    Verify Transport Response: %u",                       EXTRACT_16BITS(obj_tptr),                       EXTRACT_16BITS(obj_tptr+2));                break;		            default:                hexdump=TRUE;            }            break;              	case LMP_OBJ_VERIFY_ID:	    switch(lmp_obj_ctype) {            case LMP_CTYPE_1:                printf("\n\t    Verify ID: %u",                       EXTRACT_32BITS(obj_tptr));                break;		            default:                hexdump=TRUE;            }            break;              	case LMP_OBJ_CHANNEL_STATUS:            switch(lmp_obj_ctype) {	    case LMP_CTYPE_IPV4:	    case LMP_CTYPE_UNMD:		offset = 0;		/* Decode pairs: <Interface_ID (4 bytes), Channel_status (4 bytes)> */		while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) {			printf("\n\t    Interface ID: %s (0x%08x)",			ipaddr_string(obj_tptr+offset),			EXTRACT_32BITS(obj_tptr+offset));						printf("\n\t\t    Active: %s (%u)", 		(EXTRACT_32BITS(obj_tptr+offset+4)>>31) ? 						"Allocated" : "Non-allocated",				(EXTRACT_32BITS(obj_tptr+offset+4)>>31));						printf("\n\t\t    Direction: %s (%u)", (EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1 ? 						"Transmit" : "Receive",				(EXTRACT_32BITS(obj_tptr+offset+4)>>30)&0x1);										printf("\n\t\t    Channel Status: %s (%u)",					tok2str(lmp_obj_channel_status_values,			 		"Unknown",					EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF),			EXTRACT_32BITS(obj_tptr+offset+4)&0x3FFFFFF);			offset+=8;		}                break;#ifdef INET6       	    case LMP_CTYPE_IPV6:#endif            default:                hexdump=TRUE;            }            break;              	case LMP_OBJ_CHANNEL_STATUS_REQ:            switch(lmp_obj_ctype) {	    case LMP_CTYPE_IPV4:	    case LMP_CTYPE_UNMD:		offset = 0;		while (offset < (lmp_obj_len-(int)sizeof(struct lmp_object_header)) ) {			printf("\n\t    Interface ID: %s (0x%08x)",			ipaddr_string(obj_tptr+offset),			EXTRACT_32BITS(obj_tptr+offset));			offset+=4;		}                break;#ifdef INET6       	    case LMP_CTYPE_IPV6:#endif	    default:                hexdump=TRUE;            }            break;      	        case LMP_OBJ_ERROR_CODE:	    switch(lmp_obj_ctype) {            case LMP_CTYPE_BEGIN_VERIFY_ERROR:		printf("\n\t    Error Code: %s",		bittok2str(lmp_obj_begin_verify_error_values,			"none",			EXTRACT_32BITS(obj_tptr)));                break;		            case LMP_CTYPE_LINK_SUMMARY_ERROR:		printf("\n\t    Error Code: %s",		bittok2str(lmp_obj_link_summary_error_values,			"none",			EXTRACT_32BITS(obj_tptr)));                break;            default:                hexdump=TRUE;            }            break;      	case LMP_OBJ_SERVICE_CONFIG:	    switch (lmp_obj_ctype) {	    case LMP_CTYPE_SERVICE_CONFIG_SP:				printf("\n\t Flags: %s",		       bittok2str(lmp_obj_service_config_sp_flag_values,				  "none", 				  EXTRACT_16BITS(obj_tptr)>>8));		printf("\n\t  UNI Version: %u",		       EXTRACT_16BITS(obj_tptr) & 0x00FF);		break;		            case LMP_CTYPE_SERVICE_CONFIG_CPSA:				link_type = EXTRACT_16BITS(obj_tptr)>>8;				printf("\n\t Link Type: %s (%u)",		       tok2str(lmp_sd_service_config_cpsa_link_type_values,			       "Unknown", link_type),		       link_type);				if (link_type == LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SDH) {		    printf("\n\t Signal Type: %s (%u)",			   tok2str(lmp_sd_service_config_cpsa_signal_type_sdh_values,				   "Unknown",				   EXTRACT_16BITS(obj_tptr) & 0x00FF),			   EXTRACT_16BITS(obj_tptr) & 0x00FF);		}				if (link_type == LMP_SD_SERVICE_CONFIG_CPSA_LINK_TYPE_SONET) {		    printf("\n\t Signal Type: %s (%u)",			   tok2str(lmp_sd_service_config_cpsa_signal_type_sonet_values,				   "Unknown",				   EXTRACT_16BITS(obj_tptr) & 0x00FF),			   EXTRACT_16BITS(obj_tptr) & 0x00FF);		}				printf("\n\t Transparency: %s",		       bittok2str(lmp_obj_service_config_cpsa_tp_flag_values,				  "none",				  EXTRACT_16BITS(obj_tptr+2)>>8));				printf("\n\t Contiguous Concatenation Types: %s",		       bittok2str(lmp_obj_service_config_cpsa_cct_flag_values,				  "none",				  EXTRACT_16BITS(obj_tptr+2)>>8 & 0x00FF));				printf("\n\t Minimum NCC: %u",		       EXTRACT_16BITS(obj_tptr+4));				printf("\n\t Maximum NCC: %u",		       EXTRACT_16BITS(obj_tptr+6));				printf("\n\t Minimum NVC:%u",		       EXTRACT_16BITS(obj_tptr+8));				printf("\n\t Maximum NVC:%u",		       EXTRACT_16BITS(obj_tptr+10));				printf("\n\t    Local Interface ID: %s (0x%08x)",		       ipaddr_string(obj_tptr+12),		       EXTRACT_32BITS(obj_tptr+12));				break;			    case LMP_CTYPE_SERVICE_CONFIG_TRANSPARENCY_TCM:				printf("\n\t Transparency Flags: %s",		       bittok2str(			   lmp_obj_service_config_nsa_transparency_flag_values,			   "none",			   EXTRACT_32BITS(obj_tptr)));		printf("\n\t TCM Monitoring Flags: %s",		       bittok2str(			   lmp_obj_service_config_nsa_tcm_flag_values,			   "none",			   EXTRACT_16BITS(obj_tptr+6) & 0x00FF));				break;			    case LMP_CTYPE_SERVICE_CONFIG_NETWORK_DIVERSITY:				printf("\n\t Diversity: Flags: %s",		       bittok2str(			   lmp_obj_service_config_nsa_network_diversity_flag_values,			   "none",			   EXTRACT_16BITS(obj_tptr+2) & 0x00FF));		break;	    default:		hexdump = TRUE;	    };	break;        default:            if (vflag <= 1)                print_unknown_data(obj_tptr,"\n\t    ",obj_tlen);            break;        }        /* do we want to see an additionally hexdump ? */        if (vflag > 1 || hexdump==TRUE)            print_unknown_data(tptr+sizeof(sizeof(struct lmp_object_header)),"\n\t    ",                               lmp_obj_len-sizeof(struct lmp_object_header));        tptr+=lmp_obj_len;        tlen-=lmp_obj_len;    }    return;trunc:    printf("\n\t\t packet exceeded snapshot");}

⌨️ 快捷键说明

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