- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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,如果需要发送
您可能关注的文档
- iherb攻略の孕妇肌肤保养及头发护理含(伤)疤痕修护.docx
- iphone真机调试教程.docx
- IP地址的分类范围.doc
- IQC部门来料部品检验标识作业指导书.doc
- ISO5817中文钢镍钛及其合金熔焊接头缺陷的质量等级.doc
- ISO86362移动式龙门机床检验标准.doc
- Illustrator简单设计图案教程.doc
- ISO13849-12006新标准介绍.docx
- ISO软件开发模板测试计划编写指南软件测试面试必备.doc
- ISO90012008内审员教程-完整版.doc
- 国家开放大学《学前教育科研方法》形考任务1-3答案.docx
- 国家开放大学《学前教育科研方法》形考任务1-3答案.doc
- DB32_T 1086-2022 高速公路建设项目档案管理规范.docx
- DB32_T 4406-2022 高速公路施工质量检查技术标准.docx
- DB3209_T 1241-2023 1:5001:10001:2000基础地理信息地形要素数据规范.docx
- DB32_T 4654-2024 内河航道电子航道图技术规范.docx
- DB32_T 4353-2022 房屋建筑和市政基础设施工程档案资料管理规程.docx
- 全面预算管理预算编制与执行方法和技巧.ppt
- 星巴克即饮系列女神节电商传播方案.pptx
- Photoshop CS5平面设计教程.ppt
最近下载
- 第七章swing事件模型.pdf
- 公司行政岗位年终述职报告.pptx VIP
- 81404综采工作面作业规程6.pdf VIP
- 小学英语新人教版PEP三年级上册Unit 1 Making friends Part A第1课时教学课件(2024秋).pptx
- 洗煤厂年入洗60万吨原煤扩建项目可行性分析报告.pdf
- 车辆自适应巡航系统性能要求及测试方法.pdf VIP
- GB_T 3880.3-2024一般工业用铝及铝合金板、带材 第 3 部分尺寸偏差.docx VIP
- 半导体管图示仪操作说明.xls
- 东软NetEye防火墙V3.2.4 SNMP MIB参考指南.pdf VIP
- 广西三甲医院各地市分布.docx VIP
文档评论(0)