netlink

Autres langues

Langue: ja

Version: 2005-12-27 (openSuse - 09/10/07)

Autres sections - même nom

Section: 7 (Divers)

̾Á°

netlink - ¥«¡¼¥Í¥ë¤È¥æ¡¼¥¶¡¼¶õ´Ö¤ÎÄÌ¿® (PF_NETLINK)

½ñ¼°


#include <asm/types.h>


#include <sys/socket.h>
#include <linux/netlink.h>
netlink_socket = socket(PF_NETLINK, socket_type, netlink_family);
 

ÀâÌÀ

netlink ¤Ï¥«¡¼¥Í¥ë¥â¥¸¥å¡¼¥ë¤È¥æ¡¼¥¶¡¼¶õ´Ö¤Î¥×¥í¥»¥¹´Ö¤Ç ¾ðÊó¤ò¤ä¤ê¤È¤ê¤¹¤ë¤¿¤á¤ËÍѤ¤¤é¤ì¤ë¡£ netlink ¤Ï¡¢¥æ¡¼¥¶¡¼¥×¥í¥»¥¹¤ËÂФ·¤Æ¤Ï ɸ½àŪ¤Ê¥½¥±¥Ã¥È¥Ù¡¼¥¹¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò¡¢ ¥«¡¼¥Í¥ë¥â¥¸¥å¡¼¥ë¤Ë¤Ï¥«¡¼¥Í¥ë¤ÎÆâÉô API ¤òÄ󶡤¹¤ë¡£ ¥«¡¼¥Í¥ëÆâÉô¤Î¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ë¤Ä¤¤¤Æ¤Ï¤³¤Î man ¥Ú¡¼¥¸¤Ç¤Ïµ­½Ò¤·¤Ê¤¤¡£ ¤Þ¤¿¡¢netlink ¥­¥ã¥é¥¯¥¿¥Ç¥Ð¥¤¥¹¤òÍѤ¤¤¿ obsolete ¤Ê netlink ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤â¤¢¤ë¤¬¡¢¤³¤ì¤â¤³¤Îʸ½ñ¤Ç¤Ï²òÀ⤷¤Ê¤¤¡£ ¤³¤ì¤Ïñ¤Ë²áµî¸ß´¹À­¤Î¤¿¤á¤ËÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¤â¤Î¤Ë¤¹¤®¤Ê¤¤¡£

netlink ¤Ï¥Ç¡¼¥¿¥°¥é¥à»Ø¸þ¤Î¥µ¡¼¥Ó¥¹¤Ç¤¢¤ë¡£ socket_type ¤Ë¤Ï SOCK_RAW ¤È SOCK_DGRAM ¤ÎξÊý¤È¤â»ØÄê²Äǽ¤Ç¤¢¤ë¡£ ¤·¤«¤· netlink ¥×¥í¥È¥³¥ë¤Ï¥Ç¡¼¥¿¥°¥é¥à¤È raw ¥½¥±¥Ã¥È¤Î¶èÊ̤ò¤·¤Ê¤¤¡£

netlink_family ¤Ï¡¢ÄÌ¿®¤¹¤ë¥«¡¼¥Í¥ë¥â¥¸¥å¡¼¥ë¤ä netlink ¥°¥ë¡¼¥×¤ÎÁªÂò¤ËÍѤ¤¤ë¡£ ¸½ºß³ä¤êÅö¤Æ¤é¤ì¤Æ¤¤¤ë netlink ¥Õ¥¡¥ß¥ê¡¼¤Ï°Ê²¼¤ÎÄ̤ꡣ

