2.6.24以上内核中netlink使用方法

 

2.6.24以上内核中netlink使用方法

测试环境:2.6.28

Netlink在2.6内核的不同版本中发生了很大变化,具体请参考(注意其中的版本号不一定确切):

http://blog.csdn.net/sealyao/archive/2009/10/02/4628141.aspx

 

0. 综述

以下程序基本流程如下:

运行netlink内核模块;

运行用户态程序,向内核发送连接消息,通知内核自身进程id;

内核接收用户消息,记录其进程id;

内核向用户进程id发送netlink消息;

用户接收内核发送的netlink消息。

 

1. 内核部分

1.1 相关的数据结构变量:

 

 

 

定义协议族。该变量在netlink_kernel_create函数中使用。

在2.6.28内核中netlink定义了20个协议,每个协议使用唯一整数标识。用户程序可以定义任意20个协议以外的协议,用唯一整数标识。

sock数据结构,唯一标识netlink使用的sock,与普通socket编程中sock类似。

标识netlink sock的源地址和目的地址。

接收发送netlink数据使用的数据结构。

netlink消息头。

 

1.2 调用过程

1.2.1 创建netlink socket

1.2.2 实现回调函数nl_data_ready

以下回调函数在netlink接收到完整的NETLINK_REALNET协议的数据包时由系统调用。该函数接收并判断netlink消息,如果第一个字符为H,则保存该消息发出者的进程号,用以向该进程发送数据包;相同,如果为E,则清除与该进程的联系。

 

获取实际数据包。

该函数的参数为netlink数据包的首地址,而sk_buff为网络协议栈使用的数据结构,两者存在细微差别。

    获取netlink数据包中netlink header的起始地址。

将netlink数据包的数据区拷贝到str中。NLMSG_DATA(nlh)返回数据区地址。相关宏定义参考:

http://blog.csdn.net/wangjingfei/archive/2010/02/04/5288263.aspx

释放接收到的消息。

 

1.2.3 向用户进程发送netlink消息

    以下函数的参数为netfilter捕捉到的sk_buff结构的数据包,目的是将该包通过netlink发送到用户态进程。

 

参数skb为netfilter捕捉到的数据包,不是netlink数据包。这里作为netlink的数据传输。

为发送数据包申请空间。空间数据区大小为1514,即最大ethernet数据包长度。NLMSG_SPACE(1514)返回数据区大小为1514的netlink数据包的大小。详细参考:

http://blog.csdn.net/wangjingfei/archive/2010/02/04/5288263.aspx

填充netlink数据包头。

确定发送数据包的进程号,0表示内核进程。该处宏定义同样参考:

http://blog.csdn.net/wangjingfei/archive/2010/02/04/5288263.aspx

通过非阻塞方式发送数据包。注意:在发送完数据包之后,nl_skb指向的数据空间将被清空,下一次发送数据包必须重新调用alloc_skb分配空间,否则将会造成内核崩溃,必须重新启动。

 

1.2.4 释放netlink socket

使用完成netlink之后,必须要调用sock_release,否则

指定的协议编号将不再可用。代码如下:

 

 

2. 用户态程序

2.1 相关数据结构

 

与内核态数据结构类似,不再赘述。

 

2.2 运行过程

2.2.1 初始化netlink

 

创建用户netlink socket,与普通socket创建方法相同,协议族为PF_NETLINK,协议类型为用户自定义的NETLINK_REALNET,与内核态定义相同。

清空netlink数据包。

与普通socket的初始化类似,如果不熟悉可以参考有关socket编程。需要注意的是nl_src_addr的数据结构与普通socket有些不同。

向内核进程发送Hello消息,通知内核其进程id。

 

2.2.2 向内核发送消息

以下函数创建并发送netlink消息到内核进程。

 

为netlink header分配存储空间,MAX_PAYLOAD由用户定义,为发送(用户)数据的最大长度。

指定netlink相关的参数,准备发送消息。

    发送netlink数据包到内核进程,与普通socket中的sendmsg消息用法相同,最后一个参数0表示非阻塞模式。详细参考socket编程。

 

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
编译Linux 2.6.24内核有以下几个步骤: 1. 下载内核源代码:首先,你需要下载Linux 2.6.24内核源代码。你可以从Linux内核官方网站或者其他镜像网站上找到合适的源代码包。下载完成后,解压源代码到合适的目录。 2. 配置编译选项:进入源代码目录后,你需要进行内核的配置。可以使用make menuconfig或make xconfig等命令来进行交互式的配置。可以根据自己的需求选择合适的配置选项,例如硬件支持、文件系统等。 3. 运行编译命令:配置完成后,运行make命令进行编译。这个过程可能会需要一定时间,因为编译内核需要编译源代码大量的文件。你可以使用make -j <n>命令来指定同时编译的进程数量,其<n>为你机器上的CPU核心数。 4. 安装内核:编译完成后,你可以使用make install命令将编译好的内核安装到系统。这个过程会将内核映像文件复制到/boot目录下,并更新引导加载程序的配置文件。 5. 配置引导加载程序:安装完内核后,你需要配置引导加载程序以便系统能够启动新编译的内核。具体配置方式会因使用的引导加载程序而有所不同,例如GRUB、LILO等。 6. 重启系统:完成上述步骤后,现在你可以重启系统,选择新编译的内核进行启动。在系统启动时,可以通过/boot/grub/menu.lst或/boot/grub/grub.conf等文件来查看引导加载程序的配置。 希望以上信息对你有所帮助,在进行内核编译时请确保备份重要数据并仔细阅读相关文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值