/* * Copyright (c) 2004-2005 The Regents of The University of Michigan * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer; * redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution; * neither the name of the copyright holders nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "dev/net/etherdevice.hh" #include "sim/stats.hh" namespace gem5 { EtherDevice::EtherDeviceStats::EtherDeviceStats(statistics::Group *parent) : statistics::Group(parent, "EtherDevice"), ADD_STAT(postedInterrupts, statistics::units::Count::get(), "Number of posts to CPU"), ADD_STAT(txBytes, statistics::units::Byte::get(), "Bytes Transmitted"), ADD_STAT(rxBytes, statistics::units::Byte::get(), "Bytes Received"), ADD_STAT(txPackets, statistics::units::Count::get(), "Number of Packets Transmitted"), ADD_STAT(rxPackets, statistics::units::Count::get(), "Number of Packets Received"), ADD_STAT(txBandwidth, statistics::units::Rate< statistics::units::Bit, statistics::units::Second>::get(), "Transmit Bandwidth", txBytes * statistics::constant(8) / simSeconds), ADD_STAT(rxBandwidth, statistics::units::Rate< statistics::units::Bit, statistics::units::Second>::get(), "Receive Bandwidth", rxBytes * statistics::constant(8) / simSeconds), ADD_STAT(txIpChecksums, statistics::units::Count::get(), "Number of tx IP Checksums done by device"), ADD_STAT(rxIpChecksums, statistics::units::Count::get(), "Number of rx IP Checksums done by device"), ADD_STAT(txTcpChecksums, statistics::units::Count::get(), "Number of tx TCP Checksums done by device"), ADD_STAT(rxTcpChecksums, statistics::units::Count::get(), "Number of rx TCP Checksums done by device"), ADD_STAT(txUdpChecksums, statistics::units::Count::get(), "Number of tx UDP Checksums done by device"), ADD_STAT(rxUdpChecksums, statistics::units::Count::get(), "Number of rx UDP Checksums done by device"), ADD_STAT(descDmaReads, statistics::units::Count::get(), "Number of descriptors the device read w/ DMA"), ADD_STAT(descDmaWrites, statistics::units::Count::get(), "Number of descriptors the device wrote w/ DMA"), ADD_STAT(descDmaRdBytes, statistics::units::Count::get(), "Number of descriptor bytes read w/ DMA"), ADD_STAT(descDmaWrBytes, statistics::units::Count::get(), "Number of descriptor bytes write w/ DMA"), ADD_STAT(totBandwidth, statistics::units::Rate< statistics::units::Bit, statistics::units::Second>::get(), "Total Bandwidth", txBandwidth + rxBandwidth), ADD_STAT(totPackets, statistics::units::Count::get(), "Total Packets", txPackets + rxPackets), ADD_STAT(totBytes, statistics::units::Byte::get(), "Total Bytes", txBytes + rxBytes), ADD_STAT(totPacketRate, statistics::units::Rate< statistics::units::Count, statistics::units::Second>::get(), "Total Packet Tranmission Rate", totPackets / simSeconds), ADD_STAT(txPacketRate, statistics::units::Rate< statistics::units::Count, statistics::units::Second>::get(), "Packet Tranmission Rate", txPackets / simSeconds), ADD_STAT(rxPacketRate, statistics::units::Rate< statistics::units::Count, statistics::units::Second>::get(), "Packet Reception Rate", rxPackets / simSeconds), ADD_STAT(postedSwi, statistics::units::Count::get(), "Number of software interrupts posted to CPU"), ADD_STAT(totalSwi, statistics::units::Count::get(), "Total number of Swi written to ISR"), ADD_STAT(coalescedSwi, statistics::units::Rate< statistics::units::Count, statistics::units::Count>::get(), "Average number of Swi's coalesced into each post", totalSwi / postedInterrupts), ADD_STAT(postedRxIdle, statistics::units::Count::get(), "Number of rxIdle interrupts posted to CPU"), ADD_STAT(totalRxIdle, statistics::units::Count::get(), "Total number of RxIdle written to ISR"), ADD_STAT(coalescedRxIdle, statistics::units::Rate< statistics::units::Count, statistics::units::Count>::get(), "Average number of RxIdle's coalesced into each post", totalRxIdle / postedInterrupts), ADD_STAT(postedRxOk, statistics::units::Count::get(), "Number of RxOk interrupts posted to CPU"), ADD_STAT(totalRxOk, statistics::units::Count::get(), "Total number of RxOk written to ISR"), ADD_STAT(coalescedRxOk, statistics::units::Rate< statistics::units::Count, statistics::units::Count>::get(), "Average number of RxOk's coalesced into each post", totalRxOk / postedInterrupts), ADD_STAT(postedRxDesc, statistics::units::Count::get(), "Number of RxDesc interrupts posted to CPU"), ADD_STAT(totalRxDesc, statistics::units::Count::get(), "Total number of RxDesc written to ISR"), ADD_STAT(coalescedRxDesc, statistics::units::Rate< statistics::units::Count, statistics::units::Count>::get(), "Average number of RxDesc's coalesced into each post", totalRxDesc / postedInterrupts), ADD_STAT(postedTxOk, statistics::units::Count::get(), "Number of TxOk interrupts posted to CPU"), ADD_STAT(totalTxOk, statistics::units::Count::get(), "Total number of TxOk written to ISR"), ADD_STAT(coalescedTxOk, statistics::units::Rate< statistics::units::Count, statistics::units::Count>::get(), "Average number of TxOk's coalesced into each post", totalTxOk / postedInterrupts), ADD_STAT(postedTxIdle, statistics::units::Count::get(), "Number of TxIdle interrupts posted to CPU"), ADD_STAT(totalTxIdle, statistics::units::Count::get(), "Total number of TxIdle written to ISR"), ADD_STAT(coalescedTxIdle, statistics::units::Rate< statistics::units::Count, statistics::units::Count>::get(), "Average number of TxIdle's coalesced into each post", totalTxIdle / postedInterrupts), ADD_STAT(postedTxDesc, statistics::units::Count::get(), "Number of TxDesc interrupts posted to CPU"), ADD_STAT(totalTxDesc, statistics::units::Count::get(), "Total number of TxDesc written to ISR"), ADD_STAT(coalescedTxDesc, statistics::units::Rate< statistics::units::Count, statistics::units::Count>::get(), "Average number of TxDesc's coalesced into each post", totalTxDesc / postedInterrupts), ADD_STAT(postedRxOrn, statistics::units::Count::get(), "Number of RxOrn posted to CPU"), ADD_STAT(totalRxOrn, statistics::units::Count::get(), "Total number of RxOrn written to ISR"), ADD_STAT(coalescedRxOrn, statistics::units::Rate< statistics::units::Count, statistics::units::Count>::get(), "Average number of RxOrn's coalesced into each post", totalRxOrn / postedInterrupts), ADD_STAT(coalescedTotal, statistics::units::Rate< statistics::units::Count, statistics::units::Count>::get(), "Average number of interrupts coalesced into each post"), ADD_STAT(droppedPackets, statistics::units::Count::get(), "Number of packets dropped") { postedInterrupts .precision(0); txBytes .prereq(txBytes); rxBytes .prereq(rxBytes); txPackets .prereq(txBytes); rxPackets .prereq(rxBytes); txIpChecksums .precision(0) .prereq(txBytes); rxIpChecksums .precision(0) .prereq(rxBytes); txTcpChecksums .precision(0) .prereq(txBytes); rxTcpChecksums .precision(0) .prereq(rxBytes); txUdpChecksums .precision(0) .prereq(txBytes); rxUdpChecksums .precision(0) .prereq(rxBytes); descDmaReads .precision(0); descDmaWrites .precision(0); descDmaRdBytes .precision(0); descDmaWrBytes .precision(0); txBandwidth .precision(0) .prereq(txBytes) ; rxBandwidth .precision(0) .prereq(rxBytes); totBandwidth .precision(0) .prereq(totBytes); totPackets .precision(0) .prereq(totBytes); totBytes .precision(0) .prereq(totBytes); totPacketRate .precision(0) .prereq(totBytes); txPacketRate .precision(0) .prereq(txBytes); rxPacketRate .precision(0) .prereq(rxBytes); postedSwi .precision(0); totalSwi .precision(0); coalescedSwi .precision(0); postedRxIdle .precision(0); totalRxIdle .precision(0); coalescedRxIdle .precision(0); postedRxOk .precision(0); totalRxOk .precision(0); coalescedRxOk .precision(0); postedRxDesc .precision(0); totalRxDesc .precision(0); coalescedRxDesc .precision(0); postedTxOk .precision(0); totalTxOk .precision(0); coalescedTxOk .precision(0); postedTxIdle .precision(0); totalTxIdle .precision(0); coalescedTxIdle .precision(0); postedTxDesc .precision(0); totalTxDesc .precision(0); coalescedTxDesc .precision(0); postedRxOrn .precision(0); totalRxOrn .precision(0); coalescedRxOrn .precision(0); coalescedTotal .precision(0); droppedPackets .precision(0); coalescedTotal = (totalSwi + totalRxIdle + totalRxOk + totalRxDesc + totalTxOk + totalTxIdle + totalTxDesc + totalRxOrn) / postedInterrupts; } } // namespace gem5