python项目开发实例集锦,python项目实例教程
二。2.10代码用户进程配置方法:2.1。查询内核方法的比较:查询内核有以下几种方法:
1.直接文件系统(procfs/sys fs);
2.添加您自己的系统调用。
3.使用统一系统调用(ioctl);
4.网络;
第一种方法的优点是可以直接在cat或echo中配置,不需要添加用户状态码;但是如果加入太多内核,就会变得混乱,而且总是在Linux shell上操作,在某些场景下是不适合的。
第二个问题是添加系统调用很麻烦,管理起来也很复杂。
第三种方法可以有效解决第二个问题,集中式系统调用,但它仍然是一个系统调用,在这种用户状态下主动发起系统调用的效率不高。
第四种模式实现了相同的中断模式,与第二种模式和第三种模式在同步和异步上有所不同。(注意netlink模式的发送和接收是用户进程和内核,但第二个和第三个不是发送方和接收方,而是用户进程本身)。另外,ioctl系统调用是linux特有的,不利于程序移植,但是netlink的使用比较复杂。
如上所述,第一种和第三种方法在结构项较少的情况下比较适合,netlink方法在结构项较多的情况下比较适合,第二种方法在特殊情况下比较方便(OPL)。
2.2.netlink的原理和使用:2.2.1。链接详情:2.2.1.1。netlink概述:与ioctl不同,netlink是基于socket的,内核和用户进程分别是。具体来说,用户进程和内核进程(内核实际上可以看作系统中的进程,其进程tgid为0)都可以是消息的发送方。而ioctl表示用户进程主动响应内核,避免了对包含内核的进程盲目轮询,真正实现了双向异步访问,这是访问效率的本质提升。
此外,netlink还可以执行多播。这意味着消息可以被发送到许多其他进程(包括内核)。另外,有些方法可以在netlink socket的CPU之间传递,但不应该这样使用。
理解一个socket的根本点是要知道它的“N组”,比如IPV4 socket的源地址和端口传输层协议类型的五组,原始socket和收发器接口的二维组以太网类型,这样对象netlink socket的“N元组”就是进程id和协议类型,进程id就是netlink socket创建进程的tgid。类型包括默认创建的类型和可自定义的类型。使用netlink的二元组即可唯一的确定一个netlink对象2.10代码中的netlink协议类型如下:
您可以定义多达32种类型的Netlink协议。图中的NETLINK_CTRL(17)、netlink _ kdns (20)和netlink _ kcap (21)是用户自定义类型,其中最重要的是NETLINK_CTRL。
下图显示了netlink在系统中的实际使用情况。
第二列中的“Eth”标识协议类型,第三列中的“Pid”标识进程tgid。如果在同一个进程中创建了多个同类型的netlink套接字,那么在绑定时“Pid”将被修改为从-4097开始依次递减的值。请注意,上图显示的是负值,因为有些进程在创建和使用netlink后使用了负值。924的“Pid”是由pon进程创建的netlink套接字。
2.2.1.2,netlink使用细节:作为套接字,netlink也必须遵循套接字标准接口。sockaddr结构的实现包括协议族(AF_NETLINK)、进程tgid和组播组。下图:
2.2.1.2.1、套接字创建和绑定:
netlink套接字的创建必须与其他类型的套接字相同,并且需要注意netlink的用户进程和内核创建的区别。内核网络链接的创建通过将标志位NETLINK_KERNEL_SOCKET添加到sock层描述符netlink_sock来标识。
Netlink套接字需要绑定。在写bind之前,先写如何管理netlink套接字。在系统中,基于不同的协议类型创建了32个混合表(nl_table ),混合表以其pid为基值计算混合表键值。每个混合列表条目都有netlink socket的创建过程。
netlink socket的绑定过程是将创建netlink的进程的tgid和它的sock层描述符注册到系统中。这和IPV4和原槽是一个道理。即通过在系统的netlink管理链表nl_table中注册,系统可以在发送消息时根据接收方的tgid知道接收方的tgid。
套接字接收缓冲队列,否则接收方无法接收消息。
2.2.1.2.2.消息发送和接收:作为socket的一种,netlink也使用标准socket接口的send/recv函数族进行发送和接收。注意,除非向内核发送消息,否则发送方必须手动指定目的套接字的进程tgid(或者在发送前对目的套接字的进程tgid使用connect),否则系统只会将消息发送到相应类型的内核netlink套接字,分别为用户进程启动和内核启动。
用户进程发送
2.2.1.2.3.netlink消息格式:实际上,netlink消息没有固定的格式,但是内核默认创建的所有netlink(比如路由的rtnetlink和netfilter的nfnetlink)都遵循固定的消息格式,所以自定义的netlink协议类型也应该遵循这种格式,如下所示:
结构请求
{
结构nlmsghdr nlh
char buf[XXXXX];
};
结构nlmsghdr
{
_ _ u32 nlmsg _ len/*包含标题的消息长度*/
_ _ u16 nlmsg _ type/*消息内容*/
_ _ u16 nlmsg _ flags/*附加标志*/
_ _ u32 nlmsg _ seq/*序列号*/
_ _ u32 nlmsg _ pid/*发送进程端口ID */
};
netlink消息首先应该是一个具有nlmsghdr结构的头,指定消息长度、消息类型(API ID)、消息标志(表示消息的要求,如是否回复、是否为请求、设置类型或打印类型等。)、消息序列号(用于检查收到的消息是否是该请求的响应)、发送方pid(无意义但不适用);注意消息标志是很重要的。内核指定了以下消息标志:
不同消息标志的使用和含义可以在实际代码中理解。这里只介绍最基本的,比如NLM _ F _请求标志,这是一个请求消息,NLM_F_ACK标志,这是一个需要回答的消息,NLM_F_DUMP标志。这个消息应该首先调用显示钩子。请注意,每个netlink挂钩都遵循以下数据结构,并且应该进行设置或显示。
实现两种类型的钩子并不总是必要的,这都是基于具体的实现。
2.2.2、2.10代码示例:2.10代码中的所有服务都是通过netlink配置来管理的,私有netlink协议类型NETLINK_CTRL(参见2.2.1.1)是在内核空间定义的。参见rcios/include/ctrlnetlink.h文件中定义的枚举类型,涵盖了路由、安全、语音、pon、设备管理等各种业务类型。并挂钩各种服务。在用户空间中,netlink访问内核的函数方法以库函数的形式封装,由所有业务流程统一使用。
此外,用户还可以使用其他netlink协议类型与内核的一些模块进行交互,例如用于ipsec的NETLINK_XFRM和用于路由和dhcp的NETLINK_ROUTE。
下面依次举两个例子来说明用户进程配置内核资源,内核异步通知用户进程:
2.2.2.1.在转发过程中根据源mac地址进行过滤:在转发过程中(ip_forward)可以配置丢弃特定源MAC的报文,在转发过程中只需将相关的过滤代码添加到netfilterhook点即可。其逻辑如下:
具体的过滤逻辑并不复杂。是否过滤以及mac过滤表可以在哈希表中配置。过滤netfilter时,如果启用了过滤,只需查看mac过滤表。具体实现就不详细描述了。这里的重点是配置mac过滤模块的过程。2.10设备通过命令行和web为用户配置界面,如下图所示:
如上图,命令行发送的netlink消息的消息类型为CTRL_MACADDR_FILTER_ADDR,需要接收方回复消息(意思是消息标志NLM _ F _ ACK);其在内核模块中对应条目的“setup”钩子函数是ctrlnetlink_macaddr_handle,会将命令行中的MAC地址添加到MAC过滤表中。
上图显示了命令行下的配置过程。web配置在xml_XXXXX.c文件中,原因是一样的。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。