用戶空間與內核通信方式主要有兩種:/proc和netlink
netlink涉及的數據結構
struct msghdr {
void *msg_name; //數據包目的地址(對應sockaddr_in)
int msg_namelen; //數據包長度(sizeof(目的地址))
struct iovec *msg_iov; //消息內容(指向struct iovec)
__kernel_size_t msg_iovlen; //msghdr中允許一次傳遞多個buff,以數組的形式組織在 msg_iov中,msg_iovlen就記錄數組的長度(即有多少個buff)
void *msg_control; //控制信息
__kernel_size_t msg_controllen; //
unsigned msg_flags; //傳入參數的flag
};
struct sockaddr_nl {
__kernel_sa_family_t nl_family; /* AF_NETLINK */
unsigned short nl_pad; /* zero */
__u32 nl_pid; /* 進程id */
__u32 nl_groups; /* 是否是組播 */
};
struct iovec{
void *iov_base; /* 指向nlmsghdr的數據 */
size_t iov_len; /* 數據的長度 */
};
struct nlmsghdr {
__u32 nlmsg_len; /* Length of message including header */
__u16 nlmsg_type; /* 信息內容 */
__u16 nlmsg_flags; /* Additional flags */
__u32 nlmsg_seq; /* Sequence number */
__u32 nlmsg_pid; /* 發送進程的id */
};
用戶空間的發送和接收
1. 創建AF_NETLINK的socket
2. 設置源地址信息(sockaddr_nl結構)
3. 綁定socket和源地址
4. 填充發送信息內容(msghdr結構:包含目的地址信息,發送信息內容(nlmsghdr結構))
如果是發送則5
5. sendmsg(套接字,信息內容)
否則是接收則6
6. recvmsg(套接字,信息內容)