net.c 32.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*
 * QEMU System Emulator
 *
 * Copyright (c) 2003-2008 Fabrice Bellard
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
M
Mark McLoughlin 已提交
24
#include "net.h"
25

B
blueswir1 已提交
26 27
#include "config-host.h"

28
#include "net/tap.h"
29
#include "net/socket.h"
30
#include "net/dump.h"
31
#include "net/slirp.h"
32
#include "net/vde.h"
33
#include "net/util.h"
34
#include "monitor.h"
M
Mark McLoughlin 已提交
35
#include "qemu-common.h"
36
#include "qemu_socket.h"
L
Luiz Capitulino 已提交
37
#include "qmp-commands.h"
38
#include "hw/qdev.h"
B
Benjamin Poirier 已提交
39
#include "iov.h"
40 41 42
#include "qapi-visit.h"
#include "qapi/opts-visitor.h"
#include "qapi/qapi-dealloc-visitor.h"
43

44 45 46 47 48
/* Net bridge is currently not supported for W32. */
#if !defined(_WIN32)
# define CONFIG_NET_BRIDGE
#endif

49
static QTAILQ_HEAD(, VLANState) vlans;
50
static QTAILQ_HEAD(, VLANClientState) non_vlan_clients;
51

G
Gerd Hoffmann 已提交
52 53
int default_net = 1;

54 55 56
/***********************************************************/
/* network device redirectors */

57
#if defined(DEBUG_NET)
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
static void hex_dump(FILE *f, const uint8_t *buf, int size)
{
    int len, i, j, c;

    for(i=0;i<size;i+=16) {
        len = size - i;
        if (len > 16)
            len = 16;
        fprintf(f, "%08x ", i);
        for(j=0;j<16;j++) {
            if (j < len)
                fprintf(f, " %02x", buf[i+j]);
            else
                fprintf(f, "   ");
        }
        fprintf(f, " ");
        for(j=0;j<len;j++) {
            c = buf[i+j];
            if (c < ' ' || c > '~')
                c = '.';
            fprintf(f, "%c", c);
        }
        fprintf(f, "\n");
    }
}
#endif

static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
{
    const char *p, *p1;
    int len;
    p = *pp;
    p1 = strchr(p, sep);
    if (!p1)
        return -1;
    len = p1 - p;
    p1++;
    if (buf_size > 0) {
        if (len > buf_size - 1)
            len = buf_size - 1;
        memcpy(buf, p, len);
        buf[len] = '\0';
    }
    *pp = p1;
    return 0;
}

int parse_host_port(struct sockaddr_in *saddr, const char *str)
{
    char buf[512];
    struct hostent *he;
    const char *p, *r;
    int port;

    p = str;
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
        return -1;
    saddr->sin_family = AF_INET;
    if (buf[0] == '\0') {
        saddr->sin_addr.s_addr = 0;
    } else {
119
        if (qemu_isdigit(buf[0])) {
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
            if (!inet_aton(buf, &saddr->sin_addr))
                return -1;
        } else {
            if ((he = gethostbyname(buf)) == NULL)
                return - 1;
            saddr->sin_addr = *(struct in_addr *)he->h_addr;
        }
    }
    port = strtol(p, (char **)&r, 0);
    if (r == p)
        return -1;
    saddr->sin_port = htons(port);
    return 0;
}

135 136 137
void qemu_format_nic_info_str(VLANClientState *vc, uint8_t macaddr[6])
{
    snprintf(vc->info_str, sizeof(vc->info_str),
138 139
             "model=%s,macaddr=%02x:%02x:%02x:%02x:%02x:%02x",
             vc->model,
140 141 142 143
             macaddr[0], macaddr[1], macaddr[2],
             macaddr[3], macaddr[4], macaddr[5]);
}

G
Gerd Hoffmann 已提交
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
void qemu_macaddr_default_if_unset(MACAddr *macaddr)
{
    static int index = 0;
    static const MACAddr zero = { .a = { 0,0,0,0,0,0 } };

    if (memcmp(macaddr, &zero, sizeof(zero)) != 0)
        return;
    macaddr->a[0] = 0x52;
    macaddr->a[1] = 0x54;
    macaddr->a[2] = 0x00;
    macaddr->a[3] = 0x12;
    macaddr->a[4] = 0x34;
    macaddr->a[5] = 0x56 + index++;
}

159 160 161
static char *assign_name(VLANClientState *vc1, const char *model)
{
    VLANState *vlan;
162
    VLANClientState *vc;
163 164 165
    char buf[256];
    int id = 0;

166 167 168
    QTAILQ_FOREACH(vlan, &vlans, next) {
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
            if (vc != vc1 && strcmp(vc->model, model) == 0) {
169
                id++;
170 171
            }
        }
172 173
    }

174 175 176 177 178 179
    QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
        if (vc != vc1 && strcmp(vc->model, model) == 0) {
            id++;
        }
    }

180 181
    snprintf(buf, sizeof(buf), "%s.%d", model, id);

182
    return g_strdup(buf);
183 184
}

185
static ssize_t qemu_deliver_packet(VLANClientState *sender,
186
                                   unsigned flags,
187 188 189 190
                                   const uint8_t *data,
                                   size_t size,
                                   void *opaque);
static ssize_t qemu_deliver_packet_iov(VLANClientState *sender,
191
                                       unsigned flags,
192 193 194 195
                                       const struct iovec *iov,
                                       int iovcnt,
                                       void *opaque);

196 197 198 199 200
VLANClientState *qemu_new_net_client(NetClientInfo *info,
                                     VLANState *vlan,
                                     VLANClientState *peer,
                                     const char *model,
                                     const char *name)
201
{
202 203
    VLANClientState *vc;

204 205
    assert(info->size >= sizeof(VLANClientState));

206
    vc = g_malloc0(info->size);
207

208
    vc->info = info;
209
    vc->model = g_strdup(model);
210
    if (name) {
211
        vc->name = g_strdup(name);
212
    } else {
213
        vc->name = assign_name(vc, model);
214
    }
215

216
    if (vlan) {
217
        assert(!peer);
218 219
        vc->vlan = vlan;
        QTAILQ_INSERT_TAIL(&vc->vlan->clients, vc, next);
220
    } else {
221
        if (peer) {
222
            assert(!peer->peer);
223 224 225
            vc->peer = peer;
            peer->peer = vc;
        }
226
        QTAILQ_INSERT_TAIL(&non_vlan_clients, vc, next);
227 228 229 230

        vc->send_queue = qemu_new_net_queue(qemu_deliver_packet,
                                            qemu_deliver_packet_iov,
                                            vc);
231
    }
232 233 234 235

    return vc;
}

236 237 238 239 240 241 242 243 244
NICState *qemu_new_nic(NetClientInfo *info,
                       NICConf *conf,
                       const char *model,
                       const char *name,
                       void *opaque)
{
    VLANClientState *nc;
    NICState *nic;

245
    assert(info->type == NET_CLIENT_OPTIONS_KIND_NIC);
246 247 248 249 250 251 252 253 254 255 256
    assert(info->size >= sizeof(NICState));

    nc = qemu_new_net_client(info, conf->vlan, conf->peer, model, name);

    nic = DO_UPCAST(NICState, nc, nc);
    nic->conf = conf;
    nic->opaque = opaque;

    return nic;
}

257
static void qemu_cleanup_vlan_client(VLANClientState *vc)
258
{
259 260
    if (vc->vlan) {
        QTAILQ_REMOVE(&vc->vlan->clients, vc, next);
261 262
    } else {
        QTAILQ_REMOVE(&non_vlan_clients, vc, next);
263
    }
264

265 266
    if (vc->info->cleanup) {
        vc->info->cleanup(vc);
267
    }
268
}
269

270 271 272 273 274 275 276 277 278 279
static void qemu_free_vlan_client(VLANClientState *vc)
{
    if (!vc->vlan) {
        if (vc->send_queue) {
            qemu_del_net_queue(vc->send_queue);
        }
        if (vc->peer) {
            vc->peer->peer = NULL;
        }
    }
280 281 282
    g_free(vc->name);
    g_free(vc->model);
    g_free(vc);
283 284
}

285 286 287
void qemu_del_vlan_client(VLANClientState *vc)
{
    /* If there is a peer NIC, delete and cleanup client, but do not free. */
288
    if (!vc->vlan && vc->peer && vc->peer->info->type == NET_CLIENT_OPTIONS_KIND_NIC) {
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
        NICState *nic = DO_UPCAST(NICState, nc, vc->peer);
        if (nic->peer_deleted) {
            return;
        }
        nic->peer_deleted = true;
        /* Let NIC know peer is gone. */
        vc->peer->link_down = true;
        if (vc->peer->info->link_status_changed) {
            vc->peer->info->link_status_changed(vc->peer);
        }
        qemu_cleanup_vlan_client(vc);
        return;
    }

    /* If this is a peer NIC and peer has already been deleted, free it now. */
304
    if (!vc->vlan && vc->peer && vc->info->type == NET_CLIENT_OPTIONS_KIND_NIC) {
305 306 307 308 309 310 311 312 313 314
        NICState *nic = DO_UPCAST(NICState, nc, vc);
        if (nic->peer_deleted) {
            qemu_free_vlan_client(vc->peer);
        }
    }

    qemu_cleanup_vlan_client(vc);
    qemu_free_vlan_client(vc);
}

315
VLANClientState *
316 317 318 319 320 321 322 323 324 325 326 327
qemu_find_vlan_client_by_name(Monitor *mon, int vlan_id,
                              const char *client_str)
{
    VLANState *vlan;
    VLANClientState *vc;

    vlan = qemu_find_vlan(vlan_id, 0);
    if (!vlan) {
        monitor_printf(mon, "unknown VLAN %d\n", vlan_id);
        return NULL;
    }

328
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
329 330 331 332 333 334 335 336 337 338 339 340
        if (!strcmp(vc->name, client_str)) {
            break;
        }
    }
    if (!vc) {
        monitor_printf(mon, "can't find device %s on VLAN %d\n",
                       client_str, vlan_id);
    }

    return vc;
}

M
Mark McLoughlin 已提交
341 342 343 344 345 346
void qemu_foreach_nic(qemu_nic_foreach func, void *opaque)
{
    VLANClientState *nc;
    VLANState *vlan;

    QTAILQ_FOREACH(nc, &non_vlan_clients, next) {
347
        if (nc->info->type == NET_CLIENT_OPTIONS_KIND_NIC) {
M
Mark McLoughlin 已提交
348 349 350 351 352 353
            func(DO_UPCAST(NICState, nc, nc), opaque);
        }
    }

    QTAILQ_FOREACH(vlan, &vlans, next) {
        QTAILQ_FOREACH(nc, &vlan->clients, next) {
354
            if (nc->info->type == NET_CLIENT_OPTIONS_KIND_NIC) {
M
Mark McLoughlin 已提交
355 356 357 358 359 360
                func(DO_UPCAST(NICState, nc, nc), opaque);
            }
        }
    }
}

