X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Fchecksum.h;h=a440c59985ca94a17c5dac620248b345767a5404;hb=015ac88281952a1b43ad46e9e6300db1c6e3647b;hp=2f2ffeeb2e66ebaf7b30ebec0dee385bf3bb425c;hpb=e368cad8ecf6dbf272b2a3775b2e3e5e2dc6a5cf;p=sliver-openvswitch.git diff --git a/datapath/checksum.h b/datapath/checksum.h index 2f2ffeeb2..a440c5998 100644 --- a/datapath/checksum.h +++ b/datapath/checksum.h @@ -102,6 +102,30 @@ static inline void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb, } #endif +#if defined(NEED_CSUM_NORMALIZE) || LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0) +#define inet_proto_csum_replace16 rpl_inet_proto_csum_replace16 +static inline void inet_proto_csum_replace16(__sum16 *sum, + struct sk_buff *skb, + const __be32 *from, + const __be32 *to, + int pseudohdr) +{ + __be32 diff[] = { + ~from[0], ~from[1], ~from[2], ~from[3], + to[0], to[1], to[2], to[3], + }; + if (get_ip_summed(skb) != OVS_CSUM_PARTIAL) { + *sum = csum_fold(csum_partial(diff, sizeof(diff), + ~csum_unfold(*sum))); + if (get_ip_summed(skb) == OVS_CSUM_COMPLETE && pseudohdr) + skb->csum = ~csum_partial(diff, sizeof(diff), + ~skb->csum); + } else if (pseudohdr) + *sum = ~csum_fold(csum_partial(diff, sizeof(diff), + csum_unfold(*sum))); +} +#endif + #ifdef NEED_CSUM_NORMALIZE static inline void update_csum_start(struct sk_buff *skb, int delta) {