diff mbox

[1/1] tun: change speed from 10M to dynamically configured

Message ID 1423719323-4667-2-git-send-email-Yanjun.Zhu@windriver.com
State Changes Requested, archived
Delegated to: David Miller
Headers show

Commit Message

yzhu1 Feb. 12, 2015, 5:35 a.m. UTC
From: Zhu Yanjun <yanjun.zhu@windriver.com>

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 <jasowang@redhat.com>
CC: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Zhu Yanjun <yanjun.zhu@windriver.com>
Signed-off-by: Zhu Yanjun <Yanjun.Zhu@windriver.com>
---
 drivers/net/tun.c           | 36 +++++++++++++++++++++++++++++++++++-
 include/uapi/linux/if_tun.h |  5 +++++
 2 files changed, 40 insertions(+), 1 deletion(-)

Comments

Stephen Hemminger Feb. 12, 2015, 12:55 p.m. UTC | #1
On Thu, 12 Feb 2015 13:35:23 +0800
Zhu Yanjun <Yanjun.Zhu@windriver.com> wrote:

> From: Zhu Yanjun <yanjun.zhu@windriver.com>
> 
> 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 <jasowang@redhat.com>
> CC: Al Viro <viro@zeniv.linux.org.uk>
> Signed-off-by: Zhu Yanjun <yanjun.zhu@windriver.com>
> Signed-off-by: Zhu Yanjun <Yanjun.Zhu@windriver.com>

Why limit to 10/100/1000 speed?
Ethtool speed can be any value

>  

--
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
Sergei Shtylyov Feb. 12, 2015, 1:52 p.m. UTC | #2
Hello.

On 2/12/2015 8:35 AM, Zhu Yanjun wrote:

> From: Zhu Yanjun <yanjun.zhu@windriver.com>

> 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 <jasowang@redhat.com>
> CC: Al Viro <viro@zeniv.linux.org.uk>
> Signed-off-by: Zhu Yanjun <yanjun.zhu@windriver.com>
> Signed-off-by: Zhu Yanjun <Yanjun.Zhu@windriver.com>
> ---
>   drivers/net/tun.c           | 36 +++++++++++++++++++++++++++++++++++-
>   include/uapi/linux/if_tun.h |  5 +++++
>   2 files changed, 40 insertions(+), 1 deletion(-)

> diff --git a/drivers/net/tun.c b/drivers/net/tun.c
> index 8c8dc16..64f4dcc 100644
> --- a/drivers/net/tun.c
> +++ b/drivers/net/tun.c
[...]
> @@ -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*/

    Please add spaces after /* and before */.

[...]
> @@ -2287,6 +2299,27 @@ 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);
> +
> +	if (10 == speed) {
> +		tun->flags &= ~TUN_CTRL_SPD_100;
> +		tun->flags &= ~TUN_CTRL_SPD_1000;

   Can't you clear both bits at once?

> +		tun->flags |= TUN_CTRL_SPD_10;
> +	} else if (100 == speed) {
> +		tun->flags &= ~TUN_CTRL_SPD_10;
> +		tun->flags &= ~TUN_CTRL_SPD_1000;
> +		tun->flags |= TUN_CTRL_SPD_100;
> +	} else {
> +		tun->flags &= ~TUN_CTRL_SPD_10;
> +		tun->flags &= ~TUN_CTRL_SPD_100;
> +		tun->flags |= TUN_CTRL_SPD_1000;
> +	}

    This is asking to be a *switch* statement.

[...]
> 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*/

    Same remark about the comment style as above.

[...]

WBR, Sergei

--
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
yzhu1 Feb. 13, 2015, 2:45 a.m. UTC | #3
On 02/12/2015 08:55 PM, Stephen Hemminger wrote:
> On Thu, 12 Feb 2015 13:35:23 +0800
> Zhu Yanjun <Yanjun.Zhu@windriver.com> wrote:
>
>> From: Zhu Yanjun <yanjun.zhu@windriver.com>
>>
>> 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 <jasowang@redhat.com>
>> CC: Al Viro <viro@zeniv.linux.org.uk>
>> Signed-off-by: Zhu Yanjun <yanjun.zhu@windriver.com>
>> Signed-off-by: Zhu Yanjun <Yanjun.Zhu@windriver.com>
> Why limit to 10/100/1000 speed?
> Ethtool speed can be any value
Thanks for your comments.

