Commit | Line | Data |
---|---|---|
c86216bc AS |
1 | ============= |
2 | BPF licensing | |
3 | ============= | |
4 | ||
5 | Background | |
6 | ========== | |
7 | ||
8 | * Classic BPF was BSD licensed | |
9 | ||
10 | "BPF" was originally introduced as BSD Packet Filter in | |
11 | http://www.tcpdump.org/papers/bpf-usenix93.pdf. The corresponding instruction | |
12 | set and its implementation came from BSD with BSD license. That original | |
13 | instruction set is now known as "classic BPF". | |
14 | ||
15 | However an instruction set is a specification for machine-language interaction, | |
16 | similar to a programming language. It is not a code. Therefore, the | |
17 | application of a BSD license may be misleading in a certain context, as the | |
18 | instruction set may enjoy no copyright protection. | |
19 | ||
20 | * eBPF (extended BPF) instruction set continues to be BSD | |
21 | ||
22 | In 2014, the classic BPF instruction set was significantly extended. We | |
23 | typically refer to this instruction set as eBPF to disambiguate it from cBPF. | |
24 | The eBPF instruction set is still BSD licensed. | |
25 | ||
26 | Implementations of eBPF | |
27 | ======================= | |
28 | ||
29 | Using the eBPF instruction set requires implementing code in both kernel space | |
30 | and user space. | |
31 | ||
32 | In Linux Kernel | |
33 | --------------- | |
34 | ||
35 | The reference implementations of the eBPF interpreter and various just-in-time | |
36 | compilers are part of Linux and are GPLv2 licensed. The implementation of | |
37 | eBPF helper functions is also GPLv2 licensed. Interpreters, JITs, helpers, | |
38 | and verifiers are called eBPF runtime. | |
39 | ||
40 | In User Space | |
41 | ------------- | |
42 | ||
43 | There are also implementations of eBPF runtime (interpreter, JITs, helper | |
44 | functions) under | |
45 | Apache2 (https://github.com/iovisor/ubpf), | |
46 | MIT (https://github.com/qmonnet/rbpf), and | |
47 | BSD (https://github.com/DPDK/dpdk/blob/main/lib/librte_bpf). | |
48 | ||
49 | In HW | |
50 | ----- | |
51 | ||
52 | The HW can choose to execute eBPF instruction natively and provide eBPF runtime | |
53 | in HW or via the use of implementing firmware with a proprietary license. | |
54 | ||
55 | In other operating systems | |
56 | -------------------------- | |
57 | ||
58 | Other kernels or user space implementations of eBPF instruction set and runtime | |
59 | can have proprietary licenses. | |
60 | ||
61 | Using BPF programs in the Linux kernel | |
62 | ====================================== | |
63 | ||
64 | Linux Kernel (while being GPLv2) allows linking of proprietary kernel modules | |
65 | under these rules: | |
66 | Documentation/process/license-rules.rst | |
67 | ||
68 | When a kernel module is loaded, the linux kernel checks which functions it | |
69 | intends to use. If any function is marked as "GPL only," the corresponding | |
70 | module or program has to have GPL compatible license. | |
71 | ||
72 | Loading BPF program into the Linux kernel is similar to loading a kernel | |
73 | module. BPF is loaded at run time and not statically linked to the Linux | |
74 | kernel. BPF program loading follows the same license checking rules as kernel | |
75 | modules. BPF programs can be proprietary if they don't use "GPL only" BPF | |
76 | helper functions. | |
77 | ||
78 | Further, some BPF program types - Linux Security Modules (LSM) and TCP | |
79 | Congestion Control (struct_ops), as of Aug 2021 - are required to be GPL | |
80 | compatible even if they don't use "GPL only" helper functions directly. The | |
81 | registration step of LSM and TCP congestion control modules of the Linux | |
82 | kernel is done through EXPORT_SYMBOL_GPL kernel functions. In that sense LSM | |
83 | and struct_ops BPF programs are implicitly calling "GPL only" functions. | |
84 | The same restriction applies to BPF programs that call kernel functions | |
85 | directly via unstable interface also known as "kfunc". | |
86 | ||
87 | Packaging BPF programs with user space applications | |
88 | ==================================================== | |
89 | ||
90 | Generally, proprietary-licensed applications and GPL licensed BPF programs | |
91 | written for the Linux kernel in the same package can co-exist because they are | |
92 | separate executable processes. This applies to both cBPF and eBPF programs. |