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