问题标签 [skb]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 在 Linux 中处理 sk_buff 数据包的所有有效负载的正确方法是什么
我目前正在尝试调试在以太网之上运行的 ATM 封装层。基本上,ATM 信元在以太网标头之后按顺序存储。但是我怀疑司机对 sk_buffs 的天真方法被打破了。
驱动程序盲目地假设 skb->data 可以迭代,但查看 virtio_net.c:page_to_skb 的内核代码我看到以下行为:
然后进一步:
这似乎表明缓冲区是碎片化的,只有第一部分可以从 skb->data 直接访问。
我应该使用什么来获取基础数据。理想情况下,我想在 memcpy 将块放入我维护的重组缓冲区之前,在以太网数据包中的任意偏移处查看几个字节。我应该用什么来做到这一点?
c - The purpose of wrapping a pointer in struct in C
In Linux kernel code (up to 3.1.*) I saw such structure definition:
In newer kernel versions this has evolved into:
For what purpose could this wrapping be done in this particular case? And why it may be needed in general case?
c - 如何在 Linux 内核中禁用生成分页(非线性)skb?
假设我编写了一些带有网络(netfilter)活动的 LKM,并且我需要对skb
包括skb_pull()
. 所以在拉之前我要注意是skb
线性的还是不是线性的。
如果我通常不想有机会skb
在我的系统中面对非线性(分页),我该怎么做?
换句话说:如何skb
在 Linux 内核中禁用生成 paged s?
网络接口上是否有一些选项可以设置ethtool
或其他?
c - 如何在设备驱动程序的轮询方法中从 skb 中提取整个数据包,包括以太网标头、ip 和 tcp 以及负载
在 realtek 的 r8169 驱动程序中
这是从驱动程序轮询调用的 rtl_rx 函数内部。我想在上面的代码中知道如何在之后的哪一行从 skb 中提取整个数据包。
我假设在这条线上
我应该有一个数据包,但想知道创建 kmalloc obect 的正确方法
并从 void *packet 读取以太网 ip 和 tcp 标头
如何实现
或者我应该简单地做 skb_netword_header、skb_tcp_header 等...在上面的行中填充 skb 后从 skb 中提取标头和有效负载,
或者我可以简单地转换为
它应该工作吗?
ebpf - XDP 和 sk_buff
我开始使用 ebpf 和 XDP 进行编码。我正在使用 python bcc 将 XDP 程序加载到 NIC。我正在尝试使用 __sk_buff 结构,但是当我尝试访问 skb 的任何字段时,验证程序无法加载程序。
我只想使用bpf_l4_csum_replace
以 skb 作为第一个参数的程序计算第 4 层校验和。
为什么会这样?我什至可以在 XDP 中使用 __sk_buff 结构吗?或者我必须使用 xdp_md 结构?
更新:感谢 Qeole,我了解到我不能使用 XDP 使用 sk_buff。有没有一种方法可以使用 xdp_md 计算 TCP 校验和?
udp - skb_tail_pointer(skb) 无法正常工作。并错误地指向 udp 标头尾部
在 linux 内核版本 3.2.48 上。
作为内核模块中的 udp 服务器,skb_tail_pointer(skb) 是不正确的,它指向 udp 标头尾部,丢失了有效负载大小。udphdr->len 是对的。
它很奇怪。
linux-kernel - Linux Kernel soket buffer struct (sk_buff) free 2 bytes in headroom
在 NIC 驱动程序编写过程中,我阅读并理解了主要struct sk_buff
字段,如headroom
, data
, tailroom
, end
, len
, data_len
. 主要来源如:关于 SKB 的LWN和davem 帖子告诉我们有 2 个字节对齐用于 IP 标头性能。在 NIC 驱动程序中的每个 RX 例程中都应该使用这种对齐方式。
就我而言,当我收到struct sk_buff
in时,start_xmit()
我在( )struct sk_buff
中有 2 个空闲字节。这 2 个字节用于我的目的 ( )。headroom
skb_headroom(skb)
skb_push(skb, 2)
我担心两件事:
- 我已经在
headroom
几个发行版中检查了大约 2 个空闲字节并找到了它们。这可能意味着在 TX 期间struct skb
传递到已经对齐的字节。start_xmit()
这是真的吗? - 如果是真的,为什么在打印
NET_IP_ALIGN
期间使用宏?pr_info
start_xmit()
0