Statistics
| Branch: | Revision:

root / net.c @ 1a0c0958

History | View | Annotate | Download (32.8 kB)

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

    
26
#include "config-host.h"
27

    
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"
35
#include "qemu-common.h"
36
#include "qemu_socket.h"
37
#include "qmp-commands.h"
38
#include "hw/qdev.h"
39
#include "iov.h"
40
#include "qapi-visit.h"
41
#include "qapi/opts-visitor.h"
42
#include "qapi/qapi-dealloc-visitor.h"
43

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

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

    
52
int default_net = 1;
53

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

    
57
#if defined(DEBUG_NET)
58
static void hex_dump(FILE *f, const uint8_t *buf, int size)
59
{
60
    int len, i, j, c;
61

    
62
    for(i=0;i<size;i+=16) {
63
        len = size - i;
64
        if (len > 16)
65
            len = 16;
66
        fprintf(f, "%08x ", i);
67
        for(j=0;j<16;j++) {
68
            if (j < len)
69
                fprintf(f, " %02x", buf[i+j]);
70
            else
71
                fprintf(f, "   ");
72
        }
73
        fprintf(f, " ");
74
        for(j=0;j<len;j++) {
75
            c = buf[i+j];
76
            if (c < ' ' || c > '~')
77
                c = '.';
78
            fprintf(f, "%c", c);
79
        }
80
        fprintf(f, "\n");
81
    }
82
}
83
#endif
84

    
85
static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
86
{
87
    const char *p, *p1;
88
    int len;
89
    p = *pp;
90
    p1 = strchr(p, sep);
91
    if (!p1)
92
        return -1;
93
    len = p1 - p;
94
    p1++;
95
    if (buf_size > 0) {
96
        if (len > buf_size - 1)
97
            len = buf_size - 1;
98
        memcpy(buf, p, len);
99
        buf[len] = '\0';
100
    }
101
    *pp = p1;
102
    return 0;
103
}
104

    
105
int parse_host_port(struct sockaddr_in *saddr, const char *str)
106
{
107
    char buf[512];
108
    struct hostent *he;
109
    const char *p, *r;
110
    int port;
111

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

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

    
144
void qemu_macaddr_default_if_unset(MACAddr *macaddr)
145
{
146
    static int index = 0;
147
    static const MACAddr zero = { .a = { 0,0,0,0,0,0 } };
148

    
149
    if (memcmp(macaddr, &zero, sizeof(zero)) != 0)
150
        return;
151
    macaddr->a[0] = 0x52;
152
    macaddr->a[1] = 0x54;
153
    macaddr->a[2] = 0x00;
154
    macaddr->a[3] = 0x12;
155
    macaddr->a[4] = 0x34;
156
    macaddr->a[5] = 0x56 + index++;
157
}
158

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

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

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

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

    
182
    return g_strdup(buf);
183
}
184

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

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

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

    
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
        vc->vlan = vlan;
219
        QTAILQ_INSERT_TAIL(&vc->vlan->clients, vc, next);
220
    } else {
221
        if (peer) {
222
            assert(!peer->peer);
223
            vc->peer = peer;
224
            peer->peer = vc;
225
        }
226
        QTAILQ_INSERT_TAIL(&non_vlan_clients, vc, next);
227

    
228
        vc->send_queue = qemu_new_net_queue(qemu_deliver_packet,
229
                                            qemu_deliver_packet_iov,
230
                                            vc);
231
    }
232

    
233
    return vc;
234
}
235

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

    
245
    assert(info->type == NET_CLIENT_OPTIONS_KIND_NIC);
246
    assert(info->size >= sizeof(NICState));
247

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

    
250
    nic = DO_UPCAST(NICState, nc, nc);
251
    nic->conf = conf;
252
    nic->opaque = opaque;
253

    
254
    return nic;
255
}
256

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

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

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

    
285
void qemu_del_vlan_client(VLANClientState *vc)
286
{
287
    /* 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
        NICState *nic = DO_UPCAST(NICState, nc, vc->peer);
290
        if (nic->peer_deleted) {
291
            return;
292
        }
293
        nic->peer_deleted = true;
294
        /* Let NIC know peer is gone. */
295
        vc->peer->link_down = true;
296
        if (vc->peer->info->link_status_changed) {
297
            vc->peer->info->link_status_changed(vc->peer);
298
        }
299
        qemu_cleanup_vlan_client(vc);
300
        return;
301
    }
