Where does ethtool get information from?

imll

When I run the command ethtool -S wlp2s0, I get the following information:

NIC statistics:
     rx_packets: 63
     rx_bytes: 14163
     rx_duplicates: 2
     rx_fragments: 58
     rx_dropped: 30
     tx_packets: 60
     tx_bytes: 9668
     tx_filtered: 0
     tx_retry_failed: 0
     tx_retries: 39
     sta_state: 4
     txrate: 115600000
     rxrate: 130000000
     signal: 189
     channel: 0
     (...) 

However, when I go to the /sys/class/net/wlp2s0/statistics folder, the statistics are different from ethtool (and they seem to be the ones printed by ifconfig). For instance, when I display rx_dropped from the folder, the result is always 0.

This is the ifconfig display of the interface:

wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.115  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::6f9d:4eac:5bec:1ea6  prefixlen 64  scopeid 0x20<link>
        ether 88:b1:11:6a:1d:82  txqueuelen 1000  (Ethernet)
        RX packets 42483  bytes 55964467 (55.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9309  bytes 1393476 (1.3 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

My question is, If I wanted to know the dropped packets in 1 second intervals, where could I get that information? ethtool seems to be a good option, but I don't know where it is getting information from and I don't understand why the information is different from the statistics folder...

Also, what would that 30 value in the rx_dropped mean? Is it the dropped packets since the interface is up?

telcoM

ethtool gets the statistics using the SIOCETHTOOL ioctl, which takes a pointer to struct ethtool_stats. To get the statistics, the cmd field of the struct should have the value ETHTOOL_GSTATS. Before calling that ioctl, you must use another ethtool ioctl (also SIOCETHTOOL, with either a pointer to struct ethtool_sset_info with its cmd field initialized to ETHTOOL_GSSET_INFO, or a pointer to struct ethtool_drvinfo with its cmd field initialized to ETHTOOL_GDRVINFO) to know the number of different statistics values the driver is about to return, so you can allocate enough memory for struct ethtool_stats.

...And if you don't program in C, the very dense, jargon-rich description above probably did not make any sense at all to you. If you need to access ethtool statistics in a script, I would recommend using a scripting language that has bindings for the ethtool interface available, like Perl (module Linux::Ethtool) or Python (apparently https://pypi.org/project/netifaces/). Those should make accessing the statistics much more straightforward.

Of course you can always parse the output of the ethtool command, but if you want to poll the statistics once every second, it might be beneficial to eliminate the need to vfork() a new process or two every time you need the statistics.

The resulting values come from the NIC driver. The fact that the driver developer hasn't added the code to access the relevant statistics also via /sys/class/net/<name>/statistics nor via /proc/net/dev where ifconfig gets them from suggests that the driver might define those values somewhat differently than /proc/net/dev and/or /sys/class/net/*/statistics... or it might simply indicate that the driver implementation is unfortunately not perfect.

(The developer may have chosen to implement the ethtool API first, since it is the newest one, and left the older statistics interfaces incomplete for "when I have the time." Also note that the ifconfig command is being deprecated by most distributions since it is not well maintained any more.)

To find out the details, you may have to read the documentation and/or the source code comments of the actual driver. As you did not specify the NIC model nor the name of the driver, nobody else can do it for you. The output of ethtool -i wlp2s0 would be of great use in identifying the NIC driver.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Where does Firefox get the HSTS information from?

Where does the whois command get its information from?

Where does the command "top" get its information from in linux?

Where does Go get time zone information from?

Where does Linux get information on what to open from?

Where does PHP get it's DATE information from?

Where does system information come from

where does git retrieve credential information from?

where does lspci gather its information from?

Where does the ACPI battery information come from?

Where does the System Information information come from on login?

How does isatty() get the information from the terminal?

Google reCAPTCHA invisible - Where does it get it's information?

Where does VSC get its information that's displayed in the tooltips?

In the following example, from where does the pointer p gets the information?

where does 'pkg-config' takes its information from?

get information from other table where id=id

In a trigger in Oracle, how to get the information out of the `where` from an update?

From where geocode server Apple API get its information

From where does reducer get the current state

Where does JavaScript get a new Date() from

Where does Pipenv get their CVE data from?

Where does Quickly get the PPA name from?

Where does get_and_drive come from?

Where does the "page" GET parameter come from?

Where does the below function get parameters from?

Where does "this.get('filter')" comes from?

Where does SNMP OIDs get the data from?

Where does faker get the fake data from?