Hi Robert, It seems like there are three separable things here:
(1) filling in the multicast and broadcast counters that were missing from the generic interface counters structure. This is great -- assuming it's portable across OS versions etc. (2) adding the ethernet counters structure. This sometimes seems like a lot just to distinguish a few different kinds of errors, but I appreciate that it can be important to do that. (3) adding vlan counters for every vlan that an interface belongs to -- I not sure about this one. What if an interface is on a whole set of vlans? This vlan counters structure has hardly ever been used. Certainly not in this per-interface, per-vlan way. I don't think any sFlow collectors would know what to make of it. And since the packet-samples include vlan info it is already possible to derive vlan traffic estimates by interface (and by src/dst MAC, IP etc.) from them. So I think I'm voting for (1), maybe (2) but not (3). What do you think? Neil ------ Neil McKee InMon Corp. http://www.inmon.com On Tue, Nov 15, 2016 at 2:47 AM, Robert Wojciechowicz < robertx.wojciechow...@intel.com> wrote: > Expose existing netdev stats via sFlow. > Export sFlow ETHERNET structure with available counters. > Map existing stats to counters in the GENERIC INTERFACE > sFlow structure. > Export sFlow VLAN structure with available counters. > Adjust unit test to accommodate these new counters. > > Signed-off-by: Robert Wojciechowicz <robertx.wojciechow...@intel.com> > --- > lib/sflow.h | 2 + > lib/sflow_receiver.c | 2 +- > ofproto/ofproto-dpif-sflow.c | 52 +++++++++- > ofproto/ofproto-dpif.c | 8 ++ > ofproto/ofproto-provider.h | 8 ++ > ofproto/ofproto.c | 16 +++ > ofproto/ofproto.h | 1 + > tests/ofproto-dpif.at | 225 ++++++++++++++++++++++++++++++ > +++++++++---- > tests/test-sflow.c | 43 ++++++++- > 9 files changed, 332 insertions(+), 25 deletions(-) > > diff --git a/lib/sflow.h b/lib/sflow.h > index 95bedd9..5beadc4 100644 > --- a/lib/sflow.h > +++ b/lib/sflow.h > @@ -502,6 +502,8 @@ typedef struct _SFLVlan_counters { > u_int32_t discards; > } SFLVlan_counters; > > +#define SFL_CTR_VLAN_XDR_SIZE 28 > + > /* OpenFlow port */ > typedef struct { > u_int64_t datapath_id; > diff --git a/lib/sflow_receiver.c b/lib/sflow_receiver.c > index cde1359..8474628 100644 > --- a/lib/sflow_receiver.c > +++ b/lib/sflow_receiver.c > @@ -649,7 +649,7 @@ static int computeCountersSampleSize(SFLReceiver > *receiver, SFL_COUNTERS_SAMPLE_ > case SFLCOUNTERS_ETHERNET: elemSiz = SFL_CTR_ETHERNET_XDR_SIZE; > break; > case SFLCOUNTERS_TOKENRING: elemSiz = > sizeof(elem->counterBlock.tokenring); > break; > case SFLCOUNTERS_VG: elemSiz = sizeof(elem->counterBlock.vg); > break; > - case SFLCOUNTERS_VLAN: elemSiz = sizeof(elem->counterBlock.vlan); > break; > + case SFLCOUNTERS_VLAN: elemSiz = SFL_CTR_VLAN_XDR_SIZE; break; > case SFLCOUNTERS_LACP: elemSiz = SFL_CTR_LACP_XDR_SIZE; break; > case SFLCOUNTERS_OPENFLOWPORT: elemSiz = > SFL_CTR_OPENFLOWPORT_XDR_SIZE; break; > case SFLCOUNTERS_PORTNAME: elemSiz = stringEncodingLength(&elem-> > counterBlock.portName.portName); break; > diff --git a/ofproto/ofproto-dpif-sflow.c b/ofproto/ofproto-dpif-sflow.c > index 9ea8851..21adba7 100644 > --- a/ofproto/ofproto-dpif-sflow.c > +++ b/ofproto/ofproto-dpif-sflow.c > @@ -298,13 +298,17 @@ 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; > + SFLCounters_sample_element vlan_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; > const char *ifName; > + int vlan_id = 0; > > dsp = dpif_sflow_find_port(ds, u32_to_odp(poller->bridgePort)); > if (!dsp) { > @@ -343,14 +347,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 +411,48 @@ 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); > + > + /* Include VLAN counters if this port is part of VLAN. */ > + vlan_id = ofproto_port_get_vlan_id(dsp->ofport); > + if (vlan_id > 0 && vlan_id != UINT32_MAX) { > + memset(&vlan_elem, 0, sizeof vlan_elem); > + vlan_elem.tag = SFLCOUNTERS_VLAN; > + vlan_elem.counterBlock.vlan.vlan_id = vlan_id; > + vlan_elem.counterBlock.vlan.octets = counters->ifInOctets; > + if (counters->ifOutOctets != UINT64_MAX) { > + vlan_elem.counterBlock.vlan.octets += counters->ifOutOctets; > + } > + vlan_elem.counterBlock.vlan.ucastPkts = counters->ifInUcastPkts; > + if (counters->ifOutUcastPkts != UINT32_MAX) { > + vlan_elem.counterBlock.vlan.ucastPkts += > counters->ifOutUcastPkts; > + } > + SFL_UNDEF_COUNTER(vlan_elem.counterBlock.vlan.multicastPkts); > + SFL_UNDEF_COUNTER(vlan_elem.counterBlock.vlan.broadcastPkts); > + vlan_elem.counterBlock.vlan.discards = counters->ifInDiscards; > + if (counters->ifOutDiscards != UINT32_MAX) { > + vlan_elem.counterBlock.vlan.discards += > counters->ifOutDiscards; > + } > + SFLADD_ELEMENT(cs, &vlan_elem); > + } > + > sfl_poller_writeCountersSample(poller, cs); > } > > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c > index 330bd48..ff95b70 100644 > --- a/ofproto/ofproto-dpif.c > +++ b/ofproto/ofproto-dpif.c > @@ -3602,6 +3602,13 @@ port_get_lacp_stats(const struct ofport *ofport_, > struct lacp_slave_stats *stats > return -1; > } > > +static int > +port_get_vlan_id(const struct ofport *ofport_) > +{ > + struct ofport_dpif *ofport = ofport_dpif_cast(ofport_); > + return ofport->bundle->vlan; > +} > + > struct port_dump_state { > struct sset_position pos; > bool ghost; > @@ -5885,6 +5892,7 @@ const struct ofproto_class ofproto_dpif_class = { > port_poll_wait, > port_is_lacp_current, > port_get_lacp_stats, > + port_get_vlan_id, > NULL, /* rule_choose_table */ > rule_alloc, > rule_construct, > diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h > index bc5098a..f9c3092 100644 > --- a/ofproto/ofproto-provider.h > +++ b/ofproto/ofproto-provider.h > @@ -1166,6 +1166,14 @@ struct ofproto_class { > int (*port_get_lacp_stats)(const struct ofport *port, > struct lacp_slave_stats *stats); > > + /* Get VLAN identifier. > + * > + * This function may be a null pointer if the ofproto implementation > does > + * not support VLAN. > + */ > + int (*port_get_vlan_id)(const struct ofport *port); > + > + > /* ## ----------------------- ## */ > /* ## OpenFlow Rule Functions ## */ > /* ## ----------------------- ## */ > diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c > index de1c469..2c35cc0 100644 > --- a/ofproto/ofproto.c > +++ b/ofproto/ofproto.c > @@ -1316,6 +1316,22 @@ ofproto_port_get_lacp_stats(const struct ofport > *port, struct lacp_slave_stats * > > return error; > } > + > +int > +ofproto_port_get_vlan_id(const struct ofport *port) > +{ > + struct ofproto *ofproto = port->ofproto; > + int vlan_id; > + > + if (ofproto->ofproto_class->port_get_vlan_id) { > + vlan_id = ofproto->ofproto_class->port_get_vlan_id(port); > + } else { > + vlan_id = -EOPNOTSUPP; > + } > + > + return vlan_id; > +} > + > > /* Bundles. */ > > diff --git a/ofproto/ofproto.h b/ofproto/ofproto.h > index d813fda..bc689ed 100644 > --- a/ofproto/ofproto.h > +++ b/ofproto/ofproto.h > @@ -353,6 +353,7 @@ int ofproto_port_get_bfd_status(struct ofproto *, > ofp_port_t ofp_port, > struct smap *); > int ofproto_port_is_lacp_current(struct ofproto *, ofp_port_t ofp_port); > int ofproto_port_get_lacp_stats(const struct ofport *, struct > lacp_slave_stats *); > +int ofproto_port_get_vlan_id(const struct ofport *); > int ofproto_port_set_stp(struct ofproto *, ofp_port_t ofp_port, > const struct ofproto_port_stp_settings *); > int ofproto_port_get_stp_status(struct ofproto *, ofp_port_t ofp_port, > diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at > index ec7bd60..5919a78 100644 > --- a/tests/ofproto-dpif.at > +++ b/tests/ofproto-dpif.at > @@ -5301,6 +5301,9 @@ m4_define([CHECK_SFLOW_SAMPLING_PACKET], > --id=@sf create sflow targets=\"$1:$SFLOW_PORT\" \ > header=128 sampling=1 polling=1 agent=$LOOPBACK_INTERFACE > > + dnl add vlan port for checking vlan counters > + ovs-vsctl add-port br0 p3 tag=10 -- set Interface p3 type=dummy > options:ifindex=1005 > + > dnl open with ARP packets to seed the bridge-learning. The output > dnl ifIndex numbers should be reported predictably after that. > dnl Since we set sampling=1 we should see all of these packets > @@ -5430,13 +5433,148 @@ 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|VLANCOUNTERS' | head > -39 | 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 > +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:1004 > csSeqNo=1 > - ifindex=1002 > + ifindex=1004 > + type=6 > + ifspeed=100000000 > + direction=0 > + status=0 > + in_octets=84 > + in_unicasts=2 > + in_multicasts=4294967295 > + in_broadcasts=4294967295 > + in_discards=4294967295 > + in_errors=4294967295 > + in_unknownprotos=4294967295 > + 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:1005 > + csSeqNo=1 > + ifindex=1005 > type=6 > ifspeed=100000000 > direction=0 > @@ -5448,24 +5586,24 @@ IFCOUNTERS > in_discards=4294967295 > in_errors=4294967295 > in_unknownprotos=4294967295 > - out_octets=84 > - out_unicasts=2 > + out_octets=0 > + out_unicasts=0 > out_multicasts=4294967295 > out_broadcasts=4294967295 > out_discards=4294967295 > out_errors=4294967295 > promiscuous=0 > IFCOUNTERS > - dgramSeqNo=1 > - ds=127.0.0.1>0:1003 > + dgramSeqNo=2 > + ds=127.0.0.1>0:1002 > csSeqNo=1 > - ifindex=1003 > + ifindex=1002 > type=6 > ifspeed=100000000 > direction=0 > status=0 > - in_octets=138 > - in_unicasts=3 > + in_octets=0 > + in_unicasts=0 > in_multicasts=4294967295 > in_broadcasts=4294967295 > in_discards=4294967295 > @@ -5479,30 +5617,30 @@ IFCOUNTERS > out_errors=4294967295 > promiscuous=0 > IFCOUNTERS > - dgramSeqNo=1 > - ds=127.0.0.1>0:1004 > + dgramSeqNo=2 > + ds=127.0.0.1>0:1003 > csSeqNo=1 > - ifindex=1004 > + ifindex=1003 > type=6 > ifspeed=100000000 > direction=0 > status=0 > - in_octets=84 > - in_unicasts=2 > + in_octets=138 > + in_unicasts=3 > 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 +5663,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 +5686,7 @@ IFCOUNTERS > out_errors=4294967295 > promiscuous=0 > IFCOUNTERS > - dgramSeqNo=2 > + dgramSeqNo=3 > ds=127.0.0.1>0:1004 > csSeqNo=2 > ifindex=1004 > @@ -5570,6 +5708,29 @@ IFCOUNTERS > out_discards=4294967295 > out_errors=4294967295 > promiscuous=0 > +IFCOUNTERS > + dgramSeqNo=3 > + ds=127.0.0.1>0:1005 > + csSeqNo=2 > + ifindex=1005 > + type=6 > + ifspeed=100000000 > + direction=0 > + status=0 > + in_octets=0 > + in_unicasts=0 > + in_multicasts=4294967295 > + in_broadcasts=4294967295 > + in_discards=4294967295 > + in_errors=4294967295 > + in_unknownprotos=4294967295 > + out_octets=0 > + out_unicasts=0 > + out_multicasts=4294967295 > + out_broadcasts=4294967295 > + out_discards=4294967295 > + out_errors=4294967295 > + promiscuous=0 > OPENFLOWPORT > datapath_id=18364758544493064720 > port_no=1 > @@ -5584,6 +5745,12 @@ OPENFLOWPORT > port_no=2 > OPENFLOWPORT > datapath_id=18364758544493064720 > + port_no=3 > +OPENFLOWPORT > + datapath_id=18364758544493064720 > + port_no=3 > +OPENFLOWPORT > + datapath_id=18364758544493064720 > port_no=65534 > OPENFLOWPORT > datapath_id=18364758544493064720 > @@ -5600,6 +5767,24 @@ PORTNAME > portName=p2 > PORTNAME > portName=p2 > +PORTNAME > + portName=p3 > +PORTNAME > + portName=p3 > +VLANCOUNTERS > + vlan_id=10 > + octets=0 > + ucastPkts=0 > + multicastPkts=4294967295 > + broadcastPkts=4294967295 > + discards=4294967295 > +VLANCOUNTERS > + vlan_id=10 > + octets=0 > + ucastPkts=0 > + multicastPkts=4294967295 > + broadcastPkts=4294967295 > + discards=4294967295 > ])]) > > AT_SETUP([ofproto-dpif - basic truncate action]) > diff --git a/tests/test-sflow.c b/tests/test-sflow.c > index 60870df..8875f32 100644 > --- a/tests/test-sflow.c > +++ b/tests/test-sflow.c > @@ -54,6 +54,8 @@ 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_VLANCOUNTERS 5 > #define SFLOW_TAG_CTR_LACPCOUNTERS 7 > #define SFLOW_TAG_CTR_OPENFLOWPORT 1004 > #define SFLOW_TAG_CTR_PORTNAME 1005 > @@ -115,7 +117,9 @@ 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 VLANCOUNTERS; > uint32_t LACPCOUNTERS; > uint32_t OPENFLOWPORT; > uint32_t PORTNAME; > @@ -297,6 +301,37 @@ 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"); > + } > + if (x->offset.VLANCOUNTERS) { > + sflowxdr_setc(x, x->offset.VLANCOUNTERS); > + printf("VLANCOUNTERS"); > + printf(" vlan_id=%"PRIu32, sflowxdr_next(x)); > + printf(" octets=%"PRIu64, sflowxdr_next_int64(x)); > + printf(" ucastPkts=%"PRIu32, sflowxdr_next(x)); > + printf(" multicastPkts=%"PRIu32, sflowxdr_next(x)); > + printf(" broadcastPkts=%"PRIu32, sflowxdr_next(x)); > + printf(" discards=%"PRIu32, sflowxdr_next(x)); > + printf("\n"); > + } > + > } > > static char > @@ -513,6 +548,12 @@ 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_VLANCOUNTERS: > + sflowxdr_mark_unique(x, &x->offset.VLANCOUNTERS); > + break; > case SFLOW_TAG_CTR_LACPCOUNTERS: > sflowxdr_mark_unique(x, &x->offset.LACPCOUNTERS); > break; > -- > 1.8.3.1 > > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev