Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/drivers/net/tun.c (Version 2.6.25.8) and /linux/drivers/net/tun.c (Version 2.6.31.13)


  1 /*                                                  1 /*
  2  *  TUN - Universal TUN/TAP device driver.          2  *  TUN - Universal TUN/TAP device driver.
  3  *  Copyright (C) 1999-2002 Maxim Krasnyansky       3  *  Copyright (C) 1999-2002 Maxim Krasnyansky <maxk@qualcomm.com>
  4  *                                                  4  *
  5  *  This program is free software; you can red      5  *  This program is free software; you can redistribute it and/or modify
  6  *  it under the terms of the GNU General Publ      6  *  it under the terms of the GNU General Public License as published by
  7  *  the Free Software Foundation; either versi      7  *  the Free Software Foundation; either version 2 of the License, or
  8  *  (at your option) any later version.             8  *  (at your option) any later version.
  9  *                                                  9  *
 10  *  This program is distributed in the hope th     10  *  This program is distributed in the hope that it will be useful,
 11  *  but WITHOUT ANY WARRANTY; without even the     11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 12  *  MERCHANTABILITY or FITNESS FOR A PARTICULA     12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 13  *  GNU General Public License for more detail     13  *  GNU General Public License for more details.
 14  *                                                 14  *
 15  *  $Id: tun.c,v 1.15 2002/03/01 02:44:24 maxk     15  *  $Id: tun.c,v 1.15 2002/03/01 02:44:24 maxk Exp $
 16  */                                                16  */
 17                                                    17 
 18 /*                                                 18 /*
 19  *  Changes:                                       19  *  Changes:
 20  *                                                 20  *
 21  *  Brian Braunstein <linuxkernel@bristyle.com << 
 22  *    Fixed hw address handling.  Now net_devi << 
 23  *    with tun.dev_addr when the address is se << 
 24  *                                             << 
 25  *  Mike Kershaw <dragorn@kismetwireless.net>      21  *  Mike Kershaw <dragorn@kismetwireless.net> 2005/08/14
 26  *    Add TUNSETLINK ioctl to set the link enc     22  *    Add TUNSETLINK ioctl to set the link encapsulation
 27  *                                                 23  *
 28  *  Mark Smith <markzzzsmith@yahoo.com.au>         24  *  Mark Smith <markzzzsmith@yahoo.com.au>
 29  *   Use random_ether_addr() for tap MAC addre !!  25  *    Use random_ether_addr() for tap MAC address.
 30  *                                                 26  *
 31  *  Harald Roelle <harald.roelle@ifi.lmu.de>       27  *  Harald Roelle <harald.roelle@ifi.lmu.de>  2004/04/20
 32  *    Fixes in packet dropping, queue length s     28  *    Fixes in packet dropping, queue length setting and queue wakeup.
 33  *    Increased default tx queue length.           29  *    Increased default tx queue length.
 34  *    Added ethtool API.                           30  *    Added ethtool API.
 35  *    Minor cleanups                               31  *    Minor cleanups
 36  *                                                 32  *
 37  *  Daniel Podlejski <underley@underley.eu.org     33  *  Daniel Podlejski <underley@underley.eu.org>
 38  *    Modifications for 2.3.99-pre5 kernel.        34  *    Modifications for 2.3.99-pre5 kernel.
 39  */                                                35  */
 40                                                    36 
 41 #define DRV_NAME        "tun"                      37 #define DRV_NAME        "tun"
 42 #define DRV_VERSION     "1.6"                      38 #define DRV_VERSION     "1.6"
 43 #define DRV_DESCRIPTION "Universal TUN/TAP dev     39 #define DRV_DESCRIPTION "Universal TUN/TAP device driver"
 44 #define DRV_COPYRIGHT   "(C) 1999-2004 Max Kra     40 #define DRV_COPYRIGHT   "(C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>"
 45                                                    41 
 46 #include <linux/module.h>                          42 #include <linux/module.h>
 47 #include <linux/errno.h>                           43 #include <linux/errno.h>
 48 #include <linux/kernel.h>                          44 #include <linux/kernel.h>
 49 #include <linux/major.h>                           45 #include <linux/major.h>
 50 #include <linux/slab.h>                            46 #include <linux/slab.h>
                                                   >>  47 #include <linux/smp_lock.h>
 51 #include <linux/poll.h>                            48 #include <linux/poll.h>
 52 #include <linux/fcntl.h>                           49 #include <linux/fcntl.h>
 53 #include <linux/init.h>                            50 #include <linux/init.h>
 54 #include <linux/skbuff.h>                          51 #include <linux/skbuff.h>
 55 #include <linux/netdevice.h>                       52 #include <linux/netdevice.h>
 56 #include <linux/etherdevice.h>                     53 #include <linux/etherdevice.h>
 57 #include <linux/miscdevice.h>                      54 #include <linux/miscdevice.h>
 58 #include <linux/ethtool.h>                         55 #include <linux/ethtool.h>
 59 #include <linux/rtnetlink.h>                       56 #include <linux/rtnetlink.h>
 60 #include <linux/if.h>                              57 #include <linux/if.h>
 61 #include <linux/if_arp.h>                          58 #include <linux/if_arp.h>
 62 #include <linux/if_ether.h>                        59 #include <linux/if_ether.h>
 63 #include <linux/if_tun.h>                          60 #include <linux/if_tun.h>
 64 #include <linux/crc32.h>                           61 #include <linux/crc32.h>
                                                   >>  62 #include <linux/nsproxy.h>
                                                   >>  63 #include <linux/virtio_net.h>
 65 #include <net/net_namespace.h>                     64 #include <net/net_namespace.h>
                                                   >>  65 #include <net/netns/generic.h>
                                                   >>  66 #include <net/rtnetlink.h>
                                                   >>  67 #include <net/sock.h>
 66                                                    68 
 67 #include <asm/system.h>                            69 #include <asm/system.h>
 68 #include <asm/uaccess.h>                           70 #include <asm/uaccess.h>
 69                                                    71 
 70 /* Uncomment to enable debugging */                72 /* Uncomment to enable debugging */
 71 /* #define TUN_DEBUG 1 */                          73 /* #define TUN_DEBUG 1 */
 72                                                    74 
 73 #ifdef TUN_DEBUG                                   75 #ifdef TUN_DEBUG
 74 static int debug;                                  76 static int debug;
 75                                                    77 
 76 #define DBG  if(tun->debug)printk                  78 #define DBG  if(tun->debug)printk
 77 #define DBG1 if(debug==2)printk                    79 #define DBG1 if(debug==2)printk
 78 #else                                              80 #else
 79 #define DBG( a... )                                81 #define DBG( a... )
 80 #define DBG1( a... )                               82 #define DBG1( a... )
 81 #endif                                             83 #endif
 82                                                    84 
                                                   >>  85 #define FLT_EXACT_COUNT 8
                                                   >>  86 struct tap_filter {
                                                   >>  87         unsigned int    count;    /* Number of addrs. Zero means disabled */
                                                   >>  88         u32             mask[2];  /* Mask of the hashed addrs */
                                                   >>  89         unsigned char   addr[FLT_EXACT_COUNT][ETH_ALEN];
                                                   >>  90 };
                                                   >>  91 
                                                   >>  92 struct tun_file {
                                                   >>  93         atomic_t count;
                                                   >>  94         struct tun_struct *tun;
                                                   >>  95         struct net *net;
                                                   >>  96 };
                                                   >>  97 
                                                   >>  98 struct tun_sock;
                                                   >>  99 
 83 struct tun_struct {                               100 struct tun_struct {
 84         struct list_head        list;          !! 101         struct tun_file         *tfile;
 85         unsigned long           flags;         !! 102         unsigned int            flags;
 86         int                     attached;      << 
 87         uid_t                   owner;            103         uid_t                   owner;
 88         gid_t                   group;            104         gid_t                   group;
 89                                                   105 
 90         wait_queue_head_t       read_wait;     << 
 91         struct sk_buff_head     readq;            106         struct sk_buff_head     readq;
 92                                                   107 
 93         struct net_device       *dev;             108         struct net_device       *dev;
                                                   >> 109         struct fasync_struct    *fasync;
 94                                                   110 
 95         struct fasync_struct    *fasync;       !! 111         struct tap_filter       txflt;
 96                                                !! 112         struct sock             *sk;
 97         unsigned long if_flags;                !! 113         struct socket           socket;
 98         u8 dev_addr[ETH_ALEN];                 << 
 99         u32 chr_filter[2];                     << 
100         u32 net_filter[2];                     << 
101                                                   114 
102 #ifdef TUN_DEBUG                                  115 #ifdef TUN_DEBUG
103         int debug;                                116         int debug;
104 #endif                                            117 #endif
105 };                                                118 };
106                                                   119 
                                                   >> 120 struct tun_sock {
                                                   >> 121         struct sock             sk;
                                                   >> 122         struct tun_struct       *tun;
                                                   >> 123 };
                                                   >> 124 
                                                   >> 125 static inline struct tun_sock *tun_sk(struct sock *sk)
                                                   >> 126 {
                                                   >> 127         return container_of(sk, struct tun_sock, sk);
                                                   >> 128 }
                                                   >> 129 
                                                   >> 130 static int tun_attach(struct tun_struct *tun, struct file *file)
                                                   >> 131 {
                                                   >> 132         struct tun_file *tfile = file->private_data;
                                                   >> 133         const struct cred *cred = current_cred();
                                                   >> 134         int err;
                                                   >> 135 
                                                   >> 136         ASSERT_RTNL();
                                                   >> 137 
                                                   >> 138         /* Check permissions */
                                                   >> 139         if (((tun->owner != -1 && cred->euid != tun->owner) ||
                                                   >> 140              (tun->group != -1 && !in_egroup_p(tun->group))) &&
                                                   >> 141                 !capable(CAP_NET_ADMIN))
                                                   >> 142                 return -EPERM;
                                                   >> 143 
                                                   >> 144         netif_tx_lock_bh(tun->dev);
                                                   >> 145 
                                                   >> 146         err = -EINVAL;
                                                   >> 147         if (tfile->tun)
                                                   >> 148                 goto out;
                                                   >> 149 
                                                   >> 150         err = -EBUSY;
                                                   >> 151         if (tun->tfile)
                                                   >> 152                 goto out;
                                                   >> 153 
                                                   >> 154         err = 0;
                                                   >> 155         tfile->tun = tun;
                                                   >> 156         tun->tfile = tfile;
                                                   >> 157         dev_hold(tun->dev);
                                                   >> 158         sock_hold(tun->sk);
                                                   >> 159         atomic_inc(&tfile->count);
                                                   >> 160 
                                                   >> 161 out:
                                                   >> 162         netif_tx_unlock_bh(tun->dev);
                                                   >> 163         return err;
                                                   >> 164 }
                                                   >> 165 
                                                   >> 166 static void __tun_detach(struct tun_struct *tun)
                                                   >> 167 {
                                                   >> 168         /* Detach from net device */
                                                   >> 169         netif_tx_lock_bh(tun->dev);
                                                   >> 170         tun->tfile = NULL;
                                                   >> 171         netif_tx_unlock_bh(tun->dev);
                                                   >> 172 
                                                   >> 173         /* Drop read queue */
                                                   >> 174         skb_queue_purge(&tun->readq);
                                                   >> 175 
                                                   >> 176         /* Drop the extra count on the net device */
                                                   >> 177         dev_put(tun->dev);
                                                   >> 178 }
                                                   >> 179 
                                                   >> 180 static void tun_detach(struct tun_struct *tun)
                                                   >> 181 {
                                                   >> 182         rtnl_lock();
                                                   >> 183         __tun_detach(tun);
                                                   >> 184         rtnl_unlock();
                                                   >> 185 }
                                                   >> 186 
                                                   >> 187 static struct tun_struct *__tun_get(struct tun_file *tfile)
                                                   >> 188 {
                                                   >> 189         struct tun_struct *tun = NULL;
                                                   >> 190 
                                                   >> 191         if (atomic_inc_not_zero(&tfile->count))
                                                   >> 192                 tun = tfile->tun;
                                                   >> 193 
                                                   >> 194         return tun;
                                                   >> 195 }
                                                   >> 196 
                                                   >> 197 static struct tun_struct *tun_get(struct file *file)
                                                   >> 198 {
                                                   >> 199         return __tun_get(file->private_data);
                                                   >> 200 }
                                                   >> 201 
                                                   >> 202 static void tun_put(struct tun_struct *tun)
                                                   >> 203 {
                                                   >> 204         struct tun_file *tfile = tun->tfile;
                                                   >> 205 
                                                   >> 206         if (atomic_dec_and_test(&tfile->count))
                                                   >> 207                 tun_detach(tfile->tun);
                                                   >> 208 }
                                                   >> 209 
                                                   >> 210 /* TAP filterting */
                                                   >> 211 static void addr_hash_set(u32 *mask, const u8 *addr)
                                                   >> 212 {
                                                   >> 213         int n = ether_crc(ETH_ALEN, addr) >> 26;
                                                   >> 214         mask[n >> 5] |= (1 << (n & 31));
                                                   >> 215 }
                                                   >> 216 
                                                   >> 217 static unsigned int addr_hash_test(const u32 *mask, const u8 *addr)
                                                   >> 218 {
                                                   >> 219         int n = ether_crc(ETH_ALEN, addr) >> 26;
                                                   >> 220         return mask[n >> 5] & (1 << (n & 31));
                                                   >> 221 }
                                                   >> 222 
                                                   >> 223 static int update_filter(struct tap_filter *filter, void __user *arg)
                                                   >> 224 {
                                                   >> 225         struct { u8 u[ETH_ALEN]; } *addr;
                                                   >> 226         struct tun_filter uf;
                                                   >> 227         int err, alen, n, nexact;
                                                   >> 228 
                                                   >> 229         if (copy_from_user(&uf, arg, sizeof(uf)))
                                                   >> 230                 return -EFAULT;
                                                   >> 231 
                                                   >> 232         if (!uf.count) {
                                                   >> 233                 /* Disabled */
                                                   >> 234                 filter->count = 0;
                                                   >> 235                 return 0;
                                                   >> 236         }
                                                   >> 237 
                                                   >> 238         alen = ETH_ALEN * uf.count;
                                                   >> 239         addr = kmalloc(alen, GFP_KERNEL);
                                                   >> 240         if (!addr)
                                                   >> 241                 return -ENOMEM;
                                                   >> 242 
                                                   >> 243         if (copy_from_user(addr, arg + sizeof(uf), alen)) {
                                                   >> 244                 err = -EFAULT;
                                                   >> 245                 goto done;
                                                   >> 246         }
                                                   >> 247 
                                                   >> 248         /* The filter is updated without holding any locks. Which is
                                                   >> 249          * perfectly safe. We disable it first and in the worst
                                                   >> 250          * case we'll accept a few undesired packets. */
                                                   >> 251         filter->count = 0;
                                                   >> 252         wmb();
                                                   >> 253 
                                                   >> 254         /* Use first set of addresses as an exact filter */
                                                   >> 255         for (n = 0; n < uf.count && n < FLT_EXACT_COUNT; n++)
                                                   >> 256                 memcpy(filter->addr[n], addr[n].u, ETH_ALEN);
                                                   >> 257 
                                                   >> 258         nexact = n;
                                                   >> 259 
                                                   >> 260         /* Remaining multicast addresses are hashed,
                                                   >> 261          * unicast will leave the filter disabled. */
                                                   >> 262         memset(filter->mask, 0, sizeof(filter->mask));
                                                   >> 263         for (; n < uf.count; n++) {
                                                   >> 264                 if (!is_multicast_ether_addr(addr[n].u)) {
                                                   >> 265                         err = 0; /* no filter */
                                                   >> 266                         goto done;
                                                   >> 267                 }
                                                   >> 268                 addr_hash_set(filter->mask, addr[n].u);
                                                   >> 269         }
                                                   >> 270 
                                                   >> 271         /* For ALLMULTI just set the mask to all ones.
                                                   >> 272          * This overrides the mask populated above. */
                                                   >> 273         if ((uf.flags & TUN_FLT_ALLMULTI))
                                                   >> 274                 memset(filter->mask, ~0, sizeof(filter->mask));
                                                   >> 275 
                                                   >> 276         /* Now enable the filter */
                                                   >> 277         wmb();
                                                   >> 278         filter->count = nexact;
                                                   >> 279 
                                                   >> 280         /* Return the number of exact filters */
                                                   >> 281         err = nexact;
                                                   >> 282 
                                                   >> 283 done:
                                                   >> 284         kfree(addr);
                                                   >> 285         return err;
                                                   >> 286 }
                                                   >> 287 
                                                   >> 288 /* Returns: 0 - drop, !=0 - accept */
                                                   >> 289 static int run_filter(struct tap_filter *filter, const struct sk_buff *skb)
                                                   >> 290 {
                                                   >> 291         /* Cannot use eth_hdr(skb) here because skb_mac_hdr() is incorrect
                                                   >> 292          * at this point. */
                                                   >> 293         struct ethhdr *eh = (struct ethhdr *) skb->data;
                                                   >> 294         int i;
                                                   >> 295 
                                                   >> 296         /* Exact match */
                                                   >> 297         for (i = 0; i < filter->count; i++)
                                                   >> 298                 if (!compare_ether_addr(eh->h_dest, filter->addr[i]))
                                                   >> 299                         return 1;
                                                   >> 300 
                                                   >> 301         /* Inexact match (multicast only) */
                                                   >> 302         if (is_multicast_ether_addr(eh->h_dest))
                                                   >> 303                 return addr_hash_test(filter->mask, eh->h_dest);
                                                   >> 304 
                                                   >> 305         return 0;
                                                   >> 306 }
                                                   >> 307 
                                                   >> 308 /*
                                                   >> 309  * Checks whether the packet is accepted or not.
                                                   >> 310  * Returns: 0 - drop, !=0 - accept
                                                   >> 311  */
                                                   >> 312 static int check_filter(struct tap_filter *filter, const struct sk_buff *skb)
                                                   >> 313 {
                                                   >> 314         if (!filter->count)
                                                   >> 315                 return 1;
                                                   >> 316 
                                                   >> 317         return run_filter(filter, skb);
                                                   >> 318 }
                                                   >> 319 
