Re: [PATCH V2 1/1] tun: change speed from 10M to dynamically configured
flat view
From: Jonathon Reinhart <hidden>
Date: 2015-02-13 05:42:33
Also in the default case, you've already cleared the existing TUN_CTRL_SPD flags, which probably isn't what a user would expect if he passed an invalid value. On Fri, Feb 13, 2015 at 12:31 AM, yzhu1 [off-list ref] wrote:
On 02/13/2015 11:44 AM, Jonathon Reinhart wrote:quoted
Shouldn't the default case of tun_set_settings() return -EINVAL instead of zero?I agree with you. Zhu Yanjunquoted
On Thu, Feb 12, 2015 at 10:35 PM, Zhu Yanjun [off-list ref] wrote:quoted
The default speed of normal nic is 1000M while the default speed of tun is 10M. Now the default speed of tun is changed to 1000M. And there are 3 options: 10M, 100M and 1000M to the speed of tun. The command "ethtool -s tun0 speed 10/100/1000" can configure the speed of tun dynamically. CC: Michael S. Tsirkin <mst@redhat.com> CC: Jason Wang <redacted> CC: Al Viro <viro@zeniv.linux.org.uk> Reviewed-by: Sergei Shtylyov <redacted> Signed-off-by: Zhu Yanjun <redacted> --- drivers/net/tun.c | 42 +++++++++++++++++++++++++++++++++++++++++- include/uapi/linux/if_tun.h | 5 +++++ 2 files changed, 46 insertions(+), 1 deletion(-)diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 8c8dc16..0ee36f1 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c@@ -950,6 +950,9 @@ static void tun_net_init(struct net_device *dev) dev->addr_len = 0; dev->mtu = 1500; + /* Set default speed 1000M */ + tun->flags |= TUN_CTRL_SPD_1000; + /* Zero header length */ dev->type = ARPHRD_NONE; dev->flags = IFF_POINTOPOINT | IFF_NOARP |IFF_MULTICAST;@@ -2257,9 +2260,18 @@ static struct miscdevice tun_miscdev = { static int tun_get_settings(struct net_device *dev, struct ethtool_cmd*cmd) { + struct tun_struct *tun = netdev_priv(dev); + + /* Get the speed of tun */ + if (tun->flags & TUN_CTRL_SPD_1000) { + ethtool_cmd_speed_set(cmd, SPEED_1000); + } else if (tun->flags & TUN_CTRL_SPD_100) { + ethtool_cmd_speed_set(cmd, SPEED_100); + } else + ethtool_cmd_speed_set(cmd, SPEED_10); + cmd->supported = 0; cmd->advertising = 0; - ethtool_cmd_speed_set(cmd, SPEED_10); cmd->duplex = DUPLEX_FULL; cmd->port = PORT_TP; cmd->phy_address = 0;@@ -2287,6 +2299,33 @@ static void tun_get_drvinfo(struct net_device*dev, struct ethtool_drvinfo *info } } +static int tun_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) +{ + struct tun_struct *tun = netdev_priv(dev); + u32 speed = ethtool_cmd_speed(cmd); + + /* Clear speed flag */ + tun->flags &= ~(TUN_CTRL_SPD_10 | TUN_CTRL_SPD_100 | + TUN_CTRL_SPD_1000); + + /* Set speed flag */ + switch (speed) { + case 10: + tun->flags |= TUN_CTRL_SPD_10; + break; + case 100: + tun->flags |= TUN_CTRL_SPD_100; + break; + case 1000: + tun->flags |= TUN_CTRL_SPD_1000; + break; + default: + tun_debug(KERN_INFO, tun, "wrong speed!\n"); + } + + return 0; +} + static u32 tun_get_msglevel(struct net_device *dev) { #ifdef TUN_DEBUG@@ -2307,6 +2346,7 @@ static void tun_set_msglevel(struct net_device*dev, u32 value) static const struct ethtool_ops tun_ethtool_ops = { .get_settings = tun_get_settings, + .set_settings = tun_set_settings, .get_drvinfo = tun_get_drvinfo, .get_msglevel = tun_get_msglevel, .set_msglevel = tun_set_msglevel,diff --git a/include/uapi/linux/if_tun.h b/include/uapi/linux/if_tun.h index 50ae243..78a09a7 100644 --- a/include/uapi/linux/if_tun.h +++ b/include/uapi/linux/if_tun.h@@ -66,6 +66,11 @@ #define IFF_PERSIST 0x0800 #define IFF_NOFILTER 0x1000 +/*add speed control, default 1000M*/ +#define TUN_CTRL_SPD_10 0x0020 +#define TUN_CTRL_SPD_100 0x0040 +#define TUN_CTRL_SPD_1000 0x0080 + /* Socket options */ #define TUN_TX_TIMESTAMP 1 --1.9.1 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html