summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2008-07-18 14:45:56 -0300
committerArnaldo Carvalho de Melo <acme@redhat.com>2008-07-18 14:45:56 -0300
commite48469e3eef7982c6de6f0042cdeccb6f5466ef5 (patch)
tree7fb672ecaab3b05a8b5ac5e0496ac4a0d50ee373
parente7b8606cffd39770e94b23993ada800be222ee8f (diff)
downloadpython-ethtool-e48469e3eef7982c6de6f0042cdeccb6f5466ef5.tar.gz
python-ethtool-e48469e3eef7982c6de6f0042cdeccb6f5466ef5.tar.xz
python-ethtool-e48469e3eef7982c6de6f0042cdeccb6f5466ef5.zip
ethtool: bindings for binding for ETHTOOL_[GS]RINGPARAM
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rwxr-xr-xethtool-cmd.py81
-rw-r--r--python-ethtool/ethtool.c50
2 files changed, 129 insertions, 2 deletions
diff --git a/ethtool-cmd.py b/ethtool-cmd.py
index 47ee6ac..49d667e 100755
--- a/ethtool-cmd.py
+++ b/ethtool-cmd.py
@@ -207,6 +207,75 @@ def set_offload(interface, args):
except:
pass
+ethtool_ringparam_msgs = (
+ ( "Pre-set maximums", ),
+ ( "RX:\t\t", "rx_max_pending" ),
+ ( "RX Mini:\t", "rx_mini_max_pending" ),
+ ( "RX Jumbo:\t", "rx_jumbo_max_pending" ),
+ ( "TX:\t\t", "tx_max_pending" ),
+ ( "Current hardware settings", ),
+ ( "RX:\t\t", "rx_pending" ),
+ ( "RX Mini:\t", "rx_mini_pending" ),
+ ( "RX Jumbo:\t", "rx_jumbo_pending" ),
+ ( "TX:\t\t", "tx_pending" ),
+)
+
+def show_ring(interface, args = None):
+ printtab("Ring parameters for %s:" % interface)
+ try:
+ ring = ethtool.get_ringparam(interface)
+ except IOError:
+ printtab(" NOT supported!")
+ return
+
+ printed = []
+ for tunable in ethtool_ringparam_msgs:
+ if len(tunable) == 1:
+ printtab("%s:" % tunable[0])
+ else:
+ printtab("%s %s" % (tunable[0], ring[tunable[1]]))
+ printed.append(tunable[1])
+
+ ringkeys = ring.keys()
+ if len(ringkeys) != len(printed):
+ print
+ for tunable in ringkeys:
+ if tunable not in printed:
+ printtab("%s %s" % (tunable, ring[tunable]))
+
+ethtool_ringparam_map = {
+ "rx": "rx_pending",
+ "rx-mini": "rx_mini_pending",
+ "rx-jumbo": "rx_jumbo_pending",
+ "tx": "tx_pending",
+}
+
+def set_ringparam(interface, args):
+ try:
+ ring = ethtool.get_ringparam(interface)
+ except IOError:
+ printtab("ring parameters NOT supported on %s!" % interface)
+ return
+
+ changed = False
+ args = [a.lower() for a in args]
+ for arg, value in [ ( args[i], args[i + 1] ) for i in range(0, len(args), 2) ]:
+ if not ethtool_ringparam_map.has_key(arg):
+ continue
+ try:
+ value = int(value)
+ except:
+ continue
+ real_arg = ethtool_ringparam_map[arg]
+ if ring[real_arg] != value:
+ ring[real_arg] = value
+ changed = True
+
+ if not changed:
+ return
+
+ ethtool.set_ringparam(interface, ring)
+
def show_driver(interface, args = None):
try:
driver = ethtool.get_module(interface)
@@ -249,10 +318,12 @@ def main():
try:
opts, args = getopt.getopt(sys.argv[1:],
- "hcCikK",
+ "hcCgGikK",
("help",
"show-coalesce",
"coalesce",
+ "show-ring",
+ "set-ring",
"driver",
"show-offload",
"offload"))
@@ -278,8 +349,12 @@ def main():
elif o in ("-k", "--show-offload"):
run_cmd_noargs(show_offload, args)
break
+ elif o in ("-g", "--show-ring"):
+ run_cmd_noargs(show_ring, args)
+ break
elif o in ("-K", "--offload",
- "-C", "--coalesce"):
+ "-C", "--coalesce",
+ "-G", "--set-ring"):
all_devices = ethtool.get_devices()
if len(args) < 2:
usage()
@@ -295,6 +370,8 @@ def main():
cmd = set_offload
elif o in ("-C", "--coalesce"):
cmd = set_coalesce
+ elif o in ("-G", "--set-ring"):
+ cmd = set_ringparam
run_cmd(cmd, interface, args)
break
diff --git a/python-ethtool/ethtool.c b/python-ethtool/ethtool.c
index ba8eaa3..cbc083d 100644
--- a/python-ethtool/ethtool.c
+++ b/python-ethtool/ethtool.c
@@ -667,6 +667,46 @@ static PyObject *set_coalesce(PyObject *self __unused, PyObject *args)
return Py_None;
}
+struct struct_desc ethtool_ringparam_desc[] = {
+ member_desc(struct ethtool_ringparam, rx_max_pending),
+ member_desc(struct ethtool_ringparam, rx_mini_max_pending),
+ member_desc(struct ethtool_ringparam, rx_jumbo_max_pending),
+ member_desc(struct ethtool_ringparam, tx_max_pending),
+ member_desc(struct ethtool_ringparam, rx_pending),
+ member_desc(struct ethtool_ringparam, rx_mini_pending),
+ member_desc(struct ethtool_ringparam, rx_jumbo_pending),
+ member_desc(struct ethtool_ringparam, tx_pending),
+};
+
+static PyObject *get_ringparam(PyObject *self __unused, PyObject *args)
+{
+ struct ethtool_ringparam ring;
+
+ if (get_dev_value(ETHTOOL_GRINGPARAM, args, &ring) < 0)
+ return NULL;
+
+ return struct_desc_create_dict(ethtool_ringparam_desc, &ring);
+}
+
+static PyObject *set_ringparam(PyObject *self __unused, PyObject *args)
+{
+ struct ethtool_ringparam ring;
+ char *devname;
+ PyObject *dict;
+
+ if (!PyArg_ParseTuple(args, "sO", &devname, &dict))
+ return NULL;
+
+ if (struct_desc_from_dict(ethtool_ringparam_desc, &ring, dict) != 0)
+ return NULL;
+
+ if (send_command(ETHTOOL_SRINGPARAM, devname, &ring))
+ return NULL;
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
static struct PyMethodDef PyEthModuleMethods[] = {
{
.ml_name = "get_module",
@@ -719,6 +759,16 @@ static struct PyMethodDef PyEthModuleMethods[] = {
.ml_flags = METH_VARARGS,
},
{
+ .ml_name = "get_ringparam",
+ .ml_meth = (PyCFunction)get_ringparam,
+ .ml_flags = METH_VARARGS,
+ },
+ {
+ .ml_name = "set_ringparam",
+ .ml_meth = (PyCFunction)set_ringparam,
+ .ml_flags = METH_VARARGS,
+ },
+ {
.ml_name = "get_tso",
.ml_meth = (PyCFunction)get_tso,
.ml_flags = METH_VARARGS,