Posted to tcl by kbk at Thu Oct 22 16:48:24 GMT 2009view raw

  1. proc inet_cksum32_kbk2 {data} {
  2. binary scan $data Iu*cu* x extra
  3. lappend extra 0 0 0 0
  4. lassign $extra p q r s
  5. set sum [expr {($p << 24) + ($q << 16) + ($r << 8) + $s}]
  6. foreach w $x {
  7. incr sum $w
  8. }
  9. set sum [expr {($sum & 0xffffffff) + ($sum >> 32)}]
  10. set sum [expr {($sum & 0xffff) + ($sum >> 16)}]
  11. set sum [expr {($sum & 0xffff) + ($sum >> 16)}]
  12. return [expr {(-1-$sum) & 0xffff}]
  13. }