问题标签 [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.

0 投票
1 回答
6988 浏览

c - 在 Linux 中处理 sk_buff 数据包的所有有效负载的正确方法是什么

我目前正在尝试调试在以太网之上运行的 ATM 封装层。基本上,ATM 信元在以太网标头之后按顺序存储。但是我怀疑司机对 sk_buffs 的天真方法被打破了。

驱动程序盲目地假设 skb->data 可以迭代,但查看 virtio_net.c:page_to_skb 的内核代码我看到以下行为:

然后进一步:

这似乎表明缓冲区是碎片化的,只有第一部分可以从 skb->data 直接访问。

我应该使用什么来获取基础数据。理想情况下,我想在 memcpy 将块放入我维护的重组缓冲区之前,在以太网数据包中的任意偏移处查看几个字节。我应该用什么来做到这一点?

0 投票
1 回答
273 浏览

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?

0 投票
0 回答
104 浏览

c - 如何在 Linux 内核中禁用生成分页(非线性)skb?

假设我编写了一些带有网络(netfilter)活动的 LKM,并且我需要对skb包括skb_pull(). 所以在拉之前我要注意是skb线性的还是不是线性的。
如果我通常不想有机会skb在我的系统中面对非线性(分页),我该怎么做?
换句话说:如何skb在 Linux 内核中禁用生成 paged s?
网络接口上是否有一些选项可以设置ethtool或其他?

0 投票
1 回答
255 浏览

c - 如何在设备驱动程序的轮询方法中从 skb 中提取整个数据包,包括以太网标头、ip 和 tcp 以及负载

在 realtek 的 r8169 驱动程序中

这是从驱动程序轮询调用的 rtl_rx 函数内部。我想在上面的代码中知道如何在之后的哪一行从 skb 中提取整个数据包。

我假设在这条线上

我应该有一个数据包,但想知道创建 kmalloc obect 的正确方法

并从 void *packet 读取以太网 ip 和 tcp 标头

如何实现

或者我应该简单地做 skb_netword_header、skb_tcp_header 等...在上面的行中填充 skb 后从 skb 中提取标头和有效负载,

或者我可以简单地转换为

它应该工作吗?

0 投票
1 回答
459 浏览

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 校验和?

0 投票
0 回答
31 浏览

udp - skb_tail_pointer(skb) 无法正常工作。并错误地指向 udp 标头尾部

在 linux 内核版本 3.2.48 上。

作为内核模块中的 udp 服务器,skb_tail_pointer(skb) 是不正确的,它指向 udp 标头尾部,丢失了有效负载大小。udphdr->len 是对的。

它很奇怪。

0 投票
0 回答
32 浏览

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 的LWNdavem 帖子告诉我们有 2 个字节对齐用于 IP 标头性能。在 NIC 驱动程序中的每个 RX 例程中都应该使用这种对齐方式。

就我而言,当我收到struct sk_buffin时,start_xmit()我在( )struct sk_buff中有 2 个空闲字节。这 2 个字节用于我的目的 ( )。headroomskb_headroom(skb)skb_push(skb, 2)

我担心两件事:

  • 我已经在headroom几个发行版中检查了大约 2 个空闲字节并找到了它们。这可能意味着在 TX 期间struct skb传递到已经对齐的字节。start_xmit()这是真的吗?
  • 如果是真的,为什么在打印NET_IP_ALIGN期间使用宏?pr_infostart_xmit()0