…
//添加必要的头文件
#include
#include
#include
//增加我们自定义的扩充命令字
#define SOCKET_OPT_BASE 128
#define SOCKET_OPT_SETTARGET (SOCKET_OPT_BASE)
#define SOCKET_OPT_GETTARGET (SOCKET_OPT_BASE)
#define SOCKET_OPT_MAX (SOCKET_OPT_BASE +1)
#define
ETH "eth0" //interface name
#define
SIP "192.168.6.130"
//#define DIP
"118.6.24.132" //把原来这个注释掉,现在看它越看越不顺眼。
…
#define ADDRLEN 16 //IP地址的长度16字节,格式一般为xxx.xxx.xxx.xxx\0
static char dstIP[ADDRLEN]={0}; //这个就是我们要操作的目的IP。
//为了醒目,我将两个接口分别在不同的函数中来实现。
static int recv_cmd(struct sock *sk,int
cmd, void __user *user,unsigned int len)
{
int ret = 0;
if(cmd == SOCKET_OPT_SETTARGET)
{
memset(dstIP,0,ADDRLEN);
if(0!=(ret = copy_from_user(dstIP,user,len))
{
printk("error: can
not copy data from userspace\n");
return -1;
}
printk("The target IP
from User: %s \n",dstIP);
}
return ret;
}
static int send_cmd(struct sock *sk,int
cmd, void __user *user,int *len)
{
int ret = 0;
if(cmd == SOCKET_OPT_GETTARGET)
{
if(0!=(ret = copy_to_user(user,dstIP,ADDRLEN)))
{
printk("error: can
not copy data to userspace\n");
return -1;
}
printk("The target IP to
User: %s \n",dstIP);
}
return ret;
}
staticstruct
nf_sockopt_ops my_sockops = {
.pf = PF_INET,
.set_optmin = SOCKET_OPT_SETTARGET,
.set_optmax = SOCKET_OPT_MAX,
.set = recv_cmd,
.get_optmin = SOCKET_OPT_GETTARGET,
.get_optmax = SOCKET_OPT_MAX,
.get = send_cmd
};
…
static int index=1;
static unsigned int hook_func(unsigned
int hooknum, struct sk_buff **skb, const struct net_device *in, const struct
net_device *out, int (*okfn)(struct sk_buff *))
{
const struct iphdr *iph = (*skb)->nh.iph;
int ret = NF_ACCEPT;
if(iph->protocol == 1){
atomic_inc(&pktcnt);
if(pktcnt%5 == 0)
{
//简单校验一下IP地址的合法性
if(strcmp(dstIP,””)
!=0 && strcmp(dstIP,”0.0.0.0”)!=0)
{
printk(KERN_INFO
"Sending the %d udp pkt !\n",index++);
ret =
build_and_xmit_udp(ETH,SMAC,DMAC,"hello",5,
in_aton(SIP),in_aton(dstIP),
htons(SPORT),htons(DPORT));
}else{
printk(“Have
%d tims:target IP illegal.Nothing to do!\n”,pktcnt/5);
}
}
}
return ret;
}
…
static int __init myhook_init(void)
{
nf_register_sockopt(&my_sockops); //注册我们的sockops对象
return nf_register_hook(&nfho);
}
static void __exit myhook_fini(void)
{
nf_unregister_hook(&nfho);
nf_unregister_sockopt(&my_sockops); //注销我们的sockops对象
}