linux - LL_ALLOCATED_SPACE 和其他注意事项

标签 linux networking linux-kernel kernel

我有一个内核模块,其中我在 PRE-ROUTING Hook 中捕获数据包以进行某些处理。然后我分配一个新的 skb(不能在同一个 skb 中执行)并将输入 skb 的处理后的有效负载和 ip header 放入这个新的 skb 中。然后我想为这个新的 skb 执行 netif_rx 并让它遍历内核网络堆栈。

我对应该分配的新 skb 的大小有点困惑,我的 skb->data 应该指向(network_header 或 mac header)。 skb->len 应该是什么,是否应该考虑 mac header?

len; // total length of new ip datagram
skb_new = dev_alloc_skb(len + LL_ALLOCATED_SPACE(skb->dev) + ETH_LEN);

在此之后,我应该为 LL header 和 Trailer 保留多少,以及我的 skb_new->data 应该指向哪里。

我想在skb中填写所需的详细信息后调用netif_rx(skb_new)。基本上在分配 skb 之后和调用 netif_rx 之前应该遵循什么。 任何链接或描述都会有所帮助。

提前致谢。

最佳答案

套接字缓冲区 (skb) 保存当前协议(protocol)数据单元 (PDU) 的全部 信息,并说明为此 PDU 传递的全部 数据。无论您在 skb 开头留出多少空闲空间,您都可以将 skb->data 指向 YOUR 数据的开头。

关于linux - LL_ALLOCATED_SPACE 和其他注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23022128/

相关文章:

linux-kernel - 读取具有中断属性的设备树节点

linux - 带有 put *.* 的 ftp 命令不发送所有文件

linux - Chef-Server安装找不到chef服务

linux - pry -r ./config/environment 与 pry -r config/environment 不同

python - Python 中的数据包嗅探器

linux - 如何找到程序中断的当前位置

c++ - CPP_TEST.exe : 0xC0000005: Access violation writing location 0x00abcdef 中 0x00af7230 处出现未处理的异常

linux - Docker DNS 设置

java - 我可以找到本地网络上我的服务器的所有正在运行的实例吗?

json - 类型 '[String:Any]' 在 Swift 中没有下标成员