āϛ⧋āϟāĻĻ⧇āϰ āϜāĻ¨ā§āϝ BPF, āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ‚āĻļ: āĻŦāĻ°ā§āϧāĻŋāϤ BPF

āĻļ⧁āϰ⧁āϤ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋ āĻ›āĻŋāϞ āĻāĻŦāĻ‚ āϏ⧇āϟāĻŋāϰ āύāĻžāĻŽ āĻ›āĻŋāϞ āĻŦāĻŋāĻĒāĻŋāĻāĻĢāĨ¤ āφāĻŽāϰāĻž āϤāĻžāϰ āĻĻāĻŋāϕ⧇ āϤāĻžāĻ•āĻžāϞāĻžāĻŽ āφāϗ⧇, āĻāχ āϏāĻŋāϰāĻŋāĻœā§‡āϰ āĻ“āĻ˛ā§āĻĄ āĻŸā§‡āĻ¸ā§āϟāĻžāĻŽā§‡āĻ¨ā§āϟ āύāĻŋāĻŦāĻ¨ā§āϧ. 2013 āϏāĻžāϞ⧇, āφāϞ⧇āĻ•ā§āϏāĻŋ āĻ¸ā§āϟāĻžāϰ⧋āĻ­āϝāĻŧ⧇āϟāĻ­ āĻāĻŦāĻ‚ āĻĄā§āϝāĻžāύāĻŋāϝāĻŧ⧇āϞ āĻŦā§‹āĻ°ā§āĻ•āĻŽā§āϝāĻžāύ⧇āϰ āĻĒā§āϰāĻšā§‡āĻˇā§āϟāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡, āĻāϟāĻŋāϰ āĻāĻ•āϟāĻŋ āωāĻ¨ā§āύāϤ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ, āφāϧ⧁āύāĻŋāĻ• 64-āĻŦāĻŋāϟ āĻŽā§‡āĻļāĻŋāύ⧇āϰ āϜāĻ¨ā§āϝ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āϝāĻž āϞāĻŋāύāĻžāĻ•ā§āϏ āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ āĻāχ āύāϤ⧁āύ āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋāϟāĻŋāϕ⧇ āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤāĻ­āĻžāĻŦ⧇ āĻ…āĻ­ā§āϝāĻ¨ā§āϤāϰ⧀āĻŖ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻŦāϞāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āϤāĻžāϰāĻĒāϰ⧇ āύāĻžāĻŽāĻ•āϰāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻ•ā§āϏāĻŸā§‡āĻ¨ā§āĻĄā§‡āĻĄ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ, āĻāĻŦāĻ‚ āĻāĻ–āύ, āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ• āĻŦāĻ›āϰ āĻĒāϰ⧇, āϏāĻŦāĻžāχ āĻāϟāĻŋāϕ⧇ āϕ⧇āĻŦāϞ āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻŦāϞ⧇āĨ¤

āĻŽā§‹āϟāĻžāĻŽā§āϟāĻŋāĻ­āĻžāĻŦ⧇ āĻŦāϞāϤ⧇ āϗ⧇āϞ⧇, BPF āφāĻĒāύāĻžāϕ⧇ āϞāĻŋāύāĻžāĻ•ā§āϏ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻ¸ā§āĻĒ⧇āϏ⧇ āύāĻŋāĻ°ā§āĻŦāĻŋāϚāĻžāϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻĻā§āĻŦāĻžāϰāĻž āϏāϰāĻŦāϰāĻžāĻšāĻ•ā§ƒāϤ āϕ⧋āĻĄ āϚāĻžāϞāĻžāύ⧋āϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āϝāĻŧ āĻāĻŦāĻ‚ āύāϤ⧁āύ āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰāϟāĻŋ āĻāϤāϟāĻžāχ āϏāĻĢāϞ āĻšāϝāĻŧ⧇āϛ⧇ āϝ⧇ āĻāϰ āϏāĻŽāĻ¸ā§āϤ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāĻžāĻĻ⧇āϰ āφāϰāĻ“ āĻāĻ• āĻĄāϜāύ āύāĻŋāĻŦāĻ¨ā§āϧ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāĻŦ⧇āĨ¤ (āĻāĻ•āĻŽāĻžāĻ¤ā§āϰ āϜāĻŋāύāĻŋāϏ āϝāĻž āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāϰāĻž āĻ­āĻžāϞ āĻ•āϰ⧇āύāĻŋ, āφāĻĒāύāĻŋ āύ⧀āĻšā§‡āϰ āĻ•āĻ°ā§āĻŽāĻ•ā§āώāĻŽāϤāĻž āϕ⧋āĻĄā§‡ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻšā§āϛ⧇āύ, āĻāĻ•āϟāĻŋ āĻļāĻžāϞ⧀āύ āϞ⧋āĻ—ā§‹ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻ›āĻŋāϞāĨ¤)

āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧāϟāĻŋ BPF āĻ­āĻžāĻ°ā§āϚ⧁āϝāĻŧāĻžāϞ āĻŽā§‡āĻļāĻŋāύ⧇āϰ āĻ—āĻ āύ, BPF āĻāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ•āĻžāĻ°ā§āύ⧇āϞ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ, āĻĄā§‡āϭ⧇āϞāĻĒāĻŽā§‡āĻ¨ā§āϟ āϟ⧁āϞāϏ, āϏ⧇āχāϏāĻžāĻĨ⧇ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ•ā§āώāĻŽāϤāĻžāϗ⧁āϞāĻŋāϰ āĻāĻ•āϟāĻŋ āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤ, āϖ⧁āĻŦ āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤ āĻ“āĻ­āĻžāϰāĻ­āĻŋāω āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰ⧇, āϝ⧇āĻŽāύ BPF āĻāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ• āĻĒā§āϰāϝāĻŧā§‹āϗ⧇āϰ āĻ—āĻ­ā§€āϰ āĻ…āĻ§ā§āϝāϝāĻŧāύ⧇āϰ āϜāĻ¨ā§āϝ āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āϝāĻž āϝāĻž āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāĻŦ⧇āĨ¤
āϛ⧋āϟāĻĻ⧇āϰ āϜāĻ¨ā§āϝ BPF, āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ‚āĻļ: āĻŦāĻ°ā§āϧāĻŋāϤ BPF

āύāĻŋāĻŦāĻ¨ā§āϧ⧇āϰ āϏāĻžāϰāĻžāĻ‚āĻļ

BPF āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ⧇āϰ āĻĒāϰāĻŋāϚāĻŋāϤāĻŋāĨ¤ āĻĒā§āϰāĻĨāĻŽā§‡, āφāĻŽāϰāĻž BPF āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ⧇āϰ āĻāĻ•āϟāĻŋ āĻĒāĻžāĻ–āĻŋāϰ āĻšā§‹āϖ⧇āϰ āĻĻ⧃āĻˇā§āϟāĻŋāĻ­āĻ™ā§āĻ—āĻŋ āύ⧇āĻŦ āĻāĻŦāĻ‚ āĻŽā§‚āϞ āωāĻĒāĻžāĻĻāĻžāύāϗ⧁āϞāĻŋāϰ āϰ⧂āĻĒāϰ⧇āĻ–āĻž āĻĻ⧇āĻŦāĨ¤

BPF āĻ­āĻžāĻ°ā§āϚ⧁āϝāĻŧāĻžāϞ āĻŽā§‡āĻļāĻŋāύ⧇āϰ āϰ⧇āϜāĻŋāĻ¸ā§āϟāĻžāϰ āĻāĻŦāĻ‚ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāĨ¤ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āϏāĻžāĻŽāĻ—ā§āϰāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āϝ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϧāĻžāϰāĻŖāĻž āĻĨāĻžāĻ•āĻžāϝāĻŧ, āφāĻŽāϰāĻž BPF āĻ­āĻžāĻ°ā§āϚ⧁āϝāĻŧāĻžāϞ āĻŽā§‡āĻļāĻŋāύ⧇āϰ āĻ—āĻ āύ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻŦāĨ¤

BPF āĻŦāĻ¸ā§āϤ⧁āϰ āĻœā§€āĻŦāύāϚāĻ•ā§āϰ, bpffs āĻĢāĻžāχāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāĨ¤ āĻāχ āĻŦāĻŋāĻ­āĻžāϗ⧇, āφāĻŽāϰāĻž BPF āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ - āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻāĻŦāĻ‚ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰāϗ⧁āϞāĻŋāϰ āĻœā§€āĻŦāύāϚāĻ•ā§āϰāϕ⧇ āϘāύāĻŋāĻˇā§āĻ āĻ­āĻžāĻŦ⧇ āĻĻ⧇āĻ–āĻŦāĨ¤

āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻžāĨ¤ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āĻ•āĻŋāϛ⧁ āĻŦā§‹āĻāĻžāϰ āϏāĻžāĻĨ⧇ āϏāĻžāĻĨ⧇, āφāĻŽāϰāĻž āĻ…āĻŦāĻļ⧇āώ⧇ āĻĻ⧇āĻ–āĻŦ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻļ⧇āώ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ¸ā§āĻĨāĻžāύ āĻĨ⧇āϕ⧇ āĻŦāĻ¸ā§āϤ⧁āϗ⧁āϞāĻŋ āϤ⧈āϰāĻŋ āĻāĻŦāĻ‚ āĻŽā§āϝāĻžāύāĻŋāĻĒ⧁āϞ⧇āϟ āĻ•āϰāĻž āϝāĻžāϝāĻŧ - bpf(2).

ĐŸĐ¸ŅˆĐĩĐŧ ĐŋŅ€ĐžĐŗŅ€Đ°ĐŧĐŧŅ‹ BPF ҁ ĐŋĐžĐŧĐžŅ‰ŅŒŅŽ libbpf. āĻ…āĻŦāĻļā§āϝāχ, āφāĻĒāύāĻŋ āĻāĻ•āϟāĻŋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϞāĻŋāĻ–āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻāϟāĻž āĻ•āĻ āĻŋāύ. āφāϰ⧋ āĻŦāĻžāĻ¸ā§āϤāĻŦāϏāĻŽā§āĻŽāϤ āĻĻ⧃āĻļā§āϝ⧇āϰ āϜāĻ¨ā§āϝ, āĻĒāĻžāϰāĻŽāĻžāĻŖāĻŦāĻŋāĻ• āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāĻžāϰāϰāĻž āĻāĻ•āϟāĻŋ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āϛ⧇ libbpf. āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āĻŽā§ŒāϞāĻŋāĻ• BPF āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āĻ•āĻ™ā§āĻ•āĻžāϞ āϤ⧈āϰāĻŋ āĻ•āϰāĻŦ āϝāĻž āφāĻŽāϰāĻž āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āωāĻĻāĻžāĻšāϰāĻŖāϗ⧁āϞāĻŋāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦāĨ¤

āĻ•āĻžāĻ°ā§āύ⧇āϞ āϏāĻžāĻšāĻžāĻ¯ā§āϝāĻ•āĻžāϰ⧀āĨ¤ āĻāĻ–āĻžāύ⧇ āφāĻŽāϰāĻž āĻļāĻŋāĻ–āĻŦ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻšā§‡āĻ˛ā§āĻĒāĻžāϰ āĻĢāĻžāĻ‚āĻļāύāϗ⧁āϞāĻŋ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ - āĻāĻ•āϟāĻŋ āϟ⧁āϞ āϝāĻž āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ āϏāĻš, āĻŽā§ŒāϞāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ•ā§āϞāĻžāϏāĻŋāϕ⧇āϰ āϤ⧁āϞāύāĻžāϝāĻŧ āύāϤ⧁āύ BPF āĻāϰ āĻ•ā§āώāĻŽāϤāĻžāϗ⧁āϞāĻŋāϕ⧇ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻ•āϰ⧇⧎

BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻĨ⧇āϕ⧇ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ. āĻāχ āĻŽā§āĻšā§āĻ°ā§āϤ⧇, āφāĻŽāϰāĻž āĻ āĻŋāĻ• āϕ⧀āĻ­āĻžāĻŦ⧇ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻŽāύ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ āϤāĻž āĻŦā§‹āĻāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāϰāĻž āϝāĻĨ⧇āĻˇā§āϟ āϜāĻžāύāĻŦāĨ¤ āĻāĻŦāĻ‚ āφāϏ⧁āύ āĻŽāĻšāĻžāύ āĻāĻŦāĻ‚ āĻļāĻ•ā§āϤāĻŋāĻļāĻžāϞ⧀ āϝāĻžāϚāĻžāχāĻ•āĻžāϰ⧀āϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ āĻĻā§āϰ⧁āϤ āωāρāĻ•āĻŋ āĻĻ⧇āĻ“āϝāĻŧāĻž āϝāĻžāĻ•āĨ¤

āĻĄā§‡āϭ⧇āϞāĻĒāĻŽā§‡āĻ¨ā§āϟ āϟ⧁āϞāϏ. āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ āχāωāϟāĻŋāϞāĻŋāϟāĻŋ āĻāĻŦāĻ‚ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻāĻ•āĻ¤ā§āϰ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ āϏ⧇ āĻŦāĻŋāώāϝāĻŧ⧇ āϏāĻšāĻžāϝāĻŧāϤāĻž āĻŦāĻŋāĻ­āĻžāĻ—āĨ¤