NETLINK_ROUTE
¥ë¡¼¥Æ¥£¥ó¥°¤È¥ê¥ó¥¯¤Î¹¹¿·¤ò¼õ¿®¤¹¤ë¡£ (IPv4 ¤È IPv6 ξÊý¤Î) ¥ë¡¼¥Æ¥£¥ó¥°¥Æ¡¼¥Ö¥ë¡¦ IP ¥¢¥É¥ì¥¹¡¦¥ê¥ó¥¯¥Ñ¥é¥á¡¼¥¿¡¦¶á˵ÀßÄê (neighbour setup)¡¦ ¥­¥å¡¼¥¤¥ó¥°¥ë¡¼¥ë (queueing dicipline)¡¦¥È¥é¥Õ¥£¥Ã¥¯¥¯¥é¥¹¡¦ ¥Ñ¥±¥Ã¥È¤Î¥¯¥é¥¹Ê¬Îà¤Î½¤Àµ¤ËÍѤ¤¤ë¤³¤È¤¬¤Ç¤­¤ë¤À¤í¤¦ (rtnetlink(7) ¤ò¸«¤è)¡£
NETLINK_W1
ñÀþ (1-wire) ¤Î¥µ¥Ö¥·¥¹¥Æ¥à¤«¤é¤Î¥á¥Ã¥»¡¼¥¸¡£
NETLINK_USERSOCK
¥æ¡¼¥¶¡¼¥â¡¼¥É¥½¥±¥Ã¥È¥×¥í¥È¥³¥ë¤Î¤¿¤á¤ËͽÌ󤵤ì¤Æ¤¤¤ë¡£
NETLINK_FIREWALL
IPv4 ¥Ñ¥±¥Ã¥È¤ò netfilter ¤«¤é¥æ¡¼¥¶¡¼¶õ´Ö¤ØžÁ÷¤¹¤ë¡£ ip_queue ¥«¡¼¥Í¥ë¥â¥¸¥å¡¼¥ë¤Ç»ÈÍѤµ¤ì¤ë¡£
NETLINK_INET_DIAG
INET ¥½¥±¥Ã¥È¤ò¥â¥Ë¥¿¥ê¥ó¥°¤¹¤ë¡£
NETLINK_NFLOG
Netfilter/iptables ULOG.
NETLINK_XFRM
IPsec.
NETLINK_SELINUX
SELinux ¤Î¥¤¥Ù¥ó¥ÈÄÌÃΡ£
NETLINK_ISCSI
Open-iSCSI.
NETLINK_AUDIT
´Æºº (audit) ¤ò¹Ô¤¦¡£
NETLINK_FIB_LOOKUP
¥æ¡¼¥¶¡¼¶õ´Ö¤«¤é FIB ¥ë¥Ã¥¯¥¢¥Ã¥×¤Ë¥¢¥¯¥»¥¹¤¹¤ë¡£
NETLINK_CONNECTOR
¥«¡¼¥Í¥ë¥³¥Í¥¯¥¿¡£ ¤è¤ê¾Ü¤·¤¤¾ðÊó¤Ï¥«¡¼¥Í¥ë¥½¡¼¥¹¤Î Documentation/connector/* ¤ò»²¾È¤¹¤ë¤³¤È¡£
NETLINK_NETFILTER
netfilter ¥µ¥Ö¥·¥¹¥Æ¥à¡£
NETLINK_IP6_FW
IPv6 ¥Ñ¥±¥Ã¥È¤ò netfilter ¤«¤é¥æ¡¼¥¶¡¼¶õ´Ö¤ØžÁ÷¤¹¤ë¡£ ip6_queue ¥«¡¼¥Í¥ë¥â¥¸¥å¡¼¥ë¤Ç»ÈÍѤµ¤ì¤ë¡£
NETLINK_DNRTMSG
DECnet ¥ë¡¼¥Æ¥£¥ó¥°¥á¥Ã¥»¡¼¥¸¡£
NETLINK_KOBJECT_UEVENT
¥æ¡¼¥¶¡¼¶õ´Ö¤Ø¤Î¥«¡¼¥Í¥ë¥á¥Ã¥»¡¼¥¸
NETLINK_GENERIC
netlink ¤ò´Êñ¤Ë»ÈÍѤ¹¤ë¤¿¤á¤Î°ìÈÌŪ¤Ê netlink ¥Õ¥¡¥ß¥ê¡¼¡£

netlink ¥á¥Ã¥»¡¼¥¸¤Ï¥Ð¥¤¥È¥¹¥È¥ê¡¼¥à¤«¤é¤Ê¤ê¡¢ °ì¤Ä°Ê¾å¤Î nlmsghdr ¥Ø¥Ã¥À¤È¡¢¤½¤ì¤ËÂбþ¤¹¤ë¥Ú¥¤¥í¡¼¥É (payload) ¤¬´Þ¤Þ¤ì¤ë¡£ ¥Ð¥¤¥È¥¹¥È¥ê¡¼¥à¤Ë¤Ï¡¢É¸½à¤Î NLMSG_* ¥Þ¥¯¥í¤Ë¤è¤Ã¤Æ¤Î¤ß¥¢¥¯¥»¥¹¤¹¤Ù¤­¤Ç¤¢¤ë¡£ ¤è¤ê¾Ü¤·¤¤¾ðÊó¤Ï netlink(3) ¤ò¸«¤è¡£

¥Þ¥ë¥Á¥Ñ¡¼¥È¥á¥Ã¥»¡¼¥¸ (°ì¤Ä°Ê¾å¤Î nlmsghdr ¥Ø¥Ã¥À¤È¡¢¤½¤ì¤ËÂбþ¤¹¤ë¥Ú¥¤¥í¡¼¥É¤¬ °ì¤Ä¥Ð¥¤¥È¥¹¥È¥ê¡¼¥à¤Ë´Þ¤Þ¤ì¤ë) ¤Ë¤ª¤¤¤Æ¤Ï¡¢ ÀèƬ¤Î¥Ø¥Ã¥À¡¦¸å³¤Î¥Ø¥Ã¥À¤Ë¤Ï NLM_F_MULTI ¥Õ¥é¥°¤¬¥»¥Ã¥È¤µ¤ì¤ë¡£¤¿¤À¤·ºÇ¸å¤Î¥Ø¥Ã¥À¤À¤±¤ÏÎã³°¤Ç¡¢ NLMSG_DONE ¥¿¥¤¥×¤È¤Ê¤ë¡£

¤½¤ì¤¾¤ì¤Î 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 ¥á¥Ã¥»¡¼¥¸¤Ï¥Þ¥ë¥Á¥Ñ¡¼¥È¥á¥Ã¥»¡¼¥¸¤Î½ªÎ»¤òÅÁ¤¨¤ë¡£


struct nlmsgerr {

    int error;        /* Éé¤Þ¤¿¤Ï 0 ¤Î errno ¤Ï±þÅú¤òɽ¤¹ */

    struct nlmsghdr msg;  /* ¥¨¥é¡¼¤òµ¯¤³¤·¤¿¥á¥Ã¥»¡¼¥¸¤Î¥Ø¥Ã¥À */

};

