分析TC BPF程序中的非线性数据包有效载荷



我们正在TC egress BPF程序中解析DHCP数据包,在我们的情况下,UDP标头之后的数据包不存在于skb->数据和skb->data_end。经过进一步的研究,我们发现它属于非线性部分。我们有bpf_skbpull_data(skb,len(来直接访问非线性数据。

基于以上几个问题:

  1. 调用bpf_skb_pull_data(skb,skb->len(之后;skb->数据和skb->data_end指针已更改。随着skb->数据指针。这个辅助函数类似于skb_pull,它改变了skb->数据指针,并且通常在数据包由于在该层上解析而进入堆栈时移动?我们在BPF中是否有类似于skb_linearize((的东西,或者任何其他解析非线性部分的方法?

  2. 对于我们的情况,UDP标头之后的数据包处于非线性部分,会不会发生IP标头之后的包处于非线性或以太网标头之后的信息包?

调用bpf_skb_pull_data(skb,skb->len(之后;skb->数据和skb->data_end指针已更改。随着skb->数据指针。

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

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

因此,期望datadata_end指针被更新。如果您只使用内核的API(而不更改内核本身(,我想不出任何其他含义。


这个辅助函数类似于skb_pull,它改变了skb->数据指针

不是。CCD_ 5从数据包的存储器缓冲器的开始处移除数据。当您想使用BPF执行直接数据包访问时,bpf_skb_pull_data会拉入非线性数据。


我们在BPF中是否有类似于skb_linearize((的东西或任何其他解析非线性部分的方法?

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


在我们的情况下,UDP标头后的数据包处于非线性部分,会发生IP标头后的信息包处于非线性或以太网标头后的情况吗?

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

相关内容

  • 没有找到相关文章

最新更新