āωāĻĒāϏāĻ‚āĻšāĻžāϰ āύāĻŋāĻŦāĻ¨ā§āϧ⧇āϰ āĻļ⧇āώ⧇, āϝāĻžāϰāĻž āĻāϤāĻĻā§‚āϰ āĻĒāĻĄāĻŧ⧇āϛ⧇āύ āϤāĻžāϰāĻž āĻ…āύ⧁āĻĒā§āϰ⧇āϰāĻŖāĻžāĻĻāĻžāϝāĻŧāĻ• āĻļāĻŦā§āĻĻāϗ⧁āϞāĻŋ āĻāĻŦāĻ‚ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āύāĻŋāĻŦāĻ¨ā§āϧāϗ⧁āϞāĻŋāϤ⧇ āϕ⧀ āϘāϟāĻŦ⧇ āϤāĻžāϰ āĻāĻ•āϟāĻŋ āϏāĻ‚āĻ•ā§āώāĻŋāĻĒā§āϤ āĻŦāĻŋāĻŦāϰāĻŖ āĻĒāĻžāĻŦ⧇āύāĨ¤ āϝāĻžāĻĻ⧇āϰ āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻ•āϤāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āĻĒ⧇āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āχāĻšā§āĻ›āĻž āĻŦāĻž āĻ•ā§āώāĻŽāϤāĻž āύ⧇āχ āϤāĻžāĻĻ⧇āϰ āϜāĻ¨ā§āϝ āφāĻŽāϰāĻž āĻ¸ā§āĻŦ-āĻ…āĻ§ā§āϝāϝāĻŧāύ⧇āϰ āϜāĻ¨ā§āϝ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āϞāĻŋāĻ™ā§āĻ• āϤāĻžāϞāĻŋāĻ•āĻžāϭ⧁āĻ•ā§āϤ āĻ•āϰāĻŦāĨ¤

BPF āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ⧇āϰ āĻĒāϰāĻŋāϚāĻŋāϤāĻŋ

āφāĻŽāϰāĻž BPF āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āφāϗ⧇, āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āĻļ⧇āώ āĻŦāĻžāϰ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰāĻŦ (āĻ“āĻš) āĻ•ā§āϞāĻžāϏāĻŋāĻ• BPF, āϝāĻž RISC āĻŽā§‡āĻļāĻŋāύ⧇āϰ āφāĻŦāĻŋāĻ°ā§āĻ­āĻžāĻŦ⧇āϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻšāĻŋāϏāĻžāĻŦ⧇ āĻŦāĻŋāĻ•āĻļāĻŋāϤ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ āĻāĻŦāĻ‚ āĻĻāĻ•ā§āώ āĻĒā§āϝāĻžāϕ⧇āϟ āĻĢāĻŋāĻ˛ā§āϟāĻžāϰāĻŋāĻ‚āϝāĻŧ⧇āϰ āϏāĻŽāĻ¸ā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰ⧇āĻ›āĻŋāϞāĨ¤ āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰāϟāĻŋ āĻāϤāϟāĻžāχ āϏāĻĢāϞ āĻšāϝāĻŧ⧇ āωāϠ⧇āϛ⧇ āϝ⧇, āĻŦāĻžāĻ°ā§āĻ•āϞ⧇ āχāωāύāĻŋāĻ•ā§āϏ-āĻāϰ āύāĻŦā§āĻŦāχāϝāĻŧ⧇āϰ āĻĻāĻļāϕ⧇ āϜāĻ¨ā§āĻŽ āύ⧇āĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇, āĻāϟāĻŋ āĻŦ⧇āĻļāĻŋāϰāĻ­āĻžāĻ— āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ…āĻĒāĻžāϰ⧇āϟāĻŋāĻ‚ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻĒā§‹āĻ°ā§āϟ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āĻŦāĻŋāĻļ⧇āϰ āĻĻāĻļāϕ⧇ āϟāĻŋāϕ⧇ āĻ›āĻŋāϞ āĻāĻŦāĻ‚ āĻāĻ–āύāĻ“ āύāϤ⧁āύ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϖ⧁āρāĻœā§‡ āĻĒāĻžāĻšā§āϛ⧇āĨ¤

64-āĻŦāĻŋāϟ āĻŽā§‡āĻļāĻŋāύ⧇āϰ āϏāĻ°ā§āĻŦāĻŦā§āϝāĻžāĻĒā§€āϤāĻž, āĻ•ā§āϞāĻžāωāĻĄ āĻĒāϰāĻŋāώ⧇āĻŦāĻž āĻāĻŦāĻ‚ SDN āϤ⧈āϰāĻŋāϰ āϜāĻ¨ā§āϝ āϏāϰāĻžā§āϜāĻžāĻŽāϗ⧁āϞāĻŋāϰ āĻŦāĻ°ā§āϧāĻŋāϤ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧāϤāĻžāϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻšāĻŋāϏāĻžāĻŦ⧇ āύāϤ⧁āύ BPF āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ (SāĻ…āĻĢāĻžāϰ-dāχāĻĢāĻžāχāύāĻĄ nāĻ•āĻžāϜ āĻ•āϰāĻž)āĨ¤ āĻ•ā§āϞāĻžāϏāĻŋāĻ• BPF-āĻāϰ āĻāĻ•āϟāĻŋ āωāĻ¨ā§āύāϤ āĻĒā§āϰāϤāĻŋāĻ¸ā§āĻĨāĻžāĻĒāύ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻ•āĻžāĻ°ā§āύ⧇āϞ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āχāĻžā§āϜāĻŋāύāĻŋāϝāĻŧāĻžāϰāĻĻ⧇āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻŦāĻŋāĻ•āĻļāĻŋāϤ, āύāϤ⧁āύ BPF āφāĻ•ā§āώāϰāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ›āϝāĻŧ āĻŽāĻžāϏ āĻĒāϰ⧇ āϞāĻŋāύāĻžāĻ•ā§āϏ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽāϗ⧁āϞāĻŋāϕ⧇ āĻŸā§āϰ⧇āϏ āĻ•āϰāĻžāϰ āĻ•āĻ āĻŋāύ āĻ•āĻžāĻœā§‡ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϗ⧁āϞāĻŋ āϖ⧁āρāĻœā§‡ āĻĒ⧇āϝāĻŧ⧇āĻ›āĻŋāϞ, āĻāĻŦāĻ‚ āĻāĻ–āύ, āĻāϰ āωāĻĒāĻ¸ā§āĻĨāĻŋāϤāĻŋāϰ āĻ›āϝāĻŧ āĻŦāĻ›āϰ āĻĒāϰ⧇, āφāĻŽāĻžāĻĻ⧇āϰ āĻāĻ•āϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āύāĻŋāĻŦāĻ¨ā§āϧ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāĻŦ⧇ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āϧāϰāϪ⧇āϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϤāĻžāϞāĻŋāĻ•āĻžāϭ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύāĨ¤

āĻŽāϜāĻžāϰ āĻ›āĻŦāĻŋ

āĻāϰ āĻŽā§‚āϞ āĻ…āĻ‚āĻļ⧇, BPF āĻšāϞ āĻāĻ•āϟāĻŋ āĻ¸ā§āϝāĻžāĻ¨ā§āĻĄāĻŦāĻ•ā§āϏ āĻ­āĻžāĻ°ā§āϚ⧁āϝāĻŧāĻžāϞ āĻŽā§‡āĻļāĻŋāύ āϝāĻž āφāĻĒāύāĻžāϕ⧇ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻžāϰ āϏāĻžāĻĨ⧇ āφāĻĒā§‹āϏ āύāĻž āĻ•āϰ⧇ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻ¸ā§āĻĒ⧇āϏ⧇ "āĻ¸ā§āĻŦ⧇āĻšā§āĻ›āĻžāϚāĻžāϰ⧀" āϕ⧋āĻĄ āϚāĻžāϞāĻžāύ⧋āϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āϝāĻŧāĨ¤ BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋ āχāωāϜāĻžāϰ āĻ¸ā§āĻĒ⧇āϏ⧇ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ, āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇ āϞ⧋āĻĄ āĻ•āϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āĻ•āĻŋāϛ⧁ āχāϭ⧇āĻ¨ā§āϟ āϏ⧋āĻ°ā§āϏ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻĨāĻžāϕ⧇āĨ¤ āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ āĻšāϤ⧇ āĻĒāĻžāϰ⧇, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻāĻ•āϟāĻŋ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϝāĻžāϕ⧇āϟ āϏāϰāĻŦāϰāĻžāĻš āĻ•āϰāĻž, āĻ•āĻŋāϛ⧁ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻĢāĻžāĻ‚āĻļāύ āϚāĻžāϞ⧁ āĻ•āϰāĻž āχāĻ¤ā§āϝāĻžāĻĻāĻŋāĨ¤ āĻāĻ•āϟāĻŋ āĻĒā§āϝāĻžāϕ⧇āĻœā§‡āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āĻĒā§āϝāĻžāϕ⧇āĻœā§‡āϰ āĻĄā§‡āϟāĻž āĻāĻŦāĻ‚ āĻŽā§‡āϟāĻžāĻĄā§‡āϟāĻž āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻĨāĻžāĻ•āĻŦ⧇ (āĻĒāĻĄāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻŦāĻ‚ āϏāĻŽā§āĻ­āĻŦāϤ āϞ⧇āĻ–āĻžāϰ āϜāĻ¨ā§āϝ, āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϧāϰāϪ⧇āϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇); āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻĢāĻžāĻ‚āĻļāύ āϚāĻžāϞāĻžāύ⧋āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻāϰ āφāĻ°ā§āϗ⧁āĻŽā§‡āĻ¨ā§āϟāϗ⧁āϞāĻŋ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻŽā§‡āĻŽāϰāĻŋ, āχāĻ¤ā§āϝāĻžāĻĻāĻŋ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟāĻžāϰ āϏāĻš āĻĢāĻžāĻ‚āĻļāύ

āφāϏ⧁āύ āĻāχ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϟāĻŋ āϘāύāĻŋāĻˇā§āĻ āĻ­āĻžāĻŦ⧇ āĻĻ⧇āϖ⧇ āύ⧇āĻ“āϝāĻŧāĻž āϝāĻžāĻ•āĨ¤ āĻļ⧁āϰ⧁ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āφāϏ⧁āύ āĻ•ā§āϞāĻžāϏāĻŋāĻ• āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĨ⧇āϕ⧇ āĻĒā§āϰāĻĨāĻŽ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ•āĻĨāĻž āĻŦāϞāĻŋ, āϝ⧇ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻ…ā§āϝāĻžāϏ⧇āĻŽā§āĻŦāϞāĻžāϰ⧇ āϞ⧇āĻ–āĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ āύāϤ⧁āύ āϏāĻ‚āĻ¸ā§āĻ•āϰāϪ⧇, āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰāϟāĻŋ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ āϝāĻžāϤ⧇ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋ āωāĻšā§āϚ-āĻ¸ā§āϤāϰ⧇āϰ āĻ­āĻžāώāĻžāϝāĻŧ āϞ⧇āĻ–āĻž āϝāĻžāϝāĻŧ, āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ•āĻ­āĻžāĻŦ⧇, āĻ…āĻŦāĻļā§āϝāχ, āϏāĻŋ-āϤ⧇āĨ¤ āĻāϰ āϜāĻ¨ā§āϝ, llvm-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻžāĻ•āĻāĻ¨ā§āĻĄ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āϝāĻž āφāĻĒāύāĻžāϕ⧇ BPF āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āĻŦāĻžāχāϟāϕ⧋āĻĄ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧāĨ¤

āϛ⧋āϟāĻĻ⧇āϰ āϜāĻ¨ā§āϝ BPF, āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ‚āĻļ: āĻŦāĻ°ā§āϧāĻŋāϤ BPF

BPF āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰāϟāĻŋ āĻĄāĻŋāϜāĻžāχāύ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āφāĻ‚āĻļāĻŋāĻ•āĻ­āĻžāĻŦ⧇, āφāϧ⧁āύāĻŋāĻ• āĻŽā§‡āĻļāĻŋāύ⧇ āĻĻāĻ•ā§āώāϤāĻžāϰ āϏāĻžāĻĨ⧇ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝāĨ¤ āĻāχ āĻ•āĻžāϜāϟāĻŋ āĻŦāĻžāĻ¸ā§āϤāĻŦ⧇ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, BPF āĻŦāĻžāχāϟāϕ⧋āĻĄ, āĻāĻ•āĻŦāĻžāϰ āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇ āϞ⧋āĻĄ āĻ•āϰāĻž āĻšāϞ⧇, āĻāĻ•āϟāĻŋ JIT āĻ•āĻŽā§āĻĒāĻžāχāϞāĻžāϰ (JUst In Time)āĨ¤ āĻĒāϰāĻŦāĻ°ā§āϤ⧀, āϝāĻĻāĻŋ āφāĻĒāύāĻŋ āĻŽāύ⧇ āĻ•āϰ⧇āύ, āĻ•ā§āϞāĻžāϏāĻŋāĻ• BPF-āĻ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇ āϞ⧋āĻĄ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ āĻāĻŦāĻ‚ āχāϭ⧇āĻ¨ā§āϟ āωāĻ¤ā§āϏ⧇āϰ āϏāĻžāĻĨ⧇ āĻĒāĻžāϰāĻŽāĻžāĻŖāĻŦāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ - āĻāĻ•āϟāĻŋ āĻāĻ•āĻ• āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞ⧇āϰ āĻĒā§āϰāϏāĻ™ā§āϗ⧇āĨ¤ āύāϤ⧁āύ āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ⧇, āĻāϟāĻŋ āĻĻ⧁āϟāĻŋ āĻĒāĻ°ā§āϝāĻžāϝāĻŧ⧇ āϘāĻŸā§‡ - āĻĒā§āϰāĻĨāĻŽāϤ, āϕ⧋āĻĄāϟāĻŋ āĻāĻ•āϟāĻŋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇ āϞ⧋āĻĄ āĻ•āϰāĻž āĻšāϝāĻŧ bpf(2)āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ⧇, āĻĒāϰāĻŦāĻ°ā§āϤ⧀āϤ⧇, āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āĻĒā§āϰāĻ•āĻžāϰ⧇āϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡, āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ āωāĻ¤ā§āϏ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧇āĨ¤

