Go back to using unpack to generate the checksums, except that
authordjfiander <djfiander>
Sat, 26 Aug 2006 18:50:42 +0000 (18:50 +0000)
committerdjfiander <djfiander>
Sat, 26 Aug 2006 18:50:42 +0000 (18:50 +0000)
I'm using the 'U'TF encoding instead of the 'C'har encoding.
This seems to work, at least in my test environment.

Sip/Checksum.pm

index 07bcd9f..093dfb4 100644 (file)
@@ -9,15 +9,8 @@ our @EXPORT_OK = qw(checksum verify_cksum);
 \r
 sub checksum {\r
     my $pkt = shift;\r
-    my $cksum;\r
-\r
-    $cksum = 0;\r
-    foreach my $chr (map(ord, split(//, $pkt))) {\r
-       $cksum += $chr;\r
-    }\r
-    $cksum = (-$cksum) & 0xFFFF;\r
 \r
-    return $cksum;\r
+    return (-unpack('%16U*', $pkt) & 0xFFFF);\r
 }\r
 \r
 sub verify_cksum {\r
@@ -30,7 +23,7 @@ sub verify_cksum {
     # Convert the checksum back to hex and calculate the sum of the\r
     # pack without the checksum.\r
     $cksum = hex(substr($pkt, -4));\r
-    $shortsum = unpack("%16C*", substr($pkt, 0, -4));\r
+    $shortsum = unpack("%16U*", substr($pkt, 0, -4));\r
 \r
     # The checksum is valid if the hex sum, plus the checksum of the \r
     # base packet short when truncated to 16 bits.\r