361
int qemu_can_send_packet(VLANClientState *sender)
362
{
363
    VLANState *vlan = sender->vlan;
364 365
    VLANClientState *vc;

366
    if (sender->peer) {
367 368
        if (sender->peer->receive_disabled) {
            return 0;
369 370
        } else if (sender->peer->info->can_receive &&
                   !sender->peer->info->can_receive(sender->peer)) {
371
            return 0;
372 373
        } else {
            return 1;
374 375 376
        }
    }

377 378 379 380
    if (!sender->vlan) {
        return 1;
    }

381
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
382 383 384 385
        if (vc == sender) {
            continue;
        }

386
        /* no can_receive() handler, they can always receive */
387 388
        if (vc->info->can_receive && !vc->info->can_receive(vc)) {
            return 0;
389 390
        }
    }
391
    return 1;
392 393
}

394
static ssize_t qemu_deliver_packet(VLANClientState *sender,
395
                                   unsigned flags,
396 397 398 399 400
                                   const uint8_t *data,
                                   size_t size,
                                   void *opaque)
{
    VLANClientState *vc = opaque;
401
    ssize_t ret;
402 403 404 405 406

    if (vc->link_down) {
        return size;
    }

407 408 409 410
    if (vc->receive_disabled) {
        return 0;
    }

411 412
    if (flags & QEMU_NET_PACKET_FLAG_RAW && vc->info->receive_raw) {
        ret = vc->info->receive_raw(vc, data, size);
413
    } else {
414
        ret = vc->info->receive(vc, data, size);
415 416 417 418 419 420 421
    }

    if (ret == 0) {
        vc->receive_disabled = 1;
    };

    return ret;
422 423
}

424
static ssize_t qemu_vlan_deliver_packet(VLANClientState *sender,
425
                                        unsigned flags,
426 427 428
                                        const uint8_t *buf,
                                        size_t size,
                                        void *opaque)
429
{
430
    VLANState *vlan = opaque;
431
    VLANClientState *vc;
432
    ssize_t ret = -1;
433

434
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
435 436 437 438
        ssize_t len;

        if (vc == sender) {
            continue;
439
        }
440 441 442 443 444 445

        if (vc->link_down) {
            ret = size;
            continue;
        }

446 447 448 449 450
        if (vc->receive_disabled) {
            ret = 0;
            continue;
        }

451 452
        if (flags & QEMU_NET_PACKET_FLAG_RAW && vc->info->receive_raw) {
            len = vc->info->receive_raw(vc, buf, size);
453
        } else {
454
            len = vc->info->receive(vc, buf, size);
455 456 457 458 459
        }

        if (len == 0) {
            vc->receive_disabled = 1;
        }
460 461

        ret = (ret >= 0) ? ret : len;
462

463
    }
464 465

    return ret;
466 467
}

468 469
void qemu_purge_queued_packets(VLANClientState *vc)
{
470 471 472
    NetQueue *queue;

    if (!vc->peer && !vc->vlan) {
473
        return;
474
    }
475

476 477 478 479 480 481 482
    if (vc->peer) {
        queue = vc->peer->send_queue;
    } else {
        queue = vc->vlan->send_queue;
    }

    qemu_net_queue_purge(queue, vc);
483 484
}

485
void qemu_flush_queued_packets(VLANClientState *vc)
486
{
487 488
    NetQueue *queue;

489 490
    vc->receive_disabled = 0;

491 492 493 494 495
    if (vc->vlan) {
        queue = vc->vlan->send_queue;
    } else {
        queue = vc->send_queue;
    }
496

497
    qemu_net_queue_flush(queue);
498 499
}

500 501 502 503
static ssize_t qemu_send_packet_async_with_flags(VLANClientState *sender,
                                                 unsigned flags,
                                                 const uint8_t *buf, int size,
                                                 NetPacketSent *sent_cb)
504
{
505
    NetQueue *queue;
506

507
#ifdef DEBUG_NET
508
    printf("qemu_send_packet_async:\n");
509 510
    hex_dump(stdout, buf, size);
#endif
511

512 513 514 515 516 517 518 519 520 521
    if (sender->link_down || (!sender->peer && !sender->vlan)) {
        return size;
    }

    if (sender->peer) {
        queue = sender->peer->send_queue;
    } else {
        queue = sender->vlan->send_queue;
    }

522 523 524 525 526 527 528 529 530
    return qemu_net_queue_send(queue, sender, flags, buf, size, sent_cb);
}

ssize_t qemu_send_packet_async(VLANClientState *sender,
                               const uint8_t *buf, int size,
                               NetPacketSent *sent_cb)
{
    return qemu_send_packet_async_with_flags(sender, QEMU_NET_PACKET_FLAG_NONE,
                                             buf, size, sent_cb);
531 532 533 534 535
}

void qemu_send_packet(VLANClientState *vc, const uint8_t *buf, int size)
{
    qemu_send_packet_async(vc, buf, size, NULL);
536 537
}

538 539 540 541 542 543
ssize_t qemu_send_packet_raw(VLANClientState *vc, const uint8_t *buf, int size)
{
    return qemu_send_packet_async_with_flags(vc, QEMU_NET_PACKET_FLAG_RAW,
                                             buf, size, NULL);
}

