Commit 4e24f2dd authored by Chas Williams's avatar Chas Williams Committed by David S. Miller

Allow ethtool to change tun link settings

Let user space set whatever it would like to advertise for the
tun interface.  Preserve the existing defaults.
Signed-off-by: default avatarChas Williams <3chas3@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4cd328f8
...@@ -81,6 +81,9 @@ ...@@ -81,6 +81,9 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
static void tun_default_link_ksettings(struct net_device *dev,
struct ethtool_link_ksettings *cmd);
/* Uncomment to enable debugging */ /* Uncomment to enable debugging */
/* #define TUN_DEBUG 1 */ /* #define TUN_DEBUG 1 */
...@@ -242,6 +245,7 @@ struct tun_struct { ...@@ -242,6 +245,7 @@ struct tun_struct {
struct bpf_prog __rcu *xdp_prog; struct bpf_prog __rcu *xdp_prog;
struct tun_prog __rcu *steering_prog; struct tun_prog __rcu *steering_prog;
struct tun_prog __rcu *filter_prog; struct tun_prog __rcu *filter_prog;
struct ethtool_link_ksettings link_ksettings;
}; };
struct veth { struct veth {
...@@ -2295,6 +2299,7 @@ static void tun_setup(struct net_device *dev) ...@@ -2295,6 +2299,7 @@ static void tun_setup(struct net_device *dev)
tun->owner = INVALID_UID; tun->owner = INVALID_UID;
tun->group = INVALID_GID; tun->group = INVALID_GID;
tun_default_link_ksettings(dev, &tun->link_ksettings);
dev->ethtool_ops = &tun_ethtool_ops; dev->ethtool_ops = &tun_ethtool_ops;
dev->needs_free_netdev = true; dev->needs_free_netdev = true;
...@@ -3326,7 +3331,7 @@ static struct miscdevice tun_miscdev = { ...@@ -3326,7 +3331,7 @@ static struct miscdevice tun_miscdev = {
/* ethtool interface */ /* ethtool interface */
static int tun_get_link_ksettings(struct net_device *dev, static void tun_default_link_ksettings(struct net_device *dev,
struct ethtool_link_ksettings *cmd) struct ethtool_link_ksettings *cmd)
{ {
ethtool_link_ksettings_zero_link_mode(cmd, supported); ethtool_link_ksettings_zero_link_mode(cmd, supported);
...@@ -3336,6 +3341,23 @@ static int tun_get_link_ksettings(struct net_device *dev, ...@@ -3336,6 +3341,23 @@ static int tun_get_link_ksettings(struct net_device *dev,
cmd->base.port = PORT_TP; cmd->base.port = PORT_TP;
cmd->base.phy_address = 0; cmd->base.phy_address = 0;
cmd->base.autoneg = AUTONEG_DISABLE; cmd->base.autoneg = AUTONEG_DISABLE;
}
static int tun_get_link_ksettings(struct net_device *dev,
struct ethtool_link_ksettings *cmd)
{
struct tun_struct *tun = netdev_priv(dev);
memcpy(cmd, &tun->link_ksettings, sizeof(*cmd));
return 0;
}
static int tun_set_link_ksettings(struct net_device *dev,
const struct ethtool_link_ksettings *cmd)
{
struct tun_struct *tun = netdev_priv(dev);
memcpy(&tun->link_ksettings, cmd, sizeof(*cmd));
return 0; return 0;
} }
...@@ -3406,6 +3428,7 @@ static const struct ethtool_ops tun_ethtool_ops = { ...@@ -3406,6 +3428,7 @@ static const struct ethtool_ops tun_ethtool_ops = {
.get_coalesce = tun_get_coalesce, .get_coalesce = tun_get_coalesce,
.set_coalesce = tun_set_coalesce, .set_coalesce = tun_set_coalesce,
.get_link_ksettings = tun_get_link_ksettings, .get_link_ksettings = tun_get_link_ksettings,
.set_link_ksettings = tun_set_link_ksettings,
}; };
static int tun_queue_resize(struct tun_struct *tun) static int tun_queue_resize(struct tun_struct *tun)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment