tun.c (c3bdd5e65185f46150b3bac103b3854040487857) | tun.c (c43f1255b866b423d2381f77eaa2cbc64a9c49aa) |
---|---|
1/* 2 * TUN - Universal TUN/TAP device driver. 3 * Copyright (C) 1999-2002 Maxim Krasnyansky <maxk@qualcomm.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. --- 592 unchanged lines hidden (view full) --- 601 prog = rcu_dereference(tun->steering_prog); 602 if (prog) 603 ret = bpf_prog_run_clear_cb(prog->prog, skb); 604 605 return ret % tun->numqueues; 606} 607 608static u16 tun_select_queue(struct net_device *dev, struct sk_buff *skb, | 1/* 2 * TUN - Universal TUN/TAP device driver. 3 * Copyright (C) 1999-2002 Maxim Krasnyansky <maxk@qualcomm.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. --- 592 unchanged lines hidden (view full) --- 601 prog = rcu_dereference(tun->steering_prog); 602 if (prog) 603 ret = bpf_prog_run_clear_cb(prog->prog, skb); 604 605 return ret % tun->numqueues; 606} 607 608static u16 tun_select_queue(struct net_device *dev, struct sk_buff *skb, |
609 struct net_device *sb_dev, 610 select_queue_fallback_t fallback) | 609 struct net_device *sb_dev) |
611{ 612 struct tun_struct *tun = netdev_priv(dev); 613 u16 ret; 614 615 rcu_read_lock(); 616 if (rcu_dereference(tun->steering_prog)) 617 ret = tun_ebpf_select_queue(tun, skb); 618 else --- 419 unchanged lines hidden (view full) --- 1038 netif_tx_stop_all_queues(dev); 1039 return 0; 1040} 1041 1042/* Net device start xmit */ 1043static void tun_automq_xmit(struct tun_struct *tun, struct sk_buff *skb) 1044{ 1045#ifdef CONFIG_RPS | 610{ 611 struct tun_struct *tun = netdev_priv(dev); 612 u16 ret; 613 614 rcu_read_lock(); 615 if (rcu_dereference(tun->steering_prog)) 616 ret = tun_ebpf_select_queue(tun, skb); 617 else --- 419 unchanged lines hidden (view full) --- 1037 netif_tx_stop_all_queues(dev); 1038 return 0; 1039} 1040 1041/* Net device start xmit */ 1042static void tun_automq_xmit(struct tun_struct *tun, struct sk_buff *skb) 1043{ 1044#ifdef CONFIG_RPS |
1046 if (tun->numqueues == 1 && static_key_false(&rps_needed)) { | 1045 if (tun->numqueues == 1 && static_branch_unlikely(&rps_needed)) { |
1047 /* Select queue was not called for the skbuff, so we extract the 1048 * RPS hash and save it into the flow_table here. 1049 */ 1050 struct tun_flow_entry *e; 1051 __u32 rxhash; 1052 1053 rxhash = __skb_get_hash_symmetric(skb); 1054 e = tun_flow_find(&tun->flows[tun_hashfn(rxhash)], rxhash); --- 703 unchanged lines hidden (view full) --- 1758 int good_linear; 1759 int copylen; 1760 bool zerocopy = false; 1761 int err; 1762 u32 rxhash = 0; 1763 int skb_xdp = 1; 1764 bool frags = tun_napi_frags_enabled(tfile); 1765 | 1046 /* Select queue was not called for the skbuff, so we extract the 1047 * RPS hash and save it into the flow_table here. 1048 */ 1049 struct tun_flow_entry *e; 1050 __u32 rxhash; 1051 1052 rxhash = __skb_get_hash_symmetric(skb); 1053 e = tun_flow_find(&tun->flows[tun_hashfn(rxhash)], rxhash); --- 703 unchanged lines hidden (view full) --- 1757 int good_linear; 1758 int copylen; 1759 bool zerocopy = false; 1760 int err; 1761 u32 rxhash = 0; 1762 int skb_xdp = 1; 1763 bool frags = tun_napi_frags_enabled(tfile); 1764 |
1766 if (!(tun->dev->flags & IFF_UP)) 1767 return -EIO; 1768 | |
1769 if (!(tun->flags & IFF_NO_PI)) { 1770 if (len < sizeof(pi)) 1771 return -EINVAL; 1772 len -= sizeof(pi); 1773 1774 if (!copy_from_iter_full(&pi, sizeof(pi), from)) 1775 return -EFAULT; 1776 } --- 85 unchanged lines hidden (view full) --- 1862 } 1863 1864 if (zerocopy) 1865 err = zerocopy_sg_from_iter(skb, from); 1866 else 1867 err = skb_copy_datagram_from_iter(skb, 0, from, len); 1868 1869 if (err) { | 1765 if (!(tun->flags & IFF_NO_PI)) { 1766 if (len < sizeof(pi)) 1767 return -EINVAL; 1768 len -= sizeof(pi); 1769 1770 if (!copy_from_iter_full(&pi, sizeof(pi), from)) 1771 return -EFAULT; 1772 } --- 85 unchanged lines hidden (view full) --- 1858 } 1859 1860 if (zerocopy) 1861 err = zerocopy_sg_from_iter(skb, from); 1862 else 1863 err = skb_copy_datagram_from_iter(skb, 0, from, len); 1864 1865 if (err) { |
1866 err = -EFAULT; 1867drop: |
|
1870 this_cpu_inc(tun->pcpu_stats->rx_dropped); 1871 kfree_skb(skb); 1872 if (frags) { 1873 tfile->napi.skb = NULL; 1874 mutex_unlock(&tfile->napi_mutex); 1875 } 1876 | 1868 this_cpu_inc(tun->pcpu_stats->rx_dropped); 1869 kfree_skb(skb); 1870 if (frags) { 1871 tfile->napi.skb = NULL; 1872 mutex_unlock(&tfile->napi_mutex); 1873 } 1874 |
1877 return -EFAULT; | 1875 return err; |
1878 } 1879 } 1880 1881 if (virtio_net_hdr_to_skb(skb, &gso, tun_is_little_endian(tun))) { 1882 this_cpu_inc(tun->pcpu_stats->rx_frame_errors); 1883 kfree_skb(skb); 1884 if (frags) { 1885 tfile->napi.skb = NULL; --- 67 unchanged lines hidden (view full) --- 1953 /* Compute the costly rx hash only if needed for flow updates. 1954 * We may get a very small possibility of OOO during switching, not 1955 * worth to optimize. 1956 */ 1957 if (!rcu_access_pointer(tun->steering_prog) && tun->numqueues > 1 && 1958 !tfile->detached) 1959 rxhash = __skb_get_hash_symmetric(skb); 1960 | 1876 } 1877 } 1878 1879 if (virtio_net_hdr_to_skb(skb, &gso, tun_is_little_endian(tun))) { 1880 this_cpu_inc(tun->pcpu_stats->rx_frame_errors); 1881 kfree_skb(skb); 1882 if (frags) { 1883 tfile->napi.skb = NULL; --- 67 unchanged lines hidden (view full) --- 1951 /* Compute the costly rx hash only if needed for flow updates. 1952 * We may get a very small possibility of OOO during switching, not 1953 * worth to optimize. 1954 */ 1955 if (!rcu_access_pointer(tun->steering_prog) && tun->numqueues > 1 && 1956 !tfile->detached) 1957 rxhash = __skb_get_hash_symmetric(skb); 1958 |
1959 rcu_read_lock(); 1960 if (unlikely(!(tun->dev->flags & IFF_UP))) { 1961 err = -EIO; 1962 rcu_read_unlock(); 1963 goto drop; 1964 } 1965 |
|
1961 if (frags) { 1962 /* Exercise flow dissector code path. */ | 1966 if (frags) { 1967 /* Exercise flow dissector code path. */ |
1963 u32 headlen = eth_get_headlen(skb->data, skb_headlen(skb)); | 1968 u32 headlen = eth_get_headlen(tun->dev, skb->data, 1969 skb_headlen(skb)); |
1964 1965 if (unlikely(headlen > skb_headlen(skb))) { 1966 this_cpu_inc(tun->pcpu_stats->rx_dropped); 1967 napi_free_frags(&tfile->napi); | 1970 1971 if (unlikely(headlen > skb_headlen(skb))) { 1972 this_cpu_inc(tun->pcpu_stats->rx_dropped); 1973 napi_free_frags(&tfile->napi); |
1974 rcu_read_unlock(); |
|
1968 mutex_unlock(&tfile->napi_mutex); 1969 WARN_ON(1); 1970 return -ENOMEM; 1971 } 1972 1973 local_bh_disable(); 1974 napi_gro_frags(&tfile->napi); 1975 local_bh_enable(); --- 11 unchanged lines hidden (view full) --- 1987 napi_schedule(&tfile->napi); 1988 1989 local_bh_enable(); 1990 } else if (!IS_ENABLED(CONFIG_4KSTACKS)) { 1991 tun_rx_batched(tun, tfile, skb, more); 1992 } else { 1993 netif_rx_ni(skb); 1994 } | 1975 mutex_unlock(&tfile->napi_mutex); 1976 WARN_ON(1); 1977 return -ENOMEM; 1978 } 1979 1980 local_bh_disable(); 1981 napi_gro_frags(&tfile->napi); 1982 local_bh_enable(); --- 11 unchanged lines hidden (view full) --- 1994 napi_schedule(&tfile->napi); 1995 1996 local_bh_enable(); 1997 } else if (!IS_ENABLED(CONFIG_4KSTACKS)) { 1998 tun_rx_batched(tun, tfile, skb, more); 1999 } else { 2000 netif_rx_ni(skb); 2001 } |
2002 rcu_read_unlock(); |
|
1995 1996 stats = get_cpu_ptr(tun->pcpu_stats); 1997 u64_stats_update_begin(&stats->syncp); 1998 stats->rx_packets++; 1999 stats->rx_bytes += len; 2000 u64_stats_update_end(&stats->syncp); 2001 put_cpu_ptr(stats); 2002 --- 857 unchanged lines hidden (view full) --- 2860 security_tun_dev_free_security(tun->security); 2861err_free_stat: 2862 free_percpu(tun->pcpu_stats); 2863err_free_dev: 2864 free_netdev(dev); 2865 return err; 2866} 2867 | 2003 2004 stats = get_cpu_ptr(tun->pcpu_stats); 2005 u64_stats_update_begin(&stats->syncp); 2006 stats->rx_packets++; 2007 stats->rx_bytes += len; 2008 u64_stats_update_end(&stats->syncp); 2009 put_cpu_ptr(stats); 2010 --- 857 unchanged lines hidden (view full) --- 2868 security_tun_dev_free_security(tun->security); 2869err_free_stat: 2870 free_percpu(tun->pcpu_stats); 2871err_free_dev: 2872 free_netdev(dev); 2873 return err; 2874} 2875 |
2868static void tun_get_iff(struct net *net, struct tun_struct *tun, 2869 struct ifreq *ifr) | 2876static void tun_get_iff(struct tun_struct *tun, struct ifreq *ifr) |
2870{ 2871 tun_debug(KERN_INFO, tun, "tun_get_iff\n"); 2872 2873 strcpy(ifr->ifr_name, tun->dev->name); 2874 2875 ifr->ifr_flags = tun_flags(tun); 2876 2877} --- 212 unchanged lines hidden (view full) --- 3090 } 3091 3092 ret = -EBADFD; 3093 if (!tun) 3094 goto unlock; 3095 3096 tun_debug(KERN_INFO, tun, "tun_chr_ioctl cmd %u\n", cmd); 3097 | 2877{ 2878 tun_debug(KERN_INFO, tun, "tun_get_iff\n"); 2879 2880 strcpy(ifr->ifr_name, tun->dev->name); 2881 2882 ifr->ifr_flags = tun_flags(tun); 2883 2884} --- 212 unchanged lines hidden (view full) --- 3097 } 3098 3099 ret = -EBADFD; 3100 if (!tun) 3101 goto unlock; 3102 3103 tun_debug(KERN_INFO, tun, "tun_chr_ioctl cmd %u\n", cmd); 3104 |
3105 net = dev_net(tun->dev); |
|
3098 ret = 0; 3099 switch (cmd) { 3100 case TUNGETIFF: | 3106 ret = 0; 3107 switch (cmd) { 3108 case TUNGETIFF: |
3101 tun_get_iff(current->nsproxy->net_ns, tun, &ifr); | 3109 tun_get_iff(tun, &ifr); |
3102 3103 if (tfile->detached) 3104 ifr.ifr_flags |= IFF_DETACH_QUEUE; 3105 if (!tfile->socket.sk->sk_filter) 3106 ifr.ifr_flags |= IFF_NOFILTER; 3107 3108 if (copy_to_user(argp, &ifr, ifreq_len)) 3109 ret = -EFAULT; --- 205 unchanged lines hidden (view full) --- 3315 case TUNSETCARRIER: 3316 ret = -EFAULT; 3317 if (copy_from_user(&carrier, argp, sizeof(carrier))) 3318 goto unlock; 3319 3320 ret = tun_net_change_carrier(tun->dev, (bool)carrier); 3321 break; 3322 | 3110 3111 if (tfile->detached) 3112 ifr.ifr_flags |= IFF_DETACH_QUEUE; 3113 if (!tfile->socket.sk->sk_filter) 3114 ifr.ifr_flags |= IFF_NOFILTER; 3115 3116 if (copy_to_user(argp, &ifr, ifreq_len)) 3117 ret = -EFAULT; --- 205 unchanged lines hidden (view full) --- 3323 case TUNSETCARRIER: 3324 ret = -EFAULT; 3325 if (copy_from_user(&carrier, argp, sizeof(carrier))) 3326 goto unlock; 3327 3328 ret = tun_net_change_carrier(tun->dev, (bool)carrier); 3329 break; 3330 |
3331 case TUNGETDEVNETNS: 3332 ret = -EPERM; 3333 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 3334 goto unlock; 3335 ret = open_related_ns(&net->ns, get_net_ns); 3336 break; 3337 |
|
3323 default: 3324 ret = -EINVAL; 3325 break; 3326 } 3327 3328 if (do_notify) 3329 netdev_state_change(tun->dev); 3330 --- 113 unchanged lines hidden (view full) --- 3444 struct tun_struct *tun; 3445 struct ifreq ifr; 3446 3447 memset(&ifr, 0, sizeof(ifr)); 3448 3449 rtnl_lock(); 3450 tun = tun_get(tfile); 3451 if (tun) | 3338 default: 3339 ret = -EINVAL; 3340 break; 3341 } 3342 3343 if (do_notify) 3344 netdev_state_change(tun->dev); 3345 --- 113 unchanged lines hidden (view full) --- 3459 struct tun_struct *tun; 3460 struct ifreq ifr; 3461 3462 memset(&ifr, 0, sizeof(ifr)); 3463 3464 rtnl_lock(); 3465 tun = tun_get(tfile); 3466 if (tun) |
3452 tun_get_iff(current->nsproxy->net_ns, tun, &ifr); | 3467 tun_get_iff(tun, &ifr); |
3453 rtnl_unlock(); 3454 3455 if (tun) 3456 tun_put(tun); 3457 3458 seq_printf(m, "iff:\t%s\n", ifr.ifr_name); 3459} 3460#endif --- 257 unchanged lines hidden --- | 3468 rtnl_unlock(); 3469 3470 if (tun) 3471 tun_put(tun); 3472 3473 seq_printf(m, "iff:\t%s\n", ifr.ifr_name); 3474} 3475#endif --- 257 unchanged lines hidden --- |