Posted to tcl by kbk at Thu Oct 22 16:07:06 GMT 2009view raw

  1. proc inet_cksum8_kbk {data} {
  2. set sum 0
  3. binary scan $data cu* x
  4. if {[llength $x] & 1} {
  5. lappend x 0
  6. }
  7. foreach {v w} $x {
  8. set sum [expr {$sum + ($v << 8) + $w}]
  9. set sum [expr {($sum & 0xffff) + ($sum >> 16)}]
  10. }
  11. return [expr {(-1-$sum) & 0xffff}]
  12. }
  13.  
  14. proc inet_cksum16_kbk {data} {
  15. binary scan $data\0 Su* x
  16. set sum 0
  17. foreach w $x {
  18. incr sum $w
  19. set sum [expr {($sum & 0xffff) + ($sum >> 16)}]
  20. }
  21. return [expr {(-1-$sum) & 0xffff}]
  22. }