> Expose existing netdev stats via sFlow. > Export sFlow ETHERNET structure with available counters. > Map existing stats to counters in the GENERIC INTERFACE sFlow structure. > Adjust unit test to accommodate these new counters. > > Signed-off-by: Robert Wojciechowicz <[email protected]> > --- > v2: > - remove VLAN counters > --- > ofproto/ofproto-dpif-sflow.c | 27 ++++++++-- > tests/ofproto-dpif.at | 126 +++++++++++++++++++++++++++++++++++--- > ----- > tests/test-sflow.c | 26 ++++++++- > 3 files changed, 154 insertions(+), 25 deletions(-) > > diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c > index 37992b4..7ccaa3e 100644 > --- a/ofproto/ofproto-dpif-sflow.c > +++ b/ofproto/ofproto-dpif-sflow.c > @@ -298,9 +298,11 @@ sflow_agent_get_counters(void *ds_, SFLPoller > *poller, { > struct dpif_sflow *ds = ds_; > SFLCounters_sample_element elem, lacp_elem, of_elem, name_elem; > + SFLCounters_sample_element eth_elem; > enum netdev_features current; > struct dpif_sflow_port *dsp; > SFLIf_counters *counters; > + SFLEthernet_counters* eth_counters; > struct netdev_stats stats; > enum netdev_flags flags; > struct lacp_slave_stats lacp_stats; @@ -343,14 +345,14 @@ > sflow_agent_get_counters(void *ds_, SFLPoller *poller, > counters->ifInOctets = stats.rx_bytes; > counters->ifInUcastPkts = stats.rx_packets; > counters->ifInMulticastPkts = stats.multicast; > - counters->ifInBroadcastPkts = -1; > + counters->ifInBroadcastPkts = stats.rx_broadcast_packets; > counters->ifInDiscards = stats.rx_dropped; > counters->ifInErrors = stats.rx_errors; > counters->ifInUnknownProtos = -1; > counters->ifOutOctets = stats.tx_bytes; > counters->ifOutUcastPkts = stats.tx_packets; > - counters->ifOutMulticastPkts = -1; > - counters->ifOutBroadcastPkts = -1; > + counters->ifOutMulticastPkts = stats.tx_multicast_packets; > + counters->ifOutBroadcastPkts = stats.tx_broadcast_packets; > counters->ifOutDiscards = stats.tx_dropped; > counters->ifOutErrors = stats.tx_errors; > counters->ifPromiscuousMode = 0; > @@ -407,6 +409,25 @@ sflow_agent_get_counters(void *ds_, SFLPoller > *poller, > (OVS_FORCE uint32_t)dsp->ofport->ofp_port; > SFLADD_ELEMENT(cs, &of_elem); > > + /* Include ethernet counters */ > + memset(ð_elem, 0, sizeof eth_elem); > + eth_elem.tag = SFLCOUNTERS_ETHERNET; > + eth_counters = ð_elem.counterBlock.ethernet; > + eth_counters->dot3StatsAlignmentErrors = stats.rx_frame_errors; > + eth_counters->dot3StatsFCSErrors = stats.rx_crc_errors; > + eth_counters->dot3StatsFrameTooLongs = stats.rx_oversize_errors; > + SFL_UNDEF_COUNTER(eth_counters->dot3StatsSingleCollisionFrames); > + SFL_UNDEF_COUNTER(eth_counters->dot3StatsMultipleCollisionFrames); > + SFL_UNDEF_COUNTER(eth_counters->dot3StatsSQETestErrors); > + SFL_UNDEF_COUNTER(eth_counters->dot3StatsDeferredTransmissions); > + SFL_UNDEF_COUNTER(eth_counters->dot3StatsLateCollisions); > + SFL_UNDEF_COUNTER(eth_counters->dot3StatsExcessiveCollisions); > + SFL_UNDEF_COUNTER(eth_counters->dot3StatsInternalMacTransmitErrors); > + SFL_UNDEF_COUNTER(eth_counters->dot3StatsCarrierSenseErrors); > + SFL_UNDEF_COUNTER(eth_counters->dot3StatsInternalMacReceiveErrors); > + SFL_UNDEF_COUNTER(eth_counters->dot3StatsSymbolErrors); > + SFLADD_ELEMENT(cs, ð_elem); > + > sfl_poller_writeCountersSample(poller, cs); } > > diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at index > cd90424..50de39e 100644 > --- a/tests/ofproto-dpif.at > +++ b/tests/ofproto-dpif.at > @@ -5430,19 +5430,103 @@ HEADER > hdr=50-54-00-00-00-05-50-54-00-00-00-07-86-DD-67-00-00-00-00-00-0A- > 80-FE-80-00-00-00-00-00-00-00-00-00-00-00-00-00-01-FE-80-00-00-00-00-00- > 00-00-00-00-00-00-00-00-02 > ]) > > - AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP > 'IFCOUNTERS|ERROR|PORTNAME|OPENFLOWPORT' | head -18 | sed 's/ /\ > + AT_CHECK_UNQUOTED([[sort sflow.log | $EGREP > + 'ETHCOUNTERS|IFCOUNTERS|ERROR|PORTNAME|OPENFLOWPORT' | head -24 | sed > + 's/ /\ > /g']], [0], [dnl > +ETHCOUNTERS > + dot3StatsAlignmentErrors=4294967295 > + dot3StatsFCSErrors=4294967295 > + dot3StatsSingleCollisionFrames=4294967295 > + dot3StatsMultipleCollisionFrames=4294967295 > + dot3StatsSQETestErrors=4294967295 > + dot3StatsDeferredTransmissions=4294967295 > + dot3StatsLateCollisions=4294967295 > + dot3StatsExcessiveCollisions=4294967295 > + dot3StatsInternalMacTransmitErrors=4294967295 > + dot3StatsCarrierSenseErrors=4294967295 > + dot3StatsFrameTooLongs=4294967295 > + dot3StatsInternalMacReceiveErrors=4294967295 > + dot3StatsSymbolErrors=4294967295 > +ETHCOUNTERS > + dot3StatsAlignmentErrors=4294967295 > + dot3StatsFCSErrors=4294967295 > + dot3StatsSingleCollisionFrames=4294967295 > + dot3StatsMultipleCollisionFrames=4294967295 > + dot3StatsSQETestErrors=4294967295 > + dot3StatsDeferredTransmissions=4294967295 > + dot3StatsLateCollisions=4294967295 > + dot3StatsExcessiveCollisions=4294967295 > + dot3StatsInternalMacTransmitErrors=4294967295 > + dot3StatsCarrierSenseErrors=4294967295 > + dot3StatsFrameTooLongs=4294967295 > + dot3StatsInternalMacReceiveErrors=4294967295 > + dot3StatsSymbolErrors=4294967295 > +ETHCOUNTERS > + dot3StatsAlignmentErrors=4294967295 > + dot3StatsFCSErrors=4294967295 > + dot3StatsSingleCollisionFrames=4294967295 > + dot3StatsMultipleCollisionFrames=4294967295 > + dot3StatsSQETestErrors=4294967295 > + dot3StatsDeferredTransmissions=4294967295 > + dot3StatsLateCollisions=4294967295 > + dot3StatsExcessiveCollisions=4294967295 > + dot3StatsInternalMacTransmitErrors=4294967295 > + dot3StatsCarrierSenseErrors=4294967295 > + dot3StatsFrameTooLongs=4294967295 > + dot3StatsInternalMacReceiveErrors=4294967295 > + dot3StatsSymbolErrors=4294967295 > +ETHCOUNTERS > + dot3StatsAlignmentErrors=4294967295 > + dot3StatsFCSErrors=4294967295 > + dot3StatsSingleCollisionFrames=4294967295 > + dot3StatsMultipleCollisionFrames=4294967295 > + dot3StatsSQETestErrors=4294967295 > + dot3StatsDeferredTransmissions=4294967295 > + dot3StatsLateCollisions=4294967295 > + dot3StatsExcessiveCollisions=4294967295 > + dot3StatsInternalMacTransmitErrors=4294967295 > + dot3StatsCarrierSenseErrors=4294967295 > + dot3StatsFrameTooLongs=4294967295 > + dot3StatsInternalMacReceiveErrors=4294967295 > + dot3StatsSymbolErrors=4294967295 > +ETHCOUNTERS > + dot3StatsAlignmentErrors=4294967295 > + dot3StatsFCSErrors=4294967295 > + dot3StatsSingleCollisionFrames=4294967295 > + dot3StatsMultipleCollisionFrames=4294967295 > + dot3StatsSQETestErrors=4294967295 > + dot3StatsDeferredTransmissions=4294967295 > + dot3StatsLateCollisions=4294967295 > + dot3StatsExcessiveCollisions=4294967295 > + dot3StatsInternalMacTransmitErrors=4294967295 > + dot3StatsCarrierSenseErrors=4294967295 > + dot3StatsFrameTooLongs=4294967295 > + dot3StatsInternalMacReceiveErrors=4294967295 > + dot3StatsSymbolErrors=4294967295 > +ETHCOUNTERS > + dot3StatsAlignmentErrors=4294967295 > + dot3StatsFCSErrors=4294967295 > + dot3StatsSingleCollisionFrames=4294967295 > + dot3StatsMultipleCollisionFrames=4294967295 > + dot3StatsSQETestErrors=4294967295 > + dot3StatsDeferredTransmissions=4294967295 > + dot3StatsLateCollisions=4294967295 > + dot3StatsExcessiveCollisions=4294967295 > + dot3StatsInternalMacTransmitErrors=4294967295 > + dot3StatsCarrierSenseErrors=4294967295 > + dot3StatsFrameTooLongs=4294967295 > + dot3StatsInternalMacReceiveErrors=4294967295 > + dot3StatsSymbolErrors=4294967295 > IFCOUNTERS > dgramSeqNo=1 > - ds=127.0.0.1>0:1002 > + ds=127.0.0.1>0:1003 > csSeqNo=1 > - ifindex=1002 > + ifindex=1003 > type=6 > ifspeed=100000000 > direction=0 > status=0 > - in_octets=0 > - in_unicasts=0 > + in_octets=138 > + in_unicasts=3 > in_multicasts=4294967295 > in_broadcasts=4294967295 > in_discards=4294967295 > @@ -5457,52 +5541,52 @@ IFCOUNTERS > promiscuous=0 > IFCOUNTERS > dgramSeqNo=1 > - ds=127.0.0.1>0:1003 > + ds=127.0.0.1>0:1004 > csSeqNo=1 > - ifindex=1003 > + ifindex=1004 > type=6 > ifspeed=100000000 > direction=0 > status=0 > - in_octets=138 > - in_unicasts=3 > + in_octets=84 > + in_unicasts=2 > in_multicasts=4294967295 > in_broadcasts=4294967295 > in_discards=4294967295 > in_errors=4294967295 > in_unknownprotos=4294967295 > - out_octets=84 > - out_unicasts=2 > + out_octets=138 > + out_unicasts=3 > out_multicasts=4294967295 > out_broadcasts=4294967295 > out_discards=4294967295 > out_errors=4294967295 > promiscuous=0 > IFCOUNTERS > - dgramSeqNo=1 > - ds=127.0.0.1>0:1004 > + dgramSeqNo=2 > + ds=127.0.0.1>0:1002 > csSeqNo=1 > - ifindex=1004 > + ifindex=1002 > type=6 > ifspeed=100000000 > direction=0 > status=0 > - in_octets=84 > - in_unicasts=2 > + in_octets=0 > + in_unicasts=0 > in_multicasts=4294967295 > in_broadcasts=4294967295 > in_discards=4294967295 > in_errors=4294967295 > in_unknownprotos=4294967295 > - out_octets=138 > - out_unicasts=3 > + out_octets=84 > + out_unicasts=2 > out_multicasts=4294967295 > out_broadcasts=4294967295 > out_discards=4294967295 > out_errors=4294967295 > promiscuous=0 > IFCOUNTERS > - dgramSeqNo=2 > + dgramSeqNo=3 > ds=127.0.0.1>0:1002 > csSeqNo=2 > ifindex=1002 > @@ -5525,7 +5609,7 @@ IFCOUNTERS > out_errors=4294967295 > promiscuous=0 > IFCOUNTERS > - dgramSeqNo=2 > + dgramSeqNo=3 > ds=127.0.0.1>0:1003 > csSeqNo=2 > ifindex=1003 > @@ -5548,7 +5632,7 @@ IFCOUNTERS > out_errors=4294967295 > promiscuous=0 > IFCOUNTERS > - dgramSeqNo=2 > + dgramSeqNo=3 > ds=127.0.0.1>0:1004 > csSeqNo=2 > ifindex=1004 > diff --git a/tests/test-sflow.c b/tests/test-sflow.c index > 60870df..6125d38 100644 > --- a/tests/test-sflow.c > +++ b/tests/test-sflow.c > @@ -54,6 +54,7 @@ static unixctl_cb_func test_sflow_exit; > > /* Structure element tag numbers. */ > #define SFLOW_TAG_CTR_IFCOUNTERS 1 > +#define SFLOW_TAG_CTR_ETHCOUNTERS 2 > #define SFLOW_TAG_CTR_LACPCOUNTERS 7 > #define SFLOW_TAG_CTR_OPENFLOWPORT 1004 #define SFLOW_TAG_CTR_PORTNAME > 1005 @@ -115,7 +116,8 @@ struct sflow_xdr { > uint32_t TUNNEL_VNI_OUT; > uint32_t TUNNEL_VNI_IN; > uint32_t MPLS; > - uint32_t IFCOUNTERS; > + uint32_t IFCOUNTERS; > + uint32_t ETHCOUNTERS; > uint32_t LACPCOUNTERS; > uint32_t OPENFLOWPORT; > uint32_t PORTNAME; > @@ -297,6 +299,25 @@ process_counter_sample(struct sflow_xdr *x) > printf(" portName=%s", portName); > printf("\n"); > } > + if (x->offset.ETHCOUNTERS) { > + sflowxdr_setc(x, x->offset.ETHCOUNTERS); > + printf("ETHCOUNTERS"); > + printf(" dot3StatsAlignmentErrors=%"PRIu32, sflowxdr_next(x)); > + printf(" dot3StatsFCSErrors=%"PRIu32, sflowxdr_next(x)); > + printf(" dot3StatsSingleCollisionFrames=%"PRIu32, > sflowxdr_next(x)); > + printf(" dot3StatsMultipleCollisionFrames=%"PRIu32, > sflowxdr_next(x)); > + printf(" dot3StatsSQETestErrors=%"PRIu32, sflowxdr_next(x)); > + printf(" dot3StatsDeferredTransmissions=%"PRIu32, > sflowxdr_next(x)); > + printf(" dot3StatsLateCollisions=%"PRIu32, sflowxdr_next(x)); > + printf(" dot3StatsExcessiveCollisions=%"PRIu32, > sflowxdr_next(x)); > + printf(" dot3StatsInternalMacTransmitErrors=%"PRIu32, > + sflowxdr_next(x)); > + printf(" dot3StatsCarrierSenseErrors=%"PRIu32, sflowxdr_next(x)); > + printf(" dot3StatsFrameTooLongs=%"PRIu32, sflowxdr_next(x)); > + printf(" dot3StatsInternalMacReceiveErrors=%"PRIu32, > sflowxdr_next(x)); > + printf(" dot3StatsSymbolErrors=%"PRIu32, sflowxdr_next(x)); > + printf("\n"); > + } > } > > static char > @@ -513,6 +534,9 @@ process_datagram(struct sflow_xdr *x) > case SFLOW_TAG_CTR_IFCOUNTERS: > sflowxdr_mark_unique(x, &x->offset.IFCOUNTERS); > break; > + case SFLOW_TAG_CTR_ETHCOUNTERS: > + sflowxdr_mark_unique(x, &x->offset.ETHCOUNTERS); > + break; > case SFLOW_TAG_CTR_LACPCOUNTERS: > sflowxdr_mark_unique(x, &x->offset.LACPCOUNTERS); > break; > -- > 1.8.3.1 >
Looks OK to me, tested without issue. Acked-by: Ian Stokes <[email protected]> > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
