Linux内核模块是否有可能透明地绕开来自上层(即L2、L3)和网卡的数据包?例如,1)数据包从网卡到达,模块获取数据包(对其进行一些处理),并将其传递回tcp/ip堆栈或2--应用程序发送数据,模块获取数据包(做一些处理),然后将数据包传递给输出NIC。
它不像一个嗅探器,在该嗅探器中捕获数据包的副本,而实际的数据包流继续。
我想了一些实现我的目标的可能性。我想在内核中注册一个rx_handler来访问传入的数据包(来自NIC),但是如何将其传递回内核堆栈呢?我的意思是,让包遵循它应该走的道路,没有模块在中间。
此外,假设应用程序通过TCP协议发送数据包。模块如何绕开数据包(字面意思是获取数据包)?有可能吗?为了把它通过网卡发送出去,我认为dev_queue_xmit()做了这项工作,但我不确定。
有人知道可能的解决办法吗?或者有小费吗?
基本上,我想知道是否有可能在NIC和MAC层之间放置一个内核模块。或者在MAC层做我想做的事。在积极的情况下,是否有任何类似主内核函数的提示可用于这些目的?
提前谢谢。
发布于 2016-08-26 14:54:10
是。您可以通过提供自定义回调来连接内核网络堆栈,而不是默认的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;
https://stackoverflow.com/questions/39168883
复制相似问题