最近在摸 IC+ IP210S 的晶片,是一個內建 PHY 的 8052 cpu,由於原廠把一堆東西都做成 library,所以只好一切從頭自己來建立囉。

計算方式

計算方式請參考 RFC 1071,主要算法就是以 16bits 為一單位,全部相加起來所得出的值,如果超出 0xffff 也就是有進位,就要把 32bits 拆成二個 16bits 再相加,最後取 not 值就是 checksum。

/* Compute Internet Checksum for "count" bytes beginning at location "addr" */ unsigned short checksum(unsigned short *addr, unsigned short count) { unsigned long sum; sum = 0; while (count > 1) { sum += *addr++; count -= 2; } /* Add left-over byte, if any */ if (count) sum += *(unsigned char __xdata *)addr; /* Fold 32-bit sum to 16 bits */ while (sum >> 16) sum = (sum & 0xffff) + (sum >> 16); return (unsigned short)(~sum); }

注意事項

  1. 驗證 checksum 值是否正確,就是把已包含 checksum 的資料再計算一次 checksum,所得值為 0 即為正確。
  2. checksum 不需要做 endian swap,做了反而是錯的。
  3. IP checksum 只有計算表頭而已,並不包含 data 部份。
  4. ICMP checksum 計算所有的資料,包含 data 部份。

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()