xref: /openbmc/qemu/net/net.c (revision e688df6b)
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 
25 #include "qemu/osdep.h"
26 
27 #include "net/net.h"
28 #include "clients.h"
29 #include "hub.h"
30 #include "net/slirp.h"
31 #include "net/eth.h"
32 #include "util.h"
33 
34 #include "monitor/monitor.h"
35 #include "qemu-common.h"
36 #include "qemu/help_option.h"
37 #include "qapi/qmp/qerror.h"
38 #include "qemu/error-report.h"
39 #include "qemu/sockets.h"
40 #include "qemu/cutils.h"
41 #include "qemu/config-file.h"
42 #include "qmp-commands.h"
43 #include "hw/qdev.h"
44 #include "qemu/iov.h"
45 #include "qemu/main-loop.h"
46 #include "qapi-visit.h"
47 #include "qapi/error.h"
48 #include "qapi/opts-visitor.h"
49 #include "sysemu/sysemu.h"
50 #include "sysemu/qtest.h"
51 #include "net/filter.h"
52 #include "qapi/string-output-visitor.h"
53 
54 /* Net bridge is currently not supported for W32. */
55 #if !defined(_WIN32)
56 # define CONFIG_NET_BRIDGE
57 #endif
58 
59 static VMChangeStateEntry *net_change_state_entry;
60 static QTAILQ_HEAD(, NetClientState) net_clients;
61 
62 const char *host_net_devices[] = {
63     "tap",
64     "socket",
65     "dump",
66 #ifdef CONFIG_NET_BRIDGE
67     "bridge",
68 #endif
69 #ifdef CONFIG_NETMAP
70     "netmap",
71 #endif
72 #ifdef CONFIG_SLIRP
73     "user",
74 #endif
75 #ifdef CONFIG_VDE
76     "vde",
77 #endif
78     "vhost-user",
79     NULL,
80 };
81 
82 /***********************************************************/
83 /* network device redirectors */
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                     Error **errp)
107 {
108     char buf[512];
109     struct hostent *he;
110     const char *p, *r;
111     int port;
112 
113     p = str;
114     if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
115         error_setg(errp, "host address '%s' doesn't contain ':' "
116                    "separating host from port", str);
117         return -1;
118     }
119     saddr->sin_family = AF_INET;
120     if (buf[0] == '\0') {
121         saddr->sin_addr.s_addr = 0;
122     } else {
123         if (qemu_isdigit(buf[0])) {
124             if (!inet_aton(buf, &saddr->sin_addr)) {
125                 error_setg(errp, "host address '%s' is not a valid "
126                            "IPv4 address", buf);
127                 return -1;
128             }
129         } else {
130             he = gethostbyname(buf);
131             if (he == NULL) {
132                 error_setg(errp, "can't resolve host address '%s'", buf);
133                 return - 1;
134             }
135             saddr->sin_addr = *(struct in_addr *)he->h_addr;
136         }
137     }
138     port = strtol(p, (char **)&r, 0);
139     if (r == p) {
140         error_setg(errp, "port number '%s' is invalid", p);
141         return -1;
142     }
143     saddr->sin_port = htons(port);
144     return 0;
145 }
146 
147 char *qemu_mac_strdup_printf(const uint8_t *macaddr)
148 {
149     return g_strdup_printf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
150                            macaddr[0], macaddr[1], macaddr[2],
151                            macaddr[3], macaddr[4], macaddr[5]);
152 }
153 
154 void qemu_format_nic_info_str(NetClientState *nc, uint8_t macaddr[6])
155 {
156     snprintf(nc->info_str, sizeof(nc->info_str),
157              "model=%s,macaddr=%02x:%02x:%02x:%02x:%02x:%02x",
158              nc->model,
159              macaddr[0], macaddr[1], macaddr[2],
160              macaddr[3], macaddr[4], macaddr[5]);
161 }
162 
163 static int mac_table[256] = {0};
164 
165 static void qemu_macaddr_set_used(MACAddr *macaddr)
166 {
167     int index;
168 
169     for (index = 0x56; index < 0xFF; index++) {
170         if (macaddr->a[5] == index) {
171             mac_table[index]++;
172         }
173     }
174 }
175 
176 static void qemu_macaddr_set_free(MACAddr *macaddr)
177 {
178     int index;
179     static const MACAddr base = { .a = { 0x52, 0x54, 0x00, 0x12, 0x34, 0 } };
180 
181     if (memcmp(macaddr->a, &base.a, (sizeof(base.a) - 1)) != 0) {
182         return;
183     }
184     for (index = 0x56; index < 0xFF; index++) {
185         if (macaddr->a[5] == index) {
186             mac_table[index]--;
187         }
188     }
189 }
190 
191 static int qemu_macaddr_get_free(void)
192 {
193     int index;
194 
195     for (index = 0x56; index < 0xFF; index++) {
196         if (mac_table[index] == 0) {
197             return index;
198         }
199     }
200 
201     return -1;
202 }
203 
204 void qemu_macaddr_default_if_unset(MACAddr *macaddr)
205 {
206     static const MACAddr zero = { .a = { 0,0,0,0,0,0 } };
207     static const MACAddr base = { .a = { 0x52, 0x54, 0x00, 0x12, 0x34, 0 } };
208 
209     if (memcmp(macaddr, &zero, sizeof(zero)) != 0) {
210         if (memcmp(macaddr->a, &base.a, (sizeof(base.a) - 1)) != 0) {
211             return;
212         } else {
213             qemu_macaddr_set_used(macaddr);
214             return;
215         }
216     }
217 
218     macaddr->a[0] = 0x52;
219     macaddr->a[1] = 0x54;
220     macaddr->a[2] = 0x00;
221     macaddr->a[3] = 0x12;
222     macaddr->a[4] = 0x34;
223     macaddr->a[5] = qemu_macaddr_get_free();
224     qemu_macaddr_set_used(macaddr);
225 }
226 
227 /**
228  * Generate a name for net client
229  *
230  * Only net clients created with the legacy -net option and NICs need this.
231  */
232 static char *assign_name(NetClientState *nc1, const char *model)
233 {
234     NetClientState *nc;
235     int id = 0;
236 
237     QTAILQ_FOREACH(nc, &net_clients, next) {
238         if (nc == nc1) {
239             continue;
240         }
241         if (strcmp(nc->model, model) == 0) {
242             id++;
243         }
244     }
245 
246     return g_strdup_printf("%s.%d", model, id);
247 }
248 
249 static void qemu_net_client_destructor(NetClientState *nc)
250 {
251     g_free(nc);
252 }
253 
254 static void qemu_net_client_setup(NetClientState *nc,
255                                   NetClientInfo *info,
256                                   NetClientState *peer,
257                                   const char *model,
258                                   const char *name,
259                                   NetClientDestructor *destructor)
260 {
261     nc->info = info;
262     nc->model = g_strdup(model);
263     if (name) {
264         nc->name = g_strdup(name);
265     } else {
266         nc->name = assign_name(nc, model);
267     }
268 
269     if (peer) {
270         assert(!peer->peer);
271         nc->peer = peer;
272         peer->peer = nc;
273     }
274     QTAILQ_INSERT_TAIL(&net_clients, nc, next);
275 
276     nc->incoming_queue = qemu_new_net_queue(qemu_deliver_packet_iov, nc);
277     nc->destructor = destructor;
278     QTAILQ_INIT(&nc->filters);
279 }
280 
281 NetClientState *qemu_new_net_client(NetClientInfo *info,
282                                     NetClientState *peer,
283                                     const char *model,
284                                     const char *name)
285 {
286     NetClientState *nc;
287 
288     assert(info->size >= sizeof(NetClientState));
289 
290     nc = g_malloc0(info->size);
291     qemu_net_client_setup(nc, info, peer, model, name,
292                           qemu_net_client_destructor);
293 
294     return nc;
295 }
296 
297 NICState *qemu_new_nic(NetClientInfo *info,
298                        NICConf *conf,
299                        const char *model,
300                        const char *name,
301                        void *opaque)
302 {
303     NetClientState **peers = conf->peers.ncs;
304     NICState *nic;
305     int i, queues = MAX(1, conf->peers.queues);
306 
307     assert(info->type == NET_CLIENT_DRIVER_NIC);
308     assert(info->size >= sizeof(NICState));
309 
310     nic = g_malloc0(info->size + sizeof(NetClientState) * queues);
311     nic->ncs = (void *)nic + info->size;
312     nic->conf = conf;
313     nic->opaque = opaque;
314 
315     for (i = 0; i < queues; i++) {
316         qemu_net_client_setup(&nic->ncs[i], info, peers[i], model, name,
317                               NULL);
318         nic->ncs[i].queue_index = i;
319     }
320 
321     return nic;
322 }
323 
324 NetClientState *qemu_get_subqueue(NICState *nic, int queue_index)
325 {
326     return nic->ncs + queue_index;
327 }
328 
329 NetClientState *qemu_get_queue(NICState *nic)
330 {
331     return qemu_get_subqueue(nic, 0);
332 }
333 
334 NICState *qemu_get_nic(NetClientState *nc)
335 {
336     NetClientState *nc0 = nc - nc->queue_index;
337 
338     return (NICState *)((void *)nc0 - nc->info->size);
339 }
340 
341 void *qemu_get_nic_opaque(NetClientState *nc)
342 {
343     NICState *nic = qemu_get_nic(nc);
344 
345     return nic->opaque;
346 }
347 
348 static void qemu_cleanup_net_client(NetClientState *nc)
349 {
350     QTAILQ_REMOVE(&net_clients, nc, next);
351 
352     if (nc->info->cleanup) {
353         nc->info->cleanup(nc);
354     }
355 }
356 
357 static void qemu_free_net_client(NetClientState *nc)
358 {
359     if (nc->incoming_queue) {
360         qemu_del_net_queue(nc->incoming_queue);
361     }
362     if (nc->peer) {
363         nc->peer->peer = NULL;
364     }
365     g_free(nc->name);
366     g_free(nc->model);
367     if (nc->destructor) {
368         nc->destructor(nc);
369     }
370 }
371 
372 void qemu_del_net_client(NetClientState *nc)
373 {
374     NetClientState *ncs[MAX_QUEUE_NUM];
375     int queues, i;
376     NetFilterState *nf, *next;
377 
378     assert(nc->info->type != NET_CLIENT_DRIVER_NIC);
379 
380     /* If the NetClientState belongs to a multiqueue backend, we will change all
381      * other NetClientStates also.
382      */
383     queues = qemu_find_net_clients_except(nc->name, ncs,
384                                           NET_CLIENT_DRIVER_NIC,
385                                           MAX_QUEUE_NUM);
386     assert(queues != 0);
387 
388     QTAILQ_FOREACH_SAFE(nf, &nc->filters, next, next) {
389         object_unparent(OBJECT(nf));
390     }
391 
392     /* If there is a peer NIC, delete and cleanup client, but do not free. */
393     if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_NIC) {
394         NICState *nic = qemu_get_nic(nc->peer);
395         if (nic->peer_deleted) {
396             return;
397         }
398         nic->peer_deleted = true;
399 
400         for (i = 0; i < queues; i++) {
401             ncs[i]->peer->link_down = true;
402         }
403 
404         if (nc->peer->info->link_status_changed) {
405             nc->peer->info->link_status_changed(nc->peer);
406         }
407 
408         for (i = 0; i < queues; i++) {
409             qemu_cleanup_net_client(ncs[i]);
410         }
411 
412         return;
413     }
414 
415     for (i = 0; i < queues; i++) {
416         qemu_cleanup_net_client(ncs[i]);
417         qemu_free_net_client(ncs[i]);
418     }
419 }
420 
421 void qemu_del_nic(NICState *nic)
422 {
423     int i, queues = MAX(nic->conf->peers.queues, 1);
424 
425     qemu_macaddr_set_free(&nic->conf->macaddr);
426 
427     /* If this is a peer NIC and peer has already been deleted, free it now. */
428     if (nic->peer_deleted) {
429         for (i = 0; i < queues; i++) {
430             qemu_free_net_client(qemu_get_subqueue(nic, i)->peer);
431         }
432     }
433 
434     for (i = queues - 1; i >= 0; i--) {
435         NetClientState *nc = qemu_get_subqueue(nic, i);
436 
437         qemu_cleanup_net_client(nc);
438         qemu_free_net_client(nc);
439     }
440 
441     g_free(nic);
442 }
443 
444 void qemu_foreach_nic(qemu_nic_foreach func, void *opaque)
445 {
446     NetClientState *nc;
447 
448     QTAILQ_FOREACH(nc, &net_clients, next) {
449         if (nc->info->type == NET_CLIENT_DRIVER_NIC) {
450             if (nc->queue_index == 0) {
451                 func(qemu_get_nic(nc), opaque);
452             }
453         }
454     }
455 }
456 
457 bool qemu_has_ufo(NetClientState *nc)
458 {
459     if (!nc || !nc->info->has_ufo) {
460         return false;
461     }
462 
463     return nc->info->has_ufo(nc);
464 }
465 
466 bool qemu_has_vnet_hdr(NetClientState *nc)
467 {
468     if (!nc || !nc->info->has_vnet_hdr) {
469         return false;
470     }
471 
472     return nc->info->has_vnet_hdr(nc);
473 }
474 
475 bool qemu_has_vnet_hdr_len(NetClientState *nc, int len)
476 {
477     if (!nc || !nc->info->has_vnet_hdr_len) {
478         return false;
479     }
480 
481     return nc->info->has_vnet_hdr_len(nc, len);
482 }
483 
484 void qemu_using_vnet_hdr(NetClientState *nc, bool enable)
485 {
486     if (!nc || !nc->info->using_vnet_hdr) {
487         return;
488     }
489 
490     nc->info->using_vnet_hdr(nc, enable);
491 }
492 
493 void qemu_set_offload(NetClientState *nc, int csum, int tso4, int tso6,
494                           int ecn, int ufo)
495 {
496     if (!nc || !nc->info->set_offload) {
497         return;
498     }
499 
500     nc->info->set_offload(nc, csum, tso4, tso6, ecn, ufo);
501 }
502 
503 void qemu_set_vnet_hdr_len(NetClientState *nc, int len)
504 {
505     if (!nc || !nc->info->set_vnet_hdr_len) {
506         return;
507     }
508 
509     nc->vnet_hdr_len = len;
510     nc->info->set_vnet_hdr_len(nc, len);
511 }
512 
513 int qemu_set_vnet_le(NetClientState *nc, bool is_le)
514 {
515 #ifdef HOST_WORDS_BIGENDIAN
516     if (!nc || !nc->info->set_vnet_le) {
517         return -ENOSYS;
518     }
519 
520     return nc->info->set_vnet_le(nc, is_le);
521 #else
522     return 0;
523 #endif
524 }
525 
526 int qemu_set_vnet_be(NetClientState *nc, bool is_be)
527 {
528 #ifdef HOST_WORDS_BIGENDIAN
529     return 0;
530 #else
531     if (!nc || !nc->info->set_vnet_be) {
532         return -ENOSYS;
533     }
534 
535     return nc->info->set_vnet_be(nc, is_be);
536 #endif
537 }
538 
539 int qemu_can_send_packet(NetClientState *sender)
540 {
541     int vm_running = runstate_is_running();
542 
543     if (!vm_running) {
544         return 0;
545     }
546 
547     if (!sender->peer) {
548         return 1;
549     }
550 
551     if (sender->peer->receive_disabled) {
552         return 0;
553     } else if (sender->peer->info->can_receive &&
554                !sender->peer->info->can_receive(sender->peer)) {
555         return 0;
556     }
557     return 1;
558 }
559 
560 static ssize_t filter_receive_iov(NetClientState *nc,
561                                   NetFilterDirection direction,
562                                   NetClientState *sender,
563                                   unsigned flags,
564                                   const struct iovec *iov,
565                                   int iovcnt,
566                                   NetPacketSent *sent_cb)
567 {
568     ssize_t ret = 0;
569     NetFilterState *nf = NULL;
570 
571     if (direction == NET_FILTER_DIRECTION_TX) {
572         QTAILQ_FOREACH(nf, &nc->filters, next) {
573             ret = qemu_netfilter_receive(nf, direction, sender, flags, iov,
574                                          iovcnt, sent_cb);
575             if (ret) {
576                 return ret;
577             }
578         }
579     } else {
580         QTAILQ_FOREACH_REVERSE(nf, &nc->filters, NetFilterHead, next) {
581             ret = qemu_netfilter_receive(nf, direction, sender, flags, iov,
582                                          iovcnt, sent_cb);
583             if (ret) {
584                 return ret;
585             }
586         }
587     }
588 
589     return ret;
590 }
591 
592 static ssize_t filter_receive(NetClientState *nc,
593                               NetFilterDirection direction,
594                               NetClientState *sender,
595                               unsigned flags,
596                               const uint8_t *data,
597                               size_t size,
598                               NetPacketSent *sent_cb)
599 {
600     struct iovec iov = {
601         .iov_base = (void *)data,
602         .iov_len = size
603     };
604 
605     return filter_receive_iov(nc, direction, sender, flags, &iov, 1, sent_cb);
606 }
607 
608 void qemu_purge_queued_packets(NetClientState *nc)
609 {
610     if (!nc->peer) {
611         return;
612     }
613 
614     qemu_net_queue_purge(nc->peer->incoming_queue, nc);
615 }
616 
617 static
618 void qemu_flush_or_purge_queued_packets(NetClientState *nc, bool purge)
619 {
620     nc->receive_disabled = 0;
621 
622     if (nc->peer && nc->peer->info->type == NET_CLIENT_DRIVER_HUBPORT) {
623         if (net_hub_flush(nc->peer)) {
624             qemu_notify_event();
625         }
626     }
627     if (qemu_net_queue_flush(nc->incoming_queue)) {
628         /* We emptied the queue successfully, signal to the IO thread to repoll
629          * the file descriptor (for tap, for example).
630          */
631         qemu_notify_event();
632     } else if (purge) {
633         /* Unable to empty the queue, purge remaining packets */
634         qemu_net_queue_purge(nc->incoming_queue, nc);
635     }
636 }
637 
638 void qemu_flush_queued_packets(NetClientState *nc)
639 {
640     qemu_flush_or_purge_queued_packets(nc, false);
641 }
642 
643 static ssize_t qemu_send_packet_async_with_flags(NetClientState *sender,
644                                                  unsigned flags,
645                                                  const uint8_t *buf, int size,
646                                                  NetPacketSent *sent_cb)
647 {
648     NetQueue *queue;
649     int ret;
650 
651 #ifdef DEBUG_NET
652     printf("qemu_send_packet_async:\n");
653     qemu_hexdump((const char *)buf, stdout, "net", size);
654 #endif
655 
656     if (sender->link_down || !sender->peer) {
657         return size;
658     }
659 
660     /* Let filters handle the packet first */
661     ret = filter_receive(sender, NET_FILTER_DIRECTION_TX,
662                          sender, flags, buf, size, sent_cb);
663     if (ret) {
664         return ret;
665     }
666 
667     ret = filter_receive(sender->peer, NET_FILTER_DIRECTION_RX,
668                          sender, flags, buf, size, sent_cb);
669     if (ret) {
670         return ret;
671     }
672 
673     queue = sender->peer->incoming_queue;
674 
675     return qemu_net_queue_send(queue, sender, flags, buf, size, sent_cb);
676 }
677 
678 ssize_t qemu_send_packet_async(NetClientState *sender,
679                                const uint8_t *buf, int size,
680                                NetPacketSent *sent_cb)
681 {
682     return qemu_send_packet_async_with_flags(sender, QEMU_NET_PACKET_FLAG_NONE,
683                                              buf, size, sent_cb);
684 }
685 
686 void qemu_send_packet(NetClientState *nc, const uint8_t *buf, int size)
687 {
688     qemu_send_packet_async(nc, buf, size, NULL);
689 }
690 
691 ssize_t qemu_send_packet_raw(NetClientState *nc, const uint8_t *buf, int size)
692 {
693     return qemu_send_packet_async_with_flags(nc, QEMU_NET_PACKET_FLAG_RAW,
694                                              buf, size, NULL);
695 }
696 
697 static ssize_t nc_sendv_compat(NetClientState *nc, const struct iovec *iov,
698                                int iovcnt, unsigned flags)
699 {
700     uint8_t *buf = NULL;
701     uint8_t *buffer;
702     size_t offset;
703     ssize_t ret;
704 
705     if (iovcnt == 1) {
706         buffer = iov[0].iov_base;
707         offset = iov[0].iov_len;
708     } else {
709         offset = iov_size(iov, iovcnt);
710         if (offset > NET_BUFSIZE) {
711             return -1;
712         }
713         buf = g_malloc(offset);
714         buffer = buf;
715         offset = iov_to_buf(iov, iovcnt, 0, buf, offset);
716     }
717 
718     if (flags & QEMU_NET_PACKET_FLAG_RAW && nc->info->receive_raw) {
719         ret = nc->info->receive_raw(nc, buffer, offset);
720     } else {
721         ret = nc->info->receive(nc, buffer, offset);
722     }
723 
724     g_free(buf);
725     return ret;
726 }
727 
728 ssize_t qemu_deliver_packet_iov(NetClientState *sender,
729                                 unsigned flags,
730                                 const struct iovec *iov,
731                                 int iovcnt,
732                                 void *opaque)
733 {
734     NetClientState *nc = opaque;
735     int ret;
736 
737     if (nc->link_down) {
738         return iov_size(iov, iovcnt);
739     }
740 
741     if (nc->receive_disabled) {
742         return 0;
743     }
744 
745     if (nc->info->receive_iov && !(flags & QEMU_NET_PACKET_FLAG_RAW)) {
746         ret = nc->info->receive_iov(nc, iov, iovcnt);
747     } else {
748         ret = nc_sendv_compat(nc, iov, iovcnt, flags);
749     }
750 
751     if (ret == 0) {
752         nc->receive_disabled = 1;
753     }
754 
755     return ret;
756 }
757 
758 ssize_t qemu_sendv_packet_async(NetClientState *sender,
759                                 const struct iovec *iov, int iovcnt,
760                                 NetPacketSent *sent_cb)
761 {
762     NetQueue *queue;
763     int ret;
764 
765     if (sender->link_down || !sender->peer) {
766         return iov_size(iov, iovcnt);
767     }
768 
769     /* Let filters handle the packet first */
770     ret = filter_receive_iov(sender, NET_FILTER_DIRECTION_TX, sender,
771                              QEMU_NET_PACKET_FLAG_NONE, iov, iovcnt, sent_cb);
772     if (ret) {
773         return ret;
774     }
775 
776     ret = filter_receive_iov(sender->peer, NET_FILTER_DIRECTION_RX, sender,
777                              QEMU_NET_PACKET_FLAG_NONE, iov, iovcnt, sent_cb);
778     if (ret) {
779         return ret;
780     }
781 
782     queue = sender->peer->incoming_queue;
783 
784     return qemu_net_queue_send_iov(queue, sender,
785                                    QEMU_NET_PACKET_FLAG_NONE,
786                                    iov, iovcnt, sent_cb);
787 }
788 
789 ssize_t
790 qemu_sendv_packet(NetClientState *nc, const struct iovec *iov, int iovcnt)
791 {
792     return qemu_sendv_packet_async(nc, iov, iovcnt, NULL);
793 }
794 
795 NetClientState *qemu_find_netdev(const char *id)
796 {
797     NetClientState *nc;
798 
799     QTAILQ_FOREACH(nc, &net_clients, next) {
800         if (nc->info->type == NET_CLIENT_DRIVER_NIC)
801             continue;
802         if (!strcmp(nc->name, id)) {
803             return nc;
804         }
805     }
806 
807     return NULL;
808 }
809 
810 int qemu_find_net_clients_except(const char *id, NetClientState **ncs,
811                                  NetClientDriver type, int max)
812 {
813     NetClientState *nc;
814     int ret = 0;
815 
816     QTAILQ_FOREACH(nc, &net_clients, next) {
817         if (nc->info->type == type) {
818             continue;
819         }
820         if (!id || !strcmp(nc->name, id)) {
821             if (ret < max) {
822                 ncs[ret] = nc;
823             }
824             ret++;
825         }
826     }
827 
828     return ret;
829 }
830 
831 static int nic_get_free_idx(void)
832 {
833     int index;
834 
835     for (index = 0; index < MAX_NICS; index++)
836         if (!nd_table[index].used)
837             return index;
838     return -1;
839 }
840 
841 int qemu_show_nic_models(const char *arg, const char *const *models)
842 {
843     int i;
844 
845     if (!arg || !is_help_option(arg)) {
846         return 0;
847     }
848 
849     fprintf(stderr, "qemu: Supported NIC models: ");
850     for (i = 0 ; models[i]; i++)
851         fprintf(stderr, "%s%c", models[i], models[i+1] ? ',' : '\n');
852     return 1;
853 }
854 
855 void qemu_check_nic_model(NICInfo *nd, const char *model)
856 {
857     const char *models[2];
858 
859     models[0] = model;
860     models[1] = NULL;
861 
862     if (qemu_show_nic_models(nd->model, models))
863         exit(0);
864     if (qemu_find_nic_model(nd, models, model) < 0)
865         exit(1);
866 }
867 
868 int qemu_find_nic_model(NICInfo *nd, const char * const *models,
869                         const char *default_model)
870 {
871     int i;
872 
873     if (!nd->model)
874         nd->model = g_strdup(default_model);
875 
876     for (i = 0 ; models[i]; i++) {
877         if (strcmp(nd->model, models[i]) == 0)
878             return i;
879     }
880 
881     error_report("Unsupported NIC model: %s", nd->model);
882     return -1;
883 }
884 
885 static int net_init_nic(const Netdev *netdev, const char *name,
886                         NetClientState *peer, Error **errp)
887 {
888     int idx;
889     NICInfo *nd;
890     const NetLegacyNicOptions *nic;
891 
892     assert(netdev->type == NET_CLIENT_DRIVER_NIC);
893     nic = &netdev->u.nic;
894 
895     idx = nic_get_free_idx();
896     if (idx == -1 || nb_nics >= MAX_NICS) {
897         error_setg(errp, "too many NICs");
898         return -1;
899     }
900 
901     nd = &nd_table[idx];
902 
903     memset(nd, 0, sizeof(*nd));
904 
905     if (nic->has_netdev) {
906         nd->netdev = qemu_find_netdev(nic->netdev);
907         if (!nd->netdev) {
908             error_setg(errp, "netdev '%s' not found", nic->netdev);
909             return -1;
910         }
911     } else {
912         assert(peer);
913         nd->netdev = peer;
914     }
915     nd->name = g_strdup(name);
916     if (nic->has_model) {
917         nd->model = g_strdup(nic->model);
918     }
919     if (nic->has_addr) {
920         nd->devaddr = g_strdup(nic->addr);
921     }
922 
923     if (nic->has_macaddr &&
924         net_parse_macaddr(nd->macaddr.a, nic->macaddr) < 0) {
925         error_setg(errp, "invalid syntax for ethernet address");
926         return -1;
927     }
928     if (nic->has_macaddr &&
929         is_multicast_ether_addr(nd->macaddr.a)) {
930         error_setg(errp,
931                    "NIC cannot have multicast MAC address (odd 1st byte)");
932         return -1;
933     }
934     qemu_macaddr_default_if_unset(&nd->macaddr);
935 
936     if (nic->has_vectors) {
937         if (nic->vectors > 0x7ffffff) {
938             error_setg(errp, "invalid # of vectors: %"PRIu32, nic->vectors);
939             return -1;
940         }
941         nd->nvectors = nic->vectors;
942     } else {
943         nd->nvectors = DEV_NVECTORS_UNSPECIFIED;
944     }
945 
946     nd->used = 1;
947     nb_nics++;
948 
949     return idx;
950 }
951 
952 
953 static int (* const net_client_init_fun[NET_CLIENT_DRIVER__MAX])(
954     const Netdev *netdev,
955     const char *name,
956     NetClientState *peer, Error **errp) = {
957         [NET_CLIENT_DRIVER_NIC]       = net_init_nic,
958 #ifdef CONFIG_SLIRP
959         [NET_CLIENT_DRIVER_USER]      = net_init_slirp,
960 #endif
961         [NET_CLIENT_DRIVER_TAP]       = net_init_tap,
962         [NET_CLIENT_DRIVER_SOCKET]    = net_init_socket,
963 #ifdef CONFIG_VDE
964         [NET_CLIENT_DRIVER_VDE]       = net_init_vde,
965 #endif
966 #ifdef CONFIG_NETMAP
967         [NET_CLIENT_DRIVER_NETMAP]    = net_init_netmap,
968 #endif
969         [NET_CLIENT_DRIVER_DUMP]      = net_init_dump,
970 #ifdef CONFIG_NET_BRIDGE
971         [NET_CLIENT_DRIVER_BRIDGE]    = net_init_bridge,
972 #endif
973         [NET_CLIENT_DRIVER_HUBPORT]   = net_init_hubport,
974 #ifdef CONFIG_VHOST_NET_USED
975         [NET_CLIENT_DRIVER_VHOST_USER] = net_init_vhost_user,
976 #endif
977 #ifdef CONFIG_L2TPV3
978         [NET_CLIENT_DRIVER_L2TPV3]    = net_init_l2tpv3,
979 #endif
980 };
981 
982 
983 static int net_client_init1(const void *object, bool is_netdev, Error **errp)
984 {
985     Netdev legacy = {0};
986     const Netdev *netdev;
987     const char *name;
988     NetClientState *peer = NULL;
989     static bool vlan_warned;
990 
991     if (is_netdev) {
992         netdev = object;
993         name = netdev->id;
994 
995         if (netdev->type == NET_CLIENT_DRIVER_DUMP ||
996             netdev->type == NET_CLIENT_DRIVER_NIC ||
997             !net_client_init_fun[netdev->type]) {
998             error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "type",
999                        "a netdev backend type");
1000             return -1;
1001         }
1002     } else {
1003         const NetLegacy *net = object;
1004         const NetLegacyOptions *opts = net->opts;
1005         legacy.id = net->id;
1006         netdev = &legacy;
1007         /* missing optional values have been initialized to "all bits zero" */
1008         name = net->has_id ? net->id : net->name;
1009 
1010         /* Map the old options to the new flat type */
1011         switch (opts->type) {
1012         case NET_LEGACY_OPTIONS_TYPE_NONE:
1013             return 0; /* nothing to do */
1014         case NET_LEGACY_OPTIONS_TYPE_NIC:
1015             legacy.type = NET_CLIENT_DRIVER_NIC;
1016             legacy.u.nic = opts->u.nic;
1017             break;
1018         case NET_LEGACY_OPTIONS_TYPE_USER:
1019             legacy.type = NET_CLIENT_DRIVER_USER;
1020             legacy.u.user = opts->u.user;
1021             break;
1022         case NET_LEGACY_OPTIONS_TYPE_TAP:
1023             legacy.type = NET_CLIENT_DRIVER_TAP;
1024             legacy.u.tap = opts->u.tap;
1025             break;
1026         case NET_LEGACY_OPTIONS_TYPE_L2TPV3:
1027             legacy.type = NET_CLIENT_DRIVER_L2TPV3;
1028             legacy.u.l2tpv3 = opts->u.l2tpv3;
1029             break;
1030         case NET_LEGACY_OPTIONS_TYPE_SOCKET:
1031             legacy.type = NET_CLIENT_DRIVER_SOCKET;
1032             legacy.u.socket = opts->u.socket;
1033             break;
1034         case NET_LEGACY_OPTIONS_TYPE_VDE:
1035             legacy.type = NET_CLIENT_DRIVER_VDE;
1036             legacy.u.vde = opts->u.vde;
1037             break;
1038         case NET_LEGACY_OPTIONS_TYPE_DUMP:
1039             legacy.type = NET_CLIENT_DRIVER_DUMP;
1040             legacy.u.dump = opts->u.dump;
1041             break;
1042         case NET_LEGACY_OPTIONS_TYPE_BRIDGE:
1043             legacy.type = NET_CLIENT_DRIVER_BRIDGE;
1044             legacy.u.bridge = opts->u.bridge;
1045             break;
1046         case NET_LEGACY_OPTIONS_TYPE_NETMAP:
1047             legacy.type = NET_CLIENT_DRIVER_NETMAP;
1048             legacy.u.netmap = opts->u.netmap;
1049             break;
1050         case NET_LEGACY_OPTIONS_TYPE_VHOST_USER:
1051             legacy.type = NET_CLIENT_DRIVER_VHOST_USER;
1052             legacy.u.vhost_user = opts->u.vhost_user;
1053             break;
1054         default:
1055             abort();
1056         }
1057 
1058         if (!net_client_init_fun[netdev->type]) {
1059             error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "type",
1060                        "a net backend type (maybe it is not compiled "
1061                        "into this binary)");
1062             return -1;
1063         }
1064 
1065         /* Do not add to a vlan if it's a nic with a netdev= parameter. */
1066         if (netdev->type != NET_CLIENT_DRIVER_NIC ||
1067             !opts->u.nic.has_netdev) {
1068             peer = net_hub_add_port(net->has_vlan ? net->vlan : 0, NULL, NULL);
1069         }
1070 
1071         if (net->has_vlan && !vlan_warned) {
1072             error_report("'vlan' is deprecated. Please use 'netdev' instead.");
1073             vlan_warned = true;
1074         }
1075     }
1076 
1077     if (net_client_init_fun[netdev->type](netdev, name, peer, errp) < 0) {
1078         /* FIXME drop when all init functions store an Error */
1079         if (errp && !*errp) {
1080             error_setg(errp, QERR_DEVICE_INIT_FAILED,
1081                        NetClientDriver_str(netdev->type));
1082         }
1083         return -1;
1084     }
1085     return 0;
1086 }
1087 
1088 
1089 int net_client_init(QemuOpts *opts, bool is_netdev, Error **errp)
1090 {
1091     void *object = NULL;
1092     Error *err = NULL;
1093     int ret = -1;
1094     Visitor *v = opts_visitor_new(opts);
1095 
1096     {
1097         /* Parse convenience option format ip6-net=fec0::0[/64] */
1098         const char *ip6_net = qemu_opt_get(opts, "ipv6-net");
1099 
1100         if (ip6_net) {
1101             char buf[strlen(ip6_net) + 1];
1102 
1103             if (get_str_sep(buf, sizeof(buf), &ip6_net, '/') < 0) {
1104                 /* Default 64bit prefix length.  */
1105                 qemu_opt_set(opts, "ipv6-prefix", ip6_net, &error_abort);
1106                 qemu_opt_set_number(opts, "ipv6-prefixlen", 64, &error_abort);
1107             } else {
1108                 /* User-specified prefix length.  */
1109                 unsigned long len;
1110                 int err;
1111 
1112                 qemu_opt_set(opts, "ipv6-prefix", buf, &error_abort);
1113                 err = qemu_strtoul(ip6_net, NULL, 10, &len);
1114 
1115                 if (err) {
1116                     error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
1117                               "ipv6-prefix", "a number");
1118                 } else {
1119                     qemu_opt_set_number(opts, "ipv6-prefixlen", len,
1120                                         &error_abort);
1121                 }
1122             }
1123             qemu_opt_unset(opts, "ipv6-net");
1124         }
1125     }
1126 
1127     if (is_netdev) {
1128         visit_type_Netdev(v, NULL, (Netdev **)&object, &err);
1129     } else {
1130         visit_type_NetLegacy(v, NULL, (NetLegacy **)&object, &err);
1131     }
1132 
1133     if (!err) {
1134         ret = net_client_init1(object, is_netdev, &err);
1135     }
1136 
1137     if (is_netdev) {
1138         qapi_free_Netdev(object);
1139     } else {
1140         qapi_free_NetLegacy(object);
1141     }
1142 
1143     error_propagate(errp, err);
1144     visit_free(v);
1145     return ret;
1146 }
1147 
1148 
1149 static int net_host_check_device(const char *device)
1150 {
1151     int i;
1152     for (i = 0; host_net_devices[i]; i++) {
1153         if (!strncmp(host_net_devices[i], device,
1154                      strlen(host_net_devices[i]))) {
1155             return 1;
1156         }
1157     }
1158 
1159     return 0;
1160 }
1161 
1162 void hmp_host_net_add(Monitor *mon, const QDict *qdict)
1163 {
1164     const char *device = qdict_get_str(qdict, "device");
1165     const char *opts_str = qdict_get_try_str(qdict, "opts");
1166     Error *local_err = NULL;
1167     QemuOpts *opts;
1168     static bool warned;
1169 
1170     if (!warned && !qtest_enabled()) {
1171         error_report("host_net_add is deprecated, use netdev_add instead");
1172         warned = true;
1173     }
1174 
1175     if (!net_host_check_device(device)) {
1176         monitor_printf(mon, "invalid host network device %s\n", device);
1177         return;
1178     }
1179 
1180     opts = qemu_opts_parse_noisily(qemu_find_opts("net"),
1181                                    opts_str ? opts_str : "", false);
1182     if (!opts) {
1183         return;
1184     }
1185 
1186     qemu_opt_set(opts, "type", device, &error_abort);
1187 
1188     net_client_init(opts, false, &local_err);
1189     if (local_err) {
1190         error_report_err(local_err);
1191         monitor_printf(mon, "adding host network device %s failed\n", device);
1192     }
1193 }
1194 
1195 void hmp_host_net_remove(Monitor *mon, const QDict *qdict)
1196 {
1197     NetClientState *nc;
1198     int vlan_id = qdict_get_int(qdict, "vlan_id");
1199     const char *device = qdict_get_str(qdict, "device");
1200     static bool warned;
1201 
1202     if (!warned && !qtest_enabled()) {
1203         error_report("host_net_remove is deprecated, use netdev_del instead");
1204         warned = true;
1205     }
1206 
1207     nc = net_hub_find_client_by_name(vlan_id, device);
1208     if (!nc) {
1209         error_report("Host network device '%s' on hub '%d' not found",
1210                      device, vlan_id);
1211         return;
1212     }
1213     if (nc->info->type == NET_CLIENT_DRIVER_NIC) {
1214         error_report("invalid host network device '%s'", device);
1215         return;
1216     }
1217 
1218     qemu_del_net_client(nc->peer);
1219     qemu_del_net_client(nc);
1220     qemu_opts_del(qemu_opts_find(qemu_find_opts("net"), device));
1221 }
1222 
1223 void netdev_add(QemuOpts *opts, Error **errp)
1224 {
1225     net_client_init(opts, true, errp);
1226 }
1227 
1228 void qmp_netdev_add(QDict *qdict, QObject **ret, Error **errp)
1229 {
1230     Error *local_err = NULL;
1231     QemuOptsList *opts_list;
1232     QemuOpts *opts;
1233 
1234     opts_list = qemu_find_opts_err("netdev", &local_err);
1235     if (local_err) {
1236         goto out;
1237     }
1238 
1239     opts = qemu_opts_from_qdict(opts_list, qdict, &local_err);
1240     if (local_err) {
1241         goto out;
1242     }
1243 
1244     netdev_add(opts, &local_err);
1245     if (local_err) {
1246         qemu_opts_del(opts);
1247         goto out;
1248     }
1249 
1250 out:
1251     error_propagate(errp, local_err);
1252 }
1253 
1254 void qmp_netdev_del(const char *id, Error **errp)
1255 {
1256     NetClientState *nc;
1257     QemuOpts *opts;
1258 
1259     nc = qemu_find_netdev(id);
1260     if (!nc) {
1261         error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
1262                   "Device '%s' not found", id);
1263         return;
1264     }
1265 
1266     opts = qemu_opts_find(qemu_find_opts_err("netdev", NULL), id);
1267     if (!opts) {
1268         error_setg(errp, "Device '%s' is not a netdev", id);
1269         return;
1270     }
1271 
1272     qemu_del_net_client(nc);
1273     qemu_opts_del(opts);
1274 }
1275 
1276 static void netfilter_print_info(Monitor *mon, NetFilterState *nf)
1277 {
1278     char *str;
1279     ObjectProperty *prop;
1280     ObjectPropertyIterator iter;
1281     Visitor *v;
1282 
1283     /* generate info str */
1284     object_property_iter_init(&iter, OBJECT(nf));
1285     while ((prop = object_property_iter_next(&iter))) {
1286         if (!strcmp(prop->name, "type")) {
1287             continue;
1288         }
1289         v = string_output_visitor_new(false, &str);
1290         object_property_get(OBJECT(nf), v, prop->name, NULL);
1291         visit_complete(v, &str);
1292         visit_free(v);
1293         monitor_printf(mon, ",%s=%s", prop->name, str);
1294         g_free(str);
1295     }
1296     monitor_printf(mon, "\n");
1297 }
1298 
1299 void print_net_client(Monitor *mon, NetClientState *nc)
1300 {
1301     NetFilterState *nf;
1302 
1303     monitor_printf(mon, "%s: index=%d,type=%s,%s\n", nc->name,
1304                    nc->queue_index,
1305                    NetClientDriver_str(nc->info->type),
1306                    nc->info_str);
1307     if (!QTAILQ_EMPTY(&nc->filters)) {
1308         monitor_printf(mon, "filters:\n");
1309     }
1310     QTAILQ_FOREACH(nf, &nc->filters, next) {
1311         char *path = object_get_canonical_path_component(OBJECT(nf));
1312 
1313         monitor_printf(mon, "  - %s: type=%s", path,
1314                        object_get_typename(OBJECT(nf)));
1315         netfilter_print_info(mon, nf);
1316         g_free(path);
1317     }
1318 }
1319 
1320 RxFilterInfoList *qmp_query_rx_filter(bool has_name, const char *name,
1321                                       Error **errp)
1322 {
1323     NetClientState *nc;
1324     RxFilterInfoList *filter_list = NULL, *last_entry = NULL;
1325 
1326     QTAILQ_FOREACH(nc, &net_clients, next) {
1327         RxFilterInfoList *entry;
1328         RxFilterInfo *info;
1329 
1330         if (has_name && strcmp(nc->name, name) != 0) {
1331             continue;
1332         }
1333 
1334         /* only query rx-filter information of NIC */
1335         if (nc->info->type != NET_CLIENT_DRIVER_NIC) {
1336             if (has_name) {
1337                 error_setg(errp, "net client(%s) isn't a NIC", name);
1338                 return NULL;
1339             }
1340             continue;
1341         }
1342 
1343         /* only query information on queue 0 since the info is per nic,
1344          * not per queue
1345          */
1346         if (nc->queue_index != 0)
1347             continue;
1348 
1349         if (nc->info->query_rx_filter) {
1350             info = nc->info->query_rx_filter(nc);
1351             entry = g_malloc0(sizeof(*entry));
1352             entry->value = info;
1353 
1354             if (!filter_list) {
1355                 filter_list = entry;
1356             } else {
1357                 last_entry->next = entry;
1358             }
1359             last_entry = entry;
1360         } else if (has_name) {
1361             error_setg(errp, "net client(%s) doesn't support"
1362                        " rx-filter querying", name);
1363             return NULL;
1364         }
1365 
1366         if (has_name) {
1367             break;
1368         }
1369     }
1370 
1371     if (filter_list == NULL && has_name) {
1372         error_setg(errp, "invalid net client name: %s", name);
1373     }
1374 
1375     return filter_list;
1376 }
1377 
1378 void hmp_info_network(Monitor *mon, const QDict *qdict)
1379 {
1380     NetClientState *nc, *peer;
1381     NetClientDriver type;
1382 
1383     net_hub_info(mon);
1384 
1385     QTAILQ_FOREACH(nc, &net_clients, next) {
1386         peer = nc->peer;
1387         type = nc->info->type;
1388 
1389         /* Skip if already printed in hub info */
1390         if (net_hub_id_for_client(nc, NULL) == 0) {
1391             continue;
1392         }
1393 
1394         if (!peer || type == NET_CLIENT_DRIVER_NIC) {
1395             print_net_client(mon, nc);
1396         } /* else it's a netdev connected to a NIC, printed with the NIC */
1397         if (peer && type == NET_CLIENT_DRIVER_NIC) {
1398             monitor_printf(mon, " \\ ");
1399             print_net_client(mon, peer);
1400         }
1401     }
1402 }
1403 
1404 void qmp_set_link(const char *name, bool up, Error **errp)
1405 {
1406     NetClientState *ncs[MAX_QUEUE_NUM];
1407     NetClientState *nc;
1408     int queues, i;
1409 
1410     queues = qemu_find_net_clients_except(name, ncs,
1411                                           NET_CLIENT_DRIVER__MAX,
1412                                           MAX_QUEUE_NUM);
1413 
1414     if (queues == 0) {
1415         error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
1416                   "Device '%s' not found", name);
1417         return;
1418     }
1419     nc = ncs[0];
1420 
1421     for (i = 0; i < queues; i++) {
1422         ncs[i]->link_down = !up;
1423     }
1424 
1425     if (nc->info->link_status_changed) {
1426         nc->info->link_status_changed(nc);
1427     }
1428 
1429     if (nc->peer) {
1430         /* Change peer link only if the peer is NIC and then notify peer.
1431          * If the peer is a HUBPORT or a backend, we do not change the
1432          * link status.
1433          *
1434          * This behavior is compatible with qemu vlans where there could be
1435          * multiple clients that can still communicate with each other in
1436          * disconnected mode. For now maintain this compatibility.
1437          */
1438         if (nc->peer->info->type == NET_CLIENT_DRIVER_NIC) {
1439             for (i = 0; i < queues; i++) {
1440                 ncs[i]->peer->link_down = !up;
1441             }
1442         }
1443         if (nc->peer->info->link_status_changed) {
1444             nc->peer->info->link_status_changed(nc->peer);
1445         }
1446     }
1447 }
1448 
1449 static void net_vm_change_state_handler(void *opaque, int running,
1450                                         RunState state)
1451 {
1452     NetClientState *nc;
1453     NetClientState *tmp;
1454 
1455     QTAILQ_FOREACH_SAFE(nc, &net_clients, next, tmp) {
1456         if (running) {
1457             /* Flush queued packets and wake up backends. */
1458             if (nc->peer && qemu_can_send_packet(nc)) {
1459                 qemu_flush_queued_packets(nc->peer);
1460             }
1461         } else {
1462             /* Complete all queued packets, to guarantee we don't modify
1463              * state later when VM is not running.
1464              */
1465             qemu_flush_or_purge_queued_packets(nc, true);
1466         }
1467     }
1468 }
1469 
1470 void net_cleanup(void)
1471 {
1472     NetClientState *nc;
1473 
1474     /* We may del multiple entries during qemu_del_net_client(),
1475      * so QTAILQ_FOREACH_SAFE() is also not safe here.
1476      */
1477     while (!QTAILQ_EMPTY(&net_clients)) {
1478         nc = QTAILQ_FIRST(&net_clients);
1479         if (nc->info->type == NET_CLIENT_DRIVER_NIC) {
1480             qemu_del_nic(qemu_get_nic(nc));
1481         } else {
1482             qemu_del_net_client(nc);
1483         }
1484     }
1485 
1486     qemu_del_vm_change_state_handler(net_change_state_entry);
1487 }
1488 
1489 void net_check_clients(void)
1490 {
1491     NetClientState *nc;
1492     int i;
1493 
1494     net_hub_check_clients();
1495 
1496     QTAILQ_FOREACH(nc, &net_clients, next) {
1497         if (!nc->peer) {
1498             warn_report("%s %s has no peer",
1499                         nc->info->type == NET_CLIENT_DRIVER_NIC
1500                         ? "nic" : "netdev",
1501                         nc->name);
1502         }
1503     }
1504 
1505     /* Check that all NICs requested via -net nic actually got created.
1506      * NICs created via -device don't need to be checked here because
1507      * they are always instantiated.
1508      */
1509     for (i = 0; i < MAX_NICS; i++) {
1510         NICInfo *nd = &nd_table[i];
1511         if (nd->used && !nd->instantiated) {
1512             warn_report("requested NIC (%s, model %s) "
1513                         "was not created (not supported by this machine?)",
1514                         nd->name ? nd->name : "anonymous",
1515                         nd->model ? nd->model : "unspecified");
1516         }
1517     }
1518 }
1519 
1520 static int net_init_client(void *dummy, QemuOpts *opts, Error **errp)
1521 {
1522     Error *local_err = NULL;
1523 
1524     net_client_init(opts, false, &local_err);
1525     if (local_err) {
1526         error_report_err(local_err);
1527         return -1;
1528     }
1529 
1530     return 0;
1531 }
1532 
1533 static int net_init_netdev(void *dummy, QemuOpts *opts, Error **errp)
1534 {
1535     Error *local_err = NULL;
1536     int ret;
1537 
1538     ret = net_client_init(opts, true, &local_err);
1539     if (local_err) {
1540         error_report_err(local_err);
1541         return -1;
1542     }
1543 
1544     return ret;
1545 }
1546 
1547 int net_init_clients(void)
1548 {
1549     QemuOptsList *net = qemu_find_opts("net");
1550 
1551     net_change_state_entry =
1552         qemu_add_vm_change_state_handler(net_vm_change_state_handler, NULL);
1553 
1554     QTAILQ_INIT(&net_clients);
1555 
1556     if (qemu_opts_foreach(qemu_find_opts("netdev"),
1557                           net_init_netdev, NULL, NULL)) {
1558         return -1;
1559     }
1560 
1561     if (qemu_opts_foreach(net, net_init_client, NULL, NULL)) {
1562         return -1;
1563     }
1564 
1565     return 0;
1566 }
1567 
1568 int net_client_parse(QemuOptsList *opts_list, const char *optarg)
1569 {
1570     if (!qemu_opts_parse_noisily(opts_list, optarg, true)) {
1571         return -1;
1572     }
1573 
1574     return 0;
1575 }
1576 
1577 /* From FreeBSD */
1578 /* XXX: optimize */
1579 uint32_t net_crc32(const uint8_t *p, int len)
1580 {
1581     uint32_t crc;
1582     int carry, i, j;
1583     uint8_t b;
1584 
1585     crc = 0xffffffff;
1586     for (i = 0; i < len; i++) {
1587         b = *p++;
1588         for (j = 0; j < 8; j++) {
1589             carry = ((crc & 0x80000000L) ? 1 : 0) ^ (b & 0x01);
1590             crc <<= 1;
1591             b >>= 1;
1592             if (carry) {
1593                 crc = ((crc ^ POLYNOMIAL_BE) | carry);
1594             }
1595         }
1596     }
1597 
1598     return crc;
1599 }
1600 
1601 uint32_t net_crc32_le(const uint8_t *p, int len)
1602 {
1603     uint32_t crc;
1604     int carry, i, j;
1605     uint8_t b;
1606 
1607     crc = 0xffffffff;
1608     for (i = 0; i < len; i++) {
1609         b = *p++;
1610         for (j = 0; j < 8; j++) {
1611             carry = (crc & 0x1) ^ (b & 0x01);
1612             crc >>= 1;
1613             b >>= 1;
1614             if (carry) {
1615                 crc ^= POLYNOMIAL_LE;
1616             }
1617         }
1618     }
1619 
1620     return crc;
1621 }
1622 
1623 QemuOptsList qemu_netdev_opts = {
1624     .name = "netdev",
1625     .implied_opt_name = "type",
1626     .head = QTAILQ_HEAD_INITIALIZER(qemu_netdev_opts.head),
1627     .desc = {
1628         /*
1629          * no elements => accept any params
1630          * validation will happen later
1631          */
1632         { /* end of list */ }
1633     },
1634 };
1635 
1636 QemuOptsList qemu_net_opts = {
1637     .name = "net",
1638     .implied_opt_name = "type",
1639     .head = QTAILQ_HEAD_INITIALIZER(qemu_net_opts.head),
1640     .desc = {
1641         /*
1642          * no elements => accept any params
1643          * validation will happen later
1644          */
1645         { /* end of list */ }
1646     },
1647 };
1648 
1649 void net_socket_rs_init(SocketReadState *rs,
1650                         SocketReadStateFinalize *finalize,
1651                         bool vnet_hdr)
1652 {
1653     rs->state = 0;
1654     rs->vnet_hdr = vnet_hdr;
1655     rs->index = 0;
1656     rs->packet_len = 0;
1657     rs->vnet_hdr_len = 0;
1658     memset(rs->buf, 0, sizeof(rs->buf));
1659     rs->finalize = finalize;
1660 }
1661 
1662 /*
1663  * Returns
1664  * 0: success
1665  * -1: error occurs
1666  */
1667 int net_fill_rstate(SocketReadState *rs, const uint8_t *buf, int size)
1668 {
1669     unsigned int l;
1670 
1671     while (size > 0) {
1672         /* Reassemble a packet from the network.
1673          * 0 = getting length.
1674          * 1 = getting vnet header length.
1675          * 2 = getting data.
1676          */
1677         switch (rs->state) {
1678         case 0:
1679             l = 4 - rs->index;
1680             if (l > size) {
1681                 l = size;
1682             }
1683             memcpy(rs->buf + rs->index, buf, l);
1684             buf += l;
1685             size -= l;
1686             rs->index += l;
1687             if (rs->index == 4) {
1688                 /* got length */
1689                 rs->packet_len = ntohl(*(uint32_t *)rs->buf);
1690                 rs->index = 0;
1691                 if (rs->vnet_hdr) {
1692                     rs->state = 1;
1693                 } else {
1694                     rs->state = 2;
1695                     rs->vnet_hdr_len = 0;
1696                 }
1697             }
1698             break;
1699         case 1:
1700             l = 4 - rs->index;
1701             if (l > size) {
1702                 l = size;
1703             }
1704             memcpy(rs->buf + rs->index, buf, l);
1705             buf += l;
1706             size -= l;
1707             rs->index += l;
1708             if (rs->index == 4) {
1709                 /* got vnet header length */
1710                 rs->vnet_hdr_len = ntohl(*(uint32_t *)rs->buf);
1711                 rs->index = 0;
1712                 rs->state = 2;
1713             }
1714             break;
1715         case 2:
1716             l = rs->packet_len - rs->index;
1717             if (l > size) {
1718                 l = size;
1719             }
1720             if (rs->index + l <= sizeof(rs->buf)) {
1721                 memcpy(rs->buf + rs->index, buf, l);
1722             } else {
1723                 fprintf(stderr, "serious error: oversized packet received,"
1724                     "connection terminated.\n");
1725                 rs->index = rs->state = 0;
1726                 return -1;
1727             }
1728 
1729             rs->index += l;
1730             buf += l;
1731             size -= l;
1732             if (rs->index >= rs->packet_len) {
1733                 rs->index = 0;
1734                 rs->state = 0;
1735                 assert(rs->finalize);
1736                 rs->finalize(rs);
1737             }
1738             break;
1739         }
1740     }
1741 
1742     assert(size == 0);
1743     return 0;
1744 }
1745