编写Netfilter模块以仅接受vlan数据包

时间:2017-10-01 15:00:41

标签: linux-kernel kernel-module netfilter vlan

我正在尝试构建Netfilter。第一阶段是仅接受vlan数据包,然后检查它是否是正确的vlan ID。问题我没有得到任何vlan包。 代码的简单示例:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/if_ether.h>


static struct nf_hook_ops nfho;

static void __exit_filter(void) {
    printk("__exit_filter\n");
        nf_unregister_hook(&nfho); //unregister our hook
}

static u32
recv_packet_handler(const struct nf_hook_ops *ops,
           struct sk_buff *skb,
           const struct net_device *in,
           const struct net_device *out,
           int (*okfn)(struct sk_buff *)){

    //NEED TO GET HERE VLAN PACKETS

    return NF_ACCEPT; 
}

static int __init_filter(void) {
        nfho.hook     = recv_packet_handler;
        nfho.hooknum  = NF_INET_PRE_ROUTING;
        nfho.pf       = PF_INET; 
        nfho.priority = NF_IP_PRI_FIRST;
        nf_register_hook(&nfho); 

    printk("insert filter\n");
        return 0;
}

module_init(__init_filter);
module_exit(__exit_filter);

我想问题出在nfho.pf,但我不知道该怎么做。谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

所以,经过很长一段时间后我发现/ config / network由于配置错误而没有按预期运行。如果你想在你的OpenWrt中启用Vlan你需要这个命令:

uci add network switch_vlan
uci set network.@switch_vlan[-1].device='switch0'
uci set network.@switch_vlan[-1].vlan=[any number from ?-15]
uci set network.@switch_vlan[-1].ports='0t 2t 5t'
uci set network.@switch_vlan[-1].vid=[any number between ?-4094]
uci commit network

注意“端口”是变化的并且依赖于硬件。在一个AP我使用2t,而在另一个AP我需要5t,所以我包括两个来处理两个案例。你的情况可能不同。