āĻāĻ–āĻžāύ⧇ āĻĒāĻžāĻ āϕ⧇āϰ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻļā§āύ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇: āĻāϟāĻž āĻ•āĻŋ āϏāĻŽā§āĻ­āĻŦ āĻ›āĻŋāϞ? āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻāχ āϧāϰāύ⧇āϰ āϕ⧋āĻĄ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻ•āϰāĻžāϰ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻž āĻšāϝāĻŧ? āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϞ⧋āĻĄ āĻ•āϰāĻžāϰ āĻĒāĻ°ā§āϝāĻžāϝāĻŧ āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāĻ°ā§āĻŦāĻžāĻšā§‡āϰ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻž āĻšāϝāĻŧ āϝāĻžāϕ⧇ āϭ⧇āϰāĻŋāĻĢāĻžāϝāĻŧāĻžāϰ āĻŦāϞāĻž āĻšāϝāĻŧ (āχāĻ‚āϰ⧇āϜāĻŋāϤ⧇ āĻāχ āĻĒāĻ°ā§āϝāĻžāϝāĻŧāϟāĻŋāϕ⧇ āϭ⧇āϰāĻŋāĻĢāĻžāϝāĻŧāĻžāϰ āĻŦāϞāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āφāĻŽāĻŋ āχāĻ‚āϰ⧇āϜāĻŋ āĻļāĻŦā§āĻĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĨāĻžāĻ•āĻŦ):

āϛ⧋āϟāĻĻ⧇āϰ āϜāĻ¨ā§āϝ BPF, āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ‚āĻļ: āĻŦāĻ°ā§āϧāĻŋāϤ BPF

āϝāĻžāϚāĻžāχāĻ•āĻžāϰ⧀ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŸā§āϝāĻžāϟāĻŋāĻ• āĻŦāĻŋāĻļā§āϞ⧇āώāĻ• āϝāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧇ āϝ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇āϰ āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒāϕ⧇ āĻŦā§āϝāĻžāĻšāϤ āĻ•āϰ⧇ āύāĻžāĨ¤ āϝāĻžāχāĻšā§‹āĻ•, āĻāϰ āĻ…āĻ°ā§āĻĨ āĻāχ āύāϝāĻŧ āϝ⧇ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āĻ•ā§āϰāĻŋāϝāĻŧāĻžāĻ•āϞāĻžāĻĒ⧇ āĻšāĻ¸ā§āϤāĻ•ā§āώ⧇āĻĒ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻž - BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋ, āĻĒā§āϰāĻ•āĻžāϰ⧇āϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇, āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻŽā§‡āĻŽāϰāĻŋāϰ āĻŦāĻŋāĻ­āĻžāĻ—āϗ⧁āϞāĻŋ āĻĒāĻĄāĻŧāϤ⧇ āĻāĻŦāĻ‚ āĻĒ⧁āύāĻ°ā§āϞāĻŋāĻ–āύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āĻĢāĻžāĻ‚āĻļāύ⧇āϰ āĻŽāĻžāύāϗ⧁āϞāĻŋ āĻĢ⧇āϰāϤ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇, āĻ›āĻžāρāϟāĻž, āϏāĻ‚āϝ⧋āϜāύ, āĻĒ⧁āύāĻ°ā§āϞāĻŋāĻ–āύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŦāĻ‚ āĻāĻŽāύāĻ•āĻŋ āĻĢāϰ⧋āϝāĻŧāĻžāĻ°ā§āĻĄ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻĒā§āϝāĻžāϕ⧇āϟāĨ¤ āϝāĻžāϚāĻžāχāĻ•āĻžāϰ⧀ āĻ—ā§āϝāĻžāϰāĻžāĻ¨ā§āϟāĻŋ āĻĻ⧇āϝāĻŧ āϝ⧇ āĻāĻ•āϟāĻŋ BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϚāĻžāϞāĻžāϞ⧇ āĻ•āĻžāĻ°ā§āύ⧇āϞāϟāĻŋ āĻ•ā§āĻ°ā§āϝāĻžāĻļ āĻšāĻŦ⧇ āύāĻž āĻāĻŦāĻ‚ āϝ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡, āύāĻŋāϝāĻŧāĻŽ āĻ…āύ⧁āϏāĻžāϰ⧇, āϞ⧇āĻ–āĻžāϰ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āϰāϝāĻŧ⧇āϛ⧇, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻāĻ•āϟāĻŋ āĻŦāĻšāĻŋāĻ°ā§āĻ—āĻžāĻŽā§€ āĻĒā§āϝāĻžāϕ⧇āĻŸā§‡āϰ āĻĄā§‡āϟāĻž, āĻĒā§āϝāĻžāϕ⧇āĻŸā§‡āϰ āĻŦāĻžāχāϰ⧇ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻŽā§‡āĻŽāϰāĻŋāϕ⧇ āĻ“āĻ­āĻžāϰāϰāĻžāχāϟ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāĻŦ⧇ āύāĻžāĨ¤ āφāĻŽāϰāĻž BPF āĻāϰ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āϏāĻŽāĻ¸ā§āϤ āωāĻĒāĻžāĻĻāĻžāύāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻĒāϰāĻŋāϚāĻŋāϤ āĻšāĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇ āϏāĻ‚āĻļā§āϞāĻŋāĻˇā§āϟ āĻŦāĻŋāĻ­āĻžāϗ⧇ āφāϰāĻ“ āĻāĻ•āϟ⧁ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤāĻ­āĻžāĻŦ⧇ āϝāĻžāϚāĻžāχāĻ•āĻžāϰ⧀āϕ⧇ āĻĻ⧇āĻ–āĻŦāĨ¤

āϤāĻžāĻšāϞ⧇ āφāĻŽāϰāĻž āĻ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϕ⧀ āĻļāĻŋāϖ⧇āĻ›āĻŋ? āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āϏāĻŋ-āϤ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϞ⧇āϖ⧇, āĻāĻ•āϟāĻŋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāϟāĻŋ āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇ āϞ⧋āĻĄ āĻ•āϰ⧇ bpf(2), āϝ⧇āĻ–āĻžāύ⧇ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āϝāĻžāϚāĻžāχāĻ•āĻžāϰ⧀ āĻĻā§āĻŦāĻžāϰāĻž āĻšā§‡āĻ• āĻ•āϰāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āύ⧇āϟāĻŋāĻ­ āĻŦāĻžāχāϟāϕ⧋āĻĄā§‡ āĻ…āύ⧁āĻŦāĻžāĻĻ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āϤāĻžāϰāĻĒāϰ⧇ āĻāĻ•āχ āĻŦāĻž āĻ…āĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋāϕ⧇ āχāϭ⧇āĻ¨ā§āϟ āωāĻ¤ā§āϏ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻ•āϰāĻž āĻļ⧁āϰ⧁ āĻ•āϰ⧇āĨ¤ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻ•āĻžāϰāϪ⧇ āĻŦ⧁āϟ āĻāĻŦāĻ‚ āϏāĻ‚āϝ⧋āĻ— āφāϞāĻžāĻĻāĻž āĻ•āϰāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύāĨ¤ āĻĒā§āϰāĻĨāĻŽāϤ, āĻāĻ•āϟāĻŋ āϭ⧇āϰāĻŋāĻĢāĻžāϝāĻŧāĻžāϰ āϚāĻžāϞāĻžāύ⧋ āϤ⧁āϞāύāĻžāĻŽā§‚āϞāĻ•āĻ­āĻžāĻŦ⧇ āĻŦā§āϝāϝāĻŧāĻŦāĻšā§āϞ āĻāĻŦāĻ‚ āĻāĻ•āχ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻāĻ•āĻžāϧāĻŋāĻ•āĻŦāĻžāϰ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰ⧇ āφāĻŽāϰāĻž āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻžāϰ⧇āϰ āϏāĻŽāϝāĻŧ āύāĻˇā§āϟ āĻ•āϰāĻŋāĨ¤ āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧāϤ, āĻ āĻŋāĻ• āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āϤāĻž āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇ āϤāĻžāϰ āĻĒā§āϰāĻ•āĻžāϰ⧇āϰ āωāĻĒāϰ, āĻāĻŦāĻ‚ āĻāĻ• āĻŦāĻ›āϰ āφāϗ⧇ āĻŦāĻŋāĻ•āĻļāĻŋāϤ āĻāĻ•āϟāĻŋ "āϏāĻ°ā§āĻŦāϜāύ⧀āύ" āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ āύāϤ⧁āύ āϧāϰāύ⧇āϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϜāĻ¨ā§āϝ āωāĻĒāϝ⧁āĻ•ā§āϤ āύāĻžāĻ“ āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ (āϝāĻĻāĻŋāĻ“ āĻāĻ–āύ āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āϝ āφāϰāĻ“ āĻĒāϰāĻŋāĻĒāĻ•ā§āĻ• āĻšāϝāĻŧ⧇ āωāĻ āϛ⧇, āĻāχ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏāϟāĻŋāϕ⧇ āĻ¸ā§āϤāϰ⧇ āĻāϕ⧀āĻ­ā§‚āϤ āĻ•āϰāĻžāϰ āĻāĻ•āϟāĻŋ āϧāĻžāϰāĻŖāĻž āϰāϝāĻŧ⧇āϛ⧇ libbpf.)

āĻŽāύ⧋āϝ⧋āĻ—ā§€ āĻĒāĻžāĻ āĻ• āϞāĻ•ā§āĻˇā§āϝ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āϝ⧇ āφāĻŽāϰāĻž āĻāĻ–āύāĻ“ āĻ›āĻŦāĻŋ āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧇āώ āĻ•āϰāĻŋāύāĻŋāĨ¤ āĻĒā§āϰāĻ•ā§ƒāϤāĻĒāĻ•ā§āώ⧇, āωāĻĒāϰ⧇āϰ āϏāĻŦāϗ⧁āϞāĻŋ āĻŦā§āϝāĻžāĻ–ā§āϝāĻž āĻ•āϰ⧇ āύāĻž āϕ⧇āύ BPF āĻŽā§ŒāϞāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ•ā§āϞāĻžāϏāĻŋāĻ• BPF āĻāϰ āϤ⧁āϞāύāĻžāϝāĻŧ āĻ›āĻŦāĻŋ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧇āĨ¤ āĻĻ⧁āϟāĻŋ āωāĻĻā§āĻ­āĻžāĻŦāύ āϝāĻž āωāĻ˛ā§āϞ⧇āĻ–āϝ⧋āĻ—ā§āϝāĻ­āĻžāĻŦ⧇ āĻĒā§āϰāϝ⧋āĻœā§āϝāϤāĻžāϰ āϏ⧁āϝ⧋āĻ—āϕ⧇ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻ•āϰ⧇ āϤāĻž āĻšāϞ āĻļ⧇āϝāĻŧāĻžāĻ°ā§āĻĄ āĻŽā§‡āĻŽāϰāĻŋ āĻāĻŦāĻ‚ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻšā§‡āĻ˛ā§āĻĒāĻžāϰ āĻĢāĻžāĻ‚āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻ•ā§āώāĻŽāϤāĻžāĨ¤ BPF-āĻ, āĻ­āĻžāĻ— āĻ•āϰāĻž āĻŽā§‡āĻŽāϰāĻŋ āϤāĻĨāĻžāĻ•āĻĨāĻŋāϤ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĒā§āϰāϝāĻŧā§‹āĻ— āĻ•āϰāĻž āĻšāϝāĻŧ - āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ API āĻāϰ āϏāĻžāĻĨ⧇ āĻ­āĻžāĻ— āĻ•āϰāĻž āĻĄā§‡āϟāĻž āĻ¸ā§āĻŸā§āϰāĻžāĻ•āϚāĻžāϰāĨ¤ āϤāĻžāϰāĻž āϏāĻŽā§āĻ­āĻŦāϤ āĻāχ āύāĻžāĻŽāϟāĻŋ āĻĒ⧇āϝāĻŧ⧇āϛ⧇ āĻ•āĻžāϰāĻŖ āĻĒā§āϰāĻĨāĻŽ āϧāϰāϪ⧇āϰ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰāϟāĻŋ āĻāĻ•āϟāĻŋ āĻšā§āϝāĻžāĻļ āĻŸā§‡āĻŦāĻŋāϞ āĻ›āĻŋāϞāĨ¤ āϤāĻžāϰāĻĒāϰ⧇ āĻ…ā§āϝāĻžāϰ⧇ āωāĻĒāĻ¸ā§āĻĨāĻŋāϤ āĻšāϝāĻŧ, āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ (āĻĒā§āϰāϤāĻŋ-āϏāĻŋāĻĒāĻŋāχāω) āĻšā§āϝāĻžāĻļ āĻŸā§‡āĻŦāĻŋāϞ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻ…ā§āϝāĻžāϰ⧇, āĻ…āύ⧁āϏāĻ¨ā§āϧāĻžāύ āĻ—āĻžāĻ›, āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋāϰ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟāĻžāϰ āϏāĻš āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ āĻāĻŦāĻ‚ āφāϰāĻ“ āĻ…āύ⧇āĻ• āĻ•āĻŋāϛ⧁āĨ¤ āĻāĻ–āύ āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āĻžāϛ⧇ āϝāĻž āφāĻ•āĻ°ā§āώāĻŖā§€āϝāĻŧ āϤāĻž āĻšāϞ BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋāϰ āĻāĻ–āύ āĻ•āϞāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻŦāϜāĻžāϝāĻŧ āϰāĻžāĻ–āĻžāϰ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ¸ā§āĻĨāĻžāύ⧇āϰ āϏāĻžāĻĨ⧇ āĻ­āĻžāĻ— āĻ•āϰāĻžāϰ āĻ•ā§āώāĻŽāϤāĻž āϰāϝāĻŧ⧇āϛ⧇⧎

āĻāĻ•āϟāĻŋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĨ⧇āϕ⧇ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāĻž āĻšāϝāĻŧ bpf(2), āĻāĻŦāĻ‚ āϏāĻžāĻšāĻžāĻ¯ā§āϝāĻ•āĻžāϰ⧀ āĻĢāĻžāĻ‚āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇ āϚāϞāĻŽāĻžāύ BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻĨ⧇āϕ⧇āĨ¤ āϤāĻĻ⧁āĻĒāϰāĻŋ, āϏāĻžāĻšāĻžāĻ¯ā§āϝāĻ•āĻžāϰ⧀āϰāĻž āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝāχ āύāϝāĻŧ, āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻ•ā§āώāĻŽāϤāĻžāϗ⧁āϞāĻŋ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝāĻ“ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇ āĻĒā§āϝāĻžāϕ⧇āϟ āĻĢāϰ⧋āϝāĻŧāĻžāĻ°ā§āĻĄ āĻ•āϰāϤ⧇, āĻĒāĻžāϰāĻĢ āχāϭ⧇āĻ¨ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇, āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āφāϰāĻ“ āĻ…āύ⧇āĻ• āĻ•āĻŋāϛ⧁ āĻ•āϰāϤ⧇ āϏāĻšāĻžāϝāĻŧāĻ• āĻĢāĻžāĻ‚āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

āϛ⧋āϟāĻĻ⧇āϰ āϜāĻ¨ā§āϝ 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 (XDP-āĻāϰ āϜāĻ¨ā§āϝ) āĻŦāĻž āĻ•āĻžāĻ āĻžāĻŽā§‹ struct __sk_buff (āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϜāĻ¨ā§āϝ) āĻŦāĻž āĻ•āĻžāĻ āĻžāĻŽā§‹ struct pt_regs (āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āϧāϰāύ⧇āϰ āĻŸā§āϰ⧇āϏāĻŋāĻ‚ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϜāĻ¨ā§āϝ), āχāĻ¤ā§āϝāĻžāĻĻāĻŋāĨ¤

āϏ⧁āϤāϰāĻžāĻ‚, āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āĻžāϛ⧇ āĻāĻ•āϟāĻŋ āϏ⧇āϟ āϰ⧇āϜāĻŋāĻ¸ā§āϟāĻžāϰ, āĻ•āĻžāĻ°ā§āύ⧇āϞ āϏāĻžāĻšāĻžāĻ¯ā§āϝāĻ•āĻžāϰ⧀, āĻāĻ•āϟāĻŋ āĻ¸ā§āĻŸā§āϝāĻžāĻ•, āĻāĻ•āϟāĻŋ āĻĒā§āϰāϏāĻ™ā§āĻ— āĻĒāϝāĻŧ⧇āĻ¨ā§āϟāĻžāϰ āĻāĻŦāĻ‚ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ⧇āϰ āφāĻ•āĻžāϰ⧇ āĻļ⧇āϝāĻŧāĻžāϰ āĻ•āϰāĻž āĻŽā§‡āĻŽāϰāĻŋ āĻ›āĻŋāϞāĨ¤ āĻāĻŽāύ āύāϝāĻŧ āϝ⧇ āĻāχ āϏāĻŦāχ āĻ­ā§āϰāĻŽāϪ⧇ āĻāϕ⧇āĻŦāĻžāϰ⧇āχ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧀āϝāĻŧ, āĻ•āĻŋāĻ¨ā§āϤ⧁...

āφāϏ⧁āύ āĻŦāĻ°ā§āĻŖāύāĻžāϟāĻŋ āϚāĻžāϞāĻŋāϝāĻŧ⧇ āϝāĻžāχ āĻāĻŦāĻ‚ āĻāχ āĻŦāĻ¸ā§āϤ⧁āϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ•āĻĨāĻž āĻŦāϞāĻŋāĨ¤ āϏāĻŦ (āĻĒā§āϰāĻžāϝāĻŧ āϏāĻŦ) BPF āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻžāĻŦāϞ⧀ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ 64-āĻŦāĻŋāϟ āφāĻ•āĻžāϰ āφāϛ⧇. āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻāĻ•āϟāĻŋ 64-āĻŦāĻŋāϟ āĻŦāĻŋāĻ— āĻāĻ¨ā§āĻĄāĻŋāϝāĻŧāĻžāύ āĻŽā§‡āĻļāĻŋāύ⧇ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāύāĻž āĻĻ⧇āϖ⧇āύ āϤāĻŦ⧇ āφāĻĒāύāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻŦ⧇āύ

āϛ⧋āϟāĻĻ⧇āϰ āϜāĻ¨ā§āϝ BPF, āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ‚āĻļ: āĻŦāĻ°ā§āϧāĻŋāϤ BPF

āĻāϟāĻž āĻšāϞ Code - āĻāϟāĻŋ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ⧇āϰ āĻāύāϕ⧋āĻĄāĻŋāĻ‚, Dst/Src — āĻāϗ⧁āϞāĻŋ āϝāĻĨāĻžāĻ•ā§āϰāĻŽā§‡ āϰāĻŋāϏāĻŋāĻ­āĻžāϰ āĻāĻŦāĻ‚ āωāĻ¤ā§āϏ⧇āϰ āĻāύāϕ⧋āĻĄāĻŋāĻ‚, Off - 16-āĻŦāĻŋāϟ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰāĻŋāϤ āχāĻ¨ā§āĻĄā§‡āĻ¨ā§āĻŸā§‡āĻļāύ, āĻāĻŦāĻ‚ Imm āĻāĻ•āϟāĻŋ 32-āĻŦāĻŋāϟ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰāĻŋāϤ āĻĒā§‚āĻ°ā§āĻŖāϏāĻ‚āĻ–ā§āϝāĻž āϝāĻž āĻ•āĻŋāϛ⧁ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ (cBPF āĻ§ā§āϰ⧁āĻŦāĻ• K-āĻāϰ āĻŽāϤ⧋)āĨ¤ āĻāύāϕ⧋āĻĄāĻŋāĻ‚ Code āĻĻ⧁āχ āϧāϰāύ⧇āϰ āĻāĻ•āϟāĻŋ āφāϛ⧇:

āϛ⧋āϟāĻĻ⧇āϰ āϜāĻ¨ā§āϝ BPF, āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ‚āĻļ: āĻŦāĻ°ā§āϧāĻŋāϤ BPF

āύāĻŋāĻ°ā§āĻĻ⧇āĻļ⧇āϰ āĻ•ā§āϞāĻžāϏ 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 āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻžāĻŦāϞ⧀āϰ āϏāĻ‚āĻ–ā§āϝāĻžāϏ⧂āϚāĻ• āϕ⧋āĻĄ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻ•āϰ⧇āĨ¤ āφāĻĒāύāĻžāϰ āύāĻŋāĻœā§‡āϰ āĻĨ⧇āϕ⧇ āφāĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āϚāĻžāϰ āĻ…āĻ§ā§āϝāϝāĻŧāύ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻŦāĻ‚/āĻ…āĻĨāĻŦāĻž āĻŦāĻžāχāύāĻžāϰāĻŋ āĻĒāĻžāĻ°ā§āϏāĻŋāĻ‚ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āφāĻĒāύāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āωāĻ¤ā§āϏāϗ⧁āϞāĻŋāϤ⧇ āĻļāĻŦā§āĻĻāĻžāĻ°ā§āĻĨāĻŦāĻŋāĻĻā§āϝāĻž āϖ⧁āρāĻœā§‡ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇āύ, āϜāϟāĻŋāϞāϤāĻžāϰ āĻ•ā§āϰāĻŽ āĻ…āύ⧁āϏāĻžāϰ⧇ āϏāĻžāϜāĻžāύ⧋: āĻ…āύāĻžāύ⧁āĻˇā§āĻ āĻžāύāĻŋāĻ• eBPF āĻ¸ā§āĻĒ⧇āϏ, BPF āĻāĻŦāĻ‚ XDP āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āĻ—āĻžāχāĻĄ, āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āϏ⧇āϟ, āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ/networking/filter.txt āĻāĻŦāĻ‚, āĻ…āĻŦāĻļā§āϝāχ, āϞāĻŋāύāĻžāĻ•ā§āϏ āϏ⧋āĻ°ā§āϏ āϕ⧋āĻĄā§‡ - āϝāĻžāϚāĻžāχāĻ•āĻžāϰ⧀, āĻœā§‡āφāχāϟāĻŋ, āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĻā§‹āĻ­āĻžāώ⧀āĨ¤

āωāĻĻāĻžāĻšāϰāĻŖ: āφāĻĒāύāĻžāϰ āĻŽāĻžāĻĨāĻžāϝāĻŧ 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 - āĻāϟāĻž BPF_MOV. āĻāϟāĻŋ āĻ—āĻ¨ā§āϤāĻŦā§āϝ āϰ⧇āϜāĻŋāĻ¸ā§āϟāĻžāϰ⧇ āĻāĻ•āϟāĻŋ āĻŽāĻžāύ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āϰ⧇āĨ¤ āϝāĻĻāĻŋ āĻŦāĻŋāϟ āϏ⧇āϟ āĻ•āϰāĻž āĻšāϝāĻŧ s (āĻ‰ā§ŽāϏ), āϤāĻžāϰāĻĒāϰ āĻŽāĻžāύāϟāĻŋ āϏ⧋āĻ°ā§āϏ āϰ⧇āϜāĻŋāĻ¸ā§āϟāĻžāϰ āĻĨ⧇āϕ⧇ āύ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ āĻāĻŦāĻ‚ āϝāĻĻāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻāϟāĻŋ āϏ⧇āϟ āĻ•āϰāĻž āύāĻž āĻĨāĻžāϕ⧇, āϤāĻžāĻšāϞ⧇ āĻŽāĻžāύāϟāĻŋ āĻ•ā§āώ⧇āĻ¤ā§āϰ āĻĨ⧇āϕ⧇ āύ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ Imm. āϤāĻžāχ āĻĒā§āϰāĻĨāĻŽ āĻ“ āϤ⧃āϤ⧀āϝāĻŧ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ⧇ āφāĻŽāϰāĻž āĻ…āĻĒāĻžāϰ⧇āĻļāύ āĻ•āϰāĻŋ r0 = Imm. āφāϰāĻ“, āĻœā§‡āĻāĻŽāĻĒāĻŋ āĻ•ā§āϞāĻžāϏ 1 āĻ…āĻĒāĻžāϰ⧇āĻļāύ BPF_JEQ (āϏāĻŽāĻžāύ āĻšāϞ⧇ āϞāĻžāĻĢ)āĨ¤ āφāĻŽāĻžāĻĻ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻŦāĻŋāϟ āĻĨ⧇āϕ⧇ 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 āĻļā§‚āĻ¨ā§āϝ āĻšāĻŦ⧇ āύāĻž:

āϛ⧋āϟāĻĻ⧇āϰ āϜāĻ¨ā§āϝ BPF, āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ‚āĻļ: āĻŦāĻ°ā§āϧāĻŋāϤ BPF

āϏāĻĢāϞāĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϞ⧋āĻĄ āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āφāĻŽāϰāĻž āĻāϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖāϤ āϕ⧋āύ⧋ āϧāϰāύ⧇āϰ āχāϭ⧇āĻ¨ā§āϟ āĻœā§‡āύāĻžāϰ⧇āϟāϰ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻŋāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āφāĻŽāϰāĻž āχāύāĻ•āĻžāĻŽāĻŋāĻ‚ āĻĒā§āϝāĻžāϕ⧇āϟāϗ⧁āϞāĻŋ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāϟāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇ āϰāĻžāĻ–āϤ⧇ āĻĒāĻžāϰāĻŋ āĻŦāĻž āĻāϟāĻŋāϕ⧇ āĻ•āĻŋāϛ⧁āϤ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ tracepoint āĻŽā§‚āϞ⧇ āĻāχ āĻŽā§āĻšā§āĻ°ā§āϤ⧇, āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āĻ•āĻžāωāĻ¨ā§āϟāĻžāϰāϟāĻŋāĻ“ āĻāĻ• āĻĻā§āĻŦāĻžāϰāĻž āĻŦ⧃āĻĻā§āϧāĻŋ āĻĒāĻžāĻŦ⧇ āĻāĻŦāĻ‚ āφāĻŽāϰāĻž āϞ⧋āĻĄāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡ āĻĢāĻžāχāϞ āĻŦāĻ°ā§āĻŖāύāĻžāĻ•āĻžāϰ⧀ āĻŦāĻ¨ā§āϧ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāĻŦāĨ¤

āφāĻŽāϰāĻž āϝāĻĻāĻŋ āĻāĻ–āύ āĻŦ⧁āϟāϞ⧋āĻĄāĻžāϰ āĻŦāĻ¨ā§āϧ āĻ•āϰāĻŋ āϤāĻžāĻšāϞ⧇ āĻ•āĻŋ āĻšāĻŦ⧇? āĻāϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ āĻœā§‡āύāĻžāϰ⧇āϟāϰ (āĻšā§āĻ•) āϧāϰāύ⧇āϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇āĨ¤ āϞ⧋āĻĄāĻžāϰ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇ āϏāĻŽāĻ¸ā§āϤ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻšā§āĻ• āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻĨāĻžāĻ•āĻŦ⧇, āĻāϗ⧁āϞāĻŋ āϤāĻĨāĻžāĻ•āĻĨāĻŋāϤ āĻ—ā§āϞ⧋āĻŦāĻžāϞ āĻšā§āĻ•āĨ¤ āĻāĻŦāĻ‚, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻŸā§āϰ⧇āϏ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋ āϤāĻžāĻĻ⧇āϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϟāĻŋ āĻļ⧇āώ āĻšāĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇ āĻŽā§āĻ•ā§āϤāĻŋ āĻĒāĻžāĻŦ⧇ (āĻāĻŦāĻ‚ āϤāĻžāχ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻŦāϞāĻž āĻšāϝāĻŧ, "āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻĨ⧇āϕ⧇ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϤ⧇")āĨ¤ āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋāĻ—āϤāĻ­āĻžāĻŦ⧇, āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻšā§āĻ•āϗ⧁āϞāĻŋāϤ⧇ āϏāĻ°ā§āĻŦāĻĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ¸ā§āĻĨāĻžāύ⧇ āĻāĻ•āϟāĻŋ āϏāĻ‚āĻļā§āϞāĻŋāĻˇā§āϟ āĻĢāĻžāχāϞ āĻŦāĻ°ā§āĻŖāύāĻžāĻ•āĻžāϰ⧀ āĻĨāĻžāϕ⧇ āĻāĻŦāĻ‚ āϤāĻžāχ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻžāϟāĻŋ āĻŦāĻ¨ā§āϧ āĻšāϝāĻŧ⧇ āϗ⧇āϞ⧇ āĻŦāĻ¨ā§āϧ āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻŦāĻŋāĻļā§āĻŦāĻŦā§āϝāĻžāĻĒā§€ āĻšā§āĻ•āϗ⧁āϞāĻŋ āϤāĻž āĻ•āϰ⧇ āύāĻžāĨ¤ āύāĻŋāĻŽā§āύ⧋āĻ•ā§āϤ āϚāĻŋāĻ¤ā§āϰ⧇, āϞāĻžāϞ āĻ•ā§āϰāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇, āφāĻŽāĻŋ āĻĻ⧇āĻ–āĻžāύ⧋āϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧇āĻ›āĻŋ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āϞ⧋āĻĄāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϏāĻŽāĻžāĻĒā§āϤāĻŋ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻāĻŦāĻ‚ āĻŦāĻŋāĻļā§āĻŦāĻŦā§āϝāĻžāĻĒā§€ āĻšā§āϕ⧇āϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻŦāĻ¸ā§āϤ⧁āϰ āĻœā§€āĻŦāύāĻ•āĻžāϞāϕ⧇ āĻĒā§āϰāĻ­āĻžāĻŦāĻŋāϤ āĻ•āϰ⧇āĨ¤

āϛ⧋āϟāĻĻ⧇āϰ āϜāĻ¨ā§āϝ BPF, āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ‚āĻļ: āĻŦāĻ°ā§āϧāĻŋāϤ BPF

āϕ⧇āύ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻāĻŦāĻ‚ āĻŦ⧈āĻļā§āĻŦāĻŋāĻ• āĻšā§āĻ• āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ āφāϛ⧇? āχāωāϜāĻžāϰāĻ¸ā§āĻĒ⧇āϏ āĻ›āĻžāĻĄāĻŧāĻžāχ āĻ•āĻŋāϛ⧁ āϧāϰāϪ⧇āϰ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϚāĻžāϞāĻžāύ⧋ āĻ…āĻ°ā§āĻĨāĻĒā§‚āĻ°ā§āĻŖ, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, DDoS āϏ⧁āϰāĻ•ā§āώāĻž āĻ•āĻ˛ā§āĻĒāύāĻž āĻ•āϰ⧁āύ - āĻŦ⧁āϟāϞ⧋āĻĄāĻžāϰ āύāĻŋāϝāĻŧāĻŽāϗ⧁āϞāĻŋ āϞāĻŋāϖ⧇ āĻāĻŦāĻ‚ BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋāϕ⧇ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧇, āϝāĻžāϰ āĻĒāϰ⧇ āĻŦ⧁āϟāϞ⧋āĻĄāĻžāϰ āĻ—āĻŋāϝāĻŧ⧇ āύāĻŋāĻœā§‡āϕ⧇ āĻšāĻ¤ā§āϝāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻ…āĻ¨ā§āϝāĻĻāĻŋāϕ⧇, āĻāĻ•āϟāĻŋ āĻĄāĻŋāĻŦāĻžāĻ—āĻŋāĻ‚ āĻŸā§āϰ⧇āϏ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻ•āĻ˛ā§āĻĒāύāĻž āĻ•āϰ⧁āύ āϝāĻž āφāĻĒāύāĻŋ āĻĻāĻļ āĻŽāĻŋāύāĻŋāĻŸā§‡āϰ āĻŽāĻ§ā§āϝ⧇ āφāĻĒāύāĻžāϰ āĻšāĻžāρāϟ⧁āϤ⧇ āϞāĻŋāϖ⧇āϛ⧇āύ - āĻāϟāĻŋ āĻļ⧇āώ āĻšāϝāĻŧ⧇ āϗ⧇āϞ⧇, āφāĻĒāύāĻŋ āϚāĻžāύ āϝ⧇ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āϕ⧋āύāĻ“ āφāĻŦāĻ°ā§āϜāύāĻž āĻ…āĻŦāĻļāĻŋāĻˇā§āϟ āĻĨāĻžāĻ•āĻŦ⧇ āύāĻž āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻšā§āĻ•āϗ⧁āϞāĻŋ āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻŦ⧇⧎

āĻ…āĻ¨ā§āϝāĻĻāĻŋāϕ⧇, āĻ•āĻ˛ā§āĻĒāύāĻž āĻ•āϰ⧁āύ āϝ⧇ āφāĻĒāύāĻŋ āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇āϰ āĻāĻ•āϟāĻŋ āĻŸā§āϰ⧇āϏāĻĒāϝāĻŧ⧇āĻ¨ā§āĻŸā§‡āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāϤ⧇ āϚāĻžāύ āĻāĻŦāĻ‚ āĻ…āύ⧇āĻ• āĻŦāĻ›āϰ āϧāϰ⧇ āĻĒāϰāĻŋāϏāĻ‚āĻ–ā§āϝāĻžāύ āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰāϤ⧇ āϚāĻžāύāĨ¤ āĻāχ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āφāĻĒāύāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ…āĻ‚āĻļāϟāĻŋ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āϏāĻŽāϝāĻŧ⧇ āϏāĻŽāϝāĻŧ⧇ āĻĒāϰāĻŋāϏāĻ‚āĻ–ā§āϝāĻžāύ⧇ āĻĢāĻŋāϰ⧇ āϝ⧇āϤ⧇ āϚāĻžāύāĨ¤ bpf āĻĢāĻžāχāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻāχ āϏ⧁āϝ⧋āĻ— āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰ⧇āĨ¤ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āχāύ-āĻŽā§‡āĻŽāϰāĻŋ-āĻ…āύāϞāĻŋ āϏāĻŋāωāĻĄā§‹-āĻĢāĻžāχāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϝāĻž BPF āĻŦāĻ¸ā§āϤ⧁āϰ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰ⧇ āĻāĻŽāύ āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧ āĻāĻŦāĻ‚ āĻāϰ āĻĢāϞ⧇ āĻŦ⧃āĻĻā§āϧāĻŋ āĻĒāĻžāϝāĻŧ refcount āĻŦāĻ¸ā§āϤ⧁ āĻāϰ āĻĒāϰ⧇, āϞ⧋āĻĄāĻžāϰāϟāĻŋ āĻĒā§āϰāĻ¸ā§āĻĨāĻžāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻŦāĻ¸ā§āϤ⧁āϗ⧁āϞāĻŋ āĻœā§€āĻŦāĻŋāϤ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤

āϛ⧋āϟāĻĻ⧇āϰ āϜāĻ¨ā§āϝ BPF, āĻĒā§āϰāĻĨāĻŽ āĻ…āĻ‚āĻļ: āĻŦāĻ°ā§āϧāĻŋāϤ BPF

bpffs-āĻ āĻĢāĻžāχāϞ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϝāĻž BPF āĻŦāĻ¸ā§āϤ⧁āϰ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰ⧇ āϤāĻžāϕ⧇ "āĻĒāĻŋāύāĻŋāĻ‚" āĻŦāϞāĻž āĻšāϝāĻŧ (āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻŦāĻžāĻ•ā§āϝāĻžāĻ‚āĻļ⧇āϰ āĻŽāϤ⧋: "āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻāĻ•āϟāĻŋ BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻŦāĻž āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ āĻĒāĻŋāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇")āĨ¤ BPF āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āĻĢāĻžāχāϞ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āϰ āφāϝāĻŧ⧁ āĻŦāĻžāĻĄāĻŧāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āύāϝāĻŧ, āĻŦāĻŋāĻļā§āĻŦāĻŦā§āϝāĻžāĻĒā§€ āĻŦāĻ¸ā§āϤ⧁āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāϝ⧋āĻ—ā§āϝāϤāĻžāϰ āϜāĻ¨ā§āϝāĻ“ āĻŦā§‹āϧāĻ—āĻŽā§āϝ āĻšāϝāĻŧ - āĻ—ā§āϞ⧋āĻŦāĻžāϞ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āωāĻĻāĻžāĻšāϰāϪ⧇ āĻĢāĻŋāϰ⧇ āϗ⧇āϞ⧇, āφāĻŽāϰāĻž āĻĒāϰāĻŋāϏāĻ‚āĻ–ā§āϝāĻžāύ āĻĻ⧇āĻ–āϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāϤ⧇ āϚāĻžāχāĨ¤ āĻŽāĻžāĻā§‡ āĻŽāĻžāĻā§‡.

BPF āĻĢāĻžāχāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻŽāĻžāωāĻ¨ā§āϟ āĻ•āϰāĻž āĻšāϝāĻŧ /sys/fs/bpf, āϤāĻŦ⧇ āĻāϟāĻŋ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧāĻ­āĻžāĻŦ⧇āĻ“ āĻŽāĻžāωāĻ¨ā§āϟ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇, āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻāχāϰāĻ•āĻŽ:

$ mkdir bpf-mountpoint
$ sudo mount -t bpf none bpf-mountpoint

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĢāĻžāχāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āύāĻžāĻŽ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ BPF_OBJ_PIN BPF āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞāĨ¤ āĻŦā§āϝāĻžāĻ–ā§āϝāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āφāϏ⧁āύ āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāĻŋ, āĻāϟāĻŋ āĻ•āĻŽā§āĻĒāĻžāχāϞ āĻ•āϰāĻŋ, āĻāϟāĻŋ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻāϟāĻŋāϤ⧇ āĻĒāĻŋāύ āĻ•āϰāĻŋ bpffs. āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻ•āĻŋāϛ⧁ āĻ•āϰ⧇ āύāĻž, āφāĻŽāϰāĻž āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āϕ⧋āĻĄāϟāĻŋ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāĻ›āĻŋ āϝāĻžāϤ⧇ āφāĻĒāύāĻŋ āωāĻĻāĻžāĻšāϰāĻŖāϟāĻŋ āĻĒ⧁āύāϰ⧁āĻ¤ā§āĻĒāĻžāĻĻāύ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

$ cat test.c
__attribute__((section("xdp"), used))
int test(void *ctx)
{
        return 0;
}

char _license[] __attribute__((section("license"), used)) = "GPL";

āφāϏ⧁āύ āĻāχ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āĻ•āĻŽā§āĻĒāĻžāχāϞ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āĻĢāĻžāχāϞ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āĻāĻ•āϟāĻŋ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ āĻ…āύ⧁āϞāĻŋāĻĒāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻŋ bpffs:

$ clang -target bpf -c test.c -o test.o
$ mkdir bpf-mountpoint
$ sudo mount -t bpf none bpf-mountpoint