302

    
303
    /* 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
        NICState *nic = DO_UPCAST(NICState, nc, vc);
306
        if (nic->peer_deleted) {
307
            qemu_free_vlan_client(vc->peer);
308
        }
309
    }
310

    
311
    qemu_cleanup_vlan_client(vc);
312
    qemu_free_vlan_client(vc);
313
}
314

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

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

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

    
338
    return vc;
339
}
340

    
341
void qemu_foreach_nic(qemu_nic_foreach func, void *opaque)
342
{
343
    VLANClientState *nc;
344
    VLANState *vlan;
345

    
346
    QTAILQ_FOREACH(nc, &non_vlan_clients, next) {
347
        if (nc->info->type == NET_CLIENT_OPTIONS_KIND_NIC) {
348
            func(DO_UPCAST(NICState, nc, nc), opaque);
349
        }
350
    }
351

    
352
    QTAILQ_FOREACH(vlan, &vlans, next) {
353
        QTAILQ_FOREACH(nc, &vlan->clients, next) {
354
            if (nc->info->type == NET_CLIENT_OPTIONS_KIND_NIC) {
355
                func(DO_UPCAST(NICState, nc, nc), opaque);
356
            }
357
        }
358
    }
359
}
360

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

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

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

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

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

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

    
403
    if (vc->link_down) {
404
        return size;
405
    }
406

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

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

    
417
    if (ret == 0) {
418
        vc->receive_disabled = 1;
419
    };
420

    
421
    return ret;
422
}
423

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

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

    
437
        if (vc == sender) {
438
            continue;
439
        }
440

    
441
        if (vc->link_down) {
442
            ret = size;
443
            continue;
444
        }
445

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

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

    
457
        if (len == 0) {
458
            vc->receive_disabled = 1;
459
        }
460

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

    
463
    }
464

    
465
    return ret;
466
}
467

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

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

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

    
482
    qemu_net_queue_purge(queue, vc);
483
}
484

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

    
489
    vc->receive_disabled = 0;
490

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

    
497
    qemu_net_queue_flush(queue);
498
}
499

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

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

    
512
    if (sender->link_down || (!sender->peer && !sender->vlan)) {
513
        return size;
514
    }
515

    
516
    if (sender->peer) {
517
        queue = sender->peer->send_queue;
518
    } else {
519
        queue = sender->vlan->send_queue;
520
    }
521

    
522
    return qemu_net_queue_send(queue, sender, flags, buf, size, sent_cb);
523
}
524

    
525
ssize_t qemu_send_packet_async(VLANClientState *sender,
526
                               const uint8_t *buf, int size,
527
                               NetPacketSent *sent_cb)
528
{
529
    return qemu_send_packet_async_with_flags(sender, QEMU_NET_PACKET_FLAG_NONE,
530
                                             buf, size, sent_cb);
531
}
532

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

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

    
544
static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov,
545
                               int iovcnt)
546
{
547
    uint8_t buffer[4096];
548
    size_t offset;
549

    
550
    offset = iov_to_buf(iov, iovcnt, 0, buffer, sizeof(buffer));
551

    
552
    return vc->info->receive(vc, buffer, offset);
553
}
554

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

    
563
    if (vc->link_down) {
564
        return iov_size(iov, iovcnt);
565
    }
566

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

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

    
584
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
585
        ssize_t len;
586

    
587
        if (vc == sender) {
588
            continue;
589
        }
590

    
591
        if (vc->link_down) {
592
            ret = iov_size(iov, iovcnt);
593
            continue;
594
        }
595

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

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

    
604
        ret = (ret >= 0) ? ret : len;
605
    }
606

    
607
    return ret;
608
}
609

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

    
616
    if (sender->link_down || (!sender->peer && !sender->vlan)) {
617
        return iov_size(iov, iovcnt);
618
    }
619

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

    
626
    return qemu_net_queue_send_iov(queue, sender,
627
                                   QEMU_NET_PACKET_FLAG_NONE,
628
                                   iov, iovcnt, sent_cb);
629
}
630

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

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

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

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

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

    
656
    vlan->send_queue = qemu_new_net_queue(qemu_vlan_deliver_packet,
657
                                          qemu_vlan_deliver_packet_iov,
658
                                          vlan);
659

    
660
    QTAILQ_INSERT_TAIL(&vlans, vlan, next);
661

    
662
    return vlan;
663
}
664

    
665
VLANClientState *qemu_find_netdev(const char *id)
666
{
667
    VLANClientState *vc;
668

    
669
    QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
670
        if (vc->info->type == NET_CLIENT_OPTIONS_KIND_NIC)
671
            continue;
672
        if (!strcmp(vc->name, id)) {
673
            return vc;
674
        }
675
    }
676

    
677
    return NULL;
678
}
679

    
680
static int nic_get_free_idx(void)
681
{
682
    int index;
683

    
684
    for (index = 0; index < MAX_NICS; index++)
685
        if (!nd_table[index].used)
686
            return index;
687
    return -1;
688
}
689

    
690
int qemu_show_nic_models(const char *arg, const char *const *models)
691
{
692
    int i;
693

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

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

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

    
707
    models[0] = model;
708
    models[1] = NULL;
709

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

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

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

    
724
    for (i = 0 ; models[i]; i++) {
725
        if (strcmp(nd->model, models[i]) == 0)
726
            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
    int fd;
736

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

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

    
748
    return fd;
749
}
750

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

    
758
    assert(opts->kind == NET_CLIENT_OPTIONS_KIND_NIC);
759
    nic = opts->nic;
760

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

    
767
    nd = &nd_table[idx];
768

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

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

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

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

    
808
    nd->used = 1;
809
    nb_nics++;
810

    
811
    return idx;
812
}
813

    
814

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

    
834

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

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

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

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

    
875
    if (net_client_init_fun[opts->kind]) {
876
        VLANState *vlan = NULL;
877

    
878
        /* Do not add to a vlan if it's a -netdev or a nic with a netdev=
879
         * parameter. */
