Statistics
| Branch: | Revision:

root / hw / virtio-net.c @ 97b15621

History | View | Annotate | Download (21.5 kB)

1
/*
2
 * Virtio Network Device
3
 *
4
 * Copyright IBM, Corp. 2007
5
 *
6
 * Authors:
7
 *  Anthony Liguori   <aliguori@us.ibm.com>
8
 *
9
 * This work is licensed under the terms of the GNU GPL, version 2.  See
10
 * the COPYING file in the top-level directory.
11
 *
12
 */
13

    
14
#include "virtio.h"
15
#include "net.h"
16
#include "qemu-timer.h"
17
#include "virtio-net.h"
18

    
19
#define VIRTIO_NET_VM_VERSION    10
20

    
21
#define MAC_TABLE_ENTRIES    64
22
#define MAX_VLAN    (1 << 12)   /* Per 802.1Q definition */
23

    
24
typedef struct VirtIONet
25
{
26
    VirtIODevice vdev;
27
    uint8_t mac[ETH_ALEN];
28
    uint16_t status;
29
    VirtQueue *rx_vq;
30
    VirtQueue *tx_vq;
31
    VirtQueue *ctrl_vq;
32
    VLANClientState *vc;
33
    QEMUTimer *tx_timer;
34
    int tx_timer_active;
35
    struct {
36
        VirtQueueElement elem;
37
        ssize_t len;
38
    } async_tx;
39
    int mergeable_rx_bufs;
40
    uint8_t promisc;
41
    uint8_t allmulti;
42
    uint8_t alluni;
43
    uint8_t nomulti;
44
    uint8_t nouni;
45
    uint8_t nobcast;
46
    struct {
47
        int in_use;
48
        int first_multi;
49
        uint8_t multi_overflow;
50
        uint8_t uni_overflow;
51
        uint8_t *macs;
52
    } mac_table;
53
    uint32_t *vlans;
54
} VirtIONet;
55

    
56
/* TODO
57
 * - we could suppress RX interrupt if we were so inclined.
58
 */
59

    
60
static VirtIONet *to_virtio_net(VirtIODevice *vdev)
61
{
62
    return (VirtIONet *)vdev;
63
}
64

    
65
static void virtio_net_get_config(VirtIODevice *vdev, uint8_t *config)
66
{
67
    VirtIONet *n = to_virtio_net(vdev);
68
    struct virtio_net_config netcfg;
69

    
70
    netcfg.status = n->status;
71
    memcpy(netcfg.mac, n->mac, ETH_ALEN);
72
    memcpy(config, &netcfg, sizeof(netcfg));
73
}
74

    
75
static void virtio_net_set_config(VirtIODevice *vdev, const uint8_t *config)
76
{
77
    VirtIONet *n = to_virtio_net(vdev);
78
    struct virtio_net_config netcfg;
79

    
80
    memcpy(&netcfg, config, sizeof(netcfg));
81

    
82
    if (memcmp(netcfg.mac, n->mac, ETH_ALEN)) {
83
        memcpy(n->mac, netcfg.mac, ETH_ALEN);
84
        qemu_format_nic_info_str(n->vc, n->mac);
85
    }
86
}
87

    
88
static void virtio_net_set_link_status(VLANClientState *vc)
89
{
90
    VirtIONet *n = vc->opaque;
91
    uint16_t old_status = n->status;
92

    
93
    if (vc->link_down)
94
        n->status &= ~VIRTIO_NET_S_LINK_UP;
95
    else
96
        n->status |= VIRTIO_NET_S_LINK_UP;
97

    
98
    if (n->status != old_status)
99
        virtio_notify_config(&n->vdev);
100
}
101

    
102
static void virtio_net_reset(VirtIODevice *vdev)
103
{
104
    VirtIONet *n = to_virtio_net(vdev);
105

    
106
    /* Reset back to compatibility mode */
107
    n->promisc = 1;
108
    n->allmulti = 0;
109
    n->alluni = 0;
110
    n->nomulti = 0;
111
    n->nouni = 0;
112
    n->nobcast = 0;
113

    
114
    /* Flush any MAC and VLAN filter table state */
115
    n->mac_table.in_use = 0;
116
    n->mac_table.first_multi = 0;
117
    n->mac_table.multi_overflow = 0;
118
    n->mac_table.uni_overflow = 0;
119
    memset(n->mac_table.macs, 0, MAC_TABLE_ENTRIES * ETH_ALEN);
120
    memset(n->vlans, 0, MAX_VLAN >> 3);
121
}
122

    
123
static uint32_t virtio_net_get_features(VirtIODevice *vdev)
124
{
125
    uint32_t features = (1 << VIRTIO_NET_F_MAC) |
126
                        (1 << VIRTIO_NET_F_MRG_RXBUF) |
127
                        (1 << VIRTIO_NET_F_STATUS) |
128
                        (1 << VIRTIO_NET_F_CTRL_VQ) |
129
                        (1 << VIRTIO_NET_F_CTRL_RX) |
130
                        (1 << VIRTIO_NET_F_CTRL_VLAN) |
131
                        (1 << VIRTIO_NET_F_CTRL_RX_EXTRA);
132

    
133
    return features;
134
}
135

    
136
static uint32_t virtio_net_bad_features(VirtIODevice *vdev)
137
{
138
    uint32_t features = 0;
139

    
140
    /* Linux kernel 2.6.25.  It understood MAC (as everyone must),
141
     * but also these: */
142
    features |= (1 << VIRTIO_NET_F_MAC);
143
    features |= (1 << VIRTIO_NET_F_GUEST_CSUM);
144
    features |= (1 << VIRTIO_NET_F_GUEST_TSO4);
145
    features |= (1 << VIRTIO_NET_F_GUEST_TSO6);
146
    features |= (1 << VIRTIO_NET_F_GUEST_ECN);
147

    
148
    return features & virtio_net_get_features(vdev);
149
}
150

    
151
static void virtio_net_set_features(VirtIODevice *vdev, uint32_t features)
152
{
153
    VirtIONet *n = to_virtio_net(vdev);
154

    
155
    n->mergeable_rx_bufs = !!(features & (1 << VIRTIO_NET_F_MRG_RXBUF));
156
}
157

    
158
static int virtio_net_handle_rx_mode(VirtIONet *n, uint8_t cmd,
159
                                     VirtQueueElement *elem)
160
{
161
    uint8_t on;
162

    
163
    if (elem->out_num != 2 || elem->out_sg[1].iov_len != sizeof(on)) {
164
        fprintf(stderr, "virtio-net ctrl invalid rx mode command\n");
165
        exit(1);
166
    }
167

    
168
    on = ldub_p(elem->out_sg[1].iov_base);
169

    
170
    if (cmd == VIRTIO_NET_CTRL_RX_MODE_PROMISC)
171
        n->promisc = on;
172
    else if (cmd == VIRTIO_NET_CTRL_RX_MODE_ALLMULTI)
173
        n->allmulti = on;
174
    else if (cmd == VIRTIO_NET_CTRL_RX_MODE_ALLUNI)
175
        n->alluni = on;
176
    else if (cmd == VIRTIO_NET_CTRL_RX_MODE_NOMULTI)
177
        n->nomulti = on;
178
    else if (cmd == VIRTIO_NET_CTRL_RX_MODE_NOUNI)
179
        n->nouni = on;
180
    else if (cmd == VIRTIO_NET_CTRL_RX_MODE_NOBCAST)
181
        n->nobcast = on;
182
    else
183
        return VIRTIO_NET_ERR;
184

    
185
    return VIRTIO_NET_OK;
186
}
187

    
188
static int virtio_net_handle_mac(VirtIONet *n, uint8_t cmd,
189
                                 VirtQueueElement *elem)
