📄 print-bgp.c
字号:
case BGP_COMMUNITY_NO_EXPORT: printf(" NO_EXPORT"); break; case BGP_COMMUNITY_NO_ADVERT: printf(" NO_ADVERTISE"); break; case BGP_COMMUNITY_NO_EXPORT_SUBCONFED: printf(" NO_EXPORT_SUBCONFED"); break; default: printf(" (AS #%d value 0x%04x)", (comm >> 16) & 0xffff, comm & 0xffff); break; } } break; case BGPTYPE_MP_REACH_NLRI: af = ntohs(*(u_int16_t *)p); safi = p[2]; if (safi >= 128) printf(" %s vendor specific,", af_name(af)); else { printf(" %s %s,", af_name(af), bgp_attr_nlri_safi(safi)); } p += 3; if (af == AFNUM_INET) ;#ifdef INET6 else if (af == AFNUM_INET6) ;#endif else break; tlen = p[0]; if (tlen) { printf(" nexthop"); i = 0; while (i < tlen) { switch (af) { case AFNUM_INET: printf(" %s", getname(p + 1 + i)); i += sizeof(struct in_addr); break;#ifdef INET6 case AFNUM_INET6: printf(" %s", getname6(p + 1 + i)); i += sizeof(struct in6_addr); break;#endif default: printf(" (unknown af)"); i = tlen; /*exit loop*/ break; } } printf(","); } p += 1 + tlen; snpa = p[0]; p++; if (snpa) { printf(" %u snpa", snpa); for (/*nothing*/; snpa > 0; snpa--) { printf("(%d bytes)", p[0]); p += p[0] + 1; } printf(","); } printf(" NLRI"); while (len - (p - dat) > 0) { switch (af) { case AFNUM_INET: advance = decode_prefix4(p, buf, sizeof(buf)); printf(" %s", buf); break;#ifdef INET6 case AFNUM_INET6: advance = decode_prefix6(p, buf, sizeof(buf)); printf(" %s", buf); break;#endif default: printf(" (unknown af)"); advance = 0; p = dat + len; break; } p += advance; } break; case BGPTYPE_MP_UNREACH_NLRI: af = ntohs(*(u_int16_t *)p); safi = p[2]; if (safi >= 128) printf(" %s vendor specific,", af_name(af)); else { printf(" %s %s,", af_name(af), bgp_attr_nlri_safi(safi)); } p += 3; printf(" Withdraw"); while (len - (p - dat) > 0) { switch (af) { case AFNUM_INET: advance = decode_prefix4(p, buf, sizeof(buf)); printf(" %s", buf); break;#ifdef INET6 case AFNUM_INET6: advance = decode_prefix6(p, buf, sizeof(buf)); printf(" %s", buf); break;#endif default: printf(" (unknown af)"); advance = 0; p = dat + len; break; } p += advance; } break; default: break; }}static voidbgp_open_print(const u_char *dat, int length){ struct bgp_open bgpo; struct bgp_opt bgpopt; int hlen; const u_char *opt; int i; TCHECK2(dat[0], sizeof(bgpo)); memcpy(&bgpo, dat, sizeof(bgpo)); hlen = ntohs(bgpo.bgpo_len); printf(": Version %d,", bgpo.bgpo_version); printf(" AS #%u,", ntohs(bgpo.bgpo_myas)); printf(" Holdtime %u,", ntohs(bgpo.bgpo_holdtime)); printf(" ID %s,", getname((u_char *)&bgpo.bgpo_id)); printf(" Option length %u", bgpo.bgpo_optlen); /* ugly! */ opt = &((struct bgp_open *)dat)->bgpo_optlen; opt++; for (i = 0; i < bgpo.bgpo_optlen; i++) { memcpy(&bgpopt, &opt[i], sizeof(bgpopt)); if (i + 2 + bgpopt.bgpopt_len > bgpo.bgpo_optlen) { printf(" [|opt %d %d]", bgpopt.bgpopt_len, bgpopt.bgpopt_type); break; } printf(" (option %s, len=%d)", bgp_opttype(bgpopt.bgpopt_type), bgpopt.bgpopt_len); i += sizeof(bgpopt) + bgpopt.bgpopt_len; } return;trunc: printf("[|BGP]");}static voidbgp_update_print(const u_char *dat, int length){ struct bgp bgp; struct bgp_attr bgpa; int hlen; const u_char *p; int len; int i; int newline; TCHECK2(dat[0], sizeof(bgp)); memcpy(&bgp, dat, sizeof(bgp)); hlen = ntohs(bgp.bgp_len); p = dat + BGP_SIZE; /*XXX*/ printf(":"); /* Unfeasible routes */ len = EXTRACT_16BITS(p); if (len) { /* Without keeping state from the original NLRI message, * it's not possible to tell if this a v4 or v6 route, * so only try to decode it if we're not v6 enabled. */#ifdef INET6 printf(" (Withdrawn routes: %d bytes)", len);#else char buf[MAXHOSTNAMELEN + 100]; TCHECK2(p[2], len); i = 2; printf(" (Withdrawn routes:"); while(i < 2 + len) { i += decode_prefix4(&p[i], buf, sizeof(buf)); printf(" %s", buf); } printf(")\n");#endif } p += 2 + len; TCHECK2(p[0], 2); len = EXTRACT_16BITS(p); if (len) { /* do something more useful!*/ i = 2; printf(" (Path attributes:"); /* ) */ newline = 0; while (i < 2 + len) { int alen, aoff; TCHECK2(p[i], sizeof(bgpa)); memcpy(&bgpa, &p[i], sizeof(bgpa)); alen = bgp_attr_len(&bgpa); aoff = bgp_attr_off(&bgpa); if (vflag && newline) printf("\n\t\t"); else printf(" "); printf("("); /* ) */ printf("%s", bgp_attr_type(bgpa.bgpa_type)); if (bgpa.bgpa_flags) { printf("[%s%s%s%s", bgpa.bgpa_flags & 0x80 ? "O" : "", bgpa.bgpa_flags & 0x40 ? "T" : "", bgpa.bgpa_flags & 0x20 ? "P" : "", bgpa.bgpa_flags & 0x10 ? "E" : ""); if (bgpa.bgpa_flags & 0xf) printf("+%x", bgpa.bgpa_flags & 0xf); printf("]"); } bgp_attr_print(&bgpa, &p[i + aoff], alen); newline = 1; /* ( */ printf(")"); i += aoff + alen; } /* ( */ printf(")"); } p += 2 + len; if (len && dat + length > p) printf("\n\t\t"); if (dat + length > p) { printf("(NLRI:"); /* ) */ while (dat + length > p) { char buf[MAXHOSTNAMELEN + 100]; i = decode_prefix4(p, buf, sizeof(buf)); printf(" %s", buf); if (i < 0) break; p += i; } /* ( */ printf(")"); } return;trunc: printf("[|BGP]");}static voidbgp_notification_print(const u_char *dat, int length){ struct bgp_notification bgpn; int hlen; TCHECK2(dat[0], sizeof(bgpn)); memcpy(&bgpn, dat, sizeof(bgpn)); hlen = ntohs(bgpn.bgpn_len); printf(": error %s,", bgp_notify_major(bgpn.bgpn_major)); printf(" subcode %s", bgp_notify_minor(bgpn.bgpn_major, bgpn.bgpn_minor)); return;trunc: printf("[|BGP]");}static voidbgp_header_print(const u_char *dat, int length){ struct bgp bgp; TCHECK2(dat[0], sizeof(bgp)); memcpy(&bgp, dat, sizeof(bgp)); printf("(%s", bgp_type(bgp.bgp_type)); /* ) */ switch (bgp.bgp_type) { case BGP_OPEN: bgp_open_print(dat, length); break; case BGP_UPDATE: bgp_update_print(dat, length); break; case BGP_NOTIFICATION: bgp_notification_print(dat, length); break; } /* ( */ printf(")"); return;trunc: printf("[|BGP]");}voidbgp_print(const u_char *dat, int length){ const u_char *p; const u_char *ep; const u_char *start; const u_char marker[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, }; struct bgp bgp; u_int16_t hlen; int newline; ep = dat + length; if (snapend < dat + length) ep = snapend; printf(": BGP"); p = dat; newline = 0; start = p; while (p < snapend) { if (!TTEST2(p[0], 1)) break; if (p[0] != 0xff) { p++; continue; } if (!TTEST2(p[0], sizeof(marker))) break; if (memcmp(p, marker, sizeof(marker)) != 0) { p++; continue; } /* found BGP header */ TCHECK2(p[0], sizeof(bgp)); /*XXX*/ memcpy(&bgp, p, sizeof(bgp)); if (start != p) printf(" [|BGP]"); hlen = ntohs(bgp.bgp_len); if (vflag && newline) printf("\n\t"); else printf(" "); if (TTEST2(p[0], hlen)) { bgp_header_print(p, hlen); newline = 1; p += hlen; start = p; } else { printf("[|BGP %s]", bgp_type(bgp.bgp_type)); break; } } return;trunc: printf(" [|BGP]");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -