Checksum should be set to 0xFFFF if its value is 0 and
if it is not an option in the processed header.
I think optionable test is inverted. By the way, replace
~checksum (which is 0xFFFFFFFF as it is an uint32_t) by
0xFFFF.
diff -rup v6eval-3.0.10.orig/lib/Pz/MmChecksum.cc v6eval-3.0.10.new/lib/Pz/MmChecksum.cc
--- v6eval-3.0.10.orig/lib/Pz/MmChecksum.cc 2003-10-23 06:37:30.000000000 +0200
+++ v6eval-3.0.10.new/lib/Pz/MmChecksum.cc 2006-10-27 14:57:00.000000000 +0200
@@ -110,9 +110,9 @@ uint32_t ChecksumCalculater::calculate(C
uint32_t sum=src.sum2Octets()+dst.sum2Octets()
+upplen+upptype+uppbuf.sum2Octets();
uint32_t checksum = ::xSum(sum);
- if(optionable && !checksum){
+ if(!optionable && !checksum){
//If the computed checksum is zero,it is transmitted as all ones
- checksum = ~checksum;}
+ checksum = 0xFFFF;}
return checksum;}
uint32_t ChecksumCalculater::calculateWithLength(Con_IPinfo &info,
@@ -129,9 +129,9 @@ uint32_t ChecksumCalculater::calculateWi
uint32_t sum = src.sum2Octets() + dst.sum2Octets() + upplen + upptype + uppbuf.sum2Octets();
uint32_t checksum = ::xSum(sum);
- if((optionable) && (!checksum)){
+ if(!optionable && !checksum){
//If the computed checksum is zero,it is transmitted as all ones
- checksum = ~checksum;
+ checksum = 0xFFFF;
}
return(checksum);
@@ -141,9 +141,9 @@ uint32_t ChecksumCalculater::calculate(
const PvOctets& buf,bool optionable)const{
uint32_t sum = buf.sum2Octets();
uint32_t checksum = ::xSum(sum);
- if(optionable && !checksum){
+ if(!optionable && !checksum){
//If the computed checksum is zero,it is transmitted as all ones
- checksum = ~checksum;}
+ checksum = 0xFFFF;}
return checksum;}
/////////////////////////////////////////////////////////////////////////////