Netfilter程序死机
各位大侠,今天测试一个小程序,测试环境为debian,内核版本为2.6.32-5-686。挂载在NF_INET_LOCAL_OUT挂接点上总是出现死机现象,推断问题在于csum_partial函数,由于小弟对内核还不熟,网络协议栈比较庞大,希望得到高手的指点!
#include <linux/init.h>
#include <linux/module.h>
#include <linux/netfilter.h>
#include <linux/socket.h>
#include <linux/netfilter_ipv4.h>
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include <linux/inet.h>
#include <net/ip.h>
#include <net/tcp.h>
#include <linux/if_ether.h>
#include <linux/string.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("fqb");
static struct nf_hook_ops nfho;
unsigned int window(unsigned int hooknum,
struct sk_buff *__skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
struct sk_buff *skb;
struct iphdr *iph;
struct tcphdr *tcph;
int tot_len;
int iph_len;
int tcph_len;
skb = __skb;
if(skb == NULL)
return NF_ACCEPT;
iph = ip_hdr(skb);
if(iph == NULL)
return NF_ACCEPT;
tot_len = ntohs(iph->tot_len);
iph_len = ip_hdrlen(skb);
if(iph->protocol == IPPROTO_TCP)
{
skb_pull(skb,iph_len);
skb_reset_transport_header(skb);
tcph = tcp_hdr(skb);
tcph_len = tcp_hdrlen(skb);
printk("The origin window = %d\n",ntohs(tcph->window));
tcph->window = htons(ntohs(tcph->window) >> 3);
printk("The adjusted window = %u\n",ntohs(tcph->window));
tcph->check = 0;
skb->csum = csum_partial((unsigned char *)tcph, tot_len - iph_len,0);
tcph->check = csum_tcpudp_magic(iph->saddr,
iph->daddr,
ntohs(iph->tot_len) - iph_len,iph->protocol,
skb->csum);
iph->check = 0;
iph->check = ip_fast_csum(iph,iph->ihl);
skb_push(skb,iph_len);
skb_reset_network_header(skb);
return NF_ACCEPT;
}
return NF_ACCEPT;
}
static int __init modify_init(void)
{
int ret;
nfho.hook = window;
nfho.pf = AF_INET;
nfho.hooknum = NF_INET_LOCAL_OUT;
nfho.priority = NF_IP_PRI_FIRST;
ret = nf_register_hook(&nfho);
if(ret < 0)
{
printk("%s\n", "can't modify skb hook!");
return ret;
}
return 0;
}
static void modify_exit(void)
{
nf_unregister_hook(&nfho);
}
module_init(modify_init);
module_exit(modify_exit);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
struct sk_buff *__skb, ==> 這應該兩個"*"吧,然後 skb = *__skb;