Lines Matching refs:tun
83 #define tun_debug(level, tun, fmt, args...) \ argument
85 if (tun->debug) \
86 netdev_printk(level, tun->dev, fmt, ##args); \
94 #define tun_debug(level, tun, fmt, args...) \ argument
97 netdev_printk(level, tun->dev, fmt, ##args); \
149 struct tun_struct __rcu *tun; member
164 struct tun_struct *tun; member
210 static inline bool tun_legacy_is_little_endian(struct tun_struct *tun) in tun_legacy_is_little_endian() argument
212 return tun->flags & TUN_VNET_BE ? false : in tun_legacy_is_little_endian()
216 static long tun_get_vnet_be(struct tun_struct *tun, int __user *argp) in tun_get_vnet_be() argument
218 int be = !!(tun->flags & TUN_VNET_BE); in tun_get_vnet_be()
226 static long tun_set_vnet_be(struct tun_struct *tun, int __user *argp) in tun_set_vnet_be() argument
234 tun->flags |= TUN_VNET_BE; in tun_set_vnet_be()
236 tun->flags &= ~TUN_VNET_BE; in tun_set_vnet_be()
241 static inline bool tun_legacy_is_little_endian(struct tun_struct *tun) in tun_legacy_is_little_endian() argument
246 static long tun_get_vnet_be(struct tun_struct *tun, int __user *argp) in tun_get_vnet_be() argument
251 static long tun_set_vnet_be(struct tun_struct *tun, int __user *argp) in tun_set_vnet_be() argument
257 static inline bool tun_is_little_endian(struct tun_struct *tun) in tun_is_little_endian() argument
259 return tun->flags & TUN_VNET_LE || in tun_is_little_endian()
260 tun_legacy_is_little_endian(tun); in tun_is_little_endian()
263 static inline u16 tun16_to_cpu(struct tun_struct *tun, __virtio16 val) in tun16_to_cpu() argument
265 return __virtio16_to_cpu(tun_is_little_endian(tun), val); in tun16_to_cpu()
268 static inline __virtio16 cpu_to_tun16(struct tun_struct *tun, u16 val) in cpu_to_tun16() argument
270 return __cpu_to_virtio16(tun_is_little_endian(tun), val); in cpu_to_tun16()
289 static struct tun_flow_entry *tun_flow_create(struct tun_struct *tun, in tun_flow_create() argument
296 tun_debug(KERN_INFO, tun, "create flow: hash %u index %u\n", in tun_flow_create()
302 e->tun = tun; in tun_flow_create()
304 ++tun->flow_count; in tun_flow_create()
309 static void tun_flow_delete(struct tun_struct *tun, struct tun_flow_entry *e) in tun_flow_delete() argument
311 tun_debug(KERN_INFO, tun, "delete flow: hash %u index %u\n", in tun_flow_delete()
315 --tun->flow_count; in tun_flow_delete()
318 static void tun_flow_flush(struct tun_struct *tun) in tun_flow_flush() argument
322 spin_lock_bh(&tun->lock); in tun_flow_flush()
327 hlist_for_each_entry_safe(e, n, &tun->flows[i], hash_link) in tun_flow_flush()
328 tun_flow_delete(tun, e); in tun_flow_flush()
330 spin_unlock_bh(&tun->lock); in tun_flow_flush()
333 static void tun_flow_delete_by_queue(struct tun_struct *tun, u16 queue_index) in tun_flow_delete_by_queue() argument
337 spin_lock_bh(&tun->lock); in tun_flow_delete_by_queue()
342 hlist_for_each_entry_safe(e, n, &tun->flows[i], hash_link) { in tun_flow_delete_by_queue()
344 tun_flow_delete(tun, e); in tun_flow_delete_by_queue()
347 spin_unlock_bh(&tun->lock); in tun_flow_delete_by_queue()
352 struct tun_struct *tun = (struct tun_struct *)data; in tun_flow_cleanup() local
353 unsigned long delay = tun->ageing_time; in tun_flow_cleanup()
358 tun_debug(KERN_INFO, tun, "tun_flow_cleanup\n"); in tun_flow_cleanup()
360 spin_lock_bh(&tun->lock); in tun_flow_cleanup()
365 hlist_for_each_entry_safe(e, n, &tun->flows[i], hash_link) { in tun_flow_cleanup()
370 tun_flow_delete(tun, e); in tun_flow_cleanup()
377 mod_timer(&tun->flow_gc_timer, round_jiffies_up(next_timer)); in tun_flow_cleanup()
378 spin_unlock_bh(&tun->lock); in tun_flow_cleanup()
381 static void tun_flow_update(struct tun_struct *tun, u32 rxhash, in tun_flow_update() argument
386 unsigned long delay = tun->ageing_time; in tun_flow_update()
392 head = &tun->flows[tun_hashfn(rxhash)]; in tun_flow_update()
398 if (tun->numqueues == 1 || tfile->detached) in tun_flow_update()
408 spin_lock_bh(&tun->lock); in tun_flow_update()
410 tun->flow_count < MAX_TAP_FLOWS) in tun_flow_update()
411 tun_flow_create(tun, head, rxhash, queue_index); in tun_flow_update()
413 if (!timer_pending(&tun->flow_gc_timer)) in tun_flow_update()
414 mod_timer(&tun->flow_gc_timer, in tun_flow_update()
416 spin_unlock_bh(&tun->lock); in tun_flow_update()
443 struct tun_struct *tun = netdev_priv(dev); in tun_select_queue() local
449 numqueues = ACCESS_ONCE(tun->numqueues); in tun_select_queue()
453 e = tun_flow_find(&tun->flows[tun_hashfn(txq)], txq); in tun_select_queue()
470 static inline bool tun_not_capable(struct tun_struct *tun) in tun_not_capable() argument
473 struct net *net = dev_net(tun->dev); in tun_not_capable()
475 return ((uid_valid(tun->owner) && !uid_eq(cred->euid, tun->owner)) || in tun_not_capable()
476 (gid_valid(tun->group) && !in_egroup_p(tun->group))) && in tun_not_capable()
480 static void tun_set_real_num_queues(struct tun_struct *tun) in tun_set_real_num_queues() argument
482 netif_set_real_num_tx_queues(tun->dev, tun->numqueues); in tun_set_real_num_queues()
483 netif_set_real_num_rx_queues(tun->dev, tun->numqueues); in tun_set_real_num_queues()
486 static void tun_disable_queue(struct tun_struct *tun, struct tun_file *tfile) in tun_disable_queue() argument
488 tfile->detached = tun; in tun_disable_queue()
489 list_add_tail(&tfile->next, &tun->disabled); in tun_disable_queue()
490 ++tun->numdisabled; in tun_disable_queue()
495 struct tun_struct *tun = tfile->detached; in tun_enable_queue() local
499 --tun->numdisabled; in tun_enable_queue()
500 return tun; in tun_enable_queue()
512 struct tun_struct *tun; in __tun_detach() local
514 tun = rtnl_dereference(tfile->tun); in __tun_detach()
516 if (tun && !tfile->detached) { in __tun_detach()
518 BUG_ON(index >= tun->numqueues); in __tun_detach()
520 rcu_assign_pointer(tun->tfiles[index], in __tun_detach()
521 tun->tfiles[tun->numqueues - 1]); in __tun_detach()
522 ntfile = rtnl_dereference(tun->tfiles[index]); in __tun_detach()
525 --tun->numqueues; in __tun_detach()
527 RCU_INIT_POINTER(tfile->tun, NULL); in __tun_detach()
530 tun_disable_queue(tun, tfile); in __tun_detach()
533 tun_flow_delete_by_queue(tun, tun->numqueues + 1); in __tun_detach()
536 tun_set_real_num_queues(tun); in __tun_detach()
538 tun = tun_enable_queue(tfile); in __tun_detach()
543 if (tun && tun->numqueues == 0 && tun->numdisabled == 0) { in __tun_detach()
544 netif_carrier_off(tun->dev); in __tun_detach()
546 if (!(tun->flags & IFF_PERSIST) && in __tun_detach()
547 tun->dev->reg_state == NETREG_REGISTERED) in __tun_detach()
548 unregister_netdevice(tun->dev); in __tun_detach()
563 struct tun_struct *tun = netdev_priv(dev); in tun_detach_all() local
565 int i, n = tun->numqueues; in tun_detach_all()
568 tfile = rtnl_dereference(tun->tfiles[i]); in tun_detach_all()
572 RCU_INIT_POINTER(tfile->tun, NULL); in tun_detach_all()
573 --tun->numqueues; in tun_detach_all()
575 list_for_each_entry(tfile, &tun->disabled, next) { in tun_detach_all()
578 RCU_INIT_POINTER(tfile->tun, NULL); in tun_detach_all()
580 BUG_ON(tun->numqueues != 0); in tun_detach_all()
584 tfile = rtnl_dereference(tun->tfiles[i]); in tun_detach_all()
589 list_for_each_entry_safe(tfile, tmp, &tun->disabled, next) { in tun_detach_all()
594 BUG_ON(tun->numdisabled != 0); in tun_detach_all()
596 if (tun->flags & IFF_PERSIST) in tun_detach_all()
600 static int tun_attach(struct tun_struct *tun, struct file *file, bool skip_filter) in tun_attach() argument
605 err = security_tun_dev_attach(tfile->socket.sk, tun->security); in tun_attach()
610 if (rtnl_dereference(tfile->tun) && !tfile->detached) in tun_attach()
614 if (!(tun->flags & IFF_MULTI_QUEUE) && tun->numqueues == 1) in tun_attach()
619 tun->numqueues + tun->numdisabled == MAX_TAP_QUEUES) in tun_attach()
625 if (!skip_filter && (tun->filter_attached == true)) { in tun_attach()
626 err = __sk_attach_filter(&tun->fprog, tfile->socket.sk, in tun_attach()
631 tfile->queue_index = tun->numqueues; in tun_attach()
633 rcu_assign_pointer(tfile->tun, tun); in tun_attach()
634 rcu_assign_pointer(tun->tfiles[tun->numqueues], tfile); in tun_attach()
635 tun->numqueues++; in tun_attach()
642 tun_set_real_num_queues(tun); in tun_attach()
654 struct tun_struct *tun; in __tun_get() local
657 tun = rcu_dereference(tfile->tun); in __tun_get()
658 if (tun) in __tun_get()
659 dev_hold(tun->dev); in __tun_get()
662 return tun; in __tun_get()
670 static void tun_put(struct tun_struct *tun) in tun_put() argument
672 dev_put(tun->dev); in tun_put()
812 struct tun_struct *tun = netdev_priv(dev); in tun_net_xmit() local
818 tfile = rcu_dereference(tun->tfiles[txq]); in tun_net_xmit()
819 numqueues = ACCESS_ONCE(tun->numqueues); in tun_net_xmit()
834 e = tun_flow_find(&tun->flows[tun_hashfn(rxhash)], in tun_net_xmit()
841 tun_debug(KERN_INFO, tun, "tun_net_xmit %d\n", skb->len); in tun_net_xmit()
848 if (!check_filter(&tun->txflt, skb)) in tun_net_xmit()
920 struct tun_struct *tun = netdev_priv(dev); in tun_net_fix_features() local
922 return (features & tun->set_features) | (features & ~TUN_USER_FEATURES); in tun_net_fix_features()
971 static void tun_flow_init(struct tun_struct *tun) in tun_flow_init() argument
976 INIT_HLIST_HEAD(&tun->flows[i]); in tun_flow_init()
978 tun->ageing_time = TUN_FLOW_EXPIRE; in tun_flow_init()
979 setup_timer(&tun->flow_gc_timer, tun_flow_cleanup, (unsigned long)tun); in tun_flow_init()
980 mod_timer(&tun->flow_gc_timer, in tun_flow_init()
981 round_jiffies_up(jiffies + tun->ageing_time)); in tun_flow_init()
984 static void tun_flow_uninit(struct tun_struct *tun) in tun_flow_uninit() argument
986 del_timer_sync(&tun->flow_gc_timer); in tun_flow_uninit()
987 tun_flow_flush(tun); in tun_flow_uninit()
993 struct tun_struct *tun = netdev_priv(dev); in tun_net_init() local
995 switch (tun->flags & TUN_TYPE_MASK) { in tun_net_init()
1028 struct tun_struct *tun = __tun_get(tfile); in tun_chr_poll() local
1032 if (!tun) in tun_chr_poll()
1037 tun_debug(KERN_INFO, tun, "tun_chr_poll\n"); in tun_chr_poll()
1049 if (tun->dev->reg_state != NETREG_REGISTERED) in tun_chr_poll()
1052 tun_put(tun); in tun_chr_poll()
1084 static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile, in tun_get_user() argument
1100 if (!(tun->flags & IFF_NO_PI)) { in tun_get_user()
1110 if (tun->flags & IFF_VNET_HDR) { in tun_get_user()
1111 if (len < tun->vnet_hdr_sz) in tun_get_user()
1113 len -= tun->vnet_hdr_sz; in tun_get_user()
1120 …tun16_to_cpu(tun, gso.csum_start) + tun16_to_cpu(tun, gso.csum_offset) + 2 > tun16_to_cpu(tun, gso… in tun_get_user()
1121 …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()
1123 if (tun16_to_cpu(tun, gso.hdr_len) > len) in tun_get_user()
1125 iov_iter_advance(from, tun->vnet_hdr_sz - sizeof(gso)); in tun_get_user()
1128 if ((tun->flags & TUN_TYPE_MASK) == IFF_TAP) { in tun_get_user()
1131 (gso.hdr_len && tun16_to_cpu(tun, gso.hdr_len) < ETH_HLEN))) in tun_get_user()
1144 copylen = gso.hdr_len ? tun16_to_cpu(tun, gso.hdr_len) : GOODCOPY_LEN; in tun_get_user()
1155 if (tun16_to_cpu(tun, gso.hdr_len) > good_linear) in tun_get_user()
1158 linear = tun16_to_cpu(tun, gso.hdr_len); in tun_get_user()
1164 tun->dev->stats.rx_dropped++; in tun_get_user()
1179 tun->dev->stats.rx_dropped++; in tun_get_user()
1185 if (!skb_partial_csum_set(skb, tun16_to_cpu(tun, gso.csum_start), in tun_get_user()
1186 tun16_to_cpu(tun, gso.csum_offset))) { in tun_get_user()
1187 tun->dev->stats.rx_frame_errors++; in tun_get_user()
1193 switch (tun->flags & TUN_TYPE_MASK) { in tun_get_user()
1195 if (tun->flags & IFF_NO_PI) { in tun_get_user()
1204 tun->dev->stats.rx_dropped++; in tun_get_user()
1212 skb->dev = tun->dev; in tun_get_user()
1215 skb->protocol = eth_type_trans(skb, tun->dev); in tun_get_user()
1232 tun->dev->stats.rx_frame_errors++; in tun_get_user()
1240 skb_shinfo(skb)->gso_size = tun16_to_cpu(tun, gso.gso_size); in tun_get_user()
1242 tun->dev->stats.rx_frame_errors++; in tun_get_user()
1265 tun->dev->stats.rx_packets++; in tun_get_user()
1266 tun->dev->stats.rx_bytes += len; in tun_get_user()
1268 tun_flow_update(tun, rxhash, tfile); in tun_get_user()
1275 struct tun_struct *tun = tun_get(file); in tun_chr_write_iter() local
1279 if (!tun) in tun_chr_write_iter()
1282 result = tun_get_user(tun, tfile, NULL, from, file->f_flags & O_NONBLOCK); in tun_chr_write_iter()
1284 tun_put(tun); in tun_chr_write_iter()
1289 static ssize_t tun_put_user(struct tun_struct *tun, in tun_put_user() argument
1303 if (tun->flags & IFF_VNET_HDR) in tun_put_user()
1304 vnet_hdr_sz = tun->vnet_hdr_sz; in tun_put_user()
1308 if (!(tun->flags & IFF_NO_PI)) { in tun_put_user()
1331 gso.hdr_len = cpu_to_tun16(tun, skb_headlen(skb)); in tun_put_user()
1332 gso.gso_size = cpu_to_tun16(tun, sinfo->gso_size); in tun_put_user()
1342 sinfo->gso_type, tun16_to_cpu(tun, gso.gso_size), in tun_put_user()
1343 tun16_to_cpu(tun, gso.hdr_len)); in tun_put_user()
1347 min((int)tun16_to_cpu(tun, gso.hdr_len), 64), true); in tun_put_user()
1358 gso.csum_start = cpu_to_tun16(tun, skb_checksum_start_offset(skb) + in tun_put_user()
1360 gso.csum_offset = cpu_to_tun16(tun, skb->csum_offset); in tun_put_user()
1395 tun->dev->stats.tx_packets++; in tun_put_user()
1396 tun->dev->stats.tx_bytes += skb->len + vlan_hlen; in tun_put_user()
1401 static ssize_t tun_do_read(struct tun_struct *tun, struct tun_file *tfile, in tun_do_read() argument
1409 tun_debug(KERN_INFO, tun, "tun_do_read\n"); in tun_do_read()
1420 ret = tun_put_user(tun, tfile, skb, to); in tun_do_read()
1433 struct tun_struct *tun = __tun_get(tfile); in tun_chr_read_iter() local
1436 if (!tun) in tun_chr_read_iter()
1438 ret = tun_do_read(tun, tfile, to, file->f_flags & O_NONBLOCK); in tun_chr_read_iter()
1442 tun_put(tun); in tun_chr_read_iter()
1448 struct tun_struct *tun = netdev_priv(dev); in tun_free_netdev() local
1450 BUG_ON(!(list_empty(&tun->disabled))); in tun_free_netdev()
1451 tun_flow_uninit(tun); in tun_free_netdev()
1452 security_tun_dev_free_security(tun->security); in tun_free_netdev()
1458 struct tun_struct *tun = netdev_priv(dev); in tun_setup() local
1460 tun->owner = INVALID_UID; in tun_setup()
1461 tun->group = INVALID_GID; in tun_setup()
1508 struct tun_struct *tun = __tun_get(tfile); in tun_sendmsg() local
1510 if (!tun) in tun_sendmsg()
1513 ret = tun_get_user(tun, tfile, m->msg_control, &m->msg_iter, in tun_sendmsg()
1515 tun_put(tun); in tun_sendmsg()
1523 struct tun_struct *tun = __tun_get(tfile); in tun_recvmsg() local
1526 if (!tun) in tun_recvmsg()
1538 ret = tun_do_read(tun, tfile, &m->msg_iter, flags & MSG_DONTWAIT); in tun_recvmsg()
1544 tun_put(tun); in tun_recvmsg()
1560 static int tun_flags(struct tun_struct *tun) in tun_flags() argument
1562 return tun->flags & (TUN_FEATURES | IFF_PERSIST | IFF_TUN | IFF_TAP); in tun_flags()
1568 struct tun_struct *tun = netdev_priv(to_net_dev(dev)); in tun_show_flags() local
1569 return sprintf(buf, "0x%x\n", tun_flags(tun)); in tun_show_flags()
1575 struct tun_struct *tun = netdev_priv(to_net_dev(dev)); in tun_show_owner() local
1576 return uid_valid(tun->owner)? in tun_show_owner()
1578 from_kuid_munged(current_user_ns(), tun->owner)): in tun_show_owner()
1585 struct tun_struct *tun = netdev_priv(to_net_dev(dev)); in tun_show_group() local
1586 return gid_valid(tun->group) ? in tun_show_group()
1588 from_kgid_munged(current_user_ns(), tun->group)): in tun_show_group()
1609 struct tun_struct *tun; in tun_set_iff() local
1622 tun = netdev_priv(dev); in tun_set_iff()
1624 tun = netdev_priv(dev); in tun_set_iff()
1629 !!(tun->flags & IFF_MULTI_QUEUE)) in tun_set_iff()
1632 if (tun_not_capable(tun)) in tun_set_iff()
1634 err = security_tun_dev_open(tun->security); in tun_set_iff()
1638 err = tun_attach(tun, file, ifr->ifr_flags & IFF_NOFILTER); in tun_set_iff()
1642 if (tun->flags & IFF_MULTI_QUEUE && in tun_set_iff()
1643 (tun->numqueues + tun->numdisabled > 1)) { in tun_set_iff()
1689 tun = netdev_priv(dev); in tun_set_iff()
1690 tun->dev = dev; in tun_set_iff()
1691 tun->flags = flags; in tun_set_iff()
1692 tun->txflt.count = 0; in tun_set_iff()
1693 tun->vnet_hdr_sz = sizeof(struct virtio_net_hdr); in tun_set_iff()
1695 tun->filter_attached = false; in tun_set_iff()
1696 tun->sndbuf = tfile->socket.sk->sk_sndbuf; in tun_set_iff()
1698 spin_lock_init(&tun->lock); in tun_set_iff()
1700 err = security_tun_dev_alloc_security(&tun->security); in tun_set_iff()
1705 tun_flow_init(tun); in tun_set_iff()
1715 INIT_LIST_HEAD(&tun->disabled); in tun_set_iff()
1716 err = tun_attach(tun, file, false); in tun_set_iff()
1720 err = register_netdevice(tun->dev); in tun_set_iff()
1725 netif_carrier_on(tun->dev); in tun_set_iff()
1727 tun_debug(KERN_INFO, tun, "tun_set_iff\n"); in tun_set_iff()
1729 tun->flags = (tun->flags & ~TUN_FEATURES) | in tun_set_iff()
1735 if (netif_running(tun->dev)) in tun_set_iff()
1736 netif_tx_wake_all_queues(tun->dev); in tun_set_iff()
1738 strcpy(ifr->ifr_name, tun->dev->name); in tun_set_iff()
1744 tun_flow_uninit(tun); in tun_set_iff()
1745 security_tun_dev_free_security(tun->security); in tun_set_iff()
1751 static void tun_get_iff(struct net *net, struct tun_struct *tun, in tun_get_iff() argument
1754 tun_debug(KERN_INFO, tun, "tun_get_iff\n"); in tun_get_iff()
1756 strcpy(ifr->ifr_name, tun->dev->name); in tun_get_iff()
1758 ifr->ifr_flags = tun_flags(tun); in tun_get_iff()
1764 static int set_offload(struct tun_struct *tun, unsigned long arg) in set_offload() argument
1795 tun->set_features = features; in set_offload()
1796 netdev_update_features(tun->dev); in set_offload()
1801 static void tun_detach_filter(struct tun_struct *tun, int n) in tun_detach_filter() argument
1807 tfile = rtnl_dereference(tun->tfiles[i]); in tun_detach_filter()
1811 tun->filter_attached = false; in tun_detach_filter()
1814 static int tun_attach_filter(struct tun_struct *tun) in tun_attach_filter() argument
1819 for (i = 0; i < tun->numqueues; i++) { in tun_attach_filter()
1820 tfile = rtnl_dereference(tun->tfiles[i]); in tun_attach_filter()
1821 ret = __sk_attach_filter(&tun->fprog, tfile->socket.sk, in tun_attach_filter()
1824 tun_detach_filter(tun, i); in tun_attach_filter()
1829 tun->filter_attached = true; in tun_attach_filter()
1833 static void tun_set_sndbuf(struct tun_struct *tun) in tun_set_sndbuf() argument
1838 for (i = 0; i < tun->numqueues; i++) { in tun_set_sndbuf()
1839 tfile = rtnl_dereference(tun->tfiles[i]); in tun_set_sndbuf()
1840 tfile->socket.sk->sk_sndbuf = tun->sndbuf; in tun_set_sndbuf()
1847 struct tun_struct *tun; in tun_set_queue() local
1853 tun = tfile->detached; in tun_set_queue()
1854 if (!tun) { in tun_set_queue()
1858 ret = security_tun_dev_attach_queue(tun->security); in tun_set_queue()
1861 ret = tun_attach(tun, file, false); in tun_set_queue()
1863 tun = rtnl_dereference(tfile->tun); in tun_set_queue()
1864 if (!tun || !(tun->flags & IFF_MULTI_QUEUE) || tfile->detached) in tun_set_queue()
1880 struct tun_struct *tun; in __tun_chr_ioctl() local
1910 tun = __tun_get(tfile); in __tun_chr_ioctl()
1911 if (cmd == TUNSETIFF && !tun) { in __tun_chr_ioctl()
1925 if (tun) in __tun_chr_ioctl()
1938 if (!tun) in __tun_chr_ioctl()
1941 tun_debug(KERN_INFO, tun, "tun_chr_ioctl cmd %u\n", cmd); in __tun_chr_ioctl()
1946 tun_get_iff(current->nsproxy->net_ns, tun, &ifr); in __tun_chr_ioctl()
1961 tun_debug(KERN_INFO, tun, "ignored: set checksum %s\n", in __tun_chr_ioctl()
1969 if (arg && !(tun->flags & IFF_PERSIST)) { in __tun_chr_ioctl()
1970 tun->flags |= IFF_PERSIST; in __tun_chr_ioctl()
1973 if (!arg && (tun->flags & IFF_PERSIST)) { in __tun_chr_ioctl()
1974 tun->flags &= ~IFF_PERSIST; in __tun_chr_ioctl()
1978 tun_debug(KERN_INFO, tun, "persist %s\n", in __tun_chr_ioctl()
1989 tun->owner = owner; in __tun_chr_ioctl()
1990 tun_debug(KERN_INFO, tun, "owner set to %u\n", in __tun_chr_ioctl()
1991 from_kuid(&init_user_ns, tun->owner)); in __tun_chr_ioctl()
2001 tun->group = group; in __tun_chr_ioctl()
2002 tun_debug(KERN_INFO, tun, "group set to %u\n", in __tun_chr_ioctl()
2003 from_kgid(&init_user_ns, tun->group)); in __tun_chr_ioctl()
2008 if (tun->dev->flags & IFF_UP) { in __tun_chr_ioctl()
2009 tun_debug(KERN_INFO, tun, in __tun_chr_ioctl()
2013 tun->dev->type = (int) arg; in __tun_chr_ioctl()
2014 tun_debug(KERN_INFO, tun, "linktype set to %d\n", in __tun_chr_ioctl()
2015 tun->dev->type); in __tun_chr_ioctl()
2022 tun->debug = arg; in __tun_chr_ioctl()
2026 ret = set_offload(tun, arg); in __tun_chr_ioctl()
2032 if ((tun->flags & TUN_TYPE_MASK) != IFF_TAP) in __tun_chr_ioctl()
2034 ret = update_filter(&tun->txflt, (void __user *)arg); in __tun_chr_ioctl()
2039 memcpy(ifr.ifr_hwaddr.sa_data, tun->dev->dev_addr, ETH_ALEN); in __tun_chr_ioctl()
2040 ifr.ifr_hwaddr.sa_family = tun->dev->type; in __tun_chr_ioctl()
2047 tun_debug(KERN_DEBUG, tun, "set hw address: %pM\n", in __tun_chr_ioctl()
2050 ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr); in __tun_chr_ioctl()
2065 tun->sndbuf = sndbuf; in __tun_chr_ioctl()
2066 tun_set_sndbuf(tun); in __tun_chr_ioctl()
2070 vnet_hdr_sz = tun->vnet_hdr_sz; in __tun_chr_ioctl()
2085 tun->vnet_hdr_sz = vnet_hdr_sz; in __tun_chr_ioctl()
2089 le = !!(tun->flags & TUN_VNET_LE); in __tun_chr_ioctl()
2100 tun->flags |= TUN_VNET_LE; in __tun_chr_ioctl()
2102 tun->flags &= ~TUN_VNET_LE; in __tun_chr_ioctl()
2106 ret = tun_get_vnet_be(tun, argp); in __tun_chr_ioctl()
2110 ret = tun_set_vnet_be(tun, argp); in __tun_chr_ioctl()
2116 if ((tun->flags & TUN_TYPE_MASK) != IFF_TAP) in __tun_chr_ioctl()
2119 if (copy_from_user(&tun->fprog, argp, sizeof(tun->fprog))) in __tun_chr_ioctl()
2122 ret = tun_attach_filter(tun); in __tun_chr_ioctl()
2128 if ((tun->flags & TUN_TYPE_MASK) != IFF_TAP) in __tun_chr_ioctl()
2131 tun_detach_filter(tun, tun->numqueues); in __tun_chr_ioctl()
2136 if ((tun->flags & TUN_TYPE_MASK) != IFF_TAP) in __tun_chr_ioctl()
2139 if (copy_to_user(argp, &tun->fprog, sizeof(tun->fprog))) in __tun_chr_ioctl()
2151 if (tun) in __tun_chr_ioctl()
2152 tun_put(tun); in __tun_chr_ioctl()
2220 RCU_INIT_POINTER(tfile->tun, NULL); in tun_chr_open()
2255 struct tun_struct *tun; in tun_chr_show_fdinfo() local
2261 tun = tun_get(f); in tun_chr_show_fdinfo()
2262 if (tun) in tun_chr_show_fdinfo()
2263 tun_get_iff(current->nsproxy->net_ns, tun, &ifr); in tun_chr_show_fdinfo()
2266 if (tun) in tun_chr_show_fdinfo()
2267 tun_put(tun); in tun_chr_show_fdinfo()
2317 struct tun_struct *tun = netdev_priv(dev); in tun_get_drvinfo() local
2322 switch (tun->flags & TUN_TYPE_MASK) { in tun_get_drvinfo()
2335 struct tun_struct *tun = netdev_priv(dev); in tun_get_msglevel() local
2336 return tun->debug; in tun_get_msglevel()
2345 struct tun_struct *tun = netdev_priv(dev); in tun_set_msglevel() local
2346 tun->debug = value; in tun_set_msglevel()