Skip to content

Commit

Permalink
Allow ethtool to change tun link settings
Browse files Browse the repository at this point in the history
Let user space set whatever it would like to advertise for the
tun interface.  Preserve the existing defaults.

Signed-off-by: Chas Williams <3chas3@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Chas Williams authored and David S. Miller committed Jun 4, 2018
1 parent 4cd328f commit 4e24f2d
Showing 1 changed file with 25 additions and 2 deletions.
27 changes: 25 additions & 2 deletions drivers/net/tun.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@
#include <linux/uaccess.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 */
/* #define TUN_DEBUG 1 */

Expand Down Expand Up @@ -242,6 +245,7 @@ struct tun_struct {
struct bpf_prog __rcu *xdp_prog;
struct tun_prog __rcu *steering_prog;
struct tun_prog __rcu *filter_prog;
struct ethtool_link_ksettings link_ksettings;
};

struct veth {
Expand Down Expand Up @@ -2295,6 +2299,7 @@ static void tun_setup(struct net_device *dev)

tun->owner = INVALID_UID;
tun->group = INVALID_GID;
tun_default_link_ksettings(dev, &tun->link_ksettings);

dev->ethtool_ops = &tun_ethtool_ops;
dev->needs_free_netdev = true;
Expand Down Expand Up @@ -3326,8 +3331,8 @@ static struct miscdevice tun_miscdev = {

/* ethtool interface */

static int tun_get_link_ksettings(struct net_device *dev,
struct ethtool_link_ksettings *cmd)
static void tun_default_link_ksettings(struct net_device *dev,
struct ethtool_link_ksettings *cmd)
{
ethtool_link_ksettings_zero_link_mode(cmd, supported);
ethtool_link_ksettings_zero_link_mode(cmd, advertising);
Expand All @@ -3336,6 +3341,23 @@ static int tun_get_link_ksettings(struct net_device *dev,
cmd->base.port = PORT_TP;
cmd->base.phy_address = 0;
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;
}

Expand Down Expand Up @@ -3406,6 +3428,7 @@ static const struct ethtool_ops tun_ethtool_ops = {
.get_coalesce = tun_get_coalesce,
.set_coalesce = tun_set_coalesce,
.get_link_ksettings = tun_get_link_ksettings,
.set_link_ksettings = tun_set_link_ksettings,
};

static int tun_queue_resize(struct tun_struct *tun)
Expand Down

0 comments on commit 4e24f2d

Please sign in to comment.