93 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| =============
 | |
| BPF licensing
 | |
| =============
 | |
| 
 | |
| Background
 | |
| ==========
 | |
| 
 | |
| * Classic BPF was BSD licensed
 | |
| 
 | |
| "BPF" was originally introduced as BSD Packet Filter in
 | |
| http://www.tcpdump.org/papers/bpf-usenix93.pdf. The corresponding instruction
 | |
| set and its implementation came from BSD with BSD license. That original
 | |
| instruction set is now known as "classic BPF".
 | |
| 
 | |
| However an instruction set is a specification for machine-language interaction,
 | |
| similar to a programming language.  It is not a code. Therefore, the
 | |
| application of a BSD license may be misleading in a certain context, as the
 | |
| instruction set may enjoy no copyright protection.
 | |
| 
 | |
| * eBPF (extended BPF) instruction set continues to be BSD
 | |
| 
 | |
| In 2014, the classic BPF instruction set was significantly extended. We
 | |
| typically refer to this instruction set as eBPF to disambiguate it from cBPF.
 | |
| The eBPF instruction set is still BSD licensed.
 | |
| 
 | |
| Implementations of eBPF
 | |
| =======================
 | |
| 
 | |
| Using the eBPF instruction set requires implementing code in both kernel space
 | |
| and user space.
 | |
| 
 | |
| In Linux Kernel
 | |
| ---------------
 | |
| 
 | |
| The reference implementations of the eBPF interpreter and various just-in-time
 | |
| compilers are part of Linux and are GPLv2 licensed. The implementation of
 | |
| eBPF helper functions is also GPLv2 licensed. Interpreters, JITs, helpers,
 | |
| and verifiers are called eBPF runtime.
 | |
| 
 | |
| In User Space
 | |
| -------------
 | |
| 
 | |
| There are also implementations of eBPF runtime (interpreter, JITs, helper
 | |
| functions) under
 | |
| Apache2 (https://github.com/iovisor/ubpf),
 | |
| MIT (https://github.com/qmonnet/rbpf), and
 | |
| BSD (https://github.com/DPDK/dpdk/blob/main/lib/librte_bpf).
 | |
| 
 | |
| In HW
 | |
| -----
 | |
| 
 | |
| The HW can choose to execute eBPF instruction natively and provide eBPF runtime
 | |
| in HW or via the use of implementing firmware with a proprietary license.
 | |
| 
 | |
| In other operating systems
 | |
| --------------------------
 | |
| 
 | |
| Other kernels or user space implementations of eBPF instruction set and runtime
 | |
| can have proprietary licenses.
 | |
| 
 | |
| Using BPF programs in the Linux kernel
 | |
| ======================================
 | |
| 
 | |
| Linux Kernel (while being GPLv2) allows linking of proprietary kernel modules
 | |
| under these rules:
 | |
| Documentation/process/license-rules.rst
 | |
| 
 | |
| When a kernel module is loaded, the linux kernel checks which functions it
 | |
| intends to use. If any function is marked as "GPL only," the corresponding
 | |
| module or program has to have GPL compatible license.
 | |
| 
 | |
| Loading BPF program into the Linux kernel is similar to loading a kernel
 | |
| module. BPF is loaded at run time and not statically linked to the Linux
 | |
| kernel. BPF program loading follows the same license checking rules as kernel
 | |
| modules. BPF programs can be proprietary if they don't use "GPL only" BPF
 | |
| helper functions.
 | |
| 
 | |
| Further, some BPF program types - Linux Security Modules (LSM) and TCP
 | |
| Congestion Control (struct_ops), as of Aug 2021 - are required to be GPL
 | |
| compatible even if they don't use "GPL only" helper functions directly. The
 | |
| registration step of LSM and TCP congestion control modules of the Linux
 | |
| kernel is done through EXPORT_SYMBOL_GPL kernel functions. In that sense LSM
 | |
| and struct_ops BPF programs are implicitly calling "GPL only" functions.
 | |
| The same restriction applies to BPF programs that call kernel functions
 | |
| directly via unstable interface also known as "kfunc".
 | |
| 
 | |
| Packaging BPF programs with user space applications
 | |
| ====================================================
 | |
| 
 | |
| Generally, proprietary-licensed applications and GPL licensed BPF programs
 | |
| written for the Linux kernel in the same package can co-exist because they are
 | |
| separate executable processes. This applies to both cBPF and eBPF programs.
 |