880
        if (!is_netdev &&
881
            (opts->kind != NET_CLIENT_OPTIONS_KIND_NIC ||
882
             !opts->nic->has_netdev)) {
883
            vlan = qemu_find_vlan(u.net->has_vlan ? u.net->vlan : 0, true);
884
        }
885

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

    
896

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

    
906

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

    
913
    {
914
        OptsVisitor *ov = opts_visitor_new(opts);
915

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

    
920
    if (!err) {
921
        ret = net_client_init1(object, is_netdev, &err);
922
    }
923

    
924
    if (object) {
925
        QapiDeallocVisitor *dv = qapi_dealloc_visitor_new();
926

    
927
        net_visit(qapi_dealloc_get_visitor(dv), is_netdev, &object, NULL);
928
        qapi_dealloc_visitor_cleanup(dv);
929
    }
930

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

    
935

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

    
956
    return 0;
957
}
958

    
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)) {
967
        monitor_printf(mon, "invalid host network device %s\n", device);
968
        return;
969
    }
970

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

    
976
    qemu_opt_set(opts, "type", device);
977

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

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

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

    
1003
void netdev_add(QemuOpts *opts, Error **errp)
1004
{
1005
    net_client_init(opts, 1, errp);
1006
}
1007

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

    
1014
    opts_list = qemu_find_opts_err("netdev", &local_err);
1015
    if (error_is_set(&local_err)) {
1016
        goto exit_err;
1017
    }
1018

    
1019
    opts = qemu_opts_from_qdict(opts_list, qdict, &local_err);
1020
    if (error_is_set(&local_err)) {
1021
        goto exit_err;
1022
    }
1023

    
1024
    netdev_add(opts, &local_err);
1025
    if (error_is_set(&local_err)) {
1026
        qemu_opts_del(opts);
1027
        goto exit_err;
1028
    }
1029

    
1030
    return 0;
1031

    
1032
exit_err:
1033
    qerror_report_err(local_err);
1034
    error_free(local_err);
1035
    return -1;