190
{
191
    struct virtio_net_ctrl_mac mac_data;
192

    
193
    if (cmd != VIRTIO_NET_CTRL_MAC_TABLE_SET || elem->out_num != 3 ||
194
        elem->out_sg[1].iov_len < sizeof(mac_data) ||
195
        elem->out_sg[2].iov_len < sizeof(mac_data))
196
        return VIRTIO_NET_ERR;
197

    
198
    n->mac_table.in_use = 0;
199
    n->mac_table.first_multi = 0;
200
    n->mac_table.uni_overflow = 0;
201
    n->mac_table.multi_overflow = 0;
202
    memset(n->mac_table.macs, 0, MAC_TABLE_ENTRIES * ETH_ALEN);
203

    
204
    mac_data.entries = ldl_le_p(elem->out_sg[1].iov_base);
205

    
206
    if (sizeof(mac_data.entries) +
207
        (mac_data.entries * ETH_ALEN) > elem->out_sg[1].iov_len)
208
        return VIRTIO_NET_ERR;
209

    
210
    if (mac_data.entries <= MAC_TABLE_ENTRIES) {
211
        memcpy(n->mac_table.macs, elem->out_sg[1].iov_base + sizeof(mac_data),
212
               mac_data.entries * ETH_ALEN);
213
        n->mac_table.in_use += mac_data.entries;
214
    } else {
215
        n->mac_table.uni_overflow = 1;
216
    }
217

    
218
    n->mac_table.first_multi = n->mac_table.in_use;
219

    
220
    mac_data.entries = ldl_le_p(elem->out_sg[2].iov_base);
221

    
222
    if (sizeof(mac_data.entries) +
223
        (mac_data.entries * ETH_ALEN) > elem->out_sg[2].iov_len)
224
        return VIRTIO_NET_ERR;
225

    
226
    if (mac_data.entries) {
227
        if (n->mac_table.in_use + mac_data.entries <= MAC_TABLE_ENTRIES) {
228
            memcpy(n->mac_table.macs + (n->mac_table.in_use * ETH_ALEN),
229
                   elem->out_sg[2].iov_base + sizeof(mac_data),
230
                   mac_data.entries * ETH_ALEN);
231
            n->mac_table.in_use += mac_data.entries;
232
        } else {
233
            n->mac_table.multi_overflow = 1;
234
        }
235
    }
236

    
237
    return VIRTIO_NET_OK;
238
}
239

    
240
static int virtio_net_handle_vlan_table(VirtIONet *n, uint8_t cmd,
241
                                        VirtQueueElement *elem)
