рдиреЗрдЯрд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░рд▓ рд▓рд┐рдирдХреНрд╕ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЙрдирд┐рдЯрд░

рдПрдХ рдмрд╛рд░, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдореБрдЭреЗ рд╕рднреА рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлреЗрд╕, рд░реВрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдкрд░ рд╕рдЦреНрдд рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд╕рд╛рде рд╣реА рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреА рд╕реВрдЪрдирд╛ рднреА рдкреНрд░рд╛рдкреНрдд рд╣реБрдИред рдПрдХ рд░рдгрдиреАрддрд┐рдХ рдирд┐рд░реНрдгрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ ioctl netdevice (SIOCGIFMETRIC, SIOCSIFNAME, рдЖрджрд┐) рдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ (ifconfig, рдорд╛рд░реНрдЧ, рдЖрджрд┐) рдХреЛ рд╕реАрдзреЗ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдзрд┐рдХ рдЖрдзреБрдирд┐рдХ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдкрд╛рдпрд╛ рдЧрдпрд╛ - libnetlinkред рдпрд╣ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдиреЗрдЯрд▓рд┐рдВрдХ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓ рдереА, рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓реАред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рдереА рдмрд▓реНрдХрд┐ рдЬрдЯрд┐рд▓ рдПрдкреАрдЖрдИ рдереА, рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЕрд╕реНрдкрд╖реНрдЯ рдХреНрд░рд┐рдпрд╛рдПрдВ рдереАрдВред рдкреНрд░рд▓реЗрдЦрди рдХреА рд▓рдЧрднрдЧ рдкреВрд░реНрдг рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЖрдо рддреМрд░ рдкрд░ рдХрд┐рд╕реА рднреА рд╕рд╛рдордЧреНрд░реА рдиреЗ рд╡рд┐рд╢реЗрд╖ рдордЬрд╝рд╛ рдЬреЛрдбрд╝рд╛ред
рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдиреЗрдЯрд▓рд┐рдВрдХ рдХреЛ рдареАрдХ рд╕реЗ рд╕рдордЭрдиреЗ рдФрд░ рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдлрд┐рд▓рд╣рд╛рд▓, рд╕реВрдЪрдирд╛рдУрдВ, рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлреЗрд╕, рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ IPv4 рдФрд░ IPv6 рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рдЬрд▓реНрдж рд╣реА рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЬрдирддрд╛ рдХреЗ рд╕рд╛рдордиреЗ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ :) рдЕрдм рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореЙрдирд┐рдЯрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдиреЗрдЯрд▓рд┐рдВрдХ рдХреА рдЦреВрдмрд╕реВрд░рдд рджреБрдирд┐рдпрд╛ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддреЗ рд╣реИрдВред

рдиреЗрдЯрд▓рд┐рдВрдХ рдХреНрдпрд╛ рд╣реИ?

рддреЛ, рдиреЗрдЯрд▓рд┐рдВрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЗ рдмреАрдЪ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИред рд╕рдВрдЪрд╛рд░ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ - AF_NETLINKред
рдиреЗрдЯрд▓рд┐рдВрдХ рдЖрдкрдХреЛ рдХрд░реНрдиреЗрд▓ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдЗрдВрдЯрд░рдлреЗрд╕, рд░реВрдЯрд┐рдВрдЧ, рдиреЗрдЯрд╡рд░реНрдХ рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдЕрдкрдиреЗ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЪрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреНрд░рддреНрдпреЗрдХ рдиреЗрдЯрд▓рд┐рдВрдХ рд╕рдВрджреЗрд╢ рдПрдХ рд╣реЗрдбрд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рд╢рдореНрд╕рдЧрдбреНрд░ рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ - рдПрдХ "рдкреЗрд▓реЛрдб"ред рдпрд╣ "рд▓реЛрдб" рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛, рдпрд╛ рд╕рд┐рд░реНрдл рд░реЙ рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрджреЗрд╢, рдкреНрд░рд╕рд╡ рдХреЗ рджреМрд░рд╛рди, рдХрдИ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдкреИрдХреЗрдЯ рдХреЛ рдзреНрд╡рдЬ NLM_F_MULTI, рдФрд░ рдЕрдВрддрд┐рдо рдзреНрд╡рдЬ NLMSG_DONE рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ netlink.h рдФрд░ rtnetlink.h рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реЗрдЯ рд╣реИ

