- 论坛徽章:
- 0
|
原帖由 独孤九贱 于 2009-8-21 11:51 发表
你这样当然能发出去了,但是我觉得有两个问题:
1、你新的IP首部装上去了,怎么没有看到你重新查询路由方面的代码?
2、应该NF_DROP吧,如果你ACCEPT,不是有两个包了么?那不混乱了?
3、直接NF_DROP干 ...
回答:
1.我是还没写路由代码,因为我先本机tcpdump出发送的包的结构进行验证封装的过程,如果需要发出去,就如“九贱”兄所说,是需要重新路由的,谢谢提醒;
2.现在是有两个包发出啦,是比较乱,如果NF_DROP下去,netfilter框架流程会被打乱,下面的netfilter就没包流过;
3.还是需要偷天换日,释放原来skb,保留nskb信息,但free是有问题哦。
........
int addiphlen =0;
int max_headroom=0;
unsigned int dst =0x80afa8c0;
unsigned int src =0x82afa8c0;
struct sk_buff *nskb=NULL;
struct net_device *dev = skb->dst->dev;
addiphlen = skb->nh.iph->ihl *4;
max_headroom = (LL_RESERVED_SPACE(dev)+sizeof(struct iphdr));
if (skb_headroom(skb) < max_headroom) {
nskb = skb_realloc_headroom(skb, max_headroom);
if (nskb == NULL){
kfree_skb(skb);
return -ENOMEM;
}
if (skb->sk)
skb_set_owner_w(nskb,skb->sk);
kfree(skb);//<---释放问题,
*pskb=nskb;//<----添加,有问题哦。
}
nskb->h.raw = nskb->nh.raw;
nskb->nh.raw = skb_push(nskb, sizeof(struct iphdr));
iph = nskb->nh.iph;
iph->version = hdr->version;
iph->ihl = hdr->ihl;
iph->tos = hdr->tos;
iph->tot_len = htons(ntohs(hdr->tot_len) + addiphlen);
iph->id = hdr->id;
iph->frag_off = hdr->frag_off;
iph->ttl = hdr->ttl;
iph->protocol = IPPROTO_IPIP;
iph->daddr = dst;
iph->saddr = src;
iph->check = 0;
iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
dev_queue_xmit(nskb);
printk("accept the out packet!number:[%d]\n",out_accept_cnt);
}
return NF_ACCEPT;
........ |
|