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