| /* |
| * 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. |
| * |
| * Authors: Nathan Binkert |
| * Lisa Hsu |
| */ |
| |
| #include "dev/net/etherdevice.hh" |
| |
| #include "sim/stats.hh" |
| |
| void |
| EtherDevice::regStats() |
| { |
| PciDevice::regStats(); |
| |
| txBytes |
| .name(name() + ".txBytes") |
| .desc("Bytes Transmitted") |
| .prereq(txBytes) |
| ; |
| |
| rxBytes |
| .name(name() + ".rxBytes") |
| .desc("Bytes Received") |
| .prereq(rxBytes) |
| ; |
| |
| txPackets |
| .name(name() + ".txPackets") |
| .desc("Number of Packets Transmitted") |
| .prereq(txBytes) |
| ; |
| |
| rxPackets |
| .name(name() + ".rxPackets") |
| .desc("Number of Packets Received") |
| .prereq(rxBytes) |
| ; |
| |
| txIpChecksums |
| .name(name() + ".txIpChecksums") |
| .desc("Number of tx IP Checksums done by device") |
| .precision(0) |
| .prereq(txBytes) |
| ; |
| |
| rxIpChecksums |
| .name(name() + ".rxIpChecksums") |
| .desc("Number of rx IP Checksums done by device") |
| .precision(0) |
| .prereq(rxBytes) |
| ; |
| |
| txTcpChecksums |
| .name(name() + ".txTcpChecksums") |
| .desc("Number of tx TCP Checksums done by device") |
| .precision(0) |
| .prereq(txBytes) |
| ; |
| |
| rxTcpChecksums |
| .name(name() + ".rxTcpChecksums") |
| .desc("Number of rx TCP Checksums done by device") |
| .precision(0) |
| .prereq(rxBytes) |
| ; |
| |
| txUdpChecksums |
| .name(name() + ".txUdpChecksums") |
| .desc("Number of tx UDP Checksums done by device") |
| .precision(0) |
| .prereq(txBytes) |
| ; |
| |
| rxUdpChecksums |
| .name(name() + ".rxUdpChecksums") |
| .desc("Number of rx UDP Checksums done by device") |
| .precision(0) |
| .prereq(rxBytes) |
| ; |
| |
| descDmaReads |
| .name(name() + ".descDMAReads") |
| .desc("Number of descriptors the device read w/ DMA") |
| .precision(0) |
| ; |
| |
| descDmaWrites |
| .name(name() + ".descDMAWrites") |
| .desc("Number of descriptors the device wrote w/ DMA") |
| .precision(0) |
| ; |
| |
| descDmaRdBytes |
| .name(name() + ".descDmaReadBytes") |
| .desc("number of descriptor bytes read w/ DMA") |
| .precision(0) |
| ; |
| |
| descDmaWrBytes |
| .name(name() + ".descDmaWriteBytes") |
| .desc("number of descriptor bytes write w/ DMA") |
| .precision(0) |
| ; |
| |
| txBandwidth |
| .name(name() + ".txBandwidth") |
| .desc("Transmit Bandwidth (bits/s)") |
| .precision(0) |
| .prereq(txBytes) |
| ; |
| |
| rxBandwidth |
| .name(name() + ".rxBandwidth") |
| .desc("Receive Bandwidth (bits/s)") |
| .precision(0) |
| .prereq(rxBytes) |
| ; |
| |
| totBandwidth |
| .name(name() + ".totBandwidth") |
| .desc("Total Bandwidth (bits/s)") |
| .precision(0) |
| .prereq(totBytes) |
| ; |
| |
| totPackets |
| .name(name() + ".totPackets") |
| .desc("Total Packets") |
| .precision(0) |
| .prereq(totBytes) |
| ; |
| |
| totBytes |
| .name(name() + ".totBytes") |
| .desc("Total Bytes") |
| .precision(0) |
| .prereq(totBytes) |
| ; |
| |
| totPacketRate |
| .name(name() + ".totPPS") |
| .desc("Total Tranmission Rate (packets/s)") |
| .precision(0) |
| .prereq(totBytes) |
| ; |
| |
| txPacketRate |
| .name(name() + ".txPPS") |
| .desc("Packet Tranmission Rate (packets/s)") |
| .precision(0) |
| .prereq(txBytes) |
| ; |
| |
| rxPacketRate |
| .name(name() + ".rxPPS") |
| .desc("Packet Reception Rate (packets/s)") |
| .precision(0) |
| .prereq(rxBytes) |
| ; |
| |
| postedSwi |
| .name(name() + ".postedSwi") |
| .desc("number of software interrupts posted to CPU") |
| .precision(0) |
| ; |
| |
| totalSwi |
| .name(name() + ".totalSwi") |
| .desc("total number of Swi written to ISR") |
| .precision(0) |
| ; |
| |
| coalescedSwi |
| .name(name() + ".coalescedSwi") |
| .desc("average number of Swi's coalesced into each post") |
| .precision(0) |
| ; |
| |
| postedRxIdle |
| .name(name() + ".postedRxIdle") |
| .desc("number of rxIdle interrupts posted to CPU") |
| .precision(0) |
| ; |
| |
| totalRxIdle |
| .name(name() + ".totalRxIdle") |
| .desc("total number of RxIdle written to ISR") |
| .precision(0) |
| ; |
| |
| coalescedRxIdle |
| .name(name() + ".coalescedRxIdle") |
| .desc("average number of RxIdle's coalesced into each post") |
| .precision(0) |
| ; |
| |
| postedRxOk |
| .name(name() + ".postedRxOk") |
| .desc("number of RxOk interrupts posted to CPU") |
| .precision(0) |
| ; |
| |
| totalRxOk |
| .name(name() + ".totalRxOk") |
| .desc("total number of RxOk written to ISR") |
| .precision(0) |
| ; |
| |
| coalescedRxOk |
| .name(name() + ".coalescedRxOk") |
| .desc("average number of RxOk's coalesced into each post") |
| .precision(0) |
| ; |
| |
| postedRxDesc |
| .name(name() + ".postedRxDesc") |
| .desc("number of RxDesc interrupts posted to CPU") |
| .precision(0) |
| ; |
| |
| totalRxDesc |
| .name(name() + ".totalRxDesc") |
| .desc("total number of RxDesc written to ISR") |
| .precision(0) |
| ; |
| |
| coalescedRxDesc |
| .name(name() + ".coalescedRxDesc") |
| .desc("average number of RxDesc's coalesced into each post") |
| .precision(0) |
| ; |
| |
| postedTxOk |
| .name(name() + ".postedTxOk") |
| .desc("number of TxOk interrupts posted to CPU") |
| .precision(0) |
| ; |
| |
| totalTxOk |
| .name(name() + ".totalTxOk") |
| .desc("total number of TxOk written to ISR") |
| .precision(0) |
| ; |
| |
| coalescedTxOk |
| .name(name() + ".coalescedTxOk") |
| .desc("average number of TxOk's coalesced into each post") |
| .precision(0) |
| ; |
| |
| postedTxIdle |
| .name(name() + ".postedTxIdle") |
| .desc("number of TxIdle interrupts posted to CPU") |
| .precision(0) |
| ; |
| |
| totalTxIdle |
| .name(name() + ".totalTxIdle") |
| .desc("total number of TxIdle written to ISR") |
| .precision(0) |
| ; |
| |
| coalescedTxIdle |
| .name(name() + ".coalescedTxIdle") |
| .desc("average number of TxIdle's coalesced into each post") |
| .precision(0) |
| ; |
| |
| postedTxDesc |
| .name(name() + ".postedTxDesc") |
| .desc("number of TxDesc interrupts posted to CPU") |
| .precision(0) |
| ; |
| |
| totalTxDesc |
| .name(name() + ".totalTxDesc") |
| .desc("total number of TxDesc written to ISR") |
| .precision(0) |
| ; |
| |
| coalescedTxDesc |
| .name(name() + ".coalescedTxDesc") |
| .desc("average number of TxDesc's coalesced into each post") |
| .precision(0) |
| ; |
| |
| postedRxOrn |
| .name(name() + ".postedRxOrn") |
| .desc("number of RxOrn posted to CPU") |
| .precision(0) |
| ; |
| |
| totalRxOrn |
| .name(name() + ".totalRxOrn") |
| .desc("total number of RxOrn written to ISR") |
| .precision(0) |
| ; |
| |
| coalescedRxOrn |
| .name(name() + ".coalescedRxOrn") |
| .desc("average number of RxOrn's coalesced into each post") |
| .precision(0) |
| ; |
| |
| coalescedTotal |
| .name(name() + ".coalescedTotal") |
| .desc("average number of interrupts coalesced into each post") |
| .precision(0) |
| ; |
| |
| postedInterrupts |
| .name(name() + ".postedInterrupts") |
| .desc("number of posts to CPU") |
| .precision(0) |
| ; |
| |
| droppedPackets |
| .name(name() + ".droppedPackets") |
| .desc("number of packets dropped") |
| .precision(0) |
| ; |
| |
| coalescedSwi = totalSwi / postedInterrupts; |
| coalescedRxIdle = totalRxIdle / postedInterrupts; |
| coalescedRxOk = totalRxOk / postedInterrupts; |
| coalescedRxDesc = totalRxDesc / postedInterrupts; |
| coalescedTxOk = totalTxOk / postedInterrupts; |
| coalescedTxIdle = totalTxIdle / postedInterrupts; |
| coalescedTxDesc = totalTxDesc / postedInterrupts; |
| coalescedRxOrn = totalRxOrn / postedInterrupts; |
| |
| coalescedTotal = (totalSwi + totalRxIdle + totalRxOk + totalRxDesc + |
| totalTxOk + totalTxIdle + totalTxDesc + |
| totalRxOrn) / postedInterrupts; |
| |
| txBandwidth = txBytes * Stats::constant(8) / simSeconds; |
| rxBandwidth = rxBytes * Stats::constant(8) / simSeconds; |
| totBandwidth = txBandwidth + rxBandwidth; |
| totBytes = txBytes + rxBytes; |
| totPackets = txPackets + rxPackets; |
| |
| txPacketRate = txPackets / simSeconds; |
| rxPacketRate = rxPackets / simSeconds; |
| totPacketRate = totPackets / simSeconds; |
| } |