āĻāĻ–āύ āχāωāϟāĻŋāϞāĻŋāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰāĻž āϝāĻžāĻ• bpftool āĻāĻŦāĻ‚ āϏāĻšāĻ—āĻžāĻŽā§€ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞāϗ⧁āϞāĻŋ āĻĻ⧇āϖ⧁āύ bpf(2) (āĻ¸ā§āĻŸā§āϰ⧇āϏ āφāωāϟāĻĒ⧁āϟ āĻĨ⧇āϕ⧇ āĻ•āĻŋāϛ⧁ āĻ…āĻĒā§āϰāĻžāϏāĻ™ā§āĻ—āĻŋāĻ• āϞāĻžāχāύ āϏāϰāĻžāύ⧋ āĻšāϝāĻŧ⧇āϛ⧇):

$ sudo strace -e bpf bpftool prog load ./test.o bpf-mountpoint/test
bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_XDP, prog_name="test", ...}, 120) = 3
bpf(BPF_OBJ_PIN, {pathname="bpf-mountpoint/test", bpf_fd=3}, 120) = 0

āĻāĻ–āĻžāύ⧇ āφāĻŽāϰāĻž āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϞ⧋āĻĄ āĻ•āϰ⧇āĻ›āĻŋ BPF_PROG_LOAD, āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āĻĢāĻžāχāϞ āĻŦāĻ°ā§āĻŖāύāĻžāĻ•āĻžāϰ⧀ āĻĒ⧇āϝāĻŧ⧇āϛ⧇ 3 āĻāĻŦāĻ‚ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ BPF_OBJ_PIN āĻāĻ•āϟāĻŋ āĻĢāĻžāχāϞ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻāχ āĻĢāĻžāχāϞ āĻŦāĻ°ā§āĻŖāύāĻžāĻ•āĻžāϰ⧀ āĻĒāĻŋāύ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ "bpf-mountpoint/test". āĻāϰ āĻĒāϰ āĻŦ⧁āϟāϞ⧋āĻĄāĻžāϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ bpftool āĻ•āĻžāϜ āĻļ⧇āώ āĻšāϝāĻŧ⧇āϛ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇ āϰāϝāĻŧ⧇ āϗ⧇āϛ⧇, āϝāĻĻāĻŋāĻ“ āφāĻŽāϰāĻž āĻāϟāĻŋāϕ⧇ āϕ⧋āύ⧋ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻŋāύāĻŋ:

$ sudo bpftool prog | tail -3
783: xdp  name test  tag 5c8ba0cf164cb46c  gpl
        loaded_at 2020-05-05T13:27:08+0000  uid 0
        xlated 24B  jited 41B  memlock 4096B

āφāĻŽāϰāĻž āϏāĻžāϧāĻžāϰāĻŖāϤ āĻĢāĻžāχāϞ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻŽā§āϛ⧇ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰāĻŋ unlink(2) āĻāĻŦāĻ‚ āĻāϰ āĻĒāϰ⧇ āϏāĻ‚āĻļā§āϞāĻŋāĻˇā§āϟ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻšāĻŦ⧇:

$ sudo rm ./bpf-mountpoint/test
$ sudo bpftool prog show id 783
Error: get by id (783): No such file or directory

āĻŦāĻ¸ā§āϤ⧁ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻž āĻšāĻšā§āϛ⧇

āĻŦāĻ¸ā§āϤ⧁āϗ⧁āϞāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞāĻžāϰ āĻŦāĻŋāώāϝāĻŧ⧇ āĻ•āĻĨāĻž āĻŦāϞāϤ⧇ āĻ—āĻŋāϝāĻŧ⧇, āĻāϟāĻŋ āĻ¸ā§āĻĒāĻˇā§āϟ āĻ•āϰāĻž āĻĒā§āϰāϝāĻŧā§‹āϜāύ āϝ⧇ āφāĻŽāϰāĻž āĻšā§āĻ• (āχāϭ⧇āĻ¨ā§āϟ āĻœā§‡āύāĻžāϰ⧇āϟāϰ) āĻĨ⧇āϕ⧇ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āϏāĻ‚āϝ⧋āĻ— āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āύ āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āĻāĻ•āϟāĻŋāĻ“ āύāϤ⧁āύ āχāϭ⧇āĻ¨ā§āϟ āĻāϟāĻŋāϰ āĻĒā§āϰāĻŦāĻ°ā§āϤāύāϕ⧇ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰāĻŦ⧇ āύāĻž, āϤāĻŦ⧇, āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϏāĻŽāĻ¸ā§āϤ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϘāϟāύāĻž āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻ•ā§āϰāĻŽā§‡ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻšāĻŦ⧇āĨ¤ .

āĻ•āĻŋāϛ⧁ āϧāϰāϪ⧇āϰ BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āφāĻĒāύāĻžāϕ⧇ āĻĢā§āϞāĻžāχāϤ⧇ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻĒā§āϰāϤāĻŋāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻĻ⧇āϝāĻŧ, āϝ⧇āĻŽāύ āĻ…āύ⧁āĻ•ā§āϰāĻŽ āĻĒāϰāĻŽāĻžāϪ⧁ āĻĒā§āϰāĻĻāĻžāύ replace = detach old program, attach new program. āĻāχ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇, āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āĻĒ⧁āϰāĻžāύ⧋ āϏāĻ‚āĻ¸ā§āĻ•āϰāϪ⧇āϰ āϏāĻŽāĻ¸ā§āϤ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤāϗ⧁āϞāĻŋ āϤāĻžāĻĻ⧇āϰ āĻ•āĻžāϜ āĻļ⧇āώ āĻ•āϰāĻŦ⧇, āĻāĻŦāĻ‚ āύāϤ⧁āύ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻĨ⧇āϕ⧇ āύāϤ⧁āύ āχāϭ⧇āĻ¨ā§āϟ āĻšā§āϝāĻžāĻ¨ā§āĻĄāϞāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāĻŦ⧇, āĻāĻŦāĻ‚ āĻāĻ–āĻžāύ⧇ "āĻĒāϰāĻŽāĻžāϪ⧁" āĻŽāĻžāύ⧇ āĻāĻ•āϟāĻŋ āχāϭ⧇āĻ¨ā§āϟ āĻŽāĻŋāϏ āĻ•āϰāĻž āĻšāĻŦ⧇ āύāĻžāĨ¤

āχāϭ⧇āĻ¨ā§āϟ āωāĻ¤ā§āϏ⧇āϰ āϏāĻžāĻĨ⧇ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž

āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧ⧇, āφāĻŽāϰāĻž āφāϞāĻžāĻĻāĻžāĻ­āĻžāĻŦ⧇ āχāϭ⧇āĻ¨ā§āϟ āωāĻ¤ā§āϏ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ—āĻ•āĻžāϰ⧀ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻŦ āύāĻž, āϝ⧇āĻšā§‡āϤ⧁ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϧāϰāϪ⧇āϰ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āĻĒā§āϰ⧇āĻ•ā§āώāĻžāĻĒāĻŸā§‡ āĻāϟāĻŋ āĻ…āĻ§ā§āϝāϝāĻŧāύ āĻ•āϰāĻž āĻŦā§‹āϧāĻ—āĻŽā§āϝāĨ¤ āϏ⧇āĻŽāĻŋ. āωāĻĻāĻžāĻšāϰāĻŖ āύ⧀āĻšā§‡, āϝ⧇āĻ–āĻžāύ⧇ āφāĻŽāϰāĻž XDP-āĻāϰ āĻŽāϤ⧋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋāϕ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž āĻšāϝāĻŧ āϤāĻž āĻĻ⧇āĻ–āĻžāχāĨ¤

āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻŽā§āϝāĻžāύāĻŋāĻĒ⧁āϞ⧇āϟ āĻ•āϰāĻž

āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ

āϏāĻŽāĻ¸ā§āϤ BPF āĻŦāĻ¸ā§āϤ⧁ āĻāĻ•āϟāĻŋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀ āĻ¸ā§āĻĨāĻžāύ āĻĨ⧇āϕ⧇ āϤ⧈āϰāĻŋ āĻāĻŦāĻ‚ āĻĒāϰāĻŋāϚāĻžāϞāĻŋāϤ āĻšāϝāĻŧ bpf, āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻĒā§āϰ⧋āĻŸā§‹āϟāĻžāχāĻĒ āφāϛ⧇:

#include <linux/bpf.h>

int bpf(int cmd, union bpf_attr *attr, unsigned int size);

āĻāĻ–āĻžāύ⧇ āĻĻāϞ cmd āϟāĻžāχāĻĒ⧇āϰ āĻŽāĻžāύāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ enum bpf_cmd, attr - āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϜāĻ¨ā§āϝ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋāϗ⧁āϞāĻŋāϰ āĻāĻ•āϟāĻŋ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟāĻžāϰ āĻāĻŦāĻ‚ size - āĻĒāϝāĻŧ⧇āĻ¨ā§āϟāĻžāϰ āĻ…āύ⧁āϝāĻžāϝāĻŧā§€ āĻŦāĻ¸ā§āϤ⧁āϰ āφāĻ•āĻžāϰ, āϝ⧇āĻŽāύ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻāχ sizeof(*attr). āĻ•āĻžāĻ°ā§āύ⧇āϞ 5.8-āĻ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞ bpf 34āϟāĻŋ āĻ­āĻŋāĻ¨ā§āύ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϏāĻ‚āĻœā§āĻžāĻž union bpf_attr 200 āϞāĻžāχāύ āĻĻāĻ–āϞ āĻ•āϰ⧇āĨ¤ āϤāĻŦ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻāϤ⧇ āĻ­āϝāĻŧ āĻĒāĻžāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤ āύāϝāĻŧ, āϝ⧇āĻšā§‡āϤ⧁ āφāĻŽāϰāĻž āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āύāĻŋāĻŦāĻ¨ā§āϧ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻāĻŦāĻ‚ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āύāĻŋāĻœā§‡āĻĻ⧇āϰ āĻĒāϰāĻŋāϚāĻŋāϤ āĻ•āϰāĻŦāĨ¤

āĻĻāϞ āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āĻ•āϰāĻž āϝāĻžāĻ• BPF_PROG_LOAD, āϝāĻž BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ - BPF āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻžāĻŦāϞ⧀āϰ āĻāĻ•āϟāĻŋ āϏ⧇āϟ āύ⧇āϝāĻŧ āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇ āϞ⧋āĻĄ āĻ•āϰ⧇āĨ¤ āϞ⧋āĻĄ āĻ•āϰāĻžāϰ āĻŽā§āĻšā§āĻ°ā§āϤ⧇, āϝāĻžāϚāĻžāχāĻ•āĻžāϰ⧀āϟāĻŋ āϚāĻžāϞ⧁ āĻ•āϰāĻž āĻšāϝāĻŧ, āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ⧇ JIT āĻ•āĻŽā§āĻĒāĻžāχāϞāĻžāϰ āĻāĻŦāĻ‚ āϏāĻĢāϞāĻ­āĻžāĻŦ⧇ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻĢāĻžāχāϞ⧇āϰ āĻŦāĻ°ā§āĻŖāύāĻžāĻ•āĻžāϰ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϕ⧇ āĻĢ⧇āϰāϤ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧāĨ¤ āφāĻŽāϰāĻž āφāϗ⧇āϰ āĻŦāĻŋāĻ­āĻžāϗ⧇ āϤāĻžāϰ āĻĒāϰ⧇ āĻ•āĻŋ āϘāϟāϤ⧇ āĻĻ⧇āϖ⧇āĻ›āĻŋ BPF āĻŦāĻ¸ā§āϤ⧁āϰ āĻœā§€āĻŦāύāϚāĻ•ā§āϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇.