242
{
243
    uint16_t vid;
244

    
245
    if (elem->out_num != 2 || elem->out_sg[1].iov_len != sizeof(vid)) {
246
        fprintf(stderr, "virtio-net ctrl invalid vlan command\n");
247
        return VIRTIO_NET_ERR;
248
    }
249

    
250
    vid = lduw_le_p(elem->out_sg[1].iov_base);
251

    
252
    if (vid >= MAX_VLAN)
253
        return VIRTIO_NET_ERR;
254

    
255
    if (cmd == VIRTIO_NET_CTRL_VLAN_ADD)
256
        n->vlans[vid >> 5] |= (1U << (vid & 0x1f));
257
    else if (cmd == VIRTIO_NET_CTRL_VLAN_DEL)
258
        n->vlans[vid >> 5] &= ~(1U << (vid & 0x1f));
259
    else
260
        return VIRTIO_NET_ERR;
261

    
262
    return VIRTIO_NET_OK;
263
}
264

    
265
static void virtio_net_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
266
{
267
    VirtIONet *n = to_virtio_net(vdev);
268
    struct virtio_net_ctrl_hdr ctrl;
269
    virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
270
    VirtQueueElement elem;
271

    
272
    while (virtqueue_pop(vq, &elem)) {
273
        if ((elem.in_num < 1) || (elem.out_num < 1)) {
274
            fprintf(stderr, "virtio-net ctrl missing headers\n");
275
            exit(1);
276
        }
277

    
278
        if (elem.out_sg[0].iov_len < sizeof(ctrl) ||
279
            elem.in_sg[elem.in_num - 1].iov_len < sizeof(status)) {
280
            fprintf(stderr, "virtio-net ctrl header not in correct element\n");
281
            exit(1);
282
        }
283

    
284
        ctrl.class = ldub_p(elem.out_sg[0].iov_base);
285
        ctrl.cmd = ldub_p(elem.out_sg[0].iov_base + sizeof(ctrl.class));
286

    
287
        if (ctrl.class == VIRTIO_NET_CTRL_RX_MODE)
288
            status = virtio_net_handle_rx_mode(n, ctrl.cmd, &elem);
289
        else if (ctrl.class == VIRTIO_NET_CTRL_MAC)
290
            status = virtio_net_handle_mac(n, ctrl.cmd, &elem);
291
        else if (ctrl.class == VIRTIO_NET_CTRL_VLAN)
292
            status = virtio_net_handle_vlan_table(n, ctrl.cmd, &elem);
293

    
294
        stb_p(elem.in_sg[elem.in_num - 1].iov_base, status);
295

    
296
        virtqueue_push(vq, &elem, sizeof(status));
297
        virtio_notify(vdev, vq);
298
    }
299
}
300

    
301
/* RX */
302

    
303
static void virtio_net_handle_rx(VirtIODevice *vdev, VirtQueue *vq)
304
{
305
    VirtIONet *n = to_virtio_net(vdev);
306

    
307
    qemu_flush_queued_packets(n->vc);
308

    
309
    /* We now have RX buffers, signal to the IO thread to break out of the
310
     * select to re-poll the tap file descriptor */
311
    qemu_notify_event();
312
}
313

    
314
static int do_virtio_net_can_receive(VirtIONet *n, int bufsize)
315
{
316
    if (!virtio_queue_ready(n->rx_vq) ||
317
        !(n->vdev.status & VIRTIO_CONFIG_S_DRIVER_OK))
318
        return 0;
319

    
320
    if (virtio_queue_empty(n->rx_vq) ||
321
        (n->mergeable_rx_bufs &&
322
         !virtqueue_avail_bytes(n->rx_vq, bufsize, 0))) {
323
        virtio_queue_set_notification(n->rx_vq, 1);
324
        return 0;
325
    }
326

    
327
    virtio_queue_set_notification(n->rx_vq, 0);
328
    return 1;
329
}
330

    
331
static int virtio_net_can_receive(VLANClientState *vc)
332
{
333
    VirtIONet *n = vc->opaque;
334

    
335
    return do_virtio_net_can_receive(n, VIRTIO_NET_MAX_BUFSIZE);
336
}
337

    
338
static int iov_fill(struct iovec *iov, int iovcnt, const void *buf, int count)
339
{
340
    int offset, i;
341

    
342
    offset = i = 0;
343
    while (offset < count && i < iovcnt) {
344
        int len = MIN(iov[i].iov_len, count - offset);
345
        memcpy(iov[i].iov_base, buf + offset, len);
346
        offset += len;
347
        i++;
348
    }
349

    
350
    return offset;
351
}
352

    
353
static int receive_header(VirtIONet *n, struct iovec *iov, int iovcnt,
354
                          const void *buf, size_t size, size_t hdr_len)
