batman-adv: ELP - use new ethtool_link_get_ksettings API
RFC 1/1 batman-adv: ELP - use new ethtool_link_get_ksettings API
The ethtool API is changing in linux-4.6 and the B.A.T.M.A.N. V code has to be changed accordingly.
---
This patch contains some compat code which is an attempt to implement backward compatibility with kernel <4.6. Unfortunately my attempt does not work because it is not possible to redefine something like link_settings.base.speed to something else (due to the '.' in the string).
Any suggestion? :)
compat-include/linux/ethtool.h | 35 +++++++++++++++++++++++++++++++++++ net/batman-adv/bat_v_elp.c | 12 ++++++------ 2 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 compat-include/linux/ethtool.h
compat-include/linux/ethtool.h new file +35 -0
@@ -0,0 +1,35 @@ +/* Copyright (C) 2016 B.A.T.M.A.N. contributors: +* +* Antonio Quartulli +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of version 2 of the GNU General Public +* License as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, see <http://www.gnu.org/licenses/>. +* +* This file contains macros for maintaining compatibility with older versions +* of the Linux kernel. +*/ + +#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_ETHTOOL_H_ +#define _NET_BATMAN_ADV_COMPAT_LINUX_ETHTOOL_H_ + +#include <linux/version.h> +#include_next <linux/ethtool.h> + +#if LINUX_VERSION_CODE <KERNEL_VERSION (4 ,6 ,0 ) + +#define ethtool_link_ksettings ethtool_cmd +#define __ethtool_get_link_ksettings __ethtool_get_settings +#define link_settings.base.speed ethtool_cmd_speed(&link_settings) + +#endif /* < KERNEL_VERSION(4, 6, 0) */ + +#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_ETHTOOL_H_ */
net/batman-adv/bat_v_elp.c +6 -6
@@ -73,8 +73,8 @@ static void batadv_v_elp_start_timer(struct batadv_hard_iface *hard_iface)static u32 batadv_v_elp_get_throughput (struct batadv_hardif_neigh_node *neigh) {struct batadv_hard_iface *hard_iface = neigh->if_incoming; +struct ethtool_link_ksettings link_settings;struct station_info sinfo; -struct ethtool_cmd cmd;u32 throughput;int ret;
@@ -110,19 +110,19 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh)/* if not a wifi interface, check if this device provides data via * ethtool (e.g. an Ethernet adapter) */ -memset (&cmd,0 ,sizeof (cmd)); +memset (&link_settings,0 ,sizeof (link_settings));rtnl_lock (); - ret =__ethtool_get_settings (hard_iface->net_dev, &cmd); + ret =__ethtool_get_link_ksettings (hard_iface->net_dev, &link_settings);rtnl_unlock ();if (ret ==0 ) {/* link characteristics might change over time */ -if (cmd.duplex ==DUPLEX_FULL ) +if (link_settings.base.duplex ==DUPLEX_FULL ) hard_iface->bat_v.flags |=BATADV_FULL_DUPLEX ;else hard_iface->bat_v.flags &= ~BATADV_FULL_DUPLEX ; - throughput =ethtool_cmd_speed (&cmd); -if (throughput && throughput !=SPEED_UNKNOWN ) + throughput = link_settings.base.speed; +if (throughput && (throughput !=SPEED_UNKNOWN ))return throughput *10 ; }
Signature · 1 line
2.7.2
Sven Eckelmann
maintainerRFC v2 1/1 batman-adv: ELP - use new ethtool_link_get_ksettings API
From: Antonio Quartulli <[email protected]>
The ethtool API is changing in linux-4.6 and the B.A.T.M.A.N. V code has to be changed accordingly.
---
v2:
- Add pseudo-struct and wrapper function which only provides speed + duplex
Antonio, this may be a way to add some compat code for this problem. I've only did a fast compile check. So I would recommend to really test it :)
compat-include/linux/ethtool.h | 62 ++++++++++++++++++++++++++++++++++++++++++ net/batman-adv/bat_v_elp.c | 12 ++++---- 2 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 compat-include/linux/ethtool.h
compat-include/linux/ethtool.h new file +62 -0
@@ -0,0 +1,62 @@ +/* Copyright (C) 2016 B.A.T.M.A.N. contributors: +* +* Antonio Quartulli +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of version 2 of the GNU General Public +* License as published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, see <http://www.gnu.org/licenses/>. +* +* This file contains macros for maintaining compatibility with older versions +* of the Linux kernel. +*/ + +#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_ETHTOOL_H_ +#define _NET_BATMAN_ADV_COMPAT_LINUX_ETHTOOL_H_ + +#include <linux/version.h> +#include_next <linux/ethtool.h> + +#if LINUX_VERSION_CODE <KERNEL_VERSION (4 ,6 ,0 ) + +#define ethtool_link_ksettings batadv_ethtool_link_ksettings + +struct batadv_ethtool_link_ksettings { +struct { +__u32 speed; +__u8 duplex; + } base; +}; + +#define __ethtool_get_link_ksettings (__dev, __link_settings) \ + batadv_ethtool_get_link_ksettings(__dev, __link_settings) + +static inline int +batadv_ethtool_get_link_ksettings (struct net_device *dev, +struct ethtool_link_ksettings *link_ksettings) +{ +struct ethtool_cmd cmd; +int ret; + +memset (&cmd,0 ,sizeof (cmd)); + ret =__ethtool_get_settings (dev, &cmd); + +if (ret !=0 ) +return ret; + + link_ksettings->base.duplex = cmd.duplex; + link_ksettings->base.speed =ethtool_cmd_speed (&cmd); + +return 0 ; +} + +#endif /* < KERNEL_VERSION(4, 6, 0) */ + +#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_ETHTOOL_H_ */
net/batman-adv/bat_v_elp.c +6 -6
@@ -73,8 +73,8 @@ static void batadv_v_elp_start_timer(struct batadv_hard_iface *hard_iface)static u32 batadv_v_elp_get_throughput (struct batadv_hardif_neigh_node *neigh) {struct batadv_hard_iface *hard_iface = neigh->if_incoming; +struct ethtool_link_ksettings link_settings;struct station_info sinfo; -struct ethtool_cmd cmd;u32 throughput;int ret;
@@ -110,19 +110,19 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh)/* if not a wifi interface, check if this device provides data via * ethtool (e.g. an Ethernet adapter) */ -memset (&cmd,0 ,sizeof (cmd)); +memset (&link_settings,0 ,sizeof (link_settings));rtnl_lock (); - ret =__ethtool_get_settings (hard_iface->net_dev, &cmd); + ret =__ethtool_get_link_ksettings (hard_iface->net_dev, &link_settings);rtnl_unlock ();if (ret ==0 ) {/* link characteristics might change over time */ -if (cmd.duplex ==DUPLEX_FULL ) +if (link_settings.base.duplex ==DUPLEX_FULL ) hard_iface->bat_v.flags |=BATADV_FULL_DUPLEX ;else hard_iface->bat_v.flags &= ~BATADV_FULL_DUPLEX ; - throughput =ethtool_cmd_speed (&cmd); -if (throughput && throughput !=SPEED_UNKNOWN ) + throughput = link_settings.base.speed; +if (throughput && (throughput !=SPEED_UNKNOWN ))return throughput *10 ; }
Signature · 1 line
2.7.0
Quoted 24 lines · Sven Eckelmann
compat-include/linux/ethtool.h new file +24
-0+#if LINUX_VERSION_CODE <KERNEL_VERSION (4 ,6 ,0 ) + +#define ethtool_link_ksettings batadv_ethtool_link_ksettings + +struct batadv_ethtool_link_ksettings { +struct { +__u32 speed; +__u8 duplex; + } base; +}; + +#define __ethtool_get_link_ksettings (__dev, __link_settings) \ + batadv_ethtool_get_link_ksettings(__dev, __link_settings) + +static inline int +batadv_ethtool_get_link_ksettings (struct net_device *dev, +struct ethtool_link_ksettings *link_ksettings) +{ +struct ethtool_cmd cmd; +int ret; + +memset (&cmd,0 ,sizeof (cmd)); + ret =__ethtool_get_settings (dev, &cmd); +
compat-include/linux/ethtool.h line 60
Quoted 10 lines
compat-include/linux/ethtool.h new file +10
-0+if (ret !=0 ) +return ret; + + link_ksettings->base.duplex = cmd.duplex; + link_ksettings->base.speed =ethtool_cmd_speed (&cmd); + + return 0; +} + +#endif /* < KERNEL_VERSION(4, 6, 0) */
Hi Sven,
I really like this approach! thanks a lot!
By the way, you should have added your name to the list of contributor of this file though :)
How about re-sending this RFC as PATCH (with your sign-off as well) ?
Cheers,
Signature · 1 line
Antonio Quartulli
Sven Eckelmann
maintainerOn Sunday 28 February 2016 17:08:38 Antonio Quartulli wrote:
[...]
Quoted 3 lines
I really like this approach! thanks a lot!
By the way, you should have added your name to the list of contributor of this file though :)
Maybe you never noticed but my name is nowhere in the batman-adv/batctl sourcecode. The only reason why it is in alfred/packet.h: because Simon added it.
Quoted 1 line
How about re-sending this RFC as PATCH (with your sign-off as well) ?
Yes, I will send it.
Kind regards,
Sven