Skip to content

Commit 4100455

Browse files
Merge pull request #38 from RemyDelion/add_offload_gro_functions
Offload: adding set_gso(), get_gro() and set_gro() functions
2 parents e81a76e + a337984 commit 4100455

File tree

5 files changed

+74
-4
lines changed

5 files changed

+74
-4
lines changed

python-ethtool/ethtool-copy.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,8 @@ struct ethtool_stats {
290290
#define ETHTOOL_SUFO 0x00000022 /* Set UFO enable (e.v.) */
291291
#define ETHTOOL_GGSO 0x00000023 /* Get GSO enable (e.v.) */
292292
#define ETHTOOL_SGSO 0x00000024 /* Set GSO enable (e.v.) */
293+
#define ETHTOOL_GGRO 0x0000002b /* Get GRO enable (e.v.) */
294+
#define ETHTOOL_SGRO 0x0000002c /* Set GRO enable (e.v.) */
293295

294296
/* compatibility with older code */
295297
#define SPARC_ETH_GSET ETHTOOL_GSET

python-ethtool/ethtool.c

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,34 @@ static PyObject *get_gso(PyObject *self __unused, PyObject *args)
616616
return Py_BuildValue("b", value);
617617
}
618618

619+
static PyObject *set_gso(PyObject *self __unused, PyObject *args)
620+
{
621+
if (dev_set_int_value(ETHTOOL_SGSO, args) < 0)
622+
return NULL;
623+
624+
Py_INCREF(Py_None);
625+
return Py_None;
626+
}
627+
628+
static PyObject *get_gro(PyObject *self __unused, PyObject *args)
629+
{
630+
int value = 0;
631+
632+
if (get_dev_int_value(ETHTOOL_GGRO, args, &value) < 0)
633+
return NULL;
634+
635+
return Py_BuildValue("b", value);
636+
}
637+
638+
static PyObject *set_gro(PyObject *self __unused, PyObject *args)
639+
{
640+
if (dev_set_int_value(ETHTOOL_SGRO, args) < 0)
641+
return NULL;
642+
643+
Py_INCREF(Py_None);
644+
return Py_None;
645+
}
646+
619647
static PyObject *get_sg(PyObject *self __unused, PyObject *args)
620648
{
621649
int value = 0;
@@ -928,6 +956,21 @@ static struct PyMethodDef PyEthModuleMethods[] = {
928956
.ml_meth = (PyCFunction)get_gso,
929957
.ml_flags = METH_VARARGS,
930958
},
959+
{
960+
.ml_name = "set_gso",
961+
.ml_meth = (PyCFunction)set_gso,
962+
.ml_flags = METH_VARARGS,
963+
},
964+
{
965+
.ml_name = "get_gro",
966+
.ml_meth = (PyCFunction)get_gro,
967+
.ml_flags = METH_VARARGS,
968+
},
969+
{
970+
.ml_name = "set_gro",
971+
.ml_meth = (PyCFunction)set_gro,
972+
.ml_flags = METH_VARARGS,
973+
},
931974
{
932975
.ml_name = "get_sg",
933976
.ml_meth = (PyCFunction)get_sg,

scripts/pethtool

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,10 +211,16 @@ def show_offload(interface, args=None):
211211
except IOError:
212212
gso = 'not supported'
213213

214+
try:
215+
gro = ethtool.get_gro(interface) and 'on' or 'off'
216+
except IOError:
217+
gro = 'not supported'
218+
214219
printtab('scatter-gather: %s' % sg)
215220
printtab('tcp segmentation offload: %s' % tso)
216221
printtab('udp fragmentation offload: %s' % ufo)
217222
printtab('generic segmentation offload: %s' % gso)
223+
printtab('generic receive offload: %s' % gro)
218224

219225

220226
def set_offload(interface, args):
@@ -226,6 +232,18 @@ def set_offload(interface, args):
226232
ethtool.set_tso(interface, value)
227233
except:
228234
pass
235+
elif cmd == 'gso':
236+
value = value == 'on' and 1 or 0
237+
try:
238+
ethtool.set_gso(interface, value)
239+
except:
240+
pass
241+
elif cmd == 'gro':
242+
value = value == 'on' and 1 or 0
243+
try:
244+
ethtool.set_gro(interface, value)
245+
except:
246+
pass
229247

230248

231249
ethtool_ringparam_msgs = (

tests/test_ethtool.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ def _functions_accepting_devnames(self, devname):
121121
if not ifconfig.oldFormat:
122122
self.assertEqual(ethtool.get_flags(devname), scraped.flagsint)
123123
self.assertIsInt(ethtool.get_gso(devname))
124+
self.assertIsInt(ethtool.get_gro(devname))
124125
self.assertIsString(ethtool.get_hwaddr(devname))
125126
self.assertEqualHwAddr(ethtool.get_hwaddr(devname),
126127
scraped.hwaddr)
@@ -154,6 +155,10 @@ def _functions_accepting_devnames(self, devname):
154155

155156
# TODO: self.assertIsString(ethtool.set_tso(devname))
156157

158+
# TODO: self.assertIsString(ethtool.set_gso(devname))
159+
160+
# TODO: self.assertIsString(ethtool.set_gro(devname))
161+
157162
def _verify_etherinfo_object(self, ei):
158163
self.assertTrue(isinstance(ei, ethtool.etherinfo))
159164
self.assertIsString(ei.device)
@@ -196,14 +201,15 @@ def test_invalid_devices(self):
196201
# Verify sane handling of non-existant devices
197202

198203
get_fns = ('get_broadcast', 'get_businfo', 'get_coalesce', 'get_flags',
199-
'get_gso', 'get_hwaddr', 'get_ipaddr', 'get_module',
200-
'get_netmask', 'get_ringparam', 'get_sg', 'get_tso',
201-
'get_ufo')
204+
'get_gso', 'get_gso', 'get_hwaddr', 'get_ipaddr',
205+
'get_module', 'get_netmask', 'get_ringparam', 'get_sg',
206+
'get_tso', 'get_ufo')
202207
for fnname in get_fns:
203208
self.assertRaisesNoSuchDevice(getattr(ethtool, fnname),
204209
INVALID_DEVICE_NAME)
205210

206-
set_fns = ('set_coalesce', 'set_ringparam', 'set_tso')
211+
set_fns = ('set_coalesce', 'set_ringparam', 'set_tso', 'set_gso',
212+
'set_gro')
207213
for fnname in set_fns:
208214
# Currently this fails, with an IOError from
209215
# ethtool.c:__struct_desc_from_dict

tests/test_scripts.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ def test_show_offload_lo(self):
7777
tcp segmentation offload: on
7878
udp fragmentation offload: on
7979
generic segmentation offload: on
80+
generic receive offload: on
8081
'''
8182
)
8283

0 commit comments

Comments
 (0)