Re: [PATCH] ethtool: command line support for lro
From: Ben Hutchings <hidden>
Date: 2008-03-10 18:07:11
Stephen Hemminger wrote:
Add lro support to command in similar manner to TSO, GSO, etc. The file ethtool-copy.h is updated to be sanitised version of ethtool.h from 2.6.25-rc4 (ie make headers_install)
I already posted a patch to do this, though I didn't update ethtool-copy.h.
Not tested on actual LRO hardware.
Mine was, and this looks very similar.
quoted hunk ↗ jump to hunk
@@ -1559,12 +1566,20 @@ static int do_goffload(int fd, struct ifreq *ifr) allfail = 0; } + eval.cmd = ETHTOOL_GFLAGS; + ifr->ifr_data = (caddr_t)&eval; + err = ioctl(fd, SIOCETHTOOL, ifr); + if (!err) { + lro = eval.data & ETH_FLAG_LRO; + allfail = 0; + } +
To be consistent, this should print a specific error if the ioctl fails.
quoted hunk ↗ jump to hunk
@@ -1641,6 +1656,30 @@ static int do_soffload(int fd, struct ifreq *ifr) return 90; } } + if (off_lro_wanted >= 0) { + changed = 1; + eval.cmd = ETHTOOL_GFLAGS; + eval.data = 0; + ifr->ifr_data = (caddr_t)&eval; + err = ioctl(fd, SIOCETHTOOL, ifr); + if (err) { + perror("Cannot get device flag settings"); + return 90; + }
I didn't bother fetching the existing flags because only ETH_FLAG_LRO is defined. But this would be more future-proof.
+
+ eval.cmd = ETHTOOL_SFLAGS;
+ if (off_lro_wanted == 1)
+ eval.data |= ETH_FLAG_LRO;
+ else
+ eval.data &= ~ETH_FLAG_LRO;
+
+ err = ioctl(fd, SIOCETHTOOL, ifr);
+ if (err) {
+ perror("Cannot set large receive offload settings");
+ return 90;
+ }The error return codes are unique so far, so these error paths should return 91 and 92, not 90. Ben. -- Ben Hutchings, Senior Software Engineer, Solarflare Communications Not speaking for my employer; that's the marketing department's job.