|
@@ -1522,10 +1522,11 @@ BPF_CALL_5(bpf_l4_csum_replace, struct sk_buff *, skb, u32, offset,
|
|
|
{
|
|
|
bool is_pseudo = flags & BPF_F_PSEUDO_HDR;
|
|
|
bool is_mmzero = flags & BPF_F_MARK_MANGLED_0;
|
|
|
+ bool do_mforce = flags & BPF_F_MARK_ENFORCE;
|
|
|
__sum16 *ptr;
|
|
|
|
|
|
- if (unlikely(flags & ~(BPF_F_MARK_MANGLED_0 | BPF_F_PSEUDO_HDR |
|
|
|
- BPF_F_HDR_FIELD_MASK)))
|
|
|
+ if (unlikely(flags & ~(BPF_F_MARK_MANGLED_0 | BPF_F_MARK_ENFORCE |
|
|
|
+ BPF_F_PSEUDO_HDR | BPF_F_HDR_FIELD_MASK)))
|
|
|
return -EINVAL;
|
|
|
if (unlikely(offset > 0xffff || offset & 1))
|
|
|
return -EFAULT;
|
|
@@ -1533,7 +1534,7 @@ BPF_CALL_5(bpf_l4_csum_replace, struct sk_buff *, skb, u32, offset,
|
|
|
return -EFAULT;
|
|
|
|
|
|
ptr = (__sum16 *)(skb->data + offset);
|
|
|
- if (is_mmzero && !*ptr)
|
|
|
+ if (is_mmzero && !do_mforce && !*ptr)
|
|
|
return 0;
|
|
|
|
|
|
switch (flags & BPF_F_HDR_FIELD_MASK) {
|