āĻ›ā§‹āĻŸāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ 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 āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻāĻŦāĻ‚ āĻāĻ° āĻŦāĻŋāĻ•āĻžāĻļ āĻŽā§‡āĻ˛āĻŋāĻ‚ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ [email protected]. āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ā§‡āĻ° āĻŦāĻžāĻ‡āĻ°ā§‡ āĻŦāĻ¸āĻŦāĻžāĻ¸āĻ•āĻžāĻ°ā§€ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĒā§ƒāĻĨāĻ• āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻŦā§‡āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ 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

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