- /* does the header run past the end of the sample? */
- if (sflow_sample_len < sizeof(struct sflow_expanded_counter_sample_t))
- goto trunc;
-
- sflow_expanded_counter_sample = (const struct sflow_expanded_counter_sample_t *)tptr;
- nrecords = EXTRACT_32BITS(sflow_expanded_counter_sample->records);
-
- printf(" seqnum %u, type %u, idx %u, records %u",
- EXTRACT_32BITS(sflow_expanded_counter_sample->seqnum),
- EXTRACT_32BITS(sflow_expanded_counter_sample->type),
- EXTRACT_32BITS(sflow_expanded_counter_sample->index),
- nrecords);
-
- tptr += sizeof(struct sflow_expanded_counter_sample_t);
- tlen -= sizeof(struct sflow_expanded_counter_sample_t);
- sflow_sample_len -= sizeof(struct sflow_expanded_counter_sample_t);
-
- while ( nrecords > 0 && tlen > 0) {
- if (sflow_sample_len < 8)
- goto trunc;
-
- /* decode counter record */
- counter_type = EXTRACT_32BITS(tptr)&0x0FFF;
- counter_len = EXTRACT_32BITS(tptr+4);
- printf("\n\t %s (%u) length %u",
- tok2str(sflow_counter_type_values,"Unknown",counter_type),
- counter_type,
- counter_len);
-
- tptr += 8;
- tlen -= 8;
- sflow_sample_len -= 8;
-
- /* does the counter run past the end of the sample? */
- if (sflow_sample_len < counter_len)
- goto trunc;
-
- switch(counter_type) {
- case SFLOW_COUNTER_GENERIC:
- if (counter_len < sizeof (struct sflow_generic_counter_t))
- goto trunc;
-
- sflow_gen_counter = (const struct sflow_generic_counter_t *)tptr;
- printf("\n\t ifindex %u, iftype %u, ifspeed %u, ifdirection %u (%s)",
- EXTRACT_32BITS(sflow_gen_counter->ifindex),
- EXTRACT_32BITS(sflow_gen_counter->iftype),
- EXTRACT_32BITS(sflow_gen_counter->ifspeed),
- EXTRACT_32BITS(sflow_gen_counter->ifdirection),
- tok2str(sflow_iface_direction_values, "Unknown",
- EXTRACT_32BITS(sflow_gen_counter->ifdirection)));
- printf("\n\t ifstatus %u, adminstatus: %s, operstatus: %s",
- EXTRACT_32BITS(sflow_gen_counter->ifstatus),
- EXTRACT_32BITS(sflow_gen_counter->ifstatus)&1 ? "up" : "down",
- (EXTRACT_32BITS(sflow_gen_counter->ifstatus)>>1)&1 ? "up" : "down");
- printf("\n\t In octets %" PRIu64
- ", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u",
- EXTRACT_64BITS(sflow_gen_counter->ifinoctets),
- EXTRACT_32BITS(sflow_gen_counter->ifinunicastpkts),
- EXTRACT_32BITS(sflow_gen_counter->ifinmulticastpkts),
- EXTRACT_32BITS(sflow_gen_counter->ifinbroadcastpkts),
- EXTRACT_32BITS(sflow_gen_counter->ifindiscards));
- printf("\n\t In errors %u, unknown protos %u",
- EXTRACT_32BITS(sflow_gen_counter->ifinerrors),
- EXTRACT_32BITS(sflow_gen_counter->ifinunkownprotos));
- printf("\n\t Out octets %" PRIu64
- ", unicast pkts %u, multicast pkts %u, broadcast pkts %u, discards %u",
- EXTRACT_64BITS(sflow_gen_counter->ifoutoctets),
- EXTRACT_32BITS(sflow_gen_counter->ifoutunicastpkts),
- EXTRACT_32BITS(sflow_gen_counter->ifoutmulticastpkts),
- EXTRACT_32BITS(sflow_gen_counter->ifoutbroadcastpkts),
- EXTRACT_32BITS(sflow_gen_counter->ifoutdiscards));
- printf("\n\t Out errors %u, promisc mode %u",
- EXTRACT_32BITS(sflow_gen_counter->ifouterrors),
- EXTRACT_32BITS(sflow_gen_counter->ifpromiscmode));
- break;
-
- case SFLOW_COUNTER_ETHERNET:
- if (counter_len < sizeof (struct sflow_ethernet_counter_t))
- goto trunc;
-
- sflow_eth_counter = (const struct sflow_ethernet_counter_t *)tptr;
- printf("\n\t align errors %u, fcs errors %u, single collision %u, multiple collision %u, test error %u",
- EXTRACT_32BITS(sflow_eth_counter->alignerrors),
- EXTRACT_32BITS(sflow_eth_counter->fcserrors),
- EXTRACT_32BITS(sflow_eth_counter->single_collision_frames),
- EXTRACT_32BITS(sflow_eth_counter->multiple_collision_frames),
- EXTRACT_32BITS(sflow_eth_counter->test_errors));
- printf("\n\t deferred %u, late collision %u, excessive collision %u, mac trans error %u",
- EXTRACT_32BITS(sflow_eth_counter->deferred_transmissions),
- EXTRACT_32BITS(sflow_eth_counter->late_collisions),
- EXTRACT_32BITS(sflow_eth_counter->excessive_collisions),
- EXTRACT_32BITS(sflow_eth_counter->mac_transmit_errors));
- printf("\n\t carrier error %u, frames too long %u, mac receive errors %u, symbol errors %u",
- EXTRACT_32BITS(sflow_eth_counter->carrier_sense_errors),
- EXTRACT_32BITS(sflow_eth_counter->frame_too_longs),
- EXTRACT_32BITS(sflow_eth_counter->mac_receive_errors),
- EXTRACT_32BITS(sflow_eth_counter->symbol_errors));
- break;
-
- case SFLOW_COUNTER_TOKEN_RING: /* XXX */
- break;
-
- case SFLOW_COUNTER_BASEVG:
- if (counter_len < sizeof (struct sflow_100basevg_counter_t))
- goto trunc;
-
- sflow_100basevg_counter = (const struct sflow_100basevg_counter_t *)tptr;
- printf("\n\t in high prio frames %u, in high prio octets %" PRIu64,
- EXTRACT_32BITS(sflow_100basevg_counter->in_highpriority_frames),
- EXTRACT_64BITS(sflow_100basevg_counter->in_highpriority_octets));
- printf("\n\t in norm prio frames %u, in norm prio octets %" PRIu64,
- EXTRACT_32BITS(sflow_100basevg_counter->in_normpriority_frames),
- EXTRACT_64BITS(sflow_100basevg_counter->in_normpriority_octets));
- printf("\n\t in ipm errors %u, oversized %u, in data errors %u, null addressed frames %u",
- EXTRACT_32BITS(sflow_100basevg_counter->in_ipmerrors),
- EXTRACT_32BITS(sflow_100basevg_counter->in_oversized),
- EXTRACT_32BITS(sflow_100basevg_counter->in_data_errors),
- EXTRACT_32BITS(sflow_100basevg_counter->in_null_addressed_frames));
- printf("\n\t out high prio frames %u, out high prio octets %" PRIu64
- ", trans into frames %u",
- EXTRACT_32BITS(sflow_100basevg_counter->out_highpriority_frames),
- EXTRACT_64BITS(sflow_100basevg_counter->out_highpriority_octets),
- EXTRACT_32BITS(sflow_100basevg_counter->transitioninto_frames));
- printf("\n\t in hc high prio octets %" PRIu64
- ", in hc norm prio octets %" PRIu64
- ", out hc high prio octets %" PRIu64,
- EXTRACT_64BITS(sflow_100basevg_counter->hc_in_highpriority_octets),
- EXTRACT_64BITS(sflow_100basevg_counter->hc_in_normpriority_octets),
- EXTRACT_64BITS(sflow_100basevg_counter->hc_out_highpriority_octets));
- break;
-
- case SFLOW_COUNTER_VLAN:
- if (counter_len < sizeof (struct sflow_vlan_counter_t))
- goto trunc;
-
- sflow_vlan_counter = (const struct sflow_vlan_counter_t *)tptr;
- printf("\n\t vlan_id %u, octets %" PRIu64
- ", unicast_pkt %u, multicast_pkt %u, broadcast_pkt %u, discards %u",
- EXTRACT_32BITS(sflow_vlan_counter->vlan_id),
- EXTRACT_64BITS(sflow_vlan_counter->octets),
- EXTRACT_32BITS(sflow_vlan_counter->unicast_pkt),
- EXTRACT_32BITS(sflow_vlan_counter->multicast_pkt),
- EXTRACT_32BITS(sflow_vlan_counter->broadcast_pkt),
- EXTRACT_32BITS(sflow_vlan_counter->discards));
- break;
-
- case SFLOW_COUNTER_PROCESSOR: /* XXX */
- break;
-
- default:
- if (vflag <= 1)
- print_unknown_data(tptr, "\n\t\t", counter_len);
- break;
- }
- tptr += counter_len;
- tlen -= counter_len;
- sflow_sample_len -= counter_len;
- nrecords--;
- }
- break;