355
{
356
    struct virtio_net_hdr *hdr = (struct virtio_net_hdr *)iov[0].iov_base;
357
    int offset = 0;
358

    
359
    hdr->flags = 0;
360
    hdr->gso_type = VIRTIO_NET_HDR_GSO_NONE;
361

    
362
    /* We only ever receive a struct virtio_net_hdr from the tapfd,
363
     * but we may be passing along a larger header to the guest.
364
     */
365
    iov[0].iov_base += hdr_len;
366
    iov[0].iov_len  -= hdr_len;
367

    
368
    return offset;
369
}
370

    
371
static int receive_filter(VirtIONet *n, const uint8_t *buf, int size)
372
{
373
    static const uint8_t bcast[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
374
    static const uint8_t vlan[] = {0x81, 0x00};
375
    uint8_t *ptr = (uint8_t *)buf;
376
    int i;
377

    
378
    if (n->promisc)
379
        return 1;
380

    
381
    if (!memcmp(&ptr[12], vlan, sizeof(vlan))) {
382
        int vid = be16_to_cpup((uint16_t *)(ptr + 14)) & 0xfff;
383
        if (!(n->vlans[vid >> 5] & (1U << (vid & 0x1f))))
384
            return 0;
385
    }
386

    
387
    if (ptr[0] & 1) { // multicast
388
        if (!memcmp(ptr, bcast, sizeof(bcast))) {
389
            return !n->nobcast;
390
        } else if (n->nomulti) {
391
            return 0;
392
        } else if (n->allmulti || n->mac_table.multi_overflow) {
393
            return 1;
394
        }
395

    
396
        for (i = n->mac_table.first_multi; i < n->mac_table.in_use; i++) {
397
            if (!memcmp(ptr, &n->mac_table.macs[i * ETH_ALEN], ETH_ALEN)) {
398
                return 1;
399
            }
400
        }
401
    } else { // unicast
402
        if (n->nouni) {
403
            return 0;
404
        } else if (n->alluni || n->mac_table.uni_overflow) {
405
            return 1;
406
        } else if (!memcmp(ptr, n->mac, ETH_ALEN)) {
407
            return 1;
408
        }
409

    
410
        for (i = 0; i < n->mac_table.first_multi; i++) {
411
            if (!memcmp(ptr, &n->mac_table.macs[i * ETH_ALEN], ETH_ALEN)) {
412
                return 1;
413
            }
414
        }
415
    }
416

    
417
    return 0;
418
}
419

    
420
static ssize_t virtio_net_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
421
{
422
    VirtIONet *n = vc->opaque;
423
    struct virtio_net_hdr_mrg_rxbuf *mhdr = NULL;
424
    size_t hdr_len, offset, i;
425

    
426
    if (!do_virtio_net_can_receive(n, size))
427
        return 0;
428

    
429
    if (!receive_filter(n, buf, size))
430
        return size;
431

    
432
    /* hdr_len refers to the header we supply to the guest */
433
    hdr_len = n->mergeable_rx_bufs ?
434
        sizeof(struct virtio_net_hdr_mrg_rxbuf) : sizeof(struct virtio_net_hdr);
435

    
436
    offset = i = 0;
437

    
438
    while (offset < size) {
439
        VirtQueueElement elem;
440
        int len, total;
441
        struct iovec sg[VIRTQUEUE_MAX_SIZE];
442

    
443
        len = total = 0;
444

    
445
        if ((i != 0 && !n->mergeable_rx_bufs) ||
446
            virtqueue_pop(n->rx_vq, &elem) == 0) {
447
            if (i == 0)
448
                return -1;
449
            fprintf(stderr, "virtio-net truncating packet\n");
450
            exit(1);
451
        }
452

    
453
        if (elem.in_num < 1) {
454
            fprintf(stderr, "virtio-net receive queue contains no in buffers\n");
455
            exit(1);
456
        }
457

    
458
        if (!n->mergeable_rx_bufs && elem.in_sg[0].iov_len != hdr_len) {
459
            fprintf(stderr, "virtio-net header not in first element\n");
460
            exit(1);
461
        }
462

    
463
        memcpy(&sg, &elem.in_sg[0], sizeof(sg[0]) * elem.in_num);
464

    
465
        if (i == 0) {
466
            if (n->mergeable_rx_bufs)
467
                mhdr = (struct virtio_net_hdr_mrg_rxbuf *)sg[0].iov_base;
468

    
469
            offset += receive_header(n, sg, elem.in_num,
470
                                     buf + offset, size - offset, hdr_len);
471
            total += hdr_len;
472
        }
473

    
474
        /* copy in packet.  ugh */
475
        len = iov_fill(sg, elem.in_num,
476
                       buf + offset, size - offset);
477
        total += len;
478

    
479
        /* signal other side */
480
        virtqueue_fill(n->rx_vq, &elem, total, i++);
481

    
482
        offset += len;
483
    }
484

    
485
    if (mhdr)
486
        mhdr->num_buffers = i;
487

    
488
    virtqueue_flush(n->rx_vq, i);
489
    virtio_notify(&n->vdev, n->rx_vq);
490

    
491
    return size;
492
}
493

    
494
static void virtio_net_flush_tx(VirtIONet *n, VirtQueue *vq);
495

    
496
static void virtio_net_tx_complete(VLANClientState *vc, ssize_t len)
497
{
498
    VirtIONet *n = vc->opaque;
499

    
500
    virtqueue_push(n->tx_vq, &n->async_tx.elem, n->async_tx.len);
501
    virtio_notify(&n->vdev, n->tx_vq);
502

    
503
    n->async_tx.elem.out_num = n->async_tx.len = 0;
504

    
505
    virtio_queue_set_notification(n->tx_vq, 1);
506
    virtio_net_flush_tx(n, n->tx_vq);
507
}
508

    
509
/* TX */
510
static void virtio_net_flush_tx(VirtIONet *n, VirtQueue *vq)
511
{
512
    VirtQueueElement elem;
513
    int has_vnet_hdr = 0;
514

    
515
    if (!(n->vdev.status & VIRTIO_CONFIG_S_DRIVER_OK))
516
        return;
517

    
518
    if (n->async_tx.elem.out_num) {
519
        virtio_queue_set_notification(n->tx_vq, 0);
520
        return;
521
    }
522

    
523
    while (virtqueue_pop(vq, &elem)) {
524
        ssize_t ret, len = 0;
525
        unsigned int out_num = elem.out_num;
526
        struct iovec *out_sg = &elem.out_sg[0];
527
        unsigned hdr_len;
528

    
529
        /* hdr_len refers to the header received from the guest */
530
        hdr_len = n->mergeable_rx_bufs ?
531
            sizeof(struct virtio_net_hdr_mrg_rxbuf) :
532
            sizeof(struct virtio_net_hdr);
533

    
534
        if (out_num < 1 || out_sg->iov_len != hdr_len) {
535
            fprintf(stderr, "virtio-net header not in first element\n");
536
            exit(1);
537
        }
538

    
539
        /* ignore the header if GSO is not supported */
540
        if (!has_vnet_hdr) {
541
            out_num--;
542
            out_sg++;
543
            len += hdr_len;
544
        } else if (n->mergeable_rx_bufs) {
545
            /* tapfd expects a struct virtio_net_hdr */
546
            hdr_len -= sizeof(struct virtio_net_hdr);
547
            out_sg->iov_len -= hdr_len;
548
            len += hdr_len;
549
        }
550

    
551
        ret = qemu_sendv_packet_async(n->vc, out_sg, out_num,
552
                                      virtio_net_tx_complete);
553
        if (ret == 0) {
554
            virtio_queue_set_notification(n->tx_vq, 0);
555
            n->async_tx.elem = elem;
556
            n->async_tx.len  = len;
557
            return;
558
        }
559

    
560
        len += ret;
561

    
562
        virtqueue_push(vq, &elem, len);
563
        virtio_notify(&n->vdev, vq);
564
    }
565
}
566

    
567
static void virtio_net_handle_tx(VirtIODevice *vdev, VirtQueue *vq)
568
{
569
    VirtIONet *n = to_virtio_net(vdev);
570

    
571
    if (n->tx_timer_active) {
572
        virtio_queue_set_notification(vq, 1);
573
        qemu_del_timer(n->tx_timer);
574
        n->tx_timer_active = 0;
575
        virtio_net_flush_tx(n, vq);
576
    } else {
577
        qemu_mod_timer(n->tx_timer,
578
                       qemu_get_clock(vm_clock) + TX_TIMER_INTERVAL);
579
        n->tx_timer_active = 1;
580
        virtio_queue_set_notification(vq, 0);
581
    }
582
}
583

    
584
static void virtio_net_tx_timer(void *opaque)
585
{
586
    VirtIONet *n = opaque;
587

    
588
    n->tx_timer_active = 0;
589

    
590
    /* Just in case the driver is not ready on more */
591
    if (!(n->vdev.status & VIRTIO_CONFIG_S_DRIVER_OK))
592
        return;
593

    
594
    virtio_queue_set_notification(n->tx_vq, 1);
595
    virtio_net_flush_tx(n, n->tx_vq);
596
}
597

    
598
static void virtio_net_save(QEMUFile *f, void *opaque)
599
{
600
    VirtIONet *n = opaque;
601

    
602
    virtio_save(&n->vdev, f);
603

    
604
    qemu_put_buffer(f, n->mac, ETH_ALEN);
605
    qemu_put_be32(f, n->tx_timer_active);
606
    qemu_put_be32(f, n->mergeable_rx_bufs);
607
    qemu_put_be16(f, n->status);
608
    qemu_put_byte(f, n->promisc);
609
    qemu_put_byte(f, n->allmulti);
610
    qemu_put_be32(f, n->mac_table.in_use);
611
    qemu_put_buffer(f, n->mac_table.macs, n->mac_table.in_use * ETH_ALEN);
612
    qemu_put_buffer(f, (uint8_t *)n->vlans, MAX_VLAN >> 3);
613
    qemu_put_be32(f, 0); /* vnet-hdr placeholder */
614
    qemu_put_byte(f, n->mac_table.multi_overflow);
615
    qemu_put_byte(f, n->mac_table.uni_overflow);
616
    qemu_put_byte(f, n->alluni);
617
    qemu_put_byte(f, n->nomulti);
618
    qemu_put_byte(f, n->nouni);
619
    qemu_put_byte(f, n->nobcast);
620
}
621

    
622
static int virtio_net_load(QEMUFile *f, void *opaque, int version_id)
623
{
624
    VirtIONet *n = opaque;
625
    int i;
626

    
627
    if (version_id < 2 || version_id > VIRTIO_NET_VM_VERSION)
628
        return -EINVAL;
629

    
630
    virtio_load(&n->vdev, f);
631

    
632
    qemu_get_buffer(f, n->mac, ETH_ALEN);
633
    n->tx_timer_active = qemu_get_be32(f);
634
    n->mergeable_rx_bufs = qemu_get_be32(f);
635

    
636
    if (version_id >= 3)
637
        n->status = qemu_get_be16(f);
638

    
639
    if (version_id >= 4) {
640
        if (version_id < 8) {
641
            n->promisc = qemu_get_be32(f);
642
            n->allmulti = qemu_get_be32(f);
643
        } else {
644
            n->promisc = qemu_get_byte(f);
645
            n->allmulti = qemu_get_byte(f);
646
        }
647
    }
648

    
649
    if (version_id >= 5) {
650
        n->mac_table.in_use = qemu_get_be32(f);
651
        /* MAC_TABLE_ENTRIES may be different from the saved image */
652
        if (n->mac_table.in_use <= MAC_TABLE_ENTRIES) {
653
            qemu_get_buffer(f, n->mac_table.macs,
654
                            n->mac_table.in_use * ETH_ALEN);
655
        } else if (n->mac_table.in_use) {
656
            qemu_fseek(f, n->mac_table.in_use * ETH_ALEN, SEEK_CUR);
657
            n->mac_table.multi_overflow = n->mac_table.uni_overflow = 1;
658
            n->mac_table.in_use = 0;
659
        }
660
    }
661
 
662
    if (version_id >= 6)
663
        qemu_get_buffer(f, (uint8_t *)n->vlans, MAX_VLAN >> 3);
664

    
665
    if (version_id >= 7 && qemu_get_be32(f)) {
666
        fprintf(stderr,
667
                "virtio-net: saved image requires vnet header support\n");
668
        exit(1);
669
    }
670

    
671
    if (version_id >= 9) {
672
        n->mac_table.multi_overflow = qemu_get_byte(f);
673
        n->mac_table.uni_overflow = qemu_get_byte(f);
674
    }
675

    
676
    if (version_id >= 10) {
677
        n->alluni = qemu_get_byte(f);
678
        n->nomulti = qemu_get_byte(f);
679
        n->nouni = qemu_get_byte(f);
680
        n->nobcast = qemu_get_byte(f);
681
    }
682

    
683
    /* Find the first multicast entry in the saved MAC filter */
684
    for (i = 0; i < n->mac_table.in_use; i++) {
685
        if (n->mac_table.macs[i * ETH_ALEN] & 1) {
686
            break;
687
        }
688
    }
689
    n->mac_table.first_multi = i;
690

    
691
    if (n->tx_timer_active) {
692
        qemu_mod_timer(n->tx_timer,
693
                       qemu_get_clock(vm_clock) + TX_TIMER_INTERVAL);
694
    }
695

    
696
    return 0;
697
}
698

    
699
static void virtio_net_cleanup(VLANClientState *vc)
700
{
701
    VirtIONet *n = vc->opaque;
702

    
703
    n->vc = NULL;
704
}
705

    
706
VirtIODevice *virtio_net_init(DeviceState *dev, NICConf *conf)
707
{
708
    VirtIONet *n;
709
    static int virtio_net_id;
710

    
711
    n = (VirtIONet *)virtio_common_init("virtio-net", VIRTIO_ID_NET,
712
                                        sizeof(struct virtio_net_config),
713
                                        sizeof(VirtIONet));
714

    
715
    n->vdev.get_config = virtio_net_get_config;
716
    n->vdev.set_config = virtio_net_set_config;
717
    n->vdev.get_features = virtio_net_get_features;
718
    n->vdev.set_features = virtio_net_set_features;
719
    n->vdev.bad_features = virtio_net_bad_features;
720
    n->vdev.reset = virtio_net_reset;
721
    n->rx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_rx);
722
    n->tx_vq = virtio_add_queue(&n->vdev, 256, virtio_net_handle_tx);
723
    n->ctrl_vq = virtio_add_queue(&n->vdev, 64, virtio_net_handle_ctrl);
724
    qemu_macaddr_default_if_unset(&conf->macaddr);
725
    n->status = VIRTIO_NET_S_LINK_UP;
726
    n->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_NIC, conf->vlan, conf->peer,
727
                                 dev->info->name, dev->id,
728
                                 virtio_net_can_receive,
729
                                 virtio_net_receive, NULL, NULL,
730
                                 virtio_net_cleanup, n);
