|
@@ -1581,25 +1581,31 @@ int net_client_parse(QemuOptsList *opts_list, const char *optarg)
|
|
|
|
|
|
/* From FreeBSD */
|
|
|
/* XXX: optimize */
|
|
|
-unsigned compute_mcast_idx(const uint8_t *ep)
|
|
|
+uint32_t net_crc32(const uint8_t *p, int len)
|
|
|
{
|
|
|
uint32_t crc;
|
|
|
int carry, i, j;
|
|
|
uint8_t b;
|
|
|
|
|
|
crc = 0xffffffff;
|
|
|
- for (i = 0; i < 6; i++) {
|
|
|
- b = *ep++;
|
|
|
+ for (i = 0; i < len; i++) {
|
|
|
+ b = *p++;
|
|
|
for (j = 0; j < 8; j++) {
|
|
|
carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01);
|
|
|
crc <<= 1;
|
|
|
b >>= 1;
|
|
|
if (carry) {
|
|
|
- crc = ((crc ^ POLYNOMIAL) | carry);
|
|
|
+ crc = ((crc ^ POLYNOMIAL_BE) | carry);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- return crc >> 26;
|
|
|
+
|
|
|
+ return crc;
|
|
|
+}
|
|
|
+
|
|
|
+unsigned compute_mcast_idx(const uint8_t *ep)
|
|
|
+{
|
|
|
+ return net_crc32(ep, ETH_ALEN) >> 26;
|
|
|
}
|
|
|
|
|
|
QemuOptsList qemu_netdev_opts = {
|