Merge commit 'quintela/migration-next-v5' into staging
[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(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 }