今天在centos的虚拟机下尝试以前写的内核程序《2.6内核netfilter包截获 》,insmod 时竟然出错。

insmod: error inserting 'simpFilter.ko': -1 Unknown symbol in module

于是查看日志: tail /var/log/messages ,有一下字样:

Sep  9 16:06:37 vm04 kernel: simpFilter: Unknown symbol ip_hdr

在http://lxr.linux.no/上查找:“ip_hdr”,结果如下:

Code search: ip_hdr
Function include/linux/ip.h, line 110 [usage... ]

明明有嘛,再在虚拟机下查找: /usr/src/linux/include/linux/ip.h中,并不存在函数ip_hdr的定义。奇怪了,虚拟机的内核版本是2.6的啊!

再细看,原来虚拟机的版本是

2.6.18-128.el5xen

而刚才在http://lxr.linux.no/查找用的内核版本是2.6.30.6。再把各个版本都查了一下,发现这个函数是从2.6.22 版本才有的。

那么,在《2.6内核netfilter包截获 》中的描述:

2.6版内核的网络协议栈较2.4版有所改变,比如sk_buff结构中去掉了nh联合体的定义。在2.6内核中我们如果要得到ip数据包的源节点地址, 需要使用const struct iphdr *iph = ip_hdr(skb); ip_hdr 的定义在linux/ip.h中定义。下面通过一个简单的例子介绍在2.6内核中如何在netfilter上挂载hook函数实现数据包的过滤。

就不是太准确了!

 

下面准备更新内核版本了2.6.30 ,哈哈!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