¤¢¤ë netlink ¥Õ¥¡¥ß¥ê¡¼¤Ç»ØÄê¤Ç¤­¤ë¥á¥Ã¥»¡¼¥¸¥¿¥¤¥×¤Ï¡¢ Ä̾ï¤â¤Ã¤È¿¤¤¡£¤³¤ì¤é¤Ë´Ø¤·¤Æ¤ÏŬÀÚ¤Ê man ¥Ú¡¼¥¸¤ò¸«¤Æ¤Û¤·¤¤¡£ ¤¿¤È¤¨¤Ð NETLINK_ROUTE ¤Ë´Ø¤·¤Æ¤Ï rtnetlink(7) ¤Ë½ñ¤¤¤Æ¤¢¤ë¡£

nlmsg_flags ¤Îɸ½à¥Õ¥é¥°¥Ó¥Ã¥È
---------------------------------

NLM_F_REQUEST Í×µá¥á¥Ã¥»¡¼¥¸Á´¤Æ¤Ç¥»¥Ã¥È¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
NLM_F_MULTI ¤³¤Î¥á¥Ã¥»¡¼¥¸¤Ï¥Þ¥ë¥Á¥Ñ¡¼¥È¥á¥Ã¥»¡¼¥¸¤Î°ìÉô¤Ç¤¢¤ë¡£ ¥Þ¥ë¥Á¥Ñ¡¼¥È¥á¥Ã¥»¡¼¥¸¤Ï NLMSG_DONE ¤Ç½ªÃ¼¤¹¤ë¡£
NLM_F_ACK À®¸ù¤·¤¿¾ì¹ç¤Î±þÅú¤òÍ׵᤹¤ë¡£
NLM_F_ECHO ¤³¤ÎÍ×µá¤ò¥¨¥³¡¼¤¹¤ë¡£

GET Í×µá¤Ë¤ª¤±¤ëÄɲåե饰¥Ó¥Ã¥È
-------------------------------------

