static int ospf_decode_v2(register const struct ospfhdr *op, register const u_char *dataend) { register const struct in_addr *ap; register const struct lsr *lsrp; register const struct lsa_hdr *lshp; register const struct lsa *lsap; register char sep; register int i; switch (op->ospf_type) { case OSPF_TYPE_UMD: /* * Rob Coltun's special monitoring packets; * do nothing */ break; case OSPF_TYPE_HELLO: if (vflag) { TCHECK(op->ospf_hello.hello_deadint); ospf_print_bits(ospf_option_bits, op->ospf_hello.hello_options); printf(" mask %s int %d pri %d dead %u", ipaddr_string(&op->ospf_hello.hello_mask), ntohs(op->ospf_hello.hello_helloint), op->ospf_hello.hello_priority, (u_int32_t)ntohl(op->ospf_hello.hello_deadint)); } TCHECK(op->ospf_hello.hello_dr); if (op->ospf_hello.hello_dr.s_addr != 0) printf(" dr %s", ipaddr_string(&op->ospf_hello.hello_dr)); TCHECK(op->ospf_hello.hello_bdr); if (op->ospf_hello.hello_bdr.s_addr != 0) printf(" bdr %s", ipaddr_string(&op->ospf_hello.hello_bdr)); if (vflag) { printf(" nbrs"); ap = op->ospf_hello.hello_neighbor; while ((u_char *)ap < dataend) { TCHECK(*ap); printf(" %s", ipaddr_string(ap)); ++ap; } } break; /* HELLO */ case OSPF_TYPE_DB: TCHECK(op->ospf_db.db_options); ospf_print_bits(ospf_option_bits, op->ospf_db.db_options); sep = ' '; TCHECK(op->ospf_db.db_flags); if (op->ospf_db.db_flags & OSPF_DB_INIT) { printf("%cI", sep); sep = '/'; } if (op->ospf_db.db_flags & OSPF_DB_MORE) { printf("%cM", sep); sep = '/'; } if (op->ospf_db.db_flags & OSPF_DB_MASTER) { printf("%cMS", sep); sep = '/'; } TCHECK(op->ospf_db.db_seq); printf(" mtu %u S %X", ntohs(op->ospf_db.db_mtu), (u_int32_t)ntohl(op->ospf_db.db_seq)); if (vflag) { /* Print all the LS adv's */ lshp = op->ospf_db.db_lshdr; while (!ospf_print_lshdr(lshp)) { /* { (ctags) */ printf(" }"); ++lshp; } } break; case OSPF_TYPE_LSR: if (vflag) { lsrp = op->ospf_lsr; while ((u_char *)lsrp < dataend) { TCHECK(*lsrp); printf(" {"); /* } (ctags) */ ospf_print_ls_type(ntohl(lsrp->ls_type), &lsrp->ls_stateid, &lsrp->ls_router, "LinkStateType %d"); /* { (ctags) */ printf(" }"); ++lsrp; } } break; case OSPF_TYPE_LSU: if (vflag) { lsap = op->ospf_lsu.lsu_lsa; TCHECK(op->ospf_lsu.lsu_count); i = ntohl(op->ospf_lsu.lsu_count); while (i--) { if (ospf_print_lsa(lsap)) goto trunc; lsap = (struct lsa *)((u_char *)lsap + ntohs(lsap->ls_hdr.ls_length)); } } break; case OSPF_TYPE_LSA: if (vflag) { lshp = op->ospf_lsa.lsa_lshdr; while (!ospf_print_lshdr(lshp)) { /* { (ctags) */ printf(" }"); ++lshp; } } break; default: printf("v2 type %d", op->ospf_type); break; } return (0); trunc: return (1); }
static int ospf_decode_v2(register const struct ospfhdr *op, register const u_char *dataend) { register const struct in_addr *ap; register const struct lsr *lsrp; register const struct lsa_hdr *lshp; register const struct lsa *lsap; register u_int32_t lsa_count,lsa_count_max; switch (op->ospf_type) { case OSPF_TYPE_UMD: /* * Rob Coltun's special monitoring packets; * do nothing */ break; case OSPF_TYPE_HELLO: printf("\n\tOptions: [%s]", bittok2str(ospf_option_values,"none",op->ospf_hello.hello_options)); TCHECK(op->ospf_hello.hello_deadint); printf("\n\t Hello Timer: %us, Dead Timer %us, Mask: %s, Priority: %u", EXTRACT_16BITS(&op->ospf_hello.hello_helloint), EXTRACT_32BITS(&op->ospf_hello.hello_deadint), ipaddr_string(&op->ospf_hello.hello_mask), op->ospf_hello.hello_priority); TCHECK(op->ospf_hello.hello_dr); if (op->ospf_hello.hello_dr.s_addr != 0) printf("\n\t Designated Router %s", ipaddr_string(&op->ospf_hello.hello_dr)); TCHECK(op->ospf_hello.hello_bdr); if (op->ospf_hello.hello_bdr.s_addr != 0) printf(", Backup Designated Router %s", ipaddr_string(&op->ospf_hello.hello_bdr)); ap = op->ospf_hello.hello_neighbor; if ((u_char *)ap < dataend) printf("\n\t Neighbor List:"); while ((u_char *)ap < dataend) { TCHECK(*ap); printf("\n\t %s", ipaddr_string(ap)); ++ap; } break; /* HELLO */ case OSPF_TYPE_DD: TCHECK(op->ospf_db.db_options); printf("\n\tOptions: [%s]", bittok2str(ospf_option_values,"none",op->ospf_db.db_options)); TCHECK(op->ospf_db.db_flags); printf(", DD Flags: [%s]", bittok2str(ospf_dd_flag_values,"none",op->ospf_db.db_flags)); if (vflag) { /* Print all the LS adv's */ lshp = op->ospf_db.db_lshdr; while (ospf_print_lshdr(lshp) != -1) { ++lshp; } } break; case OSPF_TYPE_LS_REQ: lsrp = op->ospf_lsr; while ((u_char *)lsrp < dataend) { TCHECK(*lsrp); printf("\n\t Advertising Router: %s, %s LSA (%u)", ipaddr_string(&lsrp->ls_router), tok2str(lsa_values,"unknown",EXTRACT_32BITS(lsrp->ls_type)), EXTRACT_32BITS(&lsrp->ls_type)); switch (EXTRACT_32BITS(lsrp->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(", Opaque-Type: %s LSA (%u), Opaque-ID: %u", tok2str(lsa_opaque_values, "unknown",lsrp->un_ls_stateid.opaque_field.opaque_type), lsrp->un_ls_stateid.opaque_field.opaque_type, EXTRACT_24BITS(&lsrp->un_ls_stateid.opaque_field.opaque_id)); break; default: printf(", LSA-ID: %s", ipaddr_string(&lsrp->un_ls_stateid.ls_stateid)); break; } ++lsrp; } break; case OSPF_TYPE_LS_UPDATE: lsap = op->ospf_lsu.lsu_lsa; TCHECK(op->ospf_lsu.lsu_count); lsa_count_max = EXTRACT_32BITS(&op->ospf_lsu.lsu_count); printf(", %d LSA%s",lsa_count_max, lsa_count_max > 1 ? "s" : ""); for (lsa_count=1;lsa_count <= lsa_count_max;lsa_count++) { printf("\n\t LSA #%u",lsa_count); lsap = (const struct lsa *)ospf_print_lsa(lsap); if (lsap == NULL) goto trunc; } break; case OSPF_TYPE_LS_ACK: lshp = op->ospf_lsa.lsa_lshdr; while (ospf_print_lshdr(lshp) != -1) { ++lshp; } break; default: printf("v2 type (%d)", op->ospf_type); break; } return (0); trunc: return (1); }