Generic netlink编程入门

这篇博客介绍了Generic Netlink(genetlink)如何实现内核与用户空间的通信。通过genl_family管理,genl_ctrl用于查询和管理Family。示例代码展示了如何定义genl_family、genl_ops以及处理命令,例如echo命令的处理函数。用户空间通过genlmsg发送和接收消息,获取和发送特定的family ID。
摘要由CSDN通过智能技术生成
通过generic netlink可以实现内核和用户空间的通信,genetlink是通过family来管理的(哈希表), genl_ctrl 是一个特殊的Family, 它是由Generic Netlink自己注册和实现,并用来查询Family列表、管理各个Family的添加、删除等事件的。用户空间先根据family name请求到相应的family ID,而后进行相互沟通。
 static struct genl_family genl_ctrl = {
          .id =  GENL_ID_CTRL,
          .name = "nlctrl",
          .version = 0x2,
          .maxattr = CTRL_ATTR_MAX,
          .netnsok = true,
     };

     static struct genl_ops genl_ctrl_ops = {
          .cmd      =  CTRL_CMD_GETFAMILY,
          .doit     = ctrl_getfamily,
          .dumpit   = ctrl_dumpfamily,
          .policy   = ctrl_policy,
     };
 static const struct nla_policy ctrl_policy[CTRL_ATTR_MAX+1] = {
          [ CTRL_ATTR_FAMILY_ID] = { .type = NLA_U16 },
          [CTRL_ATTR_FAMILY_NAME] = { .type = NLA_NUL_STRING, .len = L_NAMSIZ - 1 },
     };

genl_kern.c
#include <net/genetlink.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
/*netlink attributes 可以通过枚举索引找到对应的类型
*用户空间应用程序要传递这样的信息*/

enum {
DOC_EXMPL_A_UNSPEC,
DOC_EXMPL_A_MSG,
__DOC_EXMPL_A_MAX,
};
#define DOC_EXMPL_A_MAX (__DOC_EXMPL_A_MAX - 1)

/*atribute policy就是定义各个属性的具体类型,参见net/netlink.h*/
static struct nla_policy doc_exmpl_genl_policy[DOC_EXMPL_A_MAX + 1] = {
        [DOC_EXMPL_A_MSG] = {.type = NLA_NUL_STRING},
};

#define VERSION_NR 1

//generic netlink family 定义
static struct genl_family doc_exmpl_genl_family = {
        .id = GENL_ID_GENERATE,
        .hdrsize = 0,
        .name = "CONTROL_EXMPL",
        .version = VERSION_NR,
        .maxattr = DOC_EXMPL_A_MAX,
};

/*定义命令类型,用户空间以此来表明需要执行的命令*/
enum{
DOC_EXMPL_C_UNSPEC,
DOC_EXMPL_C_ECHO,
__DOC_EXMPL_C_MAX,
};
#define DOC_EXM
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值