NLM_F_ROOT ñ°ì¤Î¥¨¥ó¥È¥ê¤Ç¤Ï¤Ê¤¯¥Æ¡¼¥Ö¥ëÁ´ÂΤòÊÖ¤¹¡£
NLM_F_MATCH ¥á¥Ã¥»¡¼¥¸¤ÎÆâÍƤÇÅϤµ¤ì¤¿´ð½à (criteria) ¤Ë¥Þ¥Ã¥Á¤¹¤ë Á´¤Æ¤Î¥¨¥ó¥È¥ê¤òÊÖ¤¹¡£ ¤Þ¤À¼ÂÁõ¤µ¤ì¤Æ¤¤¤Ê¤¤¡£
NLM_F_ATOMIC ¥Æ¡¼¥Ö¥ë¤Î¥¢¥È¥ß¥Ã¥¯¤Ê¥¹¥Ê¥Ã¥×¥·¥ç¥Ã¥È¤òÊÖ¤¹¡£
NLM_F_DUMP ÊØÍø¤Ê¥Þ¥¯¥í¡£(NLM_F_ROOT|NLM_F_MATCH) ¤ÈƱ¤¸¡£

NLM_F_ATOMIC ¤ò»È¤¦¾ì¹ç¤Ï¡¢ CAP_NET_ADMIN ¸¢¸Â¤ò»ý¤Ä¤«¼Â¸ú¥æ¡¼¥¶¡¼ ID ¤¬ 0 ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤ÅÀ¤ËÃí°Õ¤¹¤ë¤³¤È¡£

NEW Í×µá¤Ë¤ª¤±¤ëÄɲåե饰¥Ó¥Ã¥È
-------------------------------------

NLM_F_REPLACE ¸½Â¸¤Î¥ª¥Ö¥¸¥§¥¯¥È¤òÃÖ´¹¤¹¤ë¡£
NLM_F_EXCL ¤¹¤Ç¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤¬¤¢¤Ã¤¿¤éÃÖ´¹¤·¤Ê¤¤¡£
NLM_F_CREATE ¤Þ¤À¥ª¥Ö¥¸¥§¥¯¥È¤¬¤Ê¤±¤ì¤ÐºîÀ®¤¹¤ë¡£
NLM_F_APPEND ¥ª¥Ö¥¸¥§¥¯¥È¥ê¥¹¥È¤ÎºÇ¸å¤ËÄɲ乤롣

nlmsg_seq ¤È nlmsg_pid ¤Ï¥á¥Ã¥»¡¼¥¸¤ÎÄÉÀפ˻ÈÍѤµ¤ì¤ë¡£ nlmsg_pid ¤Ï¥á¥Ã¥»¡¼¥¸¤ÎÁ÷¿®¸µ¤òɽ¤¹¡£ ¥á¥Ã¥»¡¼¥¸¤¬ netlink ¥½¥±¥Ã¥È¤ÇÁ÷¿®¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢ nlmsg_pid ¤È¥×¥í¥»¥¹¤Î PID ¤Ï 1:1 ¤Î´Ø·¸¤Ç¤Ï¤Ê¤¤ÅÀ¤ËÃí°Õ¤¹¤ë¤³¤È¡£ ¤è¤ê¾Ü¤·¤¤¾ðÊó¤Ï¡¢ ¡Ö¥¢¥É¥ì¥¹¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¡× ¤Î¥»¥¯¥·¥ç¥ó¤ò»²¾È¤¹¤ë¤³¤È¡£

nlmsg_seq ¤È nlmsg_pid ¤Ï netlink ¤Î¥³¥¢¤Ë¤Ï¸«¤¨¤Ê¤¤ (opaque)¡£