A
aliguori 已提交
544 545 546 547
static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov,
                               int iovcnt)
{
    uint8_t buffer[4096];
B
Benjamin Poirier 已提交
548
    size_t offset;
A
aliguori 已提交
549

550
    offset = iov_to_buf(iov, iovcnt, 0, buffer, sizeof(buffer));
A
aliguori 已提交
551

552
    return vc->info->receive(vc, buffer, offset);
A
aliguori 已提交
553 554
}

555
static ssize_t qemu_deliver_packet_iov(VLANClientState *sender,
556
                                       unsigned flags,
557 558 559 560 561 562 563
                                       const struct iovec *iov,
                                       int iovcnt,
                                       void *opaque)
{
    VLANClientState *vc = opaque;

    if (vc->link_down) {
B
Benjamin Poirier 已提交
564
        return iov_size(iov, iovcnt);
565 566
    }

567 568
    if (vc->info->receive_iov) {
        return vc->info->receive_iov(vc, iov, iovcnt);
569 570 571 572 573
    } else {
        return vc_sendv_compat(vc, iov, iovcnt);
    }
}

574
static ssize_t qemu_vlan_deliver_packet_iov(VLANClientState *sender,
575
                                            unsigned flags,
576 577 578
                                            const struct iovec *iov,
                                            int iovcnt,
                                            void *opaque)
A
aliguori 已提交
579
{
580
    VLANState *vlan = opaque;
A
aliguori 已提交
581
    VLANClientState *vc;
582
    ssize_t ret = -1;
583

584
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
585 586 587 588 589 590 591
        ssize_t len;

        if (vc == sender) {
            continue;
        }

        if (vc->link_down) {
B
Benjamin Poirier 已提交
592
            ret = iov_size(iov, iovcnt);
593 594 595
            continue;
        }

596 597
        assert(!(flags & QEMU_NET_PACKET_FLAG_RAW));

598 599
        if (vc->info->receive_iov) {
            len = vc->info->receive_iov(vc, iov, iovcnt);
600 601 602 603 604 605 606 607 608 609
        } else {
            len = vc_sendv_compat(vc, iov, iovcnt);
        }

        ret = (ret >= 0) ? ret : len;
    }

    return ret;
}

610 611 612
ssize_t qemu_sendv_packet_async(VLANClientState *sender,
                                const struct iovec *iov, int iovcnt,
                                NetPacketSent *sent_cb)
613
{
614 615 616
    NetQueue *queue;

    if (sender->link_down || (!sender->peer && !sender->vlan)) {
B
Benjamin Poirier 已提交
617
        return iov_size(iov, iovcnt);
618 619
    }

620 621 622 623 624 625
    if (sender->peer) {
        queue = sender->peer->send_queue;
    } else {
        queue = sender->vlan->send_queue;
    }

626 627 628
    return qemu_net_queue_send_iov(queue, sender,
                                   QEMU_NET_PACKET_FLAG_NONE,
                                   iov, iovcnt, sent_cb);
A
aliguori 已提交
629 630
}

631 632 633 634 635 636
ssize_t
qemu_sendv_packet(VLANClientState *vc, const struct iovec *iov, int iovcnt)
{
    return qemu_sendv_packet_async(vc, iov, iovcnt, NULL);
}

637
/* find or alloc a new VLAN */
638
VLANState *qemu_find_vlan(int id, int allocate)
639
{
640 641 642 643
    VLANState *vlan;

    QTAILQ_FOREACH(vlan, &vlans, next) {
        if (vlan->id == id) {
644
            return vlan;
645
        }
646
    }
647

648 649 650
    if (!allocate) {
        return NULL;
    }
651

652
    vlan = g_malloc0(sizeof(VLANState));
653
    vlan->id = id;
654
    QTAILQ_INIT(&vlan->clients);
655 656 657 658

    vlan->send_queue = qemu_new_net_queue(qemu_vlan_deliver_packet,
                                          qemu_vlan_deliver_packet_iov,
                                          vlan);
659 660 661

    QTAILQ_INSERT_TAIL(&vlans, vlan, next);

662 663 664
    return vlan;
}

G
Gerd Hoffmann 已提交
665
VLANClientState *qemu_find_netdev(const char *id)
M
Mark McLoughlin 已提交
666 667 668 669
{
    VLANClientState *vc;

    QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
670
        if (vc->info->type == NET_CLIENT_OPTIONS_KIND_NIC)
671
            continue;
M
Mark McLoughlin 已提交
672 673 674 675 676 677 678 679
        if (!strcmp(vc->name, id)) {
            return vc;
        }
    }

    return NULL;
}

680 681 682 683 684 685 686 687 688 689
static int nic_get_free_idx(void)
{
    int index;

    for (index = 0; index < MAX_NICS; index++)
        if (!nd_table[index].used)
            return index;
    return -1;
}

690 691 692 693 694 695 696 697 698 699 700 701 702
int qemu_show_nic_models(const char *arg, const char *const *models)
{
    int i;

    if (!arg || strcmp(arg, "?"))
        return 0;

    fprintf(stderr, "qemu: Supported NIC models: ");
    for (i = 0 ; models[i]; i++)
        fprintf(stderr, "%s%c", models[i], models[i+1] ? ',' : '\n');
    return 1;
}

