一个内核模块,用于透明地绕过来自NIC和TCP应用程序的数据包。是否有可能完成它?

时间:2016-08-26 14:39:45

标签: c networking tcp kernel

Linux内核模块是否可以透明地绕过来自上层(即L2,L3)和NIC的数据包?例如, 1)数据包从NIC到达,模块获取数据包(对其执行一些处理)并传递回tcp / ip堆栈或 2) app发送数据,模块获取数据包(进行一些处理),然后将数据包传送到输出NIC。

它不像嗅探器,在实际数据包流继续时捕获数据包的副本。

我想到了实现目标的一些可能性。我想在内核中注册 rx_handler 来访问传入的数据包(来自NIC),但是如何传递回内核堆栈?我的意思是,允许数据包遵循它应该在没有中间模块的情况下采用的路径。

此外,让我们说应用程序正在通过TCP协议发送数据包。模块如何绕过数据包(从字面上获取数据包)?可能吗?为了通过网卡发送出去,我认为 dev_queue_xmit()可以胜任,但我不确定。

有谁知道可能的解决方案?或任何提示?

基本上,我想知道是否有可能在NIC和MAC层之间放置内核模块..或者在MAC层中放置我想做的事情。在积极的情况下,是否有人有任何提示,如主要内核函数用于这些目的?

提前致谢。

1 个答案:

答案 0 :(得分:1)

是。您可以通过提供自定义回调来代替默认的 sk_data_ready 函数来挂钩内核网络堆栈。

static void my_sk_data_ready(struct sock *sk, int len) {
        call_customized_logic(sk, len);
        sock_def_readable(sk, len); /* call default callback or not call it */
}

用法:

sk->sk_data_ready = my_sk_data_ready;