731
    n->vc->link_status_changed = virtio_net_set_link_status;
732

    
733
    qemu_format_nic_info_str(n->vc, conf->macaddr.a);
734

    
735
    n->tx_timer = qemu_new_timer(vm_clock, virtio_net_tx_timer, n);
736
    n->tx_timer_active = 0;
737
    n->mergeable_rx_bufs = 0;
738
    n->promisc = 1; /* for compatibility */
739

    
740
    n->mac_table.macs = qemu_mallocz(MAC_TABLE_ENTRIES * ETH_ALEN);
741

    
742
    n->vlans = qemu_mallocz(MAX_VLAN >> 3);
743

    
744
    register_savevm("virtio-net", virtio_net_id++, VIRTIO_NET_VM_VERSION,
745
                    virtio_net_save, virtio_net_load, n);
746

    
747
    return &n->vdev;
748
}
749

    
750
void virtio_net_exit(VirtIODevice *vdev)
751
{
752
    VirtIONet *n = DO_UPCAST(VirtIONet, vdev, vdev);
753

    
754
    qemu_purge_queued_packets(n->vc);
755

    
756
    unregister_savevm("virtio-net", n);
757

    
758
    qemu_free(n->mac_table.macs);
759
    qemu_free(n->vlans);
760

    
761
    qemu_del_timer(n->tx_timer);
762
    qemu_free_timer(n->tx_timer);
763

    
764
    virtio_cleanup(&n->vdev);
765
    qemu_del_vlan_client(n->vc);
766
}