рдПрдХ рдиреЗрдЯрд▓рд┐рдВрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдПрдВред

рдПрдХ рдиреЗрдЯрд▓рд┐рдВрдХ рд╕реЙрдХреЗрдЯ рдШреЛрд╖рдгрд╛ рдмрд╣реБрдд рдорд╛рдирдХ рд▓рдЧрддреА рд╣реИ:

socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE)

рдЬрд╣рд╛рдБ AF_NETLINK - рдиреЗрдЯрд▓рд┐рдВрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓
SOCK_RAW - рд╕реЙрдХреЗрдЯ рдкреНрд░рдХрд╛рд░
NETLINK_ROUTE - рдиреЗрдЯрд▓рд┐рдВрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░рд┐рд╡рд╛рд░ред

рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдореАрдЯрд░ рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдо рдиреЗрдЯрд▓рд┐рдВрдХ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рджреВрдВрдЧрд╛ (рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдорд┐рд▓ рд╕рдХрддреА рд╣реИ):

NETLINK_ROUTE - рд░реВрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рд╕реВрдЪрдирд╛рдПрдБ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдкрд░реЛрдХреНрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
NETLINK_USERSOCK - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИред
NETLINK_FIREWALL - рдиреЗрдЯрд╡рд░реНрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрддрд░ рддрдХ IPv4 рдкреИрдХреЗрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ
NETLINK_INET_DIAG - рдЗрдирд╕реЗрдЯ рд╕реЙрдХреЗрдЯ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛
NETLINK_NFLOG - ULOG рдиреЗрдЯрд╡рд░реНрдХ / рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░
NETLINK_SELINUX - рд╕реЗрд▓рд┐рдирдХреНрд╕ рдкреНрд░рдгрд╛рд▓реА рд╕реЗ рд╕реВрдЪрдирд╛рдПрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
NETLINK_NETFILTER - рдиреЗрдЯрд╡рд░реНрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
NETLINK_KOBJECT_UEVENT - рдХрд░реНрдиреЗрд▓ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрдирд╛рдП рдЧрдП рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЗрдВрдб рдлрдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред

рдиреЗрдЯрд▓рд┐рдВрдХ рд╕рдВрджреЗрд╢ред

