NetLink使用实例(YGM).doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档