diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2008-07-18 14:45:56 -0300 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2008-07-18 14:45:56 -0300 |
commit | e48469e3eef7982c6de6f0042cdeccb6f5466ef5 (patch) | |
tree | 7fb672ecaab3b05a8b5ac5e0496ac4a0d50ee373 | |
parent | e7b8606cffd39770e94b23993ada800be222ee8f (diff) | |
download | python-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-x | ethtool-cmd.py | 81 | ||||
-rw-r--r-- | python-ethtool/ethtool.c | 50 |
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, |