| // SPDX-License-Identifier: GPL-2.0-only | |
| /* | |
| * 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.rst | |
| * 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> | |
| */ | |
| #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; | |
| } |