comparison src/event/quic/bpf/bpfgen.sh @ 8269: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
8268:d3747ba486e7 8269: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