āĻļā§āϰā§āϤ⧠āĻāĻāĻāĻŋ āĻĒā§āϰāϝā§āĻā§āϤāĻŋ āĻāĻŋāϞ āĻāĻŦāĻ āϏā§āĻāĻŋāϰ āύāĻžāĻŽ āĻāĻŋāϞ āĻŦāĻŋāĻĒāĻŋāĻāĻĢāĨ¤ āĻāĻŽāϰāĻž āϤāĻžāϰ āĻĻāĻŋāĻā§ āϤāĻžāĻāĻžāϞāĻžāĻŽ , āĻāĻ āϏāĻŋāϰāĻŋāĻā§āϰ āĻāϞā§āĻĄ āĻā§āϏā§āĻāĻžāĻŽā§āύā§āĻ āύāĻŋāĻŦāύā§āϧ. 2013 āϏāĻžāϞā§, āĻāϞā§āĻā§āϏāĻŋ āϏā§āĻāĻžāϰā§āĻāϝāĻŧā§āĻāĻ āĻāĻŦāĻ āĻĄā§āϝāĻžāύāĻŋāϝāĻŧā§āϞ āĻŦā§āϰā§āĻāĻŽā§āϝāĻžāύā§āϰ āĻĒā§āϰāĻā§āώā§āĻāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§, āĻāĻāĻŋāϰ āĻāĻāĻāĻŋ āĻāύā§āύāϤ āϏāĻāϏā§āĻāϰāĻŖ, āĻāϧā§āύāĻŋāĻ 64-āĻŦāĻŋāĻ āĻŽā§āĻļāĻŋāύā§āϰ āĻāύā§āϝ āĻ āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ, āϝāĻž āϞāĻŋāύāĻžāĻā§āϏ āĻāĻžāϰā§āύā§āϞ⧠āĻ āύā§āϤāϰā§āĻā§āĻā§āϤ āĻāĻŦāĻ āĻ āύā§āϤāϰā§āĻā§āĻā§āϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ āĻāĻ āύāϤā§āύ āĻĒā§āϰāϝā§āĻā§āϤāĻŋāĻāĻŋāĻā§ āϏāĻāĻā§āώāĻŋāĻĒā§āϤāĻāĻžāĻŦā§ āĻ āĻā§āϝāύā§āϤāϰā§āĻŖ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻŦāϞāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ, āϤāĻžāϰāĻĒāϰ⧠āύāĻžāĻŽāĻāϰāĻŖ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āĻāĻā§āϏāĻā§āύā§āĻĄā§āĻĄ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ, āĻāĻŦāĻ āĻāĻāύ, āĻŦā§āĻļ āĻāϝāĻŧā§āĻ āĻŦāĻāϰ āĻĒāϰā§, āϏāĻŦāĻžāĻ āĻāĻāĻŋāĻā§ āĻā§āĻŦāϞ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻŦāϞā§āĨ¤
āĻŽā§āĻāĻžāĻŽā§āĻāĻŋāĻāĻžāĻŦā§ āĻŦāϞāϤ⧠āĻā§āϞā§, BPF āĻāĻĒāύāĻžāĻā§ āϞāĻŋāύāĻžāĻā§āϏ āĻāĻžāϰā§āύā§āϞ āϏā§āĻĒā§āϏ⧠āύāĻŋāϰā§āĻŦāĻŋāĻāĻžāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻĻā§āĻŦāĻžāϰāĻž āϏāϰāĻŦāϰāĻžāĻšāĻā§āϤ āĻā§āĻĄ āĻāĻžāϞāĻžāύā§āϰ āĻ āύā§āĻŽāϤāĻŋ āĻĻā§āϝāĻŧ āĻāĻŦāĻ āύāϤā§āύ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰāĻāĻŋ āĻāϤāĻāĻžāĻ āϏāĻĢāϞ āĻšāϝāĻŧā§āĻā§ āϝ⧠āĻāϰ āϏāĻŽāϏā§āϤ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻŦāϰā§āĻŖāύāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ āĻāϰāĻ āĻāĻ āĻĄāĻāύ āύāĻŋāĻŦāύā§āϧā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāĻŦā§āĨ¤ (āĻāĻāĻŽāĻžāϤā§āϰ āĻāĻŋāύāĻŋāϏ āϝāĻž āĻĄā§āĻā§āϞāĻĒāĻžāϰāϰāĻž āĻāĻžāϞ āĻāϰā§āύāĻŋ, āĻāĻĒāύāĻŋ āύā§āĻā§āϰ āĻāϰā§āĻŽāĻā§āώāĻŽāϤāĻž āĻā§āĻĄā§ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻā§āĻā§āύ, āĻāĻāĻāĻŋ āĻļāĻžāϞā§āύ āϞā§āĻā§ āϤā§āϰāĻŋ āĻāϰāĻž āĻāĻŋāϞāĨ¤)
āĻāĻ āύāĻŋāĻŦāύā§āϧāĻāĻŋ BPF āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ āĻŽā§āĻļāĻŋāύā§āϰ āĻāĻ āύ, BPF āĻāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻžāϰā§āύā§āϞ āĻāύā§āĻāĻžāϰāĻĢā§āϏ, āĻĄā§āĻā§āϞāĻĒāĻŽā§āύā§āĻ āĻā§āϞāϏ, āϏā§āĻāϏāĻžāĻĨā§ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻā§āώāĻŽāϤāĻžāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āϏāĻāĻā§āώāĻŋāĻĒā§āϤ, āĻā§āĻŦ āϏāĻāĻā§āώāĻŋāĻĒā§āϤ āĻāĻāĻžāϰāĻāĻŋāĻ āĻŦāϰā§āĻŖāύāĻž āĻāϰā§, āϝā§āĻŽāύ BPF āĻāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ āĻĒā§āϰāϝāĻŧā§āĻā§āϰ āĻāĻā§āϰ āĻ
āϧā§āϝāϝāĻŧāύā§āϰ āĻāύā§āϝ āĻāĻŦāĻŋāώā§āϝāϤ⧠āϝāĻž āϝāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāĻŦā§āĨ¤
āύāĻŋāĻŦāύā§āϧā§āϰ āϏāĻžāϰāĻžāĻāĻļ
āĻĒā§āϰāĻĨāĻŽā§, āĻāĻŽāϰāĻž BPF āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰā§āϰ āĻāĻāĻāĻŋ āĻĒāĻžāĻāĻŋāϰ āĻā§āĻā§āϰ āĻĻā§āώā§āĻāĻŋāĻāĻā§āĻāĻŋ āύā§āĻŦ āĻāĻŦāĻ āĻŽā§āϞ āĻāĻĒāĻžāĻĻāĻžāύāĻā§āϞāĻŋāϰ āϰā§āĻĒāϰā§āĻāĻž āĻĻā§āĻŦāĨ¤
āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āϏāĻžāĻŽāĻā§āϰāĻŋāĻāĻāĻžāĻŦā§ āϏā§āĻĨāĻžāĻĒāϤā§āϝ āϏāĻŽā§āĻĒāϰā§āĻā§ āϧāĻžāϰāĻŖāĻž āĻĨāĻžāĻāĻžāϝāĻŧ, āĻāĻŽāϰāĻž BPF āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ āĻŽā§āĻļāĻŋāύā§āϰ āĻāĻ āύ āĻŦāϰā§āĻŖāύāĻž āĻāϰāĻŦāĨ¤
āĻāĻ āĻŦāĻŋāĻāĻžāĻā§, āĻāĻŽāϰāĻž BPF āĻ āĻŦāĻā§āĻā§āĻ - āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻŦāĻ āĻŽāĻžāύāĻāĻŋāϤā§āϰāĻā§āϞāĻŋāϰ āĻā§āĻŦāύāĻāĻā§āϰāĻā§ āĻāύāĻŋāώā§āĻ āĻāĻžāĻŦā§ āĻĻā§āĻāĻŦāĨ¤
āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻāĻŋāĻā§ āĻŦā§āĻāĻžāϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§, āĻāĻŽāϰāĻž āĻ
āĻŦāĻļā§āώ⧠āĻĻā§āĻāĻŦ āĻā§āĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āώ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϏā§āĻĨāĻžāύ āĻĨā§āĻā§ āĻŦāϏā§āϤā§āĻā§āϞāĻŋ āϤā§āϰāĻŋ āĻāĻŦāĻ āĻŽā§āϝāĻžāύāĻŋāĻĒā§āϞā§āĻ āĻāϰāĻž āϝāĻžāϝāĻŧ - bpf(2).
āĻ
āĻŦāĻļā§āϝāĻ, āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞāĻŋāĻāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻŋāύā§āϤ⧠āĻāĻāĻž āĻāĻ āĻŋāύ. āĻāϰ⧠āĻŦāĻžāϏā§āϤāĻŦāϏāĻŽā§āĻŽāϤ āĻĻā§āĻļā§āϝā§āϰ āĻāύā§āϝ, āĻĒāĻžāϰāĻŽāĻžāĻŖāĻŦāĻŋāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻžāϰāϰāĻž āĻāĻāĻāĻŋ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϤā§āϰāĻŋ āĻāϰā§āĻā§ libbpf. āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻŽā§āϞāĻŋāĻ BPF āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻāĻā§āĻāĻžāϞ āϤā§āϰāĻŋ āĻāϰāĻŦ āϝāĻž āĻāĻŽāϰāĻž āĻĒāϰāĻŦāϰā§āϤ⧠āĻāĻĻāĻžāĻšāϰāĻŖāĻā§āϞāĻŋāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦāĨ¤
āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻļāĻŋāĻāĻŦ āĻāĻŋāĻāĻžāĻŦā§ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻāĻžāϰā§āύā§āϞ āĻšā§āϞā§āĻĒāĻžāϰ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠- āĻāĻāĻāĻŋ āĻā§āϞ āϝāĻž āĻŽāĻžāύāĻāĻŋāϤā§āϰ āϏāĻš, āĻŽā§āϞāĻŋāĻāĻāĻžāĻŦā§ āĻā§āϞāĻžāϏāĻŋāĻā§āϰ āϤā§āϞāύāĻžāϝāĻŧ āύāϤā§āύ BPF āĻāϰ āĻā§āώāĻŽāϤāĻžāĻā§āϞāĻŋāĻā§ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰā§ā§ˇ
āĻāĻ āĻŽā§āĻšā§āϰā§āϤā§, āĻāĻŽāϰāĻž āĻ āĻŋāĻ āĻā§āĻāĻžāĻŦā§ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŽāύ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ āϤāĻž āĻŦā§āĻāĻžāϰ āĻāύā§āϝ āĻāĻŽāϰāĻž āϝāĻĨā§āώā§āĻ āĻāĻžāύāĻŦāĨ¤ āĻāĻŦāĻ āĻāϏā§āύ āĻŽāĻšāĻžāύ āĻāĻŦāĻ āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āϝāĻžāĻāĻžāĻāĻāĻžāϰā§āϰ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋ āĻĻā§āϰā§āϤ āĻāĻāĻāĻŋ āĻĻā§āĻāϝāĻŧāĻž āϝāĻžāĻāĨ¤
āĻĒāϰā§āĻā§āώāĻžāϰ āĻāύā§āϝ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋ āĻāĻŦāĻ āĻāĻžāϰā§āύā§āϞ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻāϤā§āϰ āĻāϰāϤ⧠āĻšāϝāĻŧ āϏ⧠āĻŦāĻŋāώāϝāĻŧā§ āϏāĻšāĻžāϝāĻŧāϤāĻž āĻŦāĻŋāĻāĻžāĻāĨ¤
āύāĻŋāĻŦāύā§āϧā§āϰ āĻļā§āώā§, āϝāĻžāϰāĻž āĻāϤāĻĻā§āϰ āĻĒāĻĄāĻŧā§āĻā§āύ āϤāĻžāϰāĻž āĻ āύā§āĻĒā§āϰā§āϰāĻŖāĻžāĻĻāĻžāϝāĻŧāĻ āĻļāĻŦā§āĻĻāĻā§āϞāĻŋ āĻāĻŦāĻ āĻĒāϰāĻŦāϰā§āϤ⧠āύāĻŋāĻŦāύā§āϧāĻā§āϞāĻŋāϤ⧠āĻā§ āĻāĻāĻŦā§ āϤāĻžāϰ āĻāĻāĻāĻŋ āϏāĻāĻā§āώāĻŋāĻĒā§āϤ āĻŦāĻŋāĻŦāϰāĻŖ āĻĒāĻžāĻŦā§āύāĨ¤ āϝāĻžāĻĻā§āϰ āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻāϤāĻžāϰ āĻāύā§āϝ āĻ āĻĒā§āĻā§āώāĻž āĻāϰāĻžāϰ āĻāĻā§āĻāĻž āĻŦāĻž āĻā§āώāĻŽāϤāĻž āύā§āĻ āϤāĻžāĻĻā§āϰ āĻāύā§āϝ āĻāĻŽāϰāĻž āϏā§āĻŦ-āĻ āϧā§āϝāϝāĻŧāύā§āϰ āĻāύā§āϝ āĻŦā§āĻļ āĻāϝāĻŧā§āĻāĻāĻŋ āϞāĻŋāĻā§āĻ āϤāĻžāϞāĻŋāĻāĻžāĻā§āĻā§āϤ āĻāϰāĻŦāĨ¤
BPF āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰā§āϰ āĻĒāϰāĻŋāĻāĻŋāϤāĻŋ
āĻāĻŽāϰāĻž BPF āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻļā§āϰ⧠āĻāϰāĻžāϰ āĻāĻā§, āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻļā§āώ āĻŦāĻžāϰ āĻāϞā§āϞā§āĻ āĻāϰāĻŦ (āĻāĻš) , āϝāĻž RISC āĻŽā§āĻļāĻŋāύā§āϰ āĻāĻŦāĻŋāϰā§āĻāĻžāĻŦā§āϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻšāĻŋāϏāĻžāĻŦā§ āĻŦāĻŋāĻāĻļāĻŋāϤ āĻšāϝāĻŧā§āĻāĻŋāϞ āĻāĻŦāĻ āĻĻāĻā§āώ āĻĒā§āϝāĻžāĻā§āĻ āĻĢāĻŋāϞā§āĻāĻžāϰāĻŋāĻāϝāĻŧā§āϰ āϏāĻŽāϏā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ āĻāϰā§āĻāĻŋāϞāĨ¤ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰāĻāĻŋ āĻāϤāĻāĻžāĻ āϏāĻĢāϞ āĻšāϝāĻŧā§ āĻāĻ ā§āĻā§ āϝā§, āĻŦāĻžāϰā§āĻāϞ⧠āĻāĻāύāĻŋāĻā§āϏ-āĻāϰ āύāĻŦā§āĻŦāĻāϝāĻŧā§āϰ āĻĻāĻļāĻā§ āĻāύā§āĻŽ āύā§āĻāϝāĻŧāĻžāϰ āĻĒāϰā§, āĻāĻāĻŋ āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ āĻĒāĻžāϰā§āĻāĻŋāĻ āϏāĻŋāϏā§āĻā§āĻŽā§ āĻĒā§āϰā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ, āĻŦāĻŋāĻļā§āϰ āĻĻāĻļāĻā§ āĻāĻŋāĻā§ āĻāĻŋāϞ āĻāĻŦāĻ āĻāĻāύāĻ āύāϤā§āύ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻā§āĻāĻā§ āĻĒāĻžāĻā§āĻā§āĨ¤
64-āĻŦāĻŋāĻ āĻŽā§āĻļāĻŋāύā§āϰ āϏāϰā§āĻŦāĻŦā§āϝāĻžāĻĒā§āϤāĻž, āĻā§āϞāĻžāĻāĻĄ āĻĒāϰāĻŋāώā§āĻŦāĻž āĻāĻŦāĻ SDN āϤā§āϰāĻŋāϰ āĻāύā§āϝ āϏāϰāĻā§āĻāĻžāĻŽāĻā§āϞāĻŋāϰ āĻŦāϰā§āϧāĻŋāϤ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧāϤāĻžāϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āĻšāĻŋāϏāĻžāĻŦā§ āύāϤā§āύ BPF āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ (SāĻ āĻĢāĻžāϰ-dāĻāĻĢāĻžāĻāύāĻĄ nāĻāĻžāĻ āĻāϰāĻž)āĨ¤ āĻā§āϞāĻžāϏāĻŋāĻ BPF-āĻāϰ āĻāĻāĻāĻŋ āĻāύā§āύāϤ āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻžāϰā§āύā§āϞ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻāĻā§āĻāĻŋāύāĻŋāϝāĻŧāĻžāϰāĻĻā§āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻŦāĻŋāĻāĻļāĻŋāϤ, āύāϤā§āύ BPF āĻāĻā§āώāϰāĻŋāĻāĻāĻžāĻŦā§ āĻāϝāĻŧ āĻŽāĻžāϏ āĻĒāϰ⧠āϞāĻŋāύāĻžāĻā§āϏ āϏāĻŋāϏā§āĻā§āĻŽāĻā§āϞāĻŋāĻā§ āĻā§āϰā§āϏ āĻāϰāĻžāϰ āĻāĻ āĻŋāύ āĻāĻžāĻā§ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύāĻā§āϞāĻŋ āĻā§āĻāĻā§ āĻĒā§āϝāĻŧā§āĻāĻŋāϞ, āĻāĻŦāĻ āĻāĻāύ, āĻāϰ āĻāĻĒāϏā§āĻĨāĻŋāϤāĻŋāϰ āĻāϝāĻŧ āĻŦāĻāϰ āĻĒāϰā§, āĻāĻŽāĻžāĻĻā§āϰ āĻāĻāĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻĒāϰāĻŦāϰā§āϤ⧠āύāĻŋāĻŦāύā§āϧ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāĻŦā§ āĻŦāĻŋāĻāĻŋāύā§āύ āϧāϰāĻŖā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϤāĻžāϞāĻŋāĻāĻžāĻā§āĻā§āϤ āĻāϰā§āύāĨ¤
āĻŽāĻāĻžāϰ āĻāĻŦāĻŋ
āĻāϰ āĻŽā§āϞ āĻ āĻāĻļā§, BPF āĻšāϞ āĻāĻāĻāĻŋ āϏā§āϝāĻžāύā§āĻĄāĻŦāĻā§āϏ āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ āĻŽā§āĻļāĻŋāύ āϝāĻž āĻāĻĒāύāĻžāĻā§ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻžāϰ āϏāĻžāĻĨā§ āĻāĻĒā§āϏ āύāĻž āĻāϰ⧠āĻāĻžāϰā§āύā§āϞ āϏā§āĻĒā§āϏ⧠"āϏā§āĻŦā§āĻā§āĻāĻžāĻāĻžāϰā§" āĻā§āĻĄ āĻāĻžāϞāĻžāύā§āϰ āĻ āύā§āĻŽāϤāĻŋ āĻĻā§āϝāĻŧāĨ¤ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻāĻāĻāĻžāϰ āϏā§āĻĒā§āϏ⧠āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧ, āĻāĻžāϰā§āύā§āϞ⧠āϞā§āĻĄ āĻāϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āĻāĻŋāĻā§ āĻāĻā§āύā§āĻ āϏā§āϰā§āϏā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ āĻĨāĻžāĻā§āĨ¤ āĻāĻāĻāĻŋ āĻāĻā§āύā§āĻ āĻšāϤ⧠āĻĒāĻžāϰā§, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻāĻāĻŋ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏ⧠āĻāĻāĻāĻŋ āĻĒā§āϝāĻžāĻā§āĻ āϏāϰāĻŦāϰāĻžāĻš āĻāϰāĻž, āĻāĻŋāĻā§ āĻāĻžāϰā§āύā§āϞ āĻĢāĻžāĻāĻļāύ āĻāĻžāϞ⧠āĻāϰāĻž āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤ āĻāĻāĻāĻŋ āĻĒā§āϝāĻžāĻā§āĻā§āϰ āĻā§āώā§āϤā§āϰā§, BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻĒā§āϝāĻžāĻā§āĻā§āϰ āĻĄā§āĻāĻž āĻāĻŦāĻ āĻŽā§āĻāĻžāĻĄā§āĻāĻž āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻĨāĻžāĻāĻŦā§ (āĻĒāĻĄāĻŧāĻžāϰ āĻāύā§āϝ āĻāĻŦāĻ āϏāĻŽā§āĻāĻŦāϤ āϞā§āĻāĻžāϰ āĻāύā§āϝ, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āϧāϰāĻŖā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰā§); āĻāĻāĻāĻŋ āĻāĻžāϰā§āύā§āϞ āĻĢāĻžāĻāĻļāύ āĻāĻžāϞāĻžāύā§āϰ āĻā§āώā§āϤā§āϰā§, āĻāϰ āĻāϰā§āĻā§āĻŽā§āύā§āĻāĻā§āϞāĻŋ āĻāĻžāϰā§āύā§āϞ āĻŽā§āĻŽāϰāĻŋ, āĻāϤā§āϝāĻžāĻĻāĻŋ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āϏāĻš āĻĢāĻžāĻāĻļāύ
āĻāϏā§āύ āĻāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāĻŋ āĻāύāĻŋāώā§āĻ āĻāĻžāĻŦā§ āĻĻā§āĻā§ āύā§āĻāϝāĻŧāĻž āϝāĻžāĻāĨ¤ āĻļā§āϰ⧠āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāϏā§āύ āĻā§āϞāĻžāϏāĻŋāĻ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĨā§āĻā§ āĻĒā§āϰāĻĨāĻŽ āĻĒāĻžāϰā§āĻĨāĻā§āϝ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĨāĻž āĻŦāϞāĻŋ, āϝ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻ ā§āϝāĻžāϏā§āĻŽā§āĻŦāϞāĻžāϰ⧠āϞā§āĻāĻž āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ āύāϤā§āύ āϏāĻāϏā§āĻāϰāĻŖā§, āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰāĻāĻŋ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ āϝāĻžāϤ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻāĻā§āĻ-āϏā§āϤāϰā§āϰ āĻāĻžāώāĻžāϝāĻŧ āϞā§āĻāĻž āϝāĻžāϝāĻŧ, āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻāĻāĻžāĻŦā§, āĻ āĻŦāĻļā§āϝāĻ, āϏāĻŋ-āϤā§āĨ¤ āĻāϰ āĻāύā§āϝ, llvm-āĻāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻŦā§āϝāĻžāĻāĻāύā§āĻĄ āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ, āϝāĻž āĻāĻĒāύāĻžāĻā§ BPF āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻŦāĻžāĻāĻāĻā§āĻĄ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĻā§āϝāĻŧāĨ¤

BPF āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰāĻāĻŋ āĻĄāĻŋāĻāĻžāĻāύ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ, āĻāĻāĻļāĻŋāĻāĻāĻžāĻŦā§, āĻāϧā§āύāĻŋāĻ āĻŽā§āĻļāĻŋāύ⧠āĻĻāĻā§āώāϤāĻžāϰ āϏāĻžāĻĨā§ āĻāĻžāϞāĻžāύā§āϰ āĻāύā§āϝāĨ¤ āĻāĻ āĻāĻžāĻāĻāĻŋ āĻŦāĻžāϏā§āϤāĻŦā§ āĻāϰāĻžāϰ āĻāύā§āϝ, BPF āĻŦāĻžāĻāĻāĻā§āĻĄ, āĻāĻāĻŦāĻžāϰ āĻāĻžāϰā§āύā§āϞ⧠āϞā§āĻĄ āĻāϰāĻž āĻšāϞā§, āĻāĻāĻāĻŋ JIT āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ (JUst In Time)āĨ¤ āĻĒāϰāĻŦāϰā§āϤā§, āϝāĻĻāĻŋ āĻāĻĒāύāĻŋ āĻŽāύ⧠āĻāϰā§āύ, āĻā§āϞāĻžāϏāĻŋāĻ BPF-āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻžāϰā§āύā§āϞ⧠āϞā§āĻĄ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ āĻāĻŦāĻ āĻāĻā§āύā§āĻ āĻāϤā§āϏā§āϰ āϏāĻžāĻĨā§ āĻĒāĻžāϰāĻŽāĻžāĻŖāĻŦāĻŋāĻāĻāĻžāĻŦā§ āϏāĻāϝā§āĻā§āϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ - āĻāĻāĻāĻŋ āĻāĻāĻ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞā§āϰ āĻĒā§āϰāϏāĻā§āĻā§āĨ¤ āύāϤā§āύ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰā§, āĻāĻāĻŋ āĻĻā§āĻāĻŋ āĻĒāϰā§āϝāĻžāϝāĻŧā§ āĻāĻā§ - āĻĒā§āϰāĻĨāĻŽāϤ, āĻā§āĻĄāĻāĻŋ āĻāĻāĻāĻŋ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻžāϰā§āύā§āϞ⧠āϞā§āĻĄ āĻāϰāĻž āĻšāϝāĻŧ bpf(2)āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰā§, āĻĒāϰāĻŦāϰā§āϤā§āϤā§, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻĒā§āϰāĻāĻžāϰā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻ
āύā§āϝāĻžāύā§āϝ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻā§āύā§āĻ āĻāϤā§āϏā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ āĻāϰā§āĨ¤
āĻāĻāĻžāύ⧠āĻĒāĻžāĻ āĻā§āϰ āĻāĻāĻāĻŋ āĻĒā§āϰāĻļā§āύ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§: āĻāĻāĻž āĻāĻŋ āϏāĻŽā§āĻāĻŦ āĻāĻŋāϞ? āĻāĻŋāĻāĻžāĻŦā§ āĻāĻ āϧāϰāύā§āϰ āĻā§āĻĄ āĻāĻžāϰā§āϝāĻāϰ āĻāϰāĻžāϰ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧ? āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞā§āĻĄ āĻāϰāĻžāϰ āĻĒāϰā§āϝāĻžāϝāĻŧ āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāϰā§āĻŦāĻžāĻšā§āϰ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧ āϝāĻžāĻā§ āĻā§āϰāĻŋāĻĢāĻžāϝāĻŧāĻžāϰ āĻŦāϞāĻž āĻšāϝāĻŧ (āĻāĻāϰā§āĻāĻŋāϤ⧠āĻāĻ āĻĒāϰā§āϝāĻžāϝāĻŧāĻāĻŋāĻā§ āĻā§āϰāĻŋāĻĢāĻžāϝāĻŧāĻžāϰ āĻŦāϞāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āĻāĻŽāĻŋ āĻāĻāϰā§āĻāĻŋ āĻļāĻŦā§āĻĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĨāĻžāĻāĻŦ):

āϝāĻžāĻāĻžāĻāĻāĻžāϰ⧠āĻāĻāĻāĻŋ āϏā§āĻā§āϝāĻžāĻāĻŋāĻ āĻŦāĻŋāĻļā§āϞā§āώāĻ āϝāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰ⧠āϝ⧠āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻžāϰā§āύā§āϞā§āϰ āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻā§āϰāĻŋāϝāĻŧāĻžāĻāϞāĻžāĻĒāĻā§ āĻŦā§āϝāĻžāĻšāϤ āĻāϰ⧠āύāĻžāĨ¤ āϝāĻžāĻāĻšā§āĻ, āĻāϰ āĻ āϰā§āĻĨ āĻāĻ āύāϝāĻŧ āϝ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻā§āϰāĻŋāϝāĻŧāĻžāĻāϞāĻžāĻĒā§ āĻšāϏā§āϤāĻā§āώā§āĻĒ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āύāĻž - BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ, āĻĒā§āϰāĻāĻžāϰā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰā§, āĻāĻžāϰā§āύā§āϞ āĻŽā§āĻŽāϰāĻŋāϰ āĻŦāĻŋāĻāĻžāĻāĻā§āϞāĻŋ āĻĒāĻĄāĻŧāϤ⧠āĻāĻŦāĻ āĻĒā§āύāϰā§āϞāĻŋāĻāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§, āĻĢāĻžāĻāĻļāύā§āϰ āĻŽāĻžāύāĻā§āϞāĻŋ āĻĢā§āϰāϤ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§, āĻāĻžāĻāĻāĻž, āϏāĻāϝā§āĻāύ, āĻĒā§āύāϰā§āϞāĻŋāĻāύ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻāĻŦāĻ āĻāĻŽāύāĻāĻŋ āĻĢāϰā§āϝāĻŧāĻžāϰā§āĻĄ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻĒā§āϝāĻžāĻā§āĻāĨ¤ āϝāĻžāĻāĻžāĻāĻāĻžāϰ⧠āĻā§āϝāĻžāϰāĻžāύā§āĻāĻŋ āĻĻā§āϝāĻŧ āϝ⧠āĻāĻāĻāĻŋ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻžāϞāĻžāϞ⧠āĻāĻžāϰā§āύā§āϞāĻāĻŋ āĻā§āϰā§āϝāĻžāĻļ āĻšāĻŦā§ āύāĻž āĻāĻŦāĻ āϝ⧠āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§, āύāĻŋāϝāĻŧāĻŽ āĻ āύā§āϏāĻžāϰā§, āϞā§āĻāĻžāϰ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āϰāϝāĻŧā§āĻā§, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻāĻāĻŋ āĻŦāĻšāĻŋāϰā§āĻāĻžāĻŽā§ āĻĒā§āϝāĻžāĻā§āĻā§āϰ āĻĄā§āĻāĻž, āĻĒā§āϝāĻžāĻā§āĻā§āϰ āĻŦāĻžāĻāϰ⧠āĻāĻžāϰā§āύā§āϞ āĻŽā§āĻŽāϰāĻŋāĻā§ āĻāĻāĻžāϰāϰāĻžāĻāĻ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻšāĻŦā§ āύāĻžāĨ¤ āĻāĻŽāϰāĻž BPF āĻāϰ āĻ āύā§āϝāĻžāύā§āϝ āϏāĻŽāϏā§āϤ āĻāĻĒāĻžāĻĻāĻžāύāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻĒāϰāĻŋāĻāĻŋāϤ āĻšāĻāϝāĻŧāĻžāϰ āĻĒāϰ⧠āϏāĻāĻļā§āϞāĻŋāώā§āĻ āĻŦāĻŋāĻāĻžāĻā§ āĻāϰāĻ āĻāĻāĻā§ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤāĻāĻžāĻŦā§ āϝāĻžāĻāĻžāĻāĻāĻžāϰā§āĻā§ āĻĻā§āĻāĻŦāĨ¤
āϤāĻžāĻšāϞ⧠āĻāĻŽāϰāĻž āĻ āĻĒāϰā§āϝāύā§āϤ āĻā§ āĻļāĻŋāĻā§āĻāĻŋ? āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏāĻŋ-āϤ⧠āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞā§āĻā§, āĻāĻāĻāĻŋ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻŋ āĻāĻžāϰā§āύā§āϞ⧠āϞā§āĻĄ āĻāϰ⧠bpf(2), āϝā§āĻāĻžāύ⧠āĻāĻāĻŋ āĻāĻāĻāĻŋ āϝāĻžāĻāĻžāĻāĻāĻžāϰ⧠āĻĻā§āĻŦāĻžāϰāĻž āĻā§āĻ āĻāϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āύā§āĻāĻŋāĻ āĻŦāĻžāĻāĻāĻā§āĻĄā§ āĻ
āύā§āĻŦāĻžāĻĻ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āϤāĻžāϰāĻĒāϰ⧠āĻāĻāĻ āĻŦāĻž āĻ
āύā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāĻā§ āĻāĻā§āύā§āĻ āĻāϤā§āϏā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ āĻāϰ⧠āĻāĻŦāĻ āĻāĻāĻŋ āĻāĻžāϰā§āϝāĻāϰ āĻāϰāĻž āĻļā§āϰ⧠āĻāϰā§āĨ¤ āĻŦāĻŋāĻāĻŋāύā§āύ āĻāĻžāϰāĻŖā§ āĻŦā§āĻ āĻāĻŦāĻ āϏāĻāϝā§āĻ āĻāϞāĻžāĻĻāĻž āĻāϰāĻž āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤ āĻĒā§āϰāĻĨāĻŽāϤ, āĻāĻāĻāĻŋ āĻā§āϰāĻŋāĻĢāĻžāϝāĻŧāĻžāϰ āĻāĻžāϞāĻžāύ⧠āϤā§āϞāύāĻžāĻŽā§āϞāĻāĻāĻžāĻŦā§ āĻŦā§āϝāϝāĻŧāĻŦāĻšā§āϞ āĻāĻŦāĻ āĻāĻāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻāĻžāϧāĻŋāĻāĻŦāĻžāϰ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰ⧠āĻāĻŽāϰāĻž āĻāĻŽā§āĻĒāĻŋāĻāĻāĻžāϰā§āϰ āϏāĻŽāϝāĻŧ āύāώā§āĻ āĻāϰāĻŋāĨ¤ āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧāϤ, āĻ āĻŋāĻ āĻā§āĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϏāĻāϝā§āĻā§āϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āϤāĻž āύāĻŋāϰā§āĻāϰ āĻāϰ⧠āϤāĻžāϰ āĻĒā§āϰāĻāĻžāϰā§āϰ āĻāĻĒāϰ, āĻāĻŦāĻ āĻāĻ āĻŦāĻāϰ āĻāĻā§ āĻŦāĻŋāĻāĻļāĻŋāϤ āĻāĻāĻāĻŋ "āϏāϰā§āĻŦāĻāύā§āύ" āĻāύā§āĻāĻžāϰāĻĢā§āϏ āύāϤā§āύ āϧāϰāύā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāύā§āϝ āĻāĻĒāϝā§āĻā§āϤ āύāĻžāĻ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ (āϝāĻĻāĻŋāĻ āĻāĻāύ āϏā§āĻĨāĻžāĻĒāϤā§āϝ āĻāϰāĻ āĻĒāϰāĻŋāĻĒāĻā§āĻ āĻšāϝāĻŧā§ āĻāĻ āĻā§, āĻāĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏāĻāĻŋāĻā§ āϏā§āϤāϰ⧠āĻāĻā§āĻā§āϤ āĻāϰāĻžāϰ āĻāĻāĻāĻŋ āϧāĻžāϰāĻŖāĻž āϰāϝāĻŧā§āĻā§ libbpf.)
āĻŽāύā§āϝā§āĻā§ āĻĒāĻžāĻ āĻ āϞāĻā§āώā§āϝ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āϝ⧠āĻāĻŽāϰāĻž āĻāĻāύāĻ āĻāĻŦāĻŋ āĻĻāĻŋāϝāĻŧā§ āĻļā§āώ āĻāϰāĻŋāύāĻŋāĨ¤ āĻĒā§āϰāĻā§āϤāĻĒāĻā§āώā§, āĻāĻĒāϰā§āϰ āϏāĻŦāĻā§āϞāĻŋ āĻŦā§āϝāĻžāĻā§āϝāĻž āĻāϰ⧠āύāĻž āĻā§āύ BPF āĻŽā§āϞāĻŋāĻāĻāĻžāĻŦā§ āĻā§āϞāĻžāϏāĻŋāĻ BPF āĻāϰ āϤā§āϞāύāĻžāϝāĻŧ āĻāĻŦāĻŋ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰā§āĨ¤ āĻĻā§āĻāĻŋ āĻāĻĻā§āĻāĻžāĻŦāύ āϝāĻž āĻāϞā§āϞā§āĻāϝā§āĻā§āϝāĻāĻžāĻŦā§ āĻĒā§āϰāϝā§āĻā§āϝāϤāĻžāϰ āϏā§āϝā§āĻāĻā§ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰ⧠āϤāĻž āĻšāϞ āĻļā§āϝāĻŧāĻžāϰā§āĻĄ āĻŽā§āĻŽāϰāĻŋ āĻāĻŦāĻ āĻāĻžāϰā§āύā§āϞ āĻšā§āϞā§āĻĒāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻā§āώāĻŽāϤāĻžāĨ¤ BPF-āĻ, āĻāĻžāĻ āĻāϰāĻž āĻŽā§āĻŽāϰāĻŋ āϤāĻĨāĻžāĻāĻĨāĻŋāϤ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĒā§āϰāϝāĻŧā§āĻ āĻāϰāĻž āĻšāϝāĻŧ - āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ API āĻāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻž āĻĄā§āĻāĻž āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰāĨ¤ āϤāĻžāϰāĻž āϏāĻŽā§āĻāĻŦāϤ āĻāĻ āύāĻžāĻŽāĻāĻŋ āĻĒā§āϝāĻŧā§āĻā§ āĻāĻžāϰāĻŖ āĻĒā§āϰāĻĨāĻŽ āϧāϰāĻŖā§āϰ āĻŽāĻžāύāĻāĻŋāϤā§āϰāĻāĻŋ āĻāĻāĻāĻŋ āĻšā§āϝāĻžāĻļ āĻā§āĻŦāĻŋāϞ āĻāĻŋāϞāĨ¤ āϤāĻžāϰāĻĒāϰ⧠āĻ ā§āϝāĻžāϰ⧠āĻāĻĒāϏā§āĻĨāĻŋāϤ āĻšāϝāĻŧ, āϏā§āĻĨāĻžāύā§āϝāĻŧ (āĻĒā§āϰāϤāĻŋ-āϏāĻŋāĻĒāĻŋāĻāĻ) āĻšā§āϝāĻžāĻļ āĻā§āĻŦāĻŋāϞ āĻāĻŦāĻ āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻ ā§āϝāĻžāϰā§, āĻ āύā§āϏāύā§āϧāĻžāύ āĻāĻžāĻ, āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāϰ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āϏāĻš āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻāĻŦāĻ āĻāϰāĻ āĻ āύā§āĻ āĻāĻŋāĻā§āĨ¤ āĻāĻāύ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āϝāĻž āĻāĻāϰā§āώāĻŖā§āϝāĻŧ āϤāĻž āĻšāϞ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāϰ āĻāĻāύ āĻāϞāĻā§āϞāĻŋāϰ āĻŽāϧā§āϝ⧠āϏā§āĻĨāĻŋāϤāĻŋ āĻŦāĻāĻžāϝāĻŧ āϰāĻžāĻāĻžāϰ āĻāĻŦāĻ āĻ āύā§āϝāĻžāύā§āϝ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϏā§āĻĨāĻžāύā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻā§āώāĻŽāϤāĻž āϰāϝāĻŧā§āĻā§ā§ˇ
āĻāĻāĻāĻŋ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻĨā§āĻā§ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāĻž āĻšāϝāĻŧ bpf(2), āĻāĻŦāĻ āϏāĻžāĻšāĻžāϝā§āϝāĻāĻžāϰ⧠āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻžāϰā§āύā§āϞ⧠āĻāϞāĻŽāĻžāύ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĨā§āĻā§āĨ¤ āϤāĻĻā§āĻĒāϰāĻŋ, āϏāĻžāĻšāĻžāϝā§āϝāĻāĻžāϰā§āϰāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝāĻ āύāϝāĻŧ, āĻ
āύā§āϝāĻžāύā§āϝ āĻāĻžāϰā§āύā§āϞ āĻā§āώāĻŽāϤāĻžāĻā§āϞāĻŋ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāĻžāϰ āĻāύā§āϝāĻ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύāĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻ
āύā§āϝāĻžāύā§āϝ āĻāύā§āĻāĻžāϰāĻĢā§āϏ⧠āĻĒā§āϝāĻžāĻā§āĻ āĻĢāϰā§āϝāĻŧāĻžāϰā§āĻĄ āĻāϰāϤā§, āĻĒāĻžāϰāĻĢ āĻāĻā§āύā§āĻ āϤā§āϰāĻŋ āĻāϰāϤā§, āĻāĻžāϰā§āύā§āϞ āĻāĻžāĻ āĻžāĻŽā§ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āĻāĻŦāĻ āĻāϰāĻ āĻ
āύā§āĻ āĻāĻŋāĻā§ āĻāϰāϤ⧠āϏāĻšāĻžāϝāĻŧāĻ āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤

