print-bgp.c

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

C
1,792
字号
    { SAFNUM_RES,               "Reserved"},    { SAFNUM_UNICAST,           "Unicast"},    { SAFNUM_MULTICAST,         "Multicast"},    { SAFNUM_UNIMULTICAST,      "Unicast+Multicast"},    { SAFNUM_LABUNICAST,        "labeled Unicast"},    { SAFNUM_TUNNEL,            "Tunnel"},    { SAFNUM_VPLS,              "VPLS"},    { SAFNUM_MDT,               "MDT"},    { SAFNUM_VPNUNICAST,        "labeled VPN Unicast"},    { SAFNUM_VPNMULTICAST,      "labeled VPN Multicast"},    { SAFNUM_VPNUNIMULTICAST,   "labeled VPN Unicast+Multicast"},    { SAFNUM_RT_ROUTING_INFO,   "Route Target Routing Information"},    { SAFNUM_MULTICAST_VPN,     "Multicast VPN"},    { 0, NULL }};/* well-known community */#define BGP_COMMUNITY_NO_EXPORT			0xffffff01#define BGP_COMMUNITY_NO_ADVERT			0xffffff02#define BGP_COMMUNITY_NO_EXPORT_SUBCONFED	0xffffff03/* Extended community type - draft-ietf-idr-bgp-ext-communities-05 */#define BGP_EXT_COM_RT_0        0x0002  /* Route Target,Format AS(2bytes):AN(4bytes) */#define BGP_EXT_COM_RT_1        0x0102  /* Route Target,Format IP address:AN(2bytes) */#define BGP_EXT_COM_RT_2        0x0202  /* Route Target,Format AN(4bytes):local(2bytes) */#define BGP_EXT_COM_RO_0        0x0003  /* Route Origin,Format AS(2bytes):AN(4bytes) */#define BGP_EXT_COM_RO_1        0x0103  /* Route Origin,Format IP address:AN(2bytes) */#define BGP_EXT_COM_RO_2        0x0203  /* Route Origin,Format AN(4bytes):local(2bytes) */#define BGP_EXT_COM_LINKBAND    0x4004  /* Link Bandwidth,Format AS(2B):Bandwidth(4B) */                                        /* rfc2547 bgp-mpls-vpns */#define BGP_EXT_COM_VPN_ORIGIN  0x0005  /* OSPF Domain ID / VPN of Origin  - draft-rosen-vpns-ospf-bgp-mpls */#define BGP_EXT_COM_VPN_ORIGIN2 0x0105  /* duplicate - keep for backwards compatability */#define BGP_EXT_COM_VPN_ORIGIN3 0x0205  /* duplicate - keep for backwards compatability */#define BGP_EXT_COM_VPN_ORIGIN4 0x8005  /* duplicate - keep for backwards compatability */#define BGP_EXT_COM_OSPF_RTYPE  0x0306  /* OSPF Route Type,Format Area(4B):RouteType(1B):Options(1B) */#define BGP_EXT_COM_OSPF_RTYPE2 0x8000  /* duplicate - keep for backwards compatability */#define BGP_EXT_COM_OSPF_RID    0x0107  /* OSPF Router ID,Format RouterID(4B):Unused(2B) */#define BGP_EXT_COM_OSPF_RID2   0x8001  /* duplicate - keep for backwards compatability */ #define BGP_EXT_COM_L2INFO      0x800a  /* draft-kompella-ppvpn-l2vpn */#define BGP_EXT_COM_SOURCE_AS   0x0009  /* draft-ietf-l3vpn-2547bis-mcast-bgp-02.txt */#define BGP_EXT_COM_VRF_RT_IMP  0x010a  /* draft-ietf-l3vpn-2547bis-mcast-bgp-02.txt *//* http://www.cisco.com/en/US/tech/tk436/tk428/technologies_tech_note09186a00801eb09a.shtml  */#define BGP_EXT_COM_EIGRP_GEN   0x8800#define BGP_EXT_COM_EIGRP_METRIC_AS_DELAY  0x8801#define BGP_EXT_COM_EIGRP_METRIC_REL_NH_BW 0x8802#define BGP_EXT_COM_EIGRP_METRIC_LOAD_MTU  0x8803#define BGP_EXT_COM_EIGRP_EXT_REMAS_REMID  0x8804#define BGP_EXT_COM_EIGRP_EXT_REMPROTO_REMMETRIC 0x8805static struct tok bgp_extd_comm_flag_values[] = {    { 0x8000,                  "vendor-specific"},    { 0x4000,                  "non-transitive"},    { 0, NULL},};static struct tok bgp_extd_comm_subtype_values[] = {    { BGP_EXT_COM_RT_0,        "target"},    { BGP_EXT_COM_RT_1,        "target"},    { BGP_EXT_COM_RT_2,        "target"},    { BGP_EXT_COM_RO_0,        "origin"},    { BGP_EXT_COM_RO_1,        "origin"},    { BGP_EXT_COM_RO_2,        "origin"},    { BGP_EXT_COM_LINKBAND,    "link-BW"},    { BGP_EXT_COM_VPN_ORIGIN,  "ospf-domain"},    { BGP_EXT_COM_VPN_ORIGIN2, "ospf-domain"},    { BGP_EXT_COM_VPN_ORIGIN3, "ospf-domain"},    { BGP_EXT_COM_VPN_ORIGIN4, "ospf-domain"},    { BGP_EXT_COM_OSPF_RTYPE,  "ospf-route-type"},    { BGP_EXT_COM_OSPF_RTYPE2, "ospf-route-type"},    { BGP_EXT_COM_OSPF_RID,    "ospf-router-id"},    { BGP_EXT_COM_OSPF_RID2,   "ospf-router-id"},    { BGP_EXT_COM_L2INFO,      "layer2-info"},     { BGP_EXT_COM_EIGRP_GEN , "eigrp-general-route (flag, tag)" },    { BGP_EXT_COM_EIGRP_METRIC_AS_DELAY , "eigrp-route-metric (AS, delay)" },    { BGP_EXT_COM_EIGRP_METRIC_REL_NH_BW , "eigrp-route-metric (reliability, nexthop, bandwidth)" },    { BGP_EXT_COM_EIGRP_METRIC_LOAD_MTU , "eigrp-route-metric (load, MTU)" },    { BGP_EXT_COM_EIGRP_EXT_REMAS_REMID , "eigrp-external-route (remote-AS, remote-ID)" },    { BGP_EXT_COM_EIGRP_EXT_REMPROTO_REMMETRIC , "eigrp-external-route (remote-proto, remote-metric)" },    { BGP_EXT_COM_SOURCE_AS, "source-AS" },    { BGP_EXT_COM_VRF_RT_IMP, "vrf-route-import"},    { 0, NULL},};/* OSPF codes for  BGP_EXT_COM_OSPF_RTYPE draft-rosen-vpns-ospf-bgp-mpls  */#define BGP_OSPF_RTYPE_RTR      1 /* OSPF Router LSA */#define BGP_OSPF_RTYPE_NET      2 /* OSPF Network LSA */#define BGP_OSPF_RTYPE_SUM      3 /* OSPF Summary LSA */#define BGP_OSPF_RTYPE_EXT      5 /* OSPF External LSA, note that ASBR doesn't apply to MPLS-VPN */#define BGP_OSPF_RTYPE_NSSA     7 /* OSPF NSSA External*/#define BGP_OSPF_RTYPE_SHAM     129 /* OSPF-MPLS-VPN Sham link */#define BGP_OSPF_RTYPE_METRIC_TYPE 0x1 /* LSB of RTYPE Options Field */static struct tok bgp_extd_comm_ospf_rtype_values[] = {  { BGP_OSPF_RTYPE_RTR, "Router" },    { BGP_OSPF_RTYPE_NET, "Network" },    { BGP_OSPF_RTYPE_SUM, "Summary" },    { BGP_OSPF_RTYPE_EXT, "External" },    { BGP_OSPF_RTYPE_NSSA,"NSSA External" },  { BGP_OSPF_RTYPE_SHAM,"MPLS-VPN Sham" },    { 0, NULL },};intdecode_prefix4(const u_char *pptr, char *buf, u_int buflen){	struct in_addr addr;	u_int plen;	TCHECK(pptr[0]);	plen = pptr[0];	if (32 < plen)		return -1;	memset(&addr, 0, sizeof(addr));	TCHECK2(pptr[1], (plen + 7) / 8);	memcpy(&addr, &pptr[1], (plen + 7) / 8);	if (plen % 8) {		((u_char *)&addr)[(plen + 7) / 8 - 1] &=			((0xff00 >> (plen % 8)) & 0xff);	}	snprintf(buf, buflen, "%s/%d", getname((u_char *)&addr), plen);	return 1 + (plen + 7) / 8;trunc:	return -2;}static intdecode_labeled_prefix4(const u_char *pptr, char *buf, u_int buflen){	struct in_addr addr;	u_int plen;	TCHECK(pptr[0]);	plen = pptr[0];   /* get prefix length */        /* this is one of the weirdnesses of rfc3107           the label length (actually the label + COS bits)           is added to the prefix length;           we also do only read out just one label -           there is no real application for advertisement of           stacked labels in a a single BGP message        */	if (24 > plen)		return -1;        plen-=24; /* adjust prefixlen - labellength */	if (32 < plen)		return -1;	memset(&addr, 0, sizeof(addr));	TCHECK2(pptr[4], (plen + 7) / 8);	memcpy(&addr, &pptr[4], (plen + 7) / 8);	if (plen % 8) {		((u_char *)&addr)[(plen + 7) / 8 - 1] &=			((0xff00 >> (plen % 8)) & 0xff);	}        /* the label may get offsetted by 4 bits so lets shift it right */	snprintf(buf, buflen, "%s/%d, label:%u %s",                 getname((u_char *)&addr),                 plen,                 EXTRACT_24BITS(pptr+1)>>4,                 ((pptr[3]&1)==0) ? "(BOGUS: Bottom of Stack NOT set!)" : "(bottom)" );	return 4 + (plen + 7) / 8;trunc:	return -2;}/* * bgp_vpn_ip_print * * print an ipv4 or ipv6 address into a buffer dependend on address length. */static char *bgp_vpn_ip_print (const u_char *pptr, u_int addr_length) {    /* worst case string is s fully formatted v6 address */    static char addr[sizeof("1234:5678:89ab:cdef:1234:5678:89ab:cdef")];    char *pos = addr;    switch(addr_length) {    case (sizeof(struct in_addr) << 3): /* 32 */        TCHECK2(pptr[0], sizeof(struct in_addr));        snprintf(pos, sizeof(addr), "%s", ipaddr_string(pptr));        break;#ifdef INET6    case (sizeof(struct in6_addr) << 3): /* 128 */        TCHECK2(pptr[0], sizeof(struct in6_addr));        snprintf(pos, sizeof(addr), "%s", ip6addr_string(pptr));        break;#endif    default:        snprintf(pos, sizeof(addr), "bogus address length %u", addr_length);        break;    }    pos += strlen(pos);trunc:    *(pos) = '\0';    return (addr);}/* * bgp_vpn_sg_print * * print an multicast s,g entry into a buffer. * the s,g entry is encoded like this. * * +-----------------------------------+ * | Multicast Source Length (1 octet) | * +-----------------------------------+ * |   Multicast Source (Variable)     | * +-----------------------------------+ * |  Multicast Group Length (1 octet) | * +-----------------------------------+ * |  Multicast Group   (Variable)     | * +-----------------------------------+ * * return the number of bytes read from the wire. */static intbgp_vpn_sg_print (const u_char *pptr, char *buf, u_int buflen) {    u_int8_t addr_length;    u_int total_length, offset;    total_length = 0;    /* Source address length, encoded in bits */    TCHECK2(pptr[0], 1);    addr_length =  *pptr++;    /* Source address */    TCHECK2(pptr[0], (addr_length >> 3));    total_length += (addr_length >> 3) + 1;    offset = strlen(buf);    if (addr_length) {        snprintf(buf + offset, buflen - offset, ", Source %s",                 bgp_vpn_ip_print(pptr, addr_length));        pptr += (addr_length >> 3);    }        /* Group address length, encoded in bits */    TCHECK2(pptr[0], 1);    addr_length =  *pptr++;    /* Group address */    TCHECK2(pptr[0], (addr_length >> 3));    total_length += (addr_length >> 3) + 1;    offset = strlen(buf);    if (addr_length) {        snprintf(buf + offset, buflen - offset, ", Group %s",                 bgp_vpn_ip_print(pptr, addr_length));        pptr += (addr_length >> 3);    }trunc:    return (total_length);}/* RDs and RTs share the same semantics * we use bgp_vpn_rd_print for * printing route targets inside a NLRI */char *bgp_vpn_rd_print (const u_char *pptr) {   /* allocate space for the largest possible string */    static char rd[sizeof("xxxxxxxxxx:xxxxx (xxx.xxx.xxx.xxx:xxxxx)")];    char *pos = rd;    /* ok lets load the RD format */    switch (EXTRACT_16BITS(pptr)) {        /* 2-byte-AS:number fmt*/    case 0:        snprintf(pos, sizeof(rd) - (pos - rd), "%u:%u (= %u.%u.%u.%u)",                 EXTRACT_16BITS(pptr+2),                 EXTRACT_32BITS(pptr+4),                 *(pptr+4), *(pptr+5), *(pptr+6), *(pptr+7));        break;        /* IP-address:AS fmt*/    case 1:        snprintf(pos, sizeof(rd) - (pos - rd), "%u.%u.%u.%u:%u",            *(pptr+2), *(pptr+3), *(pptr+4), *(pptr+5), EXTRACT_16BITS(pptr+6));        break;        /* 4-byte-AS:number fmt*/    case 2:        snprintf(pos, sizeof(rd) - (pos - rd), "%u:%u (%u.%u.%u.%u:%u)",            EXTRACT_32BITS(pptr+2), EXTRACT_16BITS(pptr+6),            *(pptr+2), *(pptr+3), *(pptr+4), *(pptr+5), EXTRACT_16BITS(pptr+6));        break;    default:        snprintf(pos, sizeof(rd) - (pos - rd), "unknown RD format");        break;    }    pos += strlen(pos);    *(pos) = '\0';    return (rd);}static intdecode_rt_routing_info(const u_char *pptr, char *buf, u_int buflen){	u_int8_t route_target[8];	u_int plen;	TCHECK(pptr[0]);	plen = pptr[0];   /* get prefix length */	if (0 == plen)		return 1; /* default route target */	if (32 > plen)		return -1;        plen-=32; /* adjust prefix length */	if (64 < plen)		return -1;	memset(&route_target, 0, sizeof(route_target));	TCHECK2(pptr[1], (plen + 7) / 8);	memcpy(&route_target, &pptr[1], (plen + 7) / 8);	if (plen % 8) {		((u_char *)&route_target)[(plen + 7) / 8 - 1] &=			((0xff00 >> (plen % 8)) & 0xff);	}	snprintf(buf, buflen, "origin AS: %u, route target %s",                 EXTRACT_32BITS(pptr+1),                 bgp_vpn_rd_print((u_char *)&route_target));	return 5 + (plen + 7) / 8;trunc:	return -2;}static intdecode_labeled_vpn_prefix4(const u_char *pptr, char *buf, u_int buflen){	struct in_addr addr;	u_int plen;	TCHECK(pptr[0]);	plen = pptr[0];   /* get prefix length */	if ((24+64) > plen)

⌨️ 快捷键说明

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