三、无线信息传递——Generic Netlink(一、初始化)

系列说明

  上一篇说明了无线信息的user space至kernel space的大致传递流程,这一主要针对以下3点进行一个顺序的描述:

  • 1、无线驱动信息传递框架:说明无线信息传递的步骤流程以及各程序块之间的联系;
  • 2、generic Netlink信号传递机制:hostapd与无线驱动之间的信息传递机制
  • 3、以ssid为例说明用户将user space中的ssid配置内容传递至kernel space的流程:以此系统地了解整个无线信息传递流程。

  上篇中,多次提到了genetlink,他的全名为generic netlink。而generic netlink在user space和kernel space之间起到了关键性的作用。由于内容较多,这一篇就对generic netlink进行第一阶段的分析。下一篇再通过一个具体的代码例子系统地说明generic netlink是怎么让user space和kernel space双向通信的。

  关于generic netlink的两篇说明均参考下面的两篇链接,这里由链接的文章作出自己的总结:
Generic Netlink内核实现分析(一):初始化
Generic Netlink内核实现分析(二):通信

为什么会出现generic netlink?
  因为netlink最多只支持32个协议簇,所以generic netlink的出现是为扩展netlink协议簇而设计,即是netlink协议簇的子集。
  博文中是这样说明的:Generic Netlink 是内核专门为了扩展netlink协议簇而设计的“通用netlink协议簇”。由于netlink协议最多支持32个协议簇,目前Linux4.1的内核中已经使用其中21个,对于用户需要定制特殊的协议类型略显不够,而且用户还需自行在include/linux/netlink.h中添加簇定义(略显不妥),为此Linux设计了这种通用Netlink协议簇,用户可在此之上定义更多类型的子协议。

generic netlink在程序中的代码实现框架:
这里写图片描述
  从上图中可以看出Generic Netlink也还是需要借助Netlink来完成用户环境和内核环境的信息传递。用户层发信息先至Netlink,然后再转给Generic netlink分支,再至内核;同样的内核发信息先发给Generic netlink分支,然后再通过netlink传给用户层。
  框图中Ctrl控制器是一种特殊类型的Genetlink协议族,它用于用户空间通过Genetlink簇名查找对应的ID号。
  以下为netlink类型的消息结构:
这里写图片描述
这里写图片描述
这里写图片描述
  具象化地来说,上面的三幅图内容如下图说明所示:
这里写图片描述

二、generic netlink主要结构体

/*
 * 为上图中的family header
*/
struct genlmsghdr { 
        __u8    cmd;                     //表示消息命令,对于用户自己定义的每个子协议类型都需要定义特定的消息命令集,这里该字段表示当前消息的消息命令
        __u8    version;                 //version字段表示版本控制(可以在在不破坏向后兼容性的情况下修改消息的格式),可以不使用该字段
        __u16   reserved;                //保留字段
};
/*
 * Generic Netlink按照family进行管理,用户需注册自己定义的genl_family结构,同时内核使用一个哈希表family_ht对已经注册的genl family进行管理
*/
struct genl_family {
    struct list_head list;      //链表结构,用于将当前当前簇链入全局family_ht散列表中
    unsigned int id;        //genl family的ID号,一般由内核进行分配,取值范围为GENL_MIN_ID~GENL_MAX_ID(16~1023),其中GENL_ID_CTRL为控制器的family ID,不可另行分配,该familyID全局唯一并且在family_ht中的位置也由该值确定 
    unsigned int hdrsize;       //用户私有报头的长度,即上图中可选的user msg header长度,若没有则为0
    unsigned int version;       //版本号
    unsigned int maxattr;       //消息属性attr最大的类型数(即该genl family所支持的最大attr属性类型的种类个数)
    const char *name;       //genl family的名称,必须是独一无二且用户层已知的(用户通过它来向控制查找family id)
    bool netnsok;           //指示当前簇是否能够处理网络命名空间
    struct nlattr **
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值