703 704 705 706 707 708 709
void qemu_check_nic_model(NICInfo *nd, const char *model)
{
    const char *models[2];

    models[0] = model;
    models[1] = NULL;

710 711 712 713
    if (qemu_show_nic_models(nd->model, models))
        exit(0);
    if (qemu_find_nic_model(nd, models, model) < 0)
        exit(1);
714 715
}

716 717
int qemu_find_nic_model(NICInfo *nd, const char * const *models,
                        const char *default_model)
718
{
719
    int i;
720 721

    if (!nd->model)
722
        nd->model = g_strdup(default_model);
723

724 725 726
    for (i = 0 ; models[i]; i++) {
        if (strcmp(nd->model, models[i]) == 0)
            return i;
727 728
    }

729
    error_report("Unsupported NIC model: %s", nd->model);
730
    return -1;
731 732
}

733
int net_handle_fd_param(Monitor *mon, const char *param)
734
{
735 736 737
    int fd;

    if (!qemu_isdigit(param[0]) && mon) {
738 739 740

        fd = monitor_get_fd(mon, param);
        if (fd == -1) {
741
            error_report("No file descriptor named %s found", param);
742 743 744
            return -1;
        }
    } else {
745
        fd = qemu_parse_fd(param);
746
    }
747 748

    return fd;
749 750
}

751 752
static int net_init_nic(const NetClientOptions *opts, const char *name,
                        VLANState *vlan)
753 754 755
{
    int idx;
    NICInfo *nd;
756 757 758 759
    const NetLegacyNicOptions *nic;

    assert(opts->kind == NET_CLIENT_OPTIONS_KIND_NIC);
    nic = opts->nic;
760 761 762

    idx = nic_get_free_idx();
    if (idx == -1 || nb_nics >= MAX_NICS) {
763
        error_report("Too Many NICs");
764 765 766 767 768 769 770
        return -1;
    }

    nd = &nd_table[idx];

    memset(nd, 0, sizeof(*nd));

771 772
    if (nic->has_netdev) {
        nd->netdev = qemu_find_netdev(nic->netdev);
M
Mark McLoughlin 已提交
773
        if (!nd->netdev) {
774
            error_report("netdev '%s' not found", nic->netdev);
M
Mark McLoughlin 已提交
775 776 777 778 779 780
            return -1;
        }
    } else {
        assert(vlan);
        nd->vlan = vlan;
    }
781
    if (name) {
782
        nd->name = g_strdup(name);
783
    }
784 785
    if (nic->has_model) {
        nd->model = g_strdup(nic->model);
786
    }
787 788
    if (nic->has_addr) {
        nd->devaddr = g_strdup(nic->addr);
789 790
    }

791 792
    if (nic->has_macaddr &&
        net_parse_macaddr(nd->macaddr.a, nic->macaddr) < 0) {
793
        error_report("invalid syntax for ethernet address");
794 795
        return -1;
    }
796
    qemu_macaddr_default_if_unset(&nd->macaddr);
797

798 799 800 801 802 803 804 805
    if (nic->has_vectors) {
        if (nic->vectors > 0x7ffffff) {
            error_report("invalid # of vectors: %"PRIu32, nic->vectors);
            return -1;
        }
        nd->nvectors = nic->vectors;
    } else {
        nd->nvectors = DEV_NVECTORS_UNSPECIFIED;
806 807 808 809 810 811 812 813
    }

    nd->used = 1;
    nb_nics++;

    return idx;
}

814 815

static int (* const net_client_init_fun[NET_CLIENT_OPTIONS_KIND_MAX])(
816
    const NetClientOptions *opts,
817 818 819
    const char *name,
    VLANState *vlan) = {
        [NET_CLIENT_OPTIONS_KIND_NIC]    = net_init_nic,
M
Mark McLoughlin 已提交
820
#ifdef CONFIG_SLIRP
821
        [NET_CLIENT_OPTIONS_KIND_USER]   = net_init_slirp,
822
#endif
823 824
        [NET_CLIENT_OPTIONS_KIND_TAP]    = net_init_tap,
        [NET_CLIENT_OPTIONS_KIND_SOCKET] = net_init_socket,
M
Mark McLoughlin 已提交
825
#ifdef CONFIG_VDE
826
        [NET_CLIENT_OPTIONS_KIND_VDE]    = net_init_vde,
M
Mark McLoughlin 已提交
827
#endif
828
        [NET_CLIENT_OPTIONS_KIND_DUMP]   = net_init_dump,
829
#ifdef CONFIG_NET_BRIDGE
830 831
        [NET_CLIENT_OPTIONS_KIND_BRIDGE] = net_init_bridge,
#endif
832 833
};

834

