用户空间与内核的通信方式之netlink

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

 


 

 

你可能感兴趣的:(Linux)