我们正在TC egress BPF程序中解析DHCP数据包,在我们的情况下,UDP标头之后的数据包不存在于skb->数据和skb->data_end。经过进一步的研究,我们发现它属于非线性部分。我们有bpf_skbpull_data(skb,len(来直接访问非线性数据。
基于以上几个问题:
-
调用bpf_skb_pull_data(skb,skb->len(之后;skb->数据和skb->data_end指针已更改。随着skb->数据指针。这个辅助函数类似于skb_pull,它改变了skb->数据指针,并且通常在数据包由于在该层上解析而进入堆栈时移动?我们在BPF中是否有类似于skb_linearize((的东西,或者任何其他解析非线性部分的方法?
-
对于我们的情况,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标头的指针都可能更改,并且必须在调用此函数后重新加载。
因此,期望data
和data_end
指针被更新。如果您只使用内核的API(而不更改内核本身(,我想不出任何其他含义。
这个辅助函数类似于skb_pull,它改变了skb->数据指针
不是。CCD_ 5从数据包的存储器缓冲器的开始处移除数据。当您想使用BPF执行直接数据包访问时,bpf_skb_pull_data
会拉入非线性数据。
我们在BPF中是否有类似于skb_linearize((的东西或任何其他解析非线性部分的方法?
据我所知,最接近的是bpf_skb_pull_data
。如果那个助手由于某种原因没有处理您的用例,我建议您在BPF邮件列表中询问。
在我们的情况下,UDP标头后的数据包处于非线性部分,会发生IP标头后的信息包处于非线性或以太网标头后的情况吗?
对于IP有效负载是;这只是你的IP头有多大的问题。以太网头似乎不太可能。