53 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			53 lines
		
	
	
	
		
			1.2 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  * Minimal BPF assembler | ||
|  |  * | ||
|  |  * Instead of libpcap high-level filter expressions, it can be quite | ||
|  |  * useful to define filters in low-level BPF assembler (that is kept | ||
|  |  * close to Steven McCanne and Van Jacobson's original BPF paper). | ||
|  |  * In particular for BPF JIT implementors, JIT security auditors, or | ||
|  |  * just for defining BPF expressions that contain extensions which are | ||
|  |  * not supported by compilers. | ||
|  |  * | ||
|  |  * How to get into it: | ||
|  |  * | ||
|  |  * 1) read Documentation/networking/filter.txt | ||
|  |  * 2) Run `bpf_asm [-c] <filter-prog file>` to translate into binary | ||
|  |  *    blob that is loadable with xt_bpf, cls_bpf et al. Note: -c will | ||
|  |  *    pretty print a C-like construct. | ||
|  |  * | ||
|  |  * Copyright 2013 Daniel Borkmann <borkmann@redhat.com> | ||
|  |  * Licensed under the GNU General Public License, version 2.0 (GPLv2) | ||
|  |  */ | ||
|  | 
 | ||
|  | #include <stdbool.h>
 | ||
|  | #include <stdio.h>
 | ||
|  | #include <string.h>
 | ||
|  | 
 | ||
|  | extern void bpf_asm_compile(FILE *fp, bool cstyle); | ||
|  | 
 | ||
|  | int main(int argc, char **argv) | ||
|  | { | ||
|  | 	FILE *fp = stdin; | ||
|  | 	bool cstyle = false; | ||
|  | 	int i; | ||
|  | 
 | ||
|  | 	for (i = 1; i < argc; i++) { | ||
|  | 		if (!strncmp("-c", argv[i], 2)) { | ||
|  | 			cstyle = true; | ||
|  | 			continue; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		fp = fopen(argv[i], "r"); | ||
|  | 		if (!fp) { | ||
|  | 			fp = stdin; | ||
|  | 			continue; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		break; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	bpf_asm_compile(fp, cstyle); | ||
|  | 
 | ||
|  | 	return 0; | ||
|  | } |