netlink ¤Ï¿®ÍêÀ­¤Î¹â¤¤¥×¥í¥È¥³¥ë¤Ç¤Ï¤Ê¤¤¡£ netlink ¤Ï¥á¥Ã¥»¡¼¥¸¤ò¹Ô¤­Àè¤ËÆϤ±¤ë¤¿¤á¤ËºÇÁ±¤ò¿Ô¤¯¤¹¤¬¡¢ ¥á¥â¥ê¤¬Â­¤ê¤Ê¤«¤Ã¤¿¤ê¥¨¥é¡¼¤¬µ¯¤³¤Ã¤¿¤ê¤¹¤ë¤È ¥á¥Ã¥»¡¼¥¸¤ò¼è¤ê¤³¤Ü¤¹¤³¤È¤â¤¢¤ë¡£ ¿®ÍêÀ­¤Î¹â¤¤Å¾Á÷¤ò¹Ô¤¤¤¿¤¤¤È¤­¤Ï¡¢ Á÷¿®¼Ô¤Ï¼õ¿®¼Ô¤Ë±þÅú¤òÍ׵᤹¤ë¤³¤È¤â¤Ç¤­¤ë¡£ ¤³¤ì¤Ë¤Ï NLM_F_ACK ¥Õ¥é¥°¤ò¥»¥Ã¥È¤¹¤ë¡£ ±þÅú¤Ï NLMSG_ERROR ¥Ñ¥±¥Ã¥È¤Î¥¨¥é¡¼¥Õ¥£¡¼¥ë¥É¤ò 0 ¤Ë¤·¤¿¤â¤Î¤Ë¤Ê¤ë¡£ ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ï¼«Ê¬¼«¿È¤Î¥á¥Ã¥»¡¼¥¸¤ò¼õ¤±¤¿¤È¤­¤Ë¤Ï¡¢ ±þÅú¤òÀ¸À®¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£ ¥«¡¼¥Í¥ë¤Ï¼ºÇÔ¤·¤¿¥Ñ¥±¥Ã¥È¤ËÂФ·¤Æ¡¢ NLMSG_ERROR ¥á¥Ã¥»¡¼¥¸¤òÁ÷¤í¤¦¤È¤¹¤ë¡£ ¥æ¡¼¥¶¡¼¥×¥í¥»¥¹¤Ï¤³¤Î´·½¬¤Ë¤â½¾¤¦É¬Íפ¬¤¢¤ë¡£

¤·¤«¤·¡¢¤É¤Î¤è¤¦¤Ê¾ì¹ç¤Ç¤â¥«¡¼¥Í¥ë¤«¤é¥æ¡¼¥¶¡¼¤Ø¤Î ¿®ÍêÀ­¤Î¹â¤¤Å¾Á÷¤ÏÉÔ²Äǽ¤Ç¤¢¤ë¡£ ¥½¥±¥Ã¥È¥Ð¥Ã¥Õ¥¡¤¬ËþÇդξì¹ç¡¢¥«¡¼¥Í¥ë¤Ï netlink ¥á¥Ã¥»¡¼¥¸¤òÁ÷¿®¤Ç¤­¤Ê¤¤¡£ ¥á¥Ã¥»¡¼¥¸¤Ï¼è¤ê¤³¤Ü¤µ¤ì¤Æ¡¢¥«¡¼¥Í¥ë¤È¥æ¡¼¥¶¡¼¶õ´Ö¥×¥í¥»¥¹¤Ï¡¢ ¥«¡¼¥Í¥ë¤Î¾õÂ֤ˤĤ¤¤Æ¤ÎƱ¤¸¥Ó¥å¡¼¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¤Ê¤¯¤Ê¤ë¡£ ¤³¤ì¤¬µ¯¤³¤Ã¤¿¤³¤È (recvmsg(2) ¤Ë¤è¤Ã¤Æ ENOBUFS ¥¨¥é¡¼¤¬ÊÖ¤µ¤ì¤ë) ¤ò¸¡ÃΤ·¤ÆºÆ¤ÓƱ´ü¤µ¤»¤ë¤Î¤Ï¡¢ ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÀÕǤ¤Ç¤¢¤ë¡£

¥¢¥É¥ì¥¹¤Î¥Õ¥©¡¼¥Þ¥Ã¥È

sockaddr_nl ¹½Â¤ÂΤϥ桼¥¶¡¼¶õ´Ö¤ä¥«¡¼¥Í¥ë¶õ´Ö¤Ç netlink ¥¯¥é¥¤¥¢¥ó¥È¤òµ­½Ò¤¹¤ë¡£ sockaddr_nl ¤Ï¥æ¥Ë¥­¥ã¥¹¥È (ñ°ì¤ÎÀܳÀè¤Ë¤À¤±Á÷¤é¤ì¤ë) ¤Ë¤â¤Ç¤­¤ë¤·¡¢ netlink ¥Þ¥ë¥Á¥­¥ã¥¹¥È¥°¥ë¡¼¥× (nl_groups ¤¬ 0 ¤Ç¤Ê¤¤¾ì¹ç) ¤Ë¤âÁ÷¤ë¤³¤È¤¬¤Ç¤­¤ë¡£

struct sockaddr_nl {

    sa_family_t     nl_family;  /* AF_NETLINK */

    unsigned short  nl_pad;     /* 0 ¤Ç¤¢¤ë */

    pid_t           nl_pid;     /* ¥×¥í¥»¥¹ ID */

    __u32           nl_groups;  /* ¥Þ¥ë¥Á¥­¥ã¥¹¥È¥°¥ë¡¼¥×¥Þ¥¹¥¯ */

};

