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