convert net_init_nic() to NetClientOptions
[sdk/emulator/qemu.git] / net.c
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(QemuOpts *old_opts, const NetClientOptions *opts,
752                         const char *name, 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     QemuOpts *old_opts,
817     const NetClientOptions *new_opts,
818     const char *name,
819     VLANState *vlan) = {
820         [NET_CLIENT_OPTIONS_KIND_NIC]    = net_init_nic,
821 #ifdef CONFIG_SLIRP
822         [NET_CLIENT_OPTIONS_KIND_USER]   = net_init_slirp,
823 #endif
824         [NET_CLIENT_OPTIONS_KIND_TAP]    = net_init_tap,
825         [NET_CLIENT_OPTIONS_KIND_SOCKET] = net_init_socket,
826 #ifdef CONFIG_VDE
827         [NET_CLIENT_OPTIONS_KIND_VDE]    = net_init_vde,
828 #endif
829         [NET_CLIENT_OPTIONS_KIND_DUMP]   = net_init_dump,
830 #ifdef CONFIG_NET_BRIDGE
831         [NET_CLIENT_OPTIONS_KIND_BRIDGE] = net_init_bridge,
832 #endif
833 };
834
835
836 static int net_client_init1(const void *object, int is_netdev,
837                             QemuOpts *old_opts, Error **errp)
838 {
839     union {
840         const Netdev    *netdev;
841         const NetLegacy *net;
842     } u;
843     const NetClientOptions *opts;
844     const char *name;
845
846     if (is_netdev) {
847         u.netdev = object;
848         opts = u.netdev->opts;
849         name = u.netdev->id;
850
851         switch (opts->kind) {
852 #ifdef CONFIG_SLIRP
853         case NET_CLIENT_OPTIONS_KIND_USER:
854 #endif
855         case NET_CLIENT_OPTIONS_KIND_TAP:
856         case NET_CLIENT_OPTIONS_KIND_SOCKET:
857 #ifdef CONFIG_VDE
858         case NET_CLIENT_OPTIONS_KIND_VDE:
859 #endif
860 #ifdef CONFIG_NET_BRIDGE
861         case NET_CLIENT_OPTIONS_KIND_BRIDGE:
862 #endif
863             break;
864
865         default:
866             error_set(errp, QERR_INVALID_PARAMETER_VALUE, "type",
867                       "a netdev backend type");
868             return -1;
869         }
870     } else {
871         u.net = object;
872         opts = u.net->opts;
873         /* missing optional values have been initialized to "all bits zero" */
874         name = u.net->has_id ? u.net->id : u.net->name;
875     }
876
877     if (net_client_init_fun[opts->kind]) {
878         VLANState *vlan = NULL;
879
880         /* Do not add to a vlan if it's a -netdev or a nic with a netdev=
881          * parameter. */
882         if (!is_netdev &&
883             (opts->kind != NET_CLIENT_OPTIONS_KIND_NIC ||
884              !opts->nic->has_netdev)) {
885             vlan = qemu_find_vlan(u.net->has_vlan ? u.net->vlan : 0, true);
886         }
887
888         if (net_client_init_fun[opts->kind](old_opts, opts, name, vlan) < 0) {
889             /* TODO push error reporting into init() methods */
890             error_set(errp, QERR_DEVICE_INIT_FAILED,
891                       NetClientOptionsKind_lookup[opts->kind]);
892             return -1;
893         }
894     }
895     return 0;
896 }
897
898
899 static void net_visit(Visitor *v, int is_netdev, void **object, Error **errp)
900 {
901     if (is_netdev) {
902         visit_type_Netdev(v, (Netdev **)object, NULL, errp);
903     } else {
904         visit_type_NetLegacy(v, (NetLegacy **)object, NULL, errp);
905     }
906 }
907
908
909 int net_client_init(QemuOpts *opts, int is_netdev, Error **errp)
910 {
911     void *object = NULL;
912     Error *err = NULL;
913     int ret = -1;
914
915     {
916         OptsVisitor *ov = opts_visitor_new(opts);
917
918         net_visit(opts_get_visitor(ov), is_netdev, &object, &err);
919         opts_visitor_cleanup(ov);
920     }
921
922     if (!err) {
923         ret = net_client_init1(object, is_netdev, opts, &err);
924     }
925
926     if (object) {
927         QapiDeallocVisitor *dv = qapi_dealloc_visitor_new();
928
929         net_visit(qapi_dealloc_get_visitor(dv), is_netdev, &object, NULL);
930         qapi_dealloc_visitor_cleanup(dv);
931     }
932
933     error_propagate(errp, err);
934     return ret;
935 }
936
937
938 static int net_host_check_device(const char *device)
939 {
940     int i;
941     const char *valid_param_list[] = { "tap", "socket", "dump"
942 #ifdef CONFIG_NET_BRIDGE
943                                        , "bridge"
944 #endif
945 #ifdef CONFIG_SLIRP
946                                        ,"user"
947 #endif
948 #ifdef CONFIG_VDE
949                                        ,"vde"
950 #endif
951     };
952     for (i = 0; i < sizeof(valid_param_list) / sizeof(char *); i++) {
953         if (!strncmp(valid_param_list[i], device,
954                      strlen(valid_param_list[i])))
955             return 1;
956     }
957
958     return 0;
959 }
960
961 void net_host_device_add(Monitor *mon, const QDict *qdict)
962 {
963     const char *device = qdict_get_str(qdict, "device");
964     const char *opts_str = qdict_get_try_str(qdict, "opts");
965     Error *local_err = NULL;
966     QemuOpts *opts;
967
968     if (!net_host_check_device(device)) {
969         monitor_printf(mon, "invalid host network device %s\n", device);
970         return;
971     }
972
973     opts = qemu_opts_parse(qemu_find_opts("net"), opts_str ? opts_str : "", 0);
974     if (!opts) {
975         return;
976     }
977
978     qemu_opt_set(opts, "type", device);
979
980     net_client_init(opts, 0, &local_err);
981     if (error_is_set(&local_err)) {
982         qerror_report_err(local_err);
983         error_free(local_err);
984         monitor_printf(mon, "adding host network device %s failed\n", device);
985     }
986 }
987
988 void net_host_device_remove(Monitor *mon, const QDict *qdict)
989 {
990     VLANClientState *vc;
991     int vlan_id = qdict_get_int(qdict, "vlan_id");
992     const char *device = qdict_get_str(qdict, "device");
993
994     vc = qemu_find_vlan_client_by_name(mon, vlan_id, device);
995     if (!vc) {
996         return;
997     }
998     if (!net_host_check_device(vc->model)) {
999         monitor_printf(mon, "invalid host network device %s\n", device);
1000         return;
1001     }
1002     qemu_del_vlan_client(vc);
1003 }
1004
1005 void netdev_add(QemuOpts *opts, Error **errp)
1006 {
1007     net_client_init(opts, 1, errp);
1008 }
1009
1010 int qmp_netdev_add(Monitor *mon, const QDict *qdict, QObject **ret)
1011 {
1012     Error *local_err = NULL;
1013     QemuOptsList *opts_list;
1014     QemuOpts *opts;
1015
1016     opts_list = qemu_find_opts_err("netdev", &local_err);
1017     if (error_is_set(&local_err)) {
1018         goto exit_err;
1019     }
1020
1021     opts = qemu_opts_from_qdict(opts_list, qdict, &local_err);
1022     if (error_is_set(&local_err)) {
1023         goto exit_err;
1024     }
1025
1026     netdev_add(opts, &local_err);
1027     if (error_is_set(&local_err)) {
1028         qemu_opts_del(opts);
1029         goto exit_err;
1030     }
1031
1032     return 0;
1033
1034 exit_err:
1035     qerror_report_err(local_err);
1036     error_free(local_err);
1037     return -1;
1038 }
1039
1040 void qmp_netdev_del(const char *id, Error **errp)
1041 {
1042     VLANClientState *vc;
1043
1044     vc = qemu_find_netdev(id);
1045     if (!vc) {
1046         error_set(errp, QERR_DEVICE_NOT_FOUND, id);
1047         return;
1048     }
1049
1050     qemu_del_vlan_client(vc);
1051     qemu_opts_del(qemu_opts_find(qemu_find_opts_err("netdev", errp), id));
1052 }
1053
1054 static void print_net_client(Monitor *mon, VLANClientState *vc)
1055 {
1056     monitor_printf(mon, "%s: type=%s,%s\n", vc->name,
1057                    NetClientOptionsKind_lookup[vc->info->type], vc->info_str);
1058 }
1059
1060 void do_info_network(Monitor *mon)
1061 {
1062     VLANState *vlan;
1063     VLANClientState *vc, *peer;
1064     NetClientOptionsKind type;
1065
1066     QTAILQ_FOREACH(vlan, &vlans, next) {
1067         monitor_printf(mon, "VLAN %d devices:\n", vlan->id);
1068
1069         QTAILQ_FOREACH(vc, &vlan->clients, next) {
1070             monitor_printf(mon, "  ");
1071             print_net_client(mon, vc);
1072         }
1073     }
1074     monitor_printf(mon, "Devices not on any VLAN:\n");
1075     QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
1076         peer = vc->peer;
1077         type = vc->info->type;
1078         if (!peer || type == NET_CLIENT_OPTIONS_KIND_NIC) {
1079             monitor_printf(mon, "  ");
1080             print_net_client(mon, vc);
1081         } /* else it's a netdev connected to a NIC, printed with the NIC */
1082         if (peer && type == NET_CLIENT_OPTIONS_KIND_NIC) {
1083             monitor_printf(mon, "   \\ ");
1084             print_net_client(mon, peer);
1085         }
1086     }
1087 }
1088
1089 void qmp_set_link(const char *name, bool up, Error **errp)
1090 {
1091     VLANState *vlan;
1092     VLANClientState *vc = NULL;
1093
1094     QTAILQ_FOREACH(vlan, &vlans, next) {
1095         QTAILQ_FOREACH(vc, &vlan->clients, next) {
1096             if (strcmp(vc->name, name) == 0) {
1097                 goto done;
1098             }
1099         }
1100     }
1101     QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
1102         if (!strcmp(vc->name, name)) {
1103             goto done;
1104         }
1105     }
1106 done:
1107
1108     if (!vc) {
1109         error_set(errp, QERR_DEVICE_NOT_FOUND, name);
1110         return;
1111     }
1112
1113     vc->link_down = !up;
1114
1115     if (vc->info->link_status_changed) {
1116         vc->info->link_status_changed(vc);
1117     }
1118
1119     /* Notify peer. Don't update peer link status: this makes it possible to
1120      * disconnect from host network without notifying the guest.
1121      * FIXME: is disconnected link status change operation useful?
1122      *
1123      * Current behaviour is compatible with qemu vlans where there could be
1124      * multiple clients that can still communicate with each other in
1125      * disconnected mode. For now maintain this compatibility. */
1126     if (vc->peer && vc->peer->info->link_status_changed) {
1127         vc->peer->info->link_status_changed(vc->peer);
1128     }
1129 }
1130
1131 void net_cleanup(void)
1132 {
1133     VLANState *vlan;
1134     VLANClientState *vc, *next_vc;
1135
1136     QTAILQ_FOREACH(vlan, &vlans, next) {
1137         QTAILQ_FOREACH_SAFE(vc, &vlan->clients, next, next_vc) {
1138             qemu_del_vlan_client(vc);
1139         }
1140     }
1141
1142     QTAILQ_FOREACH_SAFE(vc, &non_vlan_clients, next, next_vc) {
1143         qemu_del_vlan_client(vc);
1144     }
1145 }
1146
1147 void net_check_clients(void)
1148 {
1149     VLANState *vlan;
1150     VLANClientState *vc;
1151     int i;
1152
1153     /* Don't warn about the default network setup that you get if
1154      * no command line -net or -netdev options are specified. There
1155      * are two cases that we would otherwise complain about:
1156      * (1) board doesn't support a NIC but the implicit "-net nic"
1157      * requested one
1158      * (2) CONFIG_SLIRP not set, in which case the implicit "-net nic"
1159      * sets up a nic that isn't connected to anything.
1160      */
1161     if (default_net) {
1162         return;
1163     }
1164
1165     QTAILQ_FOREACH(vlan, &vlans, next) {
1166         int has_nic = 0, has_host_dev = 0;
1167
1168         QTAILQ_FOREACH(vc, &vlan->clients, next) {
1169             switch (vc->info->type) {
1170             case NET_CLIENT_OPTIONS_KIND_NIC:
1171                 has_nic = 1;
1172                 break;
1173             case NET_CLIENT_OPTIONS_KIND_USER:
1174             case NET_CLIENT_OPTIONS_KIND_TAP:
1175             case NET_CLIENT_OPTIONS_KIND_SOCKET:
1176             case NET_CLIENT_OPTIONS_KIND_VDE:
1177                 has_host_dev = 1;
1178                 break;
1179             default: ;
1180             }
1181         }
1182         if (has_host_dev && !has_nic)
1183             fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
1184         if (has_nic && !has_host_dev)
1185             fprintf(stderr,
1186                     "Warning: vlan %d is not connected to host network\n",
1187                     vlan->id);
1188     }
1189     QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
1190         if (!vc->peer) {
1191             fprintf(stderr, "Warning: %s %s has no peer\n",
1192                     vc->info->type == NET_CLIENT_OPTIONS_KIND_NIC ? "nic" : "netdev",
1193                     vc->name);
1194         }
1195     }
1196
1197     /* Check that all NICs requested via -net nic actually got created.
1198      * NICs created via -device don't need to be checked here because
1199      * they are always instantiated.
1200      */
1201     for (i = 0; i < MAX_NICS; i++) {
1202         NICInfo *nd = &nd_table[i];
1203         if (nd->used && !nd->instantiated) {
1204             fprintf(stderr, "Warning: requested NIC (%s, model %s) "
1205                     "was not created (not supported by this machine?)\n",
1206                     nd->name ? nd->name : "anonymous",
1207                     nd->model ? nd->model : "unspecified");
1208         }
1209     }
1210 }
1211
1212 static int net_init_client(QemuOpts *opts, void *dummy)
1213 {
1214     Error *local_err = NULL;
1215
1216     net_client_init(opts, 0, &local_err);
1217     if (error_is_set(&local_err)) {
1218         qerror_report_err(local_err);
1219         error_free(local_err);
1220         return -1;
1221     }
1222
1223     return 0;
1224 }
1225
1226 static int net_init_netdev(QemuOpts *opts, void *dummy)
1227 {
1228     Error *local_err = NULL;
1229     int ret;
1230
1231     ret = net_client_init(opts, 1, &local_err);
1232     if (error_is_set(&local_err)) {
1233         qerror_report_err(local_err);
1234         error_free(local_err);
1235         return -1;
1236     }
1237
1238     return ret;
1239 }
1240
1241 int net_init_clients(void)
1242 {
1243     QemuOptsList *net = qemu_find_opts("net");
1244
1245     if (default_net) {
1246         /* if no clients, we use a default config */
1247         qemu_opts_set(net, NULL, "type", "nic");
1248 #ifdef CONFIG_SLIRP
1249         qemu_opts_set(net, NULL, "type", "user");
1250 #endif
1251     }
1252
1253     QTAILQ_INIT(&vlans);
1254     QTAILQ_INIT(&non_vlan_clients);
1255
1256     if (qemu_opts_foreach(qemu_find_opts("netdev"), net_init_netdev, NULL, 1) == -1)
1257         return -1;
1258
1259     if (qemu_opts_foreach(net, net_init_client, NULL, 1) == -1) {
1260         return -1;
1261     }
1262
1263     return 0;
1264 }
1265
1266 int net_client_parse(QemuOptsList *opts_list, const char *optarg)
1267 {
1268 #if defined(CONFIG_SLIRP)
1269     int ret;
1270     if (net_slirp_parse_legacy(opts_list, optarg, &ret)) {
1271         return ret;
1272     }
1273 #endif
1274
1275     if (!qemu_opts_parse(opts_list, optarg, 1)) {
1276         return -1;
1277     }
1278
1279     default_net = 0;
1280     return 0;
1281 }
1282
1283 /* From FreeBSD */
1284 /* XXX: optimize */
1285 unsigned compute_mcast_idx(const uint8_t *ep)
1286 {
1287     uint32_t crc;
1288     int carry, i, j;
1289     uint8_t b;
1290
1291     crc = 0xffffffff;
1292     for (i = 0; i < 6; i++) {
1293         b = *ep++;
1294         for (j = 0; j < 8; j++) {
1295             carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01);
1296             crc <<= 1;
1297             b >>= 1;
1298             if (carry) {
1299                 crc = ((crc ^ POLYNOMIAL) | carry);
1300             }
1301         }
1302     }
1303     return crc >> 26;
1304 }