835
static int net_client_init1(const void *object, int is_netdev, Error **errp)
836
{
837 838 839 840 841
    union {
        const Netdev    *netdev;
        const NetLegacy *net;
    } u;
    const NetClientOptions *opts;
842
    const char *name;
843

844
    if (is_netdev) {
845 846 847 848 849
        u.netdev = object;
        opts = u.netdev->opts;
        name = u.netdev->id;

        switch (opts->kind) {
M
Mark McLoughlin 已提交
850
#ifdef CONFIG_SLIRP
851
        case NET_CLIENT_OPTIONS_KIND_USER:
M
Mark McLoughlin 已提交
852
#endif
853 854
        case NET_CLIENT_OPTIONS_KIND_TAP:
        case NET_CLIENT_OPTIONS_KIND_SOCKET:
M
Mark McLoughlin 已提交
855
#ifdef CONFIG_VDE
856 857 858 859
        case NET_CLIENT_OPTIONS_KIND_VDE:
#endif
#ifdef CONFIG_NET_BRIDGE
        case NET_CLIENT_OPTIONS_KIND_BRIDGE:
M
Mark McLoughlin 已提交
860
#endif
861 862 863
            break;

        default:
864 865
            error_set(errp, QERR_INVALID_PARAMETER_VALUE, "type",
                      "a netdev backend type");
M
Mark McLoughlin 已提交
866 867
            return -1;
        }
868 869 870 871 872 873
    } else {
        u.net = object;
        opts = u.net->opts;
        /* missing optional values have been initialized to "all bits zero" */
        name = u.net->has_id ? u.net->id : u.net->name;
    }
M
Mark McLoughlin 已提交
874

875 876 877 878 879 880 881 882 883
    if (net_client_init_fun[opts->kind]) {
        VLANState *vlan = NULL;

        /* Do not add to a vlan if it's a -netdev or a nic with a netdev=
         * parameter. */
        if (!is_netdev &&
            (opts->kind != NET_CLIENT_OPTIONS_KIND_NIC ||
             !opts->nic->has_netdev)) {
            vlan = qemu_find_vlan(u.net->has_vlan ? u.net->vlan : 0, true);
M
Mark McLoughlin 已提交
884
        }
885

886
        if (net_client_init_fun[opts->kind](opts, name, vlan) < 0) {
887 888 889
            /* TODO push error reporting into init() methods */
            error_set(errp, QERR_DEVICE_INIT_FAILED,
                      NetClientOptionsKind_lookup[opts->kind]);
M
Mark McLoughlin 已提交
890 891 892
            return -1;
        }
    }
893 894 895
    return 0;
}

M
Mark McLoughlin 已提交
896

897 898 899 900 901 902
static void net_visit(Visitor *v, int is_netdev, void **object, Error **errp)
{
    if (is_netdev) {
        visit_type_Netdev(v, (Netdev **)object, NULL, errp);
    } else {
        visit_type_NetLegacy(v, (NetLegacy **)object, NULL, errp);
903
    }
904
}
905

M
Mark McLoughlin 已提交
906

907 908 909 910 911
int net_client_init(QemuOpts *opts, int is_netdev, Error **errp)
{
    void *object = NULL;
    Error *err = NULL;
    int ret = -1;
912

913 914
    {
        OptsVisitor *ov = opts_visitor_new(opts);
M
Mark McLoughlin 已提交
915

916 917
        net_visit(opts_get_visitor(ov), is_netdev, &object, &err);
        opts_visitor_cleanup(ov);
918 919
    }

920
    if (!err) {
921
        ret = net_client_init1(object, is_netdev, &err);
922 923 924 925 926 927 928 929 930 931 932
    }

    if (object) {
        QapiDeallocVisitor *dv = qapi_dealloc_visitor_new();

        net_visit(qapi_dealloc_get_visitor(dv), is_netdev, &object, NULL);
        qapi_dealloc_visitor_cleanup(dv);
    }

    error_propagate(errp, err);
    return ret;
933 934
}

935

936 937 938
static int net_host_check_device(const char *device)
{
    int i;
939
    const char *valid_param_list[] = { "tap", "socket", "dump"
940 941 942
#ifdef CONFIG_NET_BRIDGE
                                       , "bridge"
#endif
943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958
#ifdef CONFIG_SLIRP
                                       ,"user"
#endif
#ifdef CONFIG_VDE
                                       ,"vde"
#endif
    };
    for (i = 0; i < sizeof(valid_param_list) / sizeof(char *); i++) {
        if (!strncmp(valid_param_list[i], device,
                     strlen(valid_param_list[i])))
            return 1;
    }

    return 0;
}

959
void net_host_device_add(Monitor *mon, const QDict *qdict)
960
{
961
    const char *device = qdict_get_str(qdict, "device");
962
    const char *opts_str = qdict_get_try_str(qdict, "opts");
963
    Error *local_err = NULL;
964
    QemuOpts *opts;
965

966
    if (!net_host_check_device(device)) {
A
aliguori 已提交
967
        monitor_printf(mon, "invalid host network device %s\n", device);
968 969
        return;
    }
970

971
    opts = qemu_opts_parse(qemu_find_opts("net"), opts_str ? opts_str : "", 0);
972 973 974 975 976 977
    if (!opts) {
        return;
    }

    qemu_opt_set(opts, "type", device);

978 979 980 981
    net_client_init(opts, 0, &local_err);
    if (error_is_set(&local_err)) {
        qerror_report_err(local_err);
        error_free(local_err);
982 983
        monitor_printf(mon, "adding host network device %s failed\n", device);
    }
984 985
}

986
void net_host_device_remove(Monitor *mon, const QDict *qdict)
987 988
{
    VLANClientState *vc;
989 990
    int vlan_id = qdict_get_int(qdict, "vlan_id");
    const char *device = qdict_get_str(qdict, "device");
991

992
    vc = qemu_find_vlan_client_by_name(mon, vlan_id, device);
993 994 995
    if (!vc) {
        return;
    }
996 997 998 999
    if (!net_host_check_device(vc->model)) {
        monitor_printf(mon, "invalid host network device %s\n", device);
        return;
    }
1000 1001 1002
    qemu_del_vlan_client(vc);
}

