tun.c (b491f90ddff013e0be058297a8f704c59932c1fd) | tun.c (3b23a32a63219f51a5298bc55a65ecee866e79d0) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * TUN - Universal TUN/TAP device driver. 4 * Copyright (C) 1999-2002 Maxim Krasnyansky <maxk@qualcomm.com> 5 * 6 * $Id: tun.c,v 1.15 2002/03/01 02:44:24 maxk Exp $ 7 */ 8 --- 1585 unchanged lines hidden (view full) --- 1594 1595 local_bh_disable(); 1596 rcu_read_lock(); 1597 xdp_prog = rcu_dereference(tun->xdp_prog); 1598 if (xdp_prog) { 1599 struct xdp_buff xdp; 1600 u32 act; 1601 | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * TUN - Universal TUN/TAP device driver. 4 * Copyright (C) 1999-2002 Maxim Krasnyansky <maxk@qualcomm.com> 5 * 6 * $Id: tun.c,v 1.15 2002/03/01 02:44:24 maxk Exp $ 7 */ 8 --- 1585 unchanged lines hidden (view full) --- 1594 1595 local_bh_disable(); 1596 rcu_read_lock(); 1597 xdp_prog = rcu_dereference(tun->xdp_prog); 1598 if (xdp_prog) { 1599 struct xdp_buff xdp; 1600 u32 act; 1601 |
1602 xdp.data_hard_start = buf; 1603 xdp.data = buf + pad; 1604 xdp_set_data_meta_invalid(&xdp); 1605 xdp.data_end = xdp.data + len; 1606 xdp.rxq = &tfile->xdp_rxq; 1607 xdp.frame_sz = buflen; | 1602 xdp_init_buff(&xdp, buflen, &tfile->xdp_rxq); 1603 xdp_prepare_buff(&xdp, buf, pad, len, false); |
1608 1609 act = bpf_prog_run_xdp(xdp_prog, &xdp); 1610 if (act == XDP_REDIRECT || act == XDP_TX) { 1611 get_page(alloc_frag->page); 1612 alloc_frag->offset += buflen; 1613 } 1614 err = tun_xdp_act(tun, xdp_prog, &xdp, act); 1615 if (err < 0) { --- 193 unchanged lines hidden (view full) --- 1809 goto drop; 1810 } 1811 skb->protocol = eth_type_trans(skb, tun->dev); 1812 break; 1813 } 1814 1815 /* copy skb_ubuf_info for callback when skb has no error */ 1816 if (zerocopy) { | 1604 1605 act = bpf_prog_run_xdp(xdp_prog, &xdp); 1606 if (act == XDP_REDIRECT || act == XDP_TX) { 1607 get_page(alloc_frag->page); 1608 alloc_frag->offset += buflen; 1609 } 1610 err = tun_xdp_act(tun, xdp_prog, &xdp, act); 1611 if (err < 0) { --- 193 unchanged lines hidden (view full) --- 1805 goto drop; 1806 } 1807 skb->protocol = eth_type_trans(skb, tun->dev); 1808 break; 1809 } 1810 1811 /* copy skb_ubuf_info for callback when skb has no error */ 1812 if (zerocopy) { |
1817 skb_shinfo(skb)->destructor_arg = msg_control; 1818 skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY; 1819 skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; | 1813 skb_zcopy_init(skb, msg_control); |
1820 } else if (msg_control) { 1821 struct ubuf_info *uarg = msg_control; | 1814 } else if (msg_control) { 1815 struct ubuf_info *uarg = msg_control; |
1822 uarg->callback(uarg, false); | 1816 uarg->callback(NULL, uarg, false); |
1823 } 1824 1825 skb_reset_network_header(skb); 1826 skb_probe_transport_header(skb); 1827 skb_record_rx_queue(skb, tfile->queue_index); 1828 1829 if (skb_xdp) { 1830 struct bpf_prog *xdp_prog; --- 508 unchanged lines hidden (view full) --- 2339 struct page *page; 2340 2341 xdp_prog = rcu_dereference(tun->xdp_prog); 2342 if (xdp_prog) { 2343 if (gso->gso_type) { 2344 skb_xdp = true; 2345 goto build; 2346 } | 1817 } 1818 1819 skb_reset_network_header(skb); 1820 skb_probe_transport_header(skb); 1821 skb_record_rx_queue(skb, tfile->queue_index); 1822 1823 if (skb_xdp) { 1824 struct bpf_prog *xdp_prog; --- 508 unchanged lines hidden (view full) --- 2333 struct page *page; 2334 2335 xdp_prog = rcu_dereference(tun->xdp_prog); 2336 if (xdp_prog) { 2337 if (gso->gso_type) { 2338 skb_xdp = true; 2339 goto build; 2340 } |
2341 2342 xdp_init_buff(xdp, buflen, &tfile->xdp_rxq); |
|
2347 xdp_set_data_meta_invalid(xdp); | 2343 xdp_set_data_meta_invalid(xdp); |
2348 xdp->rxq = &tfile->xdp_rxq; 2349 xdp->frame_sz = buflen; | |
2350 2351 act = bpf_prog_run_xdp(xdp_prog, xdp); 2352 err = tun_xdp_act(tun, xdp_prog, xdp, act); 2353 if (err < 0) { 2354 put_page(virt_to_head_page(xdp->data)); 2355 return err; 2356 } 2357 --- 378 unchanged lines hidden (view full) --- 2736 err = tun_attach(tun, file, false, ifr->ifr_flags & IFF_NAPI, 2737 ifr->ifr_flags & IFF_NAPI_FRAGS, false); 2738 if (err < 0) 2739 goto err_free_flow; 2740 2741 err = register_netdevice(tun->dev); 2742 if (err < 0) 2743 goto err_detach; | 2344 2345 act = bpf_prog_run_xdp(xdp_prog, xdp); 2346 err = tun_xdp_act(tun, xdp_prog, xdp, act); 2347 if (err < 0) { 2348 put_page(virt_to_head_page(xdp->data)); 2349 return err; 2350 } 2351 --- 378 unchanged lines hidden (view full) --- 2730 err = tun_attach(tun, file, false, ifr->ifr_flags & IFF_NAPI, 2731 ifr->ifr_flags & IFF_NAPI_FRAGS, false); 2732 if (err < 0) 2733 goto err_free_flow; 2734 2735 err = register_netdevice(tun->dev); 2736 if (err < 0) 2737 goto err_detach; |
2744 /* free_netdev() won't check refcnt, to aovid race | 2738 /* free_netdev() won't check refcnt, to avoid race |
2745 * with dev_put() we need publish tun after registration. 2746 */ 2747 rcu_assign_pointer(tfile->tun, tun); 2748 } 2749 2750 netif_carrier_on(tun->dev); 2751 2752 /* Make sure persistent devices do not get stuck in --- 355 unchanged lines hidden (view full) --- 3108 ret = -EINVAL; 3109 if ((tun->flags & TUN_TYPE_MASK) != IFF_TAP) 3110 break; 3111 ret = update_filter(&tun->txflt, (void __user *)arg); 3112 break; 3113 3114 case SIOCGIFHWADDR: 3115 /* Get hw address */ | 2739 * with dev_put() we need publish tun after registration. 2740 */ 2741 rcu_assign_pointer(tfile->tun, tun); 2742 } 2743 2744 netif_carrier_on(tun->dev); 2745 2746 /* Make sure persistent devices do not get stuck in --- 355 unchanged lines hidden (view full) --- 3102 ret = -EINVAL; 3103 if ((tun->flags & TUN_TYPE_MASK) != IFF_TAP) 3104 break; 3105 ret = update_filter(&tun->txflt, (void __user *)arg); 3106 break; 3107 3108 case SIOCGIFHWADDR: 3109 /* Get hw address */ |
3116 memcpy(ifr.ifr_hwaddr.sa_data, tun->dev->dev_addr, ETH_ALEN); 3117 ifr.ifr_hwaddr.sa_family = tun->dev->type; | 3110 dev_get_mac_address(&ifr.ifr_hwaddr, net, tun->dev->name); |
3118 if (copy_to_user(argp, &ifr, ifreq_len)) 3119 ret = -EFAULT; 3120 break; 3121 3122 case SIOCSIFHWADDR: 3123 /* Set hw address */ | 3111 if (copy_to_user(argp, &ifr, ifreq_len)) 3112 ret = -EFAULT; 3113 break; 3114 3115 case SIOCSIFHWADDR: 3116 /* Set hw address */ |
3124 ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr, NULL); | 3117 ret = dev_set_mac_address_user(tun->dev, &ifr.ifr_hwaddr, NULL); |
3125 break; 3126 3127 case TUNGETSNDBUF: 3128 sndbuf = tfile->socket.sk->sk_sndbuf; 3129 if (copy_to_user(argp, &sndbuf, sizeof(sndbuf))) 3130 ret = -EFAULT; 3131 break; 3132 --- 510 unchanged lines hidden --- | 3118 break; 3119 3120 case TUNGETSNDBUF: 3121 sndbuf = tfile->socket.sk->sk_sndbuf; 3122 if (copy_to_user(argp, &sndbuf, sizeof(sndbuf))) 3123 ret = -EFAULT; 3124 break; 3125 --- 510 unchanged lines hidden --- |