nl_pid ¤Ï netlink ¥½¥±¥Ã¥È¤Î¥æ¥Ë¥­¥ã¥¹¥È¥¢¥É¥ì¥¹¤Ç¤¢¤ë¡£ ¹Ô¤­À褬¥«¡¼¥Í¥ë¤Î¾ì¹ç¤Ï¡¢¾ï¤Ë 0 ¤Ç¤¢¤ë¡£ ¥æ¡¼¥¶¡¼¶õ´Ö¥×¥í¥»¥¹¤Î¾ì¹ç¡¢Ä̾ï¤Ï nl_pid ¤Ï¹Ô¤­Àè¤Î¥½¥±¥Ã¥È¤ò½êÍ­¤·¤Æ¤¤¤ë¥×¥í¥»¥¹¤Î PID ¤Ç¤¢¤ë¡£ ¤¿¤À¤·¡¢ nl_pid ¤Ï¥×¥í¥»¥¹¤Ç¤Ï¤Ê¤¯ netlink ¥½¥±¥Ã¥È¤òƱÄꤹ¤ë¡£ ¥×¥í¥»¥¹¤¬Ê£¿ô¤Î netlink ¥½¥±¥Ã¥È¤ò½êÍ­¤¹¤ë¾ì¹ç¡¢ nl_pid ¤ÏºÇÂç¤Ç¤â°ì¤Ä¤Î¥½¥±¥Ã¥È¤Î¥×¥í¥»¥¹ ID ¤È¤·¤«Åù¤·¤¯¤Ê¤é¤Ê¤¤¡£ nl_pid ¤ò netlink ¥½¥±¥Ã¥È¤Ë³ä¤êÅö¤Æ¤ëÊýË¡¤Ï 2 ¤Ä¤¢¤ë¡£ ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬ bind(2) ¤ò¸Æ¤ÖÁ°¤Ë nl_pid ¤òÀßÄꤹ¤ë¾ì¹ç¡¢ nl_pid ¤¬°ì°Õ¤Ç¤¢¤ë¤³¤È¤ò³Îǧ¤¹¤ë¤Î¤Ï¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÀÕǤ¤È¤Ê¤ë¡£ ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬ nl_pid ¤ò 0 ¤ËÀßÄꤷ¤¿¾ì¹ç¡¢¥«¡¼¥Í¥ë¤¬¤³¤ÎÃͤò³ä¤êÅö¤Æ¤ë¡£ ¥«¡¼¥Í¥ë¤Ï¥×¥í¥»¥¹¤¬ºÇ½é¤Ë¥ª¡¼¥×¥ó¤·¤¿ netlink ¥½¥±¥Ã¥È¤ËÂФ·¤Æ¥×¥í¥»¥¹ ID ¤ò³ä¤êÅö¤Æ¡¢ ¤½¤ì°Ê¹ß¤Ë¥×¥í¥»¥¹¤¬ºîÀ®¤·¤¿Á´¤Æ¤Î netlink ¥½¥±¥Ã¥È¤Ë¤â°ì°Õ¤Ê nl_pid ¤ò³ä¤êÅö¤Æ¤ë¡£