L
Luiz Capitulino 已提交
1003 1004 1005 1006 1007 1008
void netdev_add(QemuOpts *opts, Error **errp)
{
    net_client_init(opts, 1, errp);
}

int qmp_netdev_add(Monitor *mon, const QDict *qdict, QObject **ret)
1009
{
1010
    Error *local_err = NULL;
L
Luiz Capitulino 已提交
1011
    QemuOptsList *opts_list;
1012 1013
    QemuOpts *opts;

L
Luiz Capitulino 已提交
1014 1015 1016
    opts_list = qemu_find_opts_err("netdev", &local_err);
    if (error_is_set(&local_err)) {
        goto exit_err;
1017 1018
    }

L
Luiz Capitulino 已提交
1019 1020 1021 1022 1023 1024 1025
    opts = qemu_opts_from_qdict(opts_list, qdict, &local_err);
    if (error_is_set(&local_err)) {
        goto exit_err;
    }

    netdev_add(opts, &local_err);
    if (error_is_set(&local_err)) {
1026
        qemu_opts_del(opts);
L
Luiz Capitulino 已提交
1027
        goto exit_err;
1028 1029
    }

L
Luiz Capitulino 已提交
1030 1031 1032 1033 1034 1035
    return 0;

exit_err:
    qerror_report_err(local_err);
    error_free(local_err);
    return -1;
1036 1037
}

L
Luiz Capitulino 已提交
1038
void qmp_netdev_del(const char *id, Error **errp)
1039 1040 1041 1042
{
    VLANClientState *vc;

    vc = qemu_find_netdev(id);
1043
    if (!vc) {
L
Luiz Capitulino 已提交
1044 1045
        error_set(errp, QERR_DEVICE_NOT_FOUND, id);
        return;
1046
    }
L
Luiz Capitulino 已提交
1047

1048
    qemu_del_vlan_client(vc);
L
Luiz Capitulino 已提交
1049
    qemu_opts_del(qemu_opts_find(qemu_find_opts_err("netdev", errp), id));
1050 1051
}

1052 1053 1054
static void print_net_client(Monitor *mon, VLANClientState *vc)
{
    monitor_printf(mon, "%s: type=%s,%s\n", vc->name,
1055
                   NetClientOptionsKind_lookup[vc->info->type], vc->info_str);
1056 1057
}

A
aliguori 已提交
1058
void do_info_network(Monitor *mon)
1059 1060
{
    VLANState *vlan;
1061
    VLANClientState *vc, *peer;
1062
    NetClientOptionsKind type;
1063

1064
    QTAILQ_FOREACH(vlan, &vlans, next) {
A
aliguori 已提交
1065
        monitor_printf(mon, "VLAN %d devices:\n", vlan->id);
1066 1067

        QTAILQ_FOREACH(vc, &vlan->clients, next) {
1068 1069
            monitor_printf(mon, "  ");
            print_net_client(mon, vc);
1070
        }
1071
    }
1072 1073
    monitor_printf(mon, "Devices not on any VLAN:\n");
    QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
1074 1075
        peer = vc->peer;
        type = vc->info->type;
1076
        if (!peer || type == NET_CLIENT_OPTIONS_KIND_NIC) {
1077 1078
            monitor_printf(mon, "  ");
            print_net_client(mon, vc);
1079
        } /* else it's a netdev connected to a NIC, printed with the NIC */
1080
        if (peer && type == NET_CLIENT_OPTIONS_KIND_NIC) {
1081 1082
            monitor_printf(mon, "   \\ ");
            print_net_client(mon, peer);
1083 1084
        }
    }
1085 1086
}

L
Luiz Capitulino 已提交
1087
void qmp_set_link(const char *name, bool up, Error **errp)
1088 1089 1090 1091
{
    VLANState *vlan;
    VLANClientState *vc = NULL;

1092 1093 1094
    QTAILQ_FOREACH(vlan, &vlans, next) {
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
            if (strcmp(vc->name, name) == 0) {
1095
                goto done;
1096 1097 1098
            }
        }
    }
1099 1100 1101 1102 1103
    QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
        if (!strcmp(vc->name, name)) {
            goto done;
        }
    }
1104
done:
1105 1106

    if (!vc) {
L
Luiz Capitulino 已提交
1107 1108
        error_set(errp, QERR_DEVICE_NOT_FOUND, name);
        return;
1109 1110
    }

1111
    vc->link_down = !up;
1112

1113 1114 1115
    if (vc->info->link_status_changed) {
        vc->info->link_status_changed(vc);
    }
1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126

    /* Notify peer. Don't update peer link status: this makes it possible to
     * disconnect from host network without notifying the guest.
     * FIXME: is disconnected link status change operation useful?
     *
     * Current behaviour is compatible with qemu vlans where there could be
     * multiple clients that can still communicate with each other in
     * disconnected mode. For now maintain this compatibility. */
    if (vc->peer && vc->peer->info->link_status_changed) {
        vc->peer->info->link_status_changed(vc->peer);
    }
1127 1128
}

1129 1130 1131
void net_cleanup(void)
{
    VLANState *vlan;
1132
    VLANClientState *vc, *next_vc;
1133

1134 1135
    QTAILQ_FOREACH(vlan, &vlans, next) {
        QTAILQ_FOREACH_SAFE(vc, &vlan->clients, next, next_vc) {
1136
            qemu_del_vlan_client(vc);
1137 1138
        }
    }
1139 1140 1141 1142

    QTAILQ_FOREACH_SAFE(vc, &non_vlan_clients, next, next_vc) {
        qemu_del_vlan_client(vc);
    }
1143 1144
}

