Generic Netlink详解

本文深入探讨了Linux内核与用户态进程之间的通信方式——netlinksocket,包括其特性、初始化过程以及关键组件如family、operation等的实现细节。通过实例展示了如何定义和初始化一个自定义的netlinkfamily,以及如何配置属性政策以支持特定的数据类型。了解netlinksocket对于构建高效、稳定的系统通信架构至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.linuxidc.com/Linux/2012-07/65482p2.htm

http://www.tuicool.com/articles/jE7nim

http://blog.youkuaiyun.com/u011638528/article/details/10221557

 

netlink socket是一种用于用户态进程和内核态进程之间的通信机制。它通过为内核模块提供一组特殊的API,并为用户程序提供了一组标准的socket接口的方式,实现了全双工的通讯连接。

  1. /* attribute type */  
  • enum {  
  •       DOC_EXMPL_A_UNSPEC,  
  •       DOC_EXMPL_A_MSG,  
  •       __DOC_EXMPL_A_MAX,  
  • };  
  • #define DOC_EXMPL_A_MAX (__DOC_EXMPL_A_MAX - 1)  
  •   
  • /* family definition */  
  • static struct genl_family doc_exmpl_gnl_family = {  
  •       .id = GENL_ID_GENERATE,  
  •       .hdrsize = 0,  
  •       .name = "DOC_EXMPL",  
  •       .version = 1,  
  •       .maxattr = DOC_EXMPL_A_MAX,  
  •   
  • };  

     

    Generic Netlink服务端(内核)初始化

    初始化Generic Netlink的过程分为以下四步:定义family,定义operation,注册family,注册operation。下面通过一个简单例子来说明如何完成Generic Netlink的初始化。我们首先创建一个genl_family结构体的实例。我们在这里定义一个名为"DOC_EXMPL"的family

     

    genl_ops 结构体         

    struct genl_ops
    {
          u8                      cmd;
          unsigned int            flags;
          struct nla_policy       *policy;
          int                     (*doit)(struct sk_buff *skb,
                                          struct genl_info *info);
          int                     (*dumpit)(struct sk_buff *skb,
                                              struct netlink_callback *cb);
          struct list_head        ops_list;
    };

     

    struct nla_policy        {            u16             type;            u16             len;        };

    http://yhpan0613.blog.163.com/blog/static/17828305020116523824742/

    1. The first step is to define the family itself, which we do by creating an
      instance of the genl_family structure. In our simple example we are going to
      create a new Generic Netlink family named "DOC_EXMPL".
      /* attributes */
      enum {
      DOC_EXMPL_A_UNSPEC,
      DOC_EXMPL_A_MSG,
      __DOC_EXMPL_A_MAX,
      };
      #define DOC_EXMPL_A_MAX (__DOC_EXMPL_A_MAX - 1)
      /* attribute policy */
      static struct nla_policy doc_exmpl_genl_policy[DOC_EXMPL_A_MAX + 1] = {
      [DOC_EXMPL_A_MSG] = { .type = NLA_NUL_STRING },
      };
      /* family definition */
      static struct genl_family doc_exmpl_gnl_family = {
      .id = GENL_ID_GENERATE,
      .hdrsize = 0,
      .name = "DOC_EXMPL",
      .version = 1,
      .maxattr = DOC_EXMPL_A_MAX,
      };

    这里,我们把attribute policy设为NLA_NUL_STRING,表示attr中数据的属性为无NULL结尾的字符串。控制器在收到数据时会自动完成这一类型检查。

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值