1036
}
1037

    
1038
void qmp_netdev_del(const char *id, Error **errp)
1039
{
1040
    VLANClientState *vc;
1041

    
1042
    vc = qemu_find_netdev(id);
1043
    if (!vc) {
1044
        error_set(errp, QERR_DEVICE_NOT_FOUND, id);
1045
        return;
1046
    }
1047

    
1048
    qemu_del_vlan_client(vc);
1049
    qemu_opts_del(qemu_opts_find(qemu_find_opts_err("netdev", errp), id));
1050
}
1051

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

    
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) {
1065
        monitor_printf(mon, "VLAN %d devices:\n", vlan->id);
1066

    
1067
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
1068
            monitor_printf(mon, "  ");
1069
            print_net_client(mon, vc);
1070
        }
1071
    }
1072
    monitor_printf(mon, "Devices not on any VLAN:\n");
1073
    QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
1074
        peer = vc->peer;
1075
        type = vc->info->type;
1076
        if (!peer || type == NET_CLIENT_OPTIONS_KIND_NIC) {
1077
            monitor_printf(mon, "  ");
1078
            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
            monitor_printf(mon, "   \\ ");
1082
            print_net_client(mon, peer);
1083
        }
1084
    }
1085
}
1086

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

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

    
1106
    if (!vc) {
1107
        error_set(errp, QERR_DEVICE_NOT_FOUND, name);
1108
        return;
1109
    }
1110

    
1111
    vc->link_down = !up;
1112

    
1113
    if (vc->info->link_status_changed) {
1114
        vc->info->link_status_changed(vc);
1115
    }
1116

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

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

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

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

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

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

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

    
1166
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
1167
            switch (vc->info->type) {
1168
            case NET_CLIENT_OPTIONS_KIND_NIC:
1169
                has_nic = 1;
1170
                break;
1171
            case NET_CLIENT_OPTIONS_KIND_USER:
1172
            case NET_CLIENT_OPTIONS_KIND_TAP:
1173
            case NET_CLIENT_OPTIONS_KIND_SOCKET:
1174
            case NET_CLIENT_OPTIONS_KIND_VDE:
1175
                has_host_dev = 1;
1176
                break;
1177
            default: ;
1178
            }
1179
        }
1180
        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
            fprintf(stderr,
1184
                    "Warning: vlan %d is not connected to host network\n",
1185
                    vlan->id);
1186
    }
1187
    QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
1188
        if (!vc->peer) {
1189
            fprintf(stderr, "Warning: %s %s has no peer\n",
1190
                    vc->info->type == NET_CLIENT_OPTIONS_KIND_NIC ? "nic" : "netdev",
1191
                    vc->name);
1192
        }
1193
    }
1194

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

    
1210
static int net_init_client(QemuOpts *opts, void *dummy)
1211
{
1212
    Error *local_err = NULL;
1213

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

    
1221
    return 0;
1222
}
1223

    
1224
static int net_init_netdev(QemuOpts *opts, void *dummy)
1225
{
1226
    Error *local_err = NULL;
1227
    int ret;
1228

    
1229
    ret = net_client_init(opts, 1, &local_err);
1230
    if (error_is_set(&local_err)) {
1231
        qerror_report_err(local_err);
1232
        error_free(local_err);
1233
        return -1;
1234
    }
1235

    
1236
    return ret;
1237
}
1238

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

    
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
#endif
1249
    }
1250

    
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)
1255
        return -1;
1256

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

    
1261
    return 0;
1262
}
1263

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

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

    
1277
    default_net = 0;
1278
    return 0;
1279
}
1280

    
1281
/* From FreeBSD */
1282
/* XXX: optimize */
1283
unsigned compute_mcast_idx(const uint8_t *ep)
1284
{
1285
    uint32_t crc;
1286
    int carry, i, j;
1287
    uint8_t b;
1288

    
1289
    crc = 0xffffffff;
1290
    for (i = 0; i < 6; i++) {
1291
        b = *ep++;
1292
        for (j = 0; j < 8; j++) {
1293
            carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01);
1294
            crc <<= 1;
1295
            b >>= 1;
1296
            if (carry) {
1297
                crc = ((crc ^ POLYNOMIAL) | carry);
1298
            }
1299
        }
1300
    }
1301
    return crc >> 26;
1302
}