107 /* Network device part of the driver */           320 /* Network device part of the driver */
108                                                   321 
109 static LIST_HEAD(tun_dev_list);                << 
110 static const struct ethtool_ops tun_ethtool_op    322 static const struct ethtool_ops tun_ethtool_ops;
111                                                   323 
                                                   >> 324 /* Net device detach from fd. */
                                                   >> 325 static void tun_net_uninit(struct net_device *dev)
                                                   >> 326 {
                                                   >> 327         struct tun_struct *tun = netdev_priv(dev);
                                                   >> 328         struct tun_file *tfile = tun->tfile;
                                                   >> 329 
                                                   >> 330         /* Inform the methods they need to stop using the dev.
                                                   >> 331          */
                                                   >> 332         if (tfile) {
                                                   >> 333                 wake_up_all(&tun->socket.wait);
                                                   >> 334                 if (atomic_dec_and_test(&tfile->count))
                                                   >> 335                         __tun_detach(tun);
                                                   >> 336         }
                                                   >> 337 }
                                                   >> 338 
                                                   >> 339 static void tun_free_netdev(struct net_device *dev)
                                                   >> 340 {
                                                   >> 341         struct tun_struct *tun = netdev_priv(dev);
                                                   >> 342 
                                                   >> 343         sock_put(tun->sk);
                                                   >> 344 }
                                                   >> 345 
