X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fcsum.c;h=fb32a530dfce8d9935b78cb24906dfc7df2ce2c8;hb=f40869bdf6feca4d3ff7c59a1fb1f7ac101bc967;hp=668d7108e86d7e47865f6ee3f56a02d0db774c1b;hpb=6879df6b58388ef7dbd8f27c9c152a2df902773d;p=sliver-openvswitch.git diff --git a/lib/csum.c b/lib/csum.c index 668d7108e..fb32a530d 100644 --- a/lib/csum.c +++ b/lib/csum.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, 2010, 2011 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,8 @@ #include "csum.h" #include "unaligned.h" +#ifndef __CHECKER__ + /* Returns the IP checksum of the 'n' bytes in 'data'. * * The return value has the same endianness as the data. That is, if 'data' @@ -109,3 +111,23 @@ recalc_csum32(ovs_be16 old_csum, ovs_be32 old_u32, ovs_be32 new_u32) return recalc_csum16(recalc_csum16(old_csum, old_u32, new_u32), old_u32 >> 16, new_u32 >> 16); } + +/* Returns the new checksum for a packet in which the checksum field previously + * contained 'old_csum' and in which a field that contained 'old_u32[4]' was + * changed to contain 'new_u32[4]'. */ +ovs_be16 +recalc_csum128(ovs_be16 old_csum, ovs_be32 old_u32[4], + const ovs_be32 new_u32[4]) +{ + ovs_be16 new_csum = old_csum; + int i; + + for (i = 0; i < 4; ++i) { + new_csum = recalc_csum32(new_csum, old_u32[i], new_u32[i]); + } + return new_csum; +} +#else /* __CHECKER__ */ +/* Making sparse happy with these functions also makes them unreadable, so + * don't bother to show it their implementations. */ +#endif