diff options
author | Nathan Binkert <nate@cvs.openbsd.org> | 2002-05-07 19:29:00 +0000 |
---|---|---|
committer | Nathan Binkert <nate@cvs.openbsd.org> | 2002-05-07 19:29:00 +0000 |
commit | d4099e9e53696672da0c15c51805e3335e2e4205 (patch) | |
tree | 947182b66019bbe10c1a8d47f52e98c1a2739707 /sys/net | |
parent | 2ea3f7af298faeb6d751bb68c7d3a911fc39c0a2 (diff) |
move ether_crc32_le to if_ethersubr.c. Add ether_crc32_be
Diffstat (limited to 'sys/net')
-rw-r--r-- | sys/net/if_ethersubr.c | 76 |
1 files changed, 75 insertions, 1 deletions
diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c index 417993e4dc3..ffffc70d106 100644 --- a/sys/net/if_ethersubr.c +++ b/sys/net/if_ethersubr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_ethersubr.c,v 1.61 2002/02/07 23:20:57 art Exp $ */ +/* $OpenBSD: if_ethersubr.c,v 1.62 2002/05/07 19:28:58 nate Exp $ */ /* $NetBSD: if_ethersubr.c,v 1.19 1996/05/07 02:40:30 thorpej Exp $ */ /* @@ -1087,6 +1087,80 @@ ether_ifdetach(ifp) } } +#if 0 +/* + * This is for reference. We have a table-driven version + * of the little-endian crc32 generator, which is faster + * than the double-loop. + */ +u_int32_t +ether_crc32_le(const u_int8_t *buf, size_t len) +{ + u_int32_t c, crc, carry; + size_t i, j; + + crc = 0xffffffffU; /* initial value */ + + for (i = 0; i < len; i++) { + c = buf[i]; + for (j = 0; j < 8; j++) { + carry = ((crc & 0x01) ? 1 : 0) ^ (c & 0x01); + crc >>= 1; + c >>= 1; + if (carry) + crc = (crc ^ ETHER_CRC_POLY_LE); + } + } + + return (crc); +} +#else +u_int32_t +ether_crc32_le(const u_int8_t *buf, size_t len) +{ + static const u_int32_t crctab[] = { + 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, + 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, + 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, + 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c + }; + u_int32_t crc; + int i; + + crc = 0xffffffffU; /* initial value */ + + for (i = 0; i < len; i++) { + crc ^= buf[i]; + crc = (crc >> 4) ^ crctab[crc & 0xf]; + crc = (crc >> 4) ^ crctab[crc & 0xf]; + } + + return (crc); +} +#endif + +u_int32_t +ether_crc32_be(const u_int8_t *buf, size_t len) +{ + u_int32_t c, crc, carry; + size_t i, j; + + crc = 0xffffffffU; /* initial value */ + + for (i = 0; i < len; i++) { + c = buf[i]; + for (j = 0; j < 8; j++) { + carry = ((crc & 0x80000000U) ? 1 : 0) ^ (c & 0x01); + crc <<= 1; + c >>= 1; + if (carry) + crc = (crc ^ ETHER_CRC_POLY_BE) | carry; + } + } + + return (crc); +} + u_char ether_ipmulticast_min[6] = { 0x01, 0x00, 0x5e, 0x00, 0x00, 0x00 }; u_char ether_ipmulticast_max[6] = { 0x01, 0x00, 0x5e, 0x7f, 0xff, 0xff }; |