āĻāĻ–āύ āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϞāĻŋāĻ–āĻŦ āϝāĻž āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ 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 āϏāĻŽāĻ°ā§āĻĨāύ⧇āϰ āϏāĻžāĻĨ⧇ āĻ•āĻŽā§āĻĒāĻžāχāϞ āĻ•āϰāĻž āωāϚāĻŋāϤ (āφāĻŽāϰāĻž āĻŦāĻŋāĻ­āĻžāϗ⧇ āĻāϟāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ āϤāĻž āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰāĻŋ āĻĄā§‡āϭ⧇āϞāĻĒāĻŽā§‡āĻ¨ā§āϟ āϟ⧁āϞāϏ. āφāĻĒāύāĻžāϰ āĻ•āĻžāĻ°ā§āύ⧇āϞāϟāĻŋ BTF āĻĻāĻŋāϝāĻŧ⧇ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āύāĻžāĻ•āĻŋ āϖ⧁āĻŦ āϏāĻšāϜāĻ­āĻžāĻŦ⧇ āύāϝāĻŧ - āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻĢāĻžāχāϞ⧇āϰ āωāĻĒāĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āφāĻĒāύāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ:

$ ls -lh /sys/kernel/btf/vmlinux
-r--r--r-- 1 root root 2.6M Jul 29 15:30 /sys/kernel/btf/vmlinux

āĻāχ āĻĢāĻžāχāϞāϟāĻŋ āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āϏāĻŽāĻ¸ā§āϤ āĻĄā§‡āϟāĻž āĻĒā§āϰāĻ•āĻžāϰ⧇āϰ āϤāĻĨā§āϝ āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āϏāĻŽāĻ¸ā§āϤ āωāĻĻāĻžāĻšāϰāϪ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ libbpf. āφāĻŽāϰāĻž āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āύāĻŋāĻŦāĻ¨ā§āϧ⧇ CO-RE āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤāĻ­āĻžāĻŦ⧇ āĻ•āĻĨāĻž āĻŦāϞāĻŦ, āϤāĻŦ⧇ āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧ⧇, āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āύāĻŋāĻœā§‡āϕ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ°ā§āύ⧇āϞ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ CONFIG_DEBUG_INFO_BTF.

āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ libbpf āĻĄāĻžāχāϰ⧇āĻ•ā§āϟāϰāĻŋāϤ⧇ āĻĨāĻžāϕ⧇ tools/lib/bpf āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻāĻŦāĻ‚ āĻāϰ āĻŦāĻŋāĻ•āĻžāĻļ āĻŽā§‡āϞāĻŋāĻ‚ āϤāĻžāϞāĻŋāĻ•āĻžāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻ•āϰāĻž āĻšāϝāĻŧ bpf@vger.kernel.org. āϝāĻžāχāĻšā§‹āĻ•, āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇āϰ āĻŦāĻžāχāϰ⧇ āĻŦāϏāĻŦāĻžāϏāĻ•āĻžāϰ⧀ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϗ⧁āϞāĻŋāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻĒ⧃āĻĨāĻ• āϏāĻ‚āĻ—ā§āϰāĻšāĻ¸ā§āĻĨāϞ āϰāĻ•ā§āώāĻŖāĻžāĻŦ⧇āĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ https://github.com/libbpf/libbpf āϝ⧇āĻ–āĻžāύ⧇ āĻ•āĻžāĻ°ā§āύ⧇āϞ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ āĻ•āĻŽāĻŦ⧇āĻļāĻŋ āĻĒāĻĄāĻŧāĻžāϰ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ⧇āϰ āϜāĻ¨ā§āϝ āĻŽāĻŋāϰāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤

āĻāχ āĻŦāĻŋāĻ­āĻžāϗ⧇ āφāĻŽāϰāĻž āĻĻ⧇āĻ–āĻŦ āϝ⧇ āφāĻĒāύāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āϝāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ 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, āϝāĻž āĻĢā§āϞāĻžāχāϤ⧇ BPF āĻŦāĻžāχāύāĻžāϰāĻŋ āϕ⧋āĻĄ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤

āϝ⧁āĻ•ā§āϤāĻŋ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāĻž āϏāĻšāϜ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ, āφāĻŽāϰāĻž āĻāχ āωāĻĻā§āĻĻ⧇āĻļā§āϝ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻāĻžāĻšāϰāĻŖāϟāĻŋ āφāĻŦāĻžāϰ āϞāĻŋāĻ–āĻŦ xdp-simple. āĻāχ āωāĻĻāĻžāĻšāϰāϪ⧇ āφāϞ⧋āϚāĻŋāϤ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋāϰ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻāĻŦāĻ‚ āϏāĻžāĻŽāĻžāĻ¨ā§āϝ āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āϕ⧋āĻĄ āĻāϤ⧇ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāĻŦ⧇ āϏāĻžāϰāĻ•āĻĨāĻž.

āφāĻŽāĻžāĻĻ⧇āϰ āφāĻŦ⧇āĻĻāύ⧇āϰ āϝ⧁āĻ•ā§āϤāĻŋ āύāĻŋāĻŽā§āύāϰ⧂āĻĒ:

  • āĻāĻ•āϟāĻŋ āϟāĻžāχāĻĒ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ BPF_MAP_TYPE_ARRAY āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ BPF_MAP_CREATE,
  • āĻāχ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻŽāύ āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ,
  • āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋāϕ⧇ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧁āύ lo,

āϝāĻž āĻŽāĻžāύ⧁āώ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻ…āύ⧁āĻŦāĻžāĻĻ āĻ•āϰ⧇

int main(void)
{
    int map_fd, prog_fd;

    map_fd = map_create();
    if (map_fd < 0)
        err(1, "bpf: BPF_MAP_CREATE");

    prog_fd = prog_load(map_fd);
    if (prog_fd < 0)
        err(1, "bpf: BPF_PROG_LOAD");

    xdp_attach(1, prog_fd);
}

āĻāϟāĻž āĻšāϞ map_create āφāĻŽāϰāĻž āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•āϞ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻĒā§āϰāĻĨāĻŽ āωāĻĻāĻžāĻšāϰāϪ⧇ āϝ⧇āĻŽāύ āĻ•āϰ⧇āĻ›āĻŋāϞāĻžāĻŽ āĻāĻ•āχāĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ bpf - “āĻ•āĻžāϰāύ⧇āϞ, āĻĻāϝāĻŧāĻž āĻ•āϰ⧇ āφāĻŽāĻžāϕ⧇ 8āϟāĻŋ āωāĻĒāĻžāĻĻāĻžāύ⧇āϰ āĻ…ā§āϝāĻžāϰ⧇āϰ āφāĻ•āĻžāϰ⧇ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ __u64 āĻāĻŦāĻ‚ āφāĻŽāĻžāϕ⧇ āĻĢāĻžāχāϞ āĻŦāĻ°ā§āĻŖāύāĻžāĻ•āĻžāϰ⧀ āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āĻĻāĻŋāύ":

static int map_create()
{
    union bpf_attr attr;

    memset(&attr, 0, sizeof(attr));
    attr.map_type = BPF_MAP_TYPE_ARRAY,
    attr.key_size = sizeof(__u32),
    attr.value_size = sizeof(__u64),
    attr.max_entries = 8,
    strncpy(attr.map_name, "woo", sizeof(attr.map_name));
    return syscall(__NR_bpf, BPF_MAP_CREATE, &attr, sizeof(attr));
}

āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϟāĻŋ āϞ⧋āĻĄ āĻ•āϰāĻžāĻ“ āϏāĻšāϜ:

static int prog_load(int map_fd)
{
    union bpf_attr attr;
    struct bpf_insn insns[] = {
        ...
    };

    memset(&attr, 0, sizeof(attr));
    attr.prog_type = BPF_PROG_TYPE_XDP;
    attr.insns     = ptr_to_u64(insns);
    attr.insn_cnt  = sizeof(insns)/sizeof(insns[0]);
    attr.license   = ptr_to_u64("GPL");
    strncpy(attr.prog_name, "woo", sizeof(attr.prog_name));
    return syscall(__NR_bpf, BPF_PROG_LOAD, &attr, sizeof(attr));
}

āϚāϤ⧁āϰ āĻ…āĻ‚āĻļ prog_load āĻ•āĻžāĻ āĻžāĻŽā§‹āϰ āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāϰ⧇ āĻšāĻŋāϏāĻžāĻŦ⧇ āφāĻŽāĻžāĻĻ⧇āϰ BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϏāĻ‚āĻœā§āĻžāĻž struct bpf_insn insns[]. āĻ•āĻŋāĻ¨ā§āϤ⧁ āϝ⧇āĻšā§‡āϤ⧁ āφāĻŽāϰāĻž āϏāĻŋ-āϤ⧇ āĻĨāĻžāĻ•āĻž āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻ›āĻŋ, āϤāĻžāχ āφāĻŽāϰāĻž āĻāĻ•āϟ⧁ āĻĒā§āϰāϤāĻžāϰāĻŖāĻž āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ:

$ llvm-objdump -D --section xdp/simple xdp-simple.bpf.o

0000000000000000 <simple>:
       0:       85 00 00 00 08 00 00 00 call 8
       1:       63 0a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r0
       2:       bf a2 00 00 00 00 00 00 r2 = r10
       3:       07 02 00 00 fc ff ff ff r2 += -4
       4:       18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll
       6:       85 00 00 00 01 00 00 00 call 1
       7:       b7 01 00 00 00 00 00 00 r1 = 0
       8:       15 00 04 00 00 00 00 00 if r0 == 0 goto +4 <LBB0_2>
       9:       61 01 00 00 00 00 00 00 r1 = *(u32 *)(r0 + 0)
      10:       07 01 00 00 01 00 00 00 r1 += 1
      11:       63 10 00 00 00 00 00 00 *(u32 *)(r0 + 0) = r1
      12:       b7 01 00 00 02 00 00 00 r1 = 2

0000000000000068 <LBB0_2>:
      13:       bf 10 00 00 00 00 00 00 r0 = r1
      14:       95 00 00 00 00 00 00 00 exit

āĻŽā§‹āϟ, āφāĻŽāĻžāĻĻ⧇āϰ 14āϟāĻŋ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāύāĻž āϞāĻŋāĻ–āϤ⧇ āĻšāĻŦ⧇ āĻ•āĻžāĻ āĻžāĻŽā§‹āϰ āφāĻ•āĻžāϰ⧇ struct bpf_insn (āĻĒāϰāĻžāĻŽāĻ°ā§āĻļ: āωāĻĒāϰ⧇ āĻĨ⧇āϕ⧇ āĻĄāĻžāĻŽā§āĻĒ āύāĻŋāύ, āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻžāĻŦāϞ⧀ āĻŦāĻŋāĻ­āĻžāĻ—āϟāĻŋ āĻĒ⧁āύāϰāĻžāϝāĻŧ āĻĒāĻĄāĻŧ⧁āύ, āϖ⧁āϞ⧁āύ 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 āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĻ›āĻŋāϞ āϤāĻžāϰāĻž āĻ…āύāϞāĻžāχāύ āϞāĻŋāύāĻžāĻ•ā§āϏ āϏāĻŽā§āĻĒā§āϰāĻĻāĻžāϝāĻŧ⧇āϰ āĻ›āĻŋāϞ, āϝāĻžāϰ āĻŽāĻžāύ⧇ āϤāĻžāϰāĻž āϤāĻžāĻĻ⧇āϰ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻĒāϰāĻŋāϚāĻŋāϤ āĻāĻ•āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĻ›āĻŋāϞ (āĻ•āĻŋāĻ¨ā§āϤ⧁ āύāĻž āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻŽāĻžāύ⧁āώ) āĻ•āĻžāĻ°ā§āύ⧇āϞ⧇āϰ āϏāĻžāĻĨ⧇ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ: āύ⧇āϟāϞāĻŋāĻ‚āĻ• āϏāϕ⧇āϟ, āφāϰ⧋ āĻĻ⧇āϖ⧁āύ RFC3549. āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇āϰ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϏāĻšāϜ āωāĻĒāĻžāϝāĻŧ 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 āφāĻŽāĻžāϰ āĻ•āĻžāĻ› āĻĨ⧇āϕ⧇ āύ⧇āĻ“āϝāĻŧāĻž bpf_devel_QA.)

āφāĻŽāϰāĻž āĻāχāĻŽāĻžāĻ¤ā§āϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋ āχāĻ¨ā§āϏāϟāϞ āĻ•āϰāĻŦ āύāĻž, āĻŦāϰāĻ‚ āϏ⧇āϗ⧁āϞāĻŋāϕ⧇ āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻŦ 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 āύāĻŋāϝāĻŧ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāϰāĻž āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ āĻ­ā§āϝāĻžāύāĻŋāϞāĻž āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻŦāĻž āĻŦāĻŋāĻ•āĻžāĻļ⧇āϰ āĻ•āĻžāĻ°ā§āύ⧇āϞāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋāĨ¤ āϐāϤāĻŋāĻšāĻžāϏāĻŋāĻ•āĻ­āĻžāĻŦ⧇, BPF āĻĄā§‡āϭ⧇āϞāĻĒāĻŽā§‡āĻ¨ā§āϟ āϞāĻŋāύāĻžāĻ•ā§āϏ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āĻŋāĻ‚ āϏāĻŽā§āĻĒā§āϰāĻĻāĻžāϝāĻŧ⧇āϰ āĻŽāĻ§ā§āϝ⧇āχ āϘāĻŸā§‡ āĻāĻŦāĻ‚ āϏ⧇āχāϜāĻ¨ā§āϝ āϏāĻŽāĻ¸ā§āϤ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻļā§€āĻ˜ā§āϰ āĻŦāĻž āĻĒāϰ⧇ āϞāĻŋāύāĻžāĻ•ā§āϏ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āĻŋāĻ‚ āϰāĻ•ā§āώāĻŖāĻžāĻŦ⧇āĻ•ā§āώāĻŖāĻ•āĻžāϰ⧀ āĻĄā§‡āĻ­āĻŋāĻĄ āĻŽāĻŋāϞāĻžāϰ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻšāϝāĻŧāĨ¤ āϤāĻžāĻĻ⧇āϰ āĻĒā§āϰāĻ•ā§ƒāϤāĻŋāϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇ - āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻŦāĻž āύāϤ⧁āύ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ - āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻĻ⧁āϟāĻŋ āϕ⧋āϰ⧇āϰ āĻāĻ•āϟāĻŋāϤ⧇ āĻĒāĻĄāĻŧ⧇ - net āĻŦāĻž net-next. BPF-āĻāϰ āϜāĻ¨ā§āϝ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύāϗ⧁āϞāĻŋ āĻāĻ•āχ āĻ­āĻžāĻŦ⧇ āĻŽāĻ§ā§āϝ⧇ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ bpf и bpf-next, āϝāĻž āϤāĻžāϰāĻĒāϰ āϝāĻĨāĻžāĻ•ā§āϰāĻŽā§‡ āύ⧇āϟ āĻāĻŦāĻ‚ āύ⧇āϟ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀āϤ⧇ āĻĒ⧁āϞ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āφāϰ⧋ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āϜāĻžāύāĻžāϰ āϜāĻ¨ā§āϝ, āĻĻ⧇āϖ⧁āύ bpf_devel_QA и netdev-FAQ. āϏ⧁āϤāϰāĻžāĻ‚ āφāĻĒāύāĻžāϰ āĻ¸ā§āĻŦāĻžāĻĻ āĻāĻŦāĻ‚ āφāĻĒāύāĻŋ āϝ⧇ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻĒāϰ⧀āĻ•ā§āώāĻž āĻ•āϰāϛ⧇āύ āϤāĻžāϰ āĻ¸ā§āĻĨāĻŋāϤāĻŋāĻļā§€āϞāϤāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ°ā§āύ⧇āϞ āϚāϝāĻŧāύ āĻ•āϰ⧁āύ (*-next āĻ•āĻžāĻ°ā§āύ⧇āϞāϗ⧁āϞāĻŋ āϤāĻžāϞāĻŋāĻ•āĻžāϭ⧁āĻ•ā§āϤāĻĻ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻ…āĻ¸ā§āĻĨāĻŋāϰ)āĨ¤

āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āĻĢāĻžāχāϞāϗ⧁āϞāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāϤ⧇ āĻšāϝāĻŧ āϏ⧇ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ•āĻĨāĻž āĻŦāϞāĻž āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧ⧇āϰ āϏ⧁āϝ⧋āϗ⧇āϰ āĻŦāĻžāχāϰ⧇ - āĻāϟāĻŋ āϧāϰ⧇ āύ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ āϝ⧇ āφāĻĒāύāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇ āĻāϟāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āϰāĻŦ⧇āύ āϤāĻž āϜāĻžāύ⧇āύ, āĻ…āĻĨāĻŦāĻž āĻļ⧇āĻ–āĻžāϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āĻĒā§āϰāĻ¤ā§āϝ⧇āϕ⧇āϰ āύāĻŋāĻœā§‡āϰ āωāĻĒāϰ. āϝāĻžāχāĻšā§‹āĻ•, āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻžāĻŦāϞ⧀ āφāĻĒāύāĻžāϕ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ⧀ BPF-āϏāĻ•ā§āώāĻŽ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āĻ•āĻŽāĻŦ⧇āĻļāĻŋ āϝāĻĨ⧇āĻˇā§āϟ āĻšāĻ“āϝāĻŧāĻž āωāϚāĻŋāϤāĨ¤

āωāĻĒāϰ⧇āϰ āĻ•āĻžāĻ°ā§āύ⧇āϞāϗ⧁āϞāĻŋāϰ āĻāĻ•āϟāĻŋ āĻĄāĻžāωāύāϞ⧋āĻĄ āĻ•āϰ⧁āύ:

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
$ cd bpf-next

āĻāĻ•āϟāĻŋ āĻ¨ā§āϝ⧂āύāϤāĻŽ āĻ•āĻžāĻœā§‡āϰ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ:

$ cp /boot/config-`uname -r` .config
$ make localmodconfig

āĻĢāĻžāχāϞ⧇ BPF āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋ āϏāĻ•ā§āώāĻŽ āĻ•āϰ⧁āύ .config āφāĻĒāύāĻžāϰ āύāĻŋāĻœā§‡āϰ āĻĒāĻ›āĻ¨ā§āĻĻ⧇āϰ (āϏāĻŽā§āĻ­āĻŦāϤ CONFIG_BPF āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āϏāĻ•ā§āϰāĻŋāϝāĻŧ āĻ•āϰāĻž āĻšāĻŦ⧇ āϝ⧇āĻšā§‡āϤ⧁ systemd āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇)āĨ¤ āĻāĻ–āĻžāύ⧇ āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧāϟāĻŋāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻĨ⧇āϕ⧇ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϗ⧁āϞāĻŋāϰ āĻāĻ•āϟāĻŋ āϤāĻžāϞāĻŋāĻ•āĻž āϰāϝāĻŧ⧇āϛ⧇:

CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_LSM=y
CONFIG_BPF_SYSCALL=y
CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_BPF_JIT_DEFAULT_ON=y
CONFIG_IPV6_SEG6_BPF=y
# CONFIG_NETFILTER_XT_MATCH_BPF is not set
# CONFIG_BPFILTER is not set
CONFIG_NET_CLS_BPF=y
CONFIG_NET_ACT_BPF=y
CONFIG_BPF_JIT=y
CONFIG_BPF_STREAM_PARSER=y
CONFIG_LWTUNNEL_BPF=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
CONFIG_BPF_KPROBE_OVERRIDE=y
CONFIG_DEBUG_INFO_BTF=y

āϤāĻžāϰāĻĒāϰ⧇ āφāĻŽāϰāĻž āϏāĻšāĻœā§‡āχ āĻŽāĻĄāĻŋāωāϞ āĻāĻŦāĻ‚ āĻ•āĻžāĻ°ā§āύ⧇āϞāϗ⧁āϞāĻŋāϕ⧇ āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻāĻŦāĻ‚ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ (āĻĒā§āϰāϏāĻ™ā§āĻ—āĻ•ā§āϰāĻŽā§‡, āφāĻĒāύāĻŋ āύāϤ⧁āύ āĻ…ā§āϝāĻžāϏ⧇āĻŽā§āĻŦāϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻžāĻ°ā§āύ⧇āϞāϕ⧇ āĻāĻ•āĻ¤ā§āϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ clangāϝ⧋āĻ— āĻ•āϰ⧇ CC=clang):

$ make -s -j $(getconf _NPROCESSORS_ONLN)
$ sudo make modules_install
$ sudo make install

āĻāĻŦāĻ‚ āύāϤ⧁āύ āĻ•āĻžāĻ°ā§āύ⧇āϞ āĻĻāĻŋāϝāĻŧ⧇ āϰāĻŋāĻŦ⧁āϟ āĻ•āϰ⧁āύ (āφāĻŽāĻŋ āĻāϟāĻŋāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋ kexec āĻĒā§āϝāĻžāϕ⧇āϜ āĻĨ⧇āϕ⧇ kexec-tools):

v=5.8.0-rc6+ # ĐĩҁĐģи Đ˛Ņ‹ ĐŋĐĩŅ€ĐĩŅĐžĐąĐ¸Ņ€Đ°ĐĩŅ‚Đĩ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐĩ ŅĐ´Ņ€Đž, Ņ‚Đž ĐŧĐžĐļĐŊĐž Đ´ĐĩĐģĐ°Ņ‚ŅŒ v=`uname -r`
sudo kexec -l -t bzImage /boot/vmlinuz-$v --initrd=/boot/initrd.img-$v --reuse-cmdline &&
sudo kexec -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 āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āĻŋāĻ‚ āĻāĻŦāĻ‚ āϏ⧁āϰāĻ•ā§āώāĻž āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϗ⧁āϞāĻŋāϰ āωāĻĻāĻžāĻšāϰāĻŖāϗ⧁āϞāĻŋ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧁āύ⧎

āĻāχ āϏāĻŋāϰāĻŋāĻœā§‡āϰ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āύāĻŋāĻŦāĻ¨ā§āϧ

  1. āϛ⧋āϟāĻĻ⧇āϰ āϜāĻ¨ā§āϝ BPF, āĻ…āĻ‚āĻļ āĻļā§‚āĻ¨ā§āϝ: āĻ•ā§āϞāĻžāϏāĻŋāĻ• BPF

āϞāĻŋāĻ™ā§āĻ•

  1. BPF āĻāĻŦāĻ‚ XDP āϰ⧇āĻĢāĻžāϰ⧇āĻ¨ā§āϏ āĻ—āĻžāχāĻĄ — āϏāĻŋāϞāĻŋāϝāĻŧāĻžāĻŽ āĻĨ⧇āϕ⧇ BPF-āĻāϰ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ, āĻŦāĻž āφāϰāĻ“ āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇ āĻĄā§āϝāĻžāύāĻŋāϝāĻŧ⧇āϞ āĻŦā§‹āĻ°ā§āĻ•āĻŽā§āϝāĻžāύ, BPF-āĻāϰ āĻ…āĻ¨ā§āϝāϤāĻŽ āύāĻŋāĻ°ā§āĻŽāĻžāϤāĻž āĻāĻŦāĻ‚ āϰāĻ•ā§āώāĻŖāĻžāĻŦ⧇āĻ•ā§āώāĻŖāĻ•āĻžāϰ⧀āĨ¤ āĻāϟāĻŋ āĻĒā§āϰāĻĨāĻŽ āϗ⧁āϰ⧁āϤāϰ āĻŦāĻ°ā§āĻŖāύāĻžāϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ, āϝāĻž āĻ…āĻ¨ā§āϝāĻĻ⧇āϰ āĻĨ⧇āϕ⧇ āφāϞāĻžāĻĻāĻž āϝ⧇ āĻĄā§āϝāĻžāύāĻŋāϝāĻŧ⧇āϞ āĻ āĻŋāĻ• āϜāĻžāύ⧇āύ āϝ⧇ āϤāĻŋāύāĻŋ āϕ⧀ āϞāĻŋāĻ–āϛ⧇āύ āĻāĻŦāĻ‚ āϏ⧇āĻ–āĻžāύ⧇ āϕ⧋āύāĻ“ āϭ⧁āϞ āύ⧇āχāĨ¤ āĻŦāĻŋāĻļ⧇āώ āĻ•āϰ⧇, āĻāχ āύāĻĨāĻŋāϟāĻŋ āĻŦāĻ°ā§āĻŖāύāĻž āĻ•āϰ⧇ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ XDP āĻāĻŦāĻ‚ TC āϧāϰāϪ⧇āϰ BPF āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āϏ⧁āĻĒāϰāĻŋāϚāĻŋāϤ āχāωāϟāĻŋāϞāĻŋāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻ•āĻžāϜ āĻ•āϰāĻž āϝāĻžāϝāĻŧ ip āĻĒā§āϝāĻžāϕ⧇āϜ āĻĨ⧇āϕ⧇ iproute2.

  2. āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ/networking/filter.txt — āĻ•ā§āϞāĻžāϏāĻŋāĻ• āĻāĻŦāĻ‚ āϤāĻžāϰāĻĒāϰ āĻŦāĻ°ā§āϧāĻŋāϤ BPF āĻāϰ āϜāĻ¨ā§āϝ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ āϏāĻš āφāϏāϞ āĻĢāĻžāχāϞāĨ¤ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āϏāĻŽāĻžāĻŦ⧇āĻļ⧇āϰ āĻ­āĻžāώāĻž āĻāĻŦāĻ‚ āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋāĻ—āϤ āĻ¸ā§āĻĨāĻžāĻĒāĻ¤ā§āϝ⧇āϰ āĻŦāĻŋāĻļāĻĻ āϜāĻžāύāϤ⧇ āϚāĻžāύ āϤāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻ­āĻžāϞ āĻĒāĻĄāĻŧāĻžāĨ¤

  3. āĻĢ⧇āϏāĻŦ⧁āĻ• āĻĨ⧇āϕ⧇ BPF āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻŦā§āϞāĻ—. āĻāϟāĻŋ āϖ⧁āĻŦ āĻ•āĻŽāχ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻž āĻšāϝāĻŧ, āϤāĻŦ⧇ āϝāĻĨāĻžāϝāĻĨāĻ­āĻžāĻŦ⧇, āϝ⧇āĻŽāύ āφāϞ⧇āĻ•ā§āϏāĻŋ āĻ¸ā§āϟāĻžāϰ⧋āĻ­āϝāĻŧ⧇āϟāĻ­ (āχāĻŦāĻŋāĻĒāĻŋāĻāĻĢ-āĻāϰ āϞ⧇āĻ–āĻ•) āĻāĻŦāĻ‚ āφāĻ¨ā§āĻĻā§āϰāĻŋ āύāĻžāĻ•ā§āϰāĻŋāϕ⧋ - (āϰāĻ•ā§āώāĻŖāĻžāĻŦ⧇āĻ•ā§āώāĻŖāĻ•āĻžāϰ⧀) āϏ⧇āĻ–āĻžāύ⧇ āϞāĻŋāϖ⧇āϛ⧇āύāĨ¤ libbpf).

  4. bpftool āĻāϰ āĻ—ā§‹āĻĒāύ⧀āϝāĻŧāϤāĻž. Bpftool āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āωāĻĻāĻžāĻšāϰāĻŖ āĻāĻŦāĻ‚ āĻ—ā§‹āĻĒāύ⧀āϝāĻŧāϤāĻž āϏāĻš Quentin Monnet āĻĨ⧇āϕ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻŋāύ⧋āĻĻāύāĻŽā§‚āϞāĻ• āϟ⧁āχāϟāĻžāϰ āĻĨā§āϰ⧇āĻĄāĨ¤

  5. BPF-āĻ āĻĄā§āĻŦ: āĻĒāĻĄāĻŧāĻžāϰ āωāĻĒāĻžāĻĻāĻžāύ⧇āϰ āĻāĻ•āϟāĻŋ āϤāĻžāϞāĻŋāĻ•āĻž. Quentin Monnet āĻĨ⧇āϕ⧇ BPF āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ⧇āϰ āϞāĻŋāĻ™ā§āĻ•āϗ⧁āϞāĻŋāϰ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻļāĻžāϞ (āĻāĻŦāĻ‚ āĻāĻ–āύāĻ“ āĻŦāϜāĻžāϝāĻŧ āϰāĻžāĻ–āĻž) āϤāĻžāϞāĻŋāĻ•āĻžāĨ¤

āωāĻ¤ā§āϏ: www.habr.com