1145
void net_check_clients(void)
1146 1147
{
    VLANState *vlan;
1148
    VLANClientState *vc;
1149
    int i;
1150

1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162
    /* Don't warn about the default network setup that you get if
     * no command line -net or -netdev options are specified. There
     * are two cases that we would otherwise complain about:
     * (1) board doesn't support a NIC but the implicit "-net nic"
     * requested one
     * (2) CONFIG_SLIRP not set, in which case the implicit "-net nic"
     * sets up a nic that isn't connected to anything.
     */
    if (default_net) {
        return;
    }

1163
    QTAILQ_FOREACH(vlan, &vlans, next) {
1164 1165
        int has_nic = 0, has_host_dev = 0;

1166 1167
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
            switch (vc->info->type) {
1168
            case NET_CLIENT_OPTIONS_KIND_NIC:
1169 1170
                has_nic = 1;
                break;
1171 1172 1173 1174
            case NET_CLIENT_OPTIONS_KIND_USER:
            case NET_CLIENT_OPTIONS_KIND_TAP:
            case NET_CLIENT_OPTIONS_KIND_SOCKET:
            case NET_CLIENT_OPTIONS_KIND_VDE:
1175 1176 1177 1178 1179 1180
                has_host_dev = 1;
                break;
            default: ;
            }
        }
        if (has_host_dev && !has_nic)
1181
            fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
1182
        if (has_nic && !has_host_dev)
1183 1184 1185 1186
            fprintf(stderr,
                    "Warning: vlan %d is not connected to host network\n",
                    vlan->id);
    }
1187 1188 1189
    QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
        if (!vc->peer) {
            fprintf(stderr, "Warning: %s %s has no peer\n",
1190
                    vc->info->type == NET_CLIENT_OPTIONS_KIND_NIC ? "nic" : "netdev",
1191 1192 1193
                    vc->name);
        }
    }
1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207

    /* Check that all NICs requested via -net nic actually got created.
     * NICs created via -device don't need to be checked here because
     * they are always instantiated.
     */
    for (i = 0; i < MAX_NICS; i++) {
        NICInfo *nd = &nd_table[i];
        if (nd->used && !nd->instantiated) {
            fprintf(stderr, "Warning: requested NIC (%s, model %s) "
                    "was not created (not supported by this machine?)\n",
                    nd->name ? nd->name : "anonymous",
                    nd->model ? nd->model : "unspecified");
        }
    }
1208
}
1209 1210 1211

static int net_init_client(QemuOpts *opts, void *dummy)
{
1212 1213 1214 1215 1216 1217
    Error *local_err = NULL;

    net_client_init(opts, 0, &local_err);
    if (error_is_set(&local_err)) {
        qerror_report_err(local_err);
        error_free(local_err);
1218
        return -1;
1219 1220
    }

1221
    return 0;
M
Mark McLoughlin 已提交
1222 1223 1224 1225
}

static int net_init_netdev(QemuOpts *opts, void *dummy)
{
1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236
    Error *local_err = NULL;
    int ret;

    ret = net_client_init(opts, 1, &local_err);
    if (error_is_set(&local_err)) {
        qerror_report_err(local_err);
        error_free(local_err);
        return -1;
    }

    return ret;
1237 1238 1239 1240
}

int net_init_clients(void)
{
1241 1242
    QemuOptsList *net = qemu_find_opts("net");

G
Gerd Hoffmann 已提交
1243
    if (default_net) {
1244
        /* if no clients, we use a default config */
1245
        qemu_opts_set(net, NULL, "type", "nic");
1246
#ifdef CONFIG_SLIRP
1247
        qemu_opts_set(net, NULL, "type", "user");
1248 1249 1250
#endif
    }

1251
    QTAILQ_INIT(&vlans);
1252
    QTAILQ_INIT(&non_vlan_clients);
1253

1254
    if (qemu_opts_foreach(qemu_find_opts("netdev"), net_init_netdev, NULL, 1) == -1)
M
Mark McLoughlin 已提交
1255 1256
        return -1;

1257
    if (qemu_opts_foreach(net, net_init_client, NULL, 1) == -1) {
1258 1259 1260 1261 1262 1263
        return -1;
    }

    return 0;
}

1264
int net_client_parse(QemuOptsList *opts_list, const char *optarg)
1265
{
1266
#if defined(CONFIG_SLIRP)
1267 1268
    int ret;
    if (net_slirp_parse_legacy(opts_list, optarg, &ret)) {
1269 1270
        return ret;
    }
1271
#endif
1272

1273
    if (!qemu_opts_parse(opts_list, optarg, 1)) {
1274 1275 1276
        return -1;
    }

G
Gerd Hoffmann 已提交
1277
    default_net = 0;
1278 1279
    return 0;
}
1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302

/* From FreeBSD */
/* XXX: optimize */
unsigned compute_mcast_idx(const uint8_t *ep)
{
    uint32_t crc;
    int carry, i, j;
    uint8_t b;

    crc = 0xffffffff;
    for (i = 0; i < 6; i++) {
        b = *ep++;
        for (j = 0; j < 8; j++) {
            carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01);
            crc <<= 1;
            b >>= 1;
            if (carry) {
                crc = ((crc ^ POLYNOMIAL) | carry);
            }
        }
    }
    return crc >> 26;
}