āϏāĻāĻā§āώā§āĻĒā§, BPF āύāĻŋāϰā§āĻŦāĻŋāĻāĻžāϰ⧠āϞā§āĻĄ āĻāϰāĻžāϰ āĻā§āώāĻŽāϤāĻž āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§, āϝā§āĻŽāύ, āϝāĻžāĻāĻžāĻāĻāĻžāϰā§-āĻĒāϰā§āĻā§āώāĻŋāϤ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻā§āĻĄ āĻāĻžāϰā§āύā§āϞ āϏā§āĻĒā§āϏā§āĨ¤ āĻāĻ āĻā§āĻĄāĻāĻŋ āĻāϞā§āϰ āĻŽāϧā§āϝ⧠āϰāĻžāĻā§āϝ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϏā§āĻĨāĻžāύā§āϰ āϏāĻžāĻĨā§ āĻĄā§āĻāĻž āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻāĻŦāĻ āĻāĻ āϧāϰāύā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĻā§āĻŦāĻžāϰāĻž āĻ āύā§āĻŽā§āĻĻāĻŋāϤ āĻāĻžāϰā§āύā§āϞ āϏāĻžāĻŦāϏāĻŋāϏā§āĻā§āĻŽā§ āĻ ā§āϝāĻžāĻā§āϏā§āϏāĻ āϰāϝāĻŧā§āĻā§āĨ¤
āĻāĻāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āĻāĻžāϰā§āύā§āϞ āĻŽāĻĄāĻŋāĻāϞ āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāĻĻāϤā§āϤ āĻā§āώāĻŽāϤāĻžāĻā§āϞāĻŋāϰ āĻ āύā§āϰā§āĻĒ, āϝāĻžāϰ āϤā§āϞāύāĻžāϝāĻŧ BPF āĻāϰ āĻāĻŋāĻā§ āϏā§āĻŦāĻŋāϧāĻž āϰāϝāĻŧā§āĻā§ (āĻ āĻŦāĻļā§āϝāĻ, āĻāĻĒāύāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻ āύā§āϰā§āĻĒ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύāĻā§āϞāĻŋāϰ āϤā§āϞāύāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āϏāĻŋāϏā§āĻā§āĻŽ āĻā§āϰā§āϏāĻŋāĻ - āĻāĻĒāύāĻŋ BPF āĻāϰ āϏāĻžāĻĨā§ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻŦāĻŋāĻāĻžāϰ⧠āĻĄā§āϰāĻžāĻāĻāĻžāϰ āϞāĻŋāĻāϤ⧠āĻĒāĻžāϰāĻŦā§āύ āύāĻž)āĨ¤ āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āύāĻŋāĻŽā§āύ āĻāύā§āĻā§āϰāĻŋ āĻĨā§āϰā§āĻļāĻšā§āϞā§āĻĄ āύā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ (āĻāĻŋāĻā§ āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋ āϝāĻž BPF āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāĻžāϰā§āύā§āϞ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āĻĻāĻā§āώāϤāĻž āĻŦāĻž āϏāĻžāϧāĻžāϰāĻŖāĻāĻžāĻŦā§ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻŋāĻ āĻĻāĻā§āώāϤāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāϝāĻŧ āύāĻž), āϰāĻžāύāĻāĻžāĻāĻŽ āύāĻŋāϰāĻžāĻĒāϤā§āϤāĻž (āϝāĻžāϰāĻž āϞā§āĻāĻžāϰ āϏāĻŽāϝāĻŧ āϏāĻŋāϏā§āĻā§āĻŽāĻāĻŋ āĻāĻžāĻā§āĻā§āύāύāĻŋ āϤāĻžāĻĻā§āϰ āĻāύā§āϝ āĻŽāύā§āϤāĻŦā§āϝ⧠āĻāĻĒāύāĻžāϰ āĻšāĻžāϤ āĻŦāĻžāĻĄāĻŧāĻžāύ) āĻŦāĻž āĻā§āϏā§āĻāĻŋāĻ āĻŽāĻĄāĻŋāĻāϞ), āĻ ā§āϝāĻžāĻāĻŽāĻŋāϏāĻŋāĻāĻŋ - āĻŽāĻĄāĻŋāĻāϞ āĻĒā§āύāϰāĻžāϝāĻŧ āϞā§āĻĄ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻĄāĻžāĻāύāĻāĻžāĻāĻŽ āĻĨāĻžāĻā§ āĻāĻŦāĻ BPF āϏāĻžāĻŦāϏāĻŋāϏā§āĻā§āĻŽ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰ⧠āϝ⧠āĻā§āύ⧠āĻāĻā§āύā§āĻ āĻŽāĻŋāϏ āύāĻž āĻšāϝāĻŧ (āύā§āϝāĻžāϝā§āϝāĻāĻžāĻŦā§ āĻŦāϞāϤ⧠āĻā§āϞā§, āĻāĻāĻŋ āϏāĻŦ āϧāϰāύā§āϰ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāύā§āϝ āϏāϤā§āϝ āύāϝāĻŧ)āĨ¤
āĻāĻ āϧāϰāύā§āϰ āĻā§āώāĻŽāϤāĻžāϰ āĻāĻĒāϏā§āĻĨāĻŋāϤāĻŋ BPF āĻā§ āĻāĻžāϰā§āύā§āϞ āϏāĻŽā§āĻĒā§āϰāϏāĻžāϰāĻŖā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϏāĻžāϰā§āĻŦāĻāύā§āύ āĻšāĻžāϤāĻŋāϝāĻŧāĻžāϰ āĻāϰ⧠āϤā§āϞā§, āϝāĻž āĻ āύā§āĻļā§āϞāύ⧠āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§: BPF-āϤ⧠āĻāϰāĻ āĻŦā§āĻļāĻŋ āĻŦā§āĻļāĻŋ āύāϤā§āύ āϧāϰāύā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϝā§āĻā§āϤ āĻāϰāĻž āĻšāĻā§āĻā§, āĻāϰāĻ āĻŦā§āĻļāĻŋ āϏāĻāĻā§āϝāĻ āĻŦāĻĄāĻŧ āĻā§āĻŽā§āĻĒāĻžāύāĻŋ 24Ã7 āϝā§āĻĻā§āϧ āϏāĻžāϰā§āĻāĻžāϰ⧠BPF āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āĻāϰāĻ āĻŦā§āĻļāĻŋ āĻāϰ⧠āϏā§āĻāĻžāϰā§āĻāĻāĻĒāĻā§āϞāĻŋ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ-āĻāϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āĻāĻŽāύ āϏāĻŽāĻžāϧāĻžāύāĻā§āϞāĻŋāϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āϤāĻžāĻĻā§āϰ āĻŦā§āϝāĻŦāϏāĻž āϤā§āϰāĻŋ āĻāϰā§āĨ¤ BPF āϏāϰā§āĻŦāϤā§āϰ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧ: DDoS āĻāĻā§āϰāĻŽāĻŖ āĻĨā§āĻā§ āϰāĻā§āώāĻž āĻāϰāϤā§, SDN āϤā§āϰāĻŋ āĻāϰāϤ⧠(āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻā§āĻŦāĻžāϰāύā§āĻā§āϰ āĻāύā§āϝ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ), āĻĒā§āϰāϧāĻžāύ āϏāĻŋāϏā§āĻā§āĻŽ āĻā§āϰā§āϏāĻŋāĻ āĻā§āϞ āĻāĻŦāĻ āĻĒāϰāĻŋāϏāĻāĻā§āϝāĻžāύ āϏāĻāĻā§āϰāĻžāĻšāĻ āĻšāĻŋāϏāĻžāĻŦā§, āĻ āύā§āĻĒā§āϰāĻŦā§āĻļ āϏāύāĻžāĻā§āϤāĻāϰāĻŖ āϏāĻŋāϏā§āĻā§āĻŽ āĻāĻŦāĻ āϏā§āϝāĻžāύā§āĻĄāĻŦāĻā§āϏ āϏāĻŋāϏā§āĻā§āĻŽā§ āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤
āĻāϏā§āύ āύāĻŋāĻŦāύā§āϧāĻāĻŋāϰ āĻāĻāĻžāϰāĻāĻŋāĻ āĻ āĻāĻļāĻāĻŋ āĻāĻāĻžāύ⧠āĻļā§āώ āĻāϰāĻŋ āĻāĻŦāĻ āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ āĻŽā§āĻļāĻŋāύ āĻāĻŦāĻ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻāĻā§āϏāĻŋāϏā§āĻā§āĻŽāĻā§ āĻāϰāĻ āĻŦāĻŋāĻļāĻĻā§ āĻĻā§āĻāĻŋāĨ¤
āĻĄāĻŋāĻā§āϰā§āĻļāύ: āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋāϏ
āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻŦāĻŋāĻāĻžāĻāĻā§āϞāĻŋāϤ⧠āĻāĻĻāĻžāĻšāϰāĻŖāĻā§āϞāĻŋ āĻāĻžāϞāĻžāϤ⧠āϏāĻā§āώāĻŽ āĻšāĻāϝāĻŧāĻžāϰ āĻāύā§āϝ, āĻāĻĒāύāĻžāϰ āĻāĻŽāĻĒāĻā§āώ⧠āĻāϝāĻŧā§āĻāĻāĻŋ āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāϤ⧠āĻĒāĻžāϰ⧠llvm/clang āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āϏāĻŽāϰā§āĻĨāύ āϏāĻš āĻāĻŦāĻ bpftoolāĨ¤ āĻŦāĻŋāĻāĻžāĻā§ āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋ āĻāĻāϤā§āϰāĻŋāϤ āĻāϰāĻžāϰ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞā§, āϏā§āĻāϏāĻžāĻĨā§ āĻāĻĒāύāĻžāϰ āĻāĻžāϰā§āύā§āϞ āĻĒāĻĄāĻŧāϤ⧠āĻĒāĻžāϰā§āύāĨ¤ āĻāĻ āĻŦāĻŋāĻāĻžāĻāĻāĻŋ āύā§āĻā§ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āϝāĻžāϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāĻĒāϏā§āĻĨāĻžāĻĒāύāĻžāϰ āϏāĻžāĻŽāĻā§āĻāϏā§āϝ āύāώā§āĻ āύāĻž āĻšāϝāĻŧāĨ¤
BPF āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ āĻŽā§āĻļāĻŋāύ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ āĻāĻŦāĻ āύāĻŋāϰā§āĻĻā§āĻļ āϏāĻŋāϏā§āĻā§āĻŽ
BPF āĻāϰ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰ āĻāĻŦāĻ āĻāĻŽāĻžāύā§āĻĄ āϏāĻŋāϏā§āĻā§āĻŽāĻāĻŋ āĻāĻ āĻŦāĻŋāώāϝāĻŧāĻāĻŋ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰ⧠āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ āϝ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āϏāĻŋ āĻāĻžāώāĻžāϝāĻŧ āϞā§āĻāĻž āĻšāĻŦā§ āĻāĻŦāĻ āĻāĻžāϰā§āύā§āϞ⧠āϞā§āĻĄ āĻāϰāĻžāϰ āĻĒāϰā§, āύā§āĻāĻŋāĻ āĻā§āĻĄā§ āĻ āύā§āĻŦāĻžāĻĻ āĻāϰāĻž āĻšāĻŦā§āĨ¤ āĻ āϤāĻāĻŦ, āϰā§āĻāĻŋāϏā§āĻāĻžāϰā§āϰ āϏāĻāĻā§āϝāĻž āĻāĻŦāĻ āĻāĻŽāĻžāύā§āĻĄā§āϰ āϏā§āĻāĻāĻŋ āĻāϧā§āύāĻŋāĻ āĻŽā§āĻļāĻŋāύā§āϰ āĻā§āώāĻŽāϤāĻžāϰ āĻāĻžāĻŖāĻŋāϤāĻŋāĻ āĻ āϰā§āĻĨā§, āĻā§āĻĻāĻāĻŋāϰ āĻĻāĻŋāĻā§ āύāĻāϰ āϰā§āĻā§ āĻŦā§āĻā§ āύā§āĻāϝāĻŧāĻž āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ āĻāĻāĻžāĻĄāĻŧāĻžāĻ, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāϤ⧠āĻŦāĻŋāĻāĻŋāύā§āύ āĻŦāĻŋāϧāĻŋāύāĻŋāώā§āϧ āĻāϰā§āĻĒ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āϏāĻŽā§āĻĒā§āϰāϤāĻŋ āĻ āĻŦāϧāĻŋ āϞā§āĻĒ āĻāĻŦāĻ āϏāĻžāĻŦāϰā§āĻāĻŋāύāĻā§āϞāĻŋ āϞā§āĻāĻž āϏāĻŽā§āĻāĻŦ āĻāĻŋāϞ āύāĻž āĻāĻŦāĻ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞā§āϰ āϏāĻāĻā§āϝāĻž 4096 āϤ⧠āϏā§āĻŽāĻžāĻŦāĻĻā§āϧ āĻāĻŋāϞ (āĻāĻāύ āĻŦāĻŋāĻļā§āώ āϏā§āĻŦāĻŋāϧāĻžāĻĒā§āϰāĻžāĻĒā§āϤ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻāĻ āĻŽāĻŋāϞāĻŋāϝāĻŧāύ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āϞā§āĻĄ āĻāϰāϤ⧠āĻĒāĻžāϰā§)āĨ¤
BPF āĻāϰ āĻāĻāĻžāϰā§āĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§-āĻ
ā§āϝāĻžāĻā§āϏā§āϏāϝā§āĻā§āϝ 64-āĻŦāĻŋāĻ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ āϰāϝāĻŧā§āĻā§ r0-r10 āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻžāĻāύā§āĻāĻžāϰāĨ¤ āύāĻŋāĻŦāύā§āϧāύ r10 āĻāĻāĻāĻŋ āĻĢā§āϰā§āĻŽ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āϰāϝāĻŧā§āĻā§ āĻāĻŦāĻ āĻāĻāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĒāĻ āύāϝā§āĻā§āϝāĨ¤ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāϰ āϰāĻžāύāĻāĻžāĻāĻŽā§ āĻāĻāĻāĻŋ 512-āĻŦāĻžāĻāĻ āϏā§āĻā§āϝāĻžāĻā§āϰ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āϰāϝāĻŧā§āĻā§ āĻāĻŦāĻ āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āĻāĻāĻžāϰ⧠āϏā§āĻŽāĻžāĻšā§āύ āĻĒāϰāĻŋāĻŽāĻžāĻŖā§ āĻāĻžāĻ āĻāϰāĻž āĻŽā§āĻŽāϰāĻŋ āϰāϝāĻŧā§āĻā§ā§ˇ
BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāĻā§ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϏā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ-āĻāĻžāĻāĻĒ āĻāĻžāϰā§āύā§āϞ āĻšā§āϞā§āĻĒāĻžāϰ āĻāĻŦāĻ āϏāĻžāĻŽā§āĻĒā§āϰāϤāĻŋāĻāĻāĻžāϞ⧠āύāĻŋāϝāĻŧāĻŽāĻŋāϤ āĻĢāĻžāĻāĻļāύ āĻāĻžāϞāĻžāύā§āϰ āĻ
āύā§āĻŽāϤāĻŋ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧāĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāϞ āĻĢāĻžāĻāĻļāύ āĻĒāĻžāĻāĻāĻāĻŋ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āύāĻŋāϤ⧠āĻĒāĻžāϰā§, āϰā§āĻāĻŋāϏā§āĻāĻžāϰ⧠āĻĒāĻžāϏ āĻāϰāĻž āĻšāϝāĻŧ r1-r5, āĻāĻŦāĻ āϰāĻŋāĻāĻžāϰā§āύ āĻŽāĻžāύ āĻĒāĻžāϏ āĻāϰāĻž āĻšāϝāĻŧ r0. āĻāĻāĻŋ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧ āϝ⧠āĻĢāĻžāĻāĻļāύ āĻĨā§āĻā§ āĻĢāĻŋāϰ⧠āĻāϏāĻžāϰ āĻĒāϰā§, āϰā§āĻāĻŋāϏā§āĻāĻžāϰā§āϰ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠r6-r9 āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻšāĻŦā§ āύāĻžāĨ¤
āĻĻāĻā§āώ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻ
āύā§āĻŦāĻžāĻĻā§āϰ āĻāύā§āϝ, āύāĻŋāĻŦāύā§āϧāύ r0-r11 āϏāĻŽāϏā§āϤ āϏāĻŽāϰā§āĻĨāĻŋāϤ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻŦāϰā§āϤāĻŽāĻžāύ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰā§āϰ ABI āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋāĻā§ āĻŦāĻŋāĻŦā§āĻāύāĻžāϝāĻŧ āϰā§āĻā§ āĻŦāĻžāϏā§āϤāĻŦ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ⧠āĻ
āύāύā§āϝāĻāĻžāĻŦā§ āĻŽā§āϝāĻžāĻĒ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāύā§āϝ x86_64 āύāĻŋāĻŦāύā§āϧāύ r1-r5, āĻĢāĻžāĻāĻļāύ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āĻĒāĻžāϏ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ, āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻšāϝāĻŧ rdi, rsi, rdx, rcx, r8, āϝāĻž āĻĢāĻžāĻāĻļāύ⧠āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āĻĒāĻžāϏ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧ x86_64. āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻŦāĻžāĻŽ āĻĻāĻŋāĻā§āϰ āĻā§āĻĄāĻāĻŋ āĻĄāĻžāύāĻĻāĻŋāĻā§āϰ āĻā§āĻĄā§ āĻ
āύā§āĻŦāĻžāĻĻ āĻāϰ⧠āĻāĻāĻžāĻŦā§:
1: (b7) r1 = 1 mov $0x1,%rdi
2: (b7) r2 = 2 mov $0x2,%rsi
3: (b7) r3 = 3 mov $0x3,%rdx
4: (b7) r4 = 4 mov $0x4,%rcx
5: (b7) r5 = 5 mov $0x5,%r8
6: (85) call pc+1 callq 0x0000000000001ee8āύāĻŋāĻŦāύā§āϧāύ r0 āĻāĻāĻžāĻĄāĻŧāĻžāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻā§āϏāĻŋāĻāĻŋāĻāĻļāύā§āϰ āĻĢāϞāĻžāĻĢāϞ āĻāĻŦāĻ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ⧠āĻĢā§āϰāϤ āĻĻāĻŋāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧ r1 āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāĻā§ āĻĒā§āϰāϏāĻā§āĻā§ āĻāĻāĻāĻŋ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧ - āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āϧāϰāĻŖā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰā§, āĻāĻāĻŋ āĻšāϤ⧠āĻĒāĻžāϰā§, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻāĻāĻŋ āĻāĻžāĻ āĻžāĻŽā§ (XDP-āĻāϰ āĻāύā§āϝ) āĻŦāĻž āĻāĻžāĻ āĻžāĻŽā§ (āĻŦāĻŋāĻāĻŋāύā§āύ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāύā§āϝ) āĻŦāĻž āĻāĻžāĻ āĻžāĻŽā§ (āĻŦāĻŋāĻāĻŋāύā§āύ āϧāϰāύā§āϰ āĻā§āϰā§āϏāĻŋāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāύā§āϝ), āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤
āϏā§āϤāϰāĻžāĻ, āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āĻāĻāĻāĻŋ āϏā§āĻ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ, āĻāĻžāϰā§āύā§āϞ āϏāĻžāĻšāĻžāϝā§āϝāĻāĻžāϰā§, āĻāĻāĻāĻŋ āϏā§āĻā§āϝāĻžāĻ, āĻāĻāĻāĻŋ āĻĒā§āϰāϏāĻā§āĻ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āĻāĻŦāĻ āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āĻāĻāĻžāϰ⧠āĻļā§āϝāĻŧāĻžāϰ āĻāϰāĻž āĻŽā§āĻŽāϰāĻŋ āĻāĻŋāϞāĨ¤ āĻāĻŽāύ āύāϝāĻŧ āϝ⧠āĻāĻ āϏāĻŦāĻ āĻā§āϰāĻŽāĻŖā§ āĻāĻā§āĻŦāĻžāϰā§āĻ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ, āĻāĻŋāύā§āϤā§...
āĻāϏā§āύ āĻŦāϰā§āĻŖāύāĻžāĻāĻŋ āĻāĻžāϞāĻŋāϝāĻŧā§ āϝāĻžāĻ āĻāĻŦāĻ āĻāĻ āĻŦāϏā§āϤā§āĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāĻžāύā§āĻĄ āϏāĻŋāϏā§āĻā§āĻŽ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĨāĻž āĻŦāϞāĻŋāĨ¤ āϏāĻŦ () BPF āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ 64-āĻŦāĻŋāĻ āĻāĻāĻžāϰ āĻāĻā§. āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻāĻāĻŋ 64-āĻŦāĻŋāĻ āĻŦāĻŋāĻ āĻāύā§āĻĄāĻŋāϝāĻŧāĻžāύ āĻŽā§āĻļāĻŋāύ⧠āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻā§āĻļāύāĻž āĻĻā§āĻā§āύ āϤāĻŦā§ āĻāĻĒāύāĻŋ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āύ
![]()
āĻāĻāĻž āĻšāϞ Code - āĻāĻāĻŋ āύāĻŋāϰā§āĻĻā§āĻļā§āϰ āĻāύāĻā§āĻĄāĻŋāĻ, Dst/Src â āĻāĻā§āϞāĻŋ āϝāĻĨāĻžāĻā§āϰāĻŽā§ āϰāĻŋāϏāĻŋāĻāĻžāϰ āĻāĻŦāĻ āĻāϤā§āϏā§āϰ āĻāύāĻā§āĻĄāĻŋāĻ, Off - 16-āĻŦāĻŋāĻ āϏā§āĻŦāĻžāĻā§āώāϰāĻŋāϤ āĻāύā§āĻĄā§āύā§āĻā§āĻļāύ, āĻāĻŦāĻ Imm āĻāĻāĻāĻŋ 32-āĻŦāĻŋāĻ āϏā§āĻŦāĻžāĻā§āώāϰāĻŋāϤ āĻĒā§āϰā§āĻŖāϏāĻāĻā§āϝāĻž āϝāĻž āĻāĻŋāĻā§ āύāĻŋāϰā§āĻĻā§āĻļā§ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧ (cBPF āϧā§āϰā§āĻŦāĻ K-āĻāϰ āĻŽāϤā§)āĨ¤ āĻāύāĻā§āĻĄāĻŋāĻ Code āĻĻā§āĻ āϧāϰāύā§āϰ āĻāĻāĻāĻŋ āĻāĻā§:

āύāĻŋāϰā§āĻĻā§āĻļā§āϰ āĻā§āϞāĻžāϏ 0, 1, 2, 3 āĻŽā§āĻŽāϰāĻŋāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāĻžāύā§āĻĄāĻā§āϞāĻŋāĻā§ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰā§āĨ¤ āϤāĻžāϰāĻž , BPF_LD, BPF_LDX, BPF_ST, BPF_STX, āϝāĻĨāĻžāĻā§āϰāĻŽā§āĨ¤ āĻā§āϞāĻžāϏ 4, 7 (BPF_ALU, BPF_ALU64) ALU āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞā§āϰ āĻāĻāĻāĻŋ āϏā§āĻ āĻāĻ āύ āĻāϰā§āύāĨ¤ āĻā§āϞāĻžāϏ 5, 6 (BPF_JMP, BPF_JMP32) āĻāĻžāĻŽā§āĻĒ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āϰāϝāĻŧā§āĻā§.
BPF āύāĻŋāϰā§āĻĻā§āĻļāύāĻž āĻĒāĻĻā§āϧāϤāĻŋ āĻ āϧā§āϝāϝāĻŧāύ āĻāϰāĻžāϰ āĻāύā§āϝ āĻĒāϰāĻŦāϰā§āϤ⧠āĻĒāϰāĻŋāĻāϞā§āĻĒāύāĻžāĻāĻŋ āύāĻŋāĻŽā§āύāϰā§āĻĒ: āϏāĻŽāϏā§āϤ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āĻāĻŦāĻ āϤāĻžāĻĻā§āϰ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋāĻā§āϞāĻŋ āϏāĻžāĻŦāϧāĻžāύāϤāĻžāϰ āϏāĻžāĻĨā§ āϤāĻžāϞāĻŋāĻāĻžāĻā§āĻā§āϤ āĻāϰāĻžāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤā§, āĻāĻŽāϰāĻž āĻāĻ āĻŦāĻŋāĻāĻžāĻā§ āĻāϝāĻŧā§āĻāĻāĻŋ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĻā§āĻāĻŦ āĻāĻŦāĻ āϏā§āĻā§āϞāĻŋ āĻĨā§āĻā§ āĻāĻāĻŋ āϏā§āĻĒāώā§āĻ āĻšāϝāĻŧā§ āϝāĻžāĻŦā§ āϝ⧠āύāĻŋāϰā§āĻĻā§āĻļāĻā§āϞāĻŋ āĻāϏāϞ⧠āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰ⧠āĻāĻŦāĻ āĻā§āĻāĻžāĻŦā§ BPF-āĻāϰ āĻāύā§āϝ āϝā§āĻā§āύ⧠āĻŦāĻžāĻāύāĻžāϰāĻŋ āĻĢāĻžāĻāϞ āĻŽā§āϝāĻžāύā§āϝāĻŧāĻžāϞāĻŋ āĻĄāĻŋāϏāϏā§āĻŽā§āĻŦāϞ āĻāϰā§āύāĨ¤ āύāĻŋāĻŦāύā§āϧ⧠āĻĒāϰāĻŦāϰā§āϤā§āϤ⧠āĻāĻĒāĻžāĻĻāĻžāύāĻā§āϞāĻŋāĻā§ āĻāĻā§āĻā§āϤ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻŽāϰāĻž āϝāĻžāĻāĻžāĻāĻāĻžāϰā§, āĻā§āĻāĻāĻāĻŋ āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ, āĻā§āϞāĻžāϏāĻŋāĻ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ-āĻāϰ āĻ āύā§āĻŦāĻžāĻĻ, āϏā§āĻāϏāĻžāĻĨā§ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻ āϧā§āϝāϝāĻŧāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāϞāĻŋāĻ āĻĢāĻžāĻāĻļāύ āĻāϤā§āϝāĻžāĻĻāĻŋ āĻŦāĻŋāώāϝāĻŧā§ āĻŦāĻŋāĻāĻžāĻāĻā§āϞāĻŋāϤ⧠āĻĒā§āĻĨāĻ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞā§āϰ āϏāĻžāĻĨā§ āĻĻā§āĻāĻž āĻāϰāĻŦāĨ¤
āϝāĻāύ āĻāĻŽāϰāĻž āĻĒā§āĻĨāĻ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĨāĻž āĻŦāϞāĻŋ, āϤāĻāύ āĻāĻŽāϰāĻž āĻŽā§āϞ āĻĢāĻžāĻāϞāĻā§āϞāĻŋ āĻāϞā§āϞā§āĻ āĻāϰāĻŦ и , āϝāĻž BPF āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞā§āϰ āϏāĻāĻā§āϝāĻžāϏā§āĻāĻ āĻā§āĻĄ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰā§āĨ¤ āĻāĻĒāύāĻžāϰ āύāĻŋāĻā§āϰ āĻĨā§āĻā§ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰ āĻ āϧā§āϝāϝāĻŧāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻŦāĻ/āĻ āĻĨāĻŦāĻž āĻŦāĻžāĻāύāĻžāϰāĻŋ āĻĒāĻžāϰā§āϏāĻŋāĻ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāĻĒāύāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻāϤā§āϏāĻā§āϞāĻŋāϤ⧠āĻļāĻŦā§āĻĻāĻžāϰā§āĻĨāĻŦāĻŋāĻĻā§āϝāĻž āĻā§āĻāĻā§ āĻĒā§āϤ⧠āĻĒāĻžāϰā§āύ, āĻāĻāĻŋāϞāϤāĻžāϰ āĻā§āϰāĻŽ āĻ āύā§āϏāĻžāϰ⧠āϏāĻžāĻāĻžāύā§: , , āĻāĻŦāĻ, āĻ āĻŦāĻļā§āϝāĻ, āϞāĻŋāύāĻžāĻā§āϏ āϏā§āϰā§āϏ āĻā§āĻĄā§ - āϝāĻžāĻāĻžāĻāĻāĻžāϰā§, āĻā§āĻāĻāĻāĻŋ, āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĻā§āĻāĻžāώā§āĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ: āĻāĻĒāύāĻžāϰ āĻŽāĻžāĻĨāĻžāϝāĻŧ BPF āĻŦāĻŋāĻā§āĻāĻŋāύā§āύ āĻāϰāĻž
āĻāϏā§āύ āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĻā§āĻāĻŋ āϝā§āĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻŋ readelf-example.c āĻāĻŦāĻ āĻĢāϞāĻžāĻĢāϞ āĻŦāĻžāĻāύāĻžāϰāĻŋ āϤāĻžāĻāĻžāύ. āĻāĻŽāϰāĻž āĻāϏāϞ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻĒā§āϰāĻāĻžāĻļ āĻāϰāĻŦ readelf-example.c āύā§āĻā§, āĻāĻŽāϰāĻž āĻŦāĻžāĻāύāĻžāϰāĻŋ āĻā§āĻĄ āĻĨā§āĻā§ āĻāϰ āϝā§āĻā§āϤāĻŋ āĻĒā§āύāϰā§āĻĻā§āϧāĻžāϰ āĻāϰāĻžāϰ āĻĒāϰā§:
$ clang -target bpf -c readelf-example.c -o readelf-example.o -O2
$ llvm-readelf -x .text readelf-example.o
Hex dump of section '.text':
0x00000000 b7000000 01000000 15010100 00000000 ................
0x00000010 b7000000 02000000 95000000 00000000 ................āĻāĻāĻāĻĒā§āĻā§ āĻĒā§āϰāĻĨāĻŽ āĻāϞāĻžāĻŽ readelf āĻāĻāĻāĻŋ āĻāύā§āĻĄā§āύā§āĻā§āĻļāύ āĻāĻŦāĻ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻāĻāĻžāĻŦā§ āĻāĻžāϰāĻāĻŋ āĻāĻŽāĻžāύā§āĻĄ āύāĻŋāϝāĻŧā§ āĻāĻ āĻŋāϤ:
Code Dst Src Off Imm
b7 0 0 0000 01000000
15 0 1 0100 00000000
b7 0 0 0000 02000000
95 0 0 0000 00000000āĻāĻŽāĻžāύā§āĻĄ āĻā§āĻĄ āϏāĻŽāĻžāύ b7, 15, b7 и 95. āĻĒā§āϰāϤā§āϝāĻžāĻšāĻžāϰ āĻāϰā§āύ āϝ⧠āϏāϰā§āĻŦāύāĻŋāĻŽā§āύ āĻāϞā§āϞā§āĻāϝā§āĻā§āϝ āϤāĻŋāύāĻāĻŋ āĻŦāĻŋāĻ āĻšāϞ āύāĻŋāϰā§āĻĻā§āĻļ āĻļā§āϰā§āĻŖā§āĨ¤ āĻāĻŽāĻžāĻĻā§āϰ āĻā§āώā§āϤā§āϰā§, āϏāĻŽāϏā§āϤ āύāĻŋāϰā§āĻĻā§āĻļā§āϰ āĻāϤā§āϰā§āĻĨ āĻŦāĻŋāĻāĻāĻŋ āĻāĻžāϞāĻŋ, āϤāĻžāĻ āύāĻŋāϰā§āĻĻā§āĻļā§āϰ āĻā§āϞāĻžāϏāĻā§āϞāĻŋ āϝāĻĨāĻžāĻā§āϰāĻŽā§ 7, 5, 7, 5, āĻā§āϞāĻžāϏ 7 āĻšāϞ BPF_ALU64, āĻāĻŦāĻ 5 āĻšāϞ BPF_JMP. āĻāĻāϝāĻŧ āĻļā§āϰā§āĻŖā§āϰ āĻāύā§āϝ, āύāĻŋāϰā§āĻĻā§āĻļ āĻŦāĻŋāύā§āϝāĻžāϏ āĻāĻāĻ (āĻāĻĒāϰ⧠āĻĻā§āĻā§āύ) āĻāĻŦāĻ āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻāĻžāĻŦā§ āĻĒā§āύāϰāĻžāϝāĻŧ āϞāĻŋāĻāϤ⧠āĻĒāĻžāϰāĻŋ (āĻāĻāĻ āϏāĻžāĻĨā§ āĻāĻŽāϰāĻž āĻŽāĻžāύāĻŦ āĻāĻāĻžāϰ⧠āĻ
āĻŦāĻļāĻŋāώā§āĻ āĻāϞāĻžāĻŽāĻā§āϞāĻŋ āĻĒā§āύāϰāĻžāϝāĻŧ āϞāĻŋāĻāĻŦ):
Op S Class Dst Src Off Imm
b 0 ALU64 0 0 0 1
1 0 JMP 0 1 1 0
b 0 ALU64 0 0 0 2
9 0 JMP 0 0 0 0āĻ
āĻĒāĻžāϰā§āĻļāύ b āĻŦāϰā§āĻ ALU64 - āĻāĻāĻž . āĻāĻāĻŋ āĻāύā§āϤāĻŦā§āϝ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ⧠āĻāĻāĻāĻŋ āĻŽāĻžāύ āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰā§āĨ¤ āϝāĻĻāĻŋ āĻŦāĻŋāĻ āϏā§āĻ āĻāϰāĻž āĻšāϝāĻŧ s (āĻā§āϏ), āϤāĻžāϰāĻĒāϰ āĻŽāĻžāύāĻāĻŋ āϏā§āϰā§āϏ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ āĻĨā§āĻā§ āύā§āĻāϝāĻŧāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āϝāĻĻāĻŋ āĻāĻŽāĻžāĻĻā§āϰ āĻā§āώā§āϤā§āϰ⧠āĻāĻāĻŋ āϏā§āĻ āĻāϰāĻž āύāĻž āĻĨāĻžāĻā§, āϤāĻžāĻšāϞ⧠āĻŽāĻžāύāĻāĻŋ āĻā§āώā§āϤā§āϰ āĻĨā§āĻā§ āύā§āĻāϝāĻŧāĻž āĻšāϝāĻŧ Imm. āϤāĻžāĻ āĻĒā§āϰāĻĨāĻŽ āĻ āϤā§āϤā§āϝāĻŧ āύāĻŋāϰā§āĻĻā§āĻļā§ āĻāĻŽāϰāĻž āĻ
āĻĒāĻžāϰā§āĻļāύ āĻāϰāĻŋ r0 = Imm. āĻāϰāĻ, āĻā§āĻāĻŽāĻĒāĻŋ āĻā§āϞāĻžāϏ 1 āĻ
āĻĒāĻžāϰā§āĻļāύ (āϏāĻŽāĻžāύ āĻšāϞ⧠āϞāĻžāĻĢ)āĨ¤ āĻāĻŽāĻžāĻĻā§āϰ āĻā§āώā§āϤā§āϰā§, āĻŦāĻŋāĻ āĻĨā§āĻā§ S āĻļā§āύā§āϝ, āĻāĻāĻŋ āĻā§āώā§āϤā§āϰā§āϰ āϏāĻžāĻĨā§ āϏā§āϰā§āϏ āϰā§āĻāĻŋāϏā§āĻāĻžāϰā§āϰ āĻŽāĻžāύ āϤā§āϞāύāĻž āĻāϰ⧠Imm. āϝāĻĻāĻŋ āĻŽāĻžāύāĻā§āϞāĻŋ āĻŽāĻŋāϞ⧠āϝāĻžāϝāĻŧ, āϤāĻŦā§ āϰā§āĻĒāĻžāύā§āϤāϰ āĻāĻā§ PC + Offāϝā§āĻāĻžāύ⧠PC, āϝāĻĨāĻžāϰā§āϤāĻŋ, āĻĒāϰāĻŦāϰā§āϤ⧠āύāĻŋāϰā§āĻĻā§āĻļā§āϰ āĻ āĻŋāĻāĻžāύāĻž āϰāϝāĻŧā§āĻā§āĨ¤ āĻ
āĻŦāĻļā§āώā§, āĻā§āĻāĻŽāĻĒāĻŋ āĻā§āϞāĻžāϏ 9 āĻ
āĻĒāĻžāϰā§āĻļāύ āĻšāϝāĻŧ . āĻāĻ āύāĻŋāϰā§āĻĻā§āĻļāĻāĻŋ āĻāĻžāϰā§āύā§āϞ⧠āĻĢāĻŋāϰ⧠āĻāϏ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻŦāύā§āϧ āĻāϰ⧠āĻĻā§āϝāĻŧ r0. āĻāĻŽāĻžāĻĻā§āϰ āĻā§āĻŦāĻŋāϞ⧠āĻāĻāĻāĻŋ āύāϤā§āύ āĻāϞāĻžāĻŽ āϝā§āĻ āĻāϰāĻž āϝāĻžāĻ:
Op S Class Dst Src Off Imm Disassm
MOV 0 ALU64 0 0 0 1 r0 = 1
JEQ 0 JMP 0 1 1 0 if (r1 == 0) goto pc+1
MOV 0 ALU64 0 0 0 2 r0 = 2
EXIT 0 JMP 0 0 0 0 exitāĻāĻŽāϰāĻž āĻāĻāĻŋāĻā§ āĻāϰāĻ āϏā§āĻŦāĻŋāϧāĻžāĻāύāĻ āĻāĻāĻžāϰ⧠āĻĒā§āύāϰāĻžāϝāĻŧ āϞāĻŋāĻāϤ⧠āĻĒāĻžāϰāĻŋ:
r0 = 1
if (r1 == 0) goto END
r0 = 2
END:
exitāĻāĻŽāĻžāĻĻā§āϰ āĻŽāύ⧠āĻĨāĻžāĻāϞ⧠āĻāĻžāϤāĻžāϝāĻŧ āĻāĻŋ āĻāĻā§ r1 āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻžāϰā§āύā§āϞ āĻĨā§āĻā§ āĻāĻŦāĻ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ āĻĨā§āĻā§ āĻĒā§āϰāϏāĻā§āĻā§ āĻāĻāĻāĻŋ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āĻĒāĻžāϏ āĻāϰāĻž āĻšāϝāĻŧ r0 āĻŽāĻžāύāĻāĻŋ āĻāĻžāϰā§āύā§āϞ⧠āĻĢā§āϰāϤ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧ, āϤāĻžāϰāĻĒāϰ āĻāĻŽāϰāĻž āĻĻā§āĻāϤ⧠āĻĒāĻžāϰāĻŋ āϝ⧠āϝāĻĻāĻŋ āĻĒā§āϰā§āĻā§āώāĻžāĻĒāĻā§āϰ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰāĻāĻŋ āĻļā§āύā§āϝ āĻšāϝāĻŧ, āϤāĻžāĻšāϞ⧠āĻāĻŽāϰāĻž 1 āĻĢā§āϰāϤ āĻĻā§āĻŦ, āĻāĻŦāĻ āĻ
āύā§āϝāĻĨāĻžāϝāĻŧ - 2āĨ¤ āĻā§āϏāĻāĻŋ āĻĻā§āĻā§ āĻāĻŽāϰāĻž āϏāĻ āĻŋāĻ āĻāĻŋāύāĻž āϤāĻž āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻŋ:
$ cat readelf-example.c
int foo(void *ctx)
{
return ctx ? 2 : 1;
}āĻšā§āϝāĻžāĻ, āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻ āϰā§āĻĨāĻšā§āύ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ, āĻāĻŋāύā§āϤ⧠āĻāĻāĻŋ āĻŽāĻžāϤā§āϰ āĻāĻžāϰāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āύāĻŋāϰā§āĻĻā§āĻļā§ āĻ āύā§āĻŦāĻžāĻĻ āĻāϰā§āĨ¤
āĻŦā§āϝāϤāĻŋāĻā§āϰāĻŽ āĻāĻĻāĻžāĻšāϰāĻŖ: 16-āĻŦāĻžāĻāĻ āύāĻŋāϰā§āĻĻā§āĻļ
āĻāĻŽāϰāĻž āĻāĻā§ āĻāϞā§āϞā§āĻ āĻāϰā§āĻāĻŋ āϝ⧠āĻāĻŋāĻā§ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠64 āĻŦāĻŋāĻā§āϰ āĻŦā§āĻļāĻŋ āϏāĻŽāϝāĻŧ āύā§āϝāĻŧāĨ¤ āĻāĻāĻŋ āĻĒā§āϰāϝā§āĻā§āϝ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞā§āϤ⧠lddw (āĻā§āĻĄ = 0x18 = | | ) â āĻā§āώā§āϤā§āϰ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻĄāĻŦāϞ āĻļāĻŦā§āĻĻ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ⧠āϞā§āĻĄ āĻāϰā§āύ Imm... āĻŦā§āϝāĻžāĻĒāĻžāϰāĻāĻŋ āĻšāϞ⧠Imm āĻāϰ āĻāĻāĻžāϰ 32, āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻĄāĻŦāϞ āĻļāĻŦā§āĻĻ āĻšāϞ 64 āĻŦāĻŋāĻ, āϤāĻžāĻ āĻāĻāĻāĻŋ 64-āĻŦāĻŋāĻ āύāĻŋāϰā§āĻĻā§āĻļā§ āĻāĻāĻāĻŋ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ⧠āĻāĻāĻāĻŋ 64-āĻŦāĻŋāĻ āϤāĻžā§āĻā§āώāĻŖāĻŋāĻ āĻŽāĻžāύ āϞā§āĻĄ āĻāϰāĻž āĻāĻžāĻ āĻāϰāĻŦā§ āύāĻžāĨ¤ āĻāĻāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻā§āώā§āϤā§āϰā§āϰ āĻŽāϧā§āϝ⧠64-āĻŦāĻŋāĻ āĻŽāĻžāύā§āϰ āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧ āĻ
āĻāĻļ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāϤ⧠āĻĻā§āĻāĻŋ āϏāĻāϞāĻā§āύ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāϝāĻŧ ImmāĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖ:
$ cat x64.c
long foo(void *ctx)
{
return 0x11223344aabbccdd;
}
$ clang -target bpf -c x64.c -o x64.o -O2
$ llvm-readelf -x .text x64.o
Hex dump of section '.text':
0x00000000 18000000 ddccbbaa 00000000 44332211 ............D3".
0x00000010 95000000 00000000 ........āĻāĻāĻāĻŋ āĻŦāĻžāĻāύāĻžāϰāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĻā§āĻāĻŋ āύāĻŋāϰā§āĻĻā§āĻļ āĻāĻā§:
Binary Disassm
18000000 ddccbbaa 00000000 44332211 r0 = Imm[0]|Imm[1]
95000000 00000000 exitāĻāĻŽāϰāĻž āύāĻŋāϰā§āĻĻā§āĻļāύāĻž āύāĻŋāϝāĻŧā§ āĻāĻŦāĻžāϰ āĻĻā§āĻāĻž āĻāϰāĻŦ lddw, āϝāĻāύ āĻāĻŽāϰāĻž āϏā§āĻĨāĻžāύāĻžāύā§āϤāϰ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĨāĻž āĻŦāϞāĻŋ āĻāĻŦāĻ āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻŋāĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ: āϏā§āĻā§āϝāĻžāύā§āĻĄāĻžāϰā§āĻĄ āĻā§āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠BPF āĻŦāĻŋāĻā§āĻāĻŋāύā§āύ āĻāϰāĻž
āϏā§āϤāϰāĻžāĻ, āĻāĻŽāϰāĻž BPF āĻŦāĻžāĻāύāĻžāϰāĻŋ āĻā§āĻĄ āĻĒāĻĄāĻŧāϤ⧠āĻļāĻŋāĻā§āĻāĻŋ āĻāĻŦāĻ āĻĒā§āϰāϝāĻŧā§āĻāύ⧠āϝā§āĻā§āύ⧠āύāĻŋāϰā§āĻĻā§āĻļ āĻĒāĻžāϰā§āϏ āĻāϰāϤ⧠āĻĒā§āϰāϏā§āϤā§āϤāĨ¤ āϝāĻžāĻāĻšā§āĻ, āĻāĻāĻŋ āĻŦāϞāĻžāϰ āĻ āĻĒā§āĻā§āώāĻž āϰāĻžāĻā§ āύāĻž āϝ⧠āĻ āύā§āĻļā§āϞāύ⧠āϏā§āĻā§āϝāĻžāύā§āĻĄāĻžāϰā§āĻĄ āϏāϰāĻā§āĻāĻžāĻŽāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāĻā§ āĻŦāĻŋāĻā§āĻāĻŋāύā§āύ āĻāϰāĻž āĻāϰāĻ āϏā§āĻŦāĻŋāϧāĻžāĻāύāĻ āĻāĻŦāĻ āĻĻā§āϰā§āϤāϤāϰ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ:
$ llvm-objdump -d x64.o
Disassembly of section .text:
0000000000000000 <foo>:
0: 18 00 00 00 dd cc bb aa 00 00 00 00 44 33 22 11 r0 = 1234605617868164317 ll
2: 95 00 00 00 00 00 00 00 exitBPF āĻŦāϏā§āϤā§āϰ āĻā§āĻŦāύāĻāĻā§āϰ, bpffs āĻĢāĻžāĻāϞ āϏāĻŋāϏā§āĻā§āĻŽ
(āĻāĻŽāĻŋ āĻĒā§āϰāĻĨāĻŽā§ āĻāĻ āĻāĻĒāϧāĻžāϰāĻžāϝāĻŧ āĻŦāϰā§āĻŖāĻŋāϤ āĻāĻŋāĻā§ āĻŦāĻŋāĻŦāϰāĻŖ āĻļāĻŋāĻā§āĻāĻŋ āĻāϞā§āĻā§āϏāĻŋ āϏā§āĻāĻžāϰā§āĻāϝāĻŧā§āĻāĻ āĻāύ .)
BPF āĻ
āĻŦāĻā§āĻā§āĻ - āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻŦāĻ āĻŽāĻžāύāĻāĻŋāϤā§āϰ - āĻāĻŽāĻžāύā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏā§āĻĨāĻžāύ āĻĨā§āĻā§ āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧ BPF_PROG_LOAD и BPF_MAP_CREATE āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ bpf(2), āĻāĻŽāϰāĻž āĻĒāϰāĻŦāϰā§āϤ⧠āĻŦāĻŋāĻāĻžāĻā§ āĻ āĻŋāĻ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻāĻŋ āĻāĻā§ āϏ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĨāĻž āĻŦāϞāĻŦāĨ¤ āĻāĻāĻŋ āĻāĻžāϰā§āύā§āϞ āĻĄā§āĻāĻž āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰ āĻāĻŦāĻ āϤāĻžāĻĻā§āϰ āĻĒā§āϰāϤā§āϝā§āĻā§āϰ āĻāύā§āϝ āϤā§āϰāĻŋ āĻāϰ⧠refcount (āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻāĻŖāύāĻž) āĻāĻāĻāĻŋāϤ⧠āϏā§āĻ āĻāϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āĻŦāϏā§āϤā§āϰ āĻĻāĻŋāĻā§ āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰ⧠āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āĻĢā§āϰāϤ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧāĨ¤ āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻŦāύā§āϧ āĻāϰāĻžāϰ āĻĒāϰ refcount āĻŦāϏā§āϤā§āĻāĻŋ āĻāĻ āĻĻā§āĻŦāĻžāϰāĻž āĻšā§āϰāĻžāϏ āĻĒāĻžāϝāĻŧ āĻāĻŦāĻ āϝāĻāύ āĻāĻāĻŋ āĻļā§āύā§āϝ⧠āĻĒā§āĻāĻāĻžāϝāĻŧ, āĻŦāϏā§āϤā§āĻāĻŋ āϧā§āĻŦāĻāϏ āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤
āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āϤāĻžāϰāĻĒāϰ refcount āĻāĻ āĻŽāĻžāύāĻāĻŋāϤā§āϰāĻā§āϞāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞā§āĻĄ āĻāϰāĻžāϰ āĻĒāϰ⧠āĻāĻ āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āĻĻā§āϧāĻŋ āĻāϰāĻž āĻšāϝāĻŧ, āϝā§āĻŽāύ āϤāĻžāĻĻā§āϰ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻĨā§āĻā§ āĻŦāύā§āϧ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠āĻāĻŦāĻ āĻāĻāύāĻ refcount āĻļā§āύā§āϝ āĻšāĻŦā§ āύāĻž:

āϏāĻĢāϞāĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞā§āĻĄ āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻŽāϰāĻž āĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻā§āύ⧠āϧāϰāύā§āϰ āĻāĻā§āύā§āĻ āĻā§āύāĻžāϰā§āĻāϰā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ āĻāϰāĻŋāĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻŽāϰāĻž āĻāύāĻāĻžāĻŽāĻŋāĻ āĻĒā§āϝāĻžāĻā§āĻāĻā§āϞāĻŋ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻŋāĻā§ āĻāĻāĻāĻŋ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏ⧠āϰāĻžāĻāϤ⧠āĻĒāĻžāϰāĻŋ āĻŦāĻž āĻāĻāĻŋāĻā§ āĻāĻŋāĻā§āϤ⧠āϏāĻāϝā§āĻā§āϤ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ tracepoint āĻŽā§āϞ⧠āĻāĻ āĻŽā§āĻšā§āϰā§āϤā§, āϰā§āĻĢāĻžāϰā§āύā§āϏ āĻāĻžāĻāύā§āĻāĻžāϰāĻāĻŋāĻ āĻāĻ āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āĻĻā§āϧāĻŋ āĻĒāĻžāĻŦā§ āĻāĻŦāĻ āĻāĻŽāϰāĻž āϞā§āĻĄāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠āĻŦāύā§āϧ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻšāĻŦāĨ¤
āĻāĻŽāϰāĻž āϝāĻĻāĻŋ āĻāĻāύ āĻŦā§āĻāϞā§āĻĄāĻžāϰ āĻŦāύā§āϧ āĻāϰāĻŋ āϤāĻžāĻšāϞ⧠āĻāĻŋ āĻšāĻŦā§? āĻāĻāĻŋ āĻāĻā§āύā§āĻ āĻā§āύāĻžāϰā§āĻāϰ (āĻšā§āĻ) āϧāϰāύā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰā§āĨ¤ āϞā§āĻĄāĻžāϰ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻšāĻāϝāĻŧāĻžāϰ āĻĒāϰ⧠āϏāĻŽāϏā§āϤ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻšā§āĻ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻĨāĻžāĻāĻŦā§, āĻāĻā§āϞāĻŋ āϤāĻĨāĻžāĻāĻĨāĻŋāϤ āĻā§āϞā§āĻŦāĻžāϞ āĻšā§āĻāĨ¤ āĻāĻŦāĻ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻā§āϰā§āϏ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āϤāĻžāĻĻā§āϰ āϤā§āϰāĻŋ āĻāϰāĻž āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāĻŋ āĻļā§āώ āĻšāĻāϝāĻŧāĻžāϰ āĻĒāϰ⧠āĻŽā§āĻā§āϤāĻŋ āĻĒāĻžāĻŦā§ (āĻāĻŦāĻ āϤāĻžāĻ āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻŦāϞāĻž āĻšāϝāĻŧ, "āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻĨā§āĻā§ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāϤā§")āĨ¤ āĻĒā§āϰāϝā§āĻā§āϤāĻŋāĻāϤāĻāĻžāĻŦā§, āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻšā§āĻāĻā§āϞāĻŋāϤ⧠āϏāϰā§āĻŦāĻĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϏā§āĻĨāĻžāύ⧠āĻāĻāĻāĻŋ āϏāĻāĻļā§āϞāĻŋāώā§āĻ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠āĻĨāĻžāĻā§ āĻāĻŦāĻ āϤāĻžāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāĻŋ āĻŦāύā§āϧ āĻšāϝāĻŧā§ āĻā§āϞ⧠āĻŦāύā§āϧ āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧ, āĻāĻŋāύā§āϤ⧠āĻŦāĻŋāĻļā§āĻŦāĻŦā§āϝāĻžāĻĒā§ āĻšā§āĻāĻā§āϞāĻŋ āϤāĻž āĻāϰ⧠āύāĻžāĨ¤ āύāĻŋāĻŽā§āύā§āĻā§āϤ āĻāĻŋāϤā§āϰā§, āϞāĻžāϞ āĻā§āϰāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āĻāĻŽāĻŋ āĻĻā§āĻāĻžāύā§āϰ āĻā§āώā§āĻāĻž āĻāϰā§āĻāĻŋ āĻāĻŋāĻāĻžāĻŦā§ āϞā§āĻĄāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āϏāĻŽāĻžāĻĒā§āϤāĻŋ āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻāĻŦāĻ āĻŦāĻŋāĻļā§āĻŦāĻŦā§āϝāĻžāĻĒā§ āĻšā§āĻā§āϰ āĻā§āώā§āϤā§āϰ⧠āĻŦāϏā§āϤā§āϰ āĻā§āĻŦāύāĻāĻžāϞāĻā§ āĻĒā§āϰāĻāĻžāĻŦāĻŋāϤ āĻāϰā§āĨ¤

āĻā§āύ āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻāĻŦāĻ āĻŦā§āĻļā§āĻŦāĻŋāĻ āĻšā§āĻ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋ āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻāĻā§? āĻāĻāĻāĻžāϰāϏā§āĻĒā§āϏ āĻāĻžāĻĄāĻŧāĻžāĻ āĻāĻŋāĻā§ āϧāϰāĻŖā§āϰ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻžāϞāĻžāύ⧠āĻ āϰā§āĻĨāĻĒā§āϰā§āĻŖ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, DDoS āϏā§āϰāĻā§āώāĻž āĻāϞā§āĻĒāύāĻž āĻāϰā§āύ - āĻŦā§āĻāϞā§āĻĄāĻžāϰ āύāĻŋāϝāĻŧāĻŽāĻā§āϞāĻŋ āϞāĻŋāĻā§ āĻāĻŦāĻ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāĻā§ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ āĻāϰā§, āϝāĻžāϰ āĻĒāϰ⧠āĻŦā§āĻāϞā§āĻĄāĻžāϰ āĻāĻŋāϝāĻŧā§ āύāĻŋāĻā§āĻā§ āĻšāϤā§āϝāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻ āύā§āϝāĻĻāĻŋāĻā§, āĻāĻāĻāĻŋ āĻĄāĻŋāĻŦāĻžāĻāĻŋāĻ āĻā§āϰā§āϏ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāϞā§āĻĒāύāĻž āĻāϰā§āύ āϝāĻž āĻāĻĒāύāĻŋ āĻĻāĻļ āĻŽāĻŋāύāĻŋāĻā§āϰ āĻŽāϧā§āϝ⧠āĻāĻĒāύāĻžāϰ āĻšāĻžāĻāĻā§āϤ⧠āϞāĻŋāĻā§āĻā§āύ - āĻāĻāĻŋ āĻļā§āώ āĻšāϝāĻŧā§ āĻā§āϞā§, āĻāĻĒāύāĻŋ āĻāĻžāύ āϝ⧠āϏāĻŋāϏā§āĻā§āĻŽā§ āĻā§āύāĻ āĻāĻŦāϰā§āĻāύāĻž āĻ āĻŦāĻļāĻŋāώā§āĻ āĻĨāĻžāĻāĻŦā§ āύāĻž āĻāĻŦāĻ āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻšā§āĻāĻā§āϞāĻŋ āϤāĻž āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāĻŦā§ā§ˇ
āĻ
āύā§āϝāĻĻāĻŋāĻā§, āĻāϞā§āĻĒāύāĻž āĻāϰā§āύ āϝ⧠āĻāĻĒāύāĻŋ āĻāĻžāϰā§āύā§āϞā§āϰ āĻāĻāĻāĻŋ āĻā§āϰā§āϏāĻĒāϝāĻŧā§āύā§āĻā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻ āĻāϰāϤ⧠āĻāĻžāύ āĻāĻŦāĻ āĻ
āύā§āĻ āĻŦāĻāϰ āϧāϰ⧠āĻĒāϰāĻŋāϏāĻāĻā§āϝāĻžāύ āϏāĻāĻā§āϰāĻš āĻāϰāϤ⧠āĻāĻžāύāĨ¤ āĻāĻ āĻā§āώā§āϤā§āϰā§, āĻāĻĒāύāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻ
āĻāĻļāĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻāϰāϤ⧠āĻāĻŦāĻ āϏāĻŽāϝāĻŧā§ āϏāĻŽāϝāĻŧā§ āĻĒāϰāĻŋāϏāĻāĻā§āϝāĻžāύ⧠āĻĢāĻŋāϰ⧠āϝā§āϤ⧠āĻāĻžāύāĨ¤ bpf āĻĢāĻžāĻāϞ āϏāĻŋāϏā§āĻā§āĻŽ āĻāĻ āϏā§āϝā§āĻ āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§āĨ¤ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻāύ-āĻŽā§āĻŽāϰāĻŋ-āĻ
āύāϞāĻŋ āϏāĻŋāĻāĻĄā§-āĻĢāĻžāĻāϞ āϏāĻŋāϏā§āĻā§āĻŽ āϝāĻž BPF āĻŦāϏā§āϤā§āϰ āĻāϞā§āϞā§āĻ āĻāϰ⧠āĻāĻŽāύ āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ āĻāĻŦāĻ āĻāϰ āĻĢāϞ⧠āĻŦā§āĻĻā§āϧāĻŋ āĻĒāĻžāϝāĻŧ refcount āĻŦāϏā§āϤ⧠āĻāϰ āĻĒāϰā§, āϞā§āĻĄāĻžāϰāĻāĻŋ āĻĒā§āϰāϏā§āĻĨāĻžāύ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻāĻŦāĻ āĻāĻāĻŋ āϤā§āϰāĻŋ āĻāϰāĻž āĻŦāϏā§āϤā§āĻā§āϞāĻŋ āĻā§āĻŦāĻŋāϤ āĻĨāĻžāĻāĻŦā§āĨ¤

