macvtap.c (93cd6fa6806cb3455e8231578840afb031606352) macvtap.c (cbbd26b8b1a6af9c02e2b6523e12bd50cc765059)
1#include <linux/etherdevice.h>
2#include <linux/if_macvlan.h>
3#include <linux/if_vlan.h>
4#include <linux/interrupt.h>
5#include <linux/nsproxy.h>
6#include <linux/compat.h>
7#include <linux/if_tun.h>
8#include <linux/module.h>

--- 477 unchanged lines hidden (view full) ---

486
487 err = netdev_rx_handler_register(dev, macvtap_handle_frame, vlan);
488 if (err)
489 return err;
490
491 /* Don't put anything that may fail after macvlan_common_newlink
492 * because we can't undo what it does.
493 */
1#include <linux/etherdevice.h>
2#include <linux/if_macvlan.h>
3#include <linux/if_vlan.h>
4#include <linux/interrupt.h>
5#include <linux/nsproxy.h>
6#include <linux/compat.h>
7#include <linux/if_tun.h>
8#include <linux/module.h>

--- 477 unchanged lines hidden (view full) ---

486
487 err = netdev_rx_handler_register(dev, macvtap_handle_frame, vlan);
488 if (err)
489 return err;
490
491 /* Don't put anything that may fail after macvlan_common_newlink
492 * because we can't undo what it does.
493 */
494 err = macvlan_common_newlink(src_net, dev, tb, data);
495 if (err) {
496 netdev_rx_handler_unregister(dev);
497 return err;
498 }
499
500 return 0;
494 return macvlan_common_newlink(src_net, dev, tb, data);
501}
502
503static void macvtap_dellink(struct net_device *dev,
504 struct list_head *head)
505{
506 netdev_rx_handler_unregister(dev);
507 macvtap_del_queues(dev);
508 macvlan_dellink(dev, head);

--- 165 unchanged lines hidden (view full) ---

674 unsigned long len = total_len;
675 int err;
676 struct virtio_net_hdr vnet_hdr = { 0 };
677 int vnet_hdr_len = 0;
678 int copylen = 0;
679 int depth;
680 bool zerocopy = false;
681 size_t linear;
495}
496
497static void macvtap_dellink(struct net_device *dev,
498 struct list_head *head)
499{
500 netdev_rx_handler_unregister(dev);
501 macvtap_del_queues(dev);
502 macvlan_dellink(dev, head);

--- 165 unchanged lines hidden (view full) ---

668 unsigned long len = total_len;
669 int err;
670 struct virtio_net_hdr vnet_hdr = { 0 };
671 int vnet_hdr_len = 0;
672 int copylen = 0;
673 int depth;
674 bool zerocopy = false;
675 size_t linear;
682 ssize_t n;
683
684 if (q->flags & IFF_VNET_HDR) {
685 vnet_hdr_len = q->vnet_hdr_sz;
686
687 err = -EINVAL;
688 if (len < vnet_hdr_len)
689 goto err;
690 len -= vnet_hdr_len;
691
692 err = -EFAULT;
676
677 if (q->flags & IFF_VNET_HDR) {
678 vnet_hdr_len = q->vnet_hdr_sz;
679
680 err = -EINVAL;
681 if (len < vnet_hdr_len)
682 goto err;
683 len -= vnet_hdr_len;
684
685 err = -EFAULT;
693 n = copy_from_iter(&vnet_hdr, sizeof(vnet_hdr), from);
694 if (n != sizeof(vnet_hdr))
686 if (!copy_from_iter_full(&vnet_hdr, sizeof(vnet_hdr), from))
695 goto err;
696 iov_iter_advance(from, vnet_hdr_len - sizeof(vnet_hdr));
697 if ((vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) &&
698 macvtap16_to_cpu(q, vnet_hdr.csum_start) +
699 macvtap16_to_cpu(q, vnet_hdr.csum_offset) + 2 >
700 macvtap16_to_cpu(q, vnet_hdr.hdr_len))
701 vnet_hdr.hdr_len = cpu_to_macvtap16(q,
702 macvtap16_to_cpu(q, vnet_hdr.csum_start) +

--- 34 unchanged lines hidden (view full) ---

737
738 skb = macvtap_alloc_skb(&q->sk, MACVTAP_RESERVE, copylen,
739 linear, noblock, &err);
740 if (!skb)
741 goto err;
742
743 if (zerocopy)
744 err = zerocopy_sg_from_iter(skb, from);
687 goto err;
688 iov_iter_advance(from, vnet_hdr_len - sizeof(vnet_hdr));
689 if ((vnet_hdr.flags & VIRTIO_NET_HDR_F_NEEDS_CSUM) &&
690 macvtap16_to_cpu(q, vnet_hdr.csum_start) +
691 macvtap16_to_cpu(q, vnet_hdr.csum_offset) + 2 >
692 macvtap16_to_cpu(q, vnet_hdr.hdr_len))
693 vnet_hdr.hdr_len = cpu_to_macvtap16(q,
694 macvtap16_to_cpu(q, vnet_hdr.csum_start) +

--- 34 unchanged lines hidden (view full) ---

729
730 skb = macvtap_alloc_skb(&q->sk, MACVTAP_RESERVE, copylen,
731 linear, noblock, &err);
732 if (!skb)
733 goto err;
734
735 if (zerocopy)
736 err = zerocopy_sg_from_iter(skb, from);
745 else
737 else {
746 err = skb_copy_datagram_from_iter(skb, 0, from, len);
738 err = skb_copy_datagram_from_iter(skb, 0, from, len);
739 if (!err && m && m->msg_control) {
740 struct ubuf_info *uarg = m->msg_control;
741 uarg->callback(uarg, false);
742 }
743 }
747
748 if (err)
749 goto err_kfree;
750
751 skb_set_network_header(skb, ETH_HLEN);
752 skb_reset_mac_header(skb);
753 skb->protocol = eth_hdr(skb)->h_proto;
754

--- 14 unchanged lines hidden (view full) ---

769
770 rcu_read_lock();
771 vlan = rcu_dereference(q->vlan);
772 /* copy skb_ubuf_info for callback when skb has no error */
773 if (zerocopy) {
774 skb_shinfo(skb)->destructor_arg = m->msg_control;
775 skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
776 skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
744
745 if (err)
746 goto err_kfree;
747
748 skb_set_network_header(skb, ETH_HLEN);
749 skb_reset_mac_header(skb);
750 skb->protocol = eth_hdr(skb)->h_proto;
751

--- 14 unchanged lines hidden (view full) ---

766
767 rcu_read_lock();
768 vlan = rcu_dereference(q->vlan);
769 /* copy skb_ubuf_info for callback when skb has no error */
770 if (zerocopy) {
771 skb_shinfo(skb)->destructor_arg = m->msg_control;
772 skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
773 skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
777 } else if (m && m->msg_control) {
778 struct ubuf_info *uarg = m->msg_control;
779 uarg->callback(uarg, false);
780 }
774 }
781
782 if (vlan) {
783 skb->dev = vlan->dev;
784 dev_queue_xmit(skb);
785 } else {
786 kfree_skb(skb);
787 }
788 rcu_read_unlock();
789

--- 588 unchanged lines hidden ---
775 if (vlan) {
776 skb->dev = vlan->dev;
777 dev_queue_xmit(skb);
778 } else {
779 kfree_skb(skb);
780 }
781 rcu_read_unlock();
782

--- 588 unchanged lines hidden ---