print-ospf.c

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

C
1,158
字号
                           *(tptr+1));                    break;                case LS_OPAQUE_TE_LINK_SUBTLV_INTF_SW_CAP_DESCR:                    printf("\n\t\tInterface Switching Capability: %s",                           tok2str(gmpls_switch_cap_values, "Unknown", *(tptr)));                    printf("\n\t\tLSP Encoding: %s\n\t\tMax LSP Bandwidth:",                           tok2str(gmpls_encoding_values, "Unknown", *(tptr+1)));                    for (priority_level = 0; priority_level < 8; priority_level++) {                        bw.i = EXTRACT_32BITS(tptr+4+(priority_level*4));                        printf("\n\t\t  priority level %d: %.3f Mbps",                               priority_level,                               bw.f*8/1000000 );                    }                    break;                case LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE:                    printf(", %s (%u)",                           tok2str(lsa_opaque_te_tlv_link_type_sub_tlv_values,"unknown",*tptr),                           *tptr);                    break;                case LS_OPAQUE_TE_LINK_SUBTLV_SHARED_RISK_GROUP:                    count_srlg = subtlv_length / 4;                    if (count_srlg != 0)                        printf("\n\t\t  Shared risk group: ");                    while (count_srlg > 0) {                        bw.i = EXTRACT_32BITS(tptr);                        printf("%d",bw.i);                        tptr+=4;                        count_srlg--;                        if (count_srlg > 0)                            printf(", ");                    }                    break;                default:                    if (vflag <= 1) {                        if(!print_unknown_data(tptr,"\n\t\t",subtlv_length))                            return -1;                    }                    break;                }                /* in OSPF everything has to be 32-bit aligned, including subTLVs */                if (subtlv_length%4 != 0)                    subtlv_length+=4-(subtlv_length%4);                                            tlv_length-=subtlv_length;                tptr+=subtlv_length;                                        }            break;                                case LS_OPAQUE_TE_TLV_ROUTER:            if (tlv_length < 4) {                printf("\n\t    TLV length %u < 4", tlv_length);                return -1;            }            TCHECK2(*tptr, 4);            printf(", %s", ipaddr_string(tptr));            break;                                default:            if (vflag <= 1) {                if(!print_unknown_data(tptr,"\n\t      ",tlv_length))                    return -1;            }            break;        }        /* in OSPF everything has to be 32-bit aligned, including TLVs */        if (tlv_length%4 != 0)            tlv_length+=4-(tlv_length%4);        ls_length-=tlv_length;        tptr+=tlv_length;    }    return 0;trunc:    return -1;}static intospf_print_lshdr(register const struct lsa_hdr *lshp){        u_int ls_length;        TCHECK(lshp->ls_length);        ls_length = EXTRACT_16BITS(&lshp->ls_length);        if (ls_length < sizeof(struct lsa_hdr)) {                printf("\n\t    Bogus length %u < header (%lu)", ls_length,                    (unsigned long)sizeof(struct lsa_hdr));                return(-1);        }        TCHECK(lshp->ls_seq);	/* XXX - ls_length check checked this */	printf("\n\t  Advertising Router %s, seq 0x%08x, age %us, length %u",	       ipaddr_string(&lshp->ls_router),	       EXTRACT_32BITS(&lshp->ls_seq),	       EXTRACT_16BITS(&lshp->ls_age),               ls_length-(u_int)sizeof(struct lsa_hdr));	TCHECK(lshp->ls_type);	/* XXX - ls_length check checked this */        switch (lshp->ls_type) {	/* the LSA header for opaque LSAs was slightly changed */        case LS_TYPE_OPAQUE_LL:        case LS_TYPE_OPAQUE_AL:        case LS_TYPE_OPAQUE_DW:            printf("\n\t    %s LSA (%d), Opaque-Type %s LSA (%u), Opaque-ID %u",                   tok2str(lsa_values,"unknown",lshp->ls_type),                   lshp->ls_type,		   tok2str(lsa_opaque_values,			   "unknown",			   *(&lshp->un_lsa_id.opaque_field.opaque_type)),		   *(&lshp->un_lsa_id.opaque_field.opaque_type),		   EXTRACT_24BITS(&lshp->un_lsa_id.opaque_field.opaque_id)                                      );            break;	/* all other LSA types use regular style LSA headers */	default:            printf("\n\t    %s LSA (%d), LSA-ID: %s",                   tok2str(lsa_values,"unknown",lshp->ls_type),                   lshp->ls_type,                   ipaddr_string(&lshp->un_lsa_id.lsa_id));            break;        }	TCHECK(lshp->ls_options);	/* XXX - ls_length check checked this */        printf("\n\t    Options: [%s]", bittok2str(ospf_option_values,"none",lshp->ls_options));        return (ls_length);trunc:	return (-1);}/* draft-ietf-ospf-mt-09 */static struct tok ospf_topology_values[] = {    { 0, "default " },    { 1, "multicast " },    { 2, "management " },    { 0, NULL }};/* * Print all the per-topology metrics. */static voidospf_print_tos_metrics(const union un_tos *tos){    int metric_count;    int toscount;    toscount = tos->link.link_tos_count+1;    metric_count = 0;    /*     * All but the first metric contain a valid topology id.     */    while (toscount) {         printf("\n\t\ttopology %s(%u), metric %u",               tok2str(ospf_topology_values, "",                       metric_count ? tos->metrics.tos_type : 0),               metric_count ? tos->metrics.tos_type : 0,               EXTRACT_16BITS(&tos->metrics.tos_metric));        metric_count++;        tos++;        toscount--;    }}/* * Print a single link state advertisement.  If truncated or if LSA length * field is less than the length of the LSA header, return NULl, else * return pointer to data past end of LSA. */static const u_int8_t *ospf_print_lsa(register const struct lsa *lsap){	register const u_int8_t *ls_end;	register const struct rlalink *rlp;	register const struct in_addr *ap;	register const struct aslametric *almp;	register const struct mcla *mcp;	register const u_int32_t *lp;	register int j, tlv_type, tlv_length, topology;	register int ls_length;	const u_int8_t *tptr;	tptr = (u_int8_t *)lsap->lsa_un.un_unknown; /* squelch compiler warnings */        ls_length = ospf_print_lshdr(&lsap->ls_hdr);        if (ls_length == -1)                return(NULL);	ls_end = (u_int8_t *)lsap + ls_length;	ls_length -= sizeof(struct lsa_hdr);	switch (lsap->ls_hdr.ls_type) {	case LS_TYPE_ROUTER:		TCHECK(lsap->lsa_un.un_rla.rla_flags);                printf("\n\t    Router LSA Options: [%s]", bittok2str(ospf_rla_flag_values,"none",lsap->lsa_un.un_rla.rla_flags));		TCHECK(lsap->lsa_un.un_rla.rla_count);		j = EXTRACT_16BITS(&lsap->lsa_un.un_rla.rla_count);		TCHECK(lsap->lsa_un.un_rla.rla_link);		rlp = lsap->lsa_un.un_rla.rla_link;		while (j--) {			TCHECK(*rlp);			switch (rlp->un_tos.link.link_type) {			case RLA_TYPE_VIRTUAL:				printf("\n\t      Virtual Link: Neighbor Router-ID: %s, Interface Address: %s",				    ipaddr_string(&rlp->link_id),				    ipaddr_string(&rlp->link_data));                                 break;			case RLA_TYPE_ROUTER:				printf("\n\t      Neighbor Router-ID: %s, Interface Address: %s",				    ipaddr_string(&rlp->link_id),				    ipaddr_string(&rlp->link_data));				break;			case RLA_TYPE_TRANSIT:				printf("\n\t      Neighbor Network-ID: %s, Interface Address: %s",				    ipaddr_string(&rlp->link_id),				    ipaddr_string(&rlp->link_data));				break;			case RLA_TYPE_STUB:				printf("\n\t      Stub Network: %s, Mask: %s",				    ipaddr_string(&rlp->link_id),				    ipaddr_string(&rlp->link_data));				break;			default:				printf("\n\t      Unknown Router Link Type (%u)",				    rlp->un_tos.link.link_type);				return (ls_end);			}                        ospf_print_tos_metrics(&rlp->un_tos);			rlp = (struct rlalink *)((u_char *)(rlp + 1) +			    ((rlp->un_tos.link.link_tos_count) * sizeof(union un_tos)));		}		break;	case LS_TYPE_NETWORK:		TCHECK(lsap->lsa_un.un_nla.nla_mask);		printf("\n\t    Mask %s\n\t    Connected Routers:",		    ipaddr_string(&lsap->lsa_un.un_nla.nla_mask));		ap = lsap->lsa_un.un_nla.nla_router;		while ((u_char *)ap < ls_end) {			TCHECK(*ap);			printf("\n\t      %s", ipaddr_string(ap));			++ap;		}		break;	case LS_TYPE_SUM_IP:		TCHECK(lsap->lsa_un.un_nla.nla_mask);		printf("\n\t    Mask %s",		    ipaddr_string(&lsap->lsa_un.un_sla.sla_mask));		TCHECK(lsap->lsa_un.un_sla.sla_tosmetric);		lp = lsap->lsa_un.un_sla.sla_tosmetric;		while ((u_char *)lp < ls_end) {			register u_int32_t ul;			TCHECK(*lp);			ul = EXTRACT_32BITS(lp);                        topology = (ul & SLA_MASK_TOS) >> SLA_SHIFT_TOS;			printf("\n\t\ttopology %s(%u) metric %d",                               tok2str(ospf_topology_values, "", topology),                               topology,                               ul & SLA_MASK_METRIC);			++lp;		}		break;	case LS_TYPE_SUM_ABR:		TCHECK(lsap->lsa_un.un_sla.sla_tosmetric);		lp = lsap->lsa_un.un_sla.sla_tosmetric;		while ((u_char *)lp < ls_end) {			register u_int32_t ul;			TCHECK(*lp);			ul = EXTRACT_32BITS(lp);                        topology = (ul & SLA_MASK_TOS) >> SLA_SHIFT_TOS;			printf("\n\t\ttopology %s(%u) metric %d",                               tok2str(ospf_topology_values, "", topology),                               topology,                               ul & SLA_MASK_METRIC);			++lp;		}		break;	case LS_TYPE_ASE:        case LS_TYPE_NSSA: /* fall through - those LSAs share the same format */		TCHECK(lsap->lsa_un.un_nla.nla_mask);		printf("\n\t    Mask %s",		    ipaddr_string(&lsap->lsa_un.un_asla.asla_mask));		TCHECK(lsap->lsa_un.un_sla.sla_tosmetric);		almp = lsap->lsa_un.un_asla.asla_metric;		while ((u_char *)almp < ls_end) {			register u_int32_t ul;			TCHECK(almp->asla_tosmetric);			ul = EXTRACT_32BITS(&almp->asla_tosmetric);                        topology = ((ul & ASLA_MASK_TOS) >> ASLA_SHIFT_TOS);			printf("\n\t\ttopology %s(%u), type %d, metric",                               tok2str(ospf_topology_values, "", topology),                               topology,                               (ul & ASLA_FLAG_EXTERNAL) ? 2 : 1);                        if ((ul & ASLA_MASK_METRIC)==0xffffff)                            printf(" infinite");                        else                            printf(" %d", (ul & ASLA_MASK_METRIC));			TCHECK(almp->asla_forward);			if (almp->asla_forward.s_addr) {				printf(", forward %s",				    ipaddr_string(&almp->asla_forward));			}			TCHECK(almp->asla_tag);			if (almp->asla_tag.s_addr) {				printf(", tag %s",				    ipaddr_string(&almp->asla_tag));			}			++almp;		}		break;	case LS_TYPE_GROUP:		/* Multicast extensions as of 23 July 1991 */		mcp = lsap->lsa_un.un_mcla;		while ((u_char *)mcp < ls_end) {			TCHECK(mcp->mcla_vid);			switch (EXTRACT_32BITS(&mcp->mcla_vtype)) {			case MCLA_VERTEX_ROUTER:				printf("\n\t    Router Router-ID %s",				    ipaddr_string(&mcp->mcla_vid));				break;			case MCLA_VERTEX_NETWORK:				printf("\n\t    Network Designated Router %s",				    ipaddr_string(&mcp->mcla_vid));				break;			default:				printf("\n\t    unknown VertexType (%u)",				    EXTRACT_32BITS(&mcp->mcla_vtype));				break;			}		++mcp;		}		break;	case LS_TYPE_OPAQUE_LL: /* fall through */	case LS_TYPE_OPAQUE_AL: 	case LS_TYPE_OPAQUE_DW:	    switch (*(&lsap->ls_hdr.un_lsa_id.opaque_field.opaque_type)) {            case LS_OPAQUE_TYPE_RI:		tptr = (u_int8_t *)(&lsap->lsa_un.un_ri_tlv.type);		while (ls_length != 0) {                    TCHECK2(*tptr, 4);		    if (ls_length < 4) {                        printf("\n\t    Remaining LS length %u < 4", ls_length);                        return(ls_end);                    }                    tlv_type = EXTRACT_16BITS(tptr);                    tlv_length = EXTRACT_16BITS(tptr+2);                    tptr+=4;                    ls_length-=4;                                        printf("\n\t    %s TLV (%u), length: %u, value: ",                           tok2str(lsa_opaque_ri_tlv_values,"unknown",tlv_type),                           tlv_type,                           tlv_length);                    if (tlv_length > ls_length) {                        printf("\n\t    Bogus length %u > %u", tlv_length,                            ls_length);                        return(ls_end);

⌨️ 快捷键说明

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