studying network stack under kernel 2.6 (02)

3.利用Module来获得收到的SYN封包数

基本思路:设置一个全局变量count来作计数器。当kernel收到一个SYN包时,计数加一;这样就可以得到具体的数值了。

kernel接收packets流程:netif_rx()->ip_rcv()->tcp_v4_rcv()->tcp_v4_do_rcv();其中,tcp_v4_rcv()函数是TCP用来建立SYN封包时调用的函数。所以,我们需要做的就是在该函数中插入一个HOOK。

位置:Linux 2.6.20 net/ipv4/tcp_ipv4.c:1611 line

int tcp_v4_rcv(struct sk_buff *skb);

在此函数之前,声明全局变量:

int ee_syn_count = 0;

EXPORT_SYMBOL(ee_syn_count);

int(*eefunc_syn)(struct sk_buff *skb) = 0;

EXPORT_SYMBOL(eefunc_syn);

需要将eefunc_syn函数的实现放在内核模块中,将对它的调用放在tcp_v4_rcv()函数中的bh_lock_sock(sk);…bh_unlock_sock(sk)之间。

此外,还要提供一个procfs接口来读取ee_syn_count所记录的数值。不过LDD3现在建议使用sysfs来导出信息,不再建议使用/proc文件系统。

内核模块的内容如下:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/ip.h>
#include <net/ip.h>
#include <linux/tcp.h>
#include <linux/skbuff.h>
#include <linux/proc_fs.h>
extern int ee_syn_count;
extern int (*eefunc_syn)(struct sk_buff *skb);
static int ee_packet_monitor(struct sk_buff *skb)
{
struct iphdr *iph;
struct tcphdr *th;
iph = skb->nh.iph;
if(iph->protocol == IPPROTO_TCP) {//useless?
th = skb->h.th;
if(th->syn) { //judge SYN packet
ee_syn_count ++;
if(ee_syn_count >= (1&lt;&lt;16 -1))
ee_syn_count = 0;
}
}
return 0;
}
static int ee_read_syn_count(char *buf, char **start, off_t offset,
int count, int *eof, void *data)
{
int len = sprintf(buf, "syn count = %d\\n", ee_syn_count);
return len;
}
static int __init ee_init(void)
{
eefunc_syn = ee_packet_monitor;
//create one /proc node
create_proc_read_entry("ee_packet_monitor", 0 /*default mode*/,
NULL/*parent dir*/, ee_read_syn_count,
NULL/*client data*/);
printk("ee_syn_module inserted\\n");
return 0;
}
static void __exit ee_exit(void)
{
eefunc_syn = 0;
remove_proc_entry("ee_packet_monitor", NULL/*parent dir*/);
printk("ee_syn_module removed\\n");
}
module_init(ee_init);
module_exit(ee_exit);
MODULE_LICENSE("GPL");

SYN的packet只是在TCP建立连接的时候才会有,因此在client或者server端只能在创建tcp连接的时候才能看到一个。因为ftp是使用tcp协议的,所以我就用ftp连接了一下别的电脑,然后关闭ftp连接;这样会使得ee_syn_count加1。可以使用如下的命令来看一下/proc文件系统的输出:

[root@localhost:lkm]cat /proc/ee_packet_monitor

会得到结果: syn count = 1;

Advertisements
studying network stack under kernel 2.6 (02)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s