- u_int8_t extd_comm,extd_comm_type,extd_comm_subtype;
- extd_comm=*tptr;
- extd_comm_type=extd_comm&0x3f;
- extd_comm_subtype=*(tptr+1);
- switch(extd_comm_type) {
- case 0:
- printf("%s%s%s:%u:%s%s",
- (extd_comm&0x80) ? "vendor-specific: " : "",
- (extd_comm&0x40) ? "non-transitive:" : "",
- tok2str(bgp_extd_comm_subtype_values,
- "unknown",
- extd_comm_subtype&0x3f),
- EXTRACT_16BITS(tptr+2),
- getname(tptr+4),
- (tlen>8) ? ", " : "");
- break;
- case 1:
- printf("%s%s%s:%s:%u%s",
- (extd_comm&0x80) ? "vendor-specific: " : "",
- (extd_comm&0x40) ? "non-transitive:" : "",
- tok2str(bgp_extd_comm_subtype_values,
- "unknown",
- extd_comm_subtype&0x3f),
- getname(tptr+2),
- EXTRACT_16BITS(tptr+6),
- (tlen>8) ? ", " : "");
- break;
- case 2:
- printf("%s%s%s:%u:%u%s",
- (extd_comm&0x80) ? "vendor-specific: " : "",
- (extd_comm&0x40) ? "non-transitive:" : "",
- tok2str(bgp_extd_comm_subtype_values,
- "unknown",
- extd_comm_subtype&0x3f),
- EXTRACT_32BITS(tptr+2),
- EXTRACT_16BITS(tptr+6),
- (tlen>8) ? ", " : "");
- break;
-
- default:
- printf("\n\t no typecode %u decoder",
- extd_comm_type);
- print_unknown_data(tptr,"\n\t ",8);
- break;
+ u_int16_t extd_comm;
+
+ TCHECK2(tptr[0], 2);
+ extd_comm=EXTRACT_16BITS(tptr);
+
+ printf("\n\t %s (0x%04x), Flags [%s]",
+ tok2strbuf(bgp_extd_comm_subtype_values,
+ "unknown extd community typecode",
+ extd_comm, tokbuf, sizeof(tokbuf)),
+ extd_comm,
+ bittok2str(bgp_extd_comm_flag_values, "none", extd_comm));
+
+ TCHECK2(*(tptr+2), 6);
+ switch(extd_comm) {
+ case BGP_EXT_COM_RT_0:
+ case BGP_EXT_COM_RO_0:
+ printf(": %u:%s",
+ EXTRACT_16BITS(tptr+2),
+ getname(tptr+4));
+ break;
+ case BGP_EXT_COM_RT_1:
+ case BGP_EXT_COM_RO_1:
+ printf(": %s:%u",
+ getname(tptr+2),
+ EXTRACT_16BITS(tptr+6));
+ break;
+ case BGP_EXT_COM_RT_2:
+ case BGP_EXT_COM_RO_2:
+ printf(": %u:%u",
+ EXTRACT_32BITS(tptr+2),
+ EXTRACT_16BITS(tptr+6));
+ break;
+ case BGP_EXT_COM_LINKBAND:
+ bw.i = EXTRACT_32BITS(tptr+2);
+ printf(": bandwidth: %.3f Mbps",
+ bw.f*8/1000000);
+ break;
+ case BGP_EXT_COM_CISCO_MCAST:
+ printf(": AS %u, group %s",
+ EXTRACT_16BITS(tptr+2),
+ getname(tptr+4));
+ break;
+ case BGP_EXT_COM_VPN_ORIGIN:
+ case BGP_EXT_COM_VPN_ORIGIN2:
+ case BGP_EXT_COM_VPN_ORIGIN3:
+ case BGP_EXT_COM_VPN_ORIGIN4:
+ case BGP_EXT_COM_OSPF_RID:
+ case BGP_EXT_COM_OSPF_RID2:
+ printf("%s", getname(tptr+2));
+ break;
+ case BGP_EXT_COM_OSPF_RTYPE:
+ case BGP_EXT_COM_OSPF_RTYPE2:
+ printf(": area:%s, router-type:%s, metric-type:%s%s",
+ getname(tptr+2),
+ tok2strbuf(bgp_extd_comm_ospf_rtype_values,
+ "unknown (0x%02x)",
+ *(tptr+6),
+ tokbuf, sizeof(tokbuf)),
+ (*(tptr+7) & BGP_OSPF_RTYPE_METRIC_TYPE) ? "E2" : "",
+ (*(tptr+6) == (BGP_OSPF_RTYPE_EXT ||BGP_OSPF_RTYPE_NSSA )) ? "E1" : "");
+ break;
+ case BGP_EXT_COM_L2INFO:
+ printf(": %s Control Flags [0x%02x]:MTU %u",
+ tok2strbuf(l2vpn_encaps_values,
+ "unknown encaps",
+ *(tptr+2),
+ tokbuf, sizeof(tokbuf)),
+ *(tptr+3),
+ EXTRACT_16BITS(tptr+4));
+ break;
+ default:
+ TCHECK2(*tptr,8);
+ print_unknown_data(tptr,"\n\t ",8);
+ break;