-->

什么是Linux中的NDIS过滤器的模拟?(What is the analogue of an N

2019-09-23 22:40发布

我工作的as close to real-time系统尽可能在linux和需要,我收到一个特定的数据包的TCP数据包立即发送约600-800个字节。

为了获得最佳的可以延迟我想这个数据包直接从内核,而不是它接收到的数据包将所有的方式到用户空间和应用程序了,然后做它的方式回送。

如果我是在Windows上我会写一个NDIS过滤器,我会缓存数据包与和匹配参数来发送,使得它会检查接收的数据包,并在比赛火预先缓存数据包到,而没有经过网络所接收的分组到较高的层。

所以我的问题是什么是Linux的NDIS过滤器的最类似?

我看了一下netfilter的,也许这是我会用的东西,但我不知道这是否是最好的方式。

还有什么我可以做,以实现尽可能低的潜伏期?

我目前的纯用户空间代码给我上2.6.3x内核运行Ubuntu 10.04的英特尔至强3.7 GHz处理器,约80-100微秒。

Answer 1:

您可以使用iptables目标NFLOG复制数据包出用户空间或NFQUEUE允许用户空间损坏它们。 这种相互作用发生过网络链路 ,但可以使用库,比如libnetfilter_log和libnetfilter_queue其包裹在其周围。



Answer 2:

有一个在Linux内核中称为BPF(Berkeley包过滤器)类似的机制。 从您的应用程序注册一个BPF过滤器进入内核。 匹配过滤器中的分组将被捕获并转发到注册钩子函数。

下面是一个exmpale代码我互联网上找到。 ( https://gist.github.com/939154 )基本上必须创建一个开放的,具有BPF滤波器结合,然后选择该FD,用于接收数据包:; set_filter(INT FD){结构bpf_program FCODE = {0};

/* dump ssh packets only */
struct bpf_insn insns[] = {
    BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETHERTYPE_IP, 0, 10),
    BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23),
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, IPPROTO_TCP, 0, 8),
    BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 20),
    BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, 0x1fff, 6, 0),
    BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14),
    BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14),
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 22, 2, 0),
    BPF_STMT(BPF_LD+BPF_H+BPF_IND, 16),
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 22, 0, 1),
    BPF_STMT(BPF_RET+BPF_K, (u_int)-1),
    BPF_STMT(BPF_RET+BPF_K, 0),
};


/* Set the filter */
fcode.bf_len = sizeof(insns) / sizeof(struct bpf_insn);
fcode.bf_insns = &insns[0];

if(ioctl(fd, BIOCSETF, &fcode) < 0)
    return -1;

return 0;

}

该bpf_inst看起来terrbiel。 然而,这并不需要它手动编写。 自动生成这些脚本可以使用TCP转储。

例如:

sudo tcpdump 'tcp[13]=18'  -i eth0 -dd
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 8, 0x00000800 },
{ 0x30, 0, 0, 0x00000017 },
{ 0x15, 0, 6, 0x00000006 },
{ 0x28, 0, 0, 0x00000014 },
{ 0x45, 4, 0, 0x00001fff },
{ 0xb1, 0, 0, 0x0000000e },
{ 0x50, 0, 0, 0x0000001b },
{ 0x15, 0, 1, 0x00000012 },
{ 0x6, 0, 0, 0x00000060 },
{ 0x6, 0, 0, 0x00000000 },


文章来源: What is the analogue of an NDIS filter in linux?