print-ospf.c

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

C
1,158
字号
/* * Copyright (c) 1992, 1993, 1994, 1995, 1996, 1997 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code distributions * retain the above copyright notice and this paragraph in its entirety, (2) * distributions including binary code include the above copyright notice and * this paragraph in its entirety in the documentation or other materials * provided with the distribution, and (3) all advertising materials mentioning * features or use of this software display the following acknowledgement: * ``This product includes software developed by the University of California, * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of * the University nor the names of its contributors may be used to endorse * or promote products derived from this software without specific prior * written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * OSPF support contributed by Jeffrey Honig (jch@mitchell.cit.cornell.edu) */#ifndef lintstatic const char rcsid[] _U_ =    "@(#) $Header: /tcpdump/master/tcpdump/print-ospf.c,v 1.66 2007-10-08 07:53:21 hannes Exp $ (LBL)";#endif#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <tcpdump-stdinc.h>#include <stdio.h>#include "interface.h"#include "addrtoname.h"#include "extract.h"#include "gmpls.h"#include "ospf.h"#include "ip.h"static struct tok ospf_option_values[] = {        { OSPF_OPTION_T,	"MultiTopology" }, /* draft-ietf-ospf-mt-09 */	{ OSPF_OPTION_E,	"External" },	{ OSPF_OPTION_MC,	"Multicast" },	{ OSPF_OPTION_NP,	"NSSA" },        { OSPF_OPTION_L,        "LLS" },	{ OSPF_OPTION_DC,	"Demand Circuit" },	{ OSPF_OPTION_O,	"Opaque" },	{ OSPF_OPTION_DN,	"Up/Down" },	{ 0,			NULL }};static struct tok ospf_authtype_values[] = {	{ OSPF_AUTH_NONE,	"none" },	{ OSPF_AUTH_SIMPLE,	"simple" },	{ OSPF_AUTH_MD5,	"MD5" },	{ 0,			NULL }};static struct tok ospf_rla_flag_values[] = {	{ RLA_FLAG_B,		"ABR" },	{ RLA_FLAG_E,		"ASBR" },	{ RLA_FLAG_W1,		"Virtual" },	{ RLA_FLAG_W2,		"W2" },	{ 0,			NULL }};static struct tok type2str[] = {	{ OSPF_TYPE_UMD,	"UMD" },	{ OSPF_TYPE_HELLO,	"Hello" },	{ OSPF_TYPE_DD,		"Database Description" },	{ OSPF_TYPE_LS_REQ,	"LS-Request" },	{ OSPF_TYPE_LS_UPDATE,	"LS-Update" },	{ OSPF_TYPE_LS_ACK,	"LS-Ack" },	{ 0,			NULL }};static struct tok lsa_values[] = {	{ LS_TYPE_ROUTER,       "Router" },	{ LS_TYPE_NETWORK,      "Network" },	{ LS_TYPE_SUM_IP,       "Summary" },	{ LS_TYPE_SUM_ABR,      "ASBR Summary" },	{ LS_TYPE_ASE,          "External" },	{ LS_TYPE_GROUP,        "Multicast Group" },	{ LS_TYPE_NSSA,         "NSSA" },	{ LS_TYPE_OPAQUE_LL,    "Link Local Opaque" },	{ LS_TYPE_OPAQUE_AL,    "Area Local Opaque" },	{ LS_TYPE_OPAQUE_DW,    "Domain Wide Opaque" },	{ 0,			NULL }};static struct tok ospf_dd_flag_values[] = {	{ OSPF_DB_INIT,	        "Init" },	{ OSPF_DB_MORE,	        "More" },	{ OSPF_DB_MASTER,	"Master" },    { OSPF_DB_RESYNC,	"OOBResync" },	{ 0,			NULL }};static struct tok lsa_opaque_values[] = {	{ LS_OPAQUE_TYPE_TE,    "Traffic Engineering" },	{ LS_OPAQUE_TYPE_GRACE, "Graceful restart" },	{ LS_OPAQUE_TYPE_RI,    "Router Information" },	{ 0,			NULL }};static struct tok lsa_opaque_te_tlv_values[] = {	{ LS_OPAQUE_TE_TLV_ROUTER, "Router Address" },	{ LS_OPAQUE_TE_TLV_LINK,   "Link" },	{ 0,			NULL }};static struct tok lsa_opaque_te_link_tlv_subtlv_values[] = {	{ LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE,            "Link Type" },	{ LS_OPAQUE_TE_LINK_SUBTLV_LINK_ID,              "Link ID" },	{ LS_OPAQUE_TE_LINK_SUBTLV_LOCAL_IP,             "Local Interface IP address" },	{ LS_OPAQUE_TE_LINK_SUBTLV_REMOTE_IP,            "Remote Interface IP address" },	{ LS_OPAQUE_TE_LINK_SUBTLV_TE_METRIC,            "Traffic Engineering Metric" },	{ LS_OPAQUE_TE_LINK_SUBTLV_MAX_BW,               "Maximum Bandwidth" },	{ LS_OPAQUE_TE_LINK_SUBTLV_MAX_RES_BW,           "Maximum Reservable Bandwidth" },	{ LS_OPAQUE_TE_LINK_SUBTLV_UNRES_BW,             "Unreserved Bandwidth" },	{ LS_OPAQUE_TE_LINK_SUBTLV_ADMIN_GROUP,          "Administrative Group" },	{ LS_OPAQUE_TE_LINK_SUBTLV_LINK_LOCAL_REMOTE_ID, "Link Local/Remote Identifier" },	{ LS_OPAQUE_TE_LINK_SUBTLV_LINK_PROTECTION_TYPE, "Link Protection Type" },	{ LS_OPAQUE_TE_LINK_SUBTLV_INTF_SW_CAP_DESCR,    "Interface Switching Capability" },	{ LS_OPAQUE_TE_LINK_SUBTLV_SHARED_RISK_GROUP,    "Shared Risk Link Group" },	{ LS_OPAQUE_TE_LINK_SUBTLV_BW_CONSTRAINTS,       "Bandwidth Constraints" },	{ 0,			NULL }};static struct tok lsa_opaque_grace_tlv_values[] = {	{ LS_OPAQUE_GRACE_TLV_PERIOD,             "Grace Period" },	{ LS_OPAQUE_GRACE_TLV_REASON,             "Graceful restart Reason" },	{ LS_OPAQUE_GRACE_TLV_INT_ADDRESS,        "IPv4 interface address" },	{ 0,		        NULL }};static struct tok lsa_opaque_grace_tlv_reason_values[] = {	{ LS_OPAQUE_GRACE_TLV_REASON_UNKNOWN,     "Unknown" },	{ LS_OPAQUE_GRACE_TLV_REASON_SW_RESTART,  "Software Restart" },	{ LS_OPAQUE_GRACE_TLV_REASON_SW_UPGRADE,  "Software Reload/Upgrade" },	{ LS_OPAQUE_GRACE_TLV_REASON_CP_SWITCH,   "Control Processor Switch" },	{ 0,		        NULL }};static struct tok lsa_opaque_te_tlv_link_type_sub_tlv_values[] = {	{ LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE_PTP, "Point-to-point" },	{ LS_OPAQUE_TE_LINK_SUBTLV_LINK_TYPE_MA,  "Multi-Access" },	{ 0,			NULL }};static struct tok lsa_opaque_ri_tlv_values[] = {	{ LS_OPAQUE_RI_TLV_CAP, "Router Capabilities" },	{ 0,		        NULL }};static struct tok lsa_opaque_ri_tlv_cap_values[] = {	{ 1, "Reserved" },	{ 2, "Reserved" },	{ 4, "Reserved" },	{ 8, "Reserved" },	{ 16, "graceful restart capable" },	{ 32, "graceful restart helper" },	{ 64, "Stub router support" },	{ 128, "Traffic engineering" },	{ 256, "p2p over LAN" },	{ 512, "path computation server" },	{ 0,		        NULL }};static struct tok ospf_lls_tlv_values[] = {	{ OSPF_LLS_EO,	"Extended Options" },	{ OSPF_LLS_MD5,	"MD5 Authentication" },	{ 0,	NULL }};static struct tok ospf_lls_eo_options[] = {	{ OSPF_LLS_EO_LR,	"LSDB resync" },	{ OSPF_LLS_EO_RS,	"Restart" },	{ 0,	NULL }};static char tstr[] = " [|ospf2]";#ifdef WIN32#define inline __inline#endif /* WIN32 */static int ospf_print_lshdr(const struct lsa_hdr *);static const u_char *ospf_print_lsa(const struct lsa *);static int ospf_decode_v2(const struct ospfhdr *, const u_char *);static int ospf_decode_lls(const struct ospfhdr *, register u_int);intospf_print_grace_lsa (u_int8_t *tptr, u_int ls_length) {    u_int tlv_type, tlv_length;    while (ls_length > 0) {        TCHECK2(*tptr, 4);        if (ls_length < 4) {            printf("\n\t    Remaining LS length %u < 4", ls_length);            return -1;        }        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_grace_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 -1;        }        /* Infinite loop protection. */        if (tlv_type == 0 || tlv_length ==0) {            return -1;        }        TCHECK2(*tptr, tlv_length);        switch(tlv_type) {        case LS_OPAQUE_GRACE_TLV_PERIOD:            if (tlv_length != 4) {                printf("\n\t    Bogus length %u != 4", tlv_length);                return -1;            }            printf("%us",EXTRACT_32BITS(tptr));            break;        case LS_OPAQUE_GRACE_TLV_REASON:            if (tlv_length != 1) {                printf("\n\t    Bogus length %u != 1", tlv_length);                return -1;            }            printf("%s (%u)",                   tok2str(lsa_opaque_grace_tlv_reason_values, "Unknown", *tptr),                   *tptr);            break;        case LS_OPAQUE_GRACE_TLV_INT_ADDRESS:            if (tlv_length != 4) {                printf("\n\t    Bogus length %u != 4", tlv_length);                return -1;            }            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;}intospf_print_te_lsa (u_int8_t *tptr, u_int ls_length) {    u_int tlv_type, tlv_length, subtlv_type, subtlv_length;    u_int priority_level, te_class, count_srlg;    union { /* int to float conversion buffer for several subTLVs */        float f;         u_int32_t i;    } bw;    while (ls_length != 0) {        TCHECK2(*tptr, 4);        if (ls_length < 4) {            printf("\n\t    Remaining LS length %u < 4", ls_length);            return -1;        }        tlv_type = EXTRACT_16BITS(tptr);        tlv_length = EXTRACT_16BITS(tptr+2);        tptr+=4;        ls_length-=4;                            printf("\n\t    %s TLV (%u), length: %u",               tok2str(lsa_opaque_te_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 -1;        }        /* Infinite loop protection. */        if (tlv_type == 0 || tlv_length ==0) {            return -1;        }        switch(tlv_type) {        case LS_OPAQUE_TE_TLV_LINK:            while (tlv_length >= sizeof(subtlv_type) + sizeof(subtlv_length)) {                if (tlv_length < 4) {                    printf("\n\t    Remaining TLV length %u < 4",                           tlv_length);                    return -1;                }                TCHECK2(*tptr, 4);                subtlv_type = EXTRACT_16BITS(tptr);                subtlv_length = EXTRACT_16BITS(tptr+2);                tptr+=4;                tlv_length-=4;                                            printf("\n\t      %s subTLV (%u), length: %u",                       tok2str(lsa_opaque_te_link_tlv_subtlv_values,"unknown",subtlv_type),                       subtlv_type,                       subtlv_length);                                            TCHECK2(*tptr, subtlv_length);                switch(subtlv_type) {                case LS_OPAQUE_TE_LINK_SUBTLV_ADMIN_GROUP:                    printf(", 0x%08x", EXTRACT_32BITS(tptr));                    break;                case LS_OPAQUE_TE_LINK_SUBTLV_LINK_ID:                case LS_OPAQUE_TE_LINK_SUBTLV_LINK_LOCAL_REMOTE_ID:                    printf(", %s (0x%08x)",                           ipaddr_string(tptr),                           EXTRACT_32BITS(tptr));                    if (subtlv_length == 8) /* rfc4203 */                        printf(", %s (0x%08x)",                               ipaddr_string(tptr+4),                               EXTRACT_32BITS(tptr+4));                    break;                case LS_OPAQUE_TE_LINK_SUBTLV_LOCAL_IP:                case LS_OPAQUE_TE_LINK_SUBTLV_REMOTE_IP:                    printf(", %s", ipaddr_string(tptr));                    break;                case LS_OPAQUE_TE_LINK_SUBTLV_MAX_BW:                case LS_OPAQUE_TE_LINK_SUBTLV_MAX_RES_BW:                    bw.i = EXTRACT_32BITS(tptr);                    printf(", %.3f Mbps", bw.f*8/1000000 );                    break;                case LS_OPAQUE_TE_LINK_SUBTLV_UNRES_BW:                    for (te_class = 0; te_class < 8; te_class++) {                        bw.i = EXTRACT_32BITS(tptr+te_class*4);                        printf("\n\t\tTE-Class %u: %.3f Mbps",                               te_class,                               bw.f*8/1000000 );                    }                    break;                case LS_OPAQUE_TE_LINK_SUBTLV_BW_CONSTRAINTS:                    printf("\n\t\tBandwidth Constraints Model ID: %s (%u)",                           tok2str(diffserv_te_bc_values, "unknown", *tptr),                           *tptr);                    /* decode BCs until the subTLV ends */                    for (te_class = 0; te_class < (subtlv_length-4)/4; te_class++) {                        bw.i = EXTRACT_32BITS(tptr+4+te_class*4);                        printf("\n\t\t  Bandwidth constraint CT%u: %.3f Mbps",                               te_class,                               bw.f*8/1000000 );                    }                    break;                case LS_OPAQUE_TE_LINK_SUBTLV_TE_METRIC:                    printf(", Metric %u", EXTRACT_32BITS(tptr));                    break;                case LS_OPAQUE_TE_LINK_SUBTLV_LINK_PROTECTION_TYPE:                    printf(", %s, Priority %u",                           bittok2str(gmpls_link_prot_values, "none", *tptr),

⌨️ 快捷键说明

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