|
@@ -2947,6 +2947,24 @@ int skb_append_pagefrags(struct sk_buff *skb, struct page *page,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(skb_append_pagefrags);
|
|
|
|
|
|
+/**
|
|
|
+ * skb_push_rcsum - push skb and update receive checksum
|
|
|
+ * @skb: buffer to update
|
|
|
+ * @len: length of data pulled
|
|
|
+ *
|
|
|
+ * This function performs an skb_push on the packet and updates
|
|
|
+ * the CHECKSUM_COMPLETE checksum. It should be used on
|
|
|
+ * receive path processing instead of skb_push unless you know
|
|
|
+ * that the checksum difference is zero (e.g., a valid IP header)
|
|
|
+ * or you are setting ip_summed to CHECKSUM_NONE.
|
|
|
+ */
|
|
|
+static unsigned char *skb_push_rcsum(struct sk_buff *skb, unsigned len)
|
|
|
+{
|
|
|
+ skb_push(skb, len);
|
|
|
+ skb_postpush_rcsum(skb, skb->data, len);
|
|
|
+ return skb->data;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* skb_pull_rcsum - pull skb and update receive checksum
|
|
|
* @skb: buffer to update
|
|
@@ -4084,9 +4102,9 @@ struct sk_buff *skb_checksum_trimmed(struct sk_buff *skb,
|
|
|
if (!pskb_may_pull(skb_chk, offset))
|
|
|
goto err;
|
|
|
|
|
|
- __skb_pull(skb_chk, offset);
|
|
|
+ skb_pull_rcsum(skb_chk, offset);
|
|
|
ret = skb_chkf(skb_chk);
|
|
|
- __skb_push(skb_chk, offset);
|
|
|
+ skb_push_rcsum(skb_chk, offset);
|
|
|
|
|
|
if (ret)
|
|
|
goto err;
|