On 11/20/20 6:15 AM, Carlo Carraro wrote:
I report here the issue with the previous patch.
The code is now checking against params->tot_len but then it is still
using is_skb_forwardable.
Consider this case where I shrink the packet:
skb->len == 1520
dev->mtu == 1500
params->tot_len == 1480
So the incoming pkt has len 1520, and the out interface has mtu 1500.
In this case fragmentation is not needed because params->tot_len < dev->mtu.
However the code calls is_skb_forwardable and may return false because
skb->len > dev->mtu, resulting in BPF_FIB_LKUP_RET_FRAG_NEEDED.
What I propose is using params->tot_len only if provided, without
falling back to use is_skb_forwardable when provided.
Something like this:
if (params->tot_len > 0) {
if (params->tot_len > mtu)
rc = BPF_FIB_LKUP_RET_FRAG_NEEDED;
} else if (!is_skb_forwardable(dev, skb)) {
rc = BPF_FIB_LKUP_RET_FRAG_NEEDED;
}
However, doing so we are skipping more relaxed MTU checks inside
is_skb_forwardable, so I'm not sure about this.
Please comment
Daniel's just proposed patch changes this again (removes the
is_skb_forwardable check). Jesper: you might want to hold off until that
happens.