如何捕获内核模块中的networking帧

我想在某些网卡接收到帧的时候捕获帧; 从中提取一些信息(目前我需要捕获源MAC和源IP地址); 将这些信息保存在一些公共数据结构中; 并让框架上升到TCP / IP协议栈。

我以前使用Netfilter,但显然它不提供链接层挂钩。
有什么办法可以做到这一点?

我正在把它写成一个内核模块。 运行Linux内核2.6.32

Solutions Collecting From Web of "如何捕获内核模块中的networking帧"

实际上Netfilter应该可以正常工作,因为它接收整个数据包(内部存储为包含链路层信息的sk_buff)。 这里有一些示例代码应该让你开始。 该代码拦截给定设备的所有传入数据包,并打印src MAC和src IP。

static struct nf_hook_ops nfin; static unsigned int hook_func_in(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { struct ethhdr *eth; struct iphdr *ip_header; /* check *in is the correct device */ if (in is not the correct device) return NF_ACCEPT; eth = (struct ethhdr*)skb_mac_header(skb); ip_header = (struct iphdr *)skb_network_header(skb); printk("src mac %pM, dst mac %pM\n", eth->h_source, eth->h_dest); printk("src IP addr:=%d.%d.%d.%d:%d\n", NIPQUAD(ip_headr->saddr)); return NF_ACCEPT; } static int __init init_main(void) { nfin.hook = hook_func_in; nfin.hooknum = NF_IP_LOCAL_IN; nfin.pf = PF_INET; nfin.priority = NF_IP_PRI_FIRST; nf_register_hook(&nfin); return 0; } static void __exit cleanup_main(void) { nf_unregister_hook(&nfin); } module_init(init_main); module_exit(cleanup_main);