用户空间与内核通信方式主要有两种:/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(套接字,信息内容)