X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=datapath%2Fchecksum.h;h=a440c59985ca94a17c5dac620248b345767a5404;hb=bd3ad2c3508aaf7283f3ee041ecd3e5108471b21;hp=4f85104a764797ceb2c0d63818a664707fc37e49;hpb=c3729ee42dc25a8240cee6c0041b7db3e4070414;p=sliver-openvswitch.git diff --git a/datapath/checksum.h b/datapath/checksum.h index 4f85104a7..a440c5998 100644 --- a/datapath/checksum.h +++ b/datapath/checksum.h @@ -1,9 +1,19 @@ /* - * Copyright (c) 2010, 2011 Nicira Networks. - * Distributed under the terms of the GNU GPL version 2. + * Copyright (c) 2007-2011 Nicira, Inc. * - * Significant portions of this file may be copied from parts of the Linux - * kernel, by Linus Torvalds and others. + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA */ #ifndef CHECKSUM_H @@ -34,7 +44,8 @@ u8 get_ip_summed(struct sk_buff *skb); void set_ip_summed(struct sk_buff *skb, u8 ip_summed); void get_skb_csum_pointers(const struct sk_buff *skb, u16 *csum_start, u16 *csum_offset); -void set_skb_csum_pointers(struct sk_buff *skb, u16 csum_start, u16 csum_offset); +void set_skb_csum_pointers(struct sk_buff *skb, u16 csum_start, + u16 csum_offset); #else static inline int compute_ip_summed(struct sk_buff *skb, bool xmit) { @@ -91,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) { @@ -114,7 +149,7 @@ static inline int rpl_pskb_expand_head(struct sk_buff *skb, int nhead, update_csum_start(skb, skb_headroom(skb) - old_headroom); - return 0; + return 0; } #define pskb_expand_head rpl_pskb_expand_head