nl_groups ¤Ï¥Ó¥Ã¥È¥Þ¥¹¥¯¤Ç¡¢¤¹¤Ù¤Æ¤Î¥Ó¥Ã¥È¤¬ netlink ¥°¥ë¡¼¥×ÈÖ¹æ¤òɽ¤¹¡£ ¤½¤ì¤¾¤ì¤Î netlink ¥Õ¥¡¥ß¥ê¡¼¤Ï 32 ¤Î¥Þ¥ë¥Á¥­¥ã¥¹¥È¥°¥ë¡¼¥×¤Î¥»¥Ã¥È¤ò»ý¤Ä¡£ ¤½¤ì¤¾¤ì¤Î netlink ¥Õ¥¡¥ß¥ê¡¼¤Ï 32 ¤Î¥Þ¥ë¥Á¥­¥ã¥¹¥È¥°¥ë¡¼¥×¤Î ¥»¥Ã¥È¤ò»ý¤Ä¡£ bind(2) ¤¬¥½¥±¥Ã¥È¤ËÂФ·¤Æ¸Æ¤Ð¤ì¤ë¤È¡¢ sockaddr_nl ¤Î nl_groups ¥Õ¥£¡¼¥ë¥É¤Ë¤Ï listen ¤·¤¿¤¤¥°¥ë¡¼¥×¤Î¥Ó¥Ã¥È¥Þ¥¹¥¯¤¬¥»¥Ã¥È¤µ¤ì¤ë¡£ ¥Ç¥Õ¥©¥ë¥È¤ÎÃÍ¤Ï 0 ¤Ç¡¢¥Þ¥ë¥Á¥­¥ã¥¹¥È¤ò°ìÀÚ¼õ¿®¤·¤Ê¤¤¡£ sendmsg(2) ¤ä connect(2) ¤Ë¤è¤Ã¤Æ¡¢¤¢¤ë¥½¥±¥Ã¥È¤«¤é¥á¥Ã¥»¡¼¥¸¤ò¥Þ¥ë¥Á¥­¥ã¥¹¥È¤·¤¿¤¤¤È¤­¤Ï¡¢ nl_groups ¤ËÁ÷¿®¤·¤¿¤¤¥°¥ë¡¼¥×¤Î¥Ó¥Ã¥È¥Þ¥¹¥¯¤ò¥»¥Ã¥È¤¹¤ì¤Ð¤è¤¤¡£ ¼Â¸ú¥æ¡¼¥¶¡¼ ID ¤¬ 0 ¤«¡¢ CAP_NET_ADMIN ¸¢¸Â¤ò»ý¤Ä¥æ¡¼¥¶¡¼¤Î¤ß¤¬ netlink ¥Þ¥ë¥Á¥­¥ã¥¹¥È¥°¥ë¡¼¥×¤Ë Á÷¿®¤·¤¿¤ê¡¢¤³¤ì¤ò listen ¤·¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£ ¥Þ¥ë¥Á¥­¥ã¥¹¥È¥°¥ë¡¼¥×¸þ¤±¥á¥Ã¥»¡¼¥¸¤ò¼õ¿®¤·¤¿¾ì¹ç¡¢¤³¤ìÂФ¹¤ë±þÅú¤Ï Á÷¤ê¼ç¤Î PID ¤È¥Þ¥ë¥Á¥­¥ã¥¹¥È¥°¥ë¡¼¥×¤È¤ËÁ÷¤êÊÖ¤¹¤Ù¤­¤Ç¤¢¤ë¡£

¥Ð¡¼¥¸¥ç¥ó

netlink ¤Ø¤Î¥½¥±¥Ã¥È¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ï Linux 2.2 ¤Î¿·µ¡Ç½¤Ç¤¢¤ë¡£

Linux 2.0 ¤Ï¡¢¤â¤Ã¤È¸¶»ÏŪ¤Ê¥Ç¥Ð¥¤¥¹¥Ù¡¼¥¹¤Î netlink ¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤ò ¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤¿ (¤³¤ì¤â¸ß´¹À­¤Î¤¿¤á¤Ëº£¤Ç¤â»ÈÍѤǤ­¤ë)¡£ ¸Å¤¤¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Ë´Ø¤·¤Æ¤Ï¤³¤³¤Ç¤Ïµ­½Ò¤·¤Ê¤¤¡£

NETLINK_SELINUX ¤Ï Linux 2.6.4 ¤ÇÅо줷¤¿¡£

NETLINK_AUDIT ¤Ï Linux 2.6.6 ¤ÇÅо줷¤¿¡£

NETLINK_KOBJECT_UEVENT ¤Ï Linux 2.6.10 ¤ÇÅо줷¤¿¡£

NETLINK_W1, NETLINK_FIB_LOOKUP ¤Ï Linux 2.6.13 ¤ÇÅо줷¤¿¡£

NETLINK_INET_DIAG, NETLINK_CONNECTOR, NETLINK_NETFILTER ¤Ï Linux 2.6.14 ¤ÇÅо줷¤¿¡£

NETLINK_GENERIC, NETLINK_ISCSI ¤Ï Linux 2.6.15 ¤ÇÅо줷¤¿¡£

Ãí°Õ

Äã¥ì¥Ù¥ë¤Î¥«¡¼¥Í¥ë¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤è¤ê¡¢ libnetlink ¤Þ¤¿¤Ï libnl ¤òÄ̤·¤Æ netlink ¤òÍøÍѤ¹¤ë¤Û¤¦¤¬Îɤ¤¤³¤È¤¬Â¿¤¤¡£

¥Ð¥°

