Mercurial > hg > nginx
comparison src/event/quic/bpf/bpfgen.sh @ 8676:7df607cb2d11 quic
QUIC: ngx_quic_bpf module.
The quic kernel bpf helper inspects packet payload for DCID, extracts key
and routes the packet into socket matching the key.
Due to reuseport feature, each worker owns a personal socket, which is
identified by the same key, used to create DCID.
BPF objects are locked in RAM and are subject to RLIMIT_MEMLOCK.
The "ulimit -l" command may be used to setup proper limits, if maps
cannot be created with EPERM or updated with ETOOLONG.
author | Vladimir Homutov <vl@nginx.com> |
---|---|
date | Fri, 25 Dec 2020 15:01:15 +0300 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
8675:d3747ba486e7 | 8676:7df607cb2d11 |
---|---|
1 #!/bin/bash | |
2 | |
3 export LANG=C | |
4 | |
5 set -e | |
6 | |
7 if [ $# -lt 1 ]; then | |
8 echo "Usage: PROGNAME=foo LICENSE=bar $0 <bpf object file>" | |
9 exit 1 | |
10 fi | |
11 | |
12 | |
13 self=$0 | |
14 filename=$1 | |
15 funcname=$PROGNAME | |
16 | |
17 generate_head() | |
18 { | |
19 cat << END | |
20 /* AUTO-GENERATED, DO NOT EDIT. */ | |
21 | |
22 #include <stddef.h> | |
23 #include <stdint.h> | |
24 | |
25 #include "ngx_bpf.h" | |
26 | |
27 | |
28 END | |
29 } | |
30 | |
31 generate_tail() | |
32 { | |
33 cat << END | |
34 | |
35 ngx_bpf_program_t $PROGNAME = { | |
36 .relocs = bpf_reloc_prog_$funcname, | |
37 .nrelocs = sizeof(bpf_reloc_prog_$funcname) | |
38 / sizeof(bpf_reloc_prog_$funcname[0]), | |
39 .ins = bpf_insn_prog_$funcname, | |
40 .nins = sizeof(bpf_insn_prog_$funcname) | |
41 / sizeof(bpf_insn_prog_$funcname[0]), | |
42 .license = "$LICENSE", | |
43 .type = BPF_PROG_TYPE_SK_REUSEPORT, | |
44 }; | |
45 | |
46 END | |
47 } | |
48 | |
49 process_relocations() | |
50 { | |
51 echo "static ngx_bpf_reloc_t bpf_reloc_prog_$funcname[] = {" | |
52 | |
53 objdump -r $filename | awk '{ | |
54 | |
55 if (enabled && $NF > 0) { | |
56 off = strtonum(sprintf("0x%s", $1)); | |
57 name = $3; | |
58 | |
59 printf(" { \"%s\", %d },\n", name, off/8); | |
60 } | |
61 | |
62 if ($1 == "OFFSET") { | |
63 enabled=1; | |
64 } | |
65 }' | |
66 echo "};" | |
67 echo | |
68 } | |
69 | |
70 process_section() | |
71 { | |
72 echo "static struct bpf_insn bpf_insn_prog_$funcname[] = {" | |
73 echo " /* opcode dst src offset imm */" | |
74 | |
75 section_info=$(objdump -h $filename --section=$funcname | grep "1 $funcname") | |
76 | |
77 # dd doesn't know hex | |
78 length=$(printf "%d" 0x$(echo $section_info | cut -d ' ' -f3)) | |
79 offset=$(printf "%d" 0x$(echo $section_info | cut -d ' ' -f6)) | |
80 | |
81 for ins in $(dd if="$filename" bs=1 count=$length skip=$offset status=none | xxd -p -c 8) | |
82 do | |
83 opcode=0x${ins:0:2} | |
84 srcdst=0x${ins:2:2} | |
85 | |
86 # bytes are dumped in LE order | |
87 offset=0x${ins:6:2}${ins:4:2} # short | |
88 immedi=0x${ins:14:2}${ins:12:2}${ins:10:2}${ins:8:2} # int | |
89 | |
90 dst="$(($srcdst & 0xF))" | |
91 src="$(($srcdst & 0xF0))" | |
92 src="$(($src >> 4))" | |
93 | |
94 opcode=$(printf "0x%x" $opcode) | |
95 dst=$(printf "BPF_REG_%d" $dst) | |
96 src=$(printf "BPF_REG_%d" $src) | |
97 offset=$(printf "%d" $offset) | |
98 immedi=$(printf "0x%x" $immedi) | |
99 | |
100 printf " { %4s, %11s, %11s, (int16_t) %6s, %10s },\n" $opcode $dst $src $offset $immedi | |
101 done | |
102 | |
103 cat << END | |
104 }; | |
105 | |
106 END | |
107 } | |
108 | |
109 generate_head | |
110 process_relocations | |
111 process_section | |
112 generate_tail | |
113 |