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;}
 
 /////////////////////////////////////////////////////////////////////////////