From mboxrd@z Thu Jan 1 00:00:00 1970 From: yzhu1 Subject: Re: [PATCH V2 1/1] tun: change speed from 10M to dynamically configured Date: Fri, 13 Feb 2015 13:56:09 +0800 Message-ID: <54DD91F9.9050006@windriver.com> References: <1423798552-7091-1-git-send-email-Yanjun.Zhu@windriver.com> <1423798552-7091-2-git-send-email-Yanjun.Zhu@windriver.com> <54DD8C16.8080605@windriver.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit Cc: , , , , , To: Jonathon Reinhart Return-path: Received: from mail1.windriver.com ([147.11.146.13]:34624 "EHLO mail1.windriver.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751827AbbBMF4I (ORCPT ); Fri, 13 Feb 2015 00:56:08 -0500 In-Reply-To: Sender: netdev-owner@vger.kernel.org List-ID: Yeah. my fault. I will correct it. On 02/13/2015 01:42 PM, Jonathon Reinhart wrote: > 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 wrote: >> On 02/13/2015 11:44 AM, Jonathon Reinhart wrote: >>> Shouldn't the default case of tun_set_settings() return -EINVAL instead of >>> zero? >> I agree with you. >> >> Zhu Yanjun >> >> >>> On Thu, Feb 12, 2015 at 10:35 PM, Zhu Yanjun >>> wrote: >>>> 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 >>>> CC: Jason Wang >>>> CC: Al Viro >>>> Reviewed-by: Sergei Shtylyov >>>> Signed-off-by: Zhu Yanjun >>>> --- >>>> 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 >>> >>> >>> >