Netlink使用標準的socket介面來作為kernel與使用者介面的溝通,其address family填PF_NETLINK,而socket type為SOCK_RAW、SOCK_DGRAM,protocol則根據不同的netlink group不同而有所不同(詳細資訊可以man 7 netlink)。
socket = socket(AF_NETLINK, SOCK_RAW, netlink_family);
Netlink Socket Address Structure
Netlink也需要socket address,其socket address為:
struct sockaddr_nl { sa_family_t nl_family; /* AF_NETLINK */ unsigned short nl_pad; /* Zero. */ pid_t nl_pid; /* Process ID. */ __u32 nl_groups; /* Multicast groups mask. */ };
如果傳送的對象是kernel或者以multicast傳送,則nl_pid設為0。
如果是kernel傳送給user-space上面的application時(multicast),就會填入正確的pid,然而nl_pid實際的意義並不是指PID,而只是用於識別一個netlink socket而已,對於application在建立一個netlink socket時,可以將nl_pid設為0,然後bind(),kernel會自動將PID填入。而nl_groups是用multicast,採用bit mask方式,所以每個netlink family有32個multicast group。