【问题标题】:Parsing Non linear packet payload in TC BPF programs在 TC BPF 程序中解析非线性数据包有效负载
【发布时间】:2022-08-18 23:02:07
【问题描述】:

我们在 TC egress BPF 程序中解析 DHCP 数据包,在我们的例子中,在 skb->data 和 skb->data_end 之间不存在 UDP 标头之后的数据包。经过进一步调查,我们发现它位于非线性部分。我们有 bpf_skb_pull_data(skb,len) 来直接访问非线性数据。

基于以上几个问题:

  1. 调用 bpf_skb_pull_data(skb, skb->len); skb->data 和 skb->data_end 指针的值发生了变化。随着 skb->data 指针值的变化,堆栈是否会产生任何影响。这个辅助函数是否类似于 skb_pull ,它更改 skb->data 指针并且通常在由于在该层上解析数据包而导致数据包上升到堆栈时移动?我们是否有类似于 BPF 中的 skb_linearize() 或任何其他方式来解析非线性部分?

  2. 对于我们的案例,UDP 标头之后的数据包处于非线性部分,IP 标头之后的数据包是否会出现非线性或以太网标头之后的数据包?

    标签: networking ebpf


    【解决方案1】:

    调用 bpf_skb_pull_data(skb, skb->len); skb->data 和 skb->data_end 指针的值发生了变化。 skb->data 指针值的变化是否会对堆栈产生任何影响。

    bpf_skb_pull_data 最终在内核中调用 pskb_expand_head,这说明了影响:

    扩展(或创建相同的副本,如果@nhead 和@ntail 为零)@skb 的标头。 [...] 指向 skb 标头的所有指针可能会更改,并且必须在调用此函数后重新加载。

    因此,预计datadata_end 指针会被更新。如果您只使用内核的 API(而不是对内核本身进行更改),我想不出任何其他含义。


    这个辅助函数也类似于改变 skb->data 指针的 skb_pull

    并不真地。 skb_pull 从数据包的内存缓冲区的开头删除数据。 bpf_skb_pull_data 当您想使用 BPF 执行直接数据包访问时,会引入非线性数据。


    我们是否有类似于 BPF 中的 skb_linearize() 或任何其他方式来解析非线性部分?

    据我所知,最接近的是bpf_skb_pull_data。如果该助手由于某种原因没有解决您的用例,我建议您在 BPF 邮件列表中询问。


    对于我们的案例,UDP 标头之后的数据包处于非线性部分,IP 标头之后的数据包是否会出现非线性或以太网标头之后的数据包?

    是的,对于 IP 有效负载;这只是您的 IP 标头有多大的问题。以太网标头似乎不太可能。

    【讨论】:

      猜你喜欢
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 2017-02-10
      相关资源
      最近更新 更多