Index: linux-2.6.22.6/drivers/net/tun.c =================================================================== --- linux-2.6.22.6.orig/drivers/net/tun.c +++ linux-2.6.22.6/drivers/net/tun.c @@ -171,6 +171,18 @@ tun_net_mclist(struct net_device *dev) } } +#define MIN_MTU 68 +#define MAX_MTU 65535 + +static int +tun_net_change_mtu(struct net_device *dev, int new_mtu) +{ + if (new_mtu < MIN_MTU || new_mtu + dev->hard_header_len > MAX_MTU) + return -EINVAL; + dev->mtu = new_mtu; + return 0; +} + static struct net_device_stats *tun_net_stats(struct net_device *dev) { struct tun_struct *tun = netdev_priv(dev); @@ -188,6 +200,7 @@ static void tun_net_init(struct net_devi dev->hard_header_len = 0; dev->addr_len = 0; dev->mtu = 1500; + dev->change_mtu = tun_net_change_mtu; /* Zero header length */ dev->type = ARPHRD_NONE; @@ -200,6 +213,7 @@ static void tun_net_init(struct net_devi dev->set_multicast_list = tun_net_mclist; ether_setup(dev); + dev->change_mtu = tun_net_change_mtu; /* random address already created for us by tun_set_iff, use it */ memcpy(dev->dev_addr, tun->dev_addr, min(sizeof(tun->dev_addr), sizeof(dev->dev_addr)) );