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