Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[pandora-kernel.git] / drivers / net / macvtap.c
1 #include <linux/etherdevice.h>
2 #include <linux/if_macvlan.h>
3 #include <linux/interrupt.h>
4 #include <linux/nsproxy.h>
5 #include <linux/compat.h>
6 #include <linux/if_tun.h>
7 #include <linux/module.h>
8 #include <linux/skbuff.h>
9 #include <linux/cache.h>
10 #include <linux/sched.h>
11 #include <linux/types.h>
12 #include <linux/slab.h>
13 #include <linux/init.h>
14 #include <linux/wait.h>
15 #include <linux/cdev.h>
16 #include <linux/fs.h>
17
18 #include <net/net_namespace.h>
19 #include <net/rtnetlink.h>
20 #include <net/sock.h>
21 #include <linux/virtio_net.h>
22
23 /*
24  * A macvtap queue is the central object of this driver, it connects
25  * an open character device to a macvlan interface. There can be
26  * multiple queues on one interface, which map back to queues
27  * implemented in hardware on the underlying device.
28  *
29  * macvtap_proto is used to allocate queues through the sock allocation
30  * mechanism.
31  *
32  * TODO: multiqueue support is currently not implemented, even though
33  * macvtap is basically prepared for that. We will need to add this
34  * here as well as in virtio-net and qemu to get line rate on 10gbit
35  * adapters from a guest.
36  */
37 struct macvtap_queue {
38         struct sock sk;
39         struct socket sock;
40         struct socket_wq wq;
41         struct macvlan_dev *vlan;
42         struct file *file;
43         unsigned int flags;
44 };
45
46 static struct proto macvtap_proto = {
47         .name = "macvtap",
48         .owner = THIS_MODULE,
49         .obj_size = sizeof (struct macvtap_queue),
50 };
51
52 /*
53  * Minor number matches netdev->ifindex, so need a potentially
54  * large value. This also makes it possible to split the
55  * tap functionality out again in the future by offering it
56  * from other drivers besides macvtap. As long as every device
57  * only has one tap, the interface numbers assure that the
58  * device nodes are unique.
59  */
60 static unsigned int macvtap_major;
61 #define MACVTAP_NUM_DEVS 65536
62 static struct class *macvtap_class;
63 static struct cdev macvtap_cdev;
64
65 static const struct proto_ops macvtap_socket_ops;
66
67 /*
68  * RCU usage:
69  * The macvtap_queue and the macvlan_dev are loosely coupled, the
70  * pointers from one to the other can only be read while rcu_read_lock
71  * or macvtap_lock is held.
72  *
73  * Both the file and the macvlan_dev hold a reference on the macvtap_queue
74  * through sock_hold(&q->sk). When the macvlan_dev goes away first,
75  * q->vlan becomes inaccessible. When the files gets closed,
76  * macvtap_get_queue() fails.
77  *
78  * There may still be references to the struct sock inside of the
79  * queue from outbound SKBs, but these never reference back to the
80  * file or the dev. The data structure is freed through __sk_free
81  * when both our references and any pending SKBs are gone.
82  */
83 static DEFINE_SPINLOCK(macvtap_lock);
84
85 /*
86  * Choose the next free queue, for now there is only one
87  */
88 static int macvtap_set_queue(struct net_device *dev, struct file *file,
89                                 struct macvtap_queue *q)
90 {
91         struct macvlan_dev *vlan = netdev_priv(dev);
92         int err = -EBUSY;
93
94         spin_lock(&macvtap_lock);
95         if (rcu_dereference(vlan->tap))
96                 goto out;
97
98         err = 0;
99         rcu_assign_pointer(q->vlan, vlan);
100         rcu_assign_pointer(vlan->tap, q);
101         sock_hold(&q->sk);
102
103         q->file = file;
104         file->private_data = q;
105
106 out:
107         spin_unlock(&macvtap_lock);
108         return err;
109 }
110
111 /*
112  * The file owning the queue got closed, give up both
113  * the reference that the files holds as well as the
114  * one from the macvlan_dev if that still exists.
115  *
116  * Using the spinlock makes sure that we don't get
117  * to the queue again after destroying it.
118  */
119 static void macvtap_put_queue(struct macvtap_queue *q)
120 {
121         struct macvlan_dev *vlan;
122
123         spin_lock(&macvtap_lock);
124         vlan = rcu_dereference(q->vlan);
125         if (vlan) {
126                 rcu_assign_pointer(vlan->tap, NULL);
127                 rcu_assign_pointer(q->vlan, NULL);
128                 sock_put(&q->sk);
129         }
130
131         spin_unlock(&macvtap_lock);
132
133         synchronize_rcu();
134         sock_put(&q->sk);
135 }
136
137 /*
138  * Since we only support one queue, just dereference the pointer.
139  */
140 static struct macvtap_queue *macvtap_get_queue(struct net_device *dev,
141                                                struct sk_buff *skb)
142 {
143         struct macvlan_dev *vlan = netdev_priv(dev);
144
145         return rcu_dereference(vlan->tap);
146 }
147
148 /*
149  * The net_device is going away, give up the reference
150  * that it holds on the queue (all the queues one day)
151  * and safely set the pointer from the queues to NULL.
152  */
153 static void macvtap_del_queues(struct net_device *dev)
154 {
155         struct macvlan_dev *vlan = netdev_priv(dev);
156         struct macvtap_queue *q;
157
158         spin_lock(&macvtap_lock);
159         q = rcu_dereference(vlan->tap);
160         if (!q) {
161                 spin_unlock(&macvtap_lock);
162                 return;
163         }
164
165         rcu_assign_pointer(vlan->tap, NULL);
166         rcu_assign_pointer(q->vlan, NULL);
167         spin_unlock(&macvtap_lock);
168
169         synchronize_rcu();
170         sock_put(&q->sk);
171 }
172
173 /*
174  * Forward happens for data that gets sent from one macvlan
175  * endpoint to another one in bridge mode. We just take
176  * the skb and put it into the receive queue.
177  */
178 static int macvtap_forward(struct net_device *dev, struct sk_buff *skb)
179 {
180         struct macvtap_queue *q = macvtap_get_queue(dev, skb);
181         if (!q)
182                 return -ENOLINK;
183
184         skb_queue_tail(&q->sk.sk_receive_queue, skb);
185         wake_up_interruptible_poll(sk_sleep(&q->sk), POLLIN | POLLRDNORM | POLLRDBAND);
186         return 0;
187 }
188
189 /*
190  * Receive is for data from the external interface (lowerdev),
191  * in case of macvtap, we can treat that the same way as
192  * forward, which macvlan cannot.
193  */
194 static int macvtap_receive(struct sk_buff *skb)
195 {
196         skb_push(skb, ETH_HLEN);
197         return macvtap_forward(skb->dev, skb);
198 }
199
200 static int macvtap_newlink(struct net *src_net,
201                            struct net_device *dev,
202                            struct nlattr *tb[],
203                            struct nlattr *data[])
204 {
205         struct device *classdev;
206         dev_t devt;
207         int err;
208
209         err = macvlan_common_newlink(src_net, dev, tb, data,
210                                      macvtap_receive, macvtap_forward);
211         if (err)
212                 goto out;
213
214         devt = MKDEV(MAJOR(macvtap_major), dev->ifindex);
215
216         classdev = device_create(macvtap_class, &dev->dev, devt,
217                                  dev, "tap%d", dev->ifindex);
218         if (IS_ERR(classdev)) {
219                 err = PTR_ERR(classdev);
220                 macvtap_del_queues(dev);
221         }
222
223 out:
224         return err;
225 }
226
227 static void macvtap_dellink(struct net_device *dev,
228                             struct list_head *head)
229 {
230         device_destroy(macvtap_class,
231                        MKDEV(MAJOR(macvtap_major), dev->ifindex));
232
233         macvtap_del_queues(dev);
234         macvlan_dellink(dev, head);
235 }
236
237 static struct rtnl_link_ops macvtap_link_ops __read_mostly = {
238         .kind           = "macvtap",
239         .newlink        = macvtap_newlink,
240         .dellink        = macvtap_dellink,
241 };
242
243
244 static void macvtap_sock_write_space(struct sock *sk)
245 {
246         wait_queue_head_t *wqueue;
247
248         if (!sock_writeable(sk) ||
249             !test_and_clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags))
250                 return;
251
252         wqueue = sk_sleep(sk);
253         if (wqueue && waitqueue_active(wqueue))
254                 wake_up_interruptible_poll(wqueue, POLLOUT | POLLWRNORM | POLLWRBAND);
255 }
256
257 static int macvtap_open(struct inode *inode, struct file *file)
258 {
259         struct net *net = current->nsproxy->net_ns;
260         struct net_device *dev = dev_get_by_index(net, iminor(inode));
261         struct macvtap_queue *q;
262         int err;
263
264         err = -ENODEV;
265         if (!dev)
266                 goto out;
267
268         /* check if this is a macvtap device */
269         err = -EINVAL;
270         if (dev->rtnl_link_ops != &macvtap_link_ops)
271                 goto out;
272
273         err = -ENOMEM;
274         q = (struct macvtap_queue *)sk_alloc(net, AF_UNSPEC, GFP_KERNEL,
275                                              &macvtap_proto);
276         if (!q)
277                 goto out;
278
279         q->sock.wq = &q->wq;
280         init_waitqueue_head(&q->wq.wait);
281         q->sock.type = SOCK_RAW;
282         q->sock.state = SS_CONNECTED;
283         q->sock.file = file;
284         q->sock.ops = &macvtap_socket_ops;
285         sock_init_data(&q->sock, &q->sk);
286         q->sk.sk_write_space = macvtap_sock_write_space;
287         q->flags = IFF_VNET_HDR | IFF_NO_PI | IFF_TAP;
288
289         err = macvtap_set_queue(dev, file, q);
290         if (err)
291                 sock_put(&q->sk);
292
293 out:
294         if (dev)
295                 dev_put(dev);
296
297         return err;
298 }
299
300 static int macvtap_release(struct inode *inode, struct file *file)
301 {
302         struct macvtap_queue *q = file->private_data;
303         macvtap_put_queue(q);
304         return 0;
305 }
306
307 static unsigned int macvtap_poll(struct file *file, poll_table * wait)
308 {
309         struct macvtap_queue *q = file->private_data;
310         unsigned int mask = POLLERR;
311
312         if (!q)
313                 goto out;
314
315         mask = 0;
316         poll_wait(file, &q->wq.wait, wait);
317
318         if (!skb_queue_empty(&q->sk.sk_receive_queue))
319                 mask |= POLLIN | POLLRDNORM;
320
321         if (sock_writeable(&q->sk) ||
322             (!test_and_set_bit(SOCK_ASYNC_NOSPACE, &q->sock.flags) &&
323              sock_writeable(&q->sk)))
324                 mask |= POLLOUT | POLLWRNORM;
325
326 out:
327         return mask;
328 }
329
330 static inline struct sk_buff *macvtap_alloc_skb(struct sock *sk, size_t prepad,
331                                                 size_t len, size_t linear,
332                                                 int noblock, int *err)
333 {
334         struct sk_buff *skb;
335
336         /* Under a page?  Don't bother with paged skb. */
337         if (prepad + len < PAGE_SIZE || !linear)
338                 linear = len;
339
340         skb = sock_alloc_send_pskb(sk, prepad + linear, len - linear, noblock,
341                                    err);
342         if (!skb)
343                 return NULL;
344
345         skb_reserve(skb, prepad);
346         skb_put(skb, linear);
347         skb->data_len = len - linear;
348         skb->len += len - linear;
349
350         return skb;
351 }
352
353 /*
354  * macvtap_skb_from_vnet_hdr and macvtap_skb_to_vnet_hdr should
355  * be shared with the tun/tap driver.
356  */
357 static int macvtap_skb_from_vnet_hdr(struct sk_buff *skb,
358                                      struct virtio_net_hdr *vnet_hdr)
359 {
360         unsigned short gso_type = 0;
361         if (vnet_hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) {
362                 switch (vnet_hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) {
363                 case VIRTIO_NET_HDR_GSO_TCPV4:
364                         gso_type = SKB_GSO_TCPV4;
365                         break;
366                 case VIRTIO_NET_HDR_GSO_TCPV6:
367                         gso_type = SKB_GSO_TCPV6;
368                         break;
369                 case VIRTIO_NET_HDR_GSO_UDP:
370                         gso_type = SKB_GSO_UDP;
371                         break;
372                 default:
373                         return -EINVAL;
374                 }
375
376                 if (vnet_hdr->gso_type & VIRTIO_NET_HDR_GSO_ECN)
377                         gso_type |= SKB_GSO_TCP_ECN;
378
379                 if (vnet_hdr->gso_size == 0)
380                         return -EINVAL;
381         }
382
383         if (vnet_hdr->flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) {
384                 if (!skb_partial_csum_set(skb, vnet_hdr->csum_start,
385                                           vnet_hdr->csum_offset))
386                         return -EINVAL;
387         }
388
389         if (vnet_hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) {
390                 skb_shinfo(skb)->gso_size = vnet_hdr->gso_size;
391                 skb_shinfo(skb)->gso_type = gso_type;
392
393                 /* Header must be checked, and gso_segs computed. */
394                 skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY;
395                 skb_shinfo(skb)->gso_segs = 0;
396         }
397         return 0;
398 }
399
400 static int macvtap_skb_to_vnet_hdr(const struct sk_buff *skb,
401                                    struct virtio_net_hdr *vnet_hdr)
402 {
403         memset(vnet_hdr, 0, sizeof(*vnet_hdr));
404
405         if (skb_is_gso(skb)) {
406                 struct skb_shared_info *sinfo = skb_shinfo(skb);
407
408                 /* This is a hint as to how much should be linear. */
409                 vnet_hdr->hdr_len = skb_headlen(skb);
410                 vnet_hdr->gso_size = sinfo->gso_size;
411                 if (sinfo->gso_type & SKB_GSO_TCPV4)
412                         vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV4;
413                 else if (sinfo->gso_type & SKB_GSO_TCPV6)
414                         vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_TCPV6;
415                 else if (sinfo->gso_type & SKB_GSO_UDP)
416                         vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_UDP;
417                 else
418                         BUG();
419                 if (sinfo->gso_type & SKB_GSO_TCP_ECN)
420                         vnet_hdr->gso_type |= VIRTIO_NET_HDR_GSO_ECN;
421         } else
422                 vnet_hdr->gso_type = VIRTIO_NET_HDR_GSO_NONE;
423
424         if (skb->ip_summed == CHECKSUM_PARTIAL) {
425                 vnet_hdr->flags = VIRTIO_NET_HDR_F_NEEDS_CSUM;
426                 vnet_hdr->csum_start = skb->csum_start -
427                                         skb_headroom(skb);
428                 vnet_hdr->csum_offset = skb->csum_offset;
429         } /* else everything is zero */
430
431         return 0;
432 }
433
434
435 /* Get packet from user space buffer */
436 static ssize_t macvtap_get_user(struct macvtap_queue *q,
437                                 const struct iovec *iv, size_t count,
438                                 int noblock)
439 {
440         struct sk_buff *skb;
441         struct macvlan_dev *vlan;
442         size_t len = count;
443         int err;
444         struct virtio_net_hdr vnet_hdr = { 0 };
445         int vnet_hdr_len = 0;
446
447         if (q->flags & IFF_VNET_HDR) {
448                 vnet_hdr_len = sizeof(vnet_hdr);
449
450                 err = -EINVAL;
451                 if ((len -= vnet_hdr_len) < 0)
452                         goto err;
453
454                 err = memcpy_fromiovecend((void *)&vnet_hdr, iv, 0,
455                                            vnet_hdr_len);
456                 if (err < 0)
457                         goto err;
458                 if ((vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) &&
459                      vnet_hdr.csum_start + vnet_hdr.csum_offset + 2 >
460                                                         vnet_hdr.hdr_len)
461                         vnet_hdr.hdr_len = vnet_hdr.csum_start +
462                                                 vnet_hdr.csum_offset + 2;
463                 err = -EINVAL;
464                 if (vnet_hdr.hdr_len > len)
465                         goto err;
466         }
467
468         err = -EINVAL;
469         if (unlikely(len < ETH_HLEN))
470                 goto err;
471
472         skb = macvtap_alloc_skb(&q->sk, NET_IP_ALIGN, len, vnet_hdr.hdr_len,
473                                 noblock, &err);
474         if (!skb)
475                 goto err;
476
477         err = skb_copy_datagram_from_iovec(skb, 0, iv, vnet_hdr_len, len);
478         if (err)
479                 goto err_kfree;
480
481         skb_set_network_header(skb, ETH_HLEN);
482         skb_reset_mac_header(skb);
483         skb->protocol = eth_hdr(skb)->h_proto;
484
485         if (vnet_hdr_len) {
486                 err = macvtap_skb_from_vnet_hdr(skb, &vnet_hdr);
487                 if (err)
488                         goto err_kfree;
489         }
490
491         rcu_read_lock_bh();
492         vlan = rcu_dereference(q->vlan);
493         if (vlan)
494                 macvlan_start_xmit(skb, vlan->dev);
495         else
496                 kfree_skb(skb);
497         rcu_read_unlock_bh();
498
499         return count;
500
501 err_kfree:
502         kfree_skb(skb);
503
504 err:
505         rcu_read_lock_bh();
506         vlan = rcu_dereference(q->vlan);
507         if (vlan)
508                 netdev_get_tx_queue(vlan->dev, 0)->tx_dropped++;
509         rcu_read_unlock_bh();
510
511         return err;
512 }
513
514 static ssize_t macvtap_aio_write(struct kiocb *iocb, const struct iovec *iv,
515                                  unsigned long count, loff_t pos)
516 {
517         struct file *file = iocb->ki_filp;
518         ssize_t result = -ENOLINK;
519         struct macvtap_queue *q = file->private_data;
520
521         result = macvtap_get_user(q, iv, iov_length(iv, count),
522                               file->f_flags & O_NONBLOCK);
523         return result;
524 }
525
526 /* Put packet to the user space buffer */
527 static ssize_t macvtap_put_user(struct macvtap_queue *q,
528                                 const struct sk_buff *skb,
529                                 const struct iovec *iv, int len)
530 {
531         struct macvlan_dev *vlan;
532         int ret;
533         int vnet_hdr_len = 0;
534
535         if (q->flags & IFF_VNET_HDR) {
536                 struct virtio_net_hdr vnet_hdr;
537                 vnet_hdr_len = sizeof (vnet_hdr);
538                 if ((len -= vnet_hdr_len) < 0)
539                         return -EINVAL;
540
541                 ret = macvtap_skb_to_vnet_hdr(skb, &vnet_hdr);
542                 if (ret)
543                         return ret;
544
545                 if (memcpy_toiovecend(iv, (void *)&vnet_hdr, 0, vnet_hdr_len))
546                         return -EFAULT;
547         }
548
549         len = min_t(int, skb->len, len);
550
551         ret = skb_copy_datagram_const_iovec(skb, 0, iv, vnet_hdr_len, len);
552
553         rcu_read_lock_bh();
554         vlan = rcu_dereference(q->vlan);
555         if (vlan)
556                 macvlan_count_rx(vlan, len, ret == 0, 0);
557         rcu_read_unlock_bh();
558
559         return ret ? ret : (len + vnet_hdr_len);
560 }
561
562 static ssize_t macvtap_do_read(struct macvtap_queue *q, struct kiocb *iocb,
563                                const struct iovec *iv, unsigned long len,
564                                int noblock)
565 {
566         DECLARE_WAITQUEUE(wait, current);
567         struct sk_buff *skb;
568         ssize_t ret = 0;
569
570         add_wait_queue(sk_sleep(&q->sk), &wait);
571         while (len) {
572                 current->state = TASK_INTERRUPTIBLE;
573
574                 /* Read frames from the queue */
575                 skb = skb_dequeue(&q->sk.sk_receive_queue);
576                 if (!skb) {
577                         if (noblock) {
578                                 ret = -EAGAIN;
579                                 break;
580                         }
581                         if (signal_pending(current)) {
582                                 ret = -ERESTARTSYS;
583                                 break;
584                         }
585                         /* Nothing to read, let's sleep */
586                         schedule();
587                         continue;
588                 }
589                 ret = macvtap_put_user(q, skb, iv, len);
590                 kfree_skb(skb);
591                 break;
592         }
593
594         current->state = TASK_RUNNING;
595         remove_wait_queue(sk_sleep(&q->sk), &wait);
596         return ret;
597 }
598
599 static ssize_t macvtap_aio_read(struct kiocb *iocb, const struct iovec *iv,
600                                 unsigned long count, loff_t pos)
601 {
602         struct file *file = iocb->ki_filp;
603         struct macvtap_queue *q = file->private_data;
604         ssize_t len, ret = 0;
605
606         len = iov_length(iv, count);
607         if (len < 0) {
608                 ret = -EINVAL;
609                 goto out;
610         }
611
612         ret = macvtap_do_read(q, iocb, iv, len, file->f_flags & O_NONBLOCK);
613         ret = min_t(ssize_t, ret, len); /* XXX copied from tun.c. Why? */
614 out:
615         return ret;
616 }
617
618 /*
619  * provide compatibility with generic tun/tap interface
620  */
621 static long macvtap_ioctl(struct file *file, unsigned int cmd,
622                           unsigned long arg)
623 {
624         struct macvtap_queue *q = file->private_data;
625         struct macvlan_dev *vlan;
626         void __user *argp = (void __user *)arg;
627         struct ifreq __user *ifr = argp;
628         unsigned int __user *up = argp;
629         unsigned int u;
630         int ret;
631
632         switch (cmd) {
633         case TUNSETIFF:
634                 /* ignore the name, just look at flags */
635                 if (get_user(u, &ifr->ifr_flags))
636                         return -EFAULT;
637
638                 ret = 0;
639                 if ((u & ~IFF_VNET_HDR) != (IFF_NO_PI | IFF_TAP))
640                         ret = -EINVAL;
641                 else
642                         q->flags = u;
643
644                 return ret;
645
646         case TUNGETIFF:
647                 rcu_read_lock_bh();
648                 vlan = rcu_dereference(q->vlan);
649                 if (vlan)
650                         dev_hold(vlan->dev);
651                 rcu_read_unlock_bh();
652
653                 if (!vlan)
654                         return -ENOLINK;
655
656                 ret = 0;
657                 if (copy_to_user(&ifr->ifr_name, q->vlan->dev->name, IFNAMSIZ) ||
658                     put_user(q->flags, &ifr->ifr_flags))
659                         ret = -EFAULT;
660                 dev_put(vlan->dev);
661                 return ret;
662
663         case TUNGETFEATURES:
664                 if (put_user(IFF_TAP | IFF_NO_PI | IFF_VNET_HDR, up))
665                         return -EFAULT;
666                 return 0;
667
668         case TUNSETSNDBUF:
669                 if (get_user(u, up))
670                         return -EFAULT;
671
672                 q->sk.sk_sndbuf = u;
673                 return 0;
674
675         case TUNSETOFFLOAD:
676                 /* let the user check for future flags */
677                 if (arg & ~(TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 |
678                             TUN_F_TSO_ECN | TUN_F_UFO))
679                         return -EINVAL;
680
681                 /* TODO: only accept frames with the features that
682                          got enabled for forwarded frames */
683                 if (!(q->flags & IFF_VNET_HDR))
684                         return  -EINVAL;
685                 return 0;
686
687         default:
688                 return -EINVAL;
689         }
690 }
691
692 #ifdef CONFIG_COMPAT
693 static long macvtap_compat_ioctl(struct file *file, unsigned int cmd,
694                                  unsigned long arg)
695 {
696         return macvtap_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
697 }
698 #endif
699
700 static const struct file_operations macvtap_fops = {
701         .owner          = THIS_MODULE,
702         .open           = macvtap_open,
703         .release        = macvtap_release,
704         .aio_read       = macvtap_aio_read,
705         .aio_write      = macvtap_aio_write,
706         .poll           = macvtap_poll,
707         .llseek         = no_llseek,
708         .unlocked_ioctl = macvtap_ioctl,
709 #ifdef CONFIG_COMPAT
710         .compat_ioctl   = macvtap_compat_ioctl,
711 #endif
712 };
713
714 static int macvtap_sendmsg(struct kiocb *iocb, struct socket *sock,
715                            struct msghdr *m, size_t total_len)
716 {
717         struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock);
718         return macvtap_get_user(q, m->msg_iov, total_len,
719                             m->msg_flags & MSG_DONTWAIT);
720 }
721
722 static int macvtap_recvmsg(struct kiocb *iocb, struct socket *sock,
723                            struct msghdr *m, size_t total_len,
724                            int flags)
725 {
726         struct macvtap_queue *q = container_of(sock, struct macvtap_queue, sock);
727         int ret;
728         if (flags & ~(MSG_DONTWAIT|MSG_TRUNC))
729                 return -EINVAL;
730         ret = macvtap_do_read(q, iocb, m->msg_iov, total_len,
731                           flags & MSG_DONTWAIT);
732         if (ret > total_len) {
733                 m->msg_flags |= MSG_TRUNC;
734                 ret = flags & MSG_TRUNC ? ret : total_len;
735         }
736         return ret;
737 }
738
739 /* Ops structure to mimic raw sockets with tun */
740 static const struct proto_ops macvtap_socket_ops = {
741         .sendmsg = macvtap_sendmsg,
742         .recvmsg = macvtap_recvmsg,
743 };
744
745 /* Get an underlying socket object from tun file.  Returns error unless file is
746  * attached to a device.  The returned object works like a packet socket, it
747  * can be used for sock_sendmsg/sock_recvmsg.  The caller is responsible for
748  * holding a reference to the file for as long as the socket is in use. */
749 struct socket *macvtap_get_socket(struct file *file)
750 {
751         struct macvtap_queue *q;
752         if (file->f_op != &macvtap_fops)
753                 return ERR_PTR(-EINVAL);
754         q = file->private_data;
755         if (!q)
756                 return ERR_PTR(-EBADFD);
757         return &q->sock;
758 }
759 EXPORT_SYMBOL_GPL(macvtap_get_socket);
760
761 static int macvtap_init(void)
762 {
763         int err;
764
765         err = alloc_chrdev_region(&macvtap_major, 0,
766                                 MACVTAP_NUM_DEVS, "macvtap");
767         if (err)
768                 goto out1;
769
770         cdev_init(&macvtap_cdev, &macvtap_fops);
771         err = cdev_add(&macvtap_cdev, macvtap_major, MACVTAP_NUM_DEVS);
772         if (err)
773                 goto out2;
774
775         macvtap_class = class_create(THIS_MODULE, "macvtap");
776         if (IS_ERR(macvtap_class)) {
777                 err = PTR_ERR(macvtap_class);
778                 goto out3;
779         }
780
781         err = macvlan_link_register(&macvtap_link_ops);
782         if (err)
783                 goto out4;
784
785         return 0;
786
787 out4:
788         class_unregister(macvtap_class);
789 out3:
790         cdev_del(&macvtap_cdev);
791 out2:
792         unregister_chrdev_region(macvtap_major, MACVTAP_NUM_DEVS);
793 out1:
794         return err;
795 }
796 module_init(macvtap_init);
797
798 static void macvtap_exit(void)
799 {
800         rtnl_link_unregister(&macvtap_link_ops);
801         class_unregister(macvtap_class);
802         cdev_del(&macvtap_cdev);
803         unregister_chrdev_region(macvtap_major, MACVTAP_NUM_DEVS);
804 }
805 module_exit(macvtap_exit);
806
807 MODULE_ALIAS_RTNL_LINK("macvtap");
808 MODULE_AUTHOR("Arnd Bergmann <arnd@arndb.de>");
809 MODULE_LICENSE("GPL");