- 论坛徽章:
- 0
|
本帖最后由 iPowerX 于 2012-03-15 16:10 编辑
程序大致是这样的,通过钩子节点,在LOCAL_IN和LOCAL_OUT两个节点将IP数据包截获。
IP数据包(含IP头)做为原始数据,构造为新的加密数据(新的IP包头(目的地址肯能更换+协议变换)+原始数据的加密数据)
在LOCAL_IN节点截获数据后,如果为加密数据的话-
- if(skb_shared(skb))
- {
- struct sk_buff* skb2=skb_clone(skb, GFP_ATOMIC);
- if(!skb2)
- {
- ERR("skb clone failed\n");
- goto FAIL1;
- }
- if (skb->sk) skb_set_owner_w(skb2, skb->sk);
- kfree_skb(skb);
- skb=skb2;
- }
- if(skb_is_nonlinear(skb)||skb_cloned(skb))
- {
- if(__skb_linearize(skb)<0)
- {
- ERR("psck pull tail failed\n");
- goto FAIL1;
- }
- }
- [将SKB扔进待加密数据队列]
- return NF_STOLEN;
- FAIL1:
- kfree_skb(skb);
- return NF_STOLEN;
复制代码 有一个写加密卡线程,当待加密数据队列不为空时,将数据写入加密卡。
有一个线程一直读加密卡,当读取到数据时,判断如果是进入本机的,则调用如下- int income(struct sk_buff* skb)
- {
- struct iphdr* ip=ip_hdr(skb);
- int ipLen;
- ipLen=ntohs(ip->tot_len);
- if( ip->version != 4)
- {
- MSG("ip version:%d len:%d\n",ip->version,ipLen);
- goto drop;
- }
- nf_reset(skb);
- if(skb->dst)dst_release(skb->dst);
- skb->dst = 0UL;
- netif_rx_ni(skb);
- return 0;
- drop:
- kfree_skb(skb);
- return NET_RX_DROP;
- }
复制代码 备注:关于GSO/TSO的处理是通过注册消息通知链regeister_netdevice_notifier,
将UP的网卡dev->features&=~NETIF_F_GSO_MASK|NETIF_F_GSO
我想请问下,我有没有处理不妥当的地方,因为程序在运行几天后,出现了系统崩溃。
位置出现在income->netif_rx_ni->ip_local_deliver->skb_chksm->tcp_v4_do_rcv->tcp_rcv_established->tcp_ack
|
|