NetLink使用实例(YGM).docVIP

  • 5
  • 0
  • 约6.13千字
  • 约 6页
  • 2017-04-23 发布于重庆
  • 举报
NetLink使用实例(YGM)

如何使用Netlink Connector Author: Yang gongming 杨燚,计算机科学硕士,毕业于中科院计算技术研究所,有5年的Linux内核编程经验,目前从事Linux的内核和应用开发。您可以通过 HYPERLINK mailto:yang.y.yi@yang.y.yi@ 与作者联系。 简介:?本文详细介绍了 Linux 4 内核引入的内核空间与用户空间通信的新机制连接器,并通过典型示例讲解了它的使用。 一、概述 连接器是一种新的用户态与内核态的通信方式,它使用起来非常方便。本质上,连接器是一种netlink,它的 netlink 协议号为 NETLINK_CONNECTOR,与一般的 netlink 相比,它提供了更容易的使用接口,使用起来更方便。netlink本质上是socket,不过它可用于用户程序和内核程序的通信。 1.内核模块使用方法 注册一个标识 ID 和回调函数,即可使用连接器。cn_msg结构: //标识netlink的ID struct cb_id { __u32 idx; __u32 val; }; //netlink控制信???头 struct cn_msg { struct cb_id id; __u32 seq; __u32 ack; __u32 len;/* Length of the following data */ __u8 data[0]; }; 三个内核模块常用的API。 int cn_add_callback(struct cb_id *id, char *name, void (*callback) (void *)); void cn_del_callback(struct cb_id *id); void cn_netlink_send(struct cn_msg *msg, u32 __group, int gfp_mask);结构 cb_id 是连接器实例的标识 ID,它用于确定 netlink 消息与回调函数的对应关系。当连接器接收到标识 ID 为 {idx,val} 的 netlink 消息时,注册的回调函数 void (*callback) (void *) 将被调用。该回调函数的参数为结构 struct cn_msg 的指针。 接口函数 cn_add_callback 用于向连接器注册新的连接器实例以及相应的回调函数,参数 id 指定注册的标识 ID,参数 name 指定连接器回调函数的符号名,参数 callback 为回调函数。 接口函数 cn_del_callback 用于卸载回调函数,参数 id 为注册函数 cn_add_callback 注册的连接器标识 ID。 接口函数 cn_netlink_send 用于向给定的组发送消息,它可以在任何上下文安全地调用。但是,如果内存不足,可能会发送失败。在具体的连接器实例中,该函数用于向用户态发送 netlink 消息。 参数 msg 为发送的 netlink 消息的消息头。参数 __group 为接收消息的组。用户侧接收消息,不需要注册idx和val,所以,内核调用cn_add_callback时的idx和val对将数据报文发送到那个用户没有任何影响。如果它为 0,那么连接器将搜索所有注册的连接器用户,也不会发送给用户 ID 与在 msg 中的 ID 相同的组。在__group==0时,甚至不会发送给=0的用户组。但如果 __group 不为 0,消息将发送给 __group 指定的组。参数 gfp_mask 指定页分配标志。 用户接收方,通过:socket()函数和bind函数,以及setsockopt()函数,设置接收组。只通过组来接收。当bind函数中sockaddr_nl中的group设置为0xffff或大于该值,将接收到所有的组的消息,也不管是否在setsockopt()函数中设置的组参数是多少。对于非0xffff参数,bind的sockaddr_nl的goup必须和setsockopt()的组保持一致。这样才能收到内核发送到指定组(__group)的消息。 cn_msg 是连接器定义的消息头,字段 seq 和 ack 用于确保消息的可靠传输,刚才已经提到,netlink 在内存紧张的情况下可能丢失消息,因此该头使用顺序号和响应号来满足要求可靠传输用户的需求。当发送消息时,用户需要设置独一无二的顺序号和随机的响应号,顺序号也应当设置到 nlmsghdr-nlmsg_seq。注意 nlmsghdr 是类型为结构 struct nlmsghdr 的变量,它用于设置或保存 netlink 的消息头。每发送一个消息,顺序号应当加 1,如果需要发送

文档评论(0)

1亿VIP精品文档

相关文档