用戶空間與內核的通信方式之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(套接字,信息內容)

 


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章