- 论坛徽章:
- 0
|
1. update kernel -> 4.10.8
2. make samples/bpf
3. ulimit -l 1024
4. try:
./tracex2 or ./sock_example
5. see jit result code:
sysctl net/core/bpf_jit_enable=2
dmesg ---> sock_example.txt
static int test_sock(void)
{
int sock = -1, map_fd, prog_fd, i, key;
long long value = 0, tcp_cnt, udp_cnt, icmp_cnt;
map_fd = bpf_create_map(BPF_MAP_TYPE_ARRAY, sizeof(key), sizeof(value),
256, 0);
if (map_fd < 0) {
printf("failed to create map '%s'\n", strerror(errno));
goto cleanup;
}
struct bpf_insn prog[] = {
BPF_MOV64_REG(BPF_REG_6, BPF_REG_1),
BPF_LD_ABS(BPF_B, ETH_HLEN + offsetof(struct iphdr, protocol) /* R0 = ip->proto */),
BPF_STX_MEM(BPF_W, BPF_REG_10, BPF_REG_0, -4), /* *(u32 *)(fp - 4) = r0 */
BPF_MOV64_REG(BPF_REG_2, BPF_REG_10),
BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, -4), /* r2 = fp - 4 */
BPF_LD_MAP_FD(BPF_REG_1, map_fd),
BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_map_lookup_elem),
BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, 0, 2),
BPF_MOV64_IMM(BPF_REG_1, 1), /* r1 = 1 */
BPF_RAW_INSN(BPF_STX | BPF_XADD | BPF_DW, BPF_REG_0, BPF_REG_1, 0, 0), /* xadd r0 += r1 */
BPF_MOV64_IMM(BPF_REG_0, 0), /* r0 = 0 */
BPF_EXIT_INSN(),
};
size_t insns_cnt = sizeof(prog) / sizeof(struct bpf_insn);
prog_fd = bpf_load_program(BPF_PROG_TYPE_SOCKET_FILTER, prog, insns_cnt,
"GPL", 0, bpf_log_buf, BPF_LOG_BUF_SIZE);
make tools/net
tools/net# ./bpf_jit_disasm sock_example.txt
163 bytes emitted from JIT compiler (pass:4, flen:13)
ffffffffc01fa69a + <x>:
0: push %rbp
1: mov %rsp,%rbp
4: sub $0x228,%rsp
b: mov %rbx,-0x228(%rbp)
12: mov %r13,-0x220(%rbp)
19: mov %r14,-0x218(%rbp)
20: mov %r15,-0x210(%rbp)
27: xor %eax,%eax
29: mov %rax,-0x208(%rbp)
30: mov 0x80(%rdi),%r9d
37: sub 0x84(%rdi),%r9d
3e: mov 0xd8(%rdi),%r10
45: mov %rdi,%rbx
48: mov $0x17,%esi
4d: callq 0xffffffffc3085283
52: mov %eax,-0x4(%rbp)
55: mov %rbp,%rsi
58: add $0xfffffffffffffffc,%rsi
5c: movabs $0xffff8f38c9c1c000,%rdi
66: push %r10
68: push %r9
6a: callq 0xffffffffc31941e6
6f: pop %r9
71: pop %r10
73: cmp $0x0,%rax
77: je 0x0000000000000083
79: mov $0x1,%edi
7e: lock add %rdi,0x0(%rax)
83: xor %eax,%eax
85: mov -0x228(%rbp),%rbx
8c: mov -0x220(%rbp),%r13
93: mov -0x218(%rbp),%r14
9a: mov -0x210(%rbp),%r15
a1: leaveq
a2: retq
|
|