|
@@ -829,7 +829,10 @@ static ushort CDP_compute_csum(const uchar *buff, ushort len)
|
|
|
}
|
|
|
if (len) {
|
|
|
leftover = (signed short)(*(const signed char *)buff);
|
|
|
- /* * XXX CISCO SUCKS big time! (and blows too) */
|
|
|
+ /* CISCO SUCKS big time! (and blows too):
|
|
|
+ * CDP uses the IP checksum algorithm with a twist;
|
|
|
+ * for the last byte it *sign* extends and sums.
|
|
|
+ */
|
|
|
result = (result & 0xffff0000) | ((result + leftover) & 0x0000ffff);
|
|
|
}
|
|
|
while (result >> 16)
|