+#endif
+
+#ifdef NEED_CSUM_NORMALIZE
+static inline void update_csum_start(struct sk_buff *skb, int delta)
+{
+ if (get_ip_summed(skb) == OVS_CSUM_PARTIAL) {
+ u16 csum_start, csum_offset;
+
+ get_skb_csum_pointers(skb, &csum_start, &csum_offset);
+ set_skb_csum_pointers(skb, csum_start + delta, csum_offset);
+ }
+}
+
+static inline int rpl_pskb_expand_head(struct sk_buff *skb, int nhead,
+ int ntail, gfp_t gfp_mask)
+{
+ int err;
+ int old_headroom = skb_headroom(skb);
+
+ err = pskb_expand_head(skb, nhead, ntail, gfp_mask);
+ if (unlikely(err))
+ return err;
+
+ update_csum_start(skb, skb_headroom(skb) - old_headroom);
+
+ return 0;
+}
+#define pskb_expand_head rpl_pskb_expand_head
+
+static inline unsigned char *rpl__pskb_pull_tail(struct sk_buff *skb,
+ int delta)
+{
+ unsigned char *ret;
+ int old_headroom = skb_headroom(skb);
+
+ ret = __pskb_pull_tail(skb, delta);
+ if (unlikely(!ret))
+ return ret;
+
+ update_csum_start(skb, skb_headroom(skb) - old_headroom);
+
+ return ret;
+}
+#define __pskb_pull_tail rpl__pskb_pull_tail
+#endif