2 #include <linux/bpf_verifier.h>
4 #include <linux/list.h>
5 #include <linux/netdevice.h>
6 #include <linux/printk.h>
7 #include <linux/rtnetlink.h>
9 /* protected by RTNL */
10 static LIST_HEAD(bpf_prog_offload_devs
);
12 int bpf_prog_offload_init(struct bpf_prog
*prog
, union bpf_attr
*attr
)
14 struct net
*net
= current
->nsproxy
->net_ns
;
15 struct bpf_dev_offload
*offload
;
17 if (!capable(CAP_SYS_ADMIN
))
23 offload
= kzalloc(sizeof(*offload
), GFP_USER
);
28 init_waitqueue_head(&offload
->verifier_done
);
31 offload
->netdev
= __dev_get_by_index(net
, attr
->prog_target_ifindex
);
32 if (!offload
->netdev
) {
38 prog
->aux
->offload
= offload
;
39 list_add_tail(&offload
->offloads
, &bpf_prog_offload_devs
);
45 static int __bpf_offload_ndo(struct bpf_prog
*prog
, enum bpf_netdev_command cmd
,
46 struct netdev_bpf
*data
)
48 struct net_device
*netdev
= prog
->aux
->offload
->netdev
;
54 if (!netdev
->netdev_ops
->ndo_bpf
)
59 return netdev
->netdev_ops
->ndo_bpf(netdev
, data
);
62 int bpf_prog_offload_verifier_prep(struct bpf_verifier_env
*env
)
64 struct netdev_bpf data
= {};
67 data
.verifier
.prog
= env
->prog
;
70 err
= __bpf_offload_ndo(env
->prog
, BPF_OFFLOAD_VERIFIER_PREP
, &data
);
74 env
->dev_ops
= data
.verifier
.ops
;
76 env
->prog
->aux
->offload
->dev_state
= true;
77 env
->prog
->aux
->offload
->verifier_running
= true;
83 static void __bpf_prog_offload_destroy(struct bpf_prog
*prog
)
85 struct bpf_dev_offload
*offload
= prog
->aux
->offload
;
86 struct netdev_bpf data
= {};
88 data
.offload
.prog
= prog
;
90 if (offload
->verifier_running
)
91 wait_event(offload
->verifier_done
, !offload
->verifier_running
);
93 if (offload
->dev_state
)
94 WARN_ON(__bpf_offload_ndo(prog
, BPF_OFFLOAD_DESTROY
, &data
));
96 offload
->dev_state
= false;
97 list_del_init(&offload
->offloads
);
98 offload
->netdev
= NULL
;
101 void bpf_prog_offload_destroy(struct bpf_prog
*prog
)
103 struct bpf_dev_offload
*offload
= prog
->aux
->offload
;
105 offload
->verifier_running
= false;
106 wake_up(&offload
->verifier_done
);
109 __bpf_prog_offload_destroy(prog
);
115 static int bpf_prog_offload_translate(struct bpf_prog
*prog
)
117 struct bpf_dev_offload
*offload
= prog
->aux
->offload
;
118 struct netdev_bpf data
= {};
121 data
.offload
.prog
= prog
;
123 offload
->verifier_running
= false;
124 wake_up(&offload
->verifier_done
);
127 ret
= __bpf_offload_ndo(prog
, BPF_OFFLOAD_TRANSLATE
, &data
);
133 static unsigned int bpf_prog_warn_on_exec(const void *ctx
,
134 const struct bpf_insn
*insn
)
136 WARN(1, "attempt to execute device eBPF program on the host!");
140 int bpf_prog_offload_compile(struct bpf_prog
*prog
)
142 prog
->bpf_func
= bpf_prog_warn_on_exec
;
144 return bpf_prog_offload_translate(prog
);
147 u32
bpf_prog_offload_ifindex(struct bpf_prog
*prog
)
149 struct bpf_dev_offload
*offload
= prog
->aux
->offload
;
153 ifindex
= offload
->netdev
? offload
->netdev
->ifindex
: 0;
159 const struct bpf_prog_ops bpf_offload_prog_ops
= {
162 static int bpf_offload_notification(struct notifier_block
*notifier
,
163 ulong event
, void *ptr
)
165 struct net_device
*netdev
= netdev_notifier_info_to_dev(ptr
);
166 struct bpf_dev_offload
*offload
, *tmp
;
171 case NETDEV_UNREGISTER
:
172 list_for_each_entry_safe(offload
, tmp
, &bpf_prog_offload_devs
,
174 if (offload
->netdev
== netdev
)
175 __bpf_prog_offload_destroy(offload
->prog
);
184 static struct notifier_block bpf_offload_notifier
= {
185 .notifier_call
= bpf_offload_notification
,
188 static int __init
bpf_offload_init(void)
190 register_netdevice_notifier(&bpf_offload_notifier
);
194 subsys_initcall(bpf_offload_init
);