Yes. But the real physical nic speed often 10M, 100M and 1000M.
This simulates the physical nic.

Zhu Yanjun
>
>>   
>
>

--
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
FengYu LeiDian Feb. 13, 2015, 3:25 a.m. UTC | #4
于 2015年02月13日 10:45, yzhu1 写道:
> On 02/12/2015 08:55 PM, Stephen Hemminger wrote:
>> On Thu, 12 Feb 2015 13:35:23 +0800
>> Zhu Yanjun <Yanjun.Zhu@windriver.com> wrote:
>>
>>> From: Zhu Yanjun <yanjun.zhu@windriver.com>
>>>
>>> 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 <jasowang@redhat.com>
>>> CC: Al Viro <viro@zeniv.linux.org.uk>
>>> Signed-off-by: Zhu Yanjun <yanjun.zhu@windriver.com>
>>> Signed-off-by: Zhu Yanjun <Yanjun.Zhu@windriver.com>
>> Why limit to 10/100/1000 speed?
>> Ethtool speed can be any value
> Thanks for your comments.
>
> Yes. But the real physical nic speed often 10M, 100M and 1000M.
> This simulates the physical nic.
    ^^^^^^^^^^^^^^^
then a speed control logical would be needed to effect the corresponding speed
when tun/tap gets/puts packets corresponding to the speed setting.

What's the benefit when changing speed from 10Mb/s to 1000Mb/s?

Just xia bibi ;)


--
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
yzhu1 Feb. 13, 2015, 3:34 a.m. UTC | #5
On 02/13/2015 11:25 AM, Fan Du wrote:
> 于 2015年02月13日 10:45, yzhu1 写道:
>> On 02/12/2015 08:55 PM, Stephen Hemminger wrote:
>>> On Thu, 12 Feb 2015 13:35:23 +0800
>>> Zhu Yanjun <Yanjun.Zhu@windriver.com> wrote:
>>>
>>>> From: Zhu Yanjun <yanjun.zhu@windriver.com>
>>>>
>>>> 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 <jasowang@redhat.com>
>>>> CC: Al Viro <viro@zeniv.linux.org.uk>
>>>> Signed-off-by: Zhu Yanjun <yanjun.zhu@windriver.com>
>>>> Signed-off-by: Zhu Yanjun <Yanjun.Zhu@windriver.com>
>>> Why limit to 10/100/1000 speed?
>>> Ethtool speed can be any value
>> Thanks for your comments.
>>
>> Yes. But the real physical nic speed often 10M, 100M and 1000M.
>> This simulates the physical nic.
>    ^^^^^^^^^^^^^^^
> then a speed control logical would be needed to effect the 
> corresponding speed
> when tun/tap gets/puts packets corresponding to the speed setting.
>
> What's the benefit when changing speed from 10Mb/s to 1000Mb/s?
>
> Just xia bibi ;)
:-P
Thanks for your reply.

This speed is just for user space application. There is no any speed 
control logic here.:-(

Zhu Yanjun

>
>
>
>

--
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
diff mbox

Patch

diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 8c8dc16..64f4dcc 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,27 @@  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);
+
+	if (10 == speed) {
+		tun->flags &= ~TUN_CTRL_SPD_100;
+		tun->flags &= ~TUN_CTRL_SPD_1000;
+		tun->flags |= TUN_CTRL_SPD_10;
+	} else if (100 == speed) {
+		tun->flags &= ~TUN_CTRL_SPD_10;
+		tun->flags &= ~TUN_CTRL_SPD_1000;
+		tun->flags |= TUN_CTRL_SPD_100;
+	} else {
+		tun->flags &= ~TUN_CTRL_SPD_10;
+		tun->flags &= ~TUN_CTRL_SPD_100;
+		tun->flags |= TUN_CTRL_SPD_1000;
+	}
+	return 0;
+}
+
 static u32 tun_get_msglevel(struct net_device *dev)
 {
 #ifdef TUN_DEBUG
@@ -2307,6 +2340,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