bpffs-āĻ āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻāϰāĻž āϝāĻž BPF āĻŦāϏā§āϤā§āϰ āĻāϞā§āϞā§āĻ āĻāϰ⧠āϤāĻžāĻā§ "āĻĒāĻŋāύāĻŋāĻ" āĻŦāϞāĻž āĻšāϝāĻŧ (āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻŦāĻžāĻā§āϝāĻžāĻāĻļā§āϰ āĻŽāϤā§: "āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāĻāĻāĻŋ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻŦāĻž āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻĒāĻŋāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§")āĨ¤ BPF āĻ āĻŦāĻā§āĻā§āĻā§āϰ āĻāύā§āϝ āĻĢāĻžāĻāϞ āĻ āĻŦāĻā§āĻā§āĻ āϤā§āϰāĻŋ āĻāϰāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻ āĻŦāĻā§āĻā§āĻā§āϰ āĻāϝāĻŧā§ āĻŦāĻžāĻĄāĻŧāĻžāύā§āϰ āĻāύā§āϝ āύāϝāĻŧ, āĻŦāĻŋāĻļā§āĻŦāĻŦā§āϝāĻžāĻĒā§ āĻŦāϏā§āϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāϝā§āĻā§āϝāϤāĻžāϰ āĻāύā§āϝāĻ āĻŦā§āϧāĻāĻŽā§āϝ āĻšāϝāĻŧ - āĻā§āϞā§āĻŦāĻžāϞ DDoS āϏā§āϰāĻā§āώāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖā§ āĻĢāĻŋāϰ⧠āĻā§āϞā§, āĻāĻŽāϰāĻž āĻĒāϰāĻŋāϏāĻāĻā§āϝāĻžāύ āĻĻā§āĻāϤ⧠āϏāĻā§āώāĻŽ āĻšāϤ⧠āĻāĻžāĻāĨ¤ āĻŽāĻžāĻā§ āĻŽāĻžāĻā§.
BPF āĻĢāĻžāĻāϞ āϏāĻŋāϏā§āĻā§āĻŽ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻŽāĻžāĻāύā§āĻ āĻāϰāĻž āĻšāϝāĻŧ /sys/fs/bpf, āϤāĻŦā§ āĻāĻāĻŋ āϏā§āĻĨāĻžāύā§āϝāĻŧāĻāĻžāĻŦā§āĻ āĻŽāĻžāĻāύā§āĻ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻāϰāĻāĻŽ:
$ mkdir bpf-mountpoint
$ sudo mount -t bpf none bpf-mountpointāĻāĻŽāĻžāύā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĢāĻžāĻāϞ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āύāĻžāĻŽ āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧ BPF_OBJ_PIN BPF āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞāĨ¤ āĻŦā§āϝāĻžāĻā§āϝāĻž āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāϏā§āύ āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻā§āϰāĻšāĻŖ āĻāϰāĻŋ, āĻāĻāĻŋ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻŋ, āĻāĻāĻŋ āĻāĻĒāϞā§āĻĄ āĻāϰāĻŋ āĻāĻŦāĻ āĻāĻāĻŋāϤ⧠āĻĒāĻŋāύ āĻāϰāĻŋ bpffs. āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻžāϰā§āϝāĻāϰ āĻāĻŋāĻā§ āĻāϰ⧠āύāĻž, āĻāĻŽāϰāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻā§āĻĄāĻāĻŋ āĻāĻĒāϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻāĻŋ āϝāĻžāϤ⧠āĻāĻĒāύāĻŋ āĻāĻĻāĻžāĻšāϰāĻŖāĻāĻŋ āĻĒā§āύāϰā§āϤā§āĻĒāĻžāĻĻāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
$ cat test.c
__attribute__((section("xdp"), used))
int test(void *ctx)
{
return 0;
}
char _license[] __attribute__((section("license"), used)) = "GPL";āĻāϏā§āύ āĻāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻŋ āĻāĻŦāĻ āĻĢāĻžāĻāϞ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻāĻāĻāĻŋ āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻ
āύā§āϞāĻŋāĻĒāĻŋ āϤā§āϰāĻŋ āĻāϰāĻŋ bpffs:
$ clang -target bpf -c test.c -o test.o
$ mkdir bpf-mountpoint
$ sudo mount -t bpf none bpf-mountpointāĻāĻāύ āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰāĻž āϝāĻžāĻ bpftool āĻāĻŦāĻ āϏāĻšāĻāĻžāĻŽā§ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞāĻā§āϞāĻŋ āĻĻā§āĻā§āύ bpf(2) (āϏā§āĻā§āϰā§āϏ āĻāĻāĻāĻĒā§āĻ āĻĨā§āĻā§ āĻāĻŋāĻā§ āĻ
āĻĒā§āϰāĻžāϏāĻā§āĻāĻŋāĻ āϞāĻžāĻāύ āϏāϰāĻžāύ⧠āĻšāϝāĻŧā§āĻā§):
$ sudo strace -e bpf bpftool prog load ./test.o bpf-mountpoint/test
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, prog_name="test", ...}, 120) = 3
bpf(BPF_OBJ_PIN, {pathname="bpf-mountpoint/test", bpf_fd=3}, 120) = 0āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϞā§āĻĄ āĻāϰā§āĻāĻŋ BPF_PROG_LOAD, āĻāĻžāϰā§āύā§āϞ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠āĻĒā§āϝāĻŧā§āĻā§ 3 āĻāĻŦāĻ āĻāĻŽāĻžāύā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠BPF_OBJ_PIN āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠āĻĒāĻŋāύ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ "bpf-mountpoint/test". āĻāϰ āĻĒāϰ āĻŦā§āĻāϞā§āĻĄāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ bpftool āĻāĻžāĻ āĻļā§āώ āĻšāϝāĻŧā§āĻā§, āĻāĻŋāύā§āϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻžāϰā§āύā§āϞ⧠āϰāϝāĻŧā§ āĻā§āĻā§, āϝāĻĻāĻŋāĻ āĻāĻŽāϰāĻž āĻāĻāĻŋāĻā§ āĻā§āύ⧠āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏ⧠āϏāĻāϝā§āĻā§āϤ āĻāϰāĻŋāύāĻŋ:
$ sudo bpftool prog | tail -3
783: xdp name test tag 5c8ba0cf164cb46c gpl
loaded_at 2020-05-05T13:27:08+0000 uid 0
xlated 24B jited 41B memlock 4096BāĻāĻŽāϰāĻž āϏāĻžāϧāĻžāϰāĻŖāϤ āĻĢāĻžāĻāϞ āĻ
āĻŦāĻā§āĻā§āĻ āĻŽā§āĻā§ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰāĻŋ unlink(2) āĻāĻŦāĻ āĻāϰ āĻĒāϰ⧠āϏāĻāĻļā§āϞāĻŋāώā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻŽā§āĻā§ āĻĢā§āϞāĻž āĻšāĻŦā§:
$ sudo rm ./bpf-mountpoint/test
$ sudo bpftool prog show id 783
Error: get by id (783): No such file or directoryāĻŦāϏā§āϤ⧠āĻŽā§āĻā§ āĻĢā§āϞāĻž āĻšāĻā§āĻā§
āĻŦāϏā§āϤā§āĻā§āϞāĻŋ āĻŽā§āĻā§ āĻĢā§āϞāĻžāϰ āĻŦāĻŋāώāϝāĻŧā§ āĻāĻĨāĻž āĻŦāϞāϤ⧠āĻāĻŋāϝāĻŧā§, āĻāĻāĻŋ āϏā§āĻĒāώā§āĻ āĻāϰāĻž āĻĒā§āϰāϝāĻŧā§āĻāύ āϝ⧠āĻāĻŽāϰāĻž āĻšā§āĻ (āĻāĻā§āύā§āĻ āĻā§āύāĻžāϰā§āĻāϰ) āĻĨā§āĻā§ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āϏāĻāϝā§āĻ āĻŦāĻŋāĻā§āĻāĻŋāύā§āύ āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻāĻāĻŋāĻ āύāϤā§āύ āĻāĻā§āύā§āĻ āĻāĻāĻŋāϰ āĻĒā§āϰāĻŦāϰā§āϤāύāĻā§ āĻā§āϰāĻŋāĻāĻžāϰ āĻāϰāĻŦā§ āύāĻž, āϤāĻŦā§, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āϏāĻŽāϏā§āϤ āĻŦāϰā§āϤāĻŽāĻžāύ āĻāĻāύāĻž āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻā§āϰāĻŽā§ āϏāĻŽā§āĻĒāύā§āύ āĻšāĻŦā§āĨ¤ .
āĻāĻŋāĻā§ āϧāϰāĻŖā§āϰ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻĒāύāĻžāĻā§ āĻĢā§āϞāĻžāĻāϤ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ, āϝā§āĻŽāύ āĻ
āύā§āĻā§āϰāĻŽ āĻĒāϰāĻŽāĻžāĻŖā§ āĻĒā§āϰāĻĻāĻžāύ replace = detach old program, attach new program. āĻāĻ āĻā§āώā§āϤā§āϰā§, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻĒā§āϰāĻžāύ⧠āϏāĻāϏā§āĻāϰāĻŖā§āϰ āϏāĻŽāϏā§āϤ āϏāĻā§āϰāĻŋāϝāĻŧ āĻĻā§āώā§āĻāĻžāύā§āϤāĻā§āϞāĻŋ āϤāĻžāĻĻā§āϰ āĻāĻžāĻ āĻļā§āώ āĻāϰāĻŦā§, āĻāĻŦāĻ āύāϤā§āύ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĨā§āĻā§ āύāϤā§āύ āĻāĻā§āύā§āĻ āĻšā§āϝāĻžāύā§āĻĄāϞāĻžāϰ āϤā§āϰāĻŋ āĻāϰāĻž āĻšāĻŦā§, āĻāĻŦāĻ āĻāĻāĻžāύ⧠"āĻĒāϰāĻŽāĻžāĻŖā§" āĻŽāĻžāύ⧠āĻāĻāĻāĻŋ āĻāĻā§āύā§āĻ āĻŽāĻŋāϏ āĻāϰāĻž āĻšāĻŦā§ āύāĻžāĨ¤
āĻāĻā§āύā§āĻ āĻāϤā§āϏā§āϰ āϏāĻžāĻĨā§ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϏāĻāϝā§āĻā§āϤ āĻāϰāĻž
āĻāĻ āύāĻŋāĻŦāύā§āϧā§, āĻāĻŽāϰāĻž āĻāϞāĻžāĻĻāĻžāĻāĻžāĻŦā§ āĻāĻā§āύā§āĻ āĻāϤā§āϏā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻāĻāĻžāϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻŦāϰā§āĻŖāύāĻž āĻāϰāĻŦ āύāĻž, āϝā§āĻšā§āϤ⧠āĻāĻāĻŋ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϧāϰāĻŖā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻĒā§āϰā§āĻā§āώāĻžāĻĒāĻā§ āĻāĻāĻŋ āĻ āϧā§āϝāϝāĻŧāύ āĻāϰāĻž āĻŦā§āϧāĻāĻŽā§āϝāĨ¤ āϏā§āĻŽāĻŋ. āύā§āĻā§, āϝā§āĻāĻžāύ⧠āĻāĻŽāϰāĻž XDP-āĻāϰ āĻŽāϤ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāĻā§ āĻā§āĻāĻžāĻŦā§ āϏāĻāϝā§āĻā§āϤ āĻāϰāĻž āĻšāϝāĻŧ āϤāĻž āĻĻā§āĻāĻžāĻāĨ¤
āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻ āĻŦāĻā§āĻā§āĻ āĻŽā§āϝāĻžāύāĻŋāĻĒā§āϞā§āĻ āĻāϰāĻž
āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ
āϏāĻŽāϏā§āϤ BPF āĻŦāϏā§āϤ⧠āĻāĻāĻāĻŋ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏā§āĻĨāĻžāύ āĻĨā§āĻā§ āϤā§āϰāĻŋ āĻāĻŦāĻ āĻĒāϰāĻŋāĻāĻžāϞāĻŋāϤ āĻšāϝāĻŧ bpf, āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻĒā§āϰā§āĻā§āĻāĻžāĻāĻĒ āĻāĻā§:
#include <linux/bpf.h>
int bpf(int cmd, union bpf_attr *attr, unsigned int size);āĻāĻāĻžāύ⧠āĻĻāϞ cmd āĻāĻžāĻāĻĒā§āϰ āĻŽāĻžāύāĻā§āϞāĻŋāϰ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋ , attr - āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāύā§āϝ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āĻāĻŦāĻ size - āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āĻ
āύā§āϝāĻžāϝāĻŧā§ āĻŦāϏā§āϤā§āϰ āĻāĻāĻžāϰ, āϝā§āĻŽāύ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāĻ sizeof(*attr). āĻāĻžāϰā§āύā§āϞ 5.8-āĻ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ bpf 34āĻāĻŋ āĻāĻŋāύā§āύ āĻāĻŽāĻžāύā§āĻĄ āϏāĻŽāϰā§āĻĨāύ āĻāϰ⧠āĻāĻŦāĻ union bpf_attr 200 āϞāĻžāĻāύ āĻĻāĻāϞ āĻāϰā§āĨ¤ āϤāĻŦā§ āĻāĻŽāĻžāĻĻā§āϰ āĻāϤ⧠āĻāϝāĻŧ āĻĒāĻžāĻāϝāĻŧāĻž āĻāĻāĻŋāϤ āύāϝāĻŧ, āϝā§āĻšā§āϤ⧠āĻāĻŽāϰāĻž āĻŦā§āĻļ āĻāϝāĻŧā§āĻāĻāĻŋ āύāĻŋāĻŦāύā§āϧā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻŽāĻžāύā§āĻĄ āĻāĻŦāĻ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āύāĻŋāĻā§āĻĻā§āϰ āĻĒāϰāĻŋāĻāĻŋāϤ āĻāϰāĻŦāĨ¤
āĻĻāϞ āĻĻāĻŋāϝāĻŧā§ āĻļā§āϰ⧠āĻāϰāĻž āϝāĻžāĻ BPF_PROG_LOAD, āϝāĻž BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϤā§āϰāĻŋ āĻāϰ⧠- BPF āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞā§āϰ āĻāĻāĻāĻŋ āϏā§āĻ āύā§āϝāĻŧ āĻāĻŦāĻ āĻāĻāĻŋ āĻāĻžāϰā§āύā§āϞ⧠āϞā§āĻĄ āĻāϰā§āĨ¤ āϞā§āĻĄ āĻāϰāĻžāϰ āĻŽā§āĻšā§āϰā§āϤā§, āϝāĻžāĻāĻžāĻāĻāĻžāϰā§āĻāĻŋ āĻāĻžāϞ⧠āĻāϰāĻž āĻšāϝāĻŧ, āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ⧠JIT āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āĻāĻŦāĻ āϏāĻĢāϞāĻāĻžāĻŦā§ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻāϰāĻžāϰ āĻĒāϰā§, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĢāĻžāĻāϞā§āϰ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āĻĢā§āϰāϤ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧāĨ¤ āĻāĻŽāϰāĻž āĻāĻā§āϰ āĻŦāĻŋāĻāĻžāĻā§ āϤāĻžāϰ āĻĒāϰ⧠āĻāĻŋ āĻāĻāϤ⧠āĻĻā§āĻā§āĻāĻŋ .
āĻāĻāύ āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻāĻŽ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞāĻŋāĻāĻŦ āϝāĻž āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞā§āĻĄ āĻāϰāĻŦā§, āϤāĻŦā§ āĻĒā§āϰāĻĨāĻŽā§ āĻāĻŽāĻžāĻĻā§āϰ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāϤ⧠āĻšāĻŦā§ āϝ⧠āĻāĻŽāϰāĻž āĻā§āύ āϧāϰāύā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞā§āĻĄ āĻāϰāϤ⧠āĻāĻžāĻ - āĻāĻŽāĻžāĻĻā§āϰ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰāϤ⧠āĻšāĻŦā§ āĻāĻŦāĻ āĻāĻ āϧāϰāύā§āϰ āĻāĻžāĻ āĻžāĻŽā§āϰ āĻŽāϧā§āϝā§, āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞāĻŋāĻā§āύ āϝāĻž āϝāĻžāĻāĻžāĻāĻāĻžāϰ⧠āĻĒāϰā§āĻā§āώāĻžāϝāĻŧ āĻāϤā§āϤā§āϰā§āĻŖ āĻšāĻŦā§āĨ¤ āϝāĻžāĻāĻšā§āĻ, āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāĻŋāĻā§ āĻāĻāĻŋāϞ āύāĻž āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻāĻžāύ⧠āĻāĻāĻāĻŋ āĻĒā§āϰāϏā§āϤā§āϤ āϏāĻŽāĻžāϧāĻžāύ āϰāϝāĻŧā§āĻā§: āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻā§āϰāĻšāĻŖ āĻāϰāĻŦ BPF_PROG_TYPE_XDP, āϝāĻž āĻŽāĻžāύ āĻĢā§āϰāϤ āĻĻā§āĻŦā§ XDP_PASS (āϏāĻŽāϏā§āϤ āĻĒā§āϝāĻžāĻā§āĻ āĻāĻĄāĻŧāĻŋāϝāĻŧā§ āϝāĻžāύ)āĨ¤ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻ
ā§āϝāĻžāϏā§āĻŽā§āĻŦāϞāĻžāϰ⧠āĻāĻāĻŋ āĻā§āĻŦ āϏāĻšāĻ āĻĻā§āĻāĻžāϝāĻŧ:
r0 = 2
exitāĻāĻŽāϰāĻž āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύā§āĻāϝāĻŧāĻžāϰ āĻĒāϰ āϝ⧠āĻāĻŽāϰāĻž āĻāĻĒāϞā§āĻĄ āĻāϰāĻŦ, āĻāĻŽāϰāĻž āĻāĻĒāύāĻžāĻā§ āĻŦāϞāϤ⧠āĻĒāĻžāϰāĻŋ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻŽāϰāĻž āĻāĻāĻŋ āĻāϰāĻŦ:
#define _GNU_SOURCE
#include <string.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/bpf.h>
static inline __u64 ptr_to_u64(const void *ptr)
{
return (__u64) (unsigned long) ptr;
}
int main(void)
{
struct bpf_insn insns[] = {
{
.code = BPF_ALU64 | BPF_MOV | BPF_K,
.dst_reg = BPF_REG_0,
.imm = XDP_PASS
},
{
.code = BPF_JMP | BPF_EXIT
},
};
union bpf_attr attr = {
.prog_type = BPF_PROG_TYPE_XDP,
.insns = ptr_to_u64(insns),
.insn_cnt = sizeof(insns)/sizeof(insns[0]),
.license = ptr_to_u64("GPL"),
};
strncpy(attr.prog_name, "woo", sizeof(attr.prog_name));
syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
for ( ;; )
pause();
}āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āĻāĻāϰā§āώāĻŖā§āϝāĻŧ āĻāĻāύāĻžāĻā§āϞāĻŋ āĻāĻāĻāĻŋ āĻ
ā§āϝāĻžāϰā§āϰ āϏāĻāĻā§āĻāĻž āĻĻāĻŋāϝāĻŧā§ āĻļā§āϰ⧠āĻšāϝāĻŧ insns - āĻŽā§āĻļāĻŋāύ āĻā§āĻĄā§ āĻāĻŽāĻžāĻĻā§āϰ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĨ¤ āĻāĻ āĻā§āώā§āϤā§āϰā§, BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ āύāĻŋāϰā§āĻĻā§āĻļ āĻāĻžāĻ āĻžāĻŽā§āϰ āĻŽāϧā§āϝ⧠āĻĒā§āϝāĻžāĻ āĻāϰāĻž āĻšāϝāĻŧ . āĻĒā§āϰāĻĨāĻŽ āĻāĻĒāĻžāĻĻāĻžāύ insns āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āĻŽā§āύ⧠āĻāϞ⧠r0 = 2, āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧ - exit.
āĻĒāĻļā§āĻāĻžāĻĻāĻĒāϏāϰāĻŖāĨ¤ āĻāĻžāϰā§āύā§āϞ āĻŽā§āĻļāĻŋāύ āĻā§āĻĄ āϞā§āĻāĻžāϰ āĻāύā§āϝ āĻāĻŦāĻ āĻāĻžāϰā§āύā§āϞ āĻšā§āĻĄāĻžāϰ āĻĢāĻžāĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāϰāĻ āϏā§āĻŦāĻŋāϧāĻžāĻāύāĻ āĻŽā§āϝāĻžāĻā§āϰ⧠āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰ⧠tools/include/linux/filter.h āĻāĻŽāϰāĻž āϞāĻŋāĻāϤ⧠āĻĒāĻžāϰāϤāĻžāĻŽ
struct bpf_insn insns[] = {
BPF_MOV64_IMM(BPF_REG_0, XDP_PASS),
BPF_EXIT_INSN()
};āĻāĻŋāύā§āϤ⧠āϝā§āĻšā§āϤ⧠āύā§āĻāĻŋāĻ āĻā§āĻĄā§ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āϞā§āĻāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻžāϰā§āύā§āϞ⧠āĻĒāϰā§āĻā§āώāĻž āĻāĻŦāĻ BPF āϏāĻŽā§āĻĒāϰā§āĻā§ āύāĻŋāĻŦāύā§āϧ āϞā§āĻāĻžāϰ āĻāύā§āϝ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ, āϤāĻžāĻ āĻāĻ āĻŽā§āϝāĻžāĻā§āϰā§āĻā§āϞāĻŋāϰ āĻ āύā§āĻĒāϏā§āĻĨāĻŋāϤāĻŋ āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰā§āϰ āĻā§āĻŦāύāĻā§ āϏāϤā§āϝāĻŋāĻ āĻāĻāĻŋāϞ āĻāϰ⧠āύāĻžāĨ¤
BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻŽāϰāĻž āĻāĻāĻŋ āĻāĻžāϰā§āύā§āϞ⧠āϞā§āĻĄ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻŋāϝāĻŧā§ āϝāĻžāĻāĨ¤ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰā§āϰ āύā§āϝā§āύāϤāĻŽ āϏā§āĻ attr āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āϧāϰāύ, āϏā§āĻ āĻāĻŦāĻ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞā§āϰ āϏāĻāĻā§āϝāĻž, āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āϞāĻžāĻāϏā§āύā§āϏ āĻāĻŦāĻ āύāĻžāĻŽ āĻ
āύā§āϤāϰā§āĻā§āĻā§āϤ "woo", āϝāĻž āĻāĻŽāϰāĻž āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰāĻžāϰ āĻĒāϰ⧠āϏāĻŋāϏā§āĻā§āĻŽā§ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻā§āĻāĻā§ āĻĒā§āϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŋāĨ¤ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ, āĻĒā§āϰāϤāĻŋāĻļā§āϰā§āϤāĻŋ āĻ
āύā§āϝāĻžāϝāĻŧā§, āĻāĻāĻāĻŋ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻŋāϏā§āĻā§āĻŽā§ āϞā§āĻĄ āĻāϰāĻž āĻšāϝāĻŧ bpf.
āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻļā§āώ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻ
āϏā§āĻŽ āϞā§āĻĒā§ āĻļā§āώ āĻšāĻ āϝāĻž āĻĒā§āϞā§āĻĄāĻā§ āĻ
āύā§āĻāϰāĻŖ āĻāϰā§āĨ¤ āĻāĻāĻŋ āĻāĻžāĻĄāĻŧāĻž, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻžāϰā§āύā§āϞ āĻĻā§āĻŦāĻžāϰāĻž āĻŽā§āϰ⧠āĻĢā§āϞāĻž āĻšāĻŦā§ āϝāĻāύ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞāĻāĻŋ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āĻĢāĻŋāϰ⧠āĻāϏāĻž āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰā§āĻāĻŋ āĻŦāύā§āϧ āĻšāϝāĻŧā§ āϝāĻžāĻŦā§ bpf, āĻāĻŦāĻ āĻāĻŽāϰāĻž āĻāĻāĻŋ āϏāĻŋāϏā§āĻā§āĻŽā§ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦ āύāĻžāĨ¤
āĻāϝāĻŧā§āϞ, āĻāĻŽāϰāĻž āĻĒāϰā§āĻā§āώāĻžāϰ āĻāύā§āϝ āĻĒā§āϰāϏā§āϤā§āϤ. āĻāϰ āĻ
āϧā§āύ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻāϤā§āϰāĻŋāϤ āĻāϰāĻž āϝāĻžāĻ āĻāĻŦāĻ āϰāĻžāύ straceāϏāĻŦāĻāĻŋāĻā§ āϝā§āĻŽāύ āĻāĻāĻŋāϤ āϤā§āĻŽāύ āĻāĻžāĻ āĻāϰāĻā§ āĻāĻŋāύāĻž āϤāĻž āĻĒāϰā§āĻā§āώāĻž āĻāϰāϤā§:
$ clang -g -O2 simple-prog.c -o simple-prog
$ sudo strace ./simple-prog
execve("./simple-prog", ["./simple-prog"], 0x7ffc7b553480 /* 13 vars */) = 0
...
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=2, insns=0x7ffe03c4ed50, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_V
ERSION(0, 0, 0), prog_flags=0, prog_name="woo", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS}, 72) = 3
pause(āϏāĻŦāĻāĻŋāĻā§ āĻ āĻŋāĻ āĻāĻā§, bpf(2) āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āĻšā§āϝāĻžāύā§āĻĄā§āϞ 3 āĻĢāĻŋāϰ⧠āĻāϏā§āĻā§ āĻāĻŦāĻ āĻāĻŽāϰāĻž āĻāϰ āϏāĻžāĻĨā§ āĻāĻāĻāĻŋ āĻ
āϏā§āĻŽ āϞā§āĻĒā§ āĻāĻŋāϝāĻŧā§āĻāĻŋāϞāĻžāĻŽ pause(). āĻāϏā§āύ āϏāĻŋāϏā§āĻā§āĻŽā§ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻŋāĨ¤ āĻāĻāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāϰāĻž āĻ
āύā§āϝ āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ⧠āϝāĻžāĻŦ āĻāĻŦāĻ āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦ bpftool:
# bpftool prog | grep -A3 woo
390: xdp name woo tag 3b185187f1855c4c gpl
loaded_at 2020-08-31T24:66:44+0000 uid 0
xlated 16B jited 40B memlock 4096B
pids simple-prog(10381)āĻāĻŽāϰāĻž āĻĻā§āĻāϤ⧠āĻĒāĻžāĻ āϝ⧠āϏāĻŋāϏā§āĻā§āĻŽā§ āĻāĻāĻāĻŋ āϞā§āĻĄ āĻāϰāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϰāϝāĻŧā§āĻā§ woo āϝāĻžāϰ āĻā§āϞā§āĻŦāĻžāϞ āĻāĻāĻĄāĻŋ 390 āĻāĻŦāĻ āĻŦāϰā§āϤāĻŽāĻžāύ⧠āĻāϞāĻā§ simple-prog āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻĻāĻŋāĻā§ āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰ⧠āĻāĻāĻāĻŋ āĻā§āϞāĻž āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠āϰāϝāĻŧā§āĻā§ (āĻāĻŦāĻ āϝāĻĻāĻŋ simple-prog āϤāĻžāϰāĻĒāϰ āĻāĻžāĻ āĻļā§āώ āĻāϰāĻŦā§ woo āĻ
āĻĻā§āĻļā§āϝ āĻšāĻŦā§). āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ āĻšāĻŋāϏāĻžāĻŦā§, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ woo BPF āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰ⧠āĻŦāĻžāĻāύāĻžāϰāĻŋ āĻā§āĻĄā§āϰ āĻĻā§āĻāĻŋ āύāĻŋāϰā§āĻĻā§āĻļāύāĻž - 16 āĻŦāĻžāĻāĻ āϞāĻžāĻā§, āĻāĻŋāύā§āϤ⧠āĻāϰ āϏā§āĻĨāĻžāύā§āϝāĻŧ āĻāĻāĻžāϰ⧠(x86_64) - āĻāĻāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝ⧠40 āĻŦāĻžāĻāĻāĨ¤ āĻāϏā§āύ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāĻā§ āĻāϰ āĻāϏāϞ āĻāĻāĻžāϰ⧠āĻĻā§āĻāĻŋ:
# bpftool prog dump xlated id 390
0: (b7) r0 = 2
1: (95) exitāĻā§āĻžāύ āĻāĻŽāĻ āύāĻžāĻ. āĻāĻāύ āĻā§āĻāĻāĻāĻŋ āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āĻĻā§āĻŦāĻžāϰāĻž āĻāϤā§āĻĒāύā§āύ āĻā§āĻĄ āĻĻā§āĻā§āύ:
# bpftool prog dump jited id 390
bpf_prog_3b185187f1855c4c_woo:
0: nopl 0x0(%rax,%rax,1)
5: push %rbp
6: mov %rsp,%rbp
9: sub $0x0,%rsp
10: push %rbx
11: push %r13
13: push %r14
15: push %r15
17: pushq $0x0
19: mov $0x2,%eax
1e: pop %rbx
1f: pop %r15
21: pop %r14
23: pop %r13
25: pop %rbx
26: leaveq
27: retqāĻāύā§āϝ āĻā§āĻŦ āĻāĻžāϰā§āϝāĻāϰ āύāϝāĻŧ exit(2), āĻāĻŋāύā§āϤ⧠āύā§āϝāĻžāϝā§āϝāϤāĻžāϰ āĻĻāĻŋāĻ āĻĨā§āĻā§, āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻā§āĻŦāĻ āϏāĻšāĻ, āĻāĻŦāĻ āĻ
-āϤā§āĻā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāϰ āĻāύā§āϝ JIT āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āĻĻā§āĻŦāĻžāϰāĻž āϝā§āĻ āĻāϰāĻž āĻĒā§āϰāϏā§āϤāĻžāĻŦāύāĻž āĻāĻŦāĻ āĻāĻĒāϏāĻāĻšāĻžāϰ āĻ
āĻŦāĻļā§āϝāĻ āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤
āĻŽāĻžāύāĻāĻŋāϤā§āϰ
BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻāĻžāĻ āĻžāĻŽā§āĻāϤ āĻŽā§āĻŽāϰāĻŋ āĻ
āĻā§āĻāϞāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āϝāĻž āĻ
āύā§āϝāĻžāύā§āϝ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏā§āĻĨāĻžāύā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāϤ⧠āĻāĻāϝāĻŧāĻ āĻ
ā§āϝāĻžāĻā§āϏā§āϏāϝā§āĻā§āϝāĨ¤ āĻāĻ āĻ
āĻŦāĻā§āĻā§āĻāĻā§āϞāĻŋāĻā§ āĻŽā§āϝāĻžāĻĒ āĻŦāϞāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āĻāĻ āĻŦāĻŋāĻāĻžāĻā§ āĻāĻŽāϰāĻž āĻĻā§āĻāĻžāĻŦ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϤāĻžāĻĻā§āϰ āĻŽā§āϝāĻžāύāĻŋāĻĒā§āϞā§āĻ āĻāϰāĻž āϝāĻžāϝāĻŧ bpf.
āĻāϏā§āύ āĻāĻāύāĻ āĻŦāϞāĻŋ āϝ⧠āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āĻā§āώāĻŽāϤāĻžāĻā§āϞāĻŋ āĻā§āĻŦāϞ āĻāĻžāĻ āĻāϰāĻž āĻŽā§āĻŽāϰāĻŋāϤ⧠āĻ
ā§āϝāĻžāĻā§āϏā§āϏā§āϰ āĻŽāϧā§āϝ⧠āϏā§āĻŽāĻžāĻŦāĻĻā§āϧ āύāϝāĻŧāĨ¤ āĻāĻāĻžāύ⧠āĻŦāĻŋāĻļā§āώ-āĻāĻĻā§āĻĻā§āĻļā§āϝā§āϰ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āϰāϝāĻŧā§āĻā§, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āĻŦāĻž āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ, āĻĒāĻžāϰāĻĢ āĻāĻā§āύā§āĻāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤ āĻāĻŽāϰāĻž āĻāĻāĻžāύ⧠āϤāĻžāĻĻā§āϰ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĨāĻž āĻŦāϞāĻŦ āύāĻž, āϝāĻžāϤ⧠āĻĒāĻžāĻ āĻ āĻŦāĻŋāĻā§āϰāĻžāύā§āϤ āύāĻž āĻšāϝāĻŧāĨ¤ āĻāĻāĻŋ āĻāĻžāĻĄāĻŧāĻžāĻ, āĻāĻŽāϰāĻž āϏāĻŋāĻā§āĻā§āϰā§āύāĻžāĻāĻā§āĻļāύ āϏāĻŽāϏā§āϝāĻžāĻā§āϞāĻŋ āĻāĻĒā§āĻā§āώāĻž āĻāϰāĻŋ, āϝā§āĻšā§āϤ⧠āĻāĻāĻŋ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āύāϝāĻŧ⧎ āĻāĻĒāϞāĻŦā§āϧ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻĒā§āϰāĻāĻžāϰā§āϰ āĻāĻāĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āϤāĻžāϞāĻŋāĻāĻž āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāĻŦā§ , āĻāĻŦāĻ āĻāĻ āĻŦāĻŋāĻāĻžāĻā§ āĻāĻŽāϰāĻž āĻāϤāĻŋāĻšāĻžāϏāĻŋāĻāĻāĻžāĻŦā§ āĻĒā§āϰāĻĨāĻŽ āϧāϰāύā§āϰ, āĻšā§āϝāĻžāĻļ āĻā§āĻŦāĻŋāϞā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖ āĻšāĻŋāϏā§āĻŦā§ āύā§āĻŦ BPF_MAP_TYPE_HASH.
āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āĻšā§āϝāĻžāĻļ āĻā§āĻŦāĻŋāϞ āϤā§āϰāĻŋ āĻāϰā§āύ, āĻŦāϞā§āύ, C++, āĻāĻĒāύāĻŋ āĻŦāϞāĻŦā§āύ unordered_map<int,long> woo, āϝāĻžāϰ āϰāĻžāĻļāĻŋāϝāĻŧāĻžāύ āĻ
āϰā§āĻĨ "āĻāĻŽāĻžāϰ āĻāĻāĻāĻŋ āĻā§āĻŦāĻŋāϞ āĻĻāϰāĻāĻžāϰ woo āϏā§āĻŽāĻžāĻšā§āύ āĻāĻāĻžāϰ, āϝāĻžāϰ āĻā§ āĻāĻžāĻāĻĒā§āϰ int, āĻāĻŦāĻ āĻŽāĻžāύ āĻšāϞ āĻĒā§āϰāĻāĻžāϰ long" āĻāĻāĻāĻŋ BPF āĻšā§āϝāĻžāĻļ āĻā§āĻŦāĻŋāϞ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻŽāĻžāĻĻā§āϰ āĻāĻāĻ āĻāĻŋāύāĻŋāϏ āĻāϰāϤ⧠āĻšāĻŦā§, āĻāĻŽāĻžāĻĻā§āϰ āĻā§āĻŦāĻŋāϞā§āϰ āϏāϰā§āĻŦā§āĻā§āĻ āĻāĻāĻžāϰ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§, āĻāĻŦāĻ āĻā§ āĻāĻŦāĻ āĻŽāĻžāύāĻā§āϞāĻŋāϰ āϧāϰāύ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰāĻžāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤā§, āĻāĻŽāĻžāĻĻā§āϰ āĻŦāĻžāĻāĻā§ āϤāĻžāĻĻā§āϰ āĻāĻāĻžāϰ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§ . āĻŽāĻžāύāĻāĻŋāϤā§āϰ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻāĻŽāĻžāύā§āĻĄāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ BPF_MAP_CREATE āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ bpf. āĻāϏā§āύ āĻāĻāĻāĻŋ āĻāĻŽ āĻŦāĻž āĻāĻŽ āύā§āϝā§āύāϤāĻŽ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĻā§āĻā§āύ āϝāĻž āĻāĻāĻāĻŋ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āϤā§āϰāĻŋ āĻāϰā§āĨ¤ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āϞā§āĻĄ āĻāϰ⧠āĻāĻŽāύ āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻĒāϰā§, āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻžāĻā§ āϏāĻšāĻ āĻŽāύ⧠āĻšāĻŦā§:
$ cat simple-map.c
#define _GNU_SOURCE
#include <string.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/bpf.h>
int main(void)
{
union bpf_attr attr = {
.map_type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(int),
.value_size = sizeof(int),
.max_entries = 4,
};
strncpy(attr.map_name, "woo", sizeof(attr.map_name));
syscall(__NR_bpf, BPF_MAP_CREATE, &attr, sizeof(attr));
for ( ;; )
pause();
}āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰā§āϰ āĻāĻāĻāĻŋ āϏā§āĻ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻŋ attr, āϝā§āĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻŦāϞāĻŋ "āĻāĻŽāĻžāϰ āĻā§ āĻāĻŦāĻ āĻāĻāĻžāϰā§āϰ āĻŽāĻžāύ āϏāĻš āĻāĻāĻāĻŋ āĻšā§āϝāĻžāĻļ āĻā§āĻŦāĻŋāϞ āĻĻāϰāĻāĻžāϰ sizeof(int), āϝāĻžāϤ⧠āĻāĻŽāĻŋ āϏāϰā§āĻŦā§āĻā§āĻ āĻāĻžāϰāĻāĻŋ āĻāĻĒāĻžāĻĻāĻžāύ āϰāĻžāĻāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤" BPF āĻŽāĻžāύāĻāĻŋāϤā§āϰ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāĻĒāύāĻŋ āĻ
āύā§āϝāĻžāύā§āϝ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖā§āϰ āĻŽāϤā§āĻ, āĻāĻŽāϰāĻž āĻŦāϏā§āϤā§āϰ āύāĻžāĻŽ āĻšāĻŋāϏāĻžāĻŦā§ āĻāϞā§āϞā§āĻ āĻāϰā§āĻāĻŋ "woo".
āĻāϞā§āύ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāĻŦāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϰāĻžāύ āĻāϰāĻž āϝāĻžāĻ:
$ clang -g -O2 simple-map.c -o simple-map
$ sudo strace ./simple-map
execve("./simple-map", ["./simple-map"], 0x7ffd40a27070 /* 14 vars */) = 0
...
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_HASH, key_size=4, value_size=4, max_entries=4, map_name="woo", ...}, 72) = 3
pause(āĻāĻāĻžāύ⧠āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ bpf(2) āĻāĻŽāĻžāĻĻā§āϰ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠āĻŽāĻžāύāĻāĻŋāϤā§āϰ āύāĻŽā§āĻŦāϰ āĻĢā§āϰāϤ 3 āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ, āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ āĻšāĻŋāϏāĻžāĻŦā§, āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ⧠āĻāϰāĻ āύāĻŋāϰā§āĻĻā§āĻļā§āϰ āĻāύā§āϝ āĻ
āĻĒā§āĻā§āώāĻž āĻāϰ⧠pause(2).
āĻāĻāύ āĻāϏā§āύ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāĻā§ āĻŦā§āϝāĻžāĻāĻā§āϰāĻžāĻāύā§āĻĄā§ āĻĒāĻžāĻ āĻžāĻ āĻŦāĻž āĻ
āύā§āϝ āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ āĻā§āϞāĻŋ āĻāĻŦāĻ āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻ
āĻŦāĻā§āĻā§āĻāĻāĻŋ āĻĻā§āĻāĻŋ bpftool (āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āύāĻžāĻŽ āĻĻāĻŋāϝāĻŧā§ āĻ
āύā§āϝāĻĻā§āϰ āĻĨā§āĻā§ āĻāϞāĻžāĻĻāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ):
$ sudo bpftool map
...
114: hash name woo flags 0x0
key 4B value 4B max_entries 4 memlock 4096B
...114 āύāĻŽā§āĻŦāϰ āĻšāϞ āĻāĻŽāĻžāĻĻā§āϰ āĻŦāϏā§āϤā§āϰ āĻā§āϞā§āĻŦāĻžāϞ āĻāĻāĻĄāĻŋāĨ¤ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āϝā§āĻā§āύ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻŽāĻžāύā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻā§āϞāϤ⧠āĻāĻ āĻāĻāĻĄāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠BPF_MAP_GET_FD_BY_ID āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ bpf.
āĻāĻāύ āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻšā§āϝāĻžāĻļ āĻā§āĻŦāĻŋāϞā§āϰ āϏāĻžāĻĨā§ āĻā§āϞāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āĻāϏā§āύ āĻāϰ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻĻā§āĻāĻŋ:
$ sudo bpftool map dump id 114
Found 0 elementsāĻāĻžāϞāĻŋāĨ¤ āĻāϰ āĻāĻāĻāĻŋ āĻŽāĻžāύ āĻāϰāĻž āϝāĻžāĻ hash[1] = 1:
$ sudo bpftool map update id 114 key 1 0 0 0 value 1 0 0 0āĻāϏā§āύ āĻāĻŦāĻžāϰ āĻā§āĻŦāĻŋāϞāĻāĻŋ āĻĻā§āĻāĻŋ:
$ sudo bpftool map dump id 114
key: 01 00 00 00 value: 01 00 00 00
Found 1 elementāĻšā§āϰāϰā§! āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻāĻĒāĻžāĻĻāĻžāύ āϝā§āĻ āĻāϰāϤ⧠āĻĒāϰāĻŋāĻāĻžāϞāĻŋāϤ. āĻāϞā§āϞā§āĻā§āϝ āϝ⧠āĻāĻāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰāĻā§ āĻŦāĻžāĻāĻ āϞā§āĻā§āϞ⧠āĻāĻžāĻ āĻāϰāϤ⧠āĻšāĻŦā§, āϝā§āĻšā§āϤ⧠bptftool āĻšā§āϝāĻžāĻļ āĻā§āĻŦāĻŋāϞā§āϰ āĻŽāĻžāύāĻā§āϞāĻŋ āĻā§ āϧāϰāĻŖā§āϰ āϤāĻž āĻāĻžāύ⧠āύāĻžāĨ¤ (āĻāĻ āĻā§āĻāĻžāύāĻāĻŋ BTF āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϤāĻžāϰ āĻāĻžāĻā§ āϏā§āĻĨāĻžāύāĻžāύā§āϤāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§, āϤāĻŦā§ āĻāĻāύ āϏ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰāĻ āĻŦā§āĻļāĻŋ āĻāĻŋāĻā§āĨ¤)
āĻ āĻŋāĻ āĻāĻŋāĻāĻžāĻŦā§ bpftool āĻĒāĻĄāĻŧāϤ⧠āĻāĻŦāĻ āĻāĻĒāĻžāĻĻāĻžāύ āϝā§āĻ āĻāϰā§? āĻāϏā§āύ āĻšā§āĻĄā§āϰ āύā§āĻā§ āĻāĻāĻŦāĻžāϰ āĻĻā§āĻā§ āύā§āĻāϝāĻŧāĻž āϝāĻžāĻ:
$ sudo strace -e bpf bpftool map dump id 114
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=114, next_id=0, open_flags=0}, 120) = 3
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=NULL, next_key=0x55856ab65280}, 120) = 0
bpf(BPF_MAP_LOOKUP_ELEM, {map_fd=3, key=0x55856ab65280, value=0x55856ab652a0}, 120) = 0
key: 01 00 00 00 value: 01 00 00 00
bpf(BPF_MAP_GET_NEXT_KEY, {map_fd=3, key=0x55856ab65280, next_key=0x55856ab65280}, 120) = -1 ENOENTāĻĒā§āϰāĻĨāĻŽā§ āĻāĻŽāϰāĻž āĻāĻŽāĻžāύā§āĻĄāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāϰ āĻā§āϞā§āĻŦāĻžāϞ āĻāĻāĻĄāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āĻŽāĻžāύāĻāĻŋāϤā§āϰāĻāĻŋ āĻā§āϞāϞāĻžāĻŽ BPF_MAP_GET_FD_BY_ID и bpf(2) āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠3 āĻĢā§āϰāϤ āĻĻāĻŋāϝāĻŧā§āĻā§āĨ¤ āĻāϰāĻ āĻāĻŽāĻžāύā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠BPF_MAP_GET_NEXT_KEY āĻāĻŽāϰāĻž āĻĒāĻžāϏ āĻāϰ⧠āĻā§āĻŦāĻŋāϞ⧠āĻĒā§āϰāĻĨāĻŽ āĻā§ āĻā§āĻāĻā§ āĻĒā§āϝāĻŧā§āĻāĻŋ NULL "āĻāĻā§āϰ" āĻā§-āϤ⧠āύāĻŋāϰā§āĻĻā§āĻļāĻ āĻšāĻŋāϏāĻžāĻŦā§āĨ¤ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āĻāĻžāĻŦāĻŋ āĻĨāĻžāĻāϞ⧠āĻāĻŽāϰāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ BPF_MAP_LOOKUP_ELEMāϝāĻž āĻāĻāĻāĻŋ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ⧠āĻāĻāĻāĻŋ āĻŽāĻžāύ āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠value. āĻĒāϰāĻŦāϰā§āϤ⧠āϧāĻžāĻĒ āĻšāϞ āĻāĻŽāϰāĻž āĻŦāϰā§āϤāĻŽāĻžāύ āĻā§āϤ⧠āĻāĻāĻāĻŋ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āĻĻāĻŋāϝāĻŧā§ āĻĒāϰāĻŦāϰā§āϤ⧠āĻāĻĒāĻžāĻĻāĻžāύ āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻŋ, āĻāĻŋāύā§āϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻā§āĻŦāĻŋāϞ⧠āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻāĻŋ āĻāĻĒāĻžāĻĻāĻžāύ āĻāĻŦāĻ āĻāĻŽāĻžāύā§āĻĄ āϰāϝāĻŧā§āĻā§ BPF_MAP_GET_NEXT_KEY āĻĒā§āϰāϤā§āϝāĻžāĻŦāϰā§āϤāύ ENOENT.
āĻ āĻŋāĻ āĻāĻā§, āĻāϏā§āύ āĻā§ 1 āĻĻā§āĻŦāĻžāϰāĻž āĻŽāĻžāύ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻŋ, āĻāϏā§āύ āĻŦāϞāĻŋ āĻāĻŽāĻžāĻĻā§āϰ āĻŦā§āϝāĻŦāϏāĻžāϝāĻŧāĻŋāĻ āϝā§āĻā§āϤāĻŋāϰ āĻāύā§āϝ āύāĻŋāĻŦāύā§āϧāύ āĻĒā§āϰāϝāĻŧā§āĻāύ hash[1] = 2:
$ sudo strace -e bpf bpftool map update id 114 key 1 0 0 0 value 2 0 0 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=114, next_id=0, open_flags=0}, 120) = 3
bpf(BPF_MAP_UPDATE_ELEM, {map_fd=3, key=0x55dcd72be260, value=0x55dcd72be280, flags=BPF_ANY}, 120) = 0āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ āĻšāĻŋāϏāĻžāĻŦā§, āĻāĻāĻŋ āĻā§āĻŦ āϏāĻšāĻ: āĻāĻŽāĻžāύā§āĻĄ BPF_MAP_GET_FD_BY_ID āĻāĻāĻĄāĻŋ āĻāĻŦāĻ āĻāĻŽāĻžāύā§āĻĄ āĻĻā§āĻŦāĻžāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻā§āϞ⧠BPF_MAP_UPDATE_ELEM āĻāĻĒāĻžāĻĻāĻžāύāĻāĻŋ āĻāĻāĻžāϰāϰāĻžāĻāĻ āĻāϰā§āĨ¤
āϏā§āϤāϰāĻžāĻ, āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻšā§āϝāĻžāĻļ āĻā§āĻŦāĻŋāϞ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻĒāϰā§, āĻāĻŽāϰāĻž āĻ āύā§āϝ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĨā§āĻā§ āĻāϰ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻĒāĻĄāĻŧāϤ⧠āĻāĻŦāĻ āϞāĻŋāĻāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ āϝ⧠āϝāĻĻāĻŋ āĻāĻŽāϰāĻž āĻāĻŽāĻžāύā§āĻĄ āϞāĻžāĻāύ āĻĨā§āĻā§ āĻāĻāĻŋ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻšāĻ, āϤāĻžāĻšāϞ⧠āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻ āύā§āϝ āĻā§āύ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻĒāϰ⧠āĻŦāϰā§āĻŖāĻŋāϤ āĻāĻŽāĻžāύā§āĻĄāĻā§āϞāĻŋ āĻāĻžāĻĄāĻŧāĻžāĻ, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏā§āĻĨāĻžāύ āĻĨā§āĻā§ āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ, :
BPF_MAP_LOOKUP_ELEM: āĻā§ āĻĻā§āĻŦāĻžāϰāĻž āĻŽāĻžāύ āĻā§āĻāĻā§āύBPF_MAP_UPDATE_ELEM: āĻŽāĻžāύ āĻāĻĒāĻĄā§āĻ/āϤā§āϰāĻŋ āĻāϰā§āύBPF_MAP_DELETE_ELEM: āĻā§ āϏāϰāĻžāύBPF_MAP_GET_NEXT_KEY: āĻĒāϰāĻŦāϰā§āϤ⧠(āĻŦāĻž āĻĒā§āϰāĻĨāĻŽ) āĻā§ āĻā§āĻāĻā§āύBPF_MAP_GET_NEXT_ID: āĻāĻĒāύāĻžāĻā§ āϏāĻŽāϏā§āϤ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āĻŽāϧā§āϝ āĻĻāĻŋāϝāĻŧā§ āϝā§āϤ⧠āĻĻā§āϝāĻŧ, āĻāĻāĻžāĻŦā§āĻ āĻāĻāĻŋ āĻāĻžāĻ āĻāϰā§bpftool mapBPF_MAP_GET_FD_BY_ID: āĻāϰ āĻā§āϞā§āĻŦāĻžāϞ āĻāĻāĻĄāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āĻāĻāĻāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻā§āϞā§āύBPF_MAP_LOOKUP_AND_DELETE_ELEM: āĻĒāĻžāϰāĻŽāĻžāĻŖāĻŦāĻŋāĻāĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻŦāϏā§āϤā§āϰ āĻŽāĻžāύ āĻāĻĒāĻĄā§āĻ āĻāϰā§āύ āĻāĻŦāĻ āĻĒā§āϰāĻžāύā§āĻāĻŋ āĻĢā§āϰāϤ āĻĻāĻŋāύBPF_MAP_FREEZE: āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āϏā§āĻĨāĻžāύ āĻĨā§āĻā§ āĻŽāĻžāύāĻāĻŋāϤā§āϰāĻāĻŋāĻā§ āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύā§āϝāĻŧ āĻāϰā§āύ (āĻāĻ āĻ āĻĒāĻžāϰā§āĻļāύāĻāĻŋ āĻĒā§āϰā§āĻŦāĻžāĻŦāϏā§āĻĨāĻžāϝāĻŧ āĻĢā§āϰāĻžāύ⧠āϝāĻžāĻŦā§ āύāĻž)BPF_MAP_LOOKUP_BATCH,BPF_MAP_LOOKUP_AND_DELETE_BATCH,BPF_MAP_UPDATE_BATCH,BPF_MAP_DELETE_BATCH: āĻāĻŖ āĻ āĻĒāĻžāϰā§āĻļāύāĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖ āϏā§āĻŦāϰā§āĻĒ,BPF_MAP_LOOKUP_AND_DELETE_BATCHâ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻĨā§āĻā§ āϏāĻŽāϏā§āϤ āĻŽāĻžāύ āĻĒāĻĄāĻŧāϤ⧠āĻāĻŦāĻ āĻĒā§āύāϰāĻžāϝāĻŧ āϏā§āĻ āĻāϰāĻžāϰ āĻāĻāĻŋāĻ āĻāĻāĻŽāĻžāϤā§āϰ āύāĻŋāϰā§āĻāϰāϝā§āĻā§āϝ āĻāĻĒāĻžāϝāĻŧ
āĻāĻ āϏāĻŽāϏā§āϤ āĻāĻŽāĻžāύā§āĻĄ āϏāĻŽāϏā§āϤ āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āĻĒā§āϰāĻāĻžāϰā§āϰ āĻāύā§āϝ āĻāĻžāĻ āĻāϰ⧠āύāĻž, āϤāĻŦā§ āϏāĻžāϧāĻžāϰāĻŖāĻāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϏā§āĻĨāĻžāύ āĻĨā§āĻā§ āĻ āύā§āϝāĻžāύā§āϝ āϧāϰāĻŖā§āϰ āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻž āĻšā§āϝāĻžāĻļ āĻā§āĻŦāĻŋāϞā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻŽāϤā§āĻ āĻĻā§āĻāĻžāϝāĻŧāĨ¤
āĻ āϰā§āĻĄāĻžāϰā§āϰ āĻāύā§āϝ, āĻāĻŽāĻžāĻĻā§āϰ āĻšā§āϝāĻžāĻļ āĻā§āĻŦāĻŋāϞ āĻĒāϰā§āĻā§āώāĻž āĻļā§āώ āĻāϰāĻž āϝāĻžāĻāĨ¤ āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ āϝ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻā§āĻŦāĻŋāϞ āϤā§āϰāĻŋ āĻāϰā§āĻāĻŋ āϝāĻžāϤ⧠āĻāĻžāϰāĻāĻŋ āĻā§ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§? āĻāϰ⧠āĻāĻŋāĻā§ āĻāĻĒāĻžāĻĻāĻžāύ āϝā§āĻ āĻāϰāĻž āϝāĻžāĻ:
$ sudo bpftool map update id 114 key 2 0 0 0 value 1 0 0 0
$ sudo bpftool map update id 114 key 3 0 0 0 value 1 0 0 0
$ sudo bpftool map update id 114 key 4 0 0 0 value 1 0 0 0āĻ āĻĒāϰā§āϝāύā§āϤ āϏāĻŦ āĻ āĻŋāĻāĻ:
$ sudo bpftool map dump id 114
key: 01 00 00 00 value: 01 00 00 00
key: 02 00 00 00 value: 01 00 00 00
key: 04 00 00 00 value: 01 00 00 00
key: 03 00 00 00 value: 01 00 00 00
Found 4 elementsāĻāϏā§āύ āĻāϰāĻ āĻāĻāĻāĻŋ āϝā§āĻ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻŋ:
$ sudo bpftool map update id 114 key 5 0 0 0 value 1 0 0 0
Error: update failed: Argument list too longāĻāĻļāĻžāύā§āϰā§āĻĒ āĻāĻŽāϰāĻž āϏāĻĢāϞ āĻšāĻāύāĻŋāĨ¤ āĻāϏā§āύ āĻāϰāĻ āĻŦāĻŋāĻļāĻĻā§ āϤā§āϰā§āĻāĻŋāĻāĻŋ āĻĻā§āĻāĻŋ:
$ sudo strace -e bpf bpftool map update id 114 key 5 0 0 0 value 1 0 0 0
bpf(BPF_MAP_GET_FD_BY_ID, {map_id=114, next_id=0, open_flags=0}, 120) = 3
bpf(BPF_OBJ_GET_INFO_BY_FD, {info={bpf_fd=3, info_len=80, info=0x7ffe6c626da0}}, 120) = 0
bpf(BPF_MAP_UPDATE_ELEM, {map_fd=3, key=0x56049ded5260, value=0x56049ded5280, flags=BPF_ANY}, 120) = -1 E2BIG (Argument list too long)
Error: update failed: Argument list too long
+++ exited with 255 +++āϏāĻŦāĻāĻŋāĻā§ āĻ āĻŋāĻ āĻāĻā§: āĻĒā§āϰāϤā§āϝāĻžāĻļāĻž āĻ
āύā§āϝāĻžāϝāĻŧā§, āĻĻāϞ BPF_MAP_UPDATE_ELEM āĻāĻāĻāĻŋ āύāϤā§āύ, āĻĒāĻā§āĻāĻŽ, āĻā§ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰā§, āĻāĻŋāύā§āϤ⧠āĻā§āϰā§āϝāĻžāĻļ āĻāϰ⧠E2BIG.
āϏā§āϤāϰāĻžāĻ, āĻāĻŽāϰāĻž BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϤā§āϰāĻŋ āĻāĻŦāĻ āϞā§āĻĄ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ, āϏā§āĻāϏāĻžāĻĨā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϏā§āĻĨāĻžāύ āĻĨā§āĻā§ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āϤā§āϰāĻŋ āĻāĻŦāĻ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āĻāĻāύ āĻāĻŽāϰāĻž āĻāĻŋāĻāĻžāĻŦā§ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĨā§āĻā§ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ āϤāĻž āĻĻā§āĻāĻž āϝā§āĻā§āϤāĻŋāϝā§āĻā§āϤāĨ¤ āĻāĻŽāϰāĻž āĻŽā§āĻļāĻŋāύ āĻŽā§āϝāĻžāĻā§āϰ⧠āĻā§āĻĄāĻā§āϞāĻŋāϤ⧠āĻšāĻžāϰā§āĻĄ-āĻā§-āϰāĻŋāĻĄ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāϰ āĻāĻžāώāĻžāϝāĻŧ āĻāĻ āĻŦāĻŋāώāϝāĻŧā§ āĻāĻĨāĻž āĻŦāϞāϤ⧠āĻĒāĻžāϰāĻŋ, āĻāĻŋāύā§āϤ⧠āĻāϏāϞ⧠āϏāĻŽāϝāĻŧ āĻāϏā§āĻā§ āϝ⧠BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻāϏāϞ⧠āĻā§āĻāĻžāĻŦā§ āϞā§āĻāĻž āĻāĻŦāĻ āϰāĻā§āώāĻŖāĻžāĻŦā§āĻā§āώāĻŖ āĻāϰāĻž āĻšāϝāĻŧ - āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠libbpf.
(āύāĻŋāĻŽā§āύ-āϏā§āϤāϰā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖā§āϰ āĻ
āĻāĻžāĻŦ āύāĻŋāϝāĻŧā§ āĻ
āϏāύā§āϤā§āώā§āĻ āĻĒāĻžāĻ āĻāĻĻā§āϰ āĻāύā§āϝ: āĻāĻŽāϰāĻž āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻŦāĻŋāĻļā§āϞā§āώāĻŖ āĻāϰāĻŦ āϝāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϤā§āϰāĻŋ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻāĻŦāĻ āϏāĻšāĻžāϝāĻŧāĻ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠libbpf āĻāĻŦāĻ āύāĻŋāϰā§āĻĻā§āĻļ āϏā§āϤāϰ⧠āĻāĻŋ āĻāĻāĻŦā§ āϤāĻž āĻāĻĒāύāĻžāĻā§ āĻŦāϞā§āύāĨ¤ āĻĒāĻžāĻ āĻāĻĻā§āϰ āĻāύā§āϝ āϝāĻžāϰāĻž āĻ
āϏāύā§āϤā§āώā§āĻ āĻā§āĻŦ āĻŦā§āĻļāĻŋ, āĻāĻŽāϰāĻž āϝā§āĻ āĻāϰā§āĻāĻŋ āύāĻŋāĻŦāύā§āϧā§āϰ āĻāĻĒāϝā§āĻā§āϤ āĻāĻžāϝāĻŧāĻāĻžāϝāĻŧāĨ¤)
libbpf āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞā§āĻāĻž
āĻŽā§āĻļāĻŋāύ āĻā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞā§āĻāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āĻāĻāϰā§āώāĻŖā§āϝāĻŧ āĻšāϤ⧠āĻĒāĻžāϰā§, āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āϤā§āĻĒā§āϤāĻŋ āϏā§āĻ āĻāϰā§āĨ¤ āĻāĻ āĻŽā§āĻšā§āϰā§āϤ⧠āĻāĻĒāύāĻžāϰ āĻŽāύā§āϝā§āĻ āĻĻāĻŋāϤ⧠āĻšāĻŦā§ llvm, āϝāĻžāϰ BPF āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰā§āϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻāĻāĻāĻŋ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋāϰ āĻāύā§āϝ āĻā§āĻĄ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻŦā§āϝāĻžāĻāĻāύā§āĻĄ āϰāϝāĻŧā§āĻā§ libbpf, āϝāĻž āĻāĻĒāύāĻžāĻā§ BPF āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύāĻā§āϞāĻŋāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻĻāĻŋāĻ āϞāĻŋāĻāϤ⧠āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϤā§āϰāĻŋ āĻāϰāĻž BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāϰ āĻā§āĻĄ āϞā§āĻĄ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ llvm/clang.
āĻāϏāϞā§, āĻāĻŽāϰāĻž āĻāĻ āĻāĻŦāĻ āĻĒāϰāĻŦāϰā§āϤ⧠āύāĻŋāĻŦāύā§āϧāĻā§āϞāĻŋāϤ⧠āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦ, libbpf āĻāĻāĻŋ āĻāĻžāĻĄāĻŧāĻž āĻ
āύā§āĻ āĻāĻžāĻ āĻāϰ⧠(āĻŦāĻž āĻ
āύā§āϰā§āĻĒ āϏāϰāĻā§āĻāĻžāĻŽ - iproute2, libbcc, libbpf-go, āĻāϤā§āϝāĻžāĻĻāĻŋ) āĻŦā§āĻāĻā§ āĻĨāĻžāĻāĻž āĻ
āϏāĻŽā§āĻāĻŦāĨ¤ āĻĒā§āϰāĻāϞā§āĻĒā§āϰ āĻšāϤā§āϝāĻžāĻāĻžāϰ⧠āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻāĻ libbpf BPF CO-RE (āĻāĻāĻŦāĻžāϰ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰā§āύ, āϏāϰā§āĻŦāϤā§āϰ āĻāĻžāϞāĻžāύ) - āĻāĻāĻāĻŋ āĻĒā§āϰāĻāϞā§āĻĒ āϝāĻž āĻāĻĒāύāĻžāĻā§ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āϞāĻŋāĻāϤ⧠āĻĻā§āϝāĻŧ āϝāĻž āĻāĻ āĻāĻžāϰā§āύā§āϞ āĻĨā§āĻā§ āĻ
āύā§āϝ āĻāĻžāϰā§āύā§āϞ⧠āĻĒā§āϰā§āĻā§āĻŦāϞ, āĻŦāĻŋāĻāĻŋāύā§āύ API-āĻ āĻāĻžāϞāĻžāύā§āϰ āĻā§āώāĻŽāϤāĻž āϏāĻš (āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āϝāĻāύ āĻāĻžāϰā§āύā§āϞā§āϰ āĻāĻ āύ āϏāĻāϏā§āĻāϰāĻŖ āĻĨā§āĻā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻšāϝāĻŧ āϏāĻāϏā§āĻāϰāĻŖā§)āĨ¤ CO-RE āĻāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻšāĻāϝāĻŧāĻžāϰ āĻāύā§āϝ, āĻāĻĒāύāĻžāϰ āĻāĻžāϰā§āύā§āϞ āĻ
āĻŦāĻļā§āϝāĻ BTF āϏāĻŽāϰā§āĻĨāύā§āϰ āϏāĻžāĻĨā§ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻž āĻāĻāĻŋāϤ (āĻāĻŽāϰāĻž āĻŦāĻŋāĻāĻžāĻā§ āĻāĻāĻŋ āĻā§āĻāĻžāĻŦā§ āĻāϰāϤ⧠āĻšāϝāĻŧ āϤāĻž āĻŦāϰā§āĻŖāύāĻž āĻāϰāĻŋ . āĻāĻĒāύāĻžāϰ āĻāĻžāϰā§āύā§āϞāĻāĻŋ BTF āĻĻāĻŋāϝāĻŧā§ āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āύāĻžāĻāĻŋ āĻā§āĻŦ āϏāĻšāĻāĻāĻžāĻŦā§ āύāϝāĻŧ - āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻĢāĻžāĻāϞā§āϰ āĻāĻĒāϏā§āĻĨāĻŋāϤāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āĻāĻĒāύāĻŋ āĻĒāϰā§āĻā§āώāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
$ ls -lh /sys/kernel/btf/vmlinux
-r--r--r-- 1 root root 2.6M Jul 29 15:30 /sys/kernel/btf/vmlinuxāĻāĻ āĻĢāĻžāĻāϞāĻāĻŋ āĻāĻžāϰā§āύā§āϞ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āϏāĻŽāϏā§āϤ āĻĄā§āĻāĻž āĻĒā§āϰāĻāĻžāϰā§āϰ āϤāĻĨā§āϝ āϏāĻāϰāĻā§āώāĻŖ āĻāϰ⧠āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŽāĻžāĻĻā§āϰ āϏāĻŽāϏā§āϤ āĻāĻĻāĻžāĻšāϰāĻŖā§ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧ libbpf. āĻāĻŽāϰāĻž āĻĒāϰāĻŦāϰā§āϤ⧠āύāĻŋāĻŦāύā§āϧ⧠CO-RE āϏāĻŽā§āĻĒāϰā§āĻā§ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤāĻāĻžāĻŦā§ āĻāĻĨāĻž āĻŦāϞāĻŦ, āϤāĻŦā§ āĻāĻ āύāĻŋāĻŦāύā§āϧā§, āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āύāĻŋāĻā§āĻā§ āĻāĻāĻāĻŋ āĻāĻžāϰā§āύā§āϞ āϤā§āϰāĻŋ āĻāϰā§āύ CONFIG_DEBUG_INFO_BTF.
āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ libbpf āĻĄāĻžāĻāϰā§āĻā§āĻāϰāĻŋāϤ⧠āĻĨāĻžāĻā§ tools/lib/bpf āĻāĻžāϰā§āύā§āϞ āĻāĻŦāĻ āĻāϰ āĻŦāĻŋāĻāĻžāĻļ āĻŽā§āϞāĻŋāĻ āϤāĻžāϞāĻŋāĻāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāϰāĻž āĻšāϝāĻŧ bpf@vger.kernel.org. āϝāĻžāĻāĻšā§āĻ, āĻāĻžāϰā§āύā§āϞā§āϰ āĻŦāĻžāĻāϰ⧠āĻŦāϏāĻŦāĻžāϏāĻāĻžāϰ⧠āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύāĻā§āϞāĻŋāϰ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĒā§āĻĨāĻ āϏāĻāĻā§āϰāĻšāϏā§āĻĨāϞ āϰāĻā§āώāĻŖāĻžāĻŦā§āĻā§āώāĻŖ āĻāϰāĻž āĻšāϝāĻŧ āϝā§āĻāĻžāύ⧠āĻāĻžāϰā§āύā§āϞ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻāĻŽāĻŦā§āĻļāĻŋ āĻĒāĻĄāĻŧāĻžāϰ āĻ
ā§āϝāĻžāĻā§āϏā§āϏā§āϰ āĻāύā§āϝ āĻŽāĻŋāϰāϰ āĻāϰāĻž āĻšāϝāĻŧāĨ¤
āĻāĻ āĻŦāĻŋāĻāĻžāĻā§ āĻāĻŽāϰāĻž āĻĻā§āĻāĻŦ āϝ⧠āĻāĻĒāύāĻŋ āĻā§āĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻĒā§āϰāĻāϞā§āĻĒ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āϝāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠libbpf, āĻāϏā§āύ āĻŦā§āĻļ āĻāϝāĻŧā§āĻāĻāĻŋ (āĻāĻŽ āĻŦāĻž āĻāĻŽ āĻ
āϰā§āĻĨāĻšā§āύ) āĻĒāϰā§āĻā§āώāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞāĻŋāĻāĻŋ āĻāĻŦāĻ āĻāĻāĻŋ āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰ⧠āϤāĻž āĻŦāĻŋāĻļāĻĻāĻāĻžāĻŦā§ āĻŦāĻŋāĻļā§āϞā§āώāĻŖ āĻāϰāĻŋāĨ¤ āĻāĻāĻŋ āĻāĻŽāĻžāĻĻā§āϰ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻŦāĻŋāĻāĻžāĻāĻā§āϞāĻŋāϤ⧠āĻāϰāĻ āϏāĻšāĻā§ āĻŦā§āϝāĻžāĻā§āϝāĻž āĻāϰāϤ⧠āĻĻā§āϝāĻŧ āϝ⧠āĻā§āĻāĻžāĻŦā§ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻŽāĻžāύāĻāĻŋāϤā§āϰ, āĻāĻžāϰā§āύā§āϞ āϏāĻžāĻšāĻžāϝā§āϝāĻāĻžāϰā§, BTF āĻāϤā§āϝāĻžāĻĻāĻŋāϰ āϏāĻžāĻĨā§ āϝā§āĻāĻžāϝā§āĻ āĻāϰā§āĨ¤
āϏāĻžāϧāĻžāϰāĻŖāϤ āĻĒā§āϰāĻāϞā§āĻĒ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠libbpf āĻāĻāĻāĻŋ āĻāĻŋāĻ āϏāĻžāĻŦāĻŽāĻĄāĻŋāĻāϞ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻāĻŋāĻāĻšāĻžāĻŦ āϏāĻāĻā§āϰāĻšāϏā§āĻĨāϞ āϝā§āĻ āĻāϰā§āύ, āĻāĻŽāϰāĻž āĻāĻāĻ āĻāĻžāĻ āĻāϰāĻŦ:
$ mkdir /tmp/libbpf-example
$ cd /tmp/libbpf-example/
$ git init-db
Initialized empty Git repository in /tmp/libbpf-example/.git/
$ git submodule add https://github.com/libbpf/libbpf.git
Cloning into '/tmp/libbpf-example/libbpf'...
remote: Enumerating objects: 200, done.
remote: Counting objects: 100% (200/200), done.
remote: Compressing objects: 100% (103/103), done.
remote: Total 3354 (delta 101), reused 118 (delta 79), pack-reused 3154
Receiving objects: 100% (3354/3354), 2.05 MiB | 10.22 MiB/s, done.
Resolving deltas: 100% (2176/2176), done.āϝāĻžāĻā§āĻāĻŋ libbpf āĻā§āĻŦ āϏāĻšāĻ:
$ cd libbpf/src
$ mkdir build
$ OBJDIR=build DESTDIR=root make -s install
$ find root
root
root/usr
root/usr/include
root/usr/include/bpf
root/usr/include/bpf/bpf_tracing.h
root/usr/include/bpf/xsk.h
root/usr/include/bpf/libbpf_common.h
root/usr/include/bpf/bpf_endian.h
root/usr/include/bpf/bpf_helpers.h
root/usr/include/bpf/btf.h
root/usr/include/bpf/bpf_helper_defs.h
root/usr/include/bpf/bpf.h
root/usr/include/bpf/libbpf_util.h
root/usr/include/bpf/libbpf.h
root/usr/include/bpf/bpf_core_read.h
root/usr/lib64
root/usr/lib64/libbpf.so.0.1.0
root/usr/lib64/libbpf.so.0
root/usr/lib64/libbpf.a
root/usr/lib64/libbpf.so
root/usr/lib64/pkgconfig
root/usr/lib64/pkgconfig/libbpf.pcāĻāĻ āĻŦāĻŋāĻāĻžāĻā§ āĻāĻŽāĻžāĻĻā§āϰ āĻĒāϰāĻŦāϰā§āϤ⧠āĻĒāϰāĻŋāĻāϞā§āĻĒāύāĻž āύāĻŋāĻŽā§āύāϰā§āĻĒ: āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞāĻŋāĻāĻŦ BPF_PROG_TYPE_XDP, āĻāĻā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖā§āϰ āĻŽāϤā§āĻ, āĻāĻŋāύā§āϤ⧠C-āϤā§, āĻāĻŽāϰāĻž āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāĻŋ clang, āĻāĻŦāĻ āĻāĻāĻāĻŋ āϏāĻšāĻžāϝāĻŧāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞāĻŋāĻā§āύ āϝāĻž āĻāĻāĻŋ āĻāĻžāϰā§āύā§āϞ⧠āϞā§āĻĄ āĻāϰāĻŦā§āĨ¤ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻŦāĻŋāĻāĻžāĻā§ āĻāĻŽāϰāĻž BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻŦāĻ āϏāĻšāĻāĻžāϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻāϝāĻŧā§āϰ āĻā§āώāĻŽāϤāĻž āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰāĻŦāĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ: libbpf āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻŖāĻžāĻā§āĻ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āϤā§āϰāĻŋ āĻāϰāĻž
āĻļā§āϰ⧠āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻŽāϰāĻž āĻĢāĻžāĻāϞāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŋ /sys/kernel/btf/vmlinux, āϝāĻž āĻāĻĒāϰ⧠āĻāϞā§āϞāĻŋāĻāĻŋāϤ āĻšāϝāĻŧā§āĻā§, āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻšā§āĻĄāĻžāϰ āĻĢāĻžāĻāϞā§āϰ āĻāĻāĻžāϰ⧠āĻāϰ āϏāĻŽāϤā§āϞā§āϝ āϤā§āϰāĻŋ āĻāϰā§āύ:
$ bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.hāĻāĻ āĻĢāĻžāĻāϞāĻāĻŋ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāϰā§āύā§āϞ⧠āĻāĻĒāϞāĻŦā§āϧ āϏāĻŽāϏā§āϤ āĻĄā§āĻāĻž āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāĻŦā§, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻžāϰā§āύā§āϞ⧠IPv4 āĻšā§āĻĄāĻžāϰāĻā§ āĻāĻāĻžāĻŦā§ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§:
$ grep -A 12 'struct iphdr {' vmlinux.h
struct iphdr {
__u8 ihl: 4;
__u8 version: 4;
__u8 tos;
__be16 tot_len;
__be16 id;
__be16 frag_off;
__u8 ttl;
__u8 protocol;
__sum16 check;
__be32 saddr;
__be32 daddr;
};āĻāĻāύ āĻāĻŽāϰāĻž C āϤ⧠āĻāĻŽāĻžāĻĻā§āϰ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞāĻŋāĻāĻŦ:
$ cat xdp-simple.bpf.c
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
SEC("xdp/simple")
int simple(void *ctx)
{
return XDP_PASS;
}
char LICENSE[] SEC("license") = "GPL";āϝāĻĻāĻŋāĻ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻā§āĻŦ āϏāĻšāĻ āĻšāϝāĻŧā§ āĻāĻ ā§āĻā§, āϤāĻŦā§āĻ āĻāĻŽāĻžāĻĻā§āϰ āĻ
āύā§āĻ āĻŦāĻŋāĻŦāϰāĻŖā§ āĻŽāύā§āϝā§āĻ āĻĻāĻŋāϤ⧠āĻšāĻŦā§āĨ¤ āĻĒā§āϰāĻĨāĻŽ, āĻĒā§āϰāĻĨāĻŽ āĻšā§āĻĄāĻžāϰ āĻĢāĻžāĻāϞ āĻāĻŽāϰāĻž āĻ
āύā§āϤāϰā§āĻā§āĻā§āϤ vmlinux.h, āϝāĻž āĻāĻŽāϰāĻž āϏāĻŦā§āĻŽāĻžāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϤā§āϰāĻŋ āĻāϰā§āĻāĻŋ bpftool btf dump - āĻāĻāύ āĻāĻžāϰā§āύā§āϞ āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰ āĻā§āĻŽāύ āϤāĻž āĻāĻžāύāϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāϰā§āύā§āϞ-āĻšā§āĻĄāĻžāϰ āĻĒā§āϝāĻžāĻā§āĻ āĻāύāϏā§āĻāϞ āĻāϰāĻžāϰ āĻĻāϰāĻāĻžāϰ āύā§āĻāĨ¤ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻšā§āĻĄāĻžāϰ āĻĢāĻžāĻāϞāĻāĻŋ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻĨā§āĻā§ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āĻāϏ⧠libbpf. āĻāĻāύ āĻāĻŽāĻžāĻĻā§āϰ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻŽā§āϝāĻžāĻā§āϰ⧠āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻŋ āĻĒā§āϰāϝāĻŧā§āĻāύ SEC, āϝāĻž āĻ
āĻā§āώāϰāĻāĻŋāĻā§ ELF āĻ
āĻŦāĻā§āĻā§āĻ āĻĢāĻžāĻāϞā§āϰ āĻāĻĒāϝā§āĻā§āϤ āĻŦāĻŋāĻāĻžāĻā§ āĻĒāĻžāĻ āĻžāϝāĻŧāĨ¤ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻŦāĻŋāĻāĻžāĻā§ āϰāϝāĻŧā§āĻā§ xdp/simple, āϝā§āĻāĻžāύ⧠āϏā§āϞā§āϝāĻžāĻļā§āϰ āĻāĻā§ āĻāĻŽāϰāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻžāĻāĻĒ BPF āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻŋ - āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāύāĻā§āύāĻļāύ libbpf, āĻŦāĻŋāĻāĻžāĻā§āϰ āύāĻžāĻŽā§āϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āĻāĻāĻŋ āϏā§āĻāĻžāϰā§āĻāĻāĻĒā§ āϏāĻ āĻŋāĻ āĻĒā§āϰāĻāĻžāϰ āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻŦā§ bpf(2). BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āύāĻŋāĻā§āĻ āĻšāϝāĻŧ C - āĻā§āĻŦ āϏāĻšāĻ āĻāĻŦāĻ āĻāĻāĻāĻŋ āϞāĻžāĻāύ āĻāĻ āĻŋāϤ return XDP_PASS. āĻ
āĻŦāĻļā§āώā§, āĻāĻāĻāĻŋ āĻĒā§āĻĨāĻ āĻŦāĻŋāĻāĻžāĻ "license" āϞāĻžāĻāϏā§āύā§āϏā§āϰ āύāĻžāĻŽ āϰāϝāĻŧā§āĻā§āĨ¤
āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ llvm/clang, āϏāĻāϏā§āĻāϰāĻŖ >= 10.0.0 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ, āĻŦāĻž āĻāϰāĻ āĻāĻžāϞ, āĻāϰāĻ āĻŦāĻĄāĻŧ (āĻŦāĻŋāĻāĻžāĻ āĻĻā§āĻā§āύ ):
$ clang --version
clang version 11.0.0 (https://github.com/llvm/llvm-project.git afc287e0abec710398465ee1f86237513f2b5091)
...
$ clang -O2 -g -c -target bpf -I libbpf/src/root/usr/include xdp-simple.bpf.c -o xdp-simple.bpf.oāĻāĻāϰā§āώāĻŖā§āϝāĻŧ āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋāϰ āĻŽāϧā§āϝā§: āĻāĻŽāϰāĻž āϞāĻā§āώā§āϝ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰ āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰāĻŋ -target bpf āĻāĻŦāĻ āĻšā§āĻĄāĻžāϰā§āϰ āĻĒāĻĨ libbpf, āϝāĻž āĻāĻŽāϰāĻž āϏāĻŽā§āĻĒā§āϰāϤāĻŋ āĻāύāϏā§āĻāϞ āĻāϰā§āĻāĻŋāĨ¤ āĻāĻāĻžāĻĄāĻŧāĻžāĻ, āϏāĻŽā§āĻĒāϰā§āĻā§ āĻā§āϞāĻŦā§āύ āύāĻž -O2, āĻāĻ āĻŦāĻŋāĻāϞā§āĻĒ āĻāĻžāĻĄāĻŧāĻž āĻāĻĒāύāĻŋ āĻāĻŦāĻŋāώā§āϝāϤ⧠āĻŦāĻŋāϏā§āĻŽāϝāĻŧā§āϰ āĻāύā§āϝ āĻšāϤ⧠āĻĒāĻžāϰā§. āĻāϏā§āύ āĻāĻŽāĻžāĻĻā§āϰ āĻā§āĻĄ āϤāĻžāĻāĻžāύ, āĻāĻŽāϰāĻž āĻāĻŋ āĻāĻŽāϰāĻž āĻā§āϝāĻŧā§āĻāĻŋāϞāĻžāĻŽ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞāĻŋāĻāϤ⧠āĻĒāϰāĻŋāĻāĻžāϞāĻŋāϤ?
$ llvm-objdump --section=xdp/simple --no-show-raw-insn -D xdp-simple.bpf.o
xdp-simple.bpf.o: file format elf64-bpf
Disassembly of section xdp/simple:
0000000000000000 <simple>:
0: r0 = 2
1: exitāĻšā§āϝāĻžāĻ, āĻāĻāĻž āĻāĻžāĻ āĻāϰā§āĻā§! āĻāĻāύ, āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāϰ āϏāĻžāĻĨā§ āĻāĻāĻāĻŋ āĻŦāĻžāĻāύāĻžāϰāĻŋ āĻĢāĻžāĻāϞ āϰāϝāĻŧā§āĻā§ āĻāĻŦāĻ āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻāĻžāĻ āϝāĻž āĻāĻāĻŋ āĻāĻžāϰā§āύā§āϞ⧠āϞā§āĻĄ āĻāϰāĻŦā§āĨ¤ āĻāĻ āĻāĻĻā§āĻĻā§āĻļā§āϝ⧠āĻā§āϰāύā§āĻĨāĻžāĻāĻžāϰ libbpf āĻāĻŽāĻžāĻĻā§āϰ āĻĻā§āĻāĻŋ āĻŦāĻŋāĻāϞā§āĻĒ āĻ
āĻĢāĻžāϰ āĻāϰ⧠- āĻāĻāĻāĻŋ āύāĻŋāĻŽā§āύ-āϏā§āϤāϰā§āϰ API āĻŦāĻž āĻāĻāĻāĻŋ āĻāĻā§āĻ-āϏā§āϤāϰā§āϰ API āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ āĻāĻŽāϰāĻž āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧ āĻĒāĻĨā§ āϝāĻžāĻŦ, āϝā§āĻšā§āϤ⧠āĻāĻŽāϰāĻž āĻļāĻŋāĻāϤ⧠āĻāĻžāĻ āĻāĻŋāĻāĻžāĻŦā§ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞāĻŋāĻāϤ⧠āĻšāϝāĻŧ, āϞā§āĻĄ āĻāϰāϤ⧠āĻšāϝāĻŧ āĻāĻŦāĻ āϤāĻžāĻĻā§āϰ āĻĒāϰāĻŦāϰā§āϤ⧠āĻ
āϧā§āϝāϝāĻŧāύā§āϰ āĻāύā§āϝ āύā§āϝā§āύāϤāĻŽ āĻĒā§āϰāĻā§āώā§āĻāĻžāϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ āĻāϰāϤ⧠āĻšāϝāĻŧāĨ¤
āĻĒā§āϰāĻĨāĻŽāϤ, āĻāĻāĻ āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦāĻžāĻāύāĻžāϰāĻŋ āĻĨā§āĻā§ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ "āĻāĻā§āĻāĻžāϞ" āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻšāĻŦā§ bpftool â BPF āĻŦāĻŋāĻļā§āĻŦā§āϰ āϏā§āĻāϏ āĻā§āϰāĻŋ (āϝāĻž āĻāĻā§āώāϰāĻŋāĻ āĻ
āϰā§āĻĨā§ āύā§āĻāϝāĻŧāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§, āϝā§āĻšā§āϤ⧠āĻĄā§āϝāĻžāύāĻŋāϝāĻŧā§āϞ āĻŦā§āϰā§āĻāĻŽā§āϝāĻžāύ, BPF-āĻāϰ āĻ
āύā§āϝāϤāĻŽ āύāĻŋāϰā§āĻŽāĻžāϤāĻž āĻāĻŦāĻ āϰāĻā§āώāĻŖāĻžāĻŦā§āĻā§āώāĻŖāĻāĻžāϰā§, āϏā§āĻāϏ):
$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.hāĻĢāĻžāĻāϞ⧠xdp-simple.skel.h āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻŦāĻžāĻāύāĻžāϰāĻŋ āĻā§āĻĄ āϰāϝāĻŧā§āĻā§ āĻāĻŦāĻ āĻĒāϰāĻŋāĻāĻžāϞāύāĻžāϰ āĻāύā§āϝ āĻĢāĻžāĻāĻļāύ āϰāϝāĻŧā§āĻā§ â āϞā§āĻĄ āĻāϰāĻž, āϏāĻāϝā§āĻā§āϤ āĻāϰāĻž, āĻāĻŽāĻžāĻĻā§āϰ āĻ
āĻŦāĻā§āĻā§āĻ āĻŽā§āĻā§ āĻĢā§āϞāĻžāĨ¤ āĻāĻŽāĻžāĻĻā§āϰ āϏāĻžāϧāĻžāϰāĻŖ āĻā§āώā§āϤā§āϰ⧠āĻāĻāĻŋ āĻāĻāĻžāϰāĻāĻŋāϞā§āϰ āĻŽāϤ⧠āĻĻā§āĻāĻžāϝāĻŧ, āϤāĻŦā§ āĻāĻāĻŋ āϏā§āĻ āĻā§āώā§āϤā§āϰā§āĻ āĻāĻžāĻ āĻāϰ⧠āϝā§āĻāĻžāύ⧠āĻ
āĻŦāĻā§āĻā§āĻ āĻĢāĻžāĻāϞāĻāĻŋāϤ⧠āĻ
āύā§āĻāĻā§āϞāĻŋ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻŦāĻ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āϰāϝāĻŧā§āĻā§ āĻāĻŦāĻ āĻāĻ āĻŦāĻŋāĻļāĻžāϞ ELF āϞā§āĻĄ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ āĻā§āĻŦāϞ āĻāĻā§āĻāĻžāϞ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻšāĻŦā§ āĻāĻŦāĻ āĻāĻžāϏā§āĻāĻŽ āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻĨā§āĻā§ āĻāĻ āĻŦāĻž āĻĻā§āĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻāϞ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āϞāĻŋāĻāĻā§āύ āĻāĻāύ āĻāϞā§āύāĨ¤
āĻāĻ ā§āϰāĻāĻžāĻŦā§ āĻŦāϞāϤ⧠āĻā§āϞā§, āĻāĻŽāĻžāĻĻā§āϰ āϞā§āĻĄāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āϤā§āĻā§āĻ:
#include <err.h>
#include <unistd.h>
#include "xdp-simple.skel.h"
int main(int argc, char **argv)
{
struct xdp_simple_bpf *obj;
obj = xdp_simple_bpf__open_and_load();
if (!obj)
err(1, "failed to open and/or load BPF objectn");
pause();
xdp_simple_bpf__destroy(obj);
}āĻāĻāĻž āĻšāϞ struct xdp_simple_bpf āĻĢāĻžāĻāϞ⧠āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ xdp-simple.skel.h āĻāĻŦāĻ āĻāĻŽāĻžāĻĻā§āϰ āĻ
āĻŦāĻā§āĻā§āĻ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻž āĻāϰā§:
struct xdp_simple_bpf {
struct bpf_object_skeleton *skeleton;
struct bpf_object *obj;
struct {
struct bpf_program *simple;
} progs;
struct {
struct bpf_link *simple;
} links;
};āĻāĻŽāϰāĻž āĻāĻāĻžāύ⧠āĻāĻāĻāĻŋ āύāĻŋāĻŽā§āύ-āϏā§āϤāϰā§āϰ API-āĻāϰ āĻāĻŋāĻšā§āύ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻā§āĻāĻŋ: āĻāĻ āύ struct bpf_program *simple и struct bpf_link *simple. āĻĒā§āϰāĻĨāĻŽ āĻāĻžāĻ āĻžāĻŽā§ āĻŦāĻŋāĻļā§āώāĻāĻžāĻŦā§ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻŦāϰā§āĻŖāύāĻž āĻāϰā§, āĻŦāĻŋāĻāĻžāĻā§ āϞāĻŋāĻāĻŋāϤ xdp/simple, āĻāĻŦāĻ āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧāĻāĻŋ āĻŦāϰā§āĻŖāύāĻž āĻāϰ⧠āĻāĻŋāĻāĻžāĻŦā§ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻā§āύā§āĻ āĻā§āϏā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻ āĻāϰā§āĨ¤
āĻā§āϰāĻŋāϝāĻŧāĻž xdp_simple_bpf__open_and_load, āĻāĻāĻāĻŋ ELF āĻ
āĻŦāĻā§āĻā§āĻ āĻā§āϞā§, āĻāĻāĻŋ āĻĒāĻžāϰā§āϏ āĻāϰā§, āϏāĻŽāϏā§āϤ āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰ āĻāĻŦāĻ āϏāĻžāĻŦāϏā§āĻā§āϰāĻžāĻāĻāĻžāϰ āϤā§āϰāĻŋ āĻāϰ⧠(āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻžāĻĄāĻŧāĻžāĻ, ELF-āĻ āĻ
āύā§āϝāĻžāύā§āϝ āĻŦāĻŋāĻāĻžāĻāĻ āĻĨāĻžāĻā§ - āĻĄā§āĻāĻž, āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻĒāĻ āύāϝā§āĻā§āϝ āĻĄā§āĻāĻž, āĻĄāĻŋāĻŦāĻžāĻāĻŋāĻ āϤāĻĨā§āϝ, āϞāĻžāĻāϏā§āύā§āϏ, āĻāϤā§āϝāĻžāĻĻāĻŋ), āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āĻāĻāĻŋ āĻāĻāĻāĻŋ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻžāϰā§āύā§āϞ⧠āϞā§āĻĄ āĻāϰā§āĨ¤ āĻāϞ bpf, āϝāĻž āĻāĻŽāϰāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāĻŦāĻ āϰāĻžāύ āĻāϰ⧠āĻĒāϰā§āĻā§āώāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ:
$ clang -O2 -I ./libbpf/src/root/usr/include/ xdp-simple.c -o xdp-simple ./libbpf/src/root/usr/lib64/libbpf.a -lelf -lz
$ sudo strace -e bpf ./xdp-simple
...
bpf(BPF_BTF_LOAD, 0x7ffdb8fd9670, 120) = 3
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=2, insns=0xdfd580, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(5, 8, 0), prog_flags=0, prog_name="simple", prog_ifindex=0, expected_attach_type=0x25 /* BPF_??? */, ...}, 120) = 4āĻāϏā§āύ āĻāĻāύ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĻā§āĻāĻŋ bpftool. āĻāϏā§āύ āϤāĻžāϰ āĻāĻāĻĄāĻŋ āĻā§āĻāĻā§ āĻŦā§āϰ āĻāϰāĻž āϝāĻžāĻ:
# bpftool p | grep -A4 simple
463: xdp name simple tag 3b185187f1855c4c gpl
loaded_at 2020-08-01T01:59:49+0000 uid 0
xlated 16B jited 40B memlock 4096B
btf_id 185
pids xdp-simple(16498)āĻāĻŦāĻ āĻĄāĻžāĻŽā§āĻĒ (āĻāĻŽāϰāĻž āĻāĻŽāĻžāύā§āĻĄā§āϰ āĻāĻāĻāĻŋ āϏāĻāĻā§āώāĻŋāĻĒā§āϤ āϰā§āĻĒ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŋ bpftool prog dump xlated):
# bpftool p d x id 463
int simple(void *ctx):
; return XDP_PASS;
0: (b7) r0 = 2
1: (95) exitāύāϤā§āύ āĻāĻŋāĻā§! āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻŽāĻžāĻĻā§āϰ āϏāĻŋ āϏā§āϰā§āϏ āĻĢāĻžāĻāϞā§āϰ āĻ
āĻāĻļ āĻŽā§āĻĻā§āϰāĻŋāϤ āĻāϰā§āĻā§āĨ¤ āĻāĻāĻŋ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ libbpf, āϝāĻž āĻŦāĻžāĻāύāĻžāϰāĻŋāϤ⧠āĻĄāĻŋāĻŦāĻžāĻ āĻŦāĻŋāĻāĻžāĻāĻāĻŋ āĻā§āĻāĻā§ āĻĒā§āϝāĻŧā§āĻā§, āĻāĻāĻŋ āĻāĻāĻāĻŋ BTF āĻ
āĻŦāĻā§āĻā§āĻā§ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰā§āĻā§, āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻžāϰā§āύā§āϞ⧠āϞā§āĻĄ āĻāϰā§āĻā§ BPF_BTF_LOAD, āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āĻāĻŽāĻžāύā§āĻĄā§āϰ āϏāĻžāĻĨā§ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞā§āĻĄ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻĢāϞāĻžāĻĢāϞ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰā§āύ BPG_PROG_LOAD.
āĻāĻžāϰā§āύā§āϞ āϏāĻžāĻšāĻžāϝā§āϝāĻāĻžāϰā§
BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ "āĻŦāĻžāĻšā§āϝāĻŋāĻ" āĻĢāĻžāĻāĻļāύ āĻāĻžāϞāĻžāϤ⧠āĻĒāĻžāϰ⧠- āĻāĻžāϰā§āύā§āϞ āϏāĻžāĻšāĻžāϝā§āϝāĻāĻžāϰā§āĨ¤ āĻāĻ āĻšā§āϞā§āĻĒāĻžāϰ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāĻā§ āĻāĻžāϰā§āύā§āϞ āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤā§, āĻŽā§āϝāĻžāĻĒ āĻŽā§āϝāĻžāύāĻŋāĻĒā§āϞā§āĻ āĻāϰāϤ⧠āĻāĻŦāĻ "āĻŦāĻžāϏā§āϤāĻŦ āĻŦāĻŋāĻļā§āĻŦā§āϰ" āϏāĻžāĻĨā§ āϝā§āĻāĻžāϝā§āĻ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ - āĻĒāĻžāϰāĻĢ āĻāĻā§āύā§āĻ āϤā§āϰāĻŋ āĻāϰāϤā§, āĻšāĻžāϰā§āĻĄāĻāϝāĻŧā§āϝāĻžāϰ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāϤ⧠(āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻĢāϰā§āϝāĻŧāĻžāϰā§āĻĄ āĻĒā§āϝāĻžāĻā§āĻāĻā§āϞāĻŋ) āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ: bpf_get_smp_processor_id
"āĻāĻĻāĻžāĻšāϰāĻŖ āĻĻā§āĻŦāĻžāϰāĻž āĻļā§āĻāĻžāϰ" āĻĻā§āώā§āĻāĻžāύā§āϤā§āϰ āĻāĻžāĻ āĻžāĻŽā§āϰ āĻŽāϧā§āϝā§, āĻāϏā§āύ āĻāĻāĻāĻŋ āϏāĻšāĻžāϝāĻŧāĻ āĻĢāĻžāĻāĻļāύ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰāĻŋ, bpf_get_smp_processor_id(), āĻĢāĻžāĻāϞ⧠kernel/bpf/helpers.c. āĻāĻāĻŋ āĻĒā§āϰāϏā§āϏāϰā§āϰ āύāĻŽā§āĻŦāϰ āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠āϝāĻžāϰ āĻāĻĒāϰ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāϞāĻā§ āϤāĻŦā§ āĻāĻŽāϰāĻž āĻāϰ āĻļāĻŦā§āĻĻāĻžāϰā§āĻĨāĻŦāĻŋāĻĻā§āϝāĻžāϝāĻŧ āϤāϤāĻāĻž āĻāĻā§āϰāĻšā§ āύāĻ āϝāϤāĻāĻž āĻŦāĻžāϏā§āϤāĻŦā§ āϝ⧠āĻāĻāĻŋāϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ⧠āĻāĻ āϞāĻžāĻāύ āϞāĻžāĻā§:
BPF_CALL_0(bpf_get_smp_processor_id)
{
return smp_processor_id();
}BPF āĻšā§āϞā§āĻĒāĻžāϰ āĻĢāĻžāĻāĻļāύ āϏāĻāĻā§āĻāĻž āϞāĻŋāύāĻžāĻā§āϏ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ āϏāĻāĻā§āĻāĻžāϰ āĻ
āύā§āϰā§āĻĒāĨ¤ āĻāĻāĻžāύā§, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āϝāĻžāϰ āĻā§āύ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āύā§āĻāĨ¤ (āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āϝāĻž āϞāĻžāĻā§, āĻŦāϞā§āύ, āĻŽā§āϝāĻžāĻā§āϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϤāĻŋāύāĻāĻŋ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧ BPF_CALL_3. āĻāϰā§āĻā§āĻŽā§āύā§āĻā§āϰ āϏāϰā§āĻŦā§āĻā§āĻ āϏāĻāĻā§āϝāĻž āĻĒāĻžāĻāĻāĻāĻŋāĨ¤) āϝāĻžāĻāĻšā§āĻ, āĻāĻāĻŋ āϏāĻāĻā§āĻāĻžāϰ āĻĒā§āϰāĻĨāĻŽ āĻ
āĻāĻļāĨ¤ āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧ āĻ
āĻāĻļ āĻāĻžāĻāĻĒ āĻāĻ āύ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧ struct bpf_func_proto, āĻāϤ⧠āϏāĻšāĻžāϝāĻŧāĻ āĻĢāĻžāĻāĻļāύā§āϰ āĻāĻāĻāĻŋ āĻŦāĻŋāĻŦāϰāĻŖ āϰāϝāĻŧā§āĻā§ āϝāĻž āϝāĻžāĻāĻžāĻāĻāĻžāϰ⧠āĻŦā§āĻāϤ⧠āĻĒāĻžāϰā§:
const struct bpf_func_proto bpf_get_smp_processor_id_proto = {
.func = bpf_get_smp_processor_id,
.gpl_only = false,
.ret_type = RET_INTEGER,
};āĻšā§āϞā§āĻĒāĻžāϰ āĻĢāĻžāĻāĻļāύ āύāĻŋāĻŦāύā§āϧāύ
āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϧāϰāĻŖā§āϰ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāϰ āĻāύā§āϝ, āϤāĻžāĻĻā§āϰ āĻ
āĻŦāĻļā§āϝāĻ āĻāĻāĻŋ āύāĻŋāĻŦāύā§āϧāύ āĻāϰāϤ⧠āĻšāĻŦā§, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ āĻāĻžāĻāĻĒā§āϰ āĻāύā§āϝ BPF_PROG_TYPE_XDP āĻāĻžāϰā§āύā§āϞ⧠āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧ xdp_func_proto, āϝāĻž āϏāĻžāĻšāĻžāϝā§āϝāĻāĻžāϰ⧠āĻĢāĻžāĻāĻļāύ āĻāĻāĻĄāĻŋ āĻĨā§āĻā§ āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰ⧠āϝ⧠XDP āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋāĻā§ āϏāĻŽāϰā§āĻĨāύ āĻāϰ⧠āĻāĻŋ āύāĻžāĨ¤ āĻāĻŽāĻžāĻĻā§āϰ āĻĢāĻžāĻāĻļāύ āĻšāϞ :
static const struct bpf_func_proto *
xdp_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
{
switch (func_id) {
...
case BPF_FUNC_get_smp_processor_id:
return &bpf_get_smp_processor_id_proto;
...
}
}āύāϤā§āύ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āϧāϰāύ āĻĢāĻžāĻāϞ⧠"āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ" āĻāĻā§ āĻāĻāĻāĻŋ āĻŽā§āϝāĻžāĻā§āϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠BPF_PROG_TYPE. āĻāĻĻā§āϧā§āϤāĻŋāϤ⧠āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āĻāĻžāϰāĻŖ āĻāĻāĻŋ āĻāĻāĻāĻŋ āϝā§āĻā§āϤāĻŋāĻ āϏāĻāĻā§āĻāĻž, āĻāĻŦāĻ C āĻāĻžāώāĻžāϰ āĻĒāϰāĻŋāĻāĻžāώāĻžāϝāĻŧ āĻāĻāĻā§āϰāĻŋāĻ āĻāĻžāĻ āĻžāĻŽā§āϰ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āϏā§āĻā§āϰ āϏāĻāĻā§āĻāĻž āĻ
āύā§āϝāĻžāύā§āϝ āĻāĻžāϝāĻŧāĻāĻžāϝāĻŧ āĻāĻā§āĨ¤ āĻŦāĻŋāĻļā§āώ āĻāϰā§, āĻĢāĻžāĻāϞ⧠kernel/bpf/verifier.c āĻĢāĻžāĻāϞ āĻĨā§āĻā§ āϏāĻŽāϏā§āϤ āϏāĻāĻā§āĻāĻž bpf_types.h āĻāĻžāĻ āĻžāĻŽā§āϰ āĻāĻāĻāĻŋ āĻ
ā§āϝāĻžāϰ⧠āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧ bpf_verifier_ops[]:
static const struct bpf_verifier_ops *const bpf_verifier_ops[] = {
#define BPF_PROG_TYPE(_id, _name, prog_ctx_type, kern_ctx_type)
[_id] = & _name ## _verifier_ops,
#include <linux/bpf_types.h>
#undef BPF_PROG_TYPE
};āĻ
āϰā§āĻĨāĻžā§, āĻĒā§āϰāϤāĻŋāĻāĻŋ āϧāϰāύā§āϰ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāύā§āϝ, āĻāĻžāĻāĻĒā§āϰ āĻĄā§āĻāĻž āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰā§āϰ āĻāĻāĻāĻŋ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧ struct bpf_verifier_ops, āϝāĻž āĻŽāĻžāύ āĻĻāĻŋāϝāĻŧā§ āĻāϰāĻŽā§āĻ āĻāϰāĻž āĻšāϝāĻŧ _name ## _verifier_ops, āϝā§āĻŽāύ, xdp_verifier_ops āĻĨā§āĻā§ xdp... āĻāĻ āύ xdp_verifier_ops āĻĢāĻžāĻāϞ⧠net/core/filter.c āύāĻŋāĻŽā§āύāϰā§āĻĒ:
const struct bpf_verifier_ops xdp_verifier_ops = {
.get_func_proto = xdp_func_proto,
.is_valid_access = xdp_is_valid_access,
.convert_ctx_access = xdp_convert_ctx_access,
.gen_prologue = bpf_noop_prologue,
};āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻĒāϰāĻŋāĻāĻŋāϤ āĻĢāĻžāĻāĻļāύ āĻĻā§āĻāϤ⧠xdp_func_proto, āϝāĻž āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻā§āύ⧠āĻā§āϝāĻžāϞā§āĻā§āĻā§āϰ āϏāĻŽā§āĻŽā§āĻā§āύ āĻšāϞ⧠āϝāĻžāĻāĻžāĻāĻāĻžāϰ⧠āĻāĻžāϞāĻžāĻŦā§ āĻāĻŋāĻā§ āĻāĻāĻāĻŋ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāĻŋāϤāϰ⧠āĻĢāĻžāĻāĻļāύ, āĻĻā§āĻā§āύ .
āĻāϏā§āύ āĻĻā§āĻāĻŋ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻ
āύā§āĻŽāĻžāύāĻŽā§āϞāĻ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠bpf_get_smp_processor_id. āĻāĻāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āĻŦāĻŋāĻāĻžāĻ āĻĨā§āĻā§ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āύāĻŋāĻŽā§āύāϰā§āĻĒ āĻĒā§āύāϰāĻžāϝāĻŧ āϞāĻŋāĻāĻŋ:
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
SEC("xdp/simple")
int simple(void *ctx)
{
if (bpf_get_smp_processor_id() != 0)
return XDP_DROP;
return XDP_PASS;
}
char LICENSE[] SEC("license") = "GPL";āĻĒā§āϰāϤā§āĻ bpf_get_smp_processor_id в <bpf/bpf_helper_defs.h> āĻā§āϰāύā§āĻĨāĻžāĻāĻžāϰāĻā§āϞāĻŋ libbpf āĻāĻŋāĻāĻžāĻŦā§
static u32 (*bpf_get_smp_processor_id)(void) = (void *) 8;āĻāĻāĻžāĻ, bpf_get_smp_processor_id āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āϝāĻžāϰ āĻŽāĻžāύ 8, āϝā§āĻāĻžāύ⧠8 āĻšāϞ āĻŽāĻžāύ BPF_FUNC_get_smp_processor_id āĻāĻĻāϰā§āĻļ enum bpf_fun_id, āϝāĻž āĻĢāĻžāĻāϞ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāύā§āϝ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ vmlinux.h (āĻĢāĻžāĻāϞ bpf_helper_defs.h āĻāĻžāϰā§āύā§āϞā§āϰ āĻāĻāĻāĻŋ āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻĻā§āĻŦāĻžāϰāĻž āĻāϤā§āĻĒāύā§āύ, āϤāĻžāĻ "āĻāĻžāĻĻā§" āϏāĻāĻā§āϝāĻžāĻā§āϞāĻŋ āĻ āĻŋāĻ āĻāĻā§)āĨ¤ āĻāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻā§āύ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āύā§āϝāĻŧ āύāĻž āĻāĻŦāĻ āĻāĻžāĻāĻĒā§āϰ āĻāĻāĻāĻŋ āĻŽāĻžāύ āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠__u32. āϝāĻāύ āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āĻāĻāĻŋ āĻāĻžāϞāĻžāĻ, clang āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻā§āĻļāύāĻž āϤā§āϰāĻŋ āĻāϰ⧠BPF_CALL "āϏāĻ āĻŋāĻ āϧāϰāύā§āϰ" āĻāϞā§āύ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāĻŦāĻ āĻŦāĻŋāĻāĻžāĻ āĻĻā§āĻā§āύ xdp/simple:
$ clang -O2 -g -c -target bpf -I libbpf/src/root/usr/include xdp-simple.bpf.c -o xdp-simple.bpf.o
$ llvm-objdump -D --section=xdp/simple xdp-simple.bpf.o
xdp-simple.bpf.o: file format elf64-bpf
Disassembly of section xdp/simple:
0000000000000000 <simple>:
0: 85 00 00 00 08 00 00 00 call 8
1: bf 01 00 00 00 00 00 00 r1 = r0
2: 67 01 00 00 20 00 00 00 r1 <<= 32
3: 77 01 00 00 20 00 00 00 r1 >>= 32
4: b7 00 00 00 02 00 00 00 r0 = 2
5: 15 01 01 00 00 00 00 00 if r1 == 0 goto +1 <LBB0_2>
6: b7 00 00 00 01 00 00 00 r0 = 1
0000000000000038 <LBB0_2>:
7: 95 00 00 00 00 00 00 00 exitāĻĒā§āϰāĻĨāĻŽ āϞāĻžāĻāύ⧠āĻāĻŽāϰāĻž āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āĻĻā§āĻāϤ⧠āĻĒāĻžāĻ call, āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ IMM āϝāĻž 8 āĻāϰ āϏāĻŽāĻžāύ, āĻāĻŦāĻ SRC_REG - āĻļā§āύā§āϝāĨ¤ āϝāĻžāĻāĻžāĻāĻāĻžāϰā§āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšā§āϤ ABI āĻā§āĻā§āϤāĻŋ āĻ
āύā§āϏāĻžāϰā§, āĻāĻāĻŋ āϏāĻžāĻšāĻžāϝā§āϝāĻāĻžāϰ⧠āĻĢāĻžāĻāĻļāύ āύāĻŽā§āĻŦāϰ āĻāĻā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻāϞāĨ¤ āĻāĻāĻŦāĻžāϰ āĻāĻāĻŋ āĻāĻžāϞ⧠āĻšāϞā§, āϝā§āĻā§āϤāĻŋāĻāĻŋ āϏāĻšāĻāĨ¤ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ āĻĨā§āĻā§ āϰāĻŋāĻāĻžāϰā§āύ āĻŽāĻžāύ r0 āĻ
āύā§āϞāĻŋāĻĒāĻŋ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ r1 āĻāĻŦāĻ āϞāĻžāĻāύ 2,3 āĻ āĻāĻāĻŋ āĻāĻžāĻāĻĒā§ āϰā§āĻĒāĻžāύā§āϤāϰāĻŋāϤ āĻšāϝāĻŧ u32 - āĻāĻĒāϰā§āϰ 32 āĻŦāĻŋāĻ āϏāĻžāĻĢ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ 4,5,6,7 āϞāĻžāĻāύ⧠āĻāĻŽāϰāĻž 2 āϰāĻŋāĻāĻžāϰā§āύ āĻāϰāĻŋ (XDP_PASS) āĻŦāĻž 1 (XDP_DROP) āϞāĻžāĻāύ 0 āĻĨā§āĻā§ āϏāĻšāĻžāϝāĻŧāĻ āĻĢāĻžāĻāĻļāύ āĻāĻāĻāĻŋ āĻļā§āύā§āϝ āĻŦāĻž āĻ
-āĻļā§āύā§āϝ āĻŽāĻžāύ āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§āĻā§ āĻāĻŋāύāĻž āϤāĻžāϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰā§āĨ¤
āĻāϏā§āύ āύāĻŋāĻā§āĻĻā§āϰ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻŋ: āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āϞā§āĻĄ āĻāϰā§āύ āĻāĻŦāĻ āĻāĻāĻāĻĒā§āĻāĻāĻŋ āĻĻā§āĻā§āύ bpftool prog dump xlated:
$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.h
$ clang -O2 -g -I ./libbpf/src/root/usr/include/ -o xdp-simple xdp-simple.c ./libbpf/src/root/usr/lib64/libbpf.a -lelf -lz
$ sudo ./xdp-simple &
[2] 10914
$ sudo bpftool p | grep simple
523: xdp name simple tag 44c38a10c657e1b0 gpl
pids xdp-simple(10915)
$ sudo bpftool p d x id 523
int simple(void *ctx):
; if (bpf_get_smp_processor_id() != 0)
0: (85) call bpf_get_smp_processor_id#114128
1: (bf) r1 = r0
2: (67) r1 <<= 32
3: (77) r1 >>= 32
4: (b7) r0 = 2
; }
5: (15) if r1 == 0x0 goto pc+1
6: (b7) r0 = 1
7: (95) exitāĻ āĻŋāĻ āĻāĻā§, āϝāĻžāĻāĻžāĻāĻāĻžāϰ⧠āϏāĻ āĻŋāĻ āĻāĻžāϰā§āύā§āϞ-āĻšā§āϞā§āĻĒāĻžāϰ āĻā§āĻāĻā§ āĻĒā§āϝāĻŧā§āĻā§āĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ: āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻĒāĻžāϏ āĻāϰāĻž āĻāĻŦāĻ āĻ āĻŦāĻļā§āώ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻžāϞāĻžāύā§!
āϏāĻŽāϏā§āϤ āϰāĻžāύ-āϞā§āĻā§āϞ āĻšā§āϞā§āĻĒāĻžāϰ āĻĢāĻžāĻāĻļāύā§āϰ āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āĻāĻžāĻāĻĒ āĻāĻā§
u64 fn(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5)āϏāĻšāĻžāϝāĻŧāĻ āĻĢāĻžāĻāĻļāύā§āϰ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ⧠āĻĒāĻžāϏ āĻāϰāĻž āĻšāϝāĻŧ r1-r5, āĻāĻŦāĻ āĻŽāĻžāύ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ⧠āĻĢā§āϰāϤ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧ r0. āĻāĻŽāύ āĻā§āύ āĻĢāĻžāĻāĻļāύ āύā§āĻ āϝāĻž āĻĒāĻžāĻāĻāĻāĻŋāϰ āĻŦā§āĻļāĻŋ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āύā§āϝāĻŧ āĻāĻŦāĻ āĻāĻŦāĻŋāώā§āϝāϤ⧠āϤāĻžāĻĻā§āϰ āĻāύā§āϝ āϏāĻŽāϰā§āĻĨāύ āϝā§āĻ āĻāϰāĻž āĻšāĻŦā§ āĻŦāϞ⧠āĻāĻļāĻž āĻāϰāĻž āϝāĻžāϝāĻŧ āύāĻžāĨ¤
āĻāϏā§āύ āύāϤā§āύ āĻāĻžāϰā§āύā§āϞ āĻšā§āϞā§āĻĒāĻžāϰ āĻāĻŦāĻ āĻā§āĻāĻžāĻŦā§ BPF āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋāĻā§āϞāĻŋ āĻĒāĻžāϏ āĻāϰ⧠āϤāĻž āĻĻā§āĻā§ āύā§āĻāϝāĻŧāĻž āϝāĻžāĻāĨ¤ āĻāϰ āĻĒā§āύāϰā§āϞāĻŋāĻāύ āĻāϰāĻž āϝāĻžāĻ xdp-simple.bpf.c āύāĻŋāĻŽā§āύāϰā§āĻĒ (āĻŦāĻžāĻāĻŋ āϞāĻžāĻāύ āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻšāϝāĻŧāύāĻŋ):
SEC("xdp/simple")
int simple(void *ctx)
{
bpf_printk("running on CPU%un", bpf_get_smp_processor_id());
return XDP_PASS;
}āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āϝ⧠āϏāĻŋāĻĒāĻŋāĻāĻāϤ⧠āĻāϞāĻā§ āϤāĻžāϰ āϏāĻāĻā§āϝāĻž āĻĒā§āϰāĻŋāύā§āĻ āĻāϰā§āĨ¤ āĻāϏā§āύ āĻāĻāĻŋ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰā§āύ āĻāĻŦāĻ āĻā§āĻĄāĻāĻŋ āĻĻā§āĻā§āύ:
$ llvm-objdump -D --section=xdp/simple --no-show-raw-insn xdp-simple.bpf.o
0000000000000000 <simple>:
0: r1 = 10
1: *(u16 *)(r10 - 8) = r1
2: r1 = 8441246879787806319 ll
4: *(u64 *)(r10 - 16) = r1
5: r1 = 2334956330918245746 ll
7: *(u64 *)(r10 - 24) = r1
8: call 8
9: r1 = r10
10: r1 += -24
11: r2 = 18
12: r3 = r0
13: call 6
14: r0 = 2
15: exit0-7 āϞāĻžāĻāύ⧠āĻāĻŽāϰāĻž āϏā§āĻā§āϰāĻŋāĻ āϞāĻŋāĻāĻŋ running on CPU%un, āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āϞāĻžāĻāύ 8 āĻ āĻāĻŽāϰāĻž āĻĒāϰāĻŋāĻāĻŋāϤ āĻāĻāĻāĻŋ āĻāĻžāϞāĻžāύ bpf_get_smp_processor_id. 9-12 āϞāĻžāĻāύ⧠āĻāĻŽāϰāĻž āϏāĻšāĻžāϝāĻŧāĻ āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻĒā§āϰāϏā§āϤā§āϤ āĻāϰāĻŋ bpf_printk - āϰā§āĻāĻŋāϏā§āĻāĻžāϰ r1, r2, r3. āĻā§āύ āϤāĻžāĻĻā§āϰ āĻŽāϧā§āϝ⧠āϤāĻŋāύāĻāĻŋ āĻāĻŦāĻ āĻĻā§āĻāĻŋ āύā§āĻ? āĻāĻžāϰāĻŖ bpf_printk - āĻĒā§āϰāĻā§āϤ āϏāĻžāĻšāĻžāϝā§āϝāĻāĻžāϰā§āϰ āĻāĻžāϰāĻĒāĻžāĻļā§ bpf_trace_printk, āϝāĻž āĻĢāϰāĻŽā§āϝāĻžāĻ āϏā§āĻā§āϰāĻŋāĻ āĻāϰ āĻāĻāĻžāϰ āĻĒāĻžāϏ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤
āĻāϰ āĻāĻāύ āĻāϝāĻŧā§āĻ āϞāĻžāĻāύ āϝā§āĻ āĻāϰāĻž āϝāĻžāĻ xdp-simple.cāϝāĻžāϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻ āĻāϰ⧠lo āĻāĻŦāĻ āϏāϤā§āϝāĻŋāĻ āĻļā§āϰā§!
$ cat xdp-simple.c
#include <linux/if_link.h>
#include <err.h>
#include <unistd.h>
#include "xdp-simple.skel.h"
int main(int argc, char **argv)
{
__u32 flags = XDP_FLAGS_SKB_MODE;
struct xdp_simple_bpf *obj;
obj = xdp_simple_bpf__open_and_load();
if (!obj)
err(1, "failed to open and/or load BPF objectn");
bpf_set_link_xdp_fd(1, -1, flags);
bpf_set_link_xdp_fd(1, bpf_program__fd(obj->progs.simple), flags);
cleanup:
xdp_simple_bpf__destroy(obj);
}āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŋ bpf_set_link_xdp_fd, āϝāĻž XDP-āĻāĻžāĻāĻĒ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāĻā§ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏ⧠āϏāĻāϝā§āĻā§āϤ āĻāϰā§āĨ¤ āĻāĻŽāϰāĻž āĻāύā§āĻāĻžāϰāĻĢā§āϏ āύāĻŽā§āĻŦāϰ āĻšāĻžāϰā§āĻĄāĻā§āĻĄ āĻāϰā§āĻāĻŋ lo, āϝāĻž āϏāϰā§āĻŦāĻĻāĻž 1 āĻšāϝāĻŧāĨ¤ āĻĒā§āϰāĻžāύ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āϏāĻāϝā§āĻā§āϤ āĻĨāĻžāĻāϞ⧠āĻĒā§āϰāĻĨāĻŽā§ āĻāϞāĻžāĻĻāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāϰāĻž āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻĻā§āĻŦāĻžāϰ āĻāĻžāϞāĻžāĻāĨ¤ āϞāĻā§āώā§āϝ āĻāϰā§āύ āϝ⧠āĻāĻāύ āĻāĻŽāĻžāĻĻā§āϰ āĻā§āύ āĻā§āϝāĻžāϞā§āĻā§āĻā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āύā§āĻ pause āĻ
āĻĨāĻŦāĻž āĻāĻāĻāĻŋ āĻ
āϏā§āĻŽ āϞā§āĻĒ: āĻāĻŽāĻžāĻĻā§āϰ āϞā§āĻĄāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĒā§āϰāϏā§āĻĨāĻžāύ āĻāϰāĻŦā§, āĻāĻŋāύā§āϤ⧠BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻā§āύā§āĻā§āϰ āĻā§āϏā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ āĻšāĻāϝāĻŧāĻžāϰ āĻāĻžāϰāĻŖā§ āĻāĻāĻŋāĻā§ āĻšāϤā§āϝāĻž āĻāϰāĻž āĻšāĻŦā§ āύāĻžāĨ¤ āϏāĻĢāϞāĻāĻžāĻŦā§ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāĻŦāĻ āϏāĻāϝā§āĻā§āϰ āĻĒāϰ, āĻāĻāϤ āĻĒā§āϰāϤāĻŋāĻāĻŋ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻĒā§āϝāĻžāĻā§āĻā§āϰ āĻāύā§āϝ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻžāϞ⧠āĻāϰāĻž āĻšāĻŦā§ lo.
āĻāϏā§āύ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰāĻŋ āĻāĻŦāĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏāĻāĻŋ āĻĻā§āĻāĻŋ lo:
$ sudo ./xdp-simple
$ sudo bpftool p | grep simple
669: xdp name simple tag 4fca62e77ccb43d6 gpl
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 669āĻāĻŽāϰāĻž āϝ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰā§āĻāĻŋ āϤāĻžāϰ ID 669 āĻāĻā§ āĻāĻŦāĻ āĻāĻŽāϰāĻž āĻāύā§āĻāĻžāϰāĻĢā§āϏ⧠āĻāĻāĻ ID āĻĻā§āĻāϤ⧠āĻĒāĻžāĻ lo. āĻāĻŽāϰāĻž āĻāϝāĻŧā§āĻāĻāĻŋ āĻĒā§āϝāĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāĻŦ 127.0.0.1 (āĻ
āύā§āϰā§āϧ + āĻāϤā§āϤāϰ):
$ ping -c1 localhostāĻāĻŦāĻ āĻāĻāύ āĻĄāĻŋāĻŦāĻžāĻ āĻāĻžāϰā§āĻā§āϝāĻŧāĻžāϞ āĻĢāĻžāĻāϞā§āϰ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻĻā§āĻāĻŋ /sys/kernel/debug/tracing/trace_pipe, āϝāĻž bpf_printk āϤāĻžāϰ āĻŦāĻžāϰā§āϤāĻž āϞā§āĻā§āύ:
# cat /sys/kernel/debug/tracing/trace_pipe
ping-13937 [000] d.s1 442015.377014: bpf_trace_printk: running on CPU0
ping-13937 [000] d.s1 442015.377027: bpf_trace_printk: running on CPU0āĻĻā§āĻāĻŋ āĻĒā§āϝāĻžāĻā§āĻ āĻĻā§āĻāĻž āĻā§āĻā§ lo āĻāĻŦāĻ CPU0 āĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ - āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰāĻĨāĻŽ āĻĒā§āϰā§āĻŖāĻžāĻā§āĻ āĻ
āϰā§āĻĨāĻšā§āύ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻžāϞ⧠āĻšāϝāĻŧā§āĻā§!
āĻāĻāĻž āϝ⧠āĻŽā§āϞā§āϝ bpf_printk āĻāĻāĻŋ āĻĄāĻŋāĻŦāĻžāĻ āĻĢāĻžāĻāϞ⧠āϞā§āĻāĻžāϰ āĻāύā§āϝ āĻāĻŋāĻā§āĻ āύāϝāĻŧ: āĻāĻāĻŋ āĻāϤā§āĻĒāĻžāĻĻāύ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰā§āϰ āĻāύā§āϝ āϏāĻŦāĻā§āϝāĻŧā§ āϏāĻĢāϞ āϏāĻšāĻžāϝāĻŧāĻ āύāϝāĻŧ, āϤāĻŦā§ āĻāĻŽāĻžāĻĻā§āϰ āϞāĻā§āώā§āϝ āĻāĻŋāϞ āϏāĻšāĻ āĻāĻŋāĻā§ āĻĻā§āĻāĻžāύā§āĨ¤
BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĨā§āĻā§ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāĻž
āĻāĻĻāĻžāĻšāϰāĻŖ: BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§
āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āĻŦāĻŋāĻāĻžāĻā§ āĻāĻŽāϰāĻž āĻāĻāĻāĻžāϰ āϏā§āĻĒā§āϏ āĻĨā§āĻā§ āĻŽā§āϝāĻžāĻĒ āϤā§āϰāĻŋ āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻļāĻŋāĻā§āĻāĻŋ, āĻāĻŦāĻ āĻāĻāύ āĻāĻžāϰā§āύā§āϞā§āϰ āĻ
āĻāĻļāĻāĻŋ āĻĻā§āĻāĻŋāĨ¤ āĻāϞā§āύ āĻļā§āϰ⧠āĻāϰāĻž āϝāĻžāĻ, āϝāĻĨāĻžāϰā§āϤāĻŋ, āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĻāĻŋāϝāĻŧā§āĨ¤ āĻāϰ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĒā§āύāϰā§āϞāĻŋāĻāύ āĻāϰāĻž āϝāĻžāĻ xdp-simple.bpf.c āύāĻŋāĻŽā§āύāϰā§āĻĒ:
#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
struct {
__uint(type, BPF_MAP_TYPE_ARRAY);
__uint(max_entries, 8);
__type(key, u32);
__type(value, u64);
} woo SEC(".maps");
SEC("xdp/simple")
int simple(void *ctx)
{
u32 key = bpf_get_smp_processor_id();
u32 *val;
val = bpf_map_lookup_elem(&woo, &key);
if (!val)
return XDP_ABORTED;
*val += 1;
return XDP_PASS;
}
char LICENSE[] SEC("license") = "GPL";āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻļā§āϰā§āϤ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āϏāĻāĻā§āĻāĻž āϝā§āĻ āĻāϰā§āĻāĻŋ woo: āĻāĻāĻŋ āĻāĻāĻāĻŋ 8-āĻāϞāĻŋāĻŽā§āύā§āĻ āĻ
ā§āϝāĻžāϰ⧠āϝāĻž āĻŽāĻžāύ āϏāĻāϰāĻā§āώāĻŖ āĻāϰ⧠u64 (C āϤ⧠āĻāĻŽāϰāĻž āϝā§āĻŽāύ āĻāĻāĻāĻŋ āĻ
ā§āϝāĻžāϰā§āĻā§ āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻŦ u64 woo[8]) āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ "xdp/simple" āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻā§āϰāĻŋāϝāĻŧā§āĻŦāϞ⧠āĻŦāϰā§āϤāĻŽāĻžāύ āĻĒā§āϰāϏā§āϏāϰ āύāĻŽā§āĻŦāϰ āĻĒāĻžāĻ key āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āϏāĻžāĻšāĻžāϝā§āϝāĻāĻžāϰ⧠āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠bpf_map_lookup_element āĻāĻŽāϰāĻž āĻ
ā§āϝāĻžāϰā§āϰ āϏāĻāĻļā§āϞāĻŋāώā§āĻ āĻāύā§āĻā§āϰāĻŋāϤ⧠āĻāĻāĻāĻŋ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āĻĒāĻžāĻ, āϝāĻž āĻāĻŽāϰāĻž āĻāĻ āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āĻĻā§āϧāĻŋ āĻāϰāĻŋāĨ¤ āϰāĻžāĻļāĻŋāϝāĻŧāĻžāύ āĻāĻžāώāĻžāϝāĻŧ āĻ
āύā§āĻŦāĻžāĻĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§: āĻāĻŽāϰāĻž āĻĒāϰāĻŋāϏāĻāĻā§āϝāĻžāύ āĻāĻŖāύāĻž āĻāϰāĻŋ āϝāĻžāϰ āĻāĻŋāϤā§āϤāĻŋāϤ⧠CPU āĻāύāĻāĻžāĻŽāĻŋāĻ āĻĒā§āϝāĻžāĻā§āĻāĻā§āϞāĻŋ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰā§āĨ¤ āĻāϏā§āύ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻžāϞāĻžāύā§āϰ āĻā§āώā§āĻāĻž āĻāϰāĻŋ:
$ clang -O2 -g -c -target bpf -I libbpf/src/root/usr/include xdp-simple.bpf.c -o xdp-simple.bpf.o
$ bpftool gen skeleton xdp-simple.bpf.o > xdp-simple.skel.h
$ clang -O2 -g -I ./libbpf/src/root/usr/include/ -o xdp-simple xdp-simple.c ./libbpf/src/root/usr/lib64/libbpf.a -lelf -lz
$ sudo ./xdp-simpleāĻāϰ āĻā§āĻ āĻāϰāĻž āϝāĻžāĻ āϝ⧠āϏ⧠āĻāĻŦāĻĻā§āϧ āĻšāϝāĻŧā§āĻā§ lo āĻāĻŦāĻ āĻāĻŋāĻā§ āĻĒā§āϝāĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāύ:
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 108
$ for s in `seq 234`; do sudo ping -f -c 100 127.0.0.1 >/dev/null 2>&1; doneāĻāĻāύ āĻ ā§āϝāĻžāϰā§āϰ āĻŦāĻŋāώāϝāĻŧāĻŦāϏā§āϤ⧠āĻĻā§āĻā§āύ:
$ sudo bpftool map dump name woo
[
{ "key": 0, "value": 0 },
{ "key": 1, "value": 400 },
{ "key": 2, "value": 0 },
{ "key": 3, "value": 0 },
{ "key": 4, "value": 0 },
{ "key": 5, "value": 0 },
{ "key": 6, "value": 0 },
{ "key": 7, "value": 46400 }
]āĻĒā§āϰāĻžāϝāĻŧ āϏāĻŽāϏā§āϤ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž CPU7 āĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ āĻāĻāĻŋ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āύāϝāĻŧ, āĻŽā§āϞ āĻŦāĻŋāώāϝāĻŧ āĻšāϞ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻāĻžāĻ āĻāϰ⧠āĻāĻŦāĻ āĻāĻŽāϰāĻž āĻŦā§āĻāϤ⧠āĻĒāĻžāϰāĻŋ āĻāĻŋāĻāĻžāĻŦā§ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻĨā§āĻā§ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āĻšāϝāĻŧ - āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠.
āϰāĻšāϏā§āϝāĻŽāϝāĻŧ āϏā§āĻāĻ
āϏā§āϤāϰāĻžāĻ, āĻāĻŽāϰāĻž āϝā§āĻŽāύ āĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĨā§āĻā§ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ
val = bpf_map_lookup_elem(&woo, &key);āϝā§āĻāĻžāύ⧠āϏāĻšāĻžāϝāĻŧāĻ āĻĢāĻžāĻāĻļāύ āĻŽāϤ āĻĻā§āĻāĻžāϝāĻŧ
void *bpf_map_lookup_elem(struct bpf_map *map, const void *key)āĻāĻŋāύā§āϤ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āĻĒāĻžāϏ āĻāϰāĻāĻŋ &woo āĻāĻāĻāĻŋ āύāĻžāĻŽāĻšā§āύ āĻāĻžāĻ āĻžāĻŽā§āϰ āĻāĻžāĻā§ struct { ... }...
āĻāĻŽāϰāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻ
ā§āϝāĻžāϏā§āĻŽā§āĻŦāϞāĻžāϰ āϤāĻžāĻāĻžāύ, āĻāĻŽāϰāĻž āϝ⧠āĻŽāĻžāύ āĻĻā§āĻāϤ⧠&woo āĻāϏāϞ⧠āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧ āύāĻž (āϞāĻžāĻāύ 4):
llvm-objdump -D --section xdp/simple xdp-simple.bpf.o
xdp-simple.bpf.o: file format elf64-bpf
Disassembly of section xdp/simple:
0000000000000000 <simple>:
0: 85 00 00 00 08 00 00 00 call 8
1: 63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0
2: bf a2 00 00 00 00 00 00 r2 = r10
3: 07 02 00 00 fc ff ff ff r2 += -4
4: 18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll
6: 85 00 00 00 01 00 00 00 call 1
...āĻāĻŦāĻ āϏā§āĻĨāĻžāύāĻžāύā§āϤāϰā§āϰ āĻŽāϧā§āϝ⧠āϰāϝāĻŧā§āĻā§:
$ llvm-readelf -r xdp-simple.bpf.o | head -4
Relocation section '.relxdp/simple' at offset 0xe18 contains 1 entries:
Offset Info Type Symbol's Value Symbol's Name
0000000000000020 0000002700000001 R_BPF_64_64 0000000000000000 wooāĻāĻŋāύā§āϤ⧠āϝāĻĻāĻŋ āĻāĻŽāϰāĻž āĻāϤāĻŋāĻŽāϧā§āϝ⧠āϞā§āĻĄ āĻāϰāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āĻĻā§āĻāĻŋ, āĻāĻŽāϰāĻž āϏāĻ āĻŋāĻ āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻ (āϞāĻžāĻāύ 4):
$ sudo bpftool prog dump x name simple
int simple(void *ctx):
0: (85) call bpf_get_smp_processor_id#114128
1: (63) *(u32 *)(r10 -4) = r0
2: (bf) r2 = r10
3: (07) r2 += -4
4: (18) r1 = map[id:64]
...āĻāĻāĻāĻžāĻŦā§, āĻāĻŽāϰāĻž āĻāĻĒāϏāĻāĻšāĻžāϰ⧠āĻāϏāϤ⧠āĻĒāĻžāϰāĻŋ āϝ⧠āĻāĻŽāĻžāĻĻā§āϰ āϞā§āĻĄāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻžāϞ⧠āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āϞāĻŋāĻā§āĻāĻāĻŋ &woo āĻāĻāĻāĻŋ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻĻāĻŋāϝāĻŧā§ āĻāĻŋāĻā§ āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāĻŋāϤ āĻšāϝāĻŧā§āĻāĻŋāϞ libbpf. āĻĒā§āϰāĻĨāĻŽā§ āĻāĻŽāϰāĻž āĻāĻāĻāĻĒā§āĻ āĻĻā§āĻāĻŦ strace:
$ sudo strace -e bpf ./xdp-simple
...
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_ARRAY, key_size=4, value_size=8, max_entries=8, map_name="woo", ...}, 120) = 4
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, prog_name="simple", ...}, 120) = 5āĻāĻŽāϰāĻž āϝ⧠āĻĻā§āĻāϤ⧠libbpf āĻāĻāĻāĻŋ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āϤā§āϰāĻŋ āĻāϰā§āĻā§ woo āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰā§āύ simple. āĻāϏā§āύ āĻāĻŽāϰāĻž āĻā§āĻāĻžāĻŦā§ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āϞā§āĻĄ āĻāϰāĻŋ āϤāĻž āĻāύāĻŋāώā§āĻ āĻāĻžāĻŦā§ āĻĻā§āĻā§ āύā§āĻāϝāĻŧāĻž āϝāĻžāĻ:
- āĻāϞ
xdp_simple_bpf__open_and_loadāĻĢāĻžāĻāϞ āĻĨā§āĻā§xdp-simple.skel.h - āĻā§āύ āĻāĻžāϰāĻŖāĻā§āϞā§
xdp_simple_bpf__loadāĻĢāĻžāĻāϞ āĻĨā§āĻā§xdp-simple.skel.h - āĻā§āύ āĻāĻžāϰāĻŖāĻā§āϞā§
bpf_object__load_skeletonāĻĢāĻžāĻāϞ āĻĨā§āĻā§libbpf/src/libbpf.c - āĻā§āύ āĻāĻžāϰāĻŖāĻā§āϞā§
bpf_object__load_xattrāĻĨā§āĻā§libbpf/src/libbpf.c
āĻļā§āώ āĻĢāĻžāĻāĻļāύ, āĻ
āύā§āϝāĻžāύā§āϝ āĻāĻŋāύāĻŋāϏā§āϰ āĻŽāϧā§āϝā§, āĻāϞ āĻšāĻŦā§ bpf_object__create_maps, āϝāĻž āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻŽāĻžāύāĻāĻŋāϤā§āϰāĻā§āϞāĻŋāĻā§ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰā§āϤ⧠āĻĒāϰāĻŋāĻŖāϤ āĻāϰ⧠āĻŦāĻž āĻā§āϞā§āĨ¤ (āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻĻā§āĻāϤ⧠āĻĒāĻžāĻ BPF_MAP_CREATE āĻāĻāĻāĻĒā§āĻā§ strace.) āĻĒāϰāĻŦāϰā§āϤ⧠āĻĢāĻžāĻāĻļāύ āĻŦāϞāĻž āĻšāϝāĻŧ bpf_object__relocate āĻāĻŦāĻ āϤāĻŋāύāĻŋāĻ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻā§āϰāĻšā§, āϝā§āĻšā§āϤ⧠āĻāĻŽāϰāĻž āϝāĻž āĻĻā§āĻā§āĻāĻŋ āϤāĻž āĻāĻŽāϰāĻž āĻŽāύ⧠āϰāĻžāĻāĻŋ woo āϏā§āĻĨāĻžāύāĻžāύā§āϤāϰ āĻā§āĻŦāĻŋāϞā§āĨ¤ āĻāĻāĻŋ āĻ
āύā§āĻŦā§āώāĻŖ, āĻāĻŽāϰāĻž āĻ
āĻŦāĻļā§āώ⧠āĻĢāĻžāĻāĻļāύ āύāĻŋāĻā§āĻĻā§āϰ āĻā§āĻāĻā§ bpf_program__relocate, āϝāĻž :
case RELO_LD64:
insn[0].src_reg = BPF_PSEUDO_MAP_FD;
insn[0].imm = obj->maps[relo->map_idx].fd;
break;āϤāĻžāĻ āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āύāĻŋāϰā§āĻĻā§āĻļāύāĻž āĻā§āϰāĻšāĻŖ āĻāϰāĻŋ
18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 llāĻāĻŦāĻ āĻāϰ āϏāĻžāĻĨā§ āϏā§āϰā§āϏ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āύ BPF_PSEUDO_MAP_FD, āĻāĻŦāĻ āĻāĻŽāĻžāĻĻā§āϰ āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰā§āϰ āĻĒā§āϰāĻĨāĻŽ IMM āĻāĻŦāĻ, āϝāĻĻāĻŋ āĻāĻāĻŋ āϏāĻŽāĻžāύ āĻšāϝāĻŧ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, 0xdeadbeef, āϤāĻžāĻšāϞ⧠āĻĢāϞāϏā§āĻŦāϰā§āĻĒ āĻāĻŽāϰāĻž āύāĻŋāϰā§āĻĻā§āĻļ āĻĒāĻžāĻŦ
18 11 00 00 ef eb ad de 00 00 00 00 00 00 00 00 r1 = 0 llāĻāĻāĻāĻžāĻŦā§ āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āϤāĻĨā§āϝ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϞā§āĻĄā§āĻĄ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āϏā§āĻĨāĻžāύāĻžāύā§āϤāϰāĻŋāϤ āĻšāϝāĻŧāĨ¤ āĻāĻ āĻā§āώā§āϤā§āϰā§, āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϤā§āϰāĻŋ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠BPF_MAP_CREATE, āĻāĻŦāĻ āĻāĻāĻĄāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻā§āϞāĻž BPF_MAP_GET_FD_BY_ID.
āĻŽā§āĻ, āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ libbpf āĻ
ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽ āύāĻŋāĻŽā§āύāϰā§āĻĒ:
- āϏāĻāĻāϞāύā§āϰ āϏāĻŽāϝāĻŧ, āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āϞāĻŋāĻā§āĻāĻā§āϞāĻŋāϰ āĻāύā§āϝ āϰā§āĻāϰā§āĻĄāĻā§āϞāĻŋ āϏā§āĻĨāĻžāύāĻžāύā§āϤāϰ āĻā§āĻŦāĻŋāϞ⧠āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧ
libbpfELF āĻ āĻŦāĻā§āĻā§āĻ āĻŦā§āĻ āĻā§āϞā§, āϏāĻŽāϏā§āϤ āĻŦā§āϝāĻŦāĻšā§āϤ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻā§āĻāĻā§ āĻĒāĻžāϝāĻŧ āĻāĻŦāĻ āϤāĻžāĻĻā§āϰ āĻāύā§āϝ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠āϤā§āϰāĻŋ āĻāϰā§- āύāĻŋāϰā§āĻĻā§āĻļā§āϰ āĻ
āĻāĻļ āĻšāĻŋāϏāĻžāĻŦā§ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰā§āĻā§āϞāĻŋ āĻāĻžāϰā§āύā§āϞ⧠āϞā§āĻĄ āĻāϰāĻž āĻšāϝāĻŧ
LD64
āĻāĻĒāύāĻŋ āϝā§āĻŽāύ āĻāϞā§āĻĒāύāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āĻāϰāĻ āĻ
āύā§āĻ āĻāĻŋāĻā§ āĻāϏāϤ⧠āĻšāĻŦā§ āĻāĻŦāĻ āĻāĻŽāĻžāĻĻā§āϰ āĻŽā§āϞ āĻĻāĻŋāĻā§ āϤāĻžāĻāĻžāϤ⧠āĻšāĻŦā§āĨ¤ āϏā§āĻāĻžāĻā§āϝāĻŦāĻļāϤ, āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āĻāĻāĻāĻŋ āϏā§āϤā§āϰ āĻāĻā§ - āĻāĻŽāϰāĻž āĻ
āϰā§āĻĨ āϞāĻŋāĻā§ āϰā§āĻā§āĻāĻŋ BPF_PSEUDO_MAP_FD āϏā§āϰā§āϏ āϰā§āĻāĻŋāϏā§āĻāĻžāϰ⧠āĻāĻŦāĻ āĻāĻŽāϰāĻž āĻāĻāĻŋ āĻĻāĻžāĻĢāύ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ, āϝāĻž āĻāĻŽāĻžāĻĻā§āϰ āϏāĻŽāϏā§āϤ āϏāĻžāϧā§āĻĻā§āϰ āĻĒāĻŦāĻŋāϤā§āϰāϤāĻžāϰ āĻĻāĻŋāĻā§ āύāĻŋāϝāĻŧā§ āϝāĻžāĻŦā§ - kernel/bpf/verifier.c, āϝā§āĻāĻžāύ⧠āĻāĻāĻāĻŋ āϏā§āĻŦāϤāύā§āϤā§āϰ āύāĻžāĻŽā§āϰ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰā§āĻā§ āĻāĻžāĻāĻĒā§āϰ āĻāĻžāĻ āĻžāĻŽā§āϰ āĻ āĻŋāĻāĻžāύāĻž āĻĻāĻŋāϝāĻŧā§ āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āĻāϰ⧠struct bpf_map:
static int replace_map_fd_with_map_ptr(struct bpf_verifier_env *env) {
...
f = fdget(insn[0].imm);
map = __bpf_map_get(f);
if (insn->src_reg == BPF_PSEUDO_MAP_FD) {
addr = (unsigned long)map;
}
insn[0].imm = (u32)addr;
insn[1].imm = addr >> 32;(āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻā§āĻĄ āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāĻŦā§ ) āϤāĻžāĻ āĻāĻŽāϰāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ:
- āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āϞā§āĻĄ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āϝāĻžāĻāĻžāĻāĻāĻžāϰ⧠āĻŽāĻžāύāĻāĻŋāϤā§āϰā§āϰ āϏāĻ āĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻĒāϰā§āĻā§āώāĻž āĻāϰ⧠āĻāĻŦāĻ āϏāĻāĻļā§āϞāĻŋāώā§āĻ āĻāĻžāĻ āĻžāĻŽā§āϰ āĻ āĻŋāĻāĻžāύāĻž āϞāĻŋāĻā§
struct bpf_map
ELF āĻŦāĻžāĻāύāĻžāϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ libbpf āĻāϰāĻ āĻ
āύā§āĻ āĻāĻŋāĻā§ āĻāϞāĻā§, āϤāĻŦā§ āĻāĻŽāϰāĻž āĻ
āύā§āϝāĻžāύā§āϝ āύāĻŋāĻŦāύā§āϧ⧠āĻāĻāĻŋ āύāĻŋāϝāĻŧā§ āĻāϞā§āĻāύāĻž āĻāϰāĻŦāĨ¤
libbpf āĻāĻžāĻĄāĻŧāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻŦāĻ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āϞā§āĻĄ āĻšāĻā§āĻā§
āĻĒā§āϰāϤāĻŋāĻļā§āϰā§āϤāĻŋ āĻ
āύā§āϏāĻžāϰā§, āĻāĻāĻžāύ⧠āĻĒāĻžāĻ āĻāĻĻā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāϰāĻŖ āϰāϝāĻŧā§āĻā§ āϝāĻžāϰāĻž āϏāĻžāĻšāĻžāϝā§āϝ āĻāĻžāĻĄāĻŧāĻžāĻ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŽāύ āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻā§āĻāĻžāĻŦā§ āϤā§āϰāĻŋ āĻāĻŦāĻ āϞā§āĻĄ āĻāϰāϤ⧠āĻāĻžāύ āϤāĻž āĻāĻžāύāϤ⧠āĻāĻžāύāĨ¤ libbpf. āĻāĻāĻŋ āĻāĻĒāϝā§āĻā§ āĻšāϤ⧠āĻĒāĻžāϰ⧠āϝāĻāύ āĻāĻĒāύāĻŋ āĻāĻŽāύ āĻāĻāĻāĻŋ āĻĒāϰāĻŋāĻŦā§āĻļā§ āĻāĻžāĻ āĻāϰāĻā§āύ āϝāĻžāϰ āĻāύā§āϝ āĻāĻĒāύāĻŋ āύāĻŋāϰā§āĻāϰāϤāĻž āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ āύāĻž, āĻŦāĻž āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻŦāĻŋāĻ āϏāĻāϰāĻā§āώāĻŖ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ āύāĻž, āĻŦāĻž āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞāĻŋāĻāϤ⧠āĻĒāĻžāϰāĻŦā§āύ , āϝāĻž āĻĢā§āϞāĻžāĻāϤ⧠BPF āĻŦāĻžāĻāύāĻžāϰāĻŋ āĻā§āĻĄ āϤā§āϰāĻŋ āĻāϰā§āĨ¤
āϝā§āĻā§āϤāĻŋ āĻ
āύā§āϏāϰāĻŖ āĻāϰāĻž āϏāĻšāĻ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻŽāϰāĻž āĻāĻ āĻāĻĻā§āĻĻā§āĻļā§āϝ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāĻĻāĻžāĻšāϰāĻŖāĻāĻŋ āĻāĻŦāĻžāϰ āϞāĻŋāĻāĻŦ xdp-simple. āĻāĻ āĻāĻĻāĻžāĻšāϰāĻŖā§ āĻāϞā§āĻāĻŋāϤ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāϰ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻāĻŦāĻ āϏāĻžāĻŽāĻžāύā§āϝ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻā§āĻĄ āĻāϤ⧠āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāĻŦā§ .
āĻāĻŽāĻžāĻĻā§āϰ āĻāĻŦā§āĻĻāύā§āϰ āϝā§āĻā§āϤāĻŋ āύāĻŋāĻŽā§āύāϰā§āĻĒ:
- āĻāĻāĻāĻŋ āĻāĻžāĻāĻĒ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āϤā§āϰāĻŋ āĻāϰā§āύ
BPF_MAP_TYPE_ARRAYāĻāĻŽāĻžāύā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§BPF_MAP_CREATE, - āĻāĻ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŽāύ āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϤā§āϰāĻŋ āĻāϰā§āύ,
- āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋāĻā§ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ āĻāϰā§āύ
lo,
āϝāĻž āĻŽāĻžāύā§āώā§āϰ āĻŽāϧā§āϝ⧠āĻ āύā§āĻŦāĻžāĻĻ āĻāϰā§
int main(void)
{
int map_fd, prog_fd;
map_fd = map_create();
if (map_fd < 0)
err(1, "bpf: BPF_MAP_CREATE");
prog_fd = prog_load(map_fd);
if (prog_fd < 0)
err(1, "bpf: BPF_PROG_LOAD");
xdp_attach(1, prog_fd);
}āĻāĻāĻž āĻšāϞ map_create āĻāĻŽāϰāĻž āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻĒā§āϰāĻĨāĻŽ āĻāĻĻāĻžāĻšāϰāĻŖā§ āϝā§āĻŽāύ āĻāϰā§āĻāĻŋāϞāĻžāĻŽ āĻāĻāĻāĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āϤā§āϰāĻŋ āĻāϰ⧠bpf - âāĻāĻžāϰāύā§āϞ, āĻĻāϝāĻŧāĻž āĻāϰ⧠āĻāĻŽāĻžāĻā§ 8āĻāĻŋ āĻāĻĒāĻžāĻĻāĻžāύā§āϰ āĻ
ā§āϝāĻžāϰā§āϰ āĻāĻāĻžāϰ⧠āĻāĻāĻāĻŋ āύāϤā§āύ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āϤā§āϰāĻŋ āĻāϰā§āύ __u64 āĻāĻŦāĻ āĻāĻŽāĻžāĻā§ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠āĻĢāĻŋāϰāĻŋāϝāĻŧā§ āĻĻāĻŋāύ":
static int map_create()
{
union bpf_attr attr;
memset(&attr, 0, sizeof(attr));
attr.map_type = BPF_MAP_TYPE_ARRAY,
attr.key_size = sizeof(__u32),
attr.value_size = sizeof(__u64),
attr.max_entries = 8,
strncpy(attr.map_name, "woo", sizeof(attr.map_name));
return syscall(__NR_bpf, BPF_MAP_CREATE, &attr, sizeof(attr));
}āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āϞā§āĻĄ āĻāϰāĻžāĻ āϏāĻšāĻ:
static int prog_load(int map_fd)
{
union bpf_attr attr;
struct bpf_insn insns[] = {
...
};
memset(&attr, 0, sizeof(attr));
attr.prog_type = BPF_PROG_TYPE_XDP;
attr.insns = ptr_to_u64(insns);
attr.insn_cnt = sizeof(insns)/sizeof(insns[0]);
attr.license = ptr_to_u64("GPL");
strncpy(attr.prog_name, "woo", sizeof(attr.prog_name));
return syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
}āĻāϤā§āϰ āĻ
āĻāĻļ prog_load āĻāĻžāĻ āĻžāĻŽā§āϰ āĻāĻāĻāĻŋ āĻ
ā§āϝāĻžāϰ⧠āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŽāĻžāĻĻā§āϰ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āϏāĻāĻā§āĻāĻž struct bpf_insn insns[]. āĻāĻŋāύā§āϤ⧠āϝā§āĻšā§āϤ⧠āĻāĻŽāϰāĻž āϏāĻŋ-āϤ⧠āĻĨāĻžāĻāĻž āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻāĻŋ, āϤāĻžāĻ āĻāĻŽāϰāĻž āĻāĻāĻā§ āĻĒā§āϰāϤāĻžāϰāĻŖāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ:
$ llvm-objdump -D --section xdp/simple xdp-simple.bpf.o
0000000000000000 <simple>:
0: 85 00 00 00 08 00 00 00 call 8
1: 63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0
2: bf a2 00 00 00 00 00 00 r2 = r10
3: 07 02 00 00 fc ff ff ff r2 += -4
4: 18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll
6: 85 00 00 00 01 00 00 00 call 1
7: b7 01 00 00 00 00 00 00 r1 = 0
8: 15 00 04 00 00 00 00 00 if r0 == 0 goto +4 <LBB0_2>
9: 61 01 00 00 00 00 00 00 r1 = *(u32 *)(r0 + 0)
10: 07 01 00 00 01 00 00 00 r1 += 1
11: 63 10 00 00 00 00 00 00 *(u32 *)(r0 + 0) = r1
12: b7 01 00 00 02 00 00 00 r1 = 2
0000000000000068 <LBB0_2>:
13: bf 10 00 00 00 00 00 00 r0 = r1
14: 95 00 00 00 00 00 00 00 exitāĻŽā§āĻ, āĻāĻŽāĻžāĻĻā§āϰ 14āĻāĻŋ āύāĻŋāϰā§āĻĻā§āĻļāύāĻž āϞāĻŋāĻāϤ⧠āĻšāĻŦā§ āĻāĻžāĻ āĻžāĻŽā§āϰ āĻāĻāĻžāϰ⧠struct bpf_insn (āĻĒāϰāĻžāĻŽāϰā§āĻļ: āĻāĻĒāϰ⧠āĻĨā§āĻā§ āĻĄāĻžāĻŽā§āĻĒ āύāĻŋāύ, āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āĻŦāĻŋāĻāĻžāĻāĻāĻŋ āĻĒā§āύāϰāĻžāϝāĻŧ āĻĒāĻĄāĻŧā§āύ, āĻā§āϞā§āύ и āĻāĻŦāĻ āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰā§āύ struct bpf_insn insns[] āĻĒā§āϰāϤā§āϝā§āĻā§āϰ āύāĻŋāĻā§āϰ āĻāĻĒāϰ):
struct bpf_insn insns[] = {
/* 85 00 00 00 08 00 00 00 call 8 */
{
.code = BPF_JMP | BPF_CALL,
.imm = 8,
},
/* 63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0 */
{
.code = BPF_MEM | BPF_STX,
.off = -4,
.src_reg = BPF_REG_0,
.dst_reg = BPF_REG_10,
},
/* bf a2 00 00 00 00 00 00 r2 = r10 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_X,
.src_reg = BPF_REG_10,
.dst_reg = BPF_REG_2,
},
/* 07 02 00 00 fc ff ff ff r2 += -4 */
{
.code = BPF_ALU64 | BPF_ADD | BPF_K,
.dst_reg = BPF_REG_2,
.imm = -4,
},
/* 18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll */
{
.code = BPF_LD | BPF_DW | BPF_IMM,
.src_reg = BPF_PSEUDO_MAP_FD,
.dst_reg = BPF_REG_1,
.imm = map_fd,
},
{ }, /* placeholder */
/* 85 00 00 00 01 00 00 00 call 1 */
{
.code = BPF_JMP | BPF_CALL,
.imm = 1,
},
/* b7 01 00 00 00 00 00 00 r1 = 0 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_K,
.dst_reg = BPF_REG_1,
.imm = 0,
},
/* 15 00 04 00 00 00 00 00 if r0 == 0 goto +4 <LBB0_2> */
{
.code = BPF_JMP | BPF_JEQ | BPF_K,
.off = 4,
.src_reg = BPF_REG_0,
.imm = 0,
},
/* 61 01 00 00 00 00 00 00 r1 = *(u32 *)(r0 + 0) */
{
.code = BPF_MEM | BPF_LDX,
.off = 0,
.src_reg = BPF_REG_0,
.dst_reg = BPF_REG_1,
},
/* 07 01 00 00 01 00 00 00 r1 += 1 */
{
.code = BPF_ALU64 | BPF_ADD | BPF_K,
.dst_reg = BPF_REG_1,
.imm = 1,
},
/* 63 10 00 00 00 00 00 00 *(u32 *)(r0 + 0) = r1 */
{
.code = BPF_MEM | BPF_STX,
.src_reg = BPF_REG_1,
.dst_reg = BPF_REG_0,
},
/* b7 01 00 00 02 00 00 00 r1 = 2 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_K,
.dst_reg = BPF_REG_1,
.imm = 2,
},
/* <LBB0_2>: bf 10 00 00 00 00 00 00 r0 = r1 */
{
.code = BPF_ALU64 | BPF_MOV | BPF_X,
.src_reg = BPF_REG_1,
.dst_reg = BPF_REG_0,
},
/* 95 00 00 00 00 00 00 00 exit */
{
.code = BPF_JMP | BPF_EXIT
},
};āϝāĻžāϰāĻž āύāĻŋāĻā§āϰāĻž āĻāĻāĻŋ āϞā§āĻā§āύāύāĻŋ āϤāĻžāĻĻā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻ
āύā§āĻļā§āϞāύ - āĻā§āĻāĻā§āύ map_fd.
āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āĻāϰāĻ āĻāĻāĻāĻŋ āĻ
āĻĒā§āϰāĻāĻžāĻļāĻŋāϤ āĻ
āĻāĻļ āĻŦāĻžāĻāĻŋ āĻāĻā§ - xdp_attach. āĻĻā§āϰā§āĻāĻžāĻā§āϝāĻŦāĻļāϤ, XDP-āĻāϰ āĻŽāϤ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻāĻāĻŋ āϏāĻŋāϏā§āĻā§āĻŽ āĻāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻāϝā§āĻā§āϤ āĻāϰāĻž āϝāĻžāĻŦā§ āύāĻž bpf. āϝ⧠āϞā§āĻā§āϰāĻž BPF āĻāĻŦāĻ XDP āϤā§āϰāĻŋ āĻāϰā§āĻāĻŋāϞ āϤāĻžāϰāĻž āĻ
āύāϞāĻžāĻāύ āϞāĻŋāύāĻžāĻā§āϏ āϏāĻŽā§āĻĒā§āϰāĻĻāĻžāϝāĻŧā§āϰ āĻāĻŋāϞ, āϝāĻžāϰ āĻŽāĻžāύ⧠āϤāĻžāϰāĻž āϤāĻžāĻĻā§āϰ āϏāĻŦāĻā§āϝāĻŧā§ āĻĒāϰāĻŋāĻāĻŋāϤ āĻāĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĻāĻŋāϞ (āĻāĻŋāύā§āϤ⧠āύāĻž āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻŽāĻžāύā§āώ) āĻāĻžāϰā§āύā§āϞā§āϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāύā§āĻāĻžāϰāĻĢā§āϏ: , āĻāϰ⧠āĻĻā§āĻā§āύ . āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύā§āϰ āϏāĻŦāĻā§āϝāĻŧā§ āϏāĻšāĻ āĻāĻĒāĻžāϝāĻŧ xdp_attach āĻĨā§āĻā§ āĻā§āĻĄ āĻ
āύā§āϞāĻŋāĻĒāĻŋ āĻāϰāĻž āĻšāϝāĻŧ libbpf, āϝāĻĨāĻž, āĻĢāĻžāĻāϞ āĻĨā§āĻā§ , āϝāĻž āĻāĻŽāϰāĻž āĻāϰā§āĻāĻŋ, āĻāĻāĻā§ āϏāĻāĻā§āώāĻŋāĻĒā§āϤ āĻāϰāĻāĻŋ:
āύā§āĻāϞāĻŋāĻāĻ āϏāĻā§āĻā§āϰ āĻāĻāϤ⧠āϏā§āĻŦāĻžāĻāϤāĻŽ
āĻāĻāĻāĻŋ āύā§āĻāϞāĻŋāĻāĻ āϏāĻā§āĻ āĻāĻžāĻāĻĒ āĻā§āϞā§āύ NETLINK_ROUTE:
int netlink_open(__u32 *nl_pid)
{
struct sockaddr_nl sa;
socklen_t addrlen;
int one = 1, ret;
int sock;
memset(&sa, 0, sizeof(sa));
sa.nl_family = AF_NETLINK;
sock = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (sock < 0)
err(1, "socket");
if (setsockopt(sock, SOL_NETLINK, NETLINK_EXT_ACK, &one, sizeof(one)) < 0)
warnx("netlink error reporting not supported");
if (bind(sock, (struct sockaddr *)&sa, sizeof(sa)) < 0)
err(1, "bind");
addrlen = sizeof(sa);
if (getsockname(sock, (struct sockaddr *)&sa, &addrlen) < 0)
err(1, "getsockname");
*nl_pid = sa.nl_pid;
return sock;
}āĻāĻŽāϰāĻž āĻāĻ āϏāĻā§āĻ āĻĨā§āĻā§ āĻĒāĻĄāĻŧāĻŋ:
static int bpf_netlink_recv(int sock, __u32 nl_pid, int seq)
{
bool multipart = true;
struct nlmsgerr *errm;
struct nlmsghdr *nh;
char buf[4096];
int len, ret;
while (multipart) {
multipart = false;
len = recv(sock, buf, sizeof(buf), 0);
if (len < 0)
err(1, "recv");
if (len == 0)
break;
for (nh = (struct nlmsghdr *)buf; NLMSG_OK(nh, len);
nh = NLMSG_NEXT(nh, len)) {
if (nh->nlmsg_pid != nl_pid)
errx(1, "wrong pid");
if (nh->nlmsg_seq != seq)
errx(1, "INVSEQ");
if (nh->nlmsg_flags & NLM_F_MULTI)
multipart = true;
switch (nh->nlmsg_type) {
case NLMSG_ERROR:
errm = (struct nlmsgerr *)NLMSG_DATA(nh);
if (!errm->error)
continue;
ret = errm->error;
// libbpf_nla_dump_errormsg(nh); too many code to copy...
goto done;
case NLMSG_DONE:
return 0;
default:
break;
}
}
}
ret = 0;
done:
return ret;
}āĻ āĻŦāĻļā§āώā§, āĻāĻāĻžāύ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĢāĻžāĻāĻļāύ āϝāĻž āĻāĻāĻāĻŋ āϏāĻā§āĻ āĻā§āϞ⧠āĻāĻŦāĻ āĻāĻāĻŋāϤ⧠āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ āĻŦāϰā§āĻŖāύāĻžāĻāĻžāϰ⧠āϏāĻš āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āώ āĻŦāĻžāϰā§āϤāĻž āĻĒāĻžāĻ āĻžāϝāĻŧ:
static int xdp_attach(int ifindex, int prog_fd)
{
int sock, seq = 0, ret;
struct nlattr *nla, *nla_xdp;
struct {
struct nlmsghdr nh;
struct ifinfomsg ifinfo;
char attrbuf[64];
} req;
__u32 nl_pid = 0;
sock = netlink_open(&nl_pid);
if (sock < 0)
return sock;
memset(&req, 0, sizeof(req));
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
req.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK;
req.nh.nlmsg_type = RTM_SETLINK;
req.nh.nlmsg_pid = 0;
req.nh.nlmsg_seq = ++seq;
req.ifinfo.ifi_family = AF_UNSPEC;
req.ifinfo.ifi_index = ifindex;
/* started nested attribute for XDP */
nla = (struct nlattr *)(((char *)&req)
+ NLMSG_ALIGN(req.nh.nlmsg_len));
nla->nla_type = NLA_F_NESTED | IFLA_XDP;
nla->nla_len = NLA_HDRLEN;
/* add XDP fd */
nla_xdp = (struct nlattr *)((char *)nla + nla->nla_len);
nla_xdp->nla_type = IFLA_XDP_FD;
nla_xdp->nla_len = NLA_HDRLEN + sizeof(int);
memcpy((char *)nla_xdp + NLA_HDRLEN, &prog_fd, sizeof(prog_fd));
nla->nla_len += nla_xdp->nla_len;
/* if user passed in any flags, add those too */
__u32 flags = XDP_FLAGS_SKB_MODE;
nla_xdp = (struct nlattr *)((char *)nla + nla->nla_len);
nla_xdp->nla_type = IFLA_XDP_FLAGS;
nla_xdp->nla_len = NLA_HDRLEN + sizeof(flags);
memcpy((char *)nla_xdp + NLA_HDRLEN, &flags, sizeof(flags));
nla->nla_len += nla_xdp->nla_len;
req.nh.nlmsg_len += NLA_ALIGN(nla->nla_len);
if (send(sock, &req, req.nh.nlmsg_len, 0) < 0)
err(1, "send");
ret = bpf_netlink_recv(sock, nl_pid, seq);
cleanup:
close(sock);
return ret;
}āϏā§āϤāϰāĻžāĻ, āϏāĻŦāĻāĻŋāĻā§ āĻĒāϰā§āĻā§āώāĻžāϰ āĻāύā§āϝ āĻĒā§āϰāϏā§āϤā§āϤ:
$ cc nolibbpf.c -o nolibbpf
$ sudo strace -e bpf ./nolibbpf
bpf(BPF_MAP_CREATE, {map_type=BPF_MAP_TYPE_ARRAY, map_name="woo", ...}, 72) = 3
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, insn_cnt=15, prog_name="woo", ...}, 72) = 4
+++ exited with 0 +++āĻĻā§āĻāĻž āϝāĻžāĻ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāϰ āϏāĻžāĻĨā§ āϏāĻāϝā§āĻā§āϤ āĻšāϝāĻŧā§āĻā§ āĻāĻŋāύāĻž lo:
$ ip l show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 160āĻāϏā§āύ āĻĒāĻŋāĻāϏ āĻĒāĻžāĻ āĻžāĻ āĻāĻŦāĻ āĻŽāĻžāύāĻāĻŋāϤā§āϰāĻāĻŋ āĻĻā§āĻāĻŋ:
$ for s in `seq 234`; do sudo ping -f -c 100 127.0.0.1 >/dev/null 2>&1; done
$ sudo bpftool m dump name woo
key: 00 00 00 00 value: 90 01 00 00 00 00 00 00
key: 01 00 00 00 value: 00 00 00 00 00 00 00 00
key: 02 00 00 00 value: 00 00 00 00 00 00 00 00
key: 03 00 00 00 value: 00 00 00 00 00 00 00 00
key: 04 00 00 00 value: 00 00 00 00 00 00 00 00
key: 05 00 00 00 value: 00 00 00 00 00 00 00 00
key: 06 00 00 00 value: 40 b5 00 00 00 00 00 00
key: 07 00 00 00 value: 00 00 00 00 00 00 00 00
Found 8 elementsāĻšā§āϰāϰā§, āϏāĻŦāĻāĻŋāĻā§ āĻāĻžāĻ āĻāϰā§āĨ¤ āĻāϞā§āϞā§āĻā§āϝ, āĻāĻĒāĻžāϝāĻŧ āĻĻā§āĻŦāĻžāϰāĻž, āĻāĻŽāĻžāĻĻā§āϰ āĻŽāĻžāύāĻāĻŋāϤā§āϰ āĻāĻŦāĻžāϰ āĻŦāĻžāĻāĻ āĻāĻāĻžāϰ⧠āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻšāϝāĻŧ. āĻāĻ āϝ⧠āĻāĻžāϰāĻŖā§, āĻ
āϏāĻĻā§āĻļ libbpf āĻāĻŽāϰāĻž āĻāĻžāĻāĻĒ āϤāĻĨā§āϝ (BTF) āϞā§āĻĄ āĻāϰāĻŋāύāĻŋāĨ¤ āĻāĻŋāύā§āϤ⧠āĻāĻŽāϰāĻž āĻĒāϰā§āϰ āĻŦāĻžāϰ āĻāĻ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāϰ⧠āĻāĻĨāĻž āĻŦāϞāϤ⧠āĻšāĻŦā§.
āĻĄā§āĻā§āϞāĻĒāĻŽā§āύā§āĻ āĻā§āϞāϏ
āĻāĻ āĻŦāĻŋāĻāĻžāĻā§, āĻāĻŽāϰāĻž āύā§āϝā§āύāϤāĻŽ BPF āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰ⧠āĻā§āϞāĻāĻŋāĻāĻāĻŋ āĻĻā§āĻāĻŦāĨ¤
āϏāĻžāϧāĻžāϰāĻŖāĻāĻžāĻŦā§ āĻŦāϞāϤ⧠āĻā§āϞā§, BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻŦāĻŋāĻāĻžāĻļ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻĒāύāĻžāϰ āĻŦāĻŋāĻļā§āώ āĻāĻŋāĻā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āύā§āĻ - BPF āϝā§āĻā§āύ āĻļāĻžāϞā§āύ āĻŦāĻŋāϤāϰāĻŖ āĻāĻžāϰā§āύā§āϞ⧠āĻāϞ⧠āĻāĻŦāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧ clang, āϝāĻž āĻĒā§āϝāĻžāĻā§āĻ āĻĨā§āĻā§ āϏāϰāĻŦāϰāĻžāĻš āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āϝāĻžāĻāĻšā§āĻ, āϝ⧠āĻāĻžāϰāĻŖā§ BPF āĻŦāĻŋāĻāĻžāĻļā§āϰ āĻ
āϧā§āύ⧠āϰāϝāĻŧā§āĻā§, āĻāĻžāϰā§āύā§āϞ āĻāĻŦāĻ āϏāϰāĻā§āĻāĻžāĻŽāĻā§āϞāĻŋ āĻā§āϰāĻŽāĻžāĻāϤ āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻšāĻā§āĻā§, āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ 2019 āĻĨā§āĻā§ āĻĒā§āϰāĻžāύ⧠āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞāĻŋāĻāϤ⧠āύāĻž āĻāĻžāύ, āϤāĻžāĻšāϞ⧠āĻāĻĒāύāĻžāĻā§ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤
llvm/clangpahole- āĻāϰ āĻŽā§āϞ
bpftool
(āϰā§āĻĢāĻžāϰā§āύā§āϏā§āϰ āĻāύā§āϝ, āĻāĻ āĻŦāĻŋāĻāĻžāĻāĻāĻŋ āĻāĻŦāĻ āύāĻŋāĻŦāύā§āϧā§āϰ āϏāĻŽāϏā§āϤ āĻāĻĻāĻžāĻšāϰāĻŖ āĻĄā§āĻŦāĻŋāϝāĻŧāĻžāύ 10 āĻ āĻāĻžāϞāĻŋāϤ āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤)
llvm/clang
BPF LLVM-āĻāϰ āϏāĻžāĻĨā§ āĻŦāύā§āϧā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻāĻŦāĻ, āϝāĻĻāĻŋāĻ āϏāĻŽā§āĻĒā§āϰāϤāĻŋ BPF-āĻāϰ āĻāύā§āϝ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ gcc āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻāĻāϞāύ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§, āϏāĻŽāϏā§āϤ āĻŦāϰā§āϤāĻŽāĻžāύ āĻŦāĻŋāĻāĻžāĻļ LLVM-āĻāϰ āĻāύā§āϝ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻ
āϤāĻāĻŦ, āĻĒā§āϰāĻĨāĻŽāϤ, āĻāĻŽāϰāĻž āĻŦāϰā§āϤāĻŽāĻžāύ āϏāĻāϏā§āĻāϰāĻŖāĻāĻŋ āϤā§āϰāĻŋ āĻāϰāĻŦ clang āĻāĻŋāĻ āĻĨā§āĻā§:
$ sudo apt install ninja-build
$ git clone --depth 1 https://github.com/llvm/llvm-project.git
$ mkdir -p llvm-project/llvm/build/install
$ cd llvm-project/llvm/build
$ cmake .. -G "Ninja" -DLLVM_TARGETS_TO_BUILD="BPF;X86"
-DLLVM_ENABLE_PROJECTS="clang"
-DBUILD_SHARED_LIBS=OFF
-DCMAKE_BUILD_TYPE=Release
-DLLVM_BUILD_RUNTIME=OFF
$ time ninja
... ĐŧĐŊĐžĐŗĐž вŅĐĩĐŧĐĩĐŊи ŅĐŋŅŅŅŅ
$āĻāĻāύ āĻāĻŽāϰāĻž āϏāĻŦāĻāĻŋāĻā§ āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āĻāĻāϤā§āϰāĻŋāϤ āĻšāϝāĻŧā§āĻā§ āĻāĻŋāύāĻž āϤāĻž āĻĒāϰā§āĻā§āώāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ:
$ ./bin/llc --version
LLVM (http://llvm.org/):
LLVM version 11.0.0git
Optimized build.
Default target: x86_64-unknown-linux-gnu
Host CPU: znver1
Registered Targets:
bpf - BPF (host endian)
bpfeb - BPF (big endian)
bpfel - BPF (little endian)
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64(āϏāĻŽāĻžāĻŦā§āĻļā§āϰ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠clang āĻāĻŽāĻžāϰ āĻāĻžāĻ āĻĨā§āĻā§ āύā§āĻāϝāĻŧāĻž .)
āĻāĻŽāϰāĻž āĻāĻāĻŽāĻžāϤā§āϰ āϤā§āϰāĻŋ āĻāϰāĻž āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻāύā§āϏāĻāϞ āĻāϰāĻŦ āύāĻž, āĻŦāϰāĻ āϏā§āĻā§āϞāĻŋāĻā§ āϝā§āĻā§āϤ āĻāϰāĻŦ PATHāĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ,
export PATH="`pwd`/bin:$PATH"(āĻāĻāĻŋ āϝā§āĻ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠.bashrc āĻ
āĻĨāĻŦāĻž āĻāĻāĻāĻŋ āĻĒā§āĻĨāĻ āĻĢāĻžāĻāϞā§āĨ¤ āĻŦā§āϝāĻā§āϤāĻŋāĻāϤāĻāĻžāĻŦā§, āĻāĻŽāĻŋ āĻāĻ āĻŽāϤ āĻāĻŋāύāĻŋāϏ āϝā§āĻ ~/bin/activate-llvm.sh āĻāĻŦāĻ āϝāĻāύ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻāĻŽāĻŋ āϤāĻž āĻāϰāĻŋ . activate-llvm.sh.)
Pahole āĻāĻŦāĻ BTF
āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋ pahole āĻŦāĻŋāĻāĻŋāĻāĻĢ āĻĢāϰāĻŽā§āϝāĻžāĻā§ āĻĄāĻŋāĻŦāĻžāĻāĻŋāĻ āϤāĻĨā§āϝ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻāĻžāϰā§āύā§āϞ āϤā§āϰāĻŋ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāϝāĻŧāĨ¤ āĻāĻŽāϰāĻž āĻāĻ āύāĻŋāĻŦāύā§āϧ⧠āĻŦāĻŋāĻāĻŋāĻāĻĢ āĻĒā§āϰāϝā§āĻā§āϤāĻŋāϰ āĻŦāĻŋāĻļāĻĻ āĻŦāĻŋāĻŦāϰāĻŖā§ āϝāĻžāĻŦ āύāĻž, āĻāĻāĻŋ āϝ⧠āϏā§āĻŦāĻŋāϧāĻžāĻāύāĻ āĻāĻŦāĻ āĻāĻŽāϰāĻž āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻāĻžāĻ āϤāĻž āĻāĻžāĻĄāĻŧāĻžāĨ¤ āϏā§āϤāϰāĻžāĻ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻžāϰā§āύā§āϞ āϤā§āϰāĻŋ āĻāϰāϤ⧠āϝāĻžāĻā§āĻā§āύ, āĻĒā§āϰāĻĨāĻŽā§ āϤā§āϰāĻŋ āĻāϰā§āύ pahole (āĻāĻžāĻĄāĻŧāĻž pahole āĻāĻĒāύāĻŋ āĻŦāĻŋāĻāϞā§āĻĒāĻāĻŋ āĻĻāĻŋāϝāĻŧā§ āĻāĻžāϰā§āύā§āϞ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ āύāĻž CONFIG_DEBUG_INFO_BTF:
$ git clone https://git.kernel.org/pub/scm/devel/pahole/pahole.git
$ cd pahole/
$ sudo apt install cmake
$ mkdir build
$ cd build/
$ cmake -D__LIB=lib ..
$ make
$ sudo make install
$ which pahole
/usr/local/bin/paholeBPF āύāĻŋāϝāĻŧā§ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻžāϰā§āύā§āϞ
BPF āĻāϰ āϏāĻŽā§āĻāĻžāĻŦāύāĻžāĻā§āϞāĻŋ āĻ āύā§āĻŦā§āώāĻŖ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāĻŽāĻŋ āĻāĻŽāĻžāϰ āύāĻŋāĻāϏā§āĻŦ āĻŽā§āϞ āĻāĻāϤā§āϰ āĻāϰāϤ⧠āĻāĻžāĻāĨ¤ āϏāĻžāϧāĻžāϰāĻŖāĻāĻžāĻŦā§ āĻŦāϞāϤ⧠āĻā§āϞā§, āĻāĻāĻŋ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āύāϝāĻŧ, āϝā§āĻšā§āϤ⧠āĻāĻĒāύāĻŋ āĻĄāĻŋāϏā§āĻā§āϰāĻŋāĻŦāĻŋāĻāĻļāύ āĻāĻžāϰā§āύā§āϞ⧠BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāĻŦāĻ āϞā§āĻĄ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻšāĻŦā§āύ, āϤāĻŦā§, āĻāĻĒāύāĻžāϰ āύāĻŋāĻāϏā§āĻŦ āĻāĻžāϰā§āύā§āϞ āĻĨāĻžāĻāϞ⧠āĻāĻĒāύāĻŋ āϏāϰā§āĻŦāĻļā§āώ BPF āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§āύ, āϝāĻž āĻāĻĒāύāĻžāϰ āĻŦāĻŋāϤāϰāĻŖā§ āĻŽāĻžāϏā§āϰ āĻŽāϧā§āϝ⧠āϏāϰā§āĻŦā§āϤā§āϤāĻŽāĻāĻžāĻŦā§ āĻĒā§āϰāĻĻāϰā§āĻļāĻŋāϤ āĻšāĻŦā§āĨ¤ , āĻ āĻĨāĻŦāĻž, āĻāĻŋāĻā§ āĻĄāĻŋāĻŦāĻžāĻāĻŋāĻ āĻā§āϞā§āϰ āĻā§āώā§āϤā§āϰ⧠āĻ āĻĻā§āϰ āĻāĻŦāĻŋāώā§āϝāϤ⧠āĻĒā§āϝāĻžāĻā§āĻ āĻāϰāĻž āĻšāĻŦā§ āύāĻžāĨ¤ āĻāĻāĻžāĻĄāĻŧāĻžāĻ, āĻāϰ āύāĻŋāĻāϏā§āĻŦ āĻŽā§āϞ āĻā§āĻĄā§āϰ āϏāĻžāĻĨā§ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻž āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻŽāύ⧠āĻāϰā§āĨ¤
āĻāĻāĻāĻŋ āĻāĻžāϰā§āύā§āϞ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻāĻĒāύāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ, āĻĒā§āϰāĻĨāĻŽāϤ, āĻāĻžāϰā§āύā§āϞ āύāĻŋāĻā§āĻ, āĻāĻŦāĻ āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧāϤ, āĻāĻāĻāĻŋ āĻāĻžāϰā§āύā§āϞ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻĢāĻžāĻāϞāĨ¤ BPF āύāĻŋāϝāĻŧā§ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāϰāĻž āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ āĻāĻžāϰā§āύā§āϞ āĻŦāĻž āĻŦāĻŋāĻāĻžāĻļā§āϰ āĻāĻžāϰā§āύā§āϞāĻā§āϞāĻŋāϰ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋāĨ¤ āĻāϤāĻŋāĻšāĻžāϏāĻŋāĻāĻāĻžāĻŦā§, BPF āĻĄā§āĻā§āϞāĻĒāĻŽā§āύā§āĻ āϞāĻŋāύāĻžāĻā§āϏ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻāĻŋāĻ āϏāĻŽā§āĻĒā§āϰāĻĻāĻžāϝāĻŧā§āϰ āĻŽāϧā§āϝā§āĻ āĻāĻā§ āĻāĻŦāĻ āϏā§āĻāĻāύā§āϝ āϏāĻŽāϏā§āϤ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻļā§āĻā§āϰ āĻŦāĻž āĻĒāϰ⧠āϞāĻŋāύāĻžāĻā§āϏ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻāĻŋāĻ āϰāĻā§āώāĻŖāĻžāĻŦā§āĻā§āώāĻŖāĻāĻžāϰ⧠āĻĄā§āĻāĻŋāĻĄ āĻŽāĻŋāϞāĻžāϰā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻšāϝāĻŧāĨ¤ āϤāĻžāĻĻā§āϰ āĻĒā§āϰāĻā§āϤāĻŋāϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰ⧠- āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻŦāĻž āύāϤā§āύ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ - āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻĻā§āĻāĻŋ āĻā§āϰā§āϰ āĻāĻāĻāĻŋāϤ⧠āĻĒāĻĄāĻŧā§ - āĻŦāĻž . BPF-āĻāϰ āĻāύā§āϝ āĻĒāϰāĻŋāĻŦāϰā§āϤāύāĻā§āϞāĻŋ āĻāĻāĻ āĻāĻžāĻŦā§ āĻŽāϧā§āϝ⧠āĻŦāĻŋāϤāϰāĻŖ āĻāϰāĻž āĻšāϝāĻŧ и , āϝāĻž āϤāĻžāϰāĻĒāϰ āϝāĻĨāĻžāĻā§āϰāĻŽā§ āύā§āĻ āĻāĻŦāĻ āύā§āĻ-āĻĒāϰāĻŦāϰā§āϤā§āϤ⧠āĻĒā§āϞ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāϰ⧠āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāĻžāύāĻžāϰ āĻāύā§āϝ, āĻĻā§āĻā§āύ и . āϏā§āϤāϰāĻžāĻ āĻāĻĒāύāĻžāϰ āϏā§āĻŦāĻžāĻĻ āĻāĻŦāĻ āĻāĻĒāύāĻŋ āϝ⧠āϏāĻŋāϏā§āĻā§āĻŽā§ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻā§āύ āϤāĻžāϰ āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞāϤāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āĻāĻāĻāĻŋ āĻāĻžāϰā§āύā§āϞ āĻāϝāĻŧāύ āĻāϰā§āύ (*-next āĻāĻžāϰā§āύā§āϞāĻā§āϞāĻŋ āϤāĻžāϞāĻŋāĻāĻžāĻā§āĻā§āϤāĻĻā§āϰ āĻŽāϧā§āϝ⧠āϏāĻŦāĻā§āϝāĻŧā§ āĻ
āϏā§āĻĨāĻŋāϰ)āĨ¤
āĻāĻžāϰā§āύā§āϞ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āĻĢāĻžāĻāϞāĻā§āϞāĻŋ āĻā§āĻāĻžāĻŦā§ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāϤ⧠āĻšāϝāĻŧ āϏ⧠āϏāĻŽā§āĻĒāϰā§āĻā§ āĻāĻĨāĻž āĻŦāϞāĻž āĻāĻ āύāĻŋāĻŦāύā§āϧā§āϰ āϏā§āϝā§āĻā§āϰ āĻŦāĻžāĻāϰ⧠- āĻāĻāĻŋ āϧāϰ⧠āύā§āĻāϝāĻŧāĻž āĻšāϝāĻŧ āϝ⧠āĻāĻĒāύāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝ⧠āĻāĻāĻŋ āĻā§āĻāĻžāĻŦā§ āĻāϰāĻŦā§āύ āϤāĻž āĻāĻžāύā§āύ, āĻ āĻĨāĻŦāĻž āĻĒā§āϰāϤā§āϝā§āĻā§āϰ āύāĻŋāĻā§āϰ āĻāĻĒāϰ. āϝāĻžāĻāĻšā§āĻ, āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞ⧠āĻāĻĒāύāĻžāĻā§ āĻāĻāĻāĻŋ āĻāĻžāϰā§āϝāĻāϰ⧠BPF-āϏāĻā§āώāĻŽ āϏāĻŋāϏā§āĻā§āĻŽ āĻĻā§āĻāϝāĻŧāĻžāϰ āĻāύā§āϝ āĻāĻŽāĻŦā§āĻļāĻŋ āϝāĻĨā§āώā§āĻ āĻšāĻāϝāĻŧāĻž āĻāĻāĻŋāϤāĨ¤
āĻāĻĒāϰā§āϰ āĻāĻžāϰā§āύā§āϞāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰā§āύ:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
$ cd bpf-nextāĻāĻāĻāĻŋ āύā§āϝā§āύāϤāĻŽ āĻāĻžāĻā§āϰ āĻāĻžāϰā§āύā§āϞ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āϤā§āϰāĻŋ āĻāϰā§āύ:
$ cp /boot/config-`uname -r` .config
$ make localmodconfigāĻĢāĻžāĻāϞ⧠BPF āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋ āϏāĻā§āώāĻŽ āĻāϰā§āύ .config āĻāĻĒāύāĻžāϰ āύāĻŋāĻā§āϰ āĻĒāĻāύā§āĻĻā§āϰ (āϏāĻŽā§āĻāĻŦāϤ CONFIG_BPF āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āϏāĻā§āϰāĻŋāϝāĻŧ āĻāϰāĻž āĻšāĻŦā§ āϝā§āĻšā§āϤ⧠systemd āĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§)āĨ¤ āĻāĻāĻžāύ⧠āĻāĻ āύāĻŋāĻŦāύā§āϧāĻāĻŋāϰ āĻāύā§āϝ āĻŦā§āϝāĻŦāĻšā§āϤ āĻāĻžāϰā§āύā§āϞ āĻĨā§āĻā§ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āϤāĻžāϞāĻŋāĻāĻž āϰāϝāĻŧā§āĻā§:
CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_LSM=y
CONFIG_BPF_SYSCALL=y
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_BPF_JIT_DEFAULT_ON=y
CONFIG_IPV6_SEG6_BPF=y
# CONFIG_NETFILTER_XT_MATCH_BPF is not set
# CONFIG_BPFILTER is not set
CONFIG_NET_CLS_BPF=y
CONFIG_NET_ACT_BPF=y
CONFIG_BPF_JIT=y
CONFIG_BPF_STREAM_PARSER=y
CONFIG_LWTUNNEL_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
CONFIG_BPF_KPROBE_OVERRIDE=y
CONFIG_DEBUG_INFO_BTF=yāϤāĻžāϰāĻĒāϰ⧠āĻāĻŽāϰāĻž āϏāĻšāĻā§āĻ āĻŽāĻĄāĻŋāĻāϞ āĻāĻŦāĻ āĻāĻžāϰā§āύā§āϞāĻā§āϞāĻŋāĻā§ āĻāĻāϤā§āϰāĻŋāϤ āĻāĻŦāĻ āĻāύāϏā§āĻāϞ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ (āĻĒā§āϰāϏāĻā§āĻāĻā§āϰāĻŽā§, āĻāĻĒāύāĻŋ āύāϤā§āύ āĻ
ā§āϝāĻžāϏā§āĻŽā§āĻŦāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻžāϰā§āύā§āϞāĻā§ āĻāĻāϤā§āϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ clangāϝā§āĻ āĻāϰ⧠CC=clang):
$ make -s -j $(getconf _NPROCESSORS_ONLN)
$ sudo make modules_install
$ sudo make installāĻāĻŦāĻ āύāϤā§āύ āĻāĻžāϰā§āύā§āϞ āĻĻāĻŋāϝāĻŧā§ āϰāĻŋāĻŦā§āĻ āĻāϰā§āύ (āĻāĻŽāĻŋ āĻāĻāĻŋāϰ āĻāύā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŋ kexec āĻĒā§āϝāĻžāĻā§āĻ āĻĨā§āĻā§ kexec-tools):
v=5.8.0-rc6+ # ĐĩŅĐģи Đ˛Ņ ĐŋĐĩŅĐĩŅОйиŅаĐĩŅĐĩ ŅĐĩĐēŅŅĐĩĐĩ ŅĐ´ŅĐž, ŅĐž ĐŧĐžĐļĐŊĐž Đ´ĐĩĐģаŅŅ v=`uname -r`
sudo kexec -l -t bzImage /boot/vmlinuz-$v --initrd=/boot/initrd.img-$v --reuse-cmdline &&
sudo kexec -ebpftool
āύāĻŋāĻŦāύā§āϧ⧠āϏāĻŦāĻā§āϝāĻŧā§ āĻŦā§āĻļāĻŋ āĻŦā§āϝāĻŦāĻšā§āϤ āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋ āĻšāĻŦā§ āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋ bpftool, āϞāĻŋāύāĻžāĻā§āϏ āĻāĻžāϰā§āύā§āϞā§āϰ āĻ
āĻāĻļ āĻšāĻŋāϏāĻžāĻŦā§ āϏāϰāĻŦāϰāĻžāĻš āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤ āĻāĻāĻŋ BPF āĻĄā§āĻā§āϞāĻĒāĻžāϰāĻĻā§āϰ āĻāύā§āϝ BPF āĻĄā§āĻā§āϞāĻĒāĻžāϰāĻĻā§āϰ āĻĻā§āĻŦāĻžāϰāĻž āϞāĻŋāĻāĻŋāϤ āĻāĻŦāĻ āϰāĻā§āώāĻŖāĻžāĻŦā§āĻā§āώāĻŖ āĻāϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ āĻāĻāĻŋ āϏāĻŽāϏā§āϤ āϧāϰāĻŖā§āϰ BPF āĻ
āĻŦāĻā§āĻā§āĻ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠- āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϞā§āĻĄ āĻāϰāĻž, āĻŽāĻžāύāĻāĻŋāϤā§āϰ āϤā§āϰāĻŋ āĻāĻŦāĻ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰāĻž, BPF āĻāĻā§āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻā§āĻŦāύ āĻ
āύā§āĻŦā§āώāĻŖ āĻāϰāĻž āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤ āĻŽā§āϝāĻžāύ āĻĒā§āĻā§āϰ āĻāύā§āϝ āϏā§āϰā§āϏ āĻā§āĻĄ āĻāĻāĻžāϰ⧠āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāĻŦā§ āĻ
āĻĨāĻŦāĻž, āĻāϤāĻŋāĻŽāϧā§āϝ⧠āϏāĻāĻāϞāĻŋāϤ, .
āĻāĻ āϞā§āĻāĻžāϰ āϏāĻŽāϝāĻŧ āĻĄ bpftool āĻļā§āϧā§āĻŽāĻžāϤā§āϰ RHEL, Fedora āĻāĻŦāĻ Ubuntu-āĻāϰ āĻāύā§āϝ āϤā§āϰāĻŋ āĻšāϝāĻŧ (āĻĻā§āĻā§āύ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, , āϝāĻž āĻĒā§āϝāĻžāĻā§āĻāĻŋāĻāϝāĻŧā§āϰ āĻ
āϏāĻŽāĻžāĻĒā§āϤ āĻāϞā§āĻĒ āĻŦāϞ⧠bpftool āĻĄā§āĻŦāĻŋāϝāĻŧāĻžāύ āĻāĻžāώāĻžāϝāĻŧ)āĨ¤ āϤāĻŦā§ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝ⧠āĻāĻĒāύāĻžāϰ āĻāĻžāϰā§āύā§āϞ āϤā§āϰāĻŋ āĻāϰ⧠āĻĨāĻžāĻā§āύ āϤāĻŦā§ āϤā§āϰāĻŋ āĻāϰā§āύ bpftool āĻĒāĻžāĻ āĻšāĻŋāϏāĻžāĻŦā§ āϏāĻšāĻ:
$ cd ${linux}/tools/bpf/bpftool
# ... ĐŋŅĐžĐŋиŅиŅĐĩ ĐŋŅŅи Đē ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŧŅ clang, ĐēаĐē ŅаŅŅĐēаСаĐŊĐž вŅŅĐĩ
$ make -s
Auto-detecting system features:
... libbfd: [ on ]
... disassembler-four-args: [ on ]
... zlib: [ on ]
... libcap: [ on ]
... clang-bpf-co-re: [ on ]
Auto-detecting system features:
... libelf: [ on ]
... zlib: [ on ]
... bpf: [ on ]
$(āĻāĻāĻžāύ⧠${linux} - āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻžāϰā§āύā§āϞ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāĨ¤) āĻāĻ āĻāĻŽāĻžāύā§āĻĄāĻā§āϞāĻŋ āĻāĻžāϰā§āϝāĻāϰ āĻāϰāĻžāϰ āĻĒāϰ⧠bpftool āĻāĻāĻāĻŋ āĻĄāĻŋāϰā§āĻā§āĻāϰāĻŋāϤ⧠āϏāĻāĻā§āϰāĻš āĻāϰāĻž āĻšāĻŦā§ ${linux}/tools/bpf/bpftool āĻāĻŦāĻ āĻāĻāĻŋ āĻĒāĻžāĻĨā§ āϝā§āĻ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠(āĻĒā§āϰāĻĨāĻŽā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āĻāĻžāĻā§ root) āĻ
āĻĨāĻŦāĻž āĻļā§āϧ⧠āĻāĻĒāĻŋ āĻāϰā§āύ /usr/local/sbin.
āϏāĻāĻā§āϰāĻš āĻāϰā§āύ bpftool āĻĒāϰā§āϰāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻāĻžāϞ clang, āĻāĻĒāϰ⧠āĻŦāϰā§āĻŖāĻŋāϤ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻāϤā§āϰāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§, āĻāĻŦāĻ āĻāĻāĻŋ āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āĻāĻāϤā§āϰāĻŋāϤ āĻšāϝāĻŧā§āĻā§ āĻāĻŋāύāĻž āϤāĻž āĻĒāϰā§āĻā§āώāĻž āĻāϰā§āύ - āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻŽāĻžāύā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§
$ sudo bpftool feature probe kernel
Scanning system configuration...
bpf() syscall for unprivileged users is enabled
JIT compiler is enabled
JIT compiler hardening is disabled
JIT compiler kallsyms exports are enabled for root
...āϝāĻž āĻĻā§āĻāĻžāĻŦā§ āĻā§āύ BPF āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻžāϰā§āύā§āϞ⧠āϏāĻā§āώāĻŽ āĻāϰāĻž āĻāĻā§āĨ¤
āϝāĻžāĻāĻšā§āĻ, āĻāĻā§āϰ āĻāĻŽāĻžāύā§āĻĄ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻžāϞāĻžāύ⧠āϝā§āϤ⧠āĻĒāĻžāϰā§
# bpftool f p kāĻāĻāĻŋ āĻĒā§āϝāĻžāĻā§āĻ āĻĨā§āĻā§ āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āϏāĻžāĻĻā§āĻļā§āϝ āĻĻā§āĻŦāĻžāϰāĻž āĻāϰāĻž āĻšāϝāĻŧ iproute2, āϝā§āĻāĻžāύ⧠āĻāĻŽāϰāĻž, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻŦāϞāϤ⧠āĻĒāĻžāϰāĻŋ ip a s eth0 āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠ip addr show dev eth0.
āĻāĻĒāϏāĻāĻšāĻžāϰ
BPF āĻāĻĒāύāĻžāĻā§ āĻāĻžāϰā§āϝāĻāϰāĻāĻžāĻŦā§ āĻĒāϰāĻŋāĻŽāĻžāĻĒ āĻāϰāϤ⧠āĻāĻŦāĻ āĻāĻĄāĻŧāύā§āϤ āĻ āĻŦāϏā§āĻĨāĻžāϝāĻŧ āĻŽā§āϞāĻāĻŋāϰ āĻāĻžāϰā§āϝāĻāĻžāϰāĻŋāϤāĻž āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāϤ⧠āĻāĻāĻāĻŋ āĻŽāĻžāĻāĻŋāĻā§ āĻā§āϤāĻž āĻĻā§āĻāϝāĻŧāĻžāϰ āĻ āύā§āĻŽāϤāĻŋ āĻĻā§āϝāĻŧāĨ¤ āĻāĻāύāĻŋāĻā§āϏā§āϰ āϏāϰā§āĻŦā§āϤā§āϤāĻŽ āĻāϤāĻŋāĻšā§āϝ⧠āϏāĻŋāϏā§āĻā§āĻŽāĻāĻŋ āĻ āϤā§āϝāύā§āϤ āϏāĻĢāϞ āĻŦāϞ⧠āĻĒā§āϰāĻŽāĻžāĻŖāĻŋāϤ āĻšāϝāĻŧā§āĻā§: āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āϝāĻž āĻāĻĒāύāĻžāĻā§ āĻāĻžāϰā§āύā§āϞāĻā§ (āĻĒā§āύāϰāĻžāϝāĻŧ) āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ āϝāĻž āĻŦāĻŋāĻĒā§āϞ āϏāĻāĻā§āϝāĻ āϞā§āĻ āĻāĻŦāĻ āϏāĻāϏā§āĻĨāĻžāĻā§ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻžāϰ āĻ āύā§āĻŽāϤāĻŋ āĻĻā§āϝāĻŧāĨ¤ āĻāĻŦāĻ, āϝāĻĻāĻŋāĻ āĻĒāϰā§āĻā§āώāĻž-āύāĻŋāϰā§āĻā§āώāĻž, āϏā§āĻāϏāĻžāĻĨā§ BPF āĻĒāϰāĻŋāĻāĻžāĻ āĻžāĻŽā§āϰ āĻŦāĻŋāĻāĻžāĻļ āĻāĻāύāĻ āĻļā§āώ āĻšāϝāĻŧāύāĻŋ, āϏāĻŋāϏā§āĻā§āĻŽā§ āĻāϤāĻŋāĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋ āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞ ABI āϰāϝāĻŧā§āĻā§ āϝāĻž āĻāĻĒāύāĻžāĻā§ āύāĻŋāϰā§āĻāϰāϝā§āĻā§āϝ, āĻāĻŦāĻ āϏāĻŦāĻā§āϝāĻŧā§ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖāĻāĻžāĻŦā§ āĻāĻžāϰā§āϝāĻāϰ āĻŦā§āϝāĻŦāϏāĻžāϝāĻŧāĻŋāĻ āϝā§āĻā§āϤāĻŋ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĻā§āϝāĻŧāĨ¤
āĻāĻŽāĻŋ āύā§āĻ āĻāϰāϤ⧠āĻāĻžāĻ āϝā§, āĻāĻŽāĻžāϰ āĻŽāϤā§, āĻĒā§āϰāϝā§āĻā§āϤāĻŋāĻāĻŋ āĻāϤ āĻāύāĻĒā§āϰāĻŋāϝāĻŧ āĻšāϝāĻŧā§ āĻāĻ ā§āĻā§ āĻāĻžāϰāĻŖ, āĻāĻāĻĻāĻŋāĻā§, āĻāĻāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻā§āϞāĻž (āĻŽā§āĻļāĻŋāύā§āϰ āĻāϰā§āĻāĻŋāĻā§āĻāĻāĻžāϰ āĻāĻ āϏāύā§āϧā§āϝāĻžāϝāĻŧ āĻāĻŽāĻŦā§āĻļāĻŋ āĻŦā§āĻāĻž āϝāĻžāϝāĻŧ), āĻāĻŦāĻ āĻ āύā§āϝāĻĻāĻŋāĻā§, āĻāϰ āĻāĻĒāϏā§āĻĨāĻŋāϤāĻŋāϰ āĻāĻā§ (āϏā§āύā§āĻĻāϰāĻāĻžāĻŦā§) āϏāĻŽāĻžāϧāĻžāύ āĻāϰāĻž āϝāĻžāϝāĻŧāύāĻŋ āĻāĻŽāύ āϏāĻŽāϏā§āϝāĻžāĻā§āϞāĻŋ āϏāĻŽāĻžāϧāĻžāύ āĻāϰā§āύāĨ¤ āĻāĻ āĻĻā§āĻāĻŋ āĻāĻĒāĻžāĻĻāĻžāύ āĻāĻāϏāĻžāĻĨā§ āĻŽāĻžāύā§āώāĻā§ āĻĒāϰā§āĻā§āώāĻž āĻāϰāϤ⧠āĻāĻŦāĻ āϏā§āĻŦāĻĒā§āύ āĻĻā§āĻāϤ⧠āĻŦāĻžāϧā§āϝ āĻāϰā§, āϝāĻž āĻāϰāĻ āĻāĻŦāĻ āĻāϰāĻ āĻāĻĻā§āĻāĻžāĻŦāύ⧠āϏāĻŽāĻžāϧāĻžāύā§āϰ āĻāϤā§āĻĨāĻžāύā§āϰ āĻĻāĻŋāĻā§ āĻĒāϰāĻŋāĻāĻžāϞāĻŋāϤ āĻāϰā§āĨ¤
āĻāĻ āύāĻŋāĻŦāύā§āϧāĻāĻŋ, āϝāĻĻāĻŋāĻ āĻŦāĻŋāĻļā§āώāĻāĻžāĻŦā§ āϏāĻāĻā§āώāĻŋāĻĒā§āϤ āύāϝāĻŧ, āĻļā§āϧā§āĻŽāĻžāϤā§āϰ BPF āĻāϰ āĻāĻāϤā§āϰ āĻāĻāĻāĻŋ āĻā§āĻŽāĻŋāĻāĻž āĻāĻŦāĻ āĻāĻāĻŋ "āĻāύā§āύāϤ" āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻāĻŦāĻ āϏā§āĻĨāĻžāĻĒāϤā§āϝā§āϰ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻ āĻāĻļāĻā§āϞāĻŋ āĻŦāϰā§āĻŖāύāĻž āĻāϰ⧠āύāĻžāĨ¤ āϏāĻžāĻŽāύā§āϰ āĻĒāϰāĻŋāĻāϞā§āĻĒāύāĻžāĻāĻŋ āĻāϰāĻāĻŽ āĻāĻŋāĻā§: āĻĒāϰāĻŦāϰā§āϤ⧠āύāĻŋāĻŦāύā§āϧāĻāĻŋ āĻšāĻŦā§ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āϧāϰāύāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āϏāĻāĻā§āώāĻŋāĻĒā§āϤ āĻŦāĻŋāĻŦāϰāĻŖ (5.8 āĻāĻžāϰā§āύā§āϞ⧠30āĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϏāĻŽāϰā§āĻĨāĻŋāϤ āĻāĻā§), āϤāĻžāϰāĻĒāϰ āĻāĻŽāϰāĻž āĻ āĻŦāĻļā§āώ⧠āĻĻā§āĻāĻŦ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻžāϰā§āύā§āϞ āĻā§āϰā§āϏāĻŋāĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻŦāĻžāϏā§āϤāĻŦ BPF āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āϞāĻŋāĻāϤ⧠āĻšāϝāĻŧāĨ¤ āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāϰāĻŖ āĻšāĻŋāϏāĻžāĻŦā§, āϤāĻžāϰāĻĒāϰ BPF āϏā§āĻĨāĻžāĻĒāϤā§āϝā§āϰ āĻāĻĒāϰ āĻāϰāĻ āĻāĻā§āϰ āĻā§āϰā§āϏā§āϰ āĻāύā§āϝ āϏāĻŽāϝāĻŧ āĻāϏā§āĻā§, āĻāϰ āĻĒāϰ⧠BPF āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻāĻŋāĻ āĻāĻŦāĻ āϏā§āϰāĻā§āώāĻž āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύāĻā§āϞāĻŋāϰ āĻāĻĻāĻžāĻšāϰāĻŖāĻā§āϞāĻŋ āĻ āύā§āϏāϰāĻŖ āĻāϰā§āύ⧎
āĻāĻ āϏāĻŋāϰāĻŋāĻā§āϰ āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āύāĻŋāĻŦāύā§āϧ
āϞāĻŋāĻā§āĻ
â āϏāĻŋāϞāĻŋāϝāĻŧāĻžāĻŽ āĻĨā§āĻā§ BPF-āĻāϰ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ, āĻŦāĻž āĻāϰāĻ āϏā§āĻĒāώā§āĻāĻāĻžāĻŦā§ āĻĄā§āϝāĻžāύāĻŋāϝāĻŧā§āϞ āĻŦā§āϰā§āĻāĻŽā§āϝāĻžāύ, BPF-āĻāϰ āĻ āύā§āϝāϤāĻŽ āύāĻŋāϰā§āĻŽāĻžāϤāĻž āĻāĻŦāĻ āϰāĻā§āώāĻŖāĻžāĻŦā§āĻā§āώāĻŖāĻāĻžāϰā§āĨ¤ āĻāĻāĻŋ āĻĒā§āϰāĻĨāĻŽ āĻā§āϰā§āϤāϰ āĻŦāϰā§āĻŖāύāĻžāĻā§āϞāĻŋāϰ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋ, āϝāĻž āĻ āύā§āϝāĻĻā§āϰ āĻĨā§āĻā§ āĻāϞāĻžāĻĻāĻž āϝ⧠āĻĄā§āϝāĻžāύāĻŋāϝāĻŧā§āϞ āĻ āĻŋāĻ āĻāĻžāύā§āύ āϝ⧠āϤāĻŋāύāĻŋ āĻā§ āϞāĻŋāĻāĻā§āύ āĻāĻŦāĻ āϏā§āĻāĻžāύ⧠āĻā§āύāĻ āĻā§āϞ āύā§āĻāĨ¤ āĻŦāĻŋāĻļā§āώ āĻāϰā§, āĻāĻ āύāĻĨāĻŋāĻāĻŋ āĻŦāϰā§āĻŖāύāĻž āĻāϰ⧠āĻāĻŋāĻāĻžāĻŦā§ XDP āĻāĻŦāĻ TC āϧāϰāĻŖā§āϰ BPF āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āϏā§āĻĒāϰāĻŋāĻāĻŋāϤ āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻžāĻ āĻāϰāĻž āϝāĻžāϝāĻŧ
ipāĻĒā§āϝāĻžāĻā§āĻ āĻĨā§āĻā§iproute2.â āĻā§āϞāĻžāϏāĻŋāĻ āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āĻŦāϰā§āϧāĻŋāϤ BPF āĻāϰ āĻāύā§āϝ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āϏāĻš āĻāϏāϞ āĻĢāĻžāĻāϞāĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āϏāĻŽāĻžāĻŦā§āĻļā§āϰ āĻāĻžāώāĻž āĻāĻŦāĻ āĻĒā§āϰāϝā§āĻā§āϤāĻŋāĻāϤ āϏā§āĻĨāĻžāĻĒāϤā§āϝā§āϰ āĻŦāĻŋāĻļāĻĻ āĻāĻžāύāϤ⧠āĻāĻžāύ āϤāĻŦā§ āĻāĻāĻāĻŋ āĻāĻžāϞ āĻĒāĻĄāĻŧāĻžāĨ¤
. āĻāĻāĻŋ āĻā§āĻŦ āĻāĻŽāĻ āĻāĻĒāĻĄā§āĻ āĻāϰāĻž āĻšāϝāĻŧ, āϤāĻŦā§ āϝāĻĨāĻžāϝāĻĨāĻāĻžāĻŦā§, āϝā§āĻŽāύ āĻāϞā§āĻā§āϏāĻŋ āϏā§āĻāĻžāϰā§āĻāϝāĻŧā§āĻāĻ (āĻāĻŦāĻŋāĻĒāĻŋāĻāĻĢ-āĻāϰ āϞā§āĻāĻ) āĻāĻŦāĻ āĻāύā§āĻĻā§āϰāĻŋ āύāĻžāĻā§āϰāĻŋāĻā§ - (āϰāĻā§āώāĻŖāĻžāĻŦā§āĻā§āώāĻŖāĻāĻžāϰā§) āϏā§āĻāĻžāύ⧠āϞāĻŋāĻā§āĻā§āύāĨ¤
libbpf).. Bpftool āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻāĻĻāĻžāĻšāϰāĻŖ āĻāĻŦāĻ āĻā§āĻĒāύā§āϝāĻŧāϤāĻž āϏāĻš Quentin Monnet āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻŦāĻŋāύā§āĻĻāύāĻŽā§āϞāĻ āĻā§āĻāĻāĻžāϰ āĻĨā§āϰā§āĻĄāĨ¤
. Quentin Monnet āĻĨā§āĻā§ BPF āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύā§āϰ āϞāĻŋāĻā§āĻāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āĻŦāĻŋāĻļāĻžāϞ (āĻāĻŦāĻ āĻāĻāύāĻ āĻŦāĻāĻžāϝāĻŧ āϰāĻžāĻāĻž) āϤāĻžāϞāĻŋāĻāĻžāĨ¤
āĻāϤā§āϏ: www.habr.com
