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

proc inet_cksum8_kbk {data} {
    set sum 0
    binary scan $data cu* x
    if {[llength $x] & 1} {
	lappend x 0
    }
    foreach {v w} $x {
	set sum [expr {$sum + ($v << 8) + $w}]
	set sum [expr {($sum & 0xffff) + ($sum >> 16)}]
    }
    return [expr {(-1-$sum) & 0xffff}]
}

proc inet_cksum16_kbk {data} {
    binary scan $data\0 Su* x
    set sum 0
    foreach w $x {
	incr sum $w
	set sum [expr {($sum & 0xffff) + ($sum >> 16)}]
    }
    return [expr {(-1-$sum) & 0xffff}]
}