рд╕рдВрджреЗрд╢ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ nlmsghdr рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
 struct nlmsghdr { __u32 nlmsg_len; //  ,    __u16 nlmsg_type; //    (  ) __u16 nlmsg_flags; //    __u32 nlmsg_seq; //    __u32 nlmsg_pid; //   (PID),   }; 


Nlmsg_type рдлрд╝реАрд▓реНрдб рдорд╛рдирдХ рд╕рдВрджреЗрд╢ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ:
NLMSG_NOOP - рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
NLMSG_ERROR - рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢, рдФрд░ nlmsgerr рд╕рдВрд░рдЪрдирд╛ рдкреЗрд▓реЛрдб рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╣реЛрдЧреА (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)
NLMSG_DONE - рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджреЗрд╢ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рд╕рдВрджреЗрд╢, рдХрдИ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ

Nlmsgerr рд╕рдВрд░рдЪрдирд╛
 struct nlmsgerr { int error; //     struct nlmsghdr msg; //  ,    }; 


рд╕рдВрджреЗрд╢ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд╛рд░реНрдХрд┐рдХ рдпрд╛) рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВ:

NLM_F_REQUEST - рд╕рдВрджреЗрд╢ - рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз
NLM_F_MULTI - рд╕рдВрджреЗрд╢, рд╕рдВрджреЗрд╢ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдЯреВрдЯ рдЧрдпрд╛ рд╣реИ
NLM_F_ACK - рд╕рдВрджреЗрд╢ - рдкреБрд╖реНрдЯрд┐рдХрд░рдг рдЕрдиреБрд░реЛрдз
NLM_F_ECHO - рдЧреВрдВрдЬ рдЕрдиреБрд░реЛрдзред рд╕рд╛рдорд╛рдиреНрдп рджрд┐рд╢рд╛ рдХрд░реНрдиреЗрд▓ рд╕реНрддрд░ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрддрд░ рддрдХ рдХреНрд╡реЗрд░реА рд╣реИ
NLM_F_ROOT - рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдХреНрд╡реЗрд░реА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЗрдХрд╛рдИ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рд▓реМрдЯрд╛рддреА рд╣реИ
NLM_F_MATCH - рдХреНрд╡реЗрд░реА рд╕рднреА рдорд┐рд▓реЗ рд╣реБрдП рдореИрдЪреЛрдВ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
NLM_F_ATOMIC - рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкрд░рдорд╛рдгреБ рдЯреБрдХрдбрд╝рд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
NLM_F_DUMP - NLM_F_ROOT рдХрд╛ рдПрдирд╛рд▓реЙрдЧ | NLM_F_MATCH

рдЕрддрд┐рд░рд┐рдХреНрдд рдЭрдВрдбреЗ:

NLM_F_REPLACE - рдПрдХ рдореМрдЬреВрджрд╛ рд╕рдорд╛рди рд╡рд╕реНрддреБ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ
NLM_F_EXCL - рдпрджрд┐ рдРрд╕реА рдХреЛрдИ рд╡рд╕реНрддреБ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ рддреЛ рдЙрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рди рдХрд░реЗрдВ
NLM_F_CREATE - рдореМрдЬреВрдж рди рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ
NLM_F_APPEND - рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдореМрдЬреВрджрд╛ рдПрдХ рд╡рд╕реНрддреБ рдЬреЛрдбрд╝реЗрдВ

рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдХрд░реНрдиреЗрд▓ рд╕реНрддрд░ рдкрд░ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрддрд░ рдкрд░), рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрддрд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИ - nladdr:

 struct sockaddr_nl { sa_family_t nl_family; //   -  AF_NETLINK unsigned short nl_pad; //     pid_t nl_pid; //   __u32 nl_groups; //   / }; 


nl_pid рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╕реЙрдХреЗрдЯ рдкрддрд╛ рд╣реИред рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рд╣реЛрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрддрд░ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕реЙрдХреЗрдЯ рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрдИ рдиреЗрдЯрд▓рд┐рдВрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рдирдпрд╛ рд╕реЙрдХреЗрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рддреНрд░реБрдЯрд┐ "рдСрдкрд░реЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ" рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, nl_pid рдХреЛ рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдорд╛рди рд╕реМрдВрдкрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
pthread_self() << 16 | getpid();
рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдорд╛рди рдХреЛ рдмрд╛рдЗрдВрдб рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╢реВрдиреНрдп рдорд╛рди рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрд░реНрдиреЗрд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдкрд╣рд▓реЗ рд╕реЙрдХреЗрдЯ рдХреЛ рд╣рдореЗрд╢рд╛ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдорд╛рди рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рдПрдЧрд╛ред

nl_groups рдПрдХ рдмрд┐рдЯрдорд╛рд╕реНрдХ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдЯ рдПрдХ рдиреЗрдЯрд▓рд┐рдВрдХ рд╕рдореВрд╣ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдиреЗрдЯрд▓рд┐рдВрдХ рд╕реЙрдХреЗрдЯ рдкрд░ рдмрд╛рдЗрдВрдб () рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рдЙрд╕ рд╕рдореВрд╣ рдХреЗ рдмрд┐рдЯ рдорд╛рд╕реНрдХ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реБрдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рд╕рдореВрд╣реЛрдВ рдХреЛ рддрд╛рд░реНрдХрд┐рдХ рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рдореБрдЦ рд╕рдореВрд╣ рдиреЗрдЯрд▓рд┐рдВрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред
рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

RTMGRP_LINK - рдпрд╣ рд╕рдореВрд╣ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ (рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗрд╡рд╛рдирд┐рд╡реГрддреНрдд, рдЬреЛрдбрд╝рд╛, рдЧрд┐рд░рд╛, рдЧреБрд▓рд╛рдм)
RTMGRP_IPV4_IFADDR - рдЗрд╕ рд╕рдореВрд╣ рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ IPv4 рдкрддреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ (рдкрддрд╛ рдЬреЛрдбрд╝рд╛ рдпрд╛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)
RTMGRP_IPV6_IFADDR - рдЗрд╕ рд╕рдореВрд╣ рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ IPv6 рдкрддреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рд╕реВрдЪрдирд╛ рдорд┐рд▓рддреА рд╣реИ (рдкрддрд╛ рдЬреЛрдбрд╝рд╛ рдпрд╛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)
RTMGRP_IPV4_ROUTE - рдЗрд╕ рд╕рдореВрд╣ рдХреЛ IPv4 рдкрддреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рд╕реВрдЪрдирд╛рдПрдБ рдорд┐рд▓рддреА рд╣реИрдВ
RTMGRP_IPV6_ROUTE - рдЗрд╕ рд╕рдореВрд╣ рдХреЛ IPv6 рдкрддреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╛рдЙрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рд╕реВрдЪрдирд╛рдПрдБ рдорд┐рд▓рддреА рд╣реИрдВ

Nlmsghdr рд╣реЗрдбрд░ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рдж, рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рд╣рдореЗрд╢рд╛ рдПрдХ рд╕реВрдЪрдХ рд╣реЛрддрд╛ рд╣реИред рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдиреЗрдЯрд▓рд┐рдВрдХ рдореИрдХреНрд░реЛрдЬрд╝

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА, рдореИрдХреНрд░реЛ рд╣реИрдВ:
NLMSG_ALIGN - рдирд┐рдХрдЯрддрдо рдмрдбрд╝реА рд╕реАрдорд╛-рд╕рдВрд░реЗрдЦрд┐рдд рдорд╛рди рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд▓рд┐рдВрдХ рд╕рдВрджреЗрд╢ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рд╕реАрдорд╛рдмрджреНрдз рдХрд░рддрд╛ рд╣реИ ред
NLMSG_LENGTH - рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб (рдкреЗрд▓реЛрдб) рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ nlmsgdlen рд╣реЗрдбрд░ рдХреЗ nlmsg_len рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдорд╛-рд╕рдВрд░реЗрдЦрд┐рдд рдЖрдХрд╛рд░ рдорд╛рди рджреЗрддрд╛ рд╣реИред
NLMSG_SPACE - рд╡рд╣ рдЖрдХрд╛рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдиреЗрдЯрд▓рд┐рдВрдХ рдкреИрдХреЗрдЯ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд▓рдВрдмрд╛рдИ рдХреЗ рдбреЗрдЯрд╛ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░реЗрдЧрд╛ред
NLMSG_DATA - рдкрд╛рд╕ рдХрд┐рдП рдЧрдП nlmsghdr рд╣реЗрдбрд░ рд╕реЗ рдЬреБрдбрд╝реЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
NLMSG_NEXT - рдПрдХ рд╕рдВрджреЗрд╢ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЛ рдХрдИ рднрд╛рдЧреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдореИрдХреНрд░реЛ рдПрдХ рдмрд╣реБ-рднрд╛рдЧ рд╕рдВрджреЗрд╢ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд nlmsghdr рд╣реЗрдбрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд░реНрддрдорд╛рди рдПрдореНтАНрдореНтАНрд╕рдореИрдЧрдбреНрд░рд░ рд╣реЗрдбрд░ рдореЗрдВ NLMSG_DONE рдлреНрд▓реИрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП - рдЬрдм рд╕рдВрджреЗрд╢ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИ рддреЛ рдлрд╝рдВрдХреНрд╢рди NULL рдирд╣реАрдВ рд▓реМрдЯрддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рдВрджреЗрд╢ рдмрдлрд╝рд░ рдХреЗ рд╢реЗрд╖ рднрд╛рдЧ рдХрд╛ рдЖрдХрд╛рд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдореИрд╕реЗрдЬ рд╣реЗрдбрд░ рдХреЗ рдЖрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдореИрдХреНрд░реЛ рдЗрд╕ рдорд╛рди рдХреЛ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИред
NLMSG_OK - рдпрджрд┐ рд╕рдВрджреЗрд╢ рдХрд╛рдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЙрд╕рдХрд╛ рдбрд┐рд╕реНрд╕реЗрдХреНрд╢рди рд╕рдлрд▓ рд░рд╣рд╛ рдерд╛ рддреЛ рдпрд╣ рд╕рд╣реА рд╣реИред
NLMSG_PAYLOAD - nlmsghdr рд╣реИрдбрд░ рд╕реЗ рдЬреБрдбрд╝реЗ рдкреЗрд▓реЛрдб рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рдЕрднреНрдпрд╛рд╕ рддрдХред


рддреЛ рдареАрдХ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЙрдмрд╛рдК рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рдКрдм рдЧрдпрд╛ рдерд╛ :) рд╢рд╛рдпрдж рдХреБрдЫ рднреНрд░рдорд┐рдд рдпрд╛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рдерд╛ - рдореИрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЪрдмрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рд╡рд╣рд╛рдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред
рдиреАрдЪреЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЖрд╡реЗрджрди рд╣реИ рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд░реВрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреА рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХрдИ рдирдП рдврд╛рдВрдЪреЗ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рд╣реИрдВ:

 struct iovec { void *iov_base; //   __kernel_size_t iov_len; //   }; 

рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдиреЗрдЯрд▓рд┐рдВрдХ рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рдЙрдкрдпреЛрдЧреА рдбреЗрдЯрд╛ рдХреЗ рднрдВрдбрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИред Iov_base рдлрд╝реАрд▓реНрдб рдХреЛ рдПрдХ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдореЗрдВ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдбреЗрдЯрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

 struct msghdr { void *msg_name; //   ( ) int msg_namelen; //   struct iovec *msg_iov; //     __kernel_size_t msg_iovlen; //    void *msg_control; //    ,      __kernel_size_t msg_controllen; //     unsigned msg_flags; //   }; 

рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рд╕реАрдзреЗ рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддреА рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реЛрддрд╛ рд╣реИ рдЙрдкрдпреЛрдЧреА рдбреЗрдЯрд╛ рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ, рдмреНрд▓реЙрдХ рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЭрдВрдбреЗ рдФрд░ рдлрд╝реАрд▓реНрдб рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЖрдП рд╣реИрдВ, рдмреАрдПрд╕рдбреА рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╕реЗред

 struct ifinfomsg { unsigned char ifi_family; //  (AF_UNSPEC) unsigned short ifi_type; //   int ifi_index; //   unsigned int ifi_flags; //   unsigned int ifi_change; //  ,           0xFFFFFFFF }; 

рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЗрдЯрд╡рд░реНрдХ рдбрд┐рд╡рд╛рдЗрд╕, рдЙрд╕рдХреЗ рдкрд░рд┐рд╡рд╛рд░, рдкреНрд░рдХрд╛рд░, рд╕реВрдЪрдХрд╛рдВрдХ рдФрд░ рдЭрдВрдбреЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 struct ifaddrmsg { unsigned char ifa_family; //   (AF_INET  AF_INET6) unsigned char ifa_prefixlen; //    (  ) unsigned char ifa_flags; //   unsigned char ifa_scope; //   int ifa_index; //  ,     ifinfomsg }; 

рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдкрддреЗ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 struct rtattr { unsigned short rta_len; //   unsigned short rta_type; //   /*  */ } 

рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдХрдиреЗрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рдкрддреЗ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕реНрд░реЛрдд рдХреЛрдб рдореЙрдирд┐рдЯрд░

 #include <errno.h> #include <stdio.h> #include <memory.h> #include <net/if.h> #include <arpa/inet.h> #include <sys/socket.h> #include <linux/rtnetlink.h> //   ,     netlink    //       rtattr void parseRtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len) { memset(tb, 0, sizeof(struct rtattr *) * (max + 1)); while (RTA_OK(rta, len)) { //     if (rta->rta_type <= max) { tb[rta->rta_type] = rta; //  } rta = RTA_NEXT(rta,len); //    } } int main() { int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); //    if (fd < 0) { printf("  netlink : %s", (char*)strerror(errno)); return 1; } struct sockaddr_nl local; //   char buf[8192]; //   struct iovec iov; //   iov.iov_base = buf; //  buf      iov iov.iov_len = sizeof(buf); //    memset(&local, 0, sizeof(local)); //   local.nl_family = AF_NETLINK; //    local.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE; //    local.nl_pid = getpid(); //       //   netlink -    struct msghdr msg; { msg.msg_name = &local; //   -    msg.msg_namelen = sizeof(local); //   msg.msg_iov = &iov; //     msg.msg_iovlen = 1; //    } if (bind(fd, (struct sockaddr*)&local, sizeof(local)) < 0) { //    printf("   netlink : %s", (char*)strerror(errno)); close(fd); return 1; } //       while (1) { ssize_t status = recvmsg(fd, &msg, MSG_DONTWAIT); //   bind()        //   if (status < 0) { if (errno == EINTR || errno == EAGAIN) { usleep(250000); continue; } printf("   netlink: %s", (char*)strerror(errno)); continue; } if (msg.msg_namelen != sizeof(local)) { //  ,   :) printf("   "); continue; } //    struct nlmsghdr *h; //     for (h = (struct nlmsghdr*)buf; status >= (ssize_t)sizeof(*h); ) { //     int len = h->nlmsg_len; //    int l = len - sizeof(*h); //    char *ifName; //   if ((l < 0) || (len > status)) { printf("  : %i", len); continue; } //    if ((h->nlmsg_type == RTM_NEWROUTE) || (h->nlmsg_type == RTM_DELROUTE)) { //     -   printf("    \n"); } else { //        char *ifUpp; //   char *ifRunn; //   struct ifinfomsg *ifi; //   ,      struct rtattr *tb[IFLA_MAX + 1]; //   , IFLA_MAX   rtnetlink.h ifi = (struct ifinfomsg*) NLMSG_DATA(h); //          parseRtattr(tb, IFLA_MAX, IFLA_RTA(ifi), h->nlmsg_len); //     if (tb[IFLA_IFNAME]) { //   ,    ifName = (char*)RTA_DATA(tb[IFLA_IFNAME]); //   } if (ifi->ifi_flags & IFF_UP) { //    UP   ifUpp = (char*)"UP"; } else { ifUpp = (char*)"DOWN"; } if (ifi->ifi_flags & IFF_RUNNING) { //    RUNNING   ifRunn = (char*)"RUNNING"; } else { ifRunn = (char*)"NOT RUNNING"; } char ifAddress[256]; //    struct ifaddrmsg *ifa; //         struct rtattr *tba[IFA_MAX+1]; //    ifa = (struct ifaddrmsg*)NLMSG_DATA(h); //     parseRtattr(tba, IFA_MAX, IFA_RTA(ifa), h->nlmsg_len); //     if (tba[IFA_LOCAL]) { //      inet_ntop(AF_INET, RTA_DATA(tba[IFA_LOCAL]), ifAddress, sizeof(ifAddress)); //  IP  } switch (h->nlmsg_type) { //   case RTM_DELADDR: printf("    %s\n", ifName); break; case RTM_DELLINK: printf("   %s\n", ifName); break; case RTM_NEWLINK: printf("  %s,   %s %s\n", ifName, ifUpp, ifRunn); break; case RTM_NEWADDR: printf("     %s: %s\n", ifName, ifAddress); break; } } status -= NLMSG_ALIGN(len); //     (    -   ,   :)) h = (struct nlmsghdr*)((char*)h + NLMSG_ALIGN(len)); //   } usleep(250000); //  ,       } close(fd); //    return 0; } 


рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╕рдВрдХрд▓рди:
gcc monitor.c -o monitor

рдФрд░ рдХрд╛рдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо:


рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгред
рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдПрдХ рдиреЗрдЯрд▓рд┐рдВрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рд╕рдлрд▓рддрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрд╡рд╢реНрдпрдХ рдЪрд░ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдкрддрд╛ рд╕рдВрд░рдЪрдирд╛ рдЖрдмрд╛рдж рд╣реЛрддреА рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдЙрди рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рдореВрд╣реЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: RTMGRP_LINK, RTMGRP_IPV4_IFADDR, RTMGRP_IPV4_ROUTEред
рд╣рдо рд╕рдВрджреЗрд╢ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рднреА рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕реЙрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдВрдбрд┐рдВрдЧ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЛрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рджрд╕реНрдп рдмрди рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдк рдПрдХ рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдмрд╛рдж рд╕реЙрдХреЗрдЯ рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рд╣реЛрддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдореЗрдВ рдХрдИ рд╣реЗрдбрд░ рдФрд░ рдЙрдирд╕реЗ рдЬреБрдбрд╝реЗ рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рд╣рдо рдиреЗрдЯрд▓рд┐рдВрдХ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛ рд╕рдВрджреЗрд╢ рдкреЙрдЗрдВрдЯрд░ рд╕рдВрд░рдЪрдирд╛ nlmsghdr * h рдкрд░ рд╕реНрдерд┐рдд рд╣реИред
рдЕрдм рдЖрдк рд╕рдВрджреЗрд╢ рдХреЛ рд╕реНрд╡рдпрдВ рдкрд╛рд░реНрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо nlmsg_type рдлрд╝реАрд▓реНрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрджреЗрд╢ рдЖрдпрд╛ред рдпрджрд┐ рдпрд╣ рд░реВрдЯрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рддреЛ рд╣рдо рд╕рдВрджреЗрд╢ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд▓реЗ рд╕рдВрджреЗрд╢ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдо рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдЖрд░рдЯреАрдПрдЯреАрдЖрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд╣рд╛рдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗред рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП parseRtattr рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╣ netlink рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ ifinfomsg рдпрд╛ ifaddrmsg рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рд╕реЗ рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рд░рдгреА рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рд╕рд░рдгрд┐рдпрд╛рдБ рдорд┐рд▓реАрдВ - рд╣рдо рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЗрд╕рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рд╕реВрдЪрдХрд╛рдВрдХ рдиреЗрдЯрд▓рд┐рдВрдХ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЧрдИ рд╣реИред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
IFLA_IFNAME - рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реВрдЪрдХрд╛рдВрдХред
IFA_LOCAL - рд╕реНрдерд╛рдиреАрдп рдЖрдИрдкреА рдкрддреЗ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реВрдЪрдХрд╛рдВрдХред
рдЗрд╕ рд╕рдм рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ рдФрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд┐рдВрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╣ рд╕рдм рд╣реИред рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред
рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд▓реЛрдЧ рд╣реИрдВ (рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡реНрдпрдХреНрддрд┐ :)) - рдореИрдВ рдПрдХ рдЕрдЧрд▓реА рдХрдбрд╝реА рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдпрд╛ рдЖрдИрдкреАрд╡реА 6 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред

рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
1. tools.ietf.org/html/rfc3549
2. www.linuxjournal.com/article/7356

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

Source: https://habr.com/ru/post/In121254/


All Articles