print-ldp.c

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

C
624
字号
		tptr+=sizeof(struct in6_addr);                	    }            break;#endif        default:            /* unknown AF */            break;        }	break;    case LDP_TLV_COMMON_SESSION:	printf("\n\t      Version: %u, Keepalive: %us, Flags: [Downstream %s, Loop Detection %s]",	       EXTRACT_16BITS(tptr), EXTRACT_16BITS(tptr+2),	       (EXTRACT_16BITS(tptr+6)&0x8000) ? "On Demand" : "Unsolicited",	       (EXTRACT_16BITS(tptr+6)&0x4000) ? "Enabled" : "Disabled"	       );	break;    case LDP_TLV_FEC:        fec_type = *tptr;	printf("\n\t      %s FEC (0x%02x)",	       tok2str(ldp_fec_values, "Unknown", fec_type),	       fec_type);	tptr+=1;	switch(fec_type) {	case LDP_FEC_WILDCARD:	    break;	case LDP_FEC_PREFIX:	    af = EXTRACT_16BITS(tptr);	    tptr+=2;	    if (af == AFNUM_INET) {		i=decode_prefix4(tptr,buf,sizeof(buf));		printf(": IPv4 prefix %s",buf);	    }#ifdef INET6	    else if (af == AFNUM_INET6) {		i=decode_prefix6(tptr,buf,sizeof(buf));		printf(": IPv6 prefix %s",buf);	    }#endif	    break;	case LDP_FEC_HOSTADDRESS:	    break;	case LDP_FEC_MARTINI_VC:            if (!TTEST2(*tptr, 11))                goto trunc;            vc_info_len = *(tptr+2);	    printf(": %s, %scontrol word, group-ID %u, VC-ID %u, VC-info-length: %u",		   tok2str(l2vpn_encaps_values, "Unknown", EXTRACT_16BITS(tptr)&0x7fff),		   EXTRACT_16BITS(tptr)&0x8000 ? "" : "no ",                   EXTRACT_32BITS(tptr+3),		   EXTRACT_32BITS(tptr+7),                   vc_info_len);            if (vc_info_len == 0) /* infinite loop protection */                break;            tptr+=11;            if (!TTEST2(*tptr, vc_info_len))                goto trunc;            while (vc_info_len > 2) {                vc_info_tlv_type = *tptr;                vc_info_tlv_len = *(tptr+1);                if (vc_info_tlv_len < 2)                    break;                if (vc_info_len < vc_info_tlv_len)                    break;                printf("\n\t\tInterface Parameter: %s (0x%02x), len %u",                       tok2str(ldp_fec_martini_ifparm_values,"Unknown",vc_info_tlv_type),                       vc_info_tlv_type,                       vc_info_tlv_len);                switch(vc_info_tlv_type) {                case LDP_FEC_MARTINI_IFPARM_MTU:                    printf(": %u",EXTRACT_16BITS(tptr+2));                    break;                case LDP_FEC_MARTINI_IFPARM_DESC:                    printf(": ");                    for (idx = 2; idx < vc_info_tlv_len; idx++)                        safeputchar(*(tptr+idx));                    break;                case LDP_FEC_MARTINI_IFPARM_VCCV:                    printf("\n\t\t  Control Channels (0x%02x) = [%s]",                           *(tptr+2),                           bittok2str(ldp_fec_martini_ifparm_vccv_cc_values,"none",*(tptr+2)));                    printf("\n\t\t  CV Types (0x%02x) = [%s]",                           *(tptr+3),                           bittok2str(ldp_fec_martini_ifparm_vccv_cv_values,"none",*(tptr+3)));                    break;                default:                    print_unknown_data(tptr+2,"\n\t\t  ",vc_info_tlv_len-2);                    break;                }                vc_info_len -= vc_info_tlv_len;                tptr += vc_info_tlv_len;            }	    break;	}	break;    case LDP_TLV_GENERIC_LABEL:	printf("\n\t      Label: %u", EXTRACT_32BITS(tptr) & 0xfffff);	break;    case LDP_TLV_STATUS:	ui = EXTRACT_32BITS(tptr);	tptr+=4;	printf("\n\t      Status: 0x%02x, Flags: [%s and %s forward]",	       ui&0x3fffffff,	       ui&0x80000000 ? "Fatal error" : "Advisory Notification",	       ui&0x40000000 ? "do" : "don't");	ui = EXTRACT_32BITS(tptr);	tptr+=4;	if (ui)	    printf(", causing Message ID: 0x%08x", ui);	break;    case LDP_TLV_FT_SESSION:	ft_flags = EXTRACT_16BITS(tptr);	printf("\n\t      Flags: [%sReconnect, %sSave State, %sAll-Label Protection, %s Checkpoint, %sRe-Learn State]",	       ft_flags&0x8000 ? "" : "No ",	       ft_flags&0x8 ? "" : "Don't ",	       ft_flags&0x4 ? "" : "No ",	       ft_flags&0x2 ? "Sequence Numbered Label" : "All Labels",	       ft_flags&0x1 ? "" : "Don't ");	tptr+=4;	ui = EXTRACT_32BITS(tptr);	if (ui)	    printf(", Reconnect Timeout: %ums", ui);	tptr+=4;	ui = EXTRACT_32BITS(tptr);	if (ui)	    printf(", Recovery Time: %ums", ui);	break;    case LDP_TLV_MTU:	printf("\n\t      MTU: %u", EXTRACT_16BITS(tptr));	break;    /*     *  FIXME those are the defined TLVs that lack a decoder     *  you are welcome to contribute code ;-)     */    case LDP_TLV_HOP_COUNT:    case LDP_TLV_PATH_VECTOR:    case LDP_TLV_ATM_LABEL:    case LDP_TLV_FR_LABEL:    case LDP_TLV_EXTD_STATUS:    case LDP_TLV_RETURNED_PDU:    case LDP_TLV_RETURNED_MSG:    case LDP_TLV_ATM_SESSION_PARM:    case LDP_TLV_FR_SESSION_PARM:    case LDP_TLV_LABEL_REQUEST_MSG_ID:    default:        if (vflag <= 1)            print_unknown_data(tptr,"\n\t      ",tlv_tlen);        break;    }    return(tlv_len+4); /* Type & Length fields not included */ trunc:    printf("\n\t\t packet exceeded snapshot");    return 0;}voidldp_print(register const u_char *pptr, register u_int len) {    int processed;    while (len > (sizeof(struct ldp_common_header) + sizeof(struct ldp_msg_header))) {        processed = ldp_msg_print(pptr);        if (processed == 0)            return;        len -= processed;        pptr += processed;    }}intldp_msg_print(register const u_char *pptr) {    const struct ldp_common_header *ldp_com_header;    const struct ldp_msg_header *ldp_msg_header;    const u_char *tptr,*msg_tptr;    u_short tlen;    u_short pdu_len,msg_len,msg_type,msg_tlen;    int hexdump,processed;    tptr=pptr;    ldp_com_header = (const struct ldp_common_header *)pptr;    TCHECK(*ldp_com_header);    /*     * Sanity checking of the header.     */    if (EXTRACT_16BITS(&ldp_com_header->version) != LDP_VERSION) {	printf("%sLDP version %u packet not supported",               (vflag < 1) ? "" : "\n\t",               EXTRACT_16BITS(&ldp_com_header->version));	return 0;    }    /* print the LSR-ID, label-space & length */    pdu_len = EXTRACT_16BITS(&ldp_com_header->pdu_length);    printf("%sLDP, Label-Space-ID: %s:%u, pdu-length: %u",           (vflag < 1) ? "" : "\n\t",           ipaddr_string(&ldp_com_header->lsr_id),           EXTRACT_16BITS(&ldp_com_header->label_space),           pdu_len);    /* bail out if non-verbose */     if (vflag < 1)        return 0;    /* ok they seem to want to know everything - lets fully decode it */    tlen=pdu_len;    tptr += sizeof(const struct ldp_common_header);    tlen -= sizeof(const struct ldp_common_header)-4;	/* Type & Length fields not included */    while(tlen>0) {        /* did we capture enough for fully decoding the msg header ? */        if (!TTEST2(*tptr, sizeof(struct ldp_msg_header)))            goto trunc;        ldp_msg_header = (const struct ldp_msg_header *)tptr;        msg_len=EXTRACT_16BITS(ldp_msg_header->length);        msg_type=LDP_MASK_MSG_TYPE(EXTRACT_16BITS(ldp_msg_header->type));        /* FIXME vendor private / experimental check */        printf("\n\t  %s Message (0x%04x), length: %u, Message ID: 0x%08x, Flags: [%s if unknown]",               tok2str(ldp_msg_values,                       "Unknown",                       msg_type),               msg_type,               msg_len,               EXTRACT_32BITS(&ldp_msg_header->id),               LDP_MASK_U_BIT(EXTRACT_16BITS(&ldp_msg_header->type)) ? "continue processing" : "ignore");        if (msg_len == 0) /* infinite loop protection */            return 0;        msg_tptr=tptr+sizeof(struct ldp_msg_header);        msg_tlen=msg_len-sizeof(struct ldp_msg_header)+4; /* Type & Length fields not included */        /* did we capture enough for fully decoding the message ? */        if (!TTEST2(*tptr, msg_len))            goto trunc;        hexdump=FALSE;        switch(msg_type) {         case LDP_MSG_NOTIF:        case LDP_MSG_HELLO:        case LDP_MSG_INIT:        case LDP_MSG_KEEPALIVE:        case LDP_MSG_ADDRESS:        case LDP_MSG_LABEL_MAPPING:        case LDP_MSG_ADDRESS_WITHDRAW:        case LDP_MSG_LABEL_WITHDRAW:            while(msg_tlen >= 4) {                processed = ldp_tlv_print(msg_tptr);                if (processed == 0)                    break;                msg_tlen-=processed;                msg_tptr+=processed;            }            break;        /*         *  FIXME those are the defined messages that lack a decoder         *  you are welcome to contribute code ;-)         */        case LDP_MSG_LABEL_REQUEST:        case LDP_MSG_LABEL_RELEASE:        case LDP_MSG_LABEL_ABORT_REQUEST:        default:            if (vflag <= 1)                print_unknown_data(msg_tptr,"\n\t  ",msg_tlen);            break;        }        /* do we want to see an additionally hexdump ? */        if (vflag > 1 || hexdump==TRUE)            print_unknown_data(tptr+sizeof(sizeof(struct ldp_msg_header)),"\n\t  ",                               msg_len);        tptr += msg_len+4;        tlen -= msg_len+4;    }    return pdu_len+4;trunc:    printf("\n\t\t packet exceeded snapshot");    return 0;}

⌨️ 快捷键说明

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