print-ospf6.c

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

C
590
字号
		lsapp = lsap->lsa_un.un_inter_ap.inter_ap_prefix;		while (lsapp + sizeof(lsapp) <= (struct lsa6_prefix *)ls_end) {			bytelen = ospf6_print_lsaprefix(lsapp);			if (bytelen)				goto trunc;			lsapp = (struct lsa6_prefix *)(((u_char *)lsapp) + bytelen);		}		break;	case LS_SCOPE_AS | LS_TYPE_ASE:		TCHECK(lsap->lsa_un.un_asla.asla_metric);		flags32 = EXTRACT_32BITS(&lsap->lsa_un.un_asla.asla_metric);                printf("\n\t     Flags [%s]",                       bittok2str(ospf6_asla_flag_values, "none", flags32));		printf(" metric %u",		       EXTRACT_32BITS(&lsap->lsa_un.un_asla.asla_metric) &		       ASLA_MASK_METRIC);		lsapp = lsap->lsa_un.un_asla.asla_prefix;		bytelen = ospf6_print_lsaprefix(lsapp);		if (bytelen < 0)			goto trunc;		if ((ls_opt = (u_char *)(((u_char *)lsapp) + bytelen)) < ls_end) {			struct in6_addr *fwdaddr6;			if ((flags32 & ASLA_FLAG_FWDADDR) != 0) {				fwdaddr6 = (struct in6_addr *)ls_opt;				TCHECK(*fwdaddr6);				printf(" forward %s",				       ip6addr_string(fwdaddr6));				ls_opt += sizeof(struct in6_addr);			}			if ((flags32 & ASLA_FLAG_ROUTETAG) != 0) {				TCHECK(*(u_int32_t *)ls_opt);				printf(" tag %s",				       ipaddr_string((u_int32_t *)ls_opt));				ls_opt += sizeof(u_int32_t);			}			if (lsapp->lsa_p_metric) {				TCHECK(*(u_int32_t *)ls_opt);				printf(" RefLSID: %s",				       ipaddr_string((u_int32_t *)ls_opt));				ls_opt += sizeof(u_int32_t);			}		}		break;	case LS_TYPE_LINK:		/* Link LSA */		llsap = &lsap->lsa_un.un_llsa;		TCHECK(llsap->llsa_options);                printf("\n\t      Options [%s]",                       bittok2str(ospf6_option_values, "none",                                  EXTRACT_32BITS(&llsap->llsa_options)));		TCHECK(llsap->llsa_nprefix);                prefixes = EXTRACT_32BITS(&llsap->llsa_nprefix);		printf("\n\t      Priority %d, Link-local address %s, Prefixes %d:",                       llsap->llsa_priority,                       ip6addr_string(&llsap->llsa_lladdr),                       prefixes);		tptr = (u_int8_t *)llsap->llsa_prefix;                while (prefixes > 0) {                    lsapp = (struct lsa6_prefix *)tptr;                    if ((bytelen = ospf6_print_lsaprefix(lsapp)) == -1) {                        goto trunc;                    }                    prefixes--;                    tptr += bytelen;                }		break;	case LS_TYPE_INTRA_AP | LS_SCOPE_AREA:		/* Intra-Area-Prefix LSA */		TCHECK(lsap->lsa_un.un_intra_ap.intra_ap_rtid);		ospf6_print_ls_type(			EXTRACT_16BITS(&lsap->lsa_un.un_intra_ap.intra_ap_lstype),			&lsap->lsa_un.un_intra_ap.intra_ap_lsid);		TCHECK(lsap->lsa_un.un_intra_ap.intra_ap_nprefix);                prefixes = EXTRACT_16BITS(&lsap->lsa_un.un_intra_ap.intra_ap_nprefix);		printf("\n\t      Prefixes %d:", prefixes);                tptr = (u_int8_t *)lsap->lsa_un.un_intra_ap.intra_ap_prefix;                while (prefixes > 0) {                    lsapp = (struct lsa6_prefix *)tptr;                    if ((bytelen = ospf6_print_lsaprefix(lsapp)) == -1) {                        goto trunc;                    }                    prefixes--;                    tptr += bytelen;                }		break;        case LS_TYPE_GRACE | LS_SCOPE_LINKLOCAL:                if (ospf_print_grace_lsa(tptr, lsa_length) == -1) {                    return 1;                }                        break;        case LS_TYPE_INTRA_ATE | LS_SCOPE_LINKLOCAL:            if (ospf_print_te_lsa(tptr, lsa_length) == -1) {                return 1;            }            break;	default:            if(!print_unknown_data(tptr,                                   "\n\t      ",                                   lsa_length)) {                return (1);            }	}	return (0);trunc:	return (1);}static intospf6_decode_v3(register const struct ospf6hdr *op,    register const u_char *dataend){	register const rtrid_t *ap;	register const struct lsr6 *lsrp;	register const struct lsa6_hdr *lshp;	register const struct lsa6 *lsap;	register int i;	switch (op->ospf6_type) {	case OSPF_TYPE_HELLO:                printf("\n\tOptions [%s]",                       bittok2str(ospf6_option_values, "none",                                  EXTRACT_32BITS(&op->ospf6_hello.hello_options)));                TCHECK(op->ospf6_hello.hello_deadint);                printf("\n\t  Hello Timer %us, Dead Timer %us, Interface-ID %s, Priority %u",                       EXTRACT_16BITS(&op->ospf6_hello.hello_helloint),                       EXTRACT_16BITS(&op->ospf6_hello.hello_deadint),                       ipaddr_string(&op->ospf6_hello.hello_ifid),                       op->ospf6_hello.hello_priority);		TCHECK(op->ospf6_hello.hello_dr);		if (op->ospf6_hello.hello_dr != 0)			printf("\n\t  Designated Router %s",			    ipaddr_string(&op->ospf6_hello.hello_dr));		TCHECK(op->ospf6_hello.hello_bdr);		if (op->ospf6_hello.hello_bdr != 0)			printf(", Backup Designated Router %s",			    ipaddr_string(&op->ospf6_hello.hello_bdr));		if (vflag) {			printf("\n\t  Neighbor List:");			ap = op->ospf6_hello.hello_neighbor;			while ((u_char *)ap < dataend) {				TCHECK(*ap);				printf("\n\t    %s", ipaddr_string(ap));				++ap;			}		}		break;	/* HELLO */	case OSPF_TYPE_DD:		TCHECK(op->ospf6_db.db_options);                printf("\n\tOptions [%s]",                       bittok2str(ospf6_option_values, "none",                                  EXTRACT_32BITS(&op->ospf6_db.db_options)));		TCHECK(op->ospf6_db.db_flags);                printf(", DD Flags [%s]",                       bittok2str(ospf6_dd_flag_values,"none",op->ospf6_db.db_flags));		TCHECK(op->ospf6_db.db_seq);		printf(", MTU %u, DD-Sequence 0x%08x",                       EXTRACT_16BITS(&op->ospf6_db.db_mtu),                       EXTRACT_32BITS(&op->ospf6_db.db_seq));                /* Print all the LS adv's */                lshp = op->ospf6_db.db_lshdr;                while (!ospf6_print_lshdr(lshp)) {                    ++lshp;                }		break;	case OSPF_TYPE_LS_REQ:		if (vflag) {			lsrp = op->ospf6_lsr;			while ((u_char *)lsrp < dataend) {				TCHECK(*lsrp);                                printf("\n\t  Advertising Router %s",                                       ipaddr_string(&lsrp->ls_router));				ospf6_print_ls_type(EXTRACT_16BITS(&lsrp->ls_type),                                                    &lsrp->ls_stateid);				++lsrp;			}		}		break;	case OSPF_TYPE_LS_UPDATE:		if (vflag) {			lsap = op->ospf6_lsu.lsu_lsa;			TCHECK(op->ospf6_lsu.lsu_count);			i = EXTRACT_32BITS(&op->ospf6_lsu.lsu_count);			while (i--) {				if (ospf6_print_lsa(lsap))					goto trunc;				lsap = (struct lsa6 *)((u_char *)lsap +				    EXTRACT_16BITS(&lsap->ls_hdr.ls_length));			}		}		break;	case OSPF_TYPE_LS_ACK:		if (vflag) {			lshp = op->ospf6_lsa.lsa_lshdr;			while (!ospf6_print_lshdr(lshp)) {				++lshp;			}		}		break;	default:		break;	}	return (0);trunc:	return (1);}voidospf6_print(register const u_char *bp, register u_int length){	register const struct ospf6hdr *op;	register const u_char *dataend;	register const char *cp;	op = (struct ospf6hdr *)bp;	/* If the type is valid translate it, or just print the type */	/* value.  If it's not valid, say so and return */	TCHECK(op->ospf6_type);	cp = tok2str(ospf6_type_values, "unknown LS-type", op->ospf6_type);	printf("OSPFv%u, %s, length %d", op->ospf6_version, cp, length);	if (*cp == 'u') {		return;        }        if(!vflag) { /* non verbose - so lets bail out here */                return;        }	TCHECK(op->ospf6_len);	if (length != EXTRACT_16BITS(&op->ospf6_len)) {		printf(" [len %d]", EXTRACT_16BITS(&op->ospf6_len));		return;	}	dataend = bp + length;	/* Print the routerid if it is not the same as the source */	TCHECK(op->ospf6_routerid);	printf("\n\tRouter-ID %s", ipaddr_string(&op->ospf6_routerid));	TCHECK(op->ospf6_areaid);	if (op->ospf6_areaid != 0)		printf(", Area %s", ipaddr_string(&op->ospf6_areaid));	else		printf(", Backbone Area");	TCHECK(op->ospf6_instanceid);	if (op->ospf6_instanceid)		printf(", Instance %u", op->ospf6_instanceid);	/* Do rest according to version.	 */	switch (op->ospf6_version) {	case 3:		/* ospf version 3 */		if (ospf6_decode_v3(op, dataend))			goto trunc;		break;	default:		printf(" ospf [version %d]", op->ospf6_version);		break;	}			/* end switch on version */	return;trunc:	fputs(tstr, stdout);}

⌨️ 快捷键说明

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