- 论坛徽章:
- 0
|
自己主要是想挂个钩子函数,做些处理,完了后再返回给ip_output
下面是2.6.25的ip_output()函数
int ip_output(struct sk_buff *skb)
{
struct net_device *dev = skb->dst->dev;
IP_INC_STATS(IPSTATS_MIB_OUTREQUESTS);
skb->dev = dev;
skb->protocol = htons(ETH_P_IP);
return NF_HOOK_COND(PF_INET, NF_INET_POST_ROUTING, skb, NULL, dev,
ip_finish_output,
!(IPCB(skb)->flags & IPSKB_REROUTED));
} |
但是不知道如何写个动态加载模块(自己尝试写过,但编译出“insmod: error inserting 'my_nat_k.ko': -1 Unknown symbol in module”错误
以下是我写的一个模板:
static unsigned int get_packet_snat(unsigned int hook,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
{
//return NF_HOOK_COND(PF_INET, NF_INET_POST_ROUTING, skb, in, out,
// ip_output,
// !(IPCB(skb)->flags & IPSKB_REROUTED));//这样写会导致上面的错误
....//这里不知道如何做到传回ip_output()处理了,莫非这里修改完数据包信息后直接return NF_ACCEPT后自动交给下一个函数处理?
我有看到另位大哥写的模块如下:
>> The most important thing it does is at the end:
>>
>> NF_HOOK(PF_INET, LOCAL_OUT_HOOK, skb, NULL, rt->u.dst.dev, dst_output);//他这句是什么意思?
>> return NF_STOLEN;
}
static struct nf_hook_ops nf_mynat_snat_ops =
{
.hook = get_packet_snat,//函数地址
.pf = PF_INET,//协议
.hooknum = NF_INET_POST_ROUTING,//注册点
.priority = NF_IP_PRI_FILTER -1,//优先级
};
static int init(void)
{
nf_register_hook(&nf_mynat_snat_ops);
return 0;
}
static void exit(void)
{
nf_unregister_hook(&nf_mynat_snat_ops);
}
module_init(init);
module_exit(exit);
MODULE_AUTHOR("c_j");
MODULE_LICENSE("GPL");
G了好久也没有找到资料,还请大家帮帮忙。
[ 本帖最后由 C__J 于 2009-5-5 17:45 编辑 ] |
|