112 /* Net device open. */                            346 /* Net device open. */
113 static int tun_net_open(struct net_device *dev    347 static int tun_net_open(struct net_device *dev)
114 {                                                 348 {
115         netif_start_queue(dev);                   349         netif_start_queue(dev);
116         return 0;                                 350         return 0;
117 }                                                 351 }
118                                                   352 
119 /* Net device close. */                           353 /* Net device close. */
120 static int tun_net_close(struct net_device *de    354 static int tun_net_close(struct net_device *dev)
121 {                                                 355 {
122         netif_stop_queue(dev);                    356         netif_stop_queue(dev);
123         return 0;                                 357         return 0;
124 }                                                 358 }
125                                                   359 
126 /* Net device start xmit */                       360 /* Net device start xmit */
127 static int tun_net_xmit(struct sk_buff *skb, s    361 static int tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
128 {                                                 362 {
129         struct tun_struct *tun = netdev_priv(d    363         struct tun_struct *tun = netdev_priv(dev);
130                                                   364 
131         DBG(KERN_INFO "%s: tun_net_xmit %d\n",    365         DBG(KERN_INFO "%s: tun_net_xmit %d\n", tun->dev->name, skb->len);
132                                                   366 
133         /* Drop packet if interface is not att    367         /* Drop packet if interface is not attached */
134         if (!tun->attached)                    !! 368         if (!tun->tfile)
                                                   >> 369                 goto drop;
                                                   >> 370 
                                                   >> 371         /* Drop if the filter does not like it.
                                                   >> 372          * This is a noop if the filter is disabled.
                                                   >> 373          * Filter can be enabled only for the TAP devices. */
                                                   >> 374         if (!check_filter(&tun->txflt, skb))
135                 goto drop;                        375                 goto drop;
136                                                   376 
137         /* Packet dropping */                  << 
138         if (skb_queue_len(&tun->readq) >= dev-    377         if (skb_queue_len(&tun->readq) >= dev->tx_queue_len) {
139                 if (!(tun->flags & TUN_ONE_QUE    378                 if (!(tun->flags & TUN_ONE_QUEUE)) {
140                         /* Normal queueing mod    379                         /* Normal queueing mode. */
141                         /* Packet scheduler ha    380                         /* Packet scheduler handles dropping of further packets. */
142                         netif_stop_queue(dev);    381                         netif_stop_queue(dev);
143                                                   382 
144                         /* We won't see all dr    383                         /* We won't see all dropped packets individually, so overrun
145                          * error is more appro    384                          * error is more appropriate. */
146                         dev->stats.tx_fifo_err    385                         dev->stats.tx_fifo_errors++;
147                 } else {                          386                 } else {
148                         /* Single queue mode.     387                         /* Single queue mode.
149                          * Driver handles drop    388                          * Driver handles dropping of all packets itself. */
150                         goto drop;                389                         goto drop;
151                 }                                 390                 }
152         }                                         391         }
153                                                   392 
154         /* Queue packet */                     !! 393         /* Enqueue packet */
155         skb_queue_tail(&tun->readq, skb);         394         skb_queue_tail(&tun->readq, skb);
156         dev->trans_start = jiffies;               395         dev->trans_start = jiffies;
157                                                   396 
158         /* Notify and wake up reader process *    397         /* Notify and wake up reader process */
159         if (tun->flags & TUN_FASYNC)              398         if (tun->flags & TUN_FASYNC)
160                 kill_fasync(&tun->fasync, SIGI    399                 kill_fasync(&tun->fasync, SIGIO, POLL_IN);
161         wake_up_interruptible(&tun->read_wait) !! 400         wake_up_interruptible(&tun->socket.wait);
162         return 0;                                 401         return 0;
163                                                   402 
164 drop:                                             403 drop:
165         dev->stats.tx_dropped++;                  404         dev->stats.tx_dropped++;
166         kfree_skb(skb);                           405         kfree_skb(skb);
167         return 0;                                 406         return 0;
168 }                                                 407 }
169                                                   408 
170 /** Add the specified Ethernet address to this !! 409 static void tun_net_mclist(struct net_device *dev)
171 static void                                    << 
172 add_multi(u32* filter, const u8* addr)         << 
173 {                                              << 
174         int bit_nr = ether_crc(ETH_ALEN, addr) << 
175         filter[bit_nr >> 5] |= 1 << (bit_nr &  << 
176 }                                              << 
177                                                << 
178 /** Remove the specified Ethernet addres from  << 
179 static void                                    << 
180 del_multi(u32* filter, const u8* addr)         << 
181 {                                                 410 {
182         int bit_nr = ether_crc(ETH_ALEN, addr) !! 411         /*
183         filter[bit_nr >> 5] &= ~(1 << (bit_nr  !! 412          * This callback is supposed to deal with mc filter in
184 }                                              !! 413          * _rx_ path and has nothing to do with the _tx_ path.
185                                                !! 414          * In rx path we always accept everything userspace gives us.
186 /** Update the list of multicast groups to whi !! 415          */
187  * This list is used to filter packets being s !! 416         return;
188  * the network device. */                      << 
189 static void                                    << 
190 tun_net_mclist(struct net_device *dev)         << 
191 {                                              << 
192         struct tun_struct *tun = netdev_priv(d << 
193         const struct dev_mc_list *mclist;      << 
194         int i;                                 << 
195         DECLARE_MAC_BUF(mac);                  << 
196         DBG(KERN_DEBUG "%s: tun_net_mclist: mc << 
197                         dev->name, dev->mc_cou << 
198         memset(tun->chr_filter, 0, sizeof tun- << 
199         for (i = 0, mclist = dev->mc_list; i < << 
200                         i++, mclist = mclist-> << 
201                 add_multi(tun->net_filter, mcl << 
202                 DBG(KERN_DEBUG "%s: tun_net_mc << 
203                     dev->name, print_mac(mac,  << 
204         }                                      << 
205 }                                                 417 }
206                                                   418 
207 #define MIN_MTU 68                                419 #define MIN_MTU 68
208 #define MAX_MTU 65535                             420 #define MAX_MTU 65535
209                                                   421 
210 static int                                        422 static int
211 tun_net_change_mtu(struct net_device *dev, int    423 tun_net_change_mtu(struct net_device *dev, int new_mtu)
212 {                                                 424 {
213         if (new_mtu < MIN_MTU || new_mtu + dev    425         if (new_mtu < MIN_MTU || new_mtu + dev->hard_header_len > MAX_MTU)
214                 return -EINVAL;                   426                 return -EINVAL;
215         dev->mtu = new_mtu;                       427         dev->mtu = new_mtu;
216         return 0;                                 428         return 0;
217 }                                                 429 }
218                                                   430 
                                                   >> 431 static const struct net_device_ops tun_netdev_ops = {
                                                   >> 432         .ndo_uninit             = tun_net_uninit,
                                                   >> 433         .ndo_open               = tun_net_open,
                                                   >> 434         .ndo_stop               = tun_net_close,
                                                   >> 435         .ndo_start_xmit         = tun_net_xmit,
                                                   >> 436         .ndo_change_mtu         = tun_net_change_mtu,
                                                   >> 437 };
                                                   >> 438 
                                                   >> 439 static const struct net_device_ops tap_netdev_ops = {
                                                   >> 440         .ndo_uninit             = tun_net_uninit,
                                                   >> 441         .ndo_open               = tun_net_open,
                                                   >> 442         .ndo_stop               = tun_net_close,
                                                   >> 443         .ndo_start_xmit         = tun_net_xmit,
                                                   >> 444         .ndo_change_mtu         = tun_net_change_mtu,
                                                   >> 445         .ndo_set_multicast_list = tun_net_mclist,
                                                   >> 446         .ndo_set_mac_address    = eth_mac_addr,
                                                   >> 447         .ndo_validate_addr      = eth_validate_addr,
                                                   >> 448 };
                                                   >> 449 
219 /* Initialize net device. */                      450 /* Initialize net device. */
220 static void tun_net_init(struct net_device *de    451 static void tun_net_init(struct net_device *dev)
221 {                                                 452 {
222         struct tun_struct *tun = netdev_priv(d    453         struct tun_struct *tun = netdev_priv(dev);
223                                                   454 
224         switch (tun->flags & TUN_TYPE_MASK) {     455         switch (tun->flags & TUN_TYPE_MASK) {
225         case TUN_TUN_DEV:                         456         case TUN_TUN_DEV:
                                                   >> 457                 dev->netdev_ops = &tun_netdev_ops;
                                                   >> 458 
226                 /* Point-to-Point TUN Device *    459                 /* Point-to-Point TUN Device */
227                 dev->hard_header_len = 0;         460                 dev->hard_header_len = 0;
228                 dev->addr_len = 0;                461                 dev->addr_len = 0;
229                 dev->mtu = 1500;                  462                 dev->mtu = 1500;
230                 dev->change_mtu = tun_net_chan << 
231                                                   463 
232                 /* Zero header length */          464                 /* Zero header length */
233                 dev->type = ARPHRD_NONE;          465                 dev->type = ARPHRD_NONE;
234                 dev->flags = IFF_POINTOPOINT |    466                 dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
235                 dev->tx_queue_len = TUN_READQ_    467                 dev->tx_queue_len = TUN_READQ_SIZE;  /* We prefer our own queue length */
236                 break;                            468                 break;
237                                                   469 
238         case TUN_TAP_DEV:                         470         case TUN_TAP_DEV:
                                                   >> 471                 dev->netdev_ops = &tap_netdev_ops;
239                 /* Ethernet TAP Device */         472                 /* Ethernet TAP Device */
240                 dev->set_multicast_list = tun_ << 
241                                                << 
242                 ether_setup(dev);                 473                 ether_setup(dev);
243                 dev->change_mtu = tun_net_chan << 
244                                                   474 
245                 /* random address already crea !! 475                 random_ether_addr(dev->dev_addr);
246                 memcpy(dev->dev_addr, tun->dev << 
247                                                   476 
248                 dev->tx_queue_len = TUN_READQ_    477                 dev->tx_queue_len = TUN_READQ_SIZE;  /* We prefer our own queue length */
249                 break;                            478                 break;
250         }                                         479         }
251 }                                                 480 }
252                                                   481 
253 /* Character device part */                       482 /* Character device part */
254                                                   483 
255 /* Poll */                                        484 /* Poll */
256 static unsigned int tun_chr_poll(struct file *    485 static unsigned int tun_chr_poll(struct file *file, poll_table * wait)
257 {                                                 486 {
258         struct tun_struct *tun = file->private !! 487         struct tun_file *tfile = file->private_data;
259         unsigned int mask = POLLOUT | POLLWRNO !! 488         struct tun_struct *tun = __tun_get(tfile);
                                                   >> 489         struct sock *sk;
                                                   >> 490         unsigned int mask = 0;
260                                                   491 
261         if (!tun)                                 492         if (!tun)
262                 return -EBADFD;                !! 493                 return POLLERR;
                                                   >> 494 
                                                   >> 495         sk = tun->sk;
263                                                   496 
264         DBG(KERN_INFO "%s: tun_chr_poll\n", tu    497         DBG(KERN_INFO "%s: tun_chr_poll\n", tun->dev->name);
265                                                   498 
266         poll_wait(file, &tun->read_wait, wait) !! 499         poll_wait(file, &tun->socket.wait, wait);
267                                                   500 
268         if (!skb_queue_empty(&tun->readq))        501         if (!skb_queue_empty(&tun->readq))
269                 mask |= POLLIN | POLLRDNORM;      502                 mask |= POLLIN | POLLRDNORM;
270                                                   503 
                                                   >> 504         if (sock_writeable(sk) ||
                                                   >> 505             (!test_and_set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags) &&
                                                   >> 506              sock_writeable(sk)))
                                                   >> 507                 mask |= POLLOUT | POLLWRNORM;
                                                   >> 508 
                                                   >> 509         if (tun->dev->reg_state != NETREG_REGISTERED)
                                                   >> 510                 mask = POLLERR;
                                                   >> 511 
                                                   >> 512         tun_put(tun);
271         return mask;                              513         return mask;
272 }                                                 514 }
273                                                   515 
                                                   >> 516 /* prepad is the amount to reserve at front.  len is length after that.
                                                   >> 517  * linear is a hint as to how much to copy (usually headers). */
                                                   >> 518 static inline struct sk_buff *tun_alloc_skb(struct tun_struct *tun,
                                                   >> 519                                             size_t prepad, size_t len,
                                                   >> 520                                             size_t linear, int noblock)
                                                   >> 521 {
                                                   >> 522         struct sock *sk = tun->sk;
                                                   >> 523         struct sk_buff *skb;
                                                   >> 524         int err;
                                                   >> 525 
                                                   >> 526         /* Under a page?  Don't bother with paged skb. */
                                                   >> 527         if (prepad + len < PAGE_SIZE || !linear)
                                                   >> 528                 linear = len;
                                                   >> 529 
                                                   >> 530         skb = sock_alloc_send_pskb(sk, prepad + linear, len - linear, noblock,
                                                   >> 531                                    &err);
                                                   >> 532         if (!skb)
                                                   >> 533                 return ERR_PTR(err);
                                                   >> 534 
                                                   >> 535         skb_reserve(skb, prepad);
                                                   >> 536         skb_put(skb, linear);
                                                   >> 537         skb->data_len = len - linear;
                                                   >> 538         skb->len += len - linear;
                                                   >> 539 
                                                   >> 540         return skb;
                                                   >> 541 }
                                                   >> 542 
274 /* Get packet from user space buffer */           543 /* Get packet from user space buffer */
275 static __inline__ ssize_t tun_get_user(struct  !! 544 static __inline__ ssize_t tun_get_user(struct tun_struct *tun,
                                                   >> 545                                        const struct iovec *iv, size_t count,
                                                   >> 546                                        int noblock)
276 {                                                 547 {
277         struct tun_pi pi = { 0, __constant_hto !! 548         struct tun_pi pi = { 0, cpu_to_be16(ETH_P_IP) };
278         struct sk_buff *skb;                      549         struct sk_buff *skb;
279         size_t len = count, align = 0;            550         size_t len = count, align = 0;
                                                   >> 551         struct virtio_net_hdr gso = { 0 };
                                                   >> 552         int offset = 0;
280                                                   553 
281         if (!(tun->flags & TUN_NO_PI)) {          554         if (!(tun->flags & TUN_NO_PI)) {
282                 if ((len -= sizeof(pi)) > coun    555                 if ((len -= sizeof(pi)) > count)
283                         return -EINVAL;           556                         return -EINVAL;
284                                                   557 
285                 if(memcpy_fromiovec((void *)&p !! 558                 if (memcpy_fromiovecend((void *)&pi, iv, 0, sizeof(pi)))
286                         return -EFAULT;           559                         return -EFAULT;
                                                   >> 560                 offset += sizeof(pi);
                                                   >> 561         }
                                                   >> 562 
                                                   >> 563         if (tun->flags & TUN_VNET_HDR) {
                                                   >> 564                 if ((len -= sizeof(gso)) > count)
                                                   >> 565                         return -EINVAL;
                                                   >> 566 
                                                   >> 567                 if (memcpy_fromiovecend((void *)&gso, iv, offset, sizeof(gso)))
                                                   >> 568                         return -EFAULT;
                                                   >> 569 
                                                   >> 570                 if ((gso.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) &&
                                                   >> 571                     gso.csum_start + gso.csum_offset + 2 > gso.hdr_len)
                                                   >> 572                         gso.hdr_len = gso.csum_start + gso.csum_offset + 2;
                                                   >> 573 
                                                   >> 574                 if (gso.hdr_len > len)
                                                   >> 575                         return -EINVAL;
                                                   >> 576                 offset += sizeof(gso);
287         }                                         577         }
288                                                   578 
289         if ((tun->flags & TUN_TYPE_MASK) == TU    579         if ((tun->flags & TUN_TYPE_MASK) == TUN_TAP_DEV) {
290                 align = NET_IP_ALIGN;             580                 align = NET_IP_ALIGN;
291                 if (unlikely(len < ETH_HLEN))  !! 581                 if (unlikely(len < ETH_HLEN ||
                                                   >> 582                              (gso.hdr_len && gso.hdr_len < ETH_HLEN)))
292                         return -EINVAL;           583                         return -EINVAL;
293         }                                         584         }
294                                                   585 
295         if (!(skb = alloc_skb(len + align, GFP !! 586         skb = tun_alloc_skb(tun, align, len, gso.hdr_len, noblock);
296                 tun->dev->stats.rx_dropped++;  !! 587         if (IS_ERR(skb)) {
297                 return -ENOMEM;                !! 588                 if (PTR_ERR(skb) != -EAGAIN)
                                                   >> 589                         tun->dev->stats.rx_dropped++;
                                                   >> 590                 return PTR_ERR(skb);
298         }                                         591         }
299                                                   592 
300         if (align)                             !! 593         if (skb_copy_datagram_from_iovec(skb, 0, iv, offset, len)) {
301                 skb_reserve(skb, align);       << 
302         if (memcpy_fromiovec(skb_put(skb, len) << 
303                 tun->dev->stats.rx_dropped++;     594                 tun->dev->stats.rx_dropped++;
304                 kfree_skb(skb);                   595                 kfree_skb(skb);
305                 return -EFAULT;                   596                 return -EFAULT;
306         }                                         597         }
307                                                   598 
                                                   >> 599         if (gso.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {
                                                   >> 600                 if (!skb_partial_csum_set(skb, gso.csum_start,
                                                   >> 601                                           gso.csum_offset)) {
                                                   >> 602                         tun->dev->stats.rx_frame_errors++;
                                                   >> 603                         kfree_skb(skb);
                                                   >> 604                         return -EINVAL;
                                                   >> 605                 }
                                                   >> 606         } else if (tun->flags & TUN_NOCHECKSUM)
                                                   >> 607                 skb->ip_summed = CHECKSUM_UNNECESSARY;
                                                   >> 608 
308         switch (tun->flags & TUN_TYPE_MASK) {     609         switch (tun->flags & TUN_TYPE_MASK) {
309         case TUN_TUN_DEV:                         610         case TUN_TUN_DEV:
                                                   >> 611                 if (tun->flags & TUN_NO_PI) {
                                                   >> 612                         switch (skb->data[0] & 0xf0) {
                                                   >> 613                         case 0x40:
                                                   >> 614                                 pi.proto = htons(ETH_P_IP);
                                                   >> 615                                 break;
                                                   >> 616                         case 0x60:
                                                   >> 617                                 pi.proto = htons(ETH_P_IPV6);
                                                   >> 618                                 break;
                                                   >> 619                         default:
                                                   >> 620                                 tun->dev->stats.rx_dropped++;
                                                   >> 621                                 kfree_skb(skb);
                                                   >> 622                                 return -EINVAL;
                                                   >> 623                         }
                                                   >> 624                 }
                                                   >> 625 
310                 skb_reset_mac_header(skb);        626                 skb_reset_mac_header(skb);
311                 skb->protocol = pi.proto;         627                 skb->protocol = pi.proto;
312                 skb->dev = tun->dev;              628                 skb->dev = tun->dev;
313                 break;                            629                 break;
314         case TUN_TAP_DEV:                         630         case TUN_TAP_DEV:
315                 skb->protocol = eth_type_trans    631                 skb->protocol = eth_type_trans(skb, tun->dev);
316                 break;                            632                 break;
317         };                                        633         };
318                                                   634 
319         if (tun->flags & TUN_NOCHECKSUM)       !! 635         if (gso.gso_type != VIRTIO_NET_HDR_GSO_NONE) {
320                 skb->ip_summed = CHECKSUM_UNNE !! 636                 pr_debug("GSO!\n");
                                                   >> 637                 switch (gso.gso_type & ~VIRTIO_NET_HDR_GSO_ECN) {
                                                   >> 638                 case VIRTIO_NET_HDR_GSO_TCPV4:
                                                   >> 639                         skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
                                                   >> 640                         break;
                                                   >> 641                 case VIRTIO_NET_HDR_GSO_TCPV6:
                                                   >> 642                         skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
                                                   >> 643                         break;
                                                   >> 644                 default:
                                                   >> 645                         tun->dev->stats.rx_frame_errors++;
                                                   >> 646                         kfree_skb(skb);
                                                   >> 647                         return -EINVAL;
                                                   >> 648                 }
                                                   >> 649 
                                                   >> 650                 if (gso.gso_type & VIRTIO_NET_HDR_GSO_ECN)
                                                   >> 651                         skb_shinfo(skb)->gso_type |= SKB_GSO_TCP_ECN;
                                                   >> 652 
                                                   >> 653                 skb_shinfo(skb)->gso_size = gso.gso_size;
                                                   >> 654                 if (skb_shinfo(skb)->gso_size == 0) {
                                                   >> 655                         tun->dev->stats.rx_frame_errors++;
                                                   >> 656                         kfree_skb(skb);
                                                   >> 657                         return -EINVAL;
                                                   >> 658                 }
                                                   >> 659 
                                                   >> 660                 /* Header must be checked, and gso_segs computed. */
                                                   >> 661                 skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY;
                                                   >> 662                 skb_shinfo(skb)->gso_segs = 0;
                                                   >> 663         }
321                                                   664 
322         netif_rx_ni(skb);                         665         netif_rx_ni(skb);
323         tun->dev->last_rx = jiffies;           << 
324                                                   666 
325         tun->dev->stats.rx_packets++;             667         tun->dev->stats.rx_packets++;
326         tun->dev->stats.rx_bytes += len;          668         tun->dev->stats.rx_bytes += len;
327                                                   669 
328         return count;                             670         return count;
329 }                                                 671 }
330                                                   672 
331 static ssize_t tun_chr_aio_write(struct kiocb     673 static ssize_t tun_chr_aio_write(struct kiocb *iocb, const struct iovec *iv,
332                               unsigned long co    674                               unsigned long count, loff_t pos)
333 {                                                 675 {
334         struct tun_struct *tun = iocb->ki_filp !! 676         struct file *file = iocb->ki_filp;
                                                   >> 677         struct tun_struct *tun = tun_get(file);
                                                   >> 678         ssize_t result;
335                                                   679 
336         if (!tun)                                 680         if (!tun)
337                 return -EBADFD;                   681                 return -EBADFD;
338                                                   682 
339         DBG(KERN_INFO "%s: tun_chr_write %ld\n    683         DBG(KERN_INFO "%s: tun_chr_write %ld\n", tun->dev->name, count);
340                                                   684 
341         return tun_get_user(tun, (struct iovec !! 685         result = tun_get_user(tun, iv, iov_length(iv, count),
                                                   >> 686                               file->f_flags & O_NONBLOCK);
                                                   >> 687 
                                                   >> 688         tun_put(tun);
                                                   >> 689         return result;
342 }                                                 690 }
343                                                   691 
344 /* Put packet to the user space buffer */         692 /* Put packet to the user space buffer */
345 static __inline__ ssize_t tun_put_user(struct     693 static __inline__ ssize_t tun_put_user(struct tun_struct *tun,
346                                        struct     694                                        struct sk_buff *skb,
347                                        struct  !! 695                                        const struct iovec *iv, int len)
348 {                                                 696 {
349         struct tun_pi pi = { 0, skb->protocol     697         struct tun_pi pi = { 0, skb->protocol };
350         ssize_t total = 0;                        698         ssize_t total = 0;
351                                                   699 
352         if (!(tun->flags & TUN_NO_PI)) {          700         if (!(tun->flags & TUN_NO_PI)) {
353                 if ((len -= sizeof(pi)) < 0)      701                 if ((len -= sizeof(pi)) < 0)
354                         return -EINVAL;           702                         return -EINVAL;
355                                                   703 
356                 if (len < skb->len) {             704                 if (len < skb->len) {
357                         /* Packet will be stri    705                         /* Packet will be striped */
358                         pi.flags |= TUN_PKT_ST    706                         pi.flags |= TUN_PKT_STRIP;
359                 }                                 707                 }
360                                                   708 
361                 if (memcpy_toiovec(iv, (void * !! 709                 if (memcpy_toiovecend(iv, (void *) &pi, 0, sizeof(pi)))
362                         return -EFAULT;           710                         return -EFAULT;
363                 total += sizeof(pi);              711                 total += sizeof(pi);
364         }                                         712         }
365                                                   713 
                                                   >> 714         if (tun->flags & TUN_VNET_HDR) {
                                                   >> 715                 struct virtio_net_hdr gso = { 0 }; /* no info leak */
                                                   >> 716                 if ((len -= sizeof(gso)) < 0)
                                                   >> 717                         return -EINVAL;
                                                   >> 718 
                                                   >> 719                 if (skb_is_gso(skb)) {
                                                   >> 720                         struct skb_shared_info *sinfo = skb_shinfo(skb);
                                                   >> 721 
                                                   >> 722                         /* This is a hint as to how much should be linear. */
                                                   >> 723                         gso.hdr_len = skb_headlen(skb);
                                                   >> 724                         gso.gso_size = sinfo->gso_size;
                                                   >> 725                         if (sinfo->gso_type & SKB_GSO_TCPV4)
                                                   >> 726                                 gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV4;
                                                   >> 727                         else if (sinfo->gso_type & SKB_GSO_TCPV6)
                                                   >> 728                                 gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV6;
                                                   >> 729                         else
                                                   >> 730                                 BUG();
                                                   >> 731                         if (sinfo->gso_type & SKB_GSO_TCP_ECN)
                                                   >> 732                                 gso.gso_type |= VIRTIO_NET_HDR_GSO_ECN;
                                                   >> 733                 } else
                                                   >> 734                         gso.gso_type = VIRTIO_NET_HDR_GSO_NONE;
                                                   >> 735 
                                                   >> 736                 if (skb->ip_summed == CHECKSUM_PARTIAL) {
                                                   >> 737                         gso.flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
                                                   >> 738                         gso.csum_start = skb->csum_start - skb_headroom(skb);
                                                   >> 739                         gso.csum_offset = skb->csum_offset;
                                                   >> 740                 } /* else everything is zero */
                                                   >> 741 
                                                   >> 742                 if (unlikely(memcpy_toiovecend(iv, (void *)&gso, total,
                                                   >> 743                                                sizeof(gso))))
                                                   >> 744                         return -EFAULT;
                                                   >> 745                 total += sizeof(gso);
                                                   >> 746         }
                                                   >> 747 
366         len = min_t(int, skb->len, len);          748         len = min_t(int, skb->len, len);
367                                                   749 
368         skb_copy_datagram_iovec(skb, 0, iv, le !! 750         skb_copy_datagram_const_iovec(skb, 0, iv, total, len);
369         total += len;                             751         total += len;
370                                                   752 
371         tun->dev->stats.tx_packets++;             753         tun->dev->stats.tx_packets++;
372         tun->dev->stats.tx_bytes += len;          754         tun->dev->stats.tx_bytes += len;
373                                                   755 
374         return total;                             756         return total;
375 }                                                 757 }
376                                                   758 
377 static ssize_t tun_chr_aio_read(struct kiocb *    759 static ssize_t tun_chr_aio_read(struct kiocb *iocb, const struct iovec *iv,
378                             unsigned long coun    760                             unsigned long count, loff_t pos)
379 {                                                 761 {
380         struct file *file = iocb->ki_filp;        762         struct file *file = iocb->ki_filp;
381         struct tun_struct *tun = file->private !! 763         struct tun_file *tfile = file->private_data;
                                                   >> 764         struct tun_struct *tun = __tun_get(tfile);
382         DECLARE_WAITQUEUE(wait, current);         765         DECLARE_WAITQUEUE(wait, current);
383         struct sk_buff *skb;                      766         struct sk_buff *skb;
384         ssize_t len, ret = 0;                     767         ssize_t len, ret = 0;
385         DECLARE_MAC_BUF(mac);                  << 
386                                                   768 
387         if (!tun)                                 769         if (!tun)
388                 return -EBADFD;                   770                 return -EBADFD;
389                                                   771 
390         DBG(KERN_INFO "%s: tun_chr_read\n", tu    772         DBG(KERN_INFO "%s: tun_chr_read\n", tun->dev->name);
391                                                   773 
392         len = iov_length(iv, count);              774         len = iov_length(iv, count);
393         if (len < 0)                           !! 775         if (len < 0) {
394                 return -EINVAL;                !! 776                 ret = -EINVAL;
                                                   >> 777                 goto out;
                                                   >> 778         }
395                                                   779 
396         add_wait_queue(&tun->read_wait, &wait) !! 780         add_wait_queue(&tun->socket.wait, &wait);
397         while (len) {                             781         while (len) {
398                 const u8 ones[ ETH_ALEN] = { 0 << 
399                 u8 addr[ ETH_ALEN];            << 
400                 int bit_nr;                    << 
401                                                << 
402                 current->state = TASK_INTERRUP    782                 current->state = TASK_INTERRUPTIBLE;
403                                                   783 
404                 /* Read frames from the queue     784                 /* Read frames from the queue */
405                 if (!(skb=skb_dequeue(&tun->re    785                 if (!(skb=skb_dequeue(&tun->readq))) {
406                         if (file->f_flags & O_    786                         if (file->f_flags & O_NONBLOCK) {
407                                 ret = -EAGAIN;    787                                 ret = -EAGAIN;
408                                 break;            788                                 break;
409                         }                         789                         }
410                         if (signal_pending(cur    790                         if (signal_pending(current)) {
411                                 ret = -ERESTAR    791                                 ret = -ERESTARTSYS;
412                                 break;            792                                 break;
413                         }                         793                         }
                                                   >> 794                         if (tun->dev->reg_state != NETREG_REGISTERED) {
                                                   >> 795                                 ret = -EIO;
                                                   >> 796                                 break;
                                                   >> 797                         }
414                                                   798 
415                         /* Nothing to read, le    799                         /* Nothing to read, let's sleep */
416                         schedule();               800                         schedule();
417                         continue;                 801                         continue;
418                 }                                 802                 }
419                 netif_wake_queue(tun->dev);       803                 netif_wake_queue(tun->dev);
420                                                   804 
421                 /** Decide whether to accept t !! 805                 ret = tun_put_user(tun, skb, iv, len);
422                  * behave identically to an Et !! 806                 kfree_skb(skb);
423                  * - we are promiscuous.       !! 807                 break;
424                  * - the packet is addressed t << 
425                  * - the packet is broadcast.  << 
426                  * - the packet is multicast a << 
427                  *   - we are multicast promis << 
428                  *   - we belong to the multic << 
429                  */                            << 
430                 skb_copy_from_linear_data(skb, << 
431                                                << 
432                 bit_nr = ether_crc(sizeof addr << 
433                 if ((tun->if_flags & IFF_PROMI << 
434                                 memcmp(addr, t << 
435                                 memcmp(addr, o << 
436                                 (((addr[0] ==  << 
437                                   (addr[0] ==  << 
438                                  ((tun->if_fla << 
439                                   (tun->chr_fi << 
440                         DBG(KERN_DEBUG "%s: tu << 
441                                         tun->d << 
442                         ret = tun_put_user(tun << 
443                         kfree_skb(skb);        << 
444                         break;                 << 
445                 } else {                       << 
446                         DBG(KERN_DEBUG "%s: tu << 
447                                         tun->d << 
448                         kfree_skb(skb);        << 
449                         continue;              << 
450                 }                              << 
451         }                                         808         }
452                                                   809 
453         current->state = TASK_RUNNING;            810         current->state = TASK_RUNNING;
454         remove_wait_queue(&tun->read_wait, &wa !! 811         remove_wait_queue(&tun->socket.wait, &wait);
455                                                   812 
                                                   >> 813 out:
                                                   >> 814         tun_put(tun);
456         return ret;                               815         return ret;
457 }                                                 816 }
458                                                   817 
459 static void tun_setup(struct net_device *dev)     818 static void tun_setup(struct net_device *dev)
460 {                                                 819 {
461         struct tun_struct *tun = netdev_priv(d    820         struct tun_struct *tun = netdev_priv(dev);
462                                                   821 
463         skb_queue_head_init(&tun->readq);         822         skb_queue_head_init(&tun->readq);
464         init_waitqueue_head(&tun->read_wait);  << 
465                                                   823 
466         tun->owner = -1;                          824         tun->owner = -1;
467         tun->group = -1;                          825         tun->group = -1;
468                                                   826 
469         dev->open = tun_net_open;              << 
470         dev->hard_start_xmit = tun_net_xmit;   << 
471         dev->stop = tun_net_close;             << 
472         dev->ethtool_ops = &tun_ethtool_ops;      827         dev->ethtool_ops = &tun_ethtool_ops;
473         dev->destructor = free_netdev;         !! 828         dev->destructor = tun_free_netdev;
474 }                                                 829 }
475                                                   830 
476 static struct tun_struct *tun_get_by_name(cons !! 831 /* Trivial set of netlink ops to allow deleting tun or tap
                                                   >> 832  * device with netlink.
                                                   >> 833  */
                                                   >> 834 static int tun_validate(struct nlattr *tb[], struct nlattr *data[])
                                                   >> 835 {
                                                   >> 836         return -EINVAL;
                                                   >> 837 }
                                                   >> 838 
                                                   >> 839 static struct rtnl_link_ops tun_link_ops __read_mostly = {
                                                   >> 840         .kind           = DRV_NAME,
                                                   >> 841         .priv_size      = sizeof(struct tun_struct),
                                                   >> 842         .setup          = tun_setup,
                                                   >> 843         .validate       = tun_validate,
                                                   >> 844 };
                                                   >> 845 
                                                   >> 846 static void tun_sock_write_space(struct sock *sk)
477 {                                                 847 {
478         struct tun_struct *tun;                   848         struct tun_struct *tun;
479                                                   849 
480         ASSERT_RTNL();                         !! 850         if (!sock_writeable(sk))
481         list_for_each_entry(tun, &tun_dev_list !! 851                 return;
482                 if (!strncmp(tun->dev->name, n !! 852 
483                     return tun;                !! 853         if (!test_and_clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags))
484         }                                      !! 854                 return;
                                                   >> 855 
                                                   >> 856         if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
                                                   >> 857                 wake_up_interruptible_sync(sk->sk_sleep);
                                                   >> 858 
                                                   >> 859         tun = container_of(sk, struct tun_sock, sk)->tun;
                                                   >> 860         kill_fasync(&tun->fasync, SIGIO, POLL_OUT);
                                                   >> 861 }
                                                   >> 862 
                                                   >> 863 static void tun_sock_destruct(struct sock *sk)
                                                   >> 864 {
                                                   >> 865         free_netdev(container_of(sk, struct tun_sock, sk)->tun->dev);
                                                   >> 866 }
                                                   >> 867 
                                                   >> 868 static struct proto tun_proto = {
                                                   >> 869         .name           = "tun",
                                                   >> 870         .owner          = THIS_MODULE,
                                                   >> 871         .obj_size       = sizeof(struct tun_sock),
                                                   >> 872 };
                                                   >> 873 
                                                   >> 874 static int tun_flags(struct tun_struct *tun)
                                                   >> 875 {
                                                   >> 876         int flags = 0;
                                                   >> 877 
                                                   >> 878         if (tun->flags & TUN_TUN_DEV)
                                                   >> 879                 flags |= IFF_TUN;
                                                   >> 880         else
                                                   >> 881                 flags |= IFF_TAP;
                                                   >> 882 
                                                   >> 883         if (tun->flags & TUN_NO_PI)
                                                   >> 884                 flags |= IFF_NO_PI;
                                                   >> 885 
                                                   >> 886         if (tun->flags & TUN_ONE_QUEUE)
                                                   >> 887                 flags |= IFF_ONE_QUEUE;
                                                   >> 888 
                                                   >> 889         if (tun->flags & TUN_VNET_HDR)
                                                   >> 890                 flags |= IFF_VNET_HDR;
                                                   >> 891 
                                                   >> 892         return flags;
                                                   >> 893 }
                                                   >> 894 
                                                   >> 895 static ssize_t tun_show_flags(struct device *dev, struct device_attribute *attr,
                                                   >> 896                               char *buf)
                                                   >> 897 {
                                                   >> 898         struct tun_struct *tun = netdev_priv(to_net_dev(dev));
                                                   >> 899         return sprintf(buf, "0x%x\n", tun_flags(tun));
                                                   >> 900 }
485                                                   901 
486         return NULL;                           !! 902 static ssize_t tun_show_owner(struct device *dev, struct device_attribute *attr,
                                                   >> 903                               char *buf)
                                                   >> 904 {
                                                   >> 905         struct tun_struct *tun = netdev_priv(to_net_dev(dev));
                                                   >> 906         return sprintf(buf, "%d\n", tun->owner);
487 }                                                 907 }
488                                                   908 
489 static int tun_set_iff(struct file *file, stru !! 909 static ssize_t tun_show_group(struct device *dev, struct device_attribute *attr,
                                                   >> 910                               char *buf)
490 {                                                 911 {
                                                   >> 912         struct tun_struct *tun = netdev_priv(to_net_dev(dev));
                                                   >> 913         return sprintf(buf, "%d\n", tun->group);
                                                   >> 914 }
                                                   >> 915 
                                                   >> 916 static DEVICE_ATTR(tun_flags, 0444, tun_show_flags, NULL);
                                                   >> 917 static DEVICE_ATTR(owner, 0444, tun_show_owner, NULL);
                                                   >> 918 static DEVICE_ATTR(group, 0444, tun_show_group, NULL);
                                                   >> 919 
                                                   >> 920 static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
                                                   >> 921 {
                                                   >> 922         struct sock *sk;
491         struct tun_struct *tun;                   923         struct tun_struct *tun;
492         struct net_device *dev;                   924         struct net_device *dev;
493         int err;                                  925         int err;
494                                                   926 
495         tun = tun_get_by_name(ifr->ifr_name);  !! 927         dev = __dev_get_by_name(net, ifr->ifr_name);
496         if (tun) {                             !! 928         if (dev) {
497                 if (tun->attached)             !! 929                 if (ifr->ifr_flags & IFF_TUN_EXCL)
498                         return -EBUSY;            930                         return -EBUSY;
                                                   >> 931                 if ((ifr->ifr_flags & IFF_TUN) && dev->netdev_ops == &tun_netdev_ops)
                                                   >> 932                         tun = netdev_priv(dev);
                                                   >> 933                 else if ((ifr->ifr_flags & IFF_TAP) && dev->netdev_ops == &tap_netdev_ops)
                                                   >> 934                         tun = netdev_priv(dev);
                                                   >> 935                 else
                                                   >> 936                         return -EINVAL;
499                                                   937 
500                 /* Check permissions */        !! 938                 err = tun_attach(tun, file);
501                 if (((tun->owner != -1 &&      !! 939                 if (err < 0)
502                       current->euid != tun->ow !! 940                         return err;
503                      (tun->group != -1 &&      << 
504                       current->egid != tun->gr << 
505                      !capable(CAP_NET_ADMIN))  << 
506                         return -EPERM;         << 
507         }                                         941         }
508         else if (__dev_get_by_name(&init_net,  << 
509                 return -EINVAL;                << 
510         else {                                    942         else {
511                 char *name;                       943                 char *name;
512                 unsigned long flags = 0;          944                 unsigned long flags = 0;
513                                                   945 
514                 err = -EINVAL;                 << 
515                                                << 
516                 if (!capable(CAP_NET_ADMIN))      946                 if (!capable(CAP_NET_ADMIN))
517                         return -EPERM;            947                         return -EPERM;
518                                                   948 
519                 /* Set dev type */                949                 /* Set dev type */
520                 if (ifr->ifr_flags & IFF_TUN)     950                 if (ifr->ifr_flags & IFF_TUN) {
521                         /* TUN device */          951                         /* TUN device */
522                         flags |= TUN_TUN_DEV;     952                         flags |= TUN_TUN_DEV;
523                         name = "tun%d";           953                         name = "tun%d";
524                 } else if (ifr->ifr_flags & IF    954                 } else if (ifr->ifr_flags & IFF_TAP) {
525                         /* TAP device */          955                         /* TAP device */
526                         flags |= TUN_TAP_DEV;     956                         flags |= TUN_TAP_DEV;
527                         name = "tap%d";           957                         name = "tap%d";
528                 } else                            958                 } else
529                         goto failed;           !! 959                         return -EINVAL;
530                                                   960 
531                 if (*ifr->ifr_name)               961                 if (*ifr->ifr_name)
532                         name = ifr->ifr_name;     962                         name = ifr->ifr_name;
533                                                   963 
534                 dev = alloc_netdev(sizeof(stru    964                 dev = alloc_netdev(sizeof(struct tun_struct), name,
535                                    tun_setup);    965                                    tun_setup);
536                 if (!dev)                         966                 if (!dev)
537                         return -ENOMEM;           967                         return -ENOMEM;
538                                                   968 
                                                   >> 969                 dev_net_set(dev, net);
                                                   >> 970                 dev->rtnl_link_ops = &tun_link_ops;
                                                   >> 971 
539                 tun = netdev_priv(dev);           972                 tun = netdev_priv(dev);
540                 tun->dev = dev;                   973                 tun->dev = dev;
541                 tun->flags = flags;               974                 tun->flags = flags;
542                 /* Be promiscuous by default t !! 975                 tun->txflt.count = 0;
543                 tun->if_flags = IFF_PROMISC;   !! 976 
544                 /* Generate random Ethernet ad !! 977                 err = -ENOMEM;
545                 *(__be16 *)tun->dev_addr = hto !! 978                 sk = sk_alloc(net, AF_UNSPEC, GFP_KERNEL, &tun_proto);
546                 get_random_bytes(tun->dev_addr !! 979                 if (!sk)
547                 memset(tun->chr_filter, 0, siz !! 980                         goto err_free_dev;
                                                   >> 981 
                                                   >> 982                 init_waitqueue_head(&tun->socket.wait);
                                                   >> 983                 sock_init_data(&tun->socket, sk);
                                                   >> 984                 sk->sk_write_space = tun_sock_write_space;
                                                   >> 985                 sk->sk_sndbuf = INT_MAX;
                                                   >> 986 
                                                   >> 987                 tun->sk = sk;
                                                   >> 988                 container_of(sk, struct tun_sock, sk)->tun = tun;
548                                                   989 
549                 tun_net_init(dev);                990                 tun_net_init(dev);
550                                                   991 
551                 if (strchr(dev->name, '%')) {     992                 if (strchr(dev->name, '%')) {
552                         err = dev_alloc_name(d    993                         err = dev_alloc_name(dev, dev->name);
553                         if (err < 0)              994                         if (err < 0)
554                                 goto err_free_ !! 995                                 goto err_free_sk;
555                 }                                 996                 }
556                                                   997 
                                                   >> 998                 err = -EINVAL;
557                 err = register_netdevice(tun->    999                 err = register_netdevice(tun->dev);
558                 if (err < 0)                      1000                 if (err < 0)
559                         goto err_free_dev;     !! 1001                         goto err_free_sk;
                                                   >> 1002 
                                                   >> 1003                 if (device_create_file(&tun->dev->dev, &dev_attr_tun_flags) ||
                                                   >> 1004                     device_create_file(&tun->dev->dev, &dev_attr_owner) ||
                                                   >> 1005                     device_create_file(&tun->dev->dev, &dev_attr_group))
                                                   >> 1006                         printk(KERN_ERR "Failed to create tun sysfs files\n");
                                                   >> 1007 
                                                   >> 1008                 sk->sk_destruct = tun_sock_destruct;
560                                                   1009 
561                 list_add(&tun->list, &tun_dev_ !! 1010                 err = tun_attach(tun, file);
                                                   >> 1011                 if (err < 0)
                                                   >> 1012                         goto failed;
562         }                                         1013         }
563                                                   1014 
564         DBG(KERN_INFO "%s: tun_set_iff\n", tun    1015         DBG(KERN_INFO "%s: tun_set_iff\n", tun->dev->name);
565                                                   1016 
566         if (ifr->ifr_flags & IFF_NO_PI)           1017         if (ifr->ifr_flags & IFF_NO_PI)
567                 tun->flags |= TUN_NO_PI;          1018                 tun->flags |= TUN_NO_PI;
568         else                                      1019         else
569                 tun->flags &= ~TUN_NO_PI;         1020                 tun->flags &= ~TUN_NO_PI;
570                                                   1021 
571         if (ifr->ifr_flags & IFF_ONE_QUEUE)       1022         if (ifr->ifr_flags & IFF_ONE_QUEUE)
572                 tun->flags |= TUN_ONE_QUEUE;      1023                 tun->flags |= TUN_ONE_QUEUE;
573         else                                      1024         else
574                 tun->flags &= ~TUN_ONE_QUEUE;     1025                 tun->flags &= ~TUN_ONE_QUEUE;
575                                                   1026 
576         file->private_data = tun;              !! 1027         if (ifr->ifr_flags & IFF_VNET_HDR)
577         tun->attached = 1;                     !! 1028                 tun->flags |= TUN_VNET_HDR;
                                                   >> 1029         else
                                                   >> 1030                 tun->flags &= ~TUN_VNET_HDR;
                                                   >> 1031 
                                                   >> 1032         /* Make sure persistent devices do not get stuck in
                                                   >> 1033          * xoff state.
                                                   >> 1034          */
                                                   >> 1035         if (netif_running(tun->dev))
                                                   >> 1036                 netif_wake_queue(tun->dev);
578                                                   1037 
579         strcpy(ifr->ifr_name, tun->dev->name);    1038         strcpy(ifr->ifr_name, tun->dev->name);
580         return 0;                                 1039         return 0;
581                                                   1040 
                                                   >> 1041  err_free_sk:
                                                   >> 1042         sock_put(sk);
582  err_free_dev:                                    1043  err_free_dev:
583         free_netdev(dev);                         1044         free_netdev(dev);
584  failed:                                          1045  failed:
585         return err;                               1046         return err;
586 }                                                 1047 }
587                                                   1048 
588 static int tun_chr_ioctl(struct inode *inode,  !! 1049 static int tun_get_iff(struct net *net, struct tun_struct *tun,
589                          unsigned int cmd, uns !! 1050                        struct ifreq *ifr)
                                                   >> 1051 {
                                                   >> 1052         DBG(KERN_INFO "%s: tun_get_iff\n", tun->dev->name);
                                                   >> 1053 
                                                   >> 1054         strcpy(ifr->ifr_name, tun->dev->name);
                                                   >> 1055 
                                                   >> 1056         ifr->ifr_flags = tun_flags(tun);
                                                   >> 1057 
                                                   >> 1058         return 0;
                                                   >> 1059 }
                                                   >> 1060 
                                                   >> 1061 /* This is like a cut-down ethtool ops, except done via tun fd so no
                                                   >> 1062  * privs required. */
                                                   >> 1063 static int set_offload(struct net_device *dev, unsigned long arg)
                                                   >> 1064 {
                                                   >> 1065         unsigned int old_features, features;
                                                   >> 1066 
                                                   >> 1067         old_features = dev->features;
                                                   >> 1068         /* Unset features, set them as we chew on the arg. */
                                                   >> 1069         features = (old_features & ~(NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST
                                                   >> 1070                                     |NETIF_F_TSO_ECN|NETIF_F_TSO|NETIF_F_TSO6));
                                                   >> 1071 
                                                   >> 1072         if (arg & TUN_F_CSUM) {
                                                   >> 1073                 features |= NETIF_F_HW_CSUM|NETIF_F_SG|NETIF_F_FRAGLIST;
                                                   >> 1074                 arg &= ~TUN_F_CSUM;
                                                   >> 1075 
                                                   >> 1076                 if (arg & (TUN_F_TSO4|TUN_F_TSO6)) {
                                                   >> 1077                         if (arg & TUN_F_TSO_ECN) {
                                                   >> 1078                                 features |= NETIF_F_TSO_ECN;
                                                   >> 1079                                 arg &= ~TUN_F_TSO_ECN;
                                                   >> 1080                         }
                                                   >> 1081                         if (arg & TUN_F_TSO4)
                                                   >> 1082                                 features |= NETIF_F_TSO;
                                                   >> 1083                         if (arg & TUN_F_TSO6)
                                                   >> 1084                                 features |= NETIF_F_TSO6;
                                                   >> 1085                         arg &= ~(TUN_F_TSO4|TUN_F_TSO6);
                                                   >> 1086                 }
                                                   >> 1087         }
                                                   >> 1088 
                                                   >> 1089         /* This gives the user a way to test for new features in future by
                                                   >> 1090          * trying to set them. */
                                                   >> 1091         if (arg)
                                                   >> 1092                 return -EINVAL;
                                                   >> 1093 
                                                   >> 1094         dev->features = features;
                                                   >> 1095         if (old_features != dev->features)
                                                   >> 1096                 netdev_features_change(dev);
                                                   >> 1097 
                                                   >> 1098         return 0;
                                                   >> 1099 }
                                                   >> 1100 
                                                   >> 1101 static long tun_chr_ioctl(struct file *file, unsigned int cmd,
                                                   >> 1102                           unsigned long arg)
590 {                                                 1103 {
591         struct tun_struct *tun = file->private !! 1104         struct tun_file *tfile = file->private_data;
                                                   >> 1105         struct tun_struct *tun;
592         void __user* argp = (void __user*)arg;    1106         void __user* argp = (void __user*)arg;
593         struct ifreq ifr;                         1107         struct ifreq ifr;
594         DECLARE_MAC_BUF(mac);                  !! 1108         int sndbuf;
                                                   >> 1109         int ret;
595                                                   1110 
596         if (cmd == TUNSETIFF || _IOC_TYPE(cmd)    1111         if (cmd == TUNSETIFF || _IOC_TYPE(cmd) == 0x89)
597                 if (copy_from_user(&ifr, argp,    1112                 if (copy_from_user(&ifr, argp, sizeof ifr))
598                         return -EFAULT;           1113                         return -EFAULT;
599                                                   1114 
600         if (cmd == TUNSETIFF && !tun) {        !! 1115         if (cmd == TUNGETFEATURES) {
601                 int err;                       !! 1116                 /* Currently this just means: "what IFF flags are valid?".
                                                   >> 1117                  * This is needed because we never checked for invalid flags on
                                                   >> 1118                  * TUNSETIFF. */
                                                   >> 1119                 return put_user(IFF_TUN | IFF_TAP | IFF_NO_PI | IFF_ONE_QUEUE |
                                                   >> 1120                                 IFF_VNET_HDR,
                                                   >> 1121                                 (unsigned int __user*)argp);
                                                   >> 1122         }
                                                   >> 1123 
                                                   >> 1124         rtnl_lock();
602                                                   1125 
                                                   >> 1126         tun = __tun_get(tfile);
                                                   >> 1127         if (cmd == TUNSETIFF && !tun) {
603                 ifr.ifr_name[IFNAMSIZ-1] = '\0    1128                 ifr.ifr_name[IFNAMSIZ-1] = '\0';
604                                                   1129 
605                 rtnl_lock();                   !! 1130                 ret = tun_set_iff(tfile->net, file, &ifr);
606                 err = tun_set_iff(file, &ifr); << 
607                 rtnl_unlock();                 << 
608                                                   1131 
609                 if (err)                       !! 1132                 if (ret)
610                         return err;            !! 1133                         goto unlock;
611                                                   1134 
612                 if (copy_to_user(argp, &ifr, s    1135                 if (copy_to_user(argp, &ifr, sizeof(ifr)))
613                         return -EFAULT;        !! 1136                         ret = -EFAULT;
614                 return 0;                      !! 1137                 goto unlock;
615         }                                         1138         }
616                                                   1139 
                                                   >> 1140         ret = -EBADFD;
617         if (!tun)                                 1141         if (!tun)
618                 return -EBADFD;                !! 1142                 goto unlock;
619                                                   1143 
620         DBG(KERN_INFO "%s: tun_chr_ioctl cmd %    1144         DBG(KERN_INFO "%s: tun_chr_ioctl cmd %d\n", tun->dev->name, cmd);
621                                                   1145 
                                                   >> 1146         ret = 0;
622         switch (cmd) {                            1147         switch (cmd) {
                                                   >> 1148         case TUNGETIFF:
                                                   >> 1149                 ret = tun_get_iff(current->nsproxy->net_ns, tun, &ifr);
                                                   >> 1150                 if (ret)
                                                   >> 1151                         break;
                                                   >> 1152 
                                                   >> 1153                 if (copy_to_user(argp, &ifr, sizeof(ifr)))
                                                   >> 1154                         ret = -EFAULT;
                                                   >> 1155                 break;
                                                   >> 1156 
623         case TUNSETNOCSUM:                        1157         case TUNSETNOCSUM:
624                 /* Disable/Enable checksum */     1158                 /* Disable/Enable checksum */
625                 if (arg)                          1159                 if (arg)
626                         tun->flags |= TUN_NOCH    1160                         tun->flags |= TUN_NOCHECKSUM;
627                 else                              1161                 else
628                         tun->flags &= ~TUN_NOC    1162                         tun->flags &= ~TUN_NOCHECKSUM;
629                                                   1163 
630                 DBG(KERN_INFO "%s: checksum %s    1164                 DBG(KERN_INFO "%s: checksum %s\n",
631                     tun->dev->name, arg ? "dis    1165                     tun->dev->name, arg ? "disabled" : "enabled");
632                 break;                            1166                 break;
633                                                   1167 
634         case TUNSETPERSIST:                       1168         case TUNSETPERSIST:
635                 /* Disable/Enable persist mode    1169                 /* Disable/Enable persist mode */
636                 if (arg)                          1170                 if (arg)
637                         tun->flags |= TUN_PERS    1171                         tun->flags |= TUN_PERSIST;
638                 else                              1172                 else
639                         tun->flags &= ~TUN_PER    1173                         tun->flags &= ~TUN_PERSIST;
640                                                   1174 
641                 DBG(KERN_INFO "%s: persist %s\    1175                 DBG(KERN_INFO "%s: persist %s\n",
642                     tun->dev->name, arg ? "ena    1176                     tun->dev->name, arg ? "enabled" : "disabled");
643                 break;                            1177                 break;
644                                                   1178 
645         case TUNSETOWNER:                         1179         case TUNSETOWNER:
646                 /* Set owner of the device */     1180                 /* Set owner of the device */
647                 tun->owner = (uid_t) arg;         1181                 tun->owner = (uid_t) arg;
648                                                   1182 
649                 DBG(KERN_INFO "%s: owner set t    1183                 DBG(KERN_INFO "%s: owner set to %d\n", tun->dev->name, tun->owner);
650                 break;                            1184                 break;
651                                                   1185 
652         case TUNSETGROUP:                         1186         case TUNSETGROUP:
653                 /* Set group of the device */     1187                 /* Set group of the device */
654                 tun->group= (gid_t) arg;          1188                 tun->group= (gid_t) arg;
655                                                   1189 
656                 DBG(KERN_INFO "%s: group set t    1190                 DBG(KERN_INFO "%s: group set to %d\n", tun->dev->name, tun->group);
657                 break;                            1191                 break;
658                                                   1192 
659         case TUNSETLINK:                          1193         case TUNSETLINK:
660                 /* Only allow setting the type    1194                 /* Only allow setting the type when the interface is down */
661                 if (tun->dev->flags & IFF_UP)     1195                 if (tun->dev->flags & IFF_UP) {
662                         DBG(KERN_INFO "%s: Lin    1196                         DBG(KERN_INFO "%s: Linktype set failed because interface is up\n",
663                                 tun->dev->name    1197                                 tun->dev->name);
664                         return -EBUSY;         !! 1198                         ret = -EBUSY;
665                 } else {                          1199                 } else {
666                         tun->dev->type = (int)    1200                         tun->dev->type = (int) arg;
667                         DBG(KERN_INFO "%s: lin    1201                         DBG(KERN_INFO "%s: linktype set to %d\n", tun->dev->name, tun->dev->type);
                                                   >> 1202                         ret = 0;
668                 }                                 1203                 }
669                 break;                            1204                 break;
670                                                   1205 
671 #ifdef TUN_DEBUG                                  1206 #ifdef TUN_DEBUG
672         case TUNSETDEBUG:                         1207         case TUNSETDEBUG:
673                 tun->debug = arg;                 1208                 tun->debug = arg;
674                 break;                            1209                 break;
675 #endif                                            1210 #endif
                                                   >> 1211         case TUNSETOFFLOAD:
                                                   >> 1212                 ret = set_offload(tun->dev, arg);
                                                   >> 1213                 break;
676                                                   1214 
677         case SIOCGIFFLAGS:                     !! 1215         case TUNSETTXFILTER:
678                 ifr.ifr_flags = tun->if_flags; !! 1216                 /* Can be set only for TAPs */
679                 if (copy_to_user( argp, &ifr,  !! 1217                 ret = -EINVAL;
680                         return -EFAULT;        !! 1218                 if ((tun->flags & TUN_TYPE_MASK) != TUN_TAP_DEV)
681                 return 0;                      !! 1219                         break;
682                                                !! 1220                 ret = update_filter(&tun->txflt, (void __user *)arg);
683         case SIOCSIFFLAGS:                     !! 1221                 break;
684                 /** Set the character device's << 
685                  * IFF_PROMISC and IFF_ALLMULT << 
686                 tun->if_flags = ifr.ifr_flags; << 
687                 DBG(KERN_INFO "%s: interface f << 
688                                 tun->dev->name << 
689                 return 0;                      << 
690                                                   1222 
691         case SIOCGIFHWADDR:                       1223         case SIOCGIFHWADDR:
692                 /* Note: the actual net device !! 1224                 /* Get hw addres */
693                 memcpy(ifr.ifr_hwaddr.sa_data, !! 1225                 memcpy(ifr.ifr_hwaddr.sa_data, tun->dev->dev_addr, ETH_ALEN);
694                                 min(sizeof ifr !! 1226                 ifr.ifr_hwaddr.sa_family = tun->dev->type;
695                 if (copy_to_user( argp, &ifr,  !! 1227                 if (copy_to_user(argp, &ifr, sizeof ifr))
696                         return -EFAULT;        !! 1228                         ret = -EFAULT;
697                 return 0;                      !! 1229                 break;
698                                                   1230 
699         case SIOCSIFHWADDR:                       1231         case SIOCSIFHWADDR:
700         {                                      !! 1232                 /* Set hw address */
701                 /* try to set the actual net d !! 1233                 DBG(KERN_DEBUG "%s: set hw address: %pM\n",
702                 int ret;                       !! 1234                         tun->dev->name, ifr.ifr_hwaddr.sa_data);
703                                                   1235 
704                 rtnl_lock();                   << 
705                 ret = dev_set_mac_address(tun-    1236                 ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr);
706                 rtnl_unlock();                 !! 1237                 break;
707                                                   1238 
708                 if (ret == 0) {                !! 1239         case TUNGETSNDBUF:
709                         /** Set the character  !! 1240                 sndbuf = tun->sk->sk_sndbuf;
710                          * filtering packets b !! 1241                 if (copy_to_user(argp, &sndbuf, sizeof(sndbuf)))
711                          * device. */          !! 1242                         ret = -EFAULT;
712                         memcpy(tun->dev_addr,  !! 1243                 break;
713                                         min(si << 
714                         DBG(KERN_DEBUG "%s: se << 
715                                         tun->d << 
716                                         tun->d << 
717                                         tun->d << 
718                 }                              << 
719                                                << 
720                 return  ret;                   << 
721         }                                      << 
722                                                << 
723         case SIOCADDMULTI:                     << 
724                 /** Add the specified group to << 
725                  * list. */                    << 
726                 add_multi(tun->chr_filter, ifr << 
727                 DBG(KERN_DEBUG "%s: add multi: << 
728                     tun->dev->name, print_mac( << 
729                 return 0;                      << 
730                                                   1244 
731         case SIOCDELMULTI:                     !! 1245         case TUNSETSNDBUF:
732                 /** Remove the specified group !! 1246                 if (copy_from_user(&sndbuf, argp, sizeof(sndbuf))) {
733                  * filter list. */             !! 1247                         ret = -EFAULT;
734                 del_multi(tun->chr_filter, ifr !! 1248                         break;
735                 DBG(KERN_DEBUG "%s: del multi: !! 1249                 }
736                     tun->dev->name, print_mac( !! 1250 
737                 return 0;                      !! 1251                 tun->sk->sk_sndbuf = sndbuf;
                                                   >> 1252                 break;
738                                                   1253 
739         default:                                  1254         default:
740                 return -EINVAL;                !! 1255                 ret = -EINVAL;
                                                   >> 1256                 break;
741         };                                        1257         };
742                                                   1258 
743         return 0;                              !! 1259 unlock:
                                                   >> 1260         rtnl_unlock();
                                                   >> 1261         if (tun)
                                                   >> 1262                 tun_put(tun);
                                                   >> 1263         return ret;
744 }                                                 1264 }
745                                                   1265 
746 static int tun_chr_fasync(int fd, struct file     1266 static int tun_chr_fasync(int fd, struct file *file, int on)
747 {                                                 1267 {
748         struct tun_struct *tun = file->private !! 1268         struct tun_struct *tun = tun_get(file);
749         int ret;                                  1269         int ret;
750                                                   1270 
751         if (!tun)                                 1271         if (!tun)
752                 return -EBADFD;                   1272                 return -EBADFD;
753                                                   1273 
754         DBG(KERN_INFO "%s: tun_chr_fasync %d\n    1274         DBG(KERN_INFO "%s: tun_chr_fasync %d\n", tun->dev->name, on);
755                                                   1275 
                                                   >> 1276         lock_kernel();
756         if ((ret = fasync_helper(fd, file, on,    1277         if ((ret = fasync_helper(fd, file, on, &tun->fasync)) < 0)
757                 return ret;                    !! 1278                 goto out;
758                                                   1279 
759         if (on) {                                 1280         if (on) {
760                 ret = __f_setown(file, task_pi    1281                 ret = __f_setown(file, task_pid(current), PIDTYPE_PID, 0);
761                 if (ret)                          1282                 if (ret)
762                         return ret;            !! 1283                         goto out;
763                 tun->flags |= TUN_FASYNC;         1284                 tun->flags |= TUN_FASYNC;
764         } else                                    1285         } else
765                 tun->flags &= ~TUN_FASYNC;        1286                 tun->flags &= ~TUN_FASYNC;
766                                                !! 1287         ret = 0;
767         return 0;                              !! 1288 out:
                                                   >> 1289         unlock_kernel();
                                                   >> 1290         tun_put(tun);
                                                   >> 1291         return ret;
768 }                                                 1292 }
769                                                   1293 
770 static int tun_chr_open(struct inode *inode, s    1294 static int tun_chr_open(struct inode *inode, struct file * file)
771 {                                                 1295 {
                                                   >> 1296         struct tun_file *tfile;
                                                   >> 1297         cycle_kernel_lock();
772         DBG1(KERN_INFO "tunX: tun_chr_open\n")    1298         DBG1(KERN_INFO "tunX: tun_chr_open\n");
773         file->private_data = NULL;             !! 1299 
                                                   >> 1300         tfile = kmalloc(sizeof(*tfile), GFP_KERNEL);
                                                   >> 1301         if (!tfile)
                                                   >> 1302                 return -ENOMEM;
                                                   >> 1303         atomic_set(&tfile->count, 0);
                                                   >> 1304         tfile->tun = NULL;
                                                   >> 1305         tfile->net = get_net(current->nsproxy->net_ns);
                                                   >> 1306         file->private_data = tfile;
774         return 0;                                 1307         return 0;
775 }                                                 1308 }
776                                                   1309 
777 static int tun_chr_close(struct inode *inode,     1310 static int tun_chr_close(struct inode *inode, struct file *file)
778 {                                                 1311 {
779         struct tun_struct *tun = file->private !! 1312         struct tun_file *tfile = file->private_data;
780                                                !! 1313         struct tun_struct *tun;
781         if (!tun)                              << 
782                 return 0;                      << 
783                                                << 
784         DBG(KERN_INFO "%s: tun_chr_close\n", t << 
785                                                << 
786         tun_chr_fasync(-1, file, 0);           << 
787                                                   1314 
788         rtnl_lock();                           !! 1315         tun = __tun_get(tfile);
                                                   >> 1316         if (tun) {
                                                   >> 1317                 struct net_device *dev = tun->dev;
789                                                   1318 
790         /* Detach from net device */           !! 1319                 DBG(KERN_INFO "%s: tun_chr_close\n", dev->name);
791         file->private_data = NULL;             << 
792         tun->attached = 0;                     << 
793                                                   1320 
794         /* Drop read queue */                  !! 1321                 __tun_detach(tun);
795         skb_queue_purge(&tun->readq);          << 
796                                                   1322 
797         if (!(tun->flags & TUN_PERSIST)) {     !! 1323                 /* If desireable, unregister the netdevice. */
798                 list_del(&tun->list);          !! 1324                 if (!(tun->flags & TUN_PERSIST)) {
799                 unregister_netdevice(tun->dev) !! 1325                         rtnl_lock();
                                                   >> 1326                         if (dev->reg_state == NETREG_REGISTERED)
                                                   >> 1327                                 unregister_netdevice(dev);
                                                   >> 1328                         rtnl_unlock();
                                                   >> 1329                 }
800         }                                         1330         }
801                                                   1331 
802         rtnl_unlock();                         !! 1332         tun = tfile->tun;
                                                   >> 1333         if (tun)
                                                   >> 1334                 sock_put(tun->sk);
                                                   >> 1335 
                                                   >> 1336         put_net(tfile->net);
                                                   >> 1337         kfree(tfile);
803                                                   1338 
804         return 0;                                 1339         return 0;
805 }                                                 1340 }
806                                                   1341 
807 static const struct file_operations tun_fops =    1342 static const struct file_operations tun_fops = {
808         .owner  = THIS_MODULE,                    1343         .owner  = THIS_MODULE,
809         .llseek = no_llseek,                      1344         .llseek = no_llseek,
810         .read  = do_sync_read,                    1345         .read  = do_sync_read,
811         .aio_read  = tun_chr_aio_read,            1346         .aio_read  = tun_chr_aio_read,
812         .write = do_sync_write,                   1347         .write = do_sync_write,
813         .aio_write = tun_chr_aio_write,           1348         .aio_write = tun_chr_aio_write,
814         .poll   = tun_chr_poll,                   1349         .poll   = tun_chr_poll,
815         .ioctl  = tun_chr_ioctl,               !! 1350         .unlocked_ioctl = tun_chr_ioctl,
816         .open   = tun_chr_open,                   1351         .open   = tun_chr_open,
817         .release = tun_chr_close,                 1352         .release = tun_chr_close,
818         .fasync = tun_chr_fasync                  1353         .fasync = tun_chr_fasync
819 };                                                1354 };
820                                                   1355 
821 static struct miscdevice tun_miscdev = {          1356 static struct miscdevice tun_miscdev = {
822         .minor = TUN_MINOR,                       1357         .minor = TUN_MINOR,
823         .name = "tun",                            1358         .name = "tun",
                                                   >> 1359         .devnode = "net/tun",
824         .fops = &tun_fops,                        1360         .fops = &tun_fops,
825 };                                                1361 };
826                                                   1362 
827 /* ethtool interface */                           1363 /* ethtool interface */
828                                                   1364 
829 static int tun_get_settings(struct net_device     1365 static int tun_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
830 {                                                 1366 {
831         cmd->supported          = 0;              1367         cmd->supported          = 0;
832         cmd->advertising        = 0;              1368         cmd->advertising        = 0;
833         cmd->speed              = SPEED_10;       1369         cmd->speed              = SPEED_10;
834         cmd->duplex             = DUPLEX_FULL;    1370         cmd->duplex             = DUPLEX_FULL;
835         cmd->port               = PORT_TP;        1371         cmd->port               = PORT_TP;
836         cmd->phy_address        = 0;              1372         cmd->phy_address        = 0;
837         cmd->transceiver        = XCVR_INTERNA    1373         cmd->transceiver        = XCVR_INTERNAL;
838         cmd->autoneg            = AUTONEG_DISA    1374         cmd->autoneg            = AUTONEG_DISABLE;
839         cmd->maxtxpkt           = 0;              1375         cmd->maxtxpkt           = 0;
840         cmd->maxrxpkt           = 0;              1376         cmd->maxrxpkt           = 0;
841         return 0;                                 1377         return 0;
842 }                                                 1378 }
843                                                   1379 
844 static void tun_get_drvinfo(struct net_device     1380 static void tun_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
845 {                                                 1381 {
846         struct tun_struct *tun = netdev_priv(d    1382         struct tun_struct *tun = netdev_priv(dev);
847                                                   1383 
848         strcpy(info->driver, DRV_NAME);           1384         strcpy(info->driver, DRV_NAME);
849         strcpy(info->version, DRV_VERSION);       1385         strcpy(info->version, DRV_VERSION);
850         strcpy(info->fw_version, "N/A");          1386         strcpy(info->fw_version, "N/A");
851                                                   1387 
852         switch (tun->flags & TUN_TYPE_MASK) {     1388         switch (tun->flags & TUN_TYPE_MASK) {
853         case TUN_TUN_DEV:                         1389         case TUN_TUN_DEV:
854                 strcpy(info->bus_info, "tun");    1390                 strcpy(info->bus_info, "tun");
855                 break;                            1391                 break;
856         case TUN_TAP_DEV:                         1392         case TUN_TAP_DEV:
857                 strcpy(info->bus_info, "tap");    1393                 strcpy(info->bus_info, "tap");
858                 break;                            1394                 break;
859         }                                         1395         }
860 }                                                 1396 }
861                                                   1397 
862 static u32 tun_get_msglevel(struct net_device     1398 static u32 tun_get_msglevel(struct net_device *dev)
863 {                                                 1399 {
864 #ifdef TUN_DEBUG                                  1400 #ifdef TUN_DEBUG
865         struct tun_struct *tun = netdev_priv(d    1401         struct tun_struct *tun = netdev_priv(dev);
866         return tun->debug;                        1402         return tun->debug;
867 #else                                             1403 #else
868         return -EOPNOTSUPP;                       1404         return -EOPNOTSUPP;
869 #endif                                            1405 #endif
870 }                                                 1406 }
871                                                   1407 
872 static void tun_set_msglevel(struct net_device    1408 static void tun_set_msglevel(struct net_device *dev, u32 value)
873 {                                                 1409 {
874 #ifdef TUN_DEBUG                                  1410 #ifdef TUN_DEBUG
875         struct tun_struct *tun = netdev_priv(d    1411         struct tun_struct *tun = netdev_priv(dev);
876         tun->debug = value;                       1412         tun->debug = value;
877 #endif                                            1413 #endif
878 }                                                 1414 }
879                                                   1415 
880 static u32 tun_get_link(struct net_device *dev    1416 static u32 tun_get_link(struct net_device *dev)
881 {                                                 1417 {
882         struct tun_struct *tun = netdev_priv(d    1418         struct tun_struct *tun = netdev_priv(dev);
883         return tun->attached;                  !! 1419         return !!tun->tfile;
884 }                                                 1420 }
885                                                   1421 
886 static u32 tun_get_rx_csum(struct net_device *    1422 static u32 tun_get_rx_csum(struct net_device *dev)
887 {                                                 1423 {
888         struct tun_struct *tun = netdev_priv(d    1424         struct tun_struct *tun = netdev_priv(dev);
889         return (tun->flags & TUN_NOCHECKSUM) =    1425         return (tun->flags & TUN_NOCHECKSUM) == 0;
890 }                                                 1426 }
891                                                   1427 
892 static int tun_set_rx_csum(struct net_device *    1428 static int tun_set_rx_csum(struct net_device *dev, u32 data)
893 {                                                 1429 {
894         struct tun_struct *tun = netdev_priv(d    1430         struct tun_struct *tun = netdev_priv(dev);
895         if (data)                                 1431         if (data)
896                 tun->flags &= ~TUN_NOCHECKSUM;    1432                 tun->flags &= ~TUN_NOCHECKSUM;
897         else                                      1433         else
898                 tun->flags |= TUN_NOCHECKSUM;     1434                 tun->flags |= TUN_NOCHECKSUM;
899         return 0;                                 1435         return 0;
900 }                                                 1436 }
901                                                   1437 
902 static const struct ethtool_ops tun_ethtool_op    1438 static const struct ethtool_ops tun_ethtool_ops = {
903         .get_settings   = tun_get_settings,       1439         .get_settings   = tun_get_settings,
904         .get_drvinfo    = tun_get_drvinfo,        1440         .get_drvinfo    = tun_get_drvinfo,
905         .get_msglevel   = tun_get_msglevel,       1441         .get_msglevel   = tun_get_msglevel,
906         .set_msglevel   = tun_set_msglevel,       1442         .set_msglevel   = tun_set_msglevel,
907         .get_link       = tun_get_link,           1443         .get_link       = tun_get_link,
908         .get_rx_csum    = tun_get_rx_csum,        1444         .get_rx_csum    = tun_get_rx_csum,
909         .set_rx_csum    = tun_set_rx_csum         1445         .set_rx_csum    = tun_set_rx_csum
910 };                                                1446 };
911                                                   1447 
                                                   >> 1448 
912 static int __init tun_init(void)                  1449 static int __init tun_init(void)
913 {                                                 1450 {
914         int ret = 0;                              1451         int ret = 0;
915                                                   1452 
916         printk(KERN_INFO "tun: %s, %s\n", DRV_    1453         printk(KERN_INFO "tun: %s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
917         printk(KERN_INFO "tun: %s\n", DRV_COPY    1454         printk(KERN_INFO "tun: %s\n", DRV_COPYRIGHT);
918                                                   1455 
                                                   >> 1456         ret = rtnl_link_register(&tun_link_ops);
                                                   >> 1457         if (ret) {
                                                   >> 1458                 printk(KERN_ERR "tun: Can't register link_ops\n");
                                                   >> 1459                 goto err_linkops;
                                                   >> 1460         }
                                                   >> 1461 
919         ret = misc_register(&tun_miscdev);        1462         ret = misc_register(&tun_miscdev);
920         if (ret)                               !! 1463         if (ret) {
921                 printk(KERN_ERR "tun: Can't re    1464                 printk(KERN_ERR "tun: Can't register misc device %d\n", TUN_MINOR);
                                                   >> 1465                 goto err_misc;
                                                   >> 1466         }
                                                   >> 1467         return  0;
                                                   >> 1468 err_misc:
                                                   >> 1469         rtnl_link_unregister(&tun_link_ops);
                                                   >> 1470 err_linkops:
922         return ret;                               1471         return ret;
923 }                                                 1472 }
924                                                   1473 
925 static void tun_cleanup(void)                     1474 static void tun_cleanup(void)
926 {                                                 1475 {
927         struct tun_struct *tun, *nxt;          << 
928                                                << 
929         misc_deregister(&tun_miscdev);            1476         misc_deregister(&tun_miscdev);
930                                                !! 1477         rtnl_link_unregister(&tun_link_ops);
931         rtnl_lock();                           << 
932         list_for_each_entry_safe(tun, nxt, &tu << 
933                 DBG(KERN_INFO "%s cleaned up\n << 
934                 unregister_netdevice(tun->dev) << 
935         }                                      << 
936         rtnl_unlock();                         << 
937                                                << 
938 }                                                 1478 }
939                                                   1479 
940 module_init(tun_init);                            1480 module_init(tun_init);
941 module_exit(tun_cleanup);                         1481 module_exit(tun_cleanup);
942 MODULE_DESCRIPTION(DRV_DESCRIPTION);              1482 MODULE_DESCRIPTION(DRV_DESCRIPTION);
943 MODULE_AUTHOR(DRV_COPYRIGHT);                     1483 MODULE_AUTHOR(DRV_COPYRIGHT);
944 MODULE_LICENSE("GPL");                            1484 MODULE_LICENSE("GPL");
945 MODULE_ALIAS_MISCDEV(TUN_MINOR);                  1485 MODULE_ALIAS_MISCDEV(TUN_MINOR);
946                                                   1486 
  This page was automatically generated by the LXR engine.