¤³¤Î man ¥Ú¡¼¥¸¤Ï´°À®¤·¤Æ¤¤¤Ê¤¤¡£

Îã

°Ê²¼¤ÎÎã¤Ç¤Ï¡¢ RTMGRP_LINK (¥Í¥Ã¥È¥ï¡¼¥¯¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹¤Î create/delete/up/down ¥¤¥Ù¥ó¥È) ¤È RTMGRP_IPV4_IFADDR (IPv4 ¥¢¥É¥ì¥¹¤Î add/delete ¥¤¥Ù¥ó¥È) ¥Þ¥ë¥Á¥­¥ã¥¹¥È¥°¥ë¡¼¥×¤ò listen ¤¹¤ë NETLINK_ROUTE netlink ¤òºîÀ®¤·¤Æ¤¤¤ë¡£

struct sockaddr_nl sa;



memset(&sa, 0, sizeof(sa));

snl.nl_family = AF_NETLINK;

snl.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR;



fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);

bind(fd, (struct sockaddr*)&sa, sizeof(sa));

¼¡¤ÎÎã¤Ç¤Ï¡¢netlink ¥á¥Ã¥»¡¼¥¸¤ò¥«¡¼¥Í¥ë (pid 0) ¤ËÁ÷¤ëÊýË¡¤ò¼¨¤·¤Æ¤¤¤ë¡£ ±þÅú¤òÄÉÀפ¹¤ëºÝ¤Î¿®ÍêÀ­¤ò¹â¤á¤ë¤¿¤á¤Ë¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬ ¥á¥Ã¥»¡¼¥¸¤Î¥·¡¼¥±¥ó¥¹ÈÖ¹æ¤òÀµ¤·¤¯½èÍý¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤ÅÀ¤ËÃí°Õ¤¹¤ë¤³¤È¡£


struct nlmsghdr *nh;    /* Á÷¿®¤¹¤ë nlmsghdr ¤È¥Ú¥¤¥í¡¼¥É */

struct sockaddr_nl sa;

struct iovec iov = { (void *) nh, nh->nlmsg_len };

struct msghdr msg;



msg = { (void *)&sa, sizeof(sa), &iov, 1, NULL, 0, 0 };

memset(&sa, 0, sizeof(sa));

sa.nl_family = AF_NETLINK;

nh->nlmsg_pid = 0;

nh->nlmsg_seq = ++sequence_number;

/* NLM_F_ACK ¤òÀßÄꤹ¤ë¤³¤È¤Ç¡¢¥«¡¼¥Í¥ë¤Ë±þÅú¤òÍ׵᤹¤ë */

nh->nlmsg_flags |= NLM_F_ACK;



sendmsg(fd, &msg, 0);

ºÇ¸å¤Ï¡¢netlink ¥á¥Ã¥»¡¼¥¸¤ÎÆɤ߹þ¤ß¤ÎÎã¤Ç¤¢¤ë¡£


int len;

char buf[4096];

struct iovec iov = { buf, sizeof(buf) };

struct sockaddr_nl sa;

struct msghdr msg;

struct nlmsghdr *nh;



msg = { (void *)&sa, sizeof(sa), &iov, 1, NULL, 0, 0 };

len = recvmsg(fd, &msg, 0);



for (nh = (struct nlmsghdr *) buf; NLMSG_OK (nh, len);

     nh = NLMSG_NEXT (nh, len)) {

    /* ¥Þ¥ë¥Á¥Ñ¡¼¥È¥á¥Ã¥»¡¼¥¸¤Î½ª¤ï¤ê */

    if (nh->nlmsg_type == NLMSG_DONE)

        return;



    if (nh->nlmsg_type == NLMSG_ERROR)

        /* ²¿¤é¤«¤Î¥¨¥é¡¼½èÍý¤ò¹Ô¤¦ */

    ...



    /* ¥Ú¥¤¥í¡¼¥É¤Î²òÀϤò³¤±¤ë */

    ...

}

´ØÏ¢¹àÌÜ

cmsg(3), netlink(3), capabilities(7), rtnetlink(7)

libnetlink ¤Ë´Ø¤¹¤ë¾ðÊó¤Ï ftp://ftp.inr.ac.ru/ip-routing/iproute2*

libnl ¤Ë´Ø¤¹¤ë¾ðÊó¤Ï http://people.suug.ch/~tgr/libnl/

RFC 3549 "Linux Netlink as an IP Services Protocol"