NetLink使用实例(YGM).docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
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精品文档

相关文档