āĻļā§āĻ°ā§āĻ¤ā§ āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻ¯ā§āĻā§āĻ¤āĻŋ āĻāĻŋāĻ˛ āĻāĻŦāĻ āĻ¸ā§āĻāĻŋāĻ° āĻ¨āĻžāĻŽ āĻāĻŋāĻ˛ āĻŦāĻŋāĻĒāĻŋāĻāĻĢāĨ¤ āĻāĻŽāĻ°āĻž āĻ¤āĻžāĻ° āĻĻāĻŋāĻā§ āĻ¤āĻžāĻāĻžāĻ˛āĻžāĻŽ
āĻŽā§āĻāĻžāĻŽā§āĻāĻŋāĻāĻžāĻŦā§ āĻŦāĻ˛āĻ¤ā§ āĻā§āĻ˛ā§, BPF āĻāĻĒāĻ¨āĻžāĻā§ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻ¸ā§āĻĒā§āĻ¸ā§ āĻ¨āĻŋāĻ°ā§āĻŦāĻŋāĻāĻžāĻ°ā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸āĻ°āĻŦāĻ°āĻžāĻšāĻā§āĻ¤ āĻā§āĻĄ āĻāĻžāĻ˛āĻžāĻ¨ā§āĻ° āĻ āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§āĻ¯āĻŧ āĻāĻŦāĻ āĻ¨āĻ¤ā§āĻ¨ āĻāĻ°ā§āĻāĻŋāĻā§āĻāĻāĻžāĻ°āĻāĻŋ āĻāĻ¤āĻāĻžāĻ āĻ¸āĻĢāĻ˛ āĻšāĻ¯āĻŧā§āĻā§ āĻ¯ā§ āĻāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻ°āĻ āĻāĻ āĻĄāĻāĻ¨ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻšāĻŦā§āĨ¤ (āĻāĻāĻŽāĻžāĻ¤ā§āĻ° āĻāĻŋāĻ¨āĻŋāĻ¸ āĻ¯āĻž āĻĄā§āĻā§āĻ˛āĻĒāĻžāĻ°āĻ°āĻž āĻāĻžāĻ˛ āĻāĻ°ā§āĻ¨āĻŋ, āĻāĻĒāĻ¨āĻŋ āĻ¨ā§āĻā§āĻ° āĻāĻ°ā§āĻŽāĻā§āĻˇāĻŽāĻ¤āĻž āĻā§āĻĄā§ āĻĻā§āĻāĻ¤ā§ āĻĒāĻžāĻā§āĻā§āĻ¨, āĻāĻāĻāĻŋ āĻļāĻžāĻ˛ā§āĻ¨ āĻ˛ā§āĻā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻāĻŋāĻ˛āĨ¤)
āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻāĻŋ BPF āĻāĻžāĻ°ā§āĻā§āĻ¯āĻŧāĻžāĻ˛ āĻŽā§āĻļāĻŋāĻ¨ā§āĻ° āĻāĻ āĻ¨, BPF āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸, āĻĄā§āĻā§āĻ˛āĻĒāĻŽā§āĻ¨ā§āĻ āĻā§āĻ˛āĻ¸, āĻ¸ā§āĻāĻ¸āĻžāĻĨā§ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻā§āĻˇāĻŽāĻ¤āĻžāĻā§āĻ˛āĻŋāĻ° āĻāĻāĻāĻŋ āĻ¸āĻāĻā§āĻˇāĻŋāĻĒā§āĻ¤, āĻā§āĻŦ āĻ¸āĻāĻā§āĻˇāĻŋāĻĒā§āĻ¤ āĻāĻāĻžāĻ°āĻāĻŋāĻ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻāĻ°ā§, āĻ¯ā§āĻŽāĻ¨ BPF āĻāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻŋāĻ āĻĒā§āĻ°āĻ¯āĻŧā§āĻā§āĻ° āĻāĻā§āĻ° āĻ
āĻ§ā§āĻ¯āĻ¯āĻŧāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŦāĻŋāĻˇā§āĻ¯āĻ¤ā§ āĻ¯āĻž āĻ¯āĻž āĻāĻŽāĻžāĻĻā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻšāĻŦā§āĨ¤
āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§āĻ° āĻ¸āĻžāĻ°āĻžāĻāĻļ
bpf(2)
.
ĐиŅĐĩĐŧ ĐŋŅĐžĐŗŅĐ°ĐŧĐŧŅ BPF Ņ ĐŋĐžĐŧĐžŅŅŅ libbpf
.libbpf
. āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻŽā§āĻ˛āĻŋāĻ BPF āĻ
ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻāĻā§āĻāĻžāĻ˛ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻŦ āĻ¯āĻž āĻāĻŽāĻ°āĻž āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻāĻĻāĻžāĻšāĻ°āĻŖāĻā§āĻ˛āĻŋāĻ¤ā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŦāĨ¤
BPF āĻāĻ°ā§āĻāĻŋāĻā§āĻāĻāĻžāĻ°ā§āĻ° āĻĒāĻ°āĻŋāĻāĻŋāĻ¤āĻŋ
āĻāĻŽāĻ°āĻž BPF āĻāĻ°ā§āĻāĻŋāĻā§āĻāĻāĻžāĻ° āĻŦāĻŋāĻŦā§āĻāĻ¨āĻž āĻļā§āĻ°ā§ āĻāĻ°āĻžāĻ° āĻāĻā§, āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻļā§āĻˇ āĻŦāĻžāĻ° āĻāĻ˛ā§āĻ˛ā§āĻ āĻāĻ°āĻŦ (āĻāĻš)
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
āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻāĻŋāĻā§ āĻĒā§āĻ°āĻ¸āĻā§āĻā§ āĻāĻāĻāĻŋ āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻāĻžāĻ° āĻĻā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧ - āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽā§āĻ° āĻ§āĻ°āĻŖā§āĻ° āĻāĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻāĻ° āĻāĻ°ā§, āĻāĻāĻŋ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§, āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻāĻāĻŋ āĻāĻžāĻ āĻžāĻŽā§ struct xdp_md
struct __sk_buff
struct pt_regs
āĻ¸ā§āĻ¤āĻ°āĻžāĻ, āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻžāĻā§ āĻāĻāĻāĻŋ āĻ¸ā§āĻ āĻ°ā§āĻāĻŋāĻ¸ā§āĻāĻžāĻ°, āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯āĻāĻžāĻ°ā§, āĻāĻāĻāĻŋ āĻ¸ā§āĻā§āĻ¯āĻžāĻ, āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻ¸āĻā§āĻ āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻāĻžāĻ° āĻāĻŦāĻ āĻŽāĻžāĻ¨āĻāĻŋāĻ¤ā§āĻ°ā§āĻ° āĻāĻāĻžāĻ°ā§ āĻļā§āĻ¯āĻŧāĻžāĻ° āĻāĻ°āĻž āĻŽā§āĻŽāĻ°āĻŋ āĻāĻŋāĻ˛āĨ¤ āĻāĻŽāĻ¨ āĻ¨āĻ¯āĻŧ āĻ¯ā§ āĻāĻ āĻ¸āĻŦāĻ āĻā§āĻ°āĻŽāĻŖā§ āĻāĻā§āĻŦāĻžāĻ°ā§āĻ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ, āĻāĻŋāĻ¨ā§āĻ¤ā§...
āĻāĻ¸ā§āĻ¨ āĻŦāĻ°ā§āĻŖāĻ¨āĻžāĻāĻŋ āĻāĻžāĻ˛āĻŋāĻ¯āĻŧā§ āĻ¯āĻžāĻ āĻāĻŦāĻ āĻāĻ āĻŦāĻ¸ā§āĻ¤ā§āĻā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŽāĻžāĻ¨ā§āĻĄ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻĨāĻž āĻŦāĻ˛āĻŋāĨ¤ āĻ¸āĻŦ (
āĻāĻāĻž āĻšāĻ˛ 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.h
bpf_common.h
āĻāĻĻāĻžāĻšāĻ°āĻŖ: āĻāĻĒāĻ¨āĻžāĻ° āĻŽāĻžāĻĨāĻžāĻ¯āĻŧ 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 āĻ
āĻĒāĻžāĻ°ā§āĻļāĻ¨ āĻšāĻ¯āĻŧ BPF_EXIT
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
= BPF_LD
BPF_DW
BPF_IMM
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 exit
BPF āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻā§āĻŦāĻ¨āĻāĻā§āĻ°, 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
. āĻāĻ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽā§āĻ° āĻĒā§āĻ°āĻžāĻ¨ā§ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖā§āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸āĻā§āĻ°āĻŋāĻ¯āĻŧ āĻĻā§āĻˇā§āĻāĻžāĻ¨ā§āĻ¤āĻā§āĻ˛āĻŋ āĻ¤āĻžāĻĻā§āĻ° āĻāĻžāĻ āĻļā§āĻˇ āĻāĻ°āĻŦā§, āĻāĻŦāĻ āĻ¨āĻ¤ā§āĻ¨ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻĨā§āĻā§ āĻ¨āĻ¤ā§āĻ¨ āĻāĻā§āĻ¨ā§āĻ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ° āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻšāĻŦā§, āĻāĻŦāĻ āĻāĻāĻžāĻ¨ā§ "āĻĒāĻ°āĻŽāĻžāĻŖā§" āĻŽāĻžāĻ¨ā§ āĻāĻāĻāĻŋ āĻāĻā§āĻ¨ā§āĻ āĻŽāĻŋāĻ¸ āĻāĻ°āĻž āĻšāĻŦā§ āĻ¨āĻžāĨ¤
āĻāĻā§āĻ¨ā§āĻ āĻāĻ¤ā§āĻ¸ā§āĻ° āĻ¸āĻžāĻĨā§ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻ¸āĻāĻ¯ā§āĻā§āĻ¤ āĻāĻ°āĻž
āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§, āĻāĻŽāĻ°āĻž āĻāĻ˛āĻžāĻĻāĻžāĻāĻžāĻŦā§ āĻāĻā§āĻ¨ā§āĻ āĻāĻ¤ā§āĻ¸ā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻāĻ¯ā§āĻāĻāĻžāĻ°ā§ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻā§āĻ˛āĻŋ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻāĻ°āĻŦ āĻ¨āĻž, āĻ¯ā§āĻšā§āĻ¤ā§ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻ§āĻ°āĻŖā§āĻ° āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽā§āĻ° āĻĒā§āĻ°ā§āĻā§āĻˇāĻžāĻĒāĻā§ āĻāĻāĻŋ āĻ
āĻ§ā§āĻ¯āĻ¯āĻŧāĻ¨ āĻāĻ°āĻž āĻŦā§āĻ§āĻāĻŽā§āĻ¯āĨ¤ āĻ¸ā§āĻŽāĻŋ.
āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ āĻŦāĻā§āĻā§āĻ āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĒā§āĻ˛ā§āĻ āĻāĻ°āĻž
āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ
āĻ¸āĻŽāĻ¸ā§āĻ¤ BPF āĻŦāĻ¸ā§āĻ¤ā§ āĻāĻāĻāĻŋ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§ āĻ¸ā§āĻĨāĻžāĻ¨ āĻĨā§āĻā§ āĻ¤ā§āĻ°āĻŋ āĻāĻŦāĻ āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻŋāĻ¤ āĻšāĻ¯āĻŧ bpf
, āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻĒā§āĻ°ā§āĻā§āĻāĻžāĻāĻĒ āĻāĻā§:
#include <linux/bpf.h>
int bpf(int cmd, union bpf_attr *attr, unsigned int size);
āĻāĻāĻžāĻ¨ā§ āĻĻāĻ˛ cmd
āĻāĻžāĻāĻĒā§āĻ° āĻŽāĻžāĻ¨āĻā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻāĻāĻŋ enum bpf_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 āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽā§āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻā§āĻļ āĻāĻžāĻ āĻžāĻŽā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻĒā§āĻ¯āĻžāĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧ bpf_insn
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
.
āĻāĻ¸ā§āĻ¨ āĻāĻāĻ¨āĻ āĻŦāĻ˛āĻŋ āĻ¯ā§ āĻŽāĻžāĻ¨āĻāĻŋāĻ¤ā§āĻ°ā§āĻ° āĻā§āĻˇāĻŽāĻ¤āĻžāĻā§āĻ˛āĻŋ āĻā§āĻŦāĻ˛ āĻāĻžāĻ āĻāĻ°āĻž āĻŽā§āĻŽāĻ°āĻŋāĻ¤ā§ āĻ
ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻ¸ā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻ¸ā§āĻŽāĻžāĻŦāĻĻā§āĻ§ āĻ¨āĻ¯āĻŧāĨ¤ āĻāĻāĻžāĻ¨ā§ āĻŦāĻŋāĻļā§āĻˇ-āĻāĻĻā§āĻĻā§āĻļā§āĻ¯ā§āĻ° āĻŽāĻžāĻ¨āĻāĻŋāĻ¤ā§āĻ° āĻ°āĻ¯āĻŧā§āĻā§, āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽā§āĻ° āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻāĻžāĻ° āĻŦāĻž āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ā§āĻ° āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻāĻžāĻ°, āĻĒāĻžāĻ°āĻĢ āĻāĻā§āĻ¨ā§āĻāĻā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻŽāĻžāĻ¨āĻāĻŋāĻ¤ā§āĻ° āĻāĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĨ¤ āĻāĻŽāĻ°āĻž āĻāĻāĻžāĻ¨ā§ āĻ¤āĻžāĻĻā§āĻ° āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻĨāĻž āĻŦāĻ˛āĻŦ āĻ¨āĻž, āĻ¯āĻžāĻ¤ā§ āĻĒāĻžāĻ āĻ āĻŦāĻŋāĻā§āĻ°āĻžāĻ¨ā§āĻ¤ āĻ¨āĻž āĻšāĻ¯āĻŧāĨ¤ āĻāĻāĻŋ āĻāĻžāĻĄāĻŧāĻžāĻ, āĻāĻŽāĻ°āĻž āĻ¸āĻŋāĻā§āĻā§āĻ°ā§āĻ¨āĻžāĻāĻā§āĻļāĻ¨ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻā§āĻ˛āĻŋ āĻāĻĒā§āĻā§āĻˇāĻž āĻāĻ°āĻŋ, āĻ¯ā§āĻšā§āĻ¤ā§ āĻāĻāĻŋ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖāĻā§āĻ˛āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖ āĻ¨āĻ¯āĻŧā§ˇ āĻāĻĒāĻ˛āĻŦā§āĻ§ āĻŽāĻžāĻ¨āĻāĻŋāĻ¤ā§āĻ° āĻĒā§āĻ°āĻāĻžāĻ°ā§āĻ° āĻāĻāĻāĻŋ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻ¤āĻžāĻ˛āĻŋāĻāĻž āĻĒāĻžāĻāĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§ <linux/bpf.h>
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 map
BPF_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 āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻŽā§āĻĒāĻžāĻāĻ˛ āĻāĻ°āĻž āĻāĻāĻŋāĻ¤ (āĻāĻŽāĻ°āĻž āĻŦāĻŋāĻāĻžāĻā§ āĻāĻāĻŋ āĻā§āĻāĻžāĻŦā§ āĻāĻ°āĻ¤ā§ āĻšāĻ¯āĻŧ āĻ¤āĻž āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻāĻ°āĻŋ
$ 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
āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻāĻŦāĻ āĻāĻ° āĻŦāĻŋāĻāĻžāĻļ āĻŽā§āĻ˛āĻŋāĻ āĻ¤āĻžāĻ˛āĻŋāĻāĻžāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻāĻ°āĻž āĻšāĻ¯āĻŧ [email protected]
. āĻ¯āĻžāĻāĻšā§āĻ, āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ā§āĻ° āĻŦāĻžāĻāĻ°ā§ āĻŦāĻ¸āĻŦāĻžāĻ¸āĻāĻžāĻ°ā§ āĻ
ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻā§āĻ˛āĻŋāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻĒā§āĻĨāĻ āĻ¸āĻāĻā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ āĻ°āĻā§āĻˇāĻŖāĻžāĻŦā§āĻā§āĻˇāĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧ
āĻāĻ āĻŦāĻŋāĻāĻžāĻā§ āĻāĻŽāĻ°āĻž āĻĻā§āĻāĻŦ āĻ¯ā§ āĻāĻĒāĻ¨āĻŋ āĻā§āĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻāĻ˛ā§āĻĒ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ āĻ¯āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ 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 āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽā§āĻ° āĻ§āĻ°āĻ¨ āĻĢāĻžāĻāĻ˛ā§ "āĻ¸āĻāĻā§āĻāĻžāĻ¯āĻŧāĻŋāĻ¤" āĻāĻā§ include/linux/bpf_types.h
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 āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽā§āĻ° āĻāĻŋāĻ¤āĻ°ā§ āĻĢāĻžāĻāĻļāĻ¨, āĻĻā§āĻā§āĻ¨ verifier.c
āĻāĻ¸ā§āĻ¨ āĻĻā§āĻāĻŋ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āĻ
āĻ¨ā§āĻŽāĻžāĻ¨āĻŽā§āĻ˛āĻ 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: exit
0-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_mp_*
āĻ°āĻšāĻ¸ā§āĻ¯āĻŽāĻ¯āĻŧ āĻ¸ā§āĻāĻ
āĻ¸ā§āĻ¤āĻ°āĻžāĻ, āĻāĻŽāĻ°āĻž āĻ¯ā§āĻŽāĻ¨ āĻāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ 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
āĻ
ā§āĻ¯āĻžāĻ˛āĻāĻ°āĻŋāĻĻāĻŽ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§āĻĒ:
- āĻ¸āĻāĻāĻ˛āĻ¨ā§āĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻŽāĻžāĻ¨āĻāĻŋāĻ¤ā§āĻ°ā§āĻ° āĻ˛āĻŋāĻā§āĻāĻā§āĻ˛āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻ°ā§āĻāĻ°ā§āĻĄāĻā§āĻ˛āĻŋ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻā§āĻŦāĻŋāĻ˛ā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻšāĻ¯āĻŧ
libbpf
ELF āĻ āĻŦāĻā§āĻā§āĻ āĻŦā§āĻ āĻā§āĻ˛ā§, āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻŽāĻžāĻ¨āĻāĻŋāĻ¤ā§āĻ° āĻā§āĻāĻā§ āĻĒāĻžāĻ¯āĻŧ āĻāĻŦāĻ āĻ¤āĻžāĻĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĢāĻžāĻāĻ˛ āĻŦāĻ°ā§āĻŖāĻ¨āĻžāĻāĻžāĻ°ā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§- āĻ¨āĻŋāĻ°ā§āĻĻā§āĻļā§āĻ° āĻ
āĻāĻļ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻĢāĻžāĻāĻ˛ āĻŦāĻ°ā§āĻŖāĻ¨āĻžāĻāĻžāĻ°ā§āĻā§āĻ˛āĻŋ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ā§ āĻ˛ā§āĻĄ āĻāĻ°āĻž āĻšāĻ¯āĻŧ
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
. āĻāĻāĻŋ āĻāĻĒāĻ¯ā§āĻā§ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻ¯āĻāĻ¨ āĻāĻĒāĻ¨āĻŋ āĻāĻŽāĻ¨ āĻāĻāĻāĻŋ āĻĒāĻ°āĻŋāĻŦā§āĻļā§ āĻāĻžāĻ āĻāĻ°āĻā§āĻ¨ āĻ¯āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻĒāĻ¨āĻŋ āĻ¨āĻŋāĻ°ā§āĻāĻ°āĻ¤āĻž āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŦā§āĻ¨ āĻ¨āĻž, āĻŦāĻž āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻŦāĻŋāĻ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŦā§āĻ¨ āĻ¨āĻž, āĻŦāĻž āĻāĻāĻāĻŋ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻ˛āĻŋāĻāĻ¤ā§ āĻĒāĻžāĻ°āĻŦā§āĻ¨ ply
āĻ¯ā§āĻā§āĻ¤āĻŋ āĻ
āĻ¨ā§āĻ¸āĻ°āĻŖ āĻāĻ°āĻž āĻ¸āĻšāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻ°āĻž āĻāĻ āĻāĻĻā§āĻĻā§āĻļā§āĻ¯ā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖāĻāĻŋ āĻāĻŦāĻžāĻ° āĻ˛āĻŋāĻāĻŦ 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
(āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ: āĻāĻĒāĻ°ā§ āĻĨā§āĻā§ āĻĄāĻžāĻŽā§āĻĒ āĻ¨āĻŋāĻ¨, āĻ¨āĻŋāĻ°ā§āĻĻā§āĻļāĻžāĻŦāĻ˛ā§ āĻŦāĻŋāĻāĻžāĻāĻāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻĒāĻĄāĻŧā§āĻ¨, āĻā§āĻ˛ā§āĻ¨ linux/bpf.h
linux/bpf_common.h
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.c
āĻ¨ā§āĻāĻ˛āĻŋāĻāĻ āĻ¸āĻā§āĻā§āĻ° āĻāĻāĻ¤ā§ āĻ¸ā§āĻŦāĻžāĻāĻ¤āĻŽ
āĻāĻāĻāĻŋ āĻ¨ā§āĻāĻ˛āĻŋāĻāĻ āĻ¸āĻā§āĻ āĻāĻžāĻāĻĒ āĻā§āĻ˛ā§āĻ¨ 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
/clang
pahole
- āĻāĻ° āĻŽā§āĻ˛
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/pahole
BPF āĻ¨āĻŋāĻ¯āĻŧā§ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛
BPF āĻāĻ° āĻ¸āĻŽā§āĻāĻžāĻŦāĻ¨āĻžāĻā§āĻ˛āĻŋ āĻ āĻ¨ā§āĻŦā§āĻˇāĻŖ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻāĻŽāĻŋ āĻāĻŽāĻžāĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻŽā§āĻ˛ āĻāĻāĻ¤ā§āĻ° āĻāĻ°āĻ¤ā§ āĻāĻžāĻāĨ¤ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻāĻžāĻŦā§ āĻŦāĻ˛āĻ¤ā§ āĻā§āĻ˛ā§, āĻāĻāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻ¨āĻ¯āĻŧ, āĻ¯ā§āĻšā§āĻ¤ā§ āĻāĻĒāĻ¨āĻŋ āĻĄāĻŋāĻ¸ā§āĻā§āĻ°āĻŋāĻŦāĻŋāĻāĻļāĻ¨ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ā§ BPF āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻā§āĻ˛āĻŋ āĻāĻŽā§āĻĒāĻžāĻāĻ˛ āĻāĻŦāĻ āĻ˛ā§āĻĄ āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻŦā§āĻ¨, āĻ¤āĻŦā§, āĻāĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻĨāĻžāĻāĻ˛ā§ āĻāĻĒāĻ¨āĻŋ āĻ¸āĻ°ā§āĻŦāĻļā§āĻˇ BPF āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯āĻā§āĻ˛āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŦā§āĻ¨, āĻ¯āĻž āĻāĻĒāĻ¨āĻžāĻ° āĻŦāĻŋāĻ¤āĻ°āĻŖā§ āĻŽāĻžāĻ¸ā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻ¸āĻ°ā§āĻŦā§āĻ¤ā§āĻ¤āĻŽāĻāĻžāĻŦā§ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻšāĻŦā§āĨ¤ , āĻ āĻĨāĻŦāĻž, āĻāĻŋāĻā§ āĻĄāĻŋāĻŦāĻžāĻāĻŋāĻ āĻā§āĻ˛ā§āĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻ āĻĻā§āĻ° āĻāĻŦāĻŋāĻˇā§āĻ¯āĻ¤ā§ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻāĻ°āĻž āĻšāĻŦā§ āĻ¨āĻžāĨ¤ āĻāĻāĻžāĻĄāĻŧāĻžāĻ, āĻāĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻŽā§āĻ˛ āĻā§āĻĄā§āĻ° āĻ¸āĻžāĻĨā§ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻž āĻā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖ āĻŽāĻ¨ā§ āĻāĻ°ā§āĨ¤
āĻāĻāĻāĻŋ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻāĻĒāĻ¨āĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨, āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻ¨āĻŋāĻā§āĻ, āĻāĻŦāĻ āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧāĻ¤, āĻāĻāĻāĻŋ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨ āĻĢāĻžāĻāĻ˛āĨ¤ BPF āĻ¨āĻŋāĻ¯āĻŧā§ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŽāĻ°āĻž āĻ¸ā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋ net
net-next
bpf
bpf-next
*-next
āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛āĻā§āĻ˛āĻŋ āĻ¤āĻžāĻ˛āĻŋāĻāĻžāĻā§āĻā§āĻ¤āĻĻā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻ
āĻ¸ā§āĻĨāĻŋāĻ°)āĨ¤
āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨ āĻĢāĻžāĻāĻ˛āĻā§āĻ˛āĻŋ āĻā§āĻāĻžāĻŦā§ āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻ¨āĻž āĻāĻ°āĻ¤ā§ āĻšāĻ¯āĻŧ āĻ¸ā§ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻĨāĻž āĻŦāĻ˛āĻž āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§āĻ° āĻ¸ā§āĻ¯ā§āĻā§āĻ° āĻŦāĻžāĻāĻ°ā§ - āĻāĻāĻŋ āĻ§āĻ°ā§ āĻ¨ā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧ āĻ¯ā§ āĻāĻĒāĻ¨āĻŋ āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§ āĻāĻāĻŋ āĻā§āĻāĻžāĻŦā§ āĻāĻ°āĻŦā§āĻ¨ āĻ¤āĻž āĻāĻžāĻ¨ā§āĻ¨, āĻ
āĻĨāĻŦāĻž
āĻāĻĒāĻ°ā§āĻ° āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛āĻā§āĻ˛āĻŋāĻ° āĻāĻāĻāĻŋ āĻĄāĻžāĻāĻ¨āĻ˛ā§āĻĄ āĻāĻ°ā§āĻ¨:
$ 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 -e
bpftool
āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§ āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻŦā§āĻļāĻŋ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻāĻāĻāĻŋāĻ˛āĻŋāĻāĻŋ āĻšāĻŦā§ āĻāĻāĻāĻŋāĻ˛āĻŋāĻāĻŋ 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 āĻāĻŦāĻ XDP āĻ°ā§āĻĢāĻžāĻ°ā§āĻ¨ā§āĻ¸ āĻāĻžāĻāĻĄ â āĻ¸āĻŋāĻ˛āĻŋāĻ¯āĻŧāĻžāĻŽ āĻĨā§āĻā§ BPF-āĻāĻ° āĻĄāĻā§āĻŽā§āĻ¨ā§āĻā§āĻļāĻ¨, āĻŦāĻž āĻāĻ°āĻ āĻ¸ā§āĻĒāĻˇā§āĻāĻāĻžāĻŦā§ āĻĄā§āĻ¯āĻžāĻ¨āĻŋāĻ¯āĻŧā§āĻ˛ āĻŦā§āĻ°ā§āĻāĻŽā§āĻ¯āĻžāĻ¨, BPF-āĻāĻ° āĻ āĻ¨ā§āĻ¯āĻ¤āĻŽ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻ¤āĻž āĻāĻŦāĻ āĻ°āĻā§āĻˇāĻŖāĻžāĻŦā§āĻā§āĻˇāĻŖāĻāĻžāĻ°ā§āĨ¤ āĻāĻāĻŋ āĻĒā§āĻ°āĻĨāĻŽ āĻā§āĻ°ā§āĻ¤āĻ° āĻŦāĻ°ā§āĻŖāĻ¨āĻžāĻā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻāĻāĻŋ, āĻ¯āĻž āĻ āĻ¨ā§āĻ¯āĻĻā§āĻ° āĻĨā§āĻā§ āĻāĻ˛āĻžāĻĻāĻž āĻ¯ā§ āĻĄā§āĻ¯āĻžāĻ¨āĻŋāĻ¯āĻŧā§āĻ˛ āĻ āĻŋāĻ āĻāĻžāĻ¨ā§āĻ¨ āĻ¯ā§ āĻ¤āĻŋāĻ¨āĻŋ āĻā§ āĻ˛āĻŋāĻāĻā§āĻ¨ āĻāĻŦāĻ āĻ¸ā§āĻāĻžāĻ¨ā§ āĻā§āĻ¨āĻ āĻā§āĻ˛ āĻ¨ā§āĻāĨ¤ āĻŦāĻŋāĻļā§āĻˇ āĻāĻ°ā§, āĻāĻ āĻ¨āĻĨāĻŋāĻāĻŋ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻāĻ°ā§ āĻāĻŋāĻāĻžāĻŦā§ XDP āĻāĻŦāĻ TC āĻ§āĻ°āĻŖā§āĻ° BPF āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻ¸ā§āĻĒāĻ°āĻŋāĻāĻŋāĻ¤ āĻāĻāĻāĻŋāĻ˛āĻŋāĻāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻžāĻ āĻāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧip
āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĨā§āĻā§iproute2
. -
āĻĄāĻā§āĻŽā§āĻ¨ā§āĻā§āĻļāĻ¨/networking/filter.txt â āĻā§āĻ˛āĻžāĻ¸āĻŋāĻ āĻāĻŦāĻ āĻ¤āĻžāĻ°āĻĒāĻ° āĻŦāĻ°ā§āĻ§āĻŋāĻ¤ BPF āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻĄāĻā§āĻŽā§āĻ¨ā§āĻā§āĻļāĻ¨ āĻ¸āĻš āĻāĻ¸āĻ˛ āĻĢāĻžāĻāĻ˛āĨ¤ āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ¸āĻŽāĻžāĻŦā§āĻļā§āĻ° āĻāĻžāĻˇāĻž āĻāĻŦāĻ āĻĒā§āĻ°āĻ¯ā§āĻā§āĻ¤āĻŋāĻāĻ¤ āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āĻ¯ā§āĻ° āĻŦāĻŋāĻļāĻĻ āĻāĻžāĻ¨āĻ¤ā§ āĻāĻžāĻ¨ āĻ¤āĻŦā§ āĻāĻāĻāĻŋ āĻāĻžāĻ˛ āĻĒāĻĄāĻŧāĻžāĨ¤ -
āĻĢā§āĻ¸āĻŦā§āĻ āĻĨā§āĻā§ BPF āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻŦā§āĻ˛āĻ . āĻāĻāĻŋ āĻā§āĻŦ āĻāĻŽāĻ āĻāĻĒāĻĄā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻŦā§ āĻ¯āĻĨāĻžāĻ¯āĻĨāĻāĻžāĻŦā§, āĻ¯ā§āĻŽāĻ¨ āĻāĻ˛ā§āĻā§āĻ¸āĻŋ āĻ¸ā§āĻāĻžāĻ°ā§āĻāĻ¯āĻŧā§āĻāĻ (āĻāĻŦāĻŋāĻĒāĻŋāĻāĻĢ-āĻāĻ° āĻ˛ā§āĻāĻ) āĻāĻŦāĻ āĻāĻ¨ā§āĻĻā§āĻ°āĻŋ āĻ¨āĻžāĻā§āĻ°āĻŋāĻā§ - (āĻ°āĻā§āĻˇāĻŖāĻžāĻŦā§āĻā§āĻˇāĻŖāĻāĻžāĻ°ā§) āĻ¸ā§āĻāĻžāĻ¨ā§ āĻ˛āĻŋāĻā§āĻā§āĻ¨āĨ¤libbpf
). -
bpftool āĻāĻ° āĻā§āĻĒāĻ¨ā§āĻ¯āĻŧāĻ¤āĻž . Bpftool āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻžāĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻāĻŦāĻ āĻā§āĻĒāĻ¨ā§āĻ¯āĻŧāĻ¤āĻž āĻ¸āĻš Quentin Monnet āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻŦāĻŋāĻ¨ā§āĻĻāĻ¨āĻŽā§āĻ˛āĻ āĻā§āĻāĻāĻžāĻ° āĻĨā§āĻ°ā§āĻĄāĨ¤ -
BPF-āĻ āĻĄā§āĻŦ: āĻĒāĻĄāĻŧāĻžāĻ° āĻāĻĒāĻžāĻĻāĻžāĻ¨ā§āĻ° āĻāĻāĻāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻāĻž . Quentin Monnet āĻĨā§āĻā§ BPF āĻĄāĻā§āĻŽā§āĻ¨ā§āĻā§āĻļāĻ¨ā§āĻ° āĻ˛āĻŋāĻā§āĻāĻā§āĻ˛āĻŋāĻ° āĻāĻāĻāĻŋ āĻŦāĻŋāĻļāĻžāĻ˛ (āĻāĻŦāĻ āĻāĻāĻ¨āĻ āĻŦāĻāĻžāĻ¯āĻŧ āĻ°āĻžāĻāĻž) āĻ¤āĻžāĻ˛āĻŋāĻāĻžāĨ¤
āĻāĻ¤ā§āĻ¸: www.habr.com