Revision 3831ab20 hw/virtio-net.c
b/hw/virtio-net.c | ||
---|---|---|
222 | 222 |
return offset; |
223 | 223 |
} |
224 | 224 |
|
225 |
static int receive_filter(VirtIONet *n, const uint8_t *buf, int size) |
|
226 |
{ |
|
227 |
static const uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; |
|
228 |
uint8_t *ptr = (uint8_t *)buf; |
|
229 |
|
|
230 |
if (n->promisc) |
|
231 |
return 1; |
|
232 |
|
|
233 |
#ifdef TAP_VNET_HDR |
|
234 |
if (tap_has_vnet_hdr(n->vc->vlan->first_client)) |
|
235 |
ptr += sizeof(struct virtio_net_hdr); |
|
236 |
#endif |
|
237 |
|
|
238 |
if ((ptr[0] & 1) && n->allmulti) |
|
239 |
return 1; |
|
240 |
|
|
241 |
if (!memcmp(ptr, bcast, sizeof(bcast))) |
|
242 |
return 1; |
|
243 |
|
|
244 |
if (!memcmp(ptr, n->mac, ETH_ALEN)) |
|
245 |
return 1; |
|
246 |
|
|
247 |
return 0; |
|
248 |
} |
|
249 |
|
|
225 | 250 |
static void virtio_net_receive(void *opaque, const uint8_t *buf, int size) |
226 | 251 |
{ |
227 | 252 |
VirtIONet *n = opaque; |
... | ... | |
231 | 256 |
if (!do_virtio_net_can_receive(n, size)) |
232 | 257 |
return; |
233 | 258 |
|
259 |
if (!receive_filter(n, buf, size)) |
|
260 |
return; |
|
261 |
|
|
234 | 262 |
/* hdr_len refers to the header we supply to the guest */ |
235 | 263 |
hdr_len = n->mergeable_rx_bufs ? |
236 | 264 |
sizeof(struct virtio_net_hdr_mrg_rxbuf) : sizeof(struct virtio_net_hdr); |
Also available in: Unified diff