X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Fchecksum.h;h=ad5cd01ba6ab87c57c257284ad14dade8e42d67a;hb=76f1c218bd84e44666c5a0ae54d543dbce42c376;hp=bf931798a381e35b54f40b936eb19ebffdc6564c;hpb=dd8d6b8cd4d708553037e306d41d1c501d3cecad;p=openvswitch diff --git a/datapath/checksum.h b/datapath/checksum.h index bf931798..ad5cd01b 100644 --- a/datapath/checksum.h +++ b/datapath/checksum.h @@ -12,6 +12,8 @@ #include #include +#include + #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) || \ (defined(CONFIG_XEN) && defined(HAVE_PROTO_DATA_VALID)) #define NEED_CSUM_NORMALIZE @@ -80,10 +82,10 @@ static inline void get_skb_csum_pointers(const struct sk_buff *skb, u16 *csum_start, u16 *csum_offset) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) - *csum_start = skb->csum_start - skb_headroom(skb); + *csum_start = skb->csum_start; *csum_offset = skb->csum_offset; #else - *csum_start = skb_transport_header(skb) - skb->data; + *csum_start = skb_headroom(skb) + skb_transport_offset(skb); *csum_offset = skb->csum; #endif } @@ -100,4 +102,27 @@ static inline void set_skb_csum_pointers(struct sk_buff *skb, u16 csum_start, #endif } +#if defined(NEED_CSUM_NORMALIZE) || LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) +/* This is really compatibility code that belongs in the compat directory. + * However, it needs access to our normalized checksum values, so put it here. + */ +#define inet_proto_csum_replace4 rpl_inet_proto_csum_replace4 +static inline void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb, + __be32 from, __be32 to, + int pseudohdr) +{ + __be32 diff[] = { ~from, to }; + + if (get_ip_summed(skb) != OVS_CSUM_PARTIAL) { + *sum = csum_fold(csum_partial((char *)diff, sizeof(diff), + ~csum_unfold(*sum))); + if (get_ip_summed(skb) == OVS_CSUM_COMPLETE && pseudohdr) + skb->csum = ~csum_partial((char *)diff, sizeof(diff), + ~skb->csum); + } else if (pseudohdr) + *sum = ~csum_fold(csum_partial((char *)diff, sizeof(diff), + csum_unfold(*sum))); +} +#endif + #endif /* checksum.h */