@@ -2592,6 +2592,19 @@ static inline void skb_postpull_rcsum(struct sk_buff *skb,
skb->csum = csum_sub(skb->csum, csum_partial(start, len, 0));
}
+/**
+ * skb_postpush_rcsum - update checksum for skb after push
+ * @skb: buffer to update
+ * @start: start of data after push
+ * @len: length of data pushed
+ */
+static inline void skb_postpush_rcsum(struct sk_buff *skb,
+ const void *start, unsigned int len)
+{
+ if (skb->ip_summed == CHECKSUM_COMPLETE)
+ skb->csum = csum_add(skb->csum, csum_partial(start, len, 0));
+}
+
unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len);
/**
@@ -1213,8 +1213,8 @@ static u64 bpf_skb_store_bytes(u64 r1, u64 r2, u64 r3, u64 r4, u64 flags)
/* skb_store_bits cannot return -EFAULT here */
skb_store_bits(skb, offset, ptr, len);
- if (BPF_RECOMPUTE_CSUM(flags) && skb->ip_summed == CHECKSUM_COMPLETE)
- skb->csum = csum_add(skb->csum, csum_partial(ptr, len, 0));
+ if (BPF_RECOMPUTE_CSUM(flags))
+ skb_postpush_rcsum(skb, ptr, len);
return 0;
}
similar to skb_postpull_rcsum() introduce skb_postpush_rcsum() helper Signed-off-by: Alexei Starovoitov <ast@plumgrid.com> --- next patch is also using skb_postpush_rcsum() include/linux/skbuff.h | 13 +++++++++++++ net/core/filter.c | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-)