|
@@ -869,6 +869,9 @@ static int tun_attach(struct tun_struct *tun, struct file *file,
|
|
|
tun_napi_init(tun, tfile, napi);
|
|
|
}
|
|
|
|
|
|
+ if (rtnl_dereference(tun->xdp_prog))
|
|
|
+ sock_set_flag(&tfile->sk, SOCK_XDP);
|
|
|
+
|
|
|
tun_set_real_num_queues(tun);
|
|
|
|
|
|
/* device is allowed to go away first, so no need to hold extra
|
|
@@ -1241,13 +1244,29 @@ static int tun_xdp_set(struct net_device *dev, struct bpf_prog *prog,
|
|
|
struct netlink_ext_ack *extack)
|
|
|
{
|
|
|
struct tun_struct *tun = netdev_priv(dev);
|
|
|
+ struct tun_file *tfile;
|
|
|
struct bpf_prog *old_prog;
|
|
|
+ int i;
|
|
|
|
|
|
old_prog = rtnl_dereference(tun->xdp_prog);
|
|
|
rcu_assign_pointer(tun->xdp_prog, prog);
|
|
|
if (old_prog)
|
|
|
bpf_prog_put(old_prog);
|
|
|
|
|
|
+ for (i = 0; i < tun->numqueues; i++) {
|
|
|
+ tfile = rtnl_dereference(tun->tfiles[i]);
|
|
|
+ if (prog)
|
|
|
+ sock_set_flag(&tfile->sk, SOCK_XDP);
|
|
|
+ else
|
|
|
+ sock_reset_flag(&tfile->sk, SOCK_XDP);
|
|
|
+ }
|
|
|
+ list_for_each_entry(tfile, &tun->disabled, next) {
|
|
|
+ if (prog)
|
|
|
+ sock_set_flag(&tfile->sk, SOCK_XDP);
|
|
|
+ else
|
|
|
+ sock_reset_flag(&tfile->sk, SOCK_XDP);
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|