Lines Matching refs:tun
93 #define tun_debug(level, tun, fmt, args...) \ argument
95 if (tun->debug) \
96 netdev_printk(level, tun->dev, fmt, ##args); \
104 #define tun_debug(level, tun, fmt, args...) \ argument
107 netdev_printk(level, tun->dev, fmt, ##args); \
174 struct tun_struct __rcu *tun; member
195 struct tun_struct *tun; member
316 static void tun_napi_init(struct tun_struct *tun, struct tun_file *tfile, in tun_napi_init() argument
322 netif_napi_add(tun->dev, &tfile->napi, tun_napi_poll, in tun_napi_init()
346 static inline bool tun_legacy_is_little_endian(struct tun_struct *tun) in tun_legacy_is_little_endian() argument
348 return tun->flags & TUN_VNET_BE ? false : in tun_legacy_is_little_endian()
352 static long tun_get_vnet_be(struct tun_struct *tun, int __user *argp) in tun_get_vnet_be() argument
354 int be = !!(tun->flags & TUN_VNET_BE); in tun_get_vnet_be()
362 static long tun_set_vnet_be(struct tun_struct *tun, int __user *argp) in tun_set_vnet_be() argument
370 tun->flags |= TUN_VNET_BE; in tun_set_vnet_be()
372 tun->flags &= ~TUN_VNET_BE; in tun_set_vnet_be()
377 static inline bool tun_legacy_is_little_endian(struct tun_struct *tun) in tun_legacy_is_little_endian() argument
382 static long tun_get_vnet_be(struct tun_struct *tun, int __user *argp) in tun_get_vnet_be() argument
387 static long tun_set_vnet_be(struct tun_struct *tun, int __user *argp) in tun_set_vnet_be() argument
393 static inline bool tun_is_little_endian(struct tun_struct *tun) in tun_is_little_endian() argument
395 return tun->flags & TUN_VNET_LE || in tun_is_little_endian()
396 tun_legacy_is_little_endian(tun); in tun_is_little_endian()
399 static inline u16 tun16_to_cpu(struct tun_struct *tun, __virtio16 val) in tun16_to_cpu() argument
401 return __virtio16_to_cpu(tun_is_little_endian(tun), val); in tun16_to_cpu()
404 static inline __virtio16 cpu_to_tun16(struct tun_struct *tun, u16 val) in cpu_to_tun16() argument
406 return __cpu_to_virtio16(tun_is_little_endian(tun), val); in cpu_to_tun16()
425 static struct tun_flow_entry *tun_flow_create(struct tun_struct *tun, in tun_flow_create() argument
432 tun_debug(KERN_INFO, tun, "create flow: hash %u index %u\n", in tun_flow_create()
438 e->tun = tun; in tun_flow_create()
440 ++tun->flow_count; in tun_flow_create()
445 static void tun_flow_delete(struct tun_struct *tun, struct tun_flow_entry *e) in tun_flow_delete() argument
447 tun_debug(KERN_INFO, tun, "delete flow: hash %u index %u\n", in tun_flow_delete()
451 --tun->flow_count; in tun_flow_delete()
454 static void tun_flow_flush(struct tun_struct *tun) in tun_flow_flush() argument
458 spin_lock_bh(&tun->lock); in tun_flow_flush()
463 hlist_for_each_entry_safe(e, n, &tun->flows[i], hash_link) in tun_flow_flush()
464 tun_flow_delete(tun, e); in tun_flow_flush()
466 spin_unlock_bh(&tun->lock); in tun_flow_flush()
469 static void tun_flow_delete_by_queue(struct tun_struct *tun, u16 queue_index) in tun_flow_delete_by_queue() argument
473 spin_lock_bh(&tun->lock); in tun_flow_delete_by_queue()
478 hlist_for_each_entry_safe(e, n, &tun->flows[i], hash_link) { in tun_flow_delete_by_queue()
480 tun_flow_delete(tun, e); in tun_flow_delete_by_queue()
483 spin_unlock_bh(&tun->lock); in tun_flow_delete_by_queue()
488 struct tun_struct *tun = from_timer(tun, t, flow_gc_timer); in tun_flow_cleanup() local
489 unsigned long delay = tun->ageing_time; in tun_flow_cleanup()
494 tun_debug(KERN_INFO, tun, "tun_flow_cleanup\n"); in tun_flow_cleanup()
496 spin_lock(&tun->lock); in tun_flow_cleanup()
501 hlist_for_each_entry_safe(e, n, &tun->flows[i], hash_link) { in tun_flow_cleanup()
506 tun_flow_delete(tun, e); in tun_flow_cleanup()
516 mod_timer(&tun->flow_gc_timer, round_jiffies_up(next_timer)); in tun_flow_cleanup()
517 spin_unlock(&tun->lock); in tun_flow_cleanup()
520 static void tun_flow_update(struct tun_struct *tun, u32 rxhash, in tun_flow_update() argument
525 unsigned long delay = tun->ageing_time; in tun_flow_update()
531 head = &tun->flows[tun_hashfn(rxhash)]; in tun_flow_update()
542 spin_lock_bh(&tun->lock); in tun_flow_update()
544 tun->flow_count < MAX_TAP_FLOWS) in tun_flow_update()
545 tun_flow_create(tun, head, rxhash, queue_index); in tun_flow_update()
547 if (!timer_pending(&tun->flow_gc_timer)) in tun_flow_update()
548 mod_timer(&tun->flow_gc_timer, in tun_flow_update()
550 spin_unlock_bh(&tun->lock); in tun_flow_update()
573 static u16 tun_automq_select_queue(struct tun_struct *tun, struct sk_buff *skb) in tun_automq_select_queue() argument
579 numqueues = READ_ONCE(tun->numqueues); in tun_automq_select_queue()
583 e = tun_flow_find(&tun->flows[tun_hashfn(txq)], txq); in tun_automq_select_queue()
599 static u16 tun_ebpf_select_queue(struct tun_struct *tun, struct sk_buff *skb) in tun_ebpf_select_queue() argument
604 prog = rcu_dereference(tun->steering_prog); in tun_ebpf_select_queue()
608 return ret % tun->numqueues; in tun_ebpf_select_queue()
615 struct tun_struct *tun = netdev_priv(dev); in tun_select_queue() local
619 if (rcu_dereference(tun->steering_prog)) in tun_select_queue()
620 ret = tun_ebpf_select_queue(tun, skb); in tun_select_queue()
622 ret = tun_automq_select_queue(tun, skb); in tun_select_queue()
628 static inline bool tun_not_capable(struct tun_struct *tun) in tun_not_capable() argument
631 struct net *net = dev_net(tun->dev); in tun_not_capable()
633 return ((uid_valid(tun->owner) && !uid_eq(cred->euid, tun->owner)) || in tun_not_capable()
634 (gid_valid(tun->group) && !in_egroup_p(tun->group))) && in tun_not_capable()
638 static void tun_set_real_num_queues(struct tun_struct *tun) in tun_set_real_num_queues() argument
640 netif_set_real_num_tx_queues(tun->dev, tun->numqueues); in tun_set_real_num_queues()
641 netif_set_real_num_rx_queues(tun->dev, tun->numqueues); in tun_set_real_num_queues()
644 static void tun_disable_queue(struct tun_struct *tun, struct tun_file *tfile) in tun_disable_queue() argument
646 tfile->detached = tun; in tun_disable_queue()
647 list_add_tail(&tfile->next, &tun->disabled); in tun_disable_queue()
648 ++tun->numdisabled; in tun_disable_queue()
653 struct tun_struct *tun = tfile->detached; in tun_enable_queue() local
657 --tun->numdisabled; in tun_enable_queue()
658 return tun; in tun_enable_queue()
689 struct tun_struct *tun; in __tun_detach() local
691 tun = rtnl_dereference(tfile->tun); in __tun_detach()
693 if (tun && clean) { in __tun_detach()
698 if (tun && !tfile->detached) { in __tun_detach()
700 BUG_ON(index >= tun->numqueues); in __tun_detach()
702 rcu_assign_pointer(tun->tfiles[index], in __tun_detach()
703 tun->tfiles[tun->numqueues - 1]); in __tun_detach()
704 ntfile = rtnl_dereference(tun->tfiles[index]); in __tun_detach()
707 --tun->numqueues; in __tun_detach()
709 RCU_INIT_POINTER(tfile->tun, NULL); in __tun_detach()
712 tun_disable_queue(tun, tfile); in __tun_detach()
715 tun_flow_delete_by_queue(tun, tun->numqueues + 1); in __tun_detach()
718 tun_set_real_num_queues(tun); in __tun_detach()
720 tun = tun_enable_queue(tfile); in __tun_detach()
725 if (tun && tun->numqueues == 0 && tun->numdisabled == 0) { in __tun_detach()
726 netif_carrier_off(tun->dev); in __tun_detach()
728 if (!(tun->flags & IFF_PERSIST) && in __tun_detach()
729 tun->dev->reg_state == NETREG_REGISTERED) in __tun_detach()
730 unregister_netdevice(tun->dev); in __tun_detach()
732 if (tun) in __tun_detach()
741 struct tun_struct *tun; in tun_detach() local
745 tun = rtnl_dereference(tfile->tun); in tun_detach()
746 dev = tun ? tun->dev : NULL; in tun_detach()
755 struct tun_struct *tun = netdev_priv(dev); in tun_detach_all() local
757 int i, n = tun->numqueues; in tun_detach_all()
760 tfile = rtnl_dereference(tun->tfiles[i]); in tun_detach_all()
765 RCU_INIT_POINTER(tfile->tun, NULL); in tun_detach_all()
766 --tun->numqueues; in tun_detach_all()
768 list_for_each_entry(tfile, &tun->disabled, next) { in tun_detach_all()
771 RCU_INIT_POINTER(tfile->tun, NULL); in tun_detach_all()
773 BUG_ON(tun->numqueues != 0); in tun_detach_all()
777 tfile = rtnl_dereference(tun->tfiles[i]); in tun_detach_all()
784 list_for_each_entry_safe(tfile, tmp, &tun->disabled, next) { in tun_detach_all()
790 BUG_ON(tun->numdisabled != 0); in tun_detach_all()
792 if (tun->flags & IFF_PERSIST) in tun_detach_all()
796 static int tun_attach(struct tun_struct *tun, struct file *file, in tun_attach() argument
800 struct net_device *dev = tun->dev; in tun_attach()
803 err = security_tun_dev_attach(tfile->socket.sk, tun->security); in tun_attach()
808 if (rtnl_dereference(tfile->tun) && !tfile->detached) in tun_attach()
812 if (!(tun->flags & IFF_MULTI_QUEUE) && tun->numqueues == 1) in tun_attach()
817 tun->numqueues + tun->numdisabled == MAX_TAP_QUEUES) in tun_attach()
823 if (!skip_filter && (tun->filter_attached == true)) { in tun_attach()
825 err = sk_attach_filter(&tun->fprog, tfile->socket.sk); in tun_attach()
838 tfile->queue_index = tun->numqueues; in tun_attach()
850 tun->dev, tfile->queue_index); in tun_attach()
862 rcu_assign_pointer(tfile->tun, tun); in tun_attach()
863 rcu_assign_pointer(tun->tfiles[tun->numqueues], tfile); in tun_attach()
864 tun->numqueues++; in tun_attach()
870 tun_napi_init(tun, tfile, napi, napi_frags); in tun_attach()
873 tun_set_real_num_queues(tun); in tun_attach()
885 struct tun_struct *tun; in tun_get() local
888 tun = rcu_dereference(tfile->tun); in tun_get()
889 if (tun) in tun_get()
890 dev_hold(tun->dev); in tun_get()
893 return tun; in tun_get()
896 static void tun_put(struct tun_struct *tun) in tun_put() argument
898 dev_put(tun->dev); in tun_put()
1018 struct tun_struct *tun = netdev_priv(dev); in tun_net_open() local
1023 for (i = 0; i < tun->numqueues; i++) { in tun_net_open()
1026 tfile = rtnl_dereference(tun->tfiles[i]); in tun_net_open()
1041 static void tun_automq_xmit(struct tun_struct *tun, struct sk_buff *skb) in tun_automq_xmit() argument
1044 if (tun->numqueues == 1 && static_key_false(&rps_needed)) { in tun_automq_xmit()
1053 e = tun_flow_find(&tun->flows[tun_hashfn(rxhash)], in tun_automq_xmit()
1062 static unsigned int run_ebpf_filter(struct tun_struct *tun, in run_ebpf_filter() argument
1066 struct tun_prog *prog = rcu_dereference(tun->filter_prog); in run_ebpf_filter()
1077 struct tun_struct *tun = netdev_priv(dev); in tun_net_xmit() local
1083 tfile = rcu_dereference(tun->tfiles[txq]); in tun_net_xmit()
1086 if (txq >= tun->numqueues) in tun_net_xmit()
1089 if (!rcu_dereference(tun->steering_prog)) in tun_net_xmit()
1090 tun_automq_xmit(tun, skb); in tun_net_xmit()
1092 tun_debug(KERN_INFO, tun, "tun_net_xmit %d\n", skb->len); in tun_net_xmit()
1099 if (!check_filter(&tun->txflt, skb)) in tun_net_xmit()
1106 len = run_ebpf_filter(tun, skb, len); in tun_net_xmit()
1134 this_cpu_inc(tun->pcpu_stats->tx_dropped); in tun_net_xmit()
1153 struct tun_struct *tun = netdev_priv(dev); in tun_net_fix_features() local
1155 return (features & tun->set_features) | (features & ~TUN_USER_FEATURES); in tun_net_fix_features()
1160 struct tun_struct *tun = netdev_priv(dev); in tun_set_headroom() local
1165 tun->align = new_hr; in tun_set_headroom()
1172 struct tun_struct *tun = netdev_priv(dev); in tun_net_get_stats64() local
1180 p = per_cpu_ptr(tun->pcpu_stats, i); in tun_net_get_stats64()
1207 struct tun_struct *tun = netdev_priv(dev); in tun_xdp_set() local
1210 old_prog = rtnl_dereference(tun->xdp_prog); in tun_xdp_set()
1211 rcu_assign_pointer(tun->xdp_prog, prog); in tun_xdp_set()
1220 struct tun_struct *tun = netdev_priv(dev); in tun_xdp_query() local
1223 xdp_prog = rtnl_dereference(tun->xdp_prog); in tun_xdp_query()
1265 struct tun_struct *tun = netdev_priv(dev); in tun_xdp_xmit() local
1277 numqueues = READ_ONCE(tun->numqueues); in tun_xdp_xmit()
1283 tfile = rcu_dereference(tun->tfiles[smp_processor_id() % in tun_xdp_xmit()
1295 this_cpu_inc(tun->pcpu_stats->tx_dropped); in tun_xdp_xmit()
1336 static void tun_flow_init(struct tun_struct *tun) in tun_flow_init() argument
1341 INIT_HLIST_HEAD(&tun->flows[i]); in tun_flow_init()
1343 tun->ageing_time = TUN_FLOW_EXPIRE; in tun_flow_init()
1344 timer_setup(&tun->flow_gc_timer, tun_flow_cleanup, 0); in tun_flow_init()
1345 mod_timer(&tun->flow_gc_timer, in tun_flow_init()
1346 round_jiffies_up(jiffies + tun->ageing_time)); in tun_flow_init()
1349 static void tun_flow_uninit(struct tun_struct *tun) in tun_flow_uninit() argument
1351 del_timer_sync(&tun->flow_gc_timer); in tun_flow_uninit()
1352 tun_flow_flush(tun); in tun_flow_uninit()
1361 struct tun_struct *tun = netdev_priv(dev); in tun_net_init() local
1363 switch (tun->flags & TUN_TYPE_MASK) { in tun_net_init()
1393 static bool tun_sock_writeable(struct tun_struct *tun, struct tun_file *tfile) in tun_sock_writeable() argument
1397 return (tun->dev->flags & IFF_UP) && sock_writeable(sk); in tun_sock_writeable()
1406 struct tun_struct *tun = tun_get(tfile); in tun_chr_poll() local
1410 if (!tun) in tun_chr_poll()
1415 tun_debug(KERN_INFO, tun, "tun_chr_poll\n"); in tun_chr_poll()
1427 if (tun_sock_writeable(tun, tfile) || in tun_chr_poll()
1429 tun_sock_writeable(tun, tfile))) in tun_chr_poll()
1432 if (tun->dev->reg_state != NETREG_REGISTERED) in tun_chr_poll()
1435 tun_put(tun); in tun_chr_poll()
1520 static void tun_rx_batched(struct tun_struct *tun, struct tun_file *tfile, in tun_rx_batched() argument
1525 u32 rx_batched = tun->rx_batched; in tun_rx_batched()
1556 static bool tun_can_build_skb(struct tun_struct *tun, struct tun_file *tfile, in tun_can_build_skb() argument
1559 if ((tun->flags & TUN_TYPE_MASK) != IFF_TAP) in tun_can_build_skb()
1578 static struct sk_buff *tun_build_skb(struct tun_struct *tun, in tun_build_skb() argument
1594 xdp_prog = rcu_dereference(tun->xdp_prog); in tun_build_skb()
1622 xdp_prog = rcu_dereference(tun->xdp_prog); in tun_build_skb()
1640 err = xdp_do_redirect(tun->dev, &xdp, xdp_prog); in tun_build_skb()
1650 if (tun_xdp_tx(tun->dev, &xdp) < 0) in tun_build_skb()
1663 trace_xdp_exception(tun->dev, xdp_prog, act); in tun_build_skb()
1692 this_cpu_inc(tun->pcpu_stats->rx_dropped); in tun_build_skb()
1697 static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, in tun_get_user() argument
1704 size_t len = total_len, align = tun->align, linear; in tun_get_user()
1715 if (!(tun->dev->flags & IFF_UP)) in tun_get_user()
1718 if (!(tun->flags & IFF_NO_PI)) { in tun_get_user()
1727 if (tun->flags & IFF_VNET_HDR) { in tun_get_user()
1728 int vnet_hdr_sz = READ_ONCE(tun->vnet_hdr_sz); in tun_get_user()
1738 …tun16_to_cpu(tun, gso.csum_start) + tun16_to_cpu(tun, gso.csum_offset) + 2 > tun16_to_cpu(tun, gso… in tun_get_user()
1739 …gso.hdr_len = cpu_to_tun16(tun, tun16_to_cpu(tun, gso.csum_start) + tun16_to_cpu(tun, gso.csum_off… in tun_get_user()
1741 if (tun16_to_cpu(tun, gso.hdr_len) > len) in tun_get_user()
1746 if ((tun->flags & TUN_TYPE_MASK) == IFF_TAP) { in tun_get_user()
1749 (gso.hdr_len && tun16_to_cpu(tun, gso.hdr_len) < ETH_HLEN))) in tun_get_user()
1762 copylen = gso.hdr_len ? tun16_to_cpu(tun, gso.hdr_len) : GOODCOPY_LEN; in tun_get_user()
1771 if (!frags && tun_can_build_skb(tun, tfile, len, noblock, zerocopy)) { in tun_get_user()
1776 skb = tun_build_skb(tun, tfile, from, &gso, len, &skb_xdp); in tun_get_user()
1778 this_cpu_inc(tun->pcpu_stats->rx_dropped); in tun_get_user()
1786 if (tun16_to_cpu(tun, gso.hdr_len) > good_linear) in tun_get_user()
1789 linear = tun16_to_cpu(tun, gso.hdr_len); in tun_get_user()
1807 this_cpu_inc(tun->pcpu_stats->rx_dropped); in tun_get_user()
1819 this_cpu_inc(tun->pcpu_stats->rx_dropped); in tun_get_user()
1830 if (virtio_net_hdr_to_skb(skb, &gso, tun_is_little_endian(tun))) { in tun_get_user()
1831 this_cpu_inc(tun->pcpu_stats->rx_frame_errors); in tun_get_user()
1841 switch (tun->flags & TUN_TYPE_MASK) { in tun_get_user()
1843 if (tun->flags & IFF_NO_PI) { in tun_get_user()
1854 this_cpu_inc(tun->pcpu_stats->rx_dropped); in tun_get_user()
1862 skb->dev = tun->dev; in tun_get_user()
1866 skb->protocol = eth_type_trans(skb, tun->dev); in tun_get_user()
1889 xdp_prog = rcu_dereference(tun->xdp_prog); in tun_get_user()
1906 if (!rcu_access_pointer(tun->steering_prog) && tun->numqueues > 1 && in tun_get_user()
1915 this_cpu_inc(tun->pcpu_stats->rx_dropped); in tun_get_user()
1940 tun_rx_batched(tun, tfile, skb, more); in tun_get_user()
1945 stats = get_cpu_ptr(tun->pcpu_stats); in tun_get_user()
1953 tun_flow_update(tun, rxhash, tfile); in tun_get_user()
1962 struct tun_struct *tun = tun_get(tfile); in tun_chr_write_iter() local
1965 if (!tun) in tun_chr_write_iter()
1968 result = tun_get_user(tun, tfile, NULL, from, in tun_chr_write_iter()
1971 tun_put(tun); in tun_chr_write_iter()
1975 static ssize_t tun_put_user_xdp(struct tun_struct *tun, in tun_put_user_xdp() argument
1985 if (tun->flags & IFF_VNET_HDR) { in tun_put_user_xdp()
1988 vnet_hdr_sz = READ_ONCE(tun->vnet_hdr_sz); in tun_put_user_xdp()
1999 stats = get_cpu_ptr(tun->pcpu_stats); in tun_put_user_xdp()
2004 put_cpu_ptr(tun->pcpu_stats); in tun_put_user_xdp()
2010 static ssize_t tun_put_user(struct tun_struct *tun, in tun_put_user() argument
2025 if (tun->flags & IFF_VNET_HDR) in tun_put_user()
2026 vnet_hdr_sz = READ_ONCE(tun->vnet_hdr_sz); in tun_put_user()
2030 if (!(tun->flags & IFF_NO_PI)) { in tun_put_user()
2051 tun_is_little_endian(tun), true, in tun_put_user()
2056 sinfo->gso_type, tun16_to_cpu(tun, gso.gso_size), in tun_put_user()
2057 tun16_to_cpu(tun, gso.hdr_len)); in tun_put_user()
2061 min((int)tun16_to_cpu(tun, gso.hdr_len), 64), true); in tun_put_user()
2094 stats = get_cpu_ptr(tun->pcpu_stats); in tun_put_user()
2099 put_cpu_ptr(tun->pcpu_stats); in tun_put_user()
2145 static ssize_t tun_do_read(struct tun_struct *tun, struct tun_file *tfile, in tun_do_read() argument
2152 tun_debug(KERN_INFO, tun, "tun_do_read\n"); in tun_do_read()
2169 ret = tun_put_user_xdp(tun, tfile, xdpf, to); in tun_do_read()
2174 ret = tun_put_user(tun, tfile, skb, to); in tun_do_read()
2188 struct tun_struct *tun = tun_get(tfile); in tun_chr_read_iter() local
2191 if (!tun) in tun_chr_read_iter()
2193 ret = tun_do_read(tun, tfile, to, file->f_flags & O_NONBLOCK, NULL); in tun_chr_read_iter()
2197 tun_put(tun); in tun_chr_read_iter()
2209 static int __tun_set_ebpf(struct tun_struct *tun, in __tun_set_ebpf() argument
2222 spin_lock_bh(&tun->lock); in __tun_set_ebpf()
2224 lockdep_is_held(&tun->lock)); in __tun_set_ebpf()
2226 spin_unlock_bh(&tun->lock); in __tun_set_ebpf()
2236 struct tun_struct *tun = netdev_priv(dev); in tun_free_netdev() local
2238 BUG_ON(!(list_empty(&tun->disabled))); in tun_free_netdev()
2239 free_percpu(tun->pcpu_stats); in tun_free_netdev()
2240 tun_flow_uninit(tun); in tun_free_netdev()
2241 security_tun_dev_free_security(tun->security); in tun_free_netdev()
2242 __tun_set_ebpf(tun, &tun->steering_prog, NULL); in tun_free_netdev()
2243 __tun_set_ebpf(tun, &tun->filter_prog, NULL); in tun_free_netdev()
2248 struct tun_struct *tun = netdev_priv(dev); in tun_setup() local
2250 tun->owner = INVALID_UID; in tun_setup()
2251 tun->group = INVALID_GID; in tun_setup()
2252 tun_default_link_ksettings(dev, &tun->link_ksettings); in tun_setup()
2289 struct tun_struct *tun = netdev_priv(dev); in tun_fill_info() local
2291 if (nla_put_u8(skb, IFLA_TUN_TYPE, tun->flags & TUN_TYPE_MASK)) in tun_fill_info()
2293 if (uid_valid(tun->owner) && in tun_fill_info()
2295 from_kuid_munged(current_user_ns(), tun->owner))) in tun_fill_info()
2297 if (gid_valid(tun->group) && in tun_fill_info()
2299 from_kgid_munged(current_user_ns(), tun->group))) in tun_fill_info()
2301 if (nla_put_u8(skb, IFLA_TUN_PI, !(tun->flags & IFF_NO_PI))) in tun_fill_info()
2303 if (nla_put_u8(skb, IFLA_TUN_VNET_HDR, !!(tun->flags & IFF_VNET_HDR))) in tun_fill_info()
2305 if (nla_put_u8(skb, IFLA_TUN_PERSIST, !!(tun->flags & IFF_PERSIST))) in tun_fill_info()
2308 !!(tun->flags & IFF_MULTI_QUEUE))) in tun_fill_info()
2310 if (tun->flags & IFF_MULTI_QUEUE) { in tun_fill_info()
2311 if (nla_put_u32(skb, IFLA_TUN_NUM_QUEUES, tun->numqueues)) in tun_fill_info()
2314 tun->numdisabled)) in tun_fill_info()
2357 struct tun_struct *tun = tun_get(tfile); in tun_sendmsg() local
2359 if (!tun) in tun_sendmsg()
2362 ret = tun_get_user(tun, tfile, m->msg_control, &m->msg_iter, in tun_sendmsg()
2365 tun_put(tun); in tun_sendmsg()
2373 struct tun_struct *tun = tun_get(tfile); in tun_recvmsg() local
2377 if (!tun) { in tun_recvmsg()
2391 ret = tun_do_read(tun, tfile, &m->msg_iter, flags & MSG_DONTWAIT, ptr); in tun_recvmsg()
2397 tun_put(tun); in tun_recvmsg()
2401 tun_put(tun); in tun_recvmsg()
2424 struct tun_struct *tun; in tun_peek_len() local
2427 tun = tun_get(tfile); in tun_peek_len()
2428 if (!tun) in tun_peek_len()
2432 tun_put(tun); in tun_peek_len()
2450 static int tun_flags(struct tun_struct *tun) in tun_flags() argument
2452 return tun->flags & (TUN_FEATURES | IFF_PERSIST | IFF_TUN | IFF_TAP); in tun_flags()
2458 struct tun_struct *tun = netdev_priv(to_net_dev(dev)); in tun_show_flags() local
2459 return sprintf(buf, "0x%x\n", tun_flags(tun)); in tun_show_flags()
2465 struct tun_struct *tun = netdev_priv(to_net_dev(dev)); in tun_show_owner() local
2466 return uid_valid(tun->owner)? in tun_show_owner()
2468 from_kuid_munged(current_user_ns(), tun->owner)): in tun_show_owner()
2475 struct tun_struct *tun = netdev_priv(to_net_dev(dev)); in tun_show_group() local
2476 return gid_valid(tun->group) ? in tun_show_group()
2478 from_kgid_munged(current_user_ns(), tun->group)): in tun_show_group()
2499 struct tun_struct *tun; in tun_set_iff() local
2521 tun = netdev_priv(dev); in tun_set_iff()
2523 tun = netdev_priv(dev); in tun_set_iff()
2528 !!(tun->flags & IFF_MULTI_QUEUE)) in tun_set_iff()
2531 if (tun_not_capable(tun)) in tun_set_iff()
2533 err = security_tun_dev_open(tun->security); in tun_set_iff()
2537 err = tun_attach(tun, file, ifr->ifr_flags & IFF_NOFILTER, in tun_set_iff()
2543 if (tun->flags & IFF_MULTI_QUEUE && in tun_set_iff()
2544 (tun->numqueues + tun->numdisabled > 1)) { in tun_set_iff()
2552 tun->flags = (tun->flags & ~TUN_FEATURES) | in tun_set_iff()
2598 tun = netdev_priv(dev); in tun_set_iff()
2599 tun->dev = dev; in tun_set_iff()
2600 tun->flags = flags; in tun_set_iff()
2601 tun->txflt.count = 0; in tun_set_iff()
2602 tun->vnet_hdr_sz = sizeof(struct virtio_net_hdr); in tun_set_iff()
2604 tun->align = NET_SKB_PAD; in tun_set_iff()
2605 tun->filter_attached = false; in tun_set_iff()
2606 tun->sndbuf = tfile->socket.sk->sk_sndbuf; in tun_set_iff()
2607 tun->rx_batched = 0; in tun_set_iff()
2608 RCU_INIT_POINTER(tun->steering_prog, NULL); in tun_set_iff()
2610 tun->pcpu_stats = netdev_alloc_pcpu_stats(struct tun_pcpu_stats); in tun_set_iff()
2611 if (!tun->pcpu_stats) { in tun_set_iff()
2616 spin_lock_init(&tun->lock); in tun_set_iff()
2618 err = security_tun_dev_alloc_security(&tun->security); in tun_set_iff()
2623 tun_flow_init(tun); in tun_set_iff()
2633 tun->flags = (tun->flags & ~TUN_FEATURES) | in tun_set_iff()
2636 INIT_LIST_HEAD(&tun->disabled); in tun_set_iff()
2637 err = tun_attach(tun, file, false, ifr->ifr_flags & IFF_NAPI, in tun_set_iff()
2642 err = register_netdevice(tun->dev); in tun_set_iff()
2647 netif_carrier_on(tun->dev); in tun_set_iff()
2649 tun_debug(KERN_INFO, tun, "tun_set_iff\n"); in tun_set_iff()
2654 if (netif_running(tun->dev)) in tun_set_iff()
2655 netif_tx_wake_all_queues(tun->dev); in tun_set_iff()
2657 strcpy(ifr->ifr_name, tun->dev->name); in tun_set_iff()
2666 tun_flow_uninit(tun); in tun_set_iff()
2667 security_tun_dev_free_security(tun->security); in tun_set_iff()
2669 free_percpu(tun->pcpu_stats); in tun_set_iff()
2675 static void tun_get_iff(struct net *net, struct tun_struct *tun, in tun_get_iff() argument
2678 tun_debug(KERN_INFO, tun, "tun_get_iff\n"); in tun_get_iff()
2680 strcpy(ifr->ifr_name, tun->dev->name); in tun_get_iff()
2682 ifr->ifr_flags = tun_flags(tun); in tun_get_iff()
2688 static int set_offload(struct tun_struct *tun, unsigned long arg) in set_offload() argument
2716 tun->set_features = features; in set_offload()
2717 tun->dev->wanted_features &= ~TUN_USER_FEATURES; in set_offload()
2718 tun->dev->wanted_features |= features; in set_offload()
2719 netdev_update_features(tun->dev); in set_offload()
2724 static void tun_detach_filter(struct tun_struct *tun, int n) in tun_detach_filter() argument
2730 tfile = rtnl_dereference(tun->tfiles[i]); in tun_detach_filter()
2736 tun->filter_attached = false; in tun_detach_filter()
2739 static int tun_attach_filter(struct tun_struct *tun) in tun_attach_filter() argument
2744 for (i = 0; i < tun->numqueues; i++) { in tun_attach_filter()
2745 tfile = rtnl_dereference(tun->tfiles[i]); in tun_attach_filter()
2747 ret = sk_attach_filter(&tun->fprog, tfile->socket.sk); in tun_attach_filter()
2750 tun_detach_filter(tun, i); in tun_attach_filter()
2755 tun->filter_attached = true; in tun_attach_filter()
2759 static void tun_set_sndbuf(struct tun_struct *tun) in tun_set_sndbuf() argument
2764 for (i = 0; i < tun->numqueues; i++) { in tun_set_sndbuf()
2765 tfile = rtnl_dereference(tun->tfiles[i]); in tun_set_sndbuf()
2766 tfile->socket.sk->sk_sndbuf = tun->sndbuf; in tun_set_sndbuf()
2773 struct tun_struct *tun; in tun_set_queue() local
2779 tun = tfile->detached; in tun_set_queue()
2780 if (!tun) { in tun_set_queue()
2784 ret = security_tun_dev_attach_queue(tun->security); in tun_set_queue()
2787 ret = tun_attach(tun, file, false, tun->flags & IFF_NAPI, in tun_set_queue()
2788 tun->flags & IFF_NAPI_FRAGS); in tun_set_queue()
2790 tun = rtnl_dereference(tfile->tun); in tun_set_queue()
2791 if (!tun || !(tun->flags & IFF_MULTI_QUEUE) || tfile->detached) in tun_set_queue()
2799 netdev_state_change(tun->dev); in tun_set_queue()
2806 static int tun_set_ebpf(struct tun_struct *tun, struct tun_prog **prog_p, in tun_set_ebpf() argument
2823 return __tun_set_ebpf(tun, prog_p, prog); in tun_set_ebpf()
2831 struct tun_struct *tun; in __tun_chr_ioctl() local
2868 tun = tun_get(tfile); in __tun_chr_ioctl()
2871 if (tun) in __tun_chr_ioctl()
2887 if (tun) in __tun_chr_ioctl()
2900 if (!tun) in __tun_chr_ioctl()
2903 tun_debug(KERN_INFO, tun, "tun_chr_ioctl cmd %u\n", cmd); in __tun_chr_ioctl()
2908 tun_get_iff(current->nsproxy->net_ns, tun, &ifr); in __tun_chr_ioctl()
2923 tun_debug(KERN_INFO, tun, "ignored: set checksum %s\n", in __tun_chr_ioctl()
2931 if (arg && !(tun->flags & IFF_PERSIST)) { in __tun_chr_ioctl()
2932 tun->flags |= IFF_PERSIST; in __tun_chr_ioctl()
2936 if (!arg && (tun->flags & IFF_PERSIST)) { in __tun_chr_ioctl()
2937 tun->flags &= ~IFF_PERSIST; in __tun_chr_ioctl()
2942 tun_debug(KERN_INFO, tun, "persist %s\n", in __tun_chr_ioctl()
2953 tun->owner = owner; in __tun_chr_ioctl()
2955 tun_debug(KERN_INFO, tun, "owner set to %u\n", in __tun_chr_ioctl()
2956 from_kuid(&init_user_ns, tun->owner)); in __tun_chr_ioctl()
2966 tun->group = group; in __tun_chr_ioctl()
2968 tun_debug(KERN_INFO, tun, "group set to %u\n", in __tun_chr_ioctl()
2969 from_kgid(&init_user_ns, tun->group)); in __tun_chr_ioctl()
2974 if (tun->dev->flags & IFF_UP) { in __tun_chr_ioctl()
2975 tun_debug(KERN_INFO, tun, in __tun_chr_ioctl()
2979 tun->dev->type = (int) arg; in __tun_chr_ioctl()
2980 tun_debug(KERN_INFO, tun, "linktype set to %d\n", in __tun_chr_ioctl()
2981 tun->dev->type); in __tun_chr_ioctl()
2988 tun->debug = arg; in __tun_chr_ioctl()
2992 ret = set_offload(tun, arg); in __tun_chr_ioctl()
2998 if ((tun->flags & TUN_TYPE_MASK) != IFF_TAP) in __tun_chr_ioctl()
3000 ret = update_filter(&tun->txflt, (void __user *)arg); in __tun_chr_ioctl()
3005 memcpy(ifr.ifr_hwaddr.sa_data, tun->dev->dev_addr, ETH_ALEN); in __tun_chr_ioctl()
3006 ifr.ifr_hwaddr.sa_family = tun->dev->type; in __tun_chr_ioctl()
3013 tun_debug(KERN_DEBUG, tun, "set hw address: %pM\n", in __tun_chr_ioctl()
3016 ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr); in __tun_chr_ioctl()
3035 tun->sndbuf = sndbuf; in __tun_chr_ioctl()
3036 tun_set_sndbuf(tun); in __tun_chr_ioctl()
3040 vnet_hdr_sz = tun->vnet_hdr_sz; in __tun_chr_ioctl()
3055 tun->vnet_hdr_sz = vnet_hdr_sz; in __tun_chr_ioctl()
3059 le = !!(tun->flags & TUN_VNET_LE); in __tun_chr_ioctl()
3070 tun->flags |= TUN_VNET_LE; in __tun_chr_ioctl()
3072 tun->flags &= ~TUN_VNET_LE; in __tun_chr_ioctl()
3076 ret = tun_get_vnet_be(tun, argp); in __tun_chr_ioctl()
3080 ret = tun_set_vnet_be(tun, argp); in __tun_chr_ioctl()
3086 if ((tun->flags & TUN_TYPE_MASK) != IFF_TAP) in __tun_chr_ioctl()
3089 if (copy_from_user(&tun->fprog, argp, sizeof(tun->fprog))) in __tun_chr_ioctl()
3092 ret = tun_attach_filter(tun); in __tun_chr_ioctl()
3098 if ((tun->flags & TUN_TYPE_MASK) != IFF_TAP) in __tun_chr_ioctl()
3101 tun_detach_filter(tun, tun->numqueues); in __tun_chr_ioctl()
3106 if ((tun->flags & TUN_TYPE_MASK) != IFF_TAP) in __tun_chr_ioctl()
3109 if (copy_to_user(argp, &tun->fprog, sizeof(tun->fprog))) in __tun_chr_ioctl()
3115 ret = tun_set_ebpf(tun, &tun->steering_prog, argp); in __tun_chr_ioctl()
3119 ret = tun_set_ebpf(tun, &tun->filter_prog, argp); in __tun_chr_ioctl()
3128 netdev_state_change(tun->dev); in __tun_chr_ioctl()
3132 if (tun) in __tun_chr_ioctl()
3133 tun_put(tun); in __tun_chr_ioctl()
3207 RCU_INIT_POINTER(tfile->tun, NULL); in tun_chr_open()
3243 struct tun_struct *tun; in tun_chr_show_fdinfo() local
3249 tun = tun_get(tfile); in tun_chr_show_fdinfo()
3250 if (tun) in tun_chr_show_fdinfo()
3251 tun_get_iff(current->nsproxy->net_ns, tun, &ifr); in tun_chr_show_fdinfo()
3254 if (tun) in tun_chr_show_fdinfo()
3255 tun_put(tun); in tun_chr_show_fdinfo()
3303 struct tun_struct *tun = netdev_priv(dev); in tun_get_link_ksettings() local
3305 memcpy(cmd, &tun->link_ksettings, sizeof(*cmd)); in tun_get_link_ksettings()
3312 struct tun_struct *tun = netdev_priv(dev); in tun_set_link_ksettings() local
3314 memcpy(&tun->link_ksettings, cmd, sizeof(*cmd)); in tun_set_link_ksettings()
3320 struct tun_struct *tun = netdev_priv(dev); in tun_get_drvinfo() local
3325 switch (tun->flags & TUN_TYPE_MASK) { in tun_get_drvinfo()
3338 struct tun_struct *tun = netdev_priv(dev); in tun_get_msglevel() local
3339 return tun->debug; in tun_get_msglevel()
3348 struct tun_struct *tun = netdev_priv(dev); in tun_set_msglevel() local
3349 tun->debug = value; in tun_set_msglevel()
3356 struct tun_struct *tun = netdev_priv(dev); in tun_get_coalesce() local
3358 ec->rx_max_coalesced_frames = tun->rx_batched; in tun_get_coalesce()
3366 struct tun_struct *tun = netdev_priv(dev); in tun_set_coalesce() local
3369 tun->rx_batched = NAPI_POLL_WEIGHT; in tun_set_coalesce()
3371 tun->rx_batched = ec->rx_max_coalesced_frames; in tun_set_coalesce()
3388 static int tun_queue_resize(struct tun_struct *tun) in tun_queue_resize() argument
3390 struct net_device *dev = tun->dev; in tun_queue_resize()
3393 int n = tun->numqueues + tun->numdisabled; in tun_queue_resize()
3400 for (i = 0; i < tun->numqueues; i++) { in tun_queue_resize()
3401 tfile = rtnl_dereference(tun->tfiles[i]); in tun_queue_resize()
3404 list_for_each_entry(tfile, &tun->disabled, next) in tun_queue_resize()
3419 struct tun_struct *tun = netdev_priv(dev); in tun_device_event() local
3426 if (tun_queue_resize(tun)) in tun_device_event()