Linux内核IP Queue机制的分析(三)——ip_queue内核模块的分析(1)
本文分析ip_queue的内核态源码。文中如有任何疏漏和差错,欢迎各位朋友指正。
本文大纲如下:
一、IP Queue的生效
二、网络层中IP报文进入IP Queue的流程
三、ip_queue代码分析
(一)数据结构的定义
(二)ip_queue模块的加载和卸载
(三)ip_queue报文入队处理函数的注册
(四)入队函数ipq_enqueue_packet —— 发送数据包到用户空间
(五)接收和处理用户空间的配置—— 接收用户空间的数据包
(六)数据包的终处理
一、IP Queue的生效
数据包能够进入ip_queue模块,需要两个动作:
(1)模块的加载:modprobe ip_queue
(2)NF上对数据包执行NF_QUEUE的动作,这个可以通过用户态配置一条iptables规则实现:
iptables -A INPUT -p tcp --dport 21 -j QUEUE
这里假设对发往本机的TCP报文端口为21的进行QUEUE。
有了以上两个步骤, 所有匹配到(2)中的报文将会调用IP Queue模块的相关函数。
二、网络层中IP报文进入IP Queue的流程
本文中分析的代码的内核版本为2.6.18.3.
这里我们以本地接收报文为例,如果是转发的报文,可比照着分析即可。
IP层接收报文的函数为:ip_rcv()(ip_input.c)。该函数对报文进行一些初步的检查后,就将报文交给PREROUTING Hook点注册的钩子函数处理: