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