xilinx_ethlite: intermediate merge fixup
[qemu-kvm/markmc.git] / net.c
blob0ded1a4a45ca91c540ed57909f5ee4eacca62544
1 /*
2 * QEMU System Emulator
4 * Copyright (c) 2003-2008 Fabrice Bellard
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:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
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.
24 #include <unistd.h>
25 #include <fcntl.h>
26 #include <signal.h>
27 #include <time.h>
28 #include <errno.h>
29 #include <sys/time.h>
30 #include <zlib.h>
32 /* Needed early for CONFIG_BSD etc. */
33 #include "config-host.h"
35 #ifndef _WIN32
36 #include <sys/times.h>
37 #include <sys/wait.h>
38 #include <termios.h>
39 #include <sys/mman.h>
40 #include <sys/ioctl.h>
41 #include <sys/resource.h>
42 #include <sys/socket.h>
43 #include <netinet/in.h>
44 #include <net/if.h>
45 #ifdef __NetBSD__
46 #include <net/if_tap.h>
47 #endif
48 #ifdef __linux__
49 #include <linux/if_tun.h>
50 #endif
51 #include <arpa/inet.h>
52 #include <dirent.h>
53 #include <netdb.h>
54 #include <sys/select.h>
55 #ifdef CONFIG_BSD
56 #include <sys/stat.h>
57 #if defined(__FreeBSD__) || defined(__DragonFly__)
58 #include <libutil.h>
59 #else
60 #include <util.h>
61 #endif
62 #elif defined (__GLIBC__) && defined (__FreeBSD_kernel__)
63 #include <freebsd/stdlib.h>
64 #else
65 #ifdef __linux__
66 #include <pty.h>
67 #include <malloc.h>
68 #include <linux/rtc.h>
70 /* For the benefit of older linux systems which don't supply it,
71 we use a local copy of hpet.h. */
72 /* #include <linux/hpet.h> */
73 #include "hpet.h"
75 #include <linux/ppdev.h>
76 #include <linux/parport.h>
77 #endif
78 #ifdef __sun__
79 #include <sys/stat.h>
80 #include <sys/ethernet.h>
81 #include <sys/sockio.h>
82 #include <netinet/arp.h>
83 #include <netinet/in.h>
84 #include <netinet/in_systm.h>
85 #include <netinet/ip.h>
86 #include <netinet/ip_icmp.h> // must come after ip.h
87 #include <netinet/udp.h>
88 #include <netinet/tcp.h>
89 #include <net/if.h>
90 #include <syslog.h>
91 #include <stropts.h>
92 #endif
93 #endif
94 #endif
96 #if defined(__OpenBSD__)
97 #include <util.h>
98 #endif
100 #if defined(CONFIG_VDE)
101 #include <libvdeplug.h>
102 #endif
104 // FIXME: #include "qemu-kvm.h"
105 #include "qemu-common.h"
106 #include "net.h"
107 #include "monitor.h"
108 #include "sysemu.h"
109 #include "qemu-timer.h"
110 #include "qemu-char.h"
111 #include "audio/audio.h"
112 #include "qemu_socket.h"
113 #include "qemu-log.h"
114 #include "qemu-config.h"
116 #include "slirp/libslirp.h"
118 static QTAILQ_HEAD(, VLANState) vlans;
119 static QTAILQ_HEAD(, VLANClientState) non_vlan_clients;
121 /***********************************************************/
122 /* network device redirectors */
124 #if defined(DEBUG_NET) || defined(DEBUG_SLIRP)
125 static void hex_dump(FILE *f, const uint8_t *buf, int size)
127 int len, i, j, c;
129 for(i=0;i<size;i+=16) {
130 len = size - i;
131 if (len > 16)
132 len = 16;
133 fprintf(f, "%08x ", i);
134 for(j=0;j<16;j++) {
135 if (j < len)
136 fprintf(f, " %02x", buf[i+j]);
137 else
138 fprintf(f, " ");
140 fprintf(f, " ");
141 for(j=0;j<len;j++) {
142 c = buf[i+j];
143 if (c < ' ' || c > '~')
144 c = '.';
145 fprintf(f, "%c", c);
147 fprintf(f, "\n");
150 #endif
152 static int parse_macaddr(uint8_t *macaddr, const char *p)
154 int i;
155 char *last_char;
156 long int offset;
158 errno = 0;
159 offset = strtol(p, &last_char, 0);
160 if (0 == errno && '\0' == *last_char &&
161 offset >= 0 && offset <= 0xFFFFFF) {
162 macaddr[3] = (offset & 0xFF0000) >> 16;
163 macaddr[4] = (offset & 0xFF00) >> 8;
164 macaddr[5] = offset & 0xFF;
165 return 0;
166 } else {
167 for(i = 0; i < 6; i++) {
168 macaddr[i] = strtol(p, (char **)&p, 16);
169 if (i == 5) {
170 if (*p != '\0')
171 return -1;
172 } else {
173 if (*p != ':' && *p != '-')
174 return -1;
175 p++;
178 return 0;
181 return -1;
184 static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
186 const char *p, *p1;
187 int len;
188 p = *pp;
189 p1 = strchr(p, sep);
190 if (!p1)
191 return -1;
192 len = p1 - p;
193 p1++;
194 if (buf_size > 0) {
195 if (len > buf_size - 1)
196 len = buf_size - 1;
197 memcpy(buf, p, len);
198 buf[len] = '\0';
200 *pp = p1;
201 return 0;
204 int parse_host_src_port(struct sockaddr_in *haddr,
205 struct sockaddr_in *saddr,
206 const char *input_str)
208 char *str = strdup(input_str);
209 char *host_str = str;
210 char *src_str;
211 const char *src_str2;
212 char *ptr;
215 * Chop off any extra arguments at the end of the string which
216 * would start with a comma, then fill in the src port information
217 * if it was provided else use the "any address" and "any port".
219 if ((ptr = strchr(str,',')))
220 *ptr = '\0';
222 if ((src_str = strchr(input_str,'@'))) {
223 *src_str = '\0';
224 src_str++;
227 if (parse_host_port(haddr, host_str) < 0)
228 goto fail;
230 src_str2 = src_str;
231 if (!src_str || *src_str == '\0')
232 src_str2 = ":0";
234 if (parse_host_port(saddr, src_str2) < 0)
235 goto fail;
237 free(str);
238 return(0);
240 fail:
241 free(str);
242 return -1;
245 int parse_host_port(struct sockaddr_in *saddr, const char *str)
247 char buf[512];
248 struct hostent *he;
249 const char *p, *r;
250 int port;
252 p = str;
253 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
254 return -1;
255 saddr->sin_family = AF_INET;
256 if (buf[0] == '\0') {
257 saddr->sin_addr.s_addr = 0;
258 } else {
259 if (qemu_isdigit(buf[0])) {
260 if (!inet_aton(buf, &saddr->sin_addr))
261 return -1;
262 } else {
263 if ((he = gethostbyname(buf)) == NULL)
264 return - 1;
265 saddr->sin_addr = *(struct in_addr *)he->h_addr;
268 port = strtol(p, (char **)&r, 0);
269 if (r == p)
270 return -1;
271 saddr->sin_port = htons(port);
272 return 0;
275 void qemu_format_nic_info_str(VLANClientState *vc, uint8_t macaddr[6])
277 snprintf(vc->info_str, sizeof(vc->info_str),
278 "model=%s,macaddr=%02x:%02x:%02x:%02x:%02x:%02x",
279 vc->model,
280 macaddr[0], macaddr[1], macaddr[2],
281 macaddr[3], macaddr[4], macaddr[5]);
284 void qemu_macaddr_default_if_unset(MACAddr *macaddr)
286 static int index = 0;
287 static const MACAddr zero = { .a = { 0,0,0,0,0,0 } };
289 if (memcmp(macaddr, &zero, sizeof(zero)) != 0)
290 return;
291 macaddr->a[0] = 0x52;
292 macaddr->a[1] = 0x54;
293 macaddr->a[2] = 0x00;
294 macaddr->a[3] = 0x12;
295 macaddr->a[4] = 0x34;
296 macaddr->a[5] = 0x56 + index++;
299 static char *assign_name(VLANClientState *vc1, const char *model)
301 VLANState *vlan;
302 char buf[256];
303 int id = 0;
305 QTAILQ_FOREACH(vlan, &vlans, next) {
306 VLANClientState *vc;
308 QTAILQ_FOREACH(vc, &vlan->clients, next) {
309 if (vc != vc1 && strcmp(vc->model, model) == 0) {
310 id++;
315 snprintf(buf, sizeof(buf), "%s.%d", model, id);
317 return qemu_strdup(buf);
320 static ssize_t qemu_deliver_packet(VLANClientState *sender,
321 const uint8_t *data,
322 size_t size,
323 int raw,
324 void *opaque);
325 static ssize_t qemu_deliver_packet_iov(VLANClientState *sender,
326 const struct iovec *iov,
327 int iovcnt,
328 void *opaque);
330 VLANClientState *qemu_new_vlan_client(VLANState *vlan,
331 VLANClientState *peer,
332 const char *model,
333 const char *name,
334 NetCanReceive *can_receive,
335 NetReceive *receive,
336 NetReceiveIOV *receive_iov,
337 NetCleanup *cleanup,
338 void *opaque)
340 VLANClientState *vc;
342 vc = qemu_mallocz(sizeof(VLANClientState));
344 vc->model = qemu_strdup(model);
345 if (name)
346 vc->name = qemu_strdup(name);
347 else
348 vc->name = assign_name(vc, model);
349 vc->can_receive = can_receive;
350 vc->receive = receive;
351 vc->receive_iov = receive_iov;
352 vc->cleanup = cleanup;
353 vc->opaque = opaque;
355 if (vlan) {
356 assert(!peer);
357 vc->vlan = vlan;
358 QTAILQ_INSERT_TAIL(&vc->vlan->clients, vc, next);
359 } else {
360 if (peer) {
361 vc->peer = peer;
362 peer->peer = vc;
364 QTAILQ_INSERT_TAIL(&non_vlan_clients, vc, next);
366 vc->send_queue = qemu_new_net_queue(qemu_deliver_packet,
367 qemu_deliver_packet_iov,
368 vc);
371 return vc;
374 void qemu_del_vlan_client(VLANClientState *vc)
376 if (vc->vlan) {
377 QTAILQ_REMOVE(&vc->vlan->clients, vc, next);
378 } else {
379 if (vc->send_queue) {
380 qemu_del_net_queue(vc->send_queue);
382 QTAILQ_REMOVE(&non_vlan_clients, vc, next);
383 if (vc->peer) {
384 vc->peer->peer = NULL;
388 if (vc->cleanup) {
389 vc->cleanup(vc);
392 qemu_free(vc->name);
393 qemu_free(vc->model);
394 qemu_free(vc);
397 VLANClientState *qemu_find_vlan_client(VLANState *vlan, void *opaque)
399 VLANClientState *vc;
401 QTAILQ_FOREACH(vc, &vlan->clients, next) {
402 if (vc->opaque == opaque) {
403 return vc;
407 return NULL;
410 static VLANClientState *
411 qemu_find_vlan_client_by_name(Monitor *mon, int vlan_id,
412 const char *client_str)
414 VLANState *vlan;
415 VLANClientState *vc;
417 vlan = qemu_find_vlan(vlan_id, 0);
418 if (!vlan) {
419 monitor_printf(mon, "unknown VLAN %d\n", vlan_id);
420 return NULL;
423 QTAILQ_FOREACH(vc, &vlan->clients, next) {
424 if (!strcmp(vc->name, client_str)) {
425 break;
428 if (!vc) {
429 monitor_printf(mon, "can't find device %s on VLAN %d\n",
430 client_str, vlan_id);
433 return vc;
436 int qemu_can_send_packet(VLANClientState *sender)
438 VLANState *vlan = sender->vlan;
439 VLANClientState *vc;
441 if (sender->peer) {
442 if (!sender->peer->can_receive ||
443 sender->peer->can_receive(sender->peer)) {
444 return 1;
445 } else {
446 return 0;
450 if (!sender->vlan) {
451 return 1;
454 QTAILQ_FOREACH(vc, &vlan->clients, next) {
455 if (vc == sender) {
456 continue;
459 /* no can_receive() handler, they can always receive */
460 if (!vc->can_receive || vc->can_receive(vc)) {
461 return 1;
464 return 0;
467 static ssize_t qemu_deliver_packet(VLANClientState *sender,
468 const uint8_t *data,
469 size_t size,
470 int raw,
471 void *opaque)
473 VLANClientState *vc = opaque;
475 if (vc->link_down) {
476 return size;
479 if (raw && vc->receive_raw) {
480 return vc->receive_raw(vc, data, size);
481 } else {
482 return vc->receive(vc, data, size);
486 static ssize_t qemu_vlan_deliver_packet(VLANClientState *sender,
487 const uint8_t *buf,
488 size_t size,
489 int raw,
490 void *opaque)
492 VLANState *vlan = opaque;
493 VLANClientState *vc;
494 int ret = -1;
496 QTAILQ_FOREACH(vc, &vlan->clients, next) {
497 ssize_t len;
499 if (vc == sender) {
500 continue;
503 if (vc->link_down) {
504 ret = size;
505 continue;
508 if (raw && vc->receive_raw) {
509 len = vc->receive_raw(vc, buf, size);
510 } else {
511 len = vc->receive(vc, buf, size);
514 ret = (ret >= 0) ? ret : len;
517 return ret;
520 void qemu_purge_queued_packets(VLANClientState *vc)
522 NetQueue *queue;
524 if (!vc->peer && !vc->vlan) {
525 return;
528 if (vc->peer) {
529 queue = vc->peer->send_queue;
530 } else {
531 queue = vc->vlan->send_queue;
534 qemu_net_queue_purge(queue, vc);
537 void qemu_flush_queued_packets(VLANClientState *vc)
539 NetQueue *queue;
541 if (vc->vlan) {
542 queue = vc->vlan->send_queue;
543 } else {
544 queue = vc->send_queue;
547 qemu_net_queue_flush(queue);
550 static ssize_t qemu_send_packet_async2(VLANClientState *sender,
551 const uint8_t *buf, int size, int raw,
552 NetPacketSent *sent_cb)
554 NetQueue *queue;
556 #ifdef DEBUG_NET
557 printf("qemu_send_packet_async:\n");
558 hex_dump(stdout, buf, size);
559 #endif
561 if (sender->link_down || (!sender->peer && !sender->vlan)) {
562 return size;
565 if (sender->peer) {
566 queue = sender->peer->send_queue;
567 } else {
568 queue = sender->vlan->send_queue;
571 return qemu_net_queue_send(queue, sender, buf, size, raw, sent_cb);
574 ssize_t qemu_send_packet_async(VLANClientState *sender,
575 const uint8_t *buf, int size,
576 NetPacketSent *sent_cb)
578 return qemu_send_packet_async2(sender, buf, size, 0, sent_cb);
581 ssize_t qemu_send_packet(VLANClientState *sender, const uint8_t *buf, int size)
583 return qemu_send_packet_async2(sender, buf, size, 0, NULL);
586 ssize_t qemu_send_packet_raw(VLANClientState *sender, const uint8_t *buf, int size)
588 return qemu_send_packet_async2(sender, buf, size, 1, NULL);
591 static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov,
592 int iovcnt)
594 uint8_t buffer[4096];
595 size_t offset = 0;
596 int i;
598 for (i = 0; i < iovcnt; i++) {
599 size_t len;
601 len = MIN(sizeof(buffer) - offset, iov[i].iov_len);
602 memcpy(buffer + offset, iov[i].iov_base, len);
603 offset += len;
606 return vc->receive(vc, buffer, offset);
609 static ssize_t calc_iov_length(const struct iovec *iov, int iovcnt)
611 size_t offset = 0;
612 int i;
614 for (i = 0; i < iovcnt; i++)
615 offset += iov[i].iov_len;
616 return offset;
619 static ssize_t qemu_deliver_packet_iov(VLANClientState *sender,
620 const struct iovec *iov,
621 int iovcnt,
622 void *opaque)
624 VLANClientState *vc = opaque;
626 if (vc->link_down) {
627 return calc_iov_length(iov, iovcnt);
630 if (vc->receive_iov) {
631 return vc->receive_iov(vc, iov, iovcnt);
632 } else {
633 return vc_sendv_compat(vc, iov, iovcnt);
637 static ssize_t qemu_vlan_deliver_packet_iov(VLANClientState *sender,
638 const struct iovec *iov,
639 int iovcnt,
640 void *opaque)
642 VLANState *vlan = opaque;
643 VLANClientState *vc;
644 ssize_t ret = -1;
646 QTAILQ_FOREACH(vc, &vlan->clients, next) {
647 ssize_t len;
649 if (vc == sender) {
650 continue;
653 if (vc->link_down) {
654 ret = calc_iov_length(iov, iovcnt);
655 continue;
658 if (vc->receive_iov) {
659 len = vc->receive_iov(vc, iov, iovcnt);
660 } else {
661 len = vc_sendv_compat(vc, iov, iovcnt);
664 ret = (ret >= 0) ? ret : len;
667 return ret;
670 ssize_t qemu_sendv_packet_async(VLANClientState *sender,
671 const struct iovec *iov, int iovcnt,
672 NetPacketSent *sent_cb)
674 NetQueue *queue;
676 if (sender->link_down || (!sender->peer && !sender->vlan)) {
677 return calc_iov_length(iov, iovcnt);
680 if (sender->peer) {
681 queue = sender->peer->send_queue;
682 } else {
683 queue = sender->vlan->send_queue;
686 return qemu_net_queue_send_iov(queue, sender, iov, iovcnt, sent_cb);
689 ssize_t
690 qemu_sendv_packet(VLANClientState *vc, const struct iovec *iov, int iovcnt)
692 return qemu_sendv_packet_async(vc, iov, iovcnt, NULL);
695 #if defined(CONFIG_SLIRP)
697 /* slirp network adapter */
699 #define SLIRP_CFG_HOSTFWD 1
700 #define SLIRP_CFG_LEGACY 2
702 struct slirp_config_str {
703 struct slirp_config_str *next;
704 int flags;
705 char str[1024];
706 int legacy_format;
709 typedef struct SlirpState {
710 QTAILQ_ENTRY(SlirpState) entry;
711 VLANClientState *vc;
712 Slirp *slirp;
713 #ifndef _WIN32
714 char smb_dir[128];
715 #endif
716 } SlirpState;
718 static struct slirp_config_str *slirp_configs;
719 const char *legacy_tftp_prefix;
720 const char *legacy_bootp_filename;
721 static QTAILQ_HEAD(slirp_stacks, SlirpState) slirp_stacks =
722 QTAILQ_HEAD_INITIALIZER(slirp_stacks);
724 static int slirp_hostfwd(SlirpState *s, const char *redir_str,
725 int legacy_format);
726 static int slirp_guestfwd(SlirpState *s, const char *config_str,
727 int legacy_format);
729 #ifndef _WIN32
730 static const char *legacy_smb_export;
732 static int slirp_smb(SlirpState *s, const char *exported_dir,
733 struct in_addr vserver_addr);
734 static void slirp_smb_cleanup(SlirpState *s);
735 #else
736 static inline void slirp_smb_cleanup(SlirpState *s) { }
737 #endif
739 int slirp_can_output(void *opaque)
741 SlirpState *s = opaque;
743 return qemu_can_send_packet(s->vc);
746 void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len)
748 SlirpState *s = opaque;
750 #ifdef DEBUG_SLIRP
751 printf("slirp output:\n");
752 hex_dump(stdout, pkt, pkt_len);
753 #endif
754 qemu_send_packet(s->vc, pkt, pkt_len);
757 static ssize_t slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
759 SlirpState *s = vc->opaque;
761 #ifdef DEBUG_SLIRP
762 printf("slirp input:\n");
763 hex_dump(stdout, buf, size);
764 #endif
765 slirp_input(s->slirp, buf, size);
766 return size;
769 static void net_slirp_cleanup(VLANClientState *vc)
771 SlirpState *s = vc->opaque;
773 slirp_cleanup(s->slirp);
774 slirp_smb_cleanup(s);
775 QTAILQ_REMOVE(&slirp_stacks, s, entry);
776 qemu_free(s);
779 static int net_slirp_init(VLANState *vlan, const char *model,
780 const char *name, int restricted,
781 const char *vnetwork, const char *vhost,
782 const char *vhostname, const char *tftp_export,
783 const char *bootfile, const char *vdhcp_start,
784 const char *vnameserver, const char *smb_export,
785 const char *vsmbserver)
787 /* default settings according to historic slirp */
788 struct in_addr net = { .s_addr = htonl(0x0a000200) }; /* 10.0.2.0 */
789 struct in_addr mask = { .s_addr = htonl(0xffffff00) }; /* 255.255.255.0 */
790 struct in_addr host = { .s_addr = htonl(0x0a000202) }; /* 10.0.2.2 */
791 struct in_addr dhcp = { .s_addr = htonl(0x0a00020f) }; /* 10.0.2.15 */
792 struct in_addr dns = { .s_addr = htonl(0x0a000203) }; /* 10.0.2.3 */
793 #ifndef _WIN32
794 struct in_addr smbsrv = { .s_addr = 0 };
795 #endif
796 SlirpState *s;
797 char buf[20];
798 uint32_t addr;
799 int shift;
800 char *end;
801 struct slirp_config_str *config;
803 if (!tftp_export) {
804 tftp_export = legacy_tftp_prefix;
806 if (!bootfile) {
807 bootfile = legacy_bootp_filename;
810 if (vnetwork) {
811 if (get_str_sep(buf, sizeof(buf), &vnetwork, '/') < 0) {
812 if (!inet_aton(vnetwork, &net)) {
813 return -1;
815 addr = ntohl(net.s_addr);
816 if (!(addr & 0x80000000)) {
817 mask.s_addr = htonl(0xff000000); /* class A */
818 } else if ((addr & 0xfff00000) == 0xac100000) {
819 mask.s_addr = htonl(0xfff00000); /* priv. 172.16.0.0/12 */
820 } else if ((addr & 0xc0000000) == 0x80000000) {
821 mask.s_addr = htonl(0xffff0000); /* class B */
822 } else if ((addr & 0xffff0000) == 0xc0a80000) {
823 mask.s_addr = htonl(0xffff0000); /* priv. 192.168.0.0/16 */
824 } else if ((addr & 0xffff0000) == 0xc6120000) {
825 mask.s_addr = htonl(0xfffe0000); /* tests 198.18.0.0/15 */
826 } else if ((addr & 0xe0000000) == 0xe0000000) {
827 mask.s_addr = htonl(0xffffff00); /* class C */
828 } else {
829 mask.s_addr = htonl(0xfffffff0); /* multicast/reserved */
831 } else {
832 if (!inet_aton(buf, &net)) {
833 return -1;
835 shift = strtol(vnetwork, &end, 10);
836 if (*end != '\0') {
837 if (!inet_aton(vnetwork, &mask)) {
838 return -1;
840 } else if (shift < 4 || shift > 32) {
841 return -1;
842 } else {
843 mask.s_addr = htonl(0xffffffff << (32 - shift));
846 net.s_addr &= mask.s_addr;
847 host.s_addr = net.s_addr | (htonl(0x0202) & ~mask.s_addr);
848 dhcp.s_addr = net.s_addr | (htonl(0x020f) & ~mask.s_addr);
849 dns.s_addr = net.s_addr | (htonl(0x0203) & ~mask.s_addr);
852 if (vhost && !inet_aton(vhost, &host)) {
853 return -1;
855 if ((host.s_addr & mask.s_addr) != net.s_addr) {
856 return -1;
859 if (vdhcp_start && !inet_aton(vdhcp_start, &dhcp)) {
860 return -1;
862 if ((dhcp.s_addr & mask.s_addr) != net.s_addr ||
863 dhcp.s_addr == host.s_addr || dhcp.s_addr == dns.s_addr) {
864 return -1;
867 if (vnameserver && !inet_aton(vnameserver, &dns)) {
868 return -1;
870 if ((dns.s_addr & mask.s_addr) != net.s_addr ||
871 dns.s_addr == host.s_addr) {
872 return -1;
875 #ifndef _WIN32
876 if (vsmbserver && !inet_aton(vsmbserver, &smbsrv)) {
877 return -1;
879 #endif
881 s = qemu_mallocz(sizeof(SlirpState));
882 s->slirp = slirp_init(restricted, net, mask, host, vhostname,
883 tftp_export, bootfile, dhcp, dns, s);
884 QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry);
886 for (config = slirp_configs; config; config = config->next) {
887 if (config->flags & SLIRP_CFG_HOSTFWD) {
888 if (slirp_hostfwd(s, config->str,
889 config->flags & SLIRP_CFG_LEGACY) < 0)
890 return -1;
891 } else {
892 if (slirp_guestfwd(s, config->str,
893 config->flags & SLIRP_CFG_LEGACY) < 0)
894 return -1;
897 #ifndef _WIN32
898 if (!smb_export) {
899 smb_export = legacy_smb_export;
901 if (smb_export) {
902 if (slirp_smb(s, smb_export, smbsrv) < 0)
903 return -1;
905 #endif
907 s->vc = qemu_new_vlan_client(vlan, NULL, model, name, NULL,
908 slirp_receive, NULL,
909 net_slirp_cleanup, s);
910 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
911 "net=%s, restricted=%c", inet_ntoa(net), restricted ? 'y' : 'n');
912 return 0;
915 static SlirpState *slirp_lookup(Monitor *mon, const char *vlan,
916 const char *stack)
918 VLANClientState *vc;
920 if (vlan) {
921 vc = qemu_find_vlan_client_by_name(mon, strtol(vlan, NULL, 0), stack);
922 if (!vc) {
923 return NULL;
925 if (strcmp(vc->model, "user")) {
926 monitor_printf(mon, "invalid device specified\n");
927 return NULL;
929 return vc->opaque;
930 } else {
931 if (QTAILQ_EMPTY(&slirp_stacks)) {
932 monitor_printf(mon, "user mode network stack not in use\n");
933 return NULL;
935 return QTAILQ_FIRST(&slirp_stacks);
939 void net_slirp_hostfwd_remove(Monitor *mon, const QDict *qdict)
941 struct in_addr host_addr = { .s_addr = INADDR_ANY };
942 int host_port;
943 char buf[256] = "";
944 const char *src_str, *p;
945 SlirpState *s;
946 int is_udp = 0;
947 int err;
948 const char *arg1 = qdict_get_str(qdict, "arg1");
949 const char *arg2 = qdict_get_try_str(qdict, "arg2");
950 const char *arg3 = qdict_get_try_str(qdict, "arg3");
952 if (arg2) {
953 s = slirp_lookup(mon, arg1, arg2);
954 src_str = arg3;
955 } else {
956 s = slirp_lookup(mon, NULL, NULL);
957 src_str = arg1;
959 if (!s) {
960 return;
963 if (!src_str || !src_str[0])
964 goto fail_syntax;
966 p = src_str;
967 get_str_sep(buf, sizeof(buf), &p, ':');
969 if (!strcmp(buf, "tcp") || buf[0] == '\0') {
970 is_udp = 0;
971 } else if (!strcmp(buf, "udp")) {
972 is_udp = 1;
973 } else {
974 goto fail_syntax;
977 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
978 goto fail_syntax;
980 if (buf[0] != '\0' && !inet_aton(buf, &host_addr)) {
981 goto fail_syntax;
984 host_port = atoi(p);
986 err = slirp_remove_hostfwd(QTAILQ_FIRST(&slirp_stacks)->slirp, is_udp,
987 host_addr, host_port);
989 monitor_printf(mon, "host forwarding rule for %s %s\n", src_str,
990 err ? "removed" : "not found");
991 return;
993 fail_syntax:
994 monitor_printf(mon, "invalid format\n");
997 static int slirp_hostfwd(SlirpState *s, const char *redir_str,
998 int legacy_format)
1000 struct in_addr host_addr = { .s_addr = INADDR_ANY };
1001 struct in_addr guest_addr = { .s_addr = 0 };
1002 int host_port, guest_port;
1003 const char *p;
1004 char buf[256];
1005 int is_udp;
1006 char *end;
1008 p = redir_str;
1009 if (!p || get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1010 goto fail_syntax;
1012 if (!strcmp(buf, "tcp") || buf[0] == '\0') {
1013 is_udp = 0;
1014 } else if (!strcmp(buf, "udp")) {
1015 is_udp = 1;
1016 } else {
1017 goto fail_syntax;
1020 if (!legacy_format) {
1021 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1022 goto fail_syntax;
1024 if (buf[0] != '\0' && !inet_aton(buf, &host_addr)) {
1025 goto fail_syntax;
1029 if (get_str_sep(buf, sizeof(buf), &p, legacy_format ? ':' : '-') < 0) {
1030 goto fail_syntax;
1032 host_port = strtol(buf, &end, 0);
1033 if (*end != '\0' || host_port < 1 || host_port > 65535) {
1034 goto fail_syntax;
1037 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1038 goto fail_syntax;
1040 if (buf[0] != '\0' && !inet_aton(buf, &guest_addr)) {
1041 goto fail_syntax;
1044 guest_port = strtol(p, &end, 0);
1045 if (*end != '\0' || guest_port < 1 || guest_port > 65535) {
1046 goto fail_syntax;
1049 if (slirp_add_hostfwd(s->slirp, is_udp, host_addr, host_port, guest_addr,
1050 guest_port) < 0) {
1051 qemu_error("could not set up host forwarding rule '%s'\n",
1052 redir_str);
1053 return -1;
1055 return 0;
1057 fail_syntax:
1058 qemu_error("invalid host forwarding rule '%s'\n", redir_str);
1059 return -1;
1062 void net_slirp_hostfwd_add(Monitor *mon, const QDict *qdict)
1064 const char *redir_str;
1065 SlirpState *s;
1066 const char *arg1 = qdict_get_str(qdict, "arg1");
1067 const char *arg2 = qdict_get_try_str(qdict, "arg2");
1068 const char *arg3 = qdict_get_try_str(qdict, "arg3");
1070 if (arg2) {
1071 s = slirp_lookup(mon, arg1, arg2);
1072 redir_str = arg3;
1073 } else {
1074 s = slirp_lookup(mon, NULL, NULL);
1075 redir_str = arg1;
1077 if (s) {
1078 slirp_hostfwd(s, redir_str, 0);
1083 int net_slirp_redir(const char *redir_str)
1085 struct slirp_config_str *config;
1087 if (QTAILQ_EMPTY(&slirp_stacks)) {
1088 config = qemu_malloc(sizeof(*config));
1089 pstrcpy(config->str, sizeof(config->str), redir_str);
1090 config->flags = SLIRP_CFG_HOSTFWD | SLIRP_CFG_LEGACY;
1091 config->next = slirp_configs;
1092 slirp_configs = config;
1093 return 0;
1096 return slirp_hostfwd(QTAILQ_FIRST(&slirp_stacks), redir_str, 1);
1099 #ifndef _WIN32
1101 /* automatic user mode samba server configuration */
1102 static void slirp_smb_cleanup(SlirpState *s)
1104 char cmd[128];
1106 if (s->smb_dir[0] != '\0') {
1107 snprintf(cmd, sizeof(cmd), "rm -rf %s", s->smb_dir);
1108 system(cmd);
1109 s->smb_dir[0] = '\0';
1113 static int slirp_smb(SlirpState* s, const char *exported_dir,
1114 struct in_addr vserver_addr)
1116 static int instance;
1117 char smb_conf[128];
1118 char smb_cmdline[128];
1119 FILE *f;
1121 snprintf(s->smb_dir, sizeof(s->smb_dir), "/tmp/qemu-smb.%ld-%d",
1122 (long)getpid(), instance++);
1123 if (mkdir(s->smb_dir, 0700) < 0) {
1124 qemu_error("could not create samba server dir '%s'\n", s->smb_dir);
1125 return -1;
1127 snprintf(smb_conf, sizeof(smb_conf), "%s/%s", s->smb_dir, "smb.conf");
1129 f = fopen(smb_conf, "w");
1130 if (!f) {
1131 slirp_smb_cleanup(s);
1132 qemu_error("could not create samba server configuration file '%s'\n",
1133 smb_conf);
1134 return -1;
1136 fprintf(f,
1137 "[global]\n"
1138 "private dir=%s\n"
1139 "smb ports=0\n"
1140 "socket address=127.0.0.1\n"
1141 "pid directory=%s\n"
1142 "lock directory=%s\n"
1143 "log file=%s/log.smbd\n"
1144 "smb passwd file=%s/smbpasswd\n"
1145 "security = share\n"
1146 "[qemu]\n"
1147 "path=%s\n"
1148 "read only=no\n"
1149 "guest ok=yes\n",
1150 s->smb_dir,
1151 s->smb_dir,
1152 s->smb_dir,
1153 s->smb_dir,
1154 s->smb_dir,
1155 exported_dir
1157 fclose(f);
1159 snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
1160 SMBD_COMMAND, smb_conf);
1162 if (slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 139) < 0) {
1163 slirp_smb_cleanup(s);
1164 qemu_error("conflicting/invalid smbserver address\n");
1165 return -1;
1167 return 0;
1170 /* automatic user mode samba server configuration (legacy interface) */
1171 int net_slirp_smb(const char *exported_dir)
1173 struct in_addr vserver_addr = { .s_addr = 0 };
1175 if (legacy_smb_export) {
1176 fprintf(stderr, "-smb given twice\n");
1177 return -1;
1179 legacy_smb_export = exported_dir;
1180 if (!QTAILQ_EMPTY(&slirp_stacks)) {
1181 return slirp_smb(QTAILQ_FIRST(&slirp_stacks), exported_dir,
1182 vserver_addr);
1184 return 0;
1187 #endif /* !defined(_WIN32) */
1189 struct GuestFwd {
1190 CharDriverState *hd;
1191 struct in_addr server;
1192 int port;
1193 Slirp *slirp;
1196 static int guestfwd_can_read(void *opaque)
1198 struct GuestFwd *fwd = opaque;
1199 return slirp_socket_can_recv(fwd->slirp, fwd->server, fwd->port);
1202 static void guestfwd_read(void *opaque, const uint8_t *buf, int size)
1204 struct GuestFwd *fwd = opaque;
1205 slirp_socket_recv(fwd->slirp, fwd->server, fwd->port, buf, size);
1208 static int slirp_guestfwd(SlirpState *s, const char *config_str,
1209 int legacy_format)
1211 struct in_addr server = { .s_addr = 0 };
1212 struct GuestFwd *fwd;
1213 const char *p;
1214 char buf[128];
1215 char *end;
1216 int port;
1218 p = config_str;
1219 if (legacy_format) {
1220 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1221 goto fail_syntax;
1223 } else {
1224 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1225 goto fail_syntax;
1227 if (strcmp(buf, "tcp") && buf[0] != '\0') {
1228 goto fail_syntax;
1230 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1231 goto fail_syntax;
1233 if (buf[0] != '\0' && !inet_aton(buf, &server)) {
1234 goto fail_syntax;
1236 if (get_str_sep(buf, sizeof(buf), &p, '-') < 0) {
1237 goto fail_syntax;
1240 port = strtol(buf, &end, 10);
1241 if (*end != '\0' || port < 1 || port > 65535) {
1242 goto fail_syntax;
1245 fwd = qemu_malloc(sizeof(struct GuestFwd));
1246 snprintf(buf, sizeof(buf), "guestfwd.tcp:%d", port);
1247 fwd->hd = qemu_chr_open(buf, p, NULL);
1248 if (!fwd->hd) {
1249 qemu_error("could not open guest forwarding device '%s'\n", buf);
1250 qemu_free(fwd);
1251 return -1;
1254 if (slirp_add_exec(s->slirp, 3, fwd->hd, &server, port) < 0) {
1255 qemu_error("conflicting/invalid host:port in guest forwarding "
1256 "rule '%s'\n", config_str);
1257 qemu_free(fwd);
1258 return -1;
1260 fwd->server = server;
1261 fwd->port = port;
1262 fwd->slirp = s->slirp;
1264 qemu_chr_add_handlers(fwd->hd, guestfwd_can_read, guestfwd_read,
1265 NULL, fwd);
1266 return 0;
1268 fail_syntax:
1269 qemu_error("invalid guest forwarding rule '%s'\n", config_str);
1270 return -1;
1273 void do_info_usernet(Monitor *mon)
1275 SlirpState *s;
1277 QTAILQ_FOREACH(s, &slirp_stacks, entry) {
1278 monitor_printf(mon, "VLAN %d (%s):\n", s->vc->vlan->id, s->vc->name);
1279 slirp_connection_info(s->slirp, mon);
1283 #endif /* CONFIG_SLIRP */
1285 #ifdef _WIN32
1287 int tap_has_vnet_hdr(void *opaque)
1289 return 0;
1292 void tap_using_vnet_hdr(void *opaque, int using_vnet_hdr)
1296 int tap_has_ufo(void *opaque)
1298 return 0;
1301 #else /* !defined(_WIN32) */
1303 /* Maximum GSO packet size (64k) plus plenty of room for
1304 * the ethernet and virtio_net headers
1306 #define TAP_BUFSIZE (4096 + 65536)
1308 #ifdef IFF_VNET_HDR
1309 #include <linux/virtio_net.h>
1310 #endif
1312 typedef struct TAPState {
1313 VLANClientState *vc;
1314 int fd;
1315 char down_script[1024];
1316 char down_script_arg[128];
1317 uint8_t buf[TAP_BUFSIZE];
1318 unsigned int read_poll : 1;
1319 unsigned int write_poll : 1;
1320 unsigned int has_vnet_hdr : 1;
1321 unsigned int using_vnet_hdr : 1;
1322 unsigned int has_ufo: 1;
1323 } TAPState;
1325 static int launch_script(const char *setup_script, const char *ifname, int fd);
1327 static int tap_can_send(void *opaque);
1328 static void tap_send(void *opaque);
1329 static void tap_writable(void *opaque);
1331 static void tap_update_fd_handler(TAPState *s)
1333 qemu_set_fd_handler2(s->fd,
1334 s->read_poll ? tap_can_send : NULL,
1335 s->read_poll ? tap_send : NULL,
1336 s->write_poll ? tap_writable : NULL,
1340 static void tap_read_poll(TAPState *s, int enable)
1342 s->read_poll = !!enable;
1343 tap_update_fd_handler(s);
1346 static void tap_write_poll(TAPState *s, int enable)
1348 s->write_poll = !!enable;
1349 tap_update_fd_handler(s);
1352 static void tap_writable(void *opaque)
1354 TAPState *s = opaque;
1356 tap_write_poll(s, 0);
1358 qemu_flush_queued_packets(s->vc);
1361 static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
1362 int iovcnt)
1364 TAPState *s = vc->opaque;
1365 ssize_t len;
1367 do {
1368 len = writev(s->fd, iov, iovcnt);
1369 } while (len == -1 && errno == EINTR);
1371 if (len == -1 && errno == EAGAIN) {
1372 tap_write_poll(s, 1);
1373 return 0;
1376 return len;
1379 static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1381 struct iovec iov[2];
1382 int i = 0;
1384 #ifdef IFF_VNET_HDR
1385 TAPState *s = vc->opaque;
1386 struct virtio_net_hdr hdr = { 0, };
1388 if (s->has_vnet_hdr && !s->using_vnet_hdr) {
1389 iov[i].iov_base = &hdr;
1390 iov[i].iov_len = sizeof(hdr);
1391 i++;
1393 #endif
1395 iov[i].iov_base = (char *) buf;
1396 iov[i].iov_len = size;
1397 i++;
1399 return tap_receive_iov(vc, iov, i);
1402 static ssize_t tap_receive_raw(VLANClientState *vc, const uint8_t *buf, size_t size)
1404 struct iovec iov[2];
1405 int i = 0;
1407 #ifdef IFF_VNET_HDR
1408 TAPState *s = vc->opaque;
1409 struct virtio_net_hdr hdr = { 0, };
1411 if (s->has_vnet_hdr && s->using_vnet_hdr) {
1412 iov[i].iov_base = &hdr;
1413 iov[i].iov_len = sizeof(hdr);
1414 i++;
1416 #endif
1418 iov[i].iov_base = (char *) buf;
1419 iov[i].iov_len = size;
1420 i++;
1422 return tap_receive_iov(vc, iov, i);
1425 static int tap_can_send(void *opaque)
1427 TAPState *s = opaque;
1429 return qemu_can_send_packet(s->vc);
1432 #ifdef __sun__
1433 static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1435 struct strbuf sbuf;
1436 int f = 0;
1438 sbuf.maxlen = maxlen;
1439 sbuf.buf = (char *)buf;
1441 return getmsg(tapfd, NULL, &sbuf, &f) >= 0 ? sbuf.len : -1;
1443 #else
1444 static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1446 return read(tapfd, buf, maxlen);
1448 #endif
1450 static void tap_send_completed(VLANClientState *vc, ssize_t len)
1452 TAPState *s = vc->opaque;
1453 tap_read_poll(s, 1);
1456 static void tap_send(void *opaque)
1458 TAPState *s = opaque;
1459 int size;
1461 do {
1462 uint8_t *buf = s->buf;
1464 size = tap_read_packet(s->fd, s->buf, sizeof(s->buf));
1465 if (size <= 0) {
1466 break;
1469 #ifdef IFF_VNET_HDR
1470 if (s->has_vnet_hdr && !s->using_vnet_hdr) {
1471 buf += sizeof(struct virtio_net_hdr);
1472 size -= sizeof(struct virtio_net_hdr);
1474 #endif
1476 size = qemu_send_packet_async(s->vc, buf, size, tap_send_completed);
1477 if (size == 0) {
1478 tap_read_poll(s, 0);
1480 } while (size > 0);
1483 #ifdef TUNSETSNDBUF
1484 /* sndbuf should be set to a value lower than the tx queue
1485 * capacity of any destination network interface.
1486 * Ethernet NICs generally have txqueuelen=1000, so 1Mb is
1487 * a good default, given a 1500 byte MTU.
1489 #define TAP_DEFAULT_SNDBUF 1024*1024
1491 static int tap_set_sndbuf(TAPState *s, QemuOpts *opts)
1493 int sndbuf;
1495 sndbuf = qemu_opt_get_size(opts, "sndbuf", TAP_DEFAULT_SNDBUF);
1496 if (!sndbuf) {
1497 sndbuf = INT_MAX;
1500 if (ioctl(s->fd, TUNSETSNDBUF, &sndbuf) == -1 && qemu_opt_get(opts, "sndbuf")) {
1501 qemu_error("TUNSETSNDBUF ioctl failed: %s\n", strerror(errno));
1502 return -1;
1504 return 0;
1506 #else
1507 static int tap_set_sndbuf(TAPState *s, QemuOpts *opts)
1509 return 0;
1511 #endif /* TUNSETSNDBUF */
1513 int tap_has_vnet_hdr(void *opaque)
1515 VLANClientState *vc = opaque;
1516 TAPState *s = vc->opaque;
1518 if (vc->receive != tap_receive)
1519 return 0;
1521 return s ? s->has_vnet_hdr : 0;
1524 void tap_using_vnet_hdr(void *opaque, int using_vnet_hdr)
1526 VLANClientState *vc = opaque;
1527 TAPState *s = vc->opaque;
1529 if (vc->receive != tap_receive)
1530 return;
1532 if (!s || !s->has_vnet_hdr)
1533 return;
1535 s->using_vnet_hdr = using_vnet_hdr != 0;
1538 static int tap_probe_vnet_hdr(int fd)
1540 #if defined(TUNGETIFF) && defined(IFF_VNET_HDR)
1541 struct ifreq ifr;
1543 if (ioctl(fd, TUNGETIFF, &ifr) != 0) {
1544 fprintf(stderr, "TUNGETIFF ioctl() failed: %s\n", strerror(errno));
1545 return 0;
1548 return ifr.ifr_flags & IFF_VNET_HDR;
1549 #else
1550 return 0;
1551 #endif
1554 int tap_has_ufo(void *opaque)
1556 VLANClientState *vc = opaque;
1557 TAPState *s = vc->opaque;
1559 return s ? s->has_ufo : 0;
1562 #ifdef TUNSETOFFLOAD
1564 #ifndef TUN_F_UFO
1565 #define TUN_F_UFO 0x10
1566 #endif
1568 static void tap_set_offload(VLANClientState *vc, int csum, int tso4, int tso6,
1569 int ecn, int ufo)
1571 TAPState *s = vc->opaque;
1572 unsigned int offload = 0;
1574 if (csum) {
1575 offload |= TUN_F_CSUM;
1576 if (tso4)
1577 offload |= TUN_F_TSO4;
1578 if (tso6)
1579 offload |= TUN_F_TSO6;
1580 if ((tso4 || tso6) && ecn)
1581 offload |= TUN_F_TSO_ECN;
1582 if (ufo)
1583 offload |= TUN_F_UFO;
1586 if (ioctl(s->fd, TUNSETOFFLOAD, offload) != 0) {
1587 /* Try without UFO */
1588 offload &= ~TUN_F_UFO;
1589 if (ioctl(s->fd, TUNSETOFFLOAD, offload) != 0) {
1590 fprintf(stderr, "TUNSETOFFLOAD ioctl() failed: %s\n",
1591 strerror(errno));
1595 #endif /* TUNSETOFFLOAD */
1597 static void tap_cleanup(VLANClientState *vc)
1599 TAPState *s = vc->opaque;
1601 qemu_purge_queued_packets(vc);
1603 if (s->down_script[0])
1604 launch_script(s->down_script, s->down_script_arg, s->fd);
1606 tap_read_poll(s, 0);
1607 tap_write_poll(s, 0);
1608 close(s->fd);
1609 qemu_free(s);
1612 /* fd support */
1614 static TAPState *net_tap_fd_init(VLANState *vlan,
1615 const char *model,
1616 const char *name,
1617 int fd,
1618 int vnet_hdr)
1620 TAPState *s;
1621 #ifdef TUNSETOFFLOAD
1622 unsigned int offload;
1623 #endif
1625 s = qemu_mallocz(sizeof(TAPState));
1626 s->fd = fd;
1627 s->has_vnet_hdr = vnet_hdr != 0;
1628 s->vc = qemu_new_vlan_client(vlan, NULL, model, name, NULL,
1629 tap_receive, tap_receive_iov,
1630 tap_cleanup, s);
1631 s->vc->receive_raw = tap_receive_raw;
1632 #ifdef TUNSETOFFLOAD
1633 s->vc->set_offload = tap_set_offload;
1635 s->has_ufo = 0;
1636 /* Check if tap supports UFO */
1637 offload = TUN_F_CSUM | TUN_F_UFO;
1638 if (ioctl(s->fd, TUNSETOFFLOAD, offload) == 0)
1639 s->has_ufo = 1;
1641 tap_set_offload(s->vc, 0, 0, 0, 0, 0);
1642 #endif
1643 tap_read_poll(s, 1);
1644 snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", fd);
1645 return s;
1648 #if defined (CONFIG_BSD) || defined (__FreeBSD_kernel__)
1649 static int tap_open(char *ifname, int ifname_size)
1651 int fd;
1652 char *dev;
1653 struct stat s;
1655 TFR(fd = open("/dev/tap", O_RDWR));
1656 if (fd < 0) {
1657 fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
1658 return -1;
1661 fstat(fd, &s);
1662 dev = devname(s.st_rdev, S_IFCHR);
1663 pstrcpy(ifname, ifname_size, dev);
1665 fcntl(fd, F_SETFL, O_NONBLOCK);
1666 return fd;
1668 #elif defined(__sun__)
1669 #define TUNNEWPPA (('T'<<16) | 0x0001)
1671 * Allocate TAP device, returns opened fd.
1672 * Stores dev name in the first arg(must be large enough).
1674 static int tap_alloc(char *dev, size_t dev_size)
1676 int tap_fd, if_fd, ppa = -1;
1677 static int ip_fd = 0;
1678 char *ptr;
1680 static int arp_fd = 0;
1681 int ip_muxid, arp_muxid;
1682 struct strioctl strioc_if, strioc_ppa;
1683 int link_type = I_PLINK;;
1684 struct lifreq ifr;
1685 char actual_name[32] = "";
1687 memset(&ifr, 0x0, sizeof(ifr));
1689 if( *dev ){
1690 ptr = dev;
1691 while( *ptr && !qemu_isdigit((int)*ptr) ) ptr++;
1692 ppa = atoi(ptr);
1695 /* Check if IP device was opened */
1696 if( ip_fd )
1697 close(ip_fd);
1699 TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
1700 if (ip_fd < 0) {
1701 syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
1702 return -1;
1705 TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
1706 if (tap_fd < 0) {
1707 syslog(LOG_ERR, "Can't open /dev/tap");
1708 return -1;
1711 /* Assign a new PPA and get its unit number. */
1712 strioc_ppa.ic_cmd = TUNNEWPPA;
1713 strioc_ppa.ic_timout = 0;
1714 strioc_ppa.ic_len = sizeof(ppa);
1715 strioc_ppa.ic_dp = (char *)&ppa;
1716 if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
1717 syslog (LOG_ERR, "Can't assign new interface");
1719 TFR(if_fd = open("/dev/tap", O_RDWR, 0));
1720 if (if_fd < 0) {
1721 syslog(LOG_ERR, "Can't open /dev/tap (2)");
1722 return -1;
1724 if(ioctl(if_fd, I_PUSH, "ip") < 0){
1725 syslog(LOG_ERR, "Can't push IP module");
1726 return -1;
1729 if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
1730 syslog(LOG_ERR, "Can't get flags\n");
1732 snprintf (actual_name, 32, "tap%d", ppa);
1733 pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1735 ifr.lifr_ppa = ppa;
1736 /* Assign ppa according to the unit number returned by tun device */
1738 if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
1739 syslog (LOG_ERR, "Can't set PPA %d", ppa);
1740 if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
1741 syslog (LOG_ERR, "Can't get flags\n");
1742 /* Push arp module to if_fd */
1743 if (ioctl (if_fd, I_PUSH, "arp") < 0)
1744 syslog (LOG_ERR, "Can't push ARP module (2)");
1746 /* Push arp module to ip_fd */
1747 if (ioctl (ip_fd, I_POP, NULL) < 0)
1748 syslog (LOG_ERR, "I_POP failed\n");
1749 if (ioctl (ip_fd, I_PUSH, "arp") < 0)
1750 syslog (LOG_ERR, "Can't push ARP module (3)\n");
1751 /* Open arp_fd */
1752 TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
1753 if (arp_fd < 0)
1754 syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
1756 /* Set ifname to arp */
1757 strioc_if.ic_cmd = SIOCSLIFNAME;
1758 strioc_if.ic_timout = 0;
1759 strioc_if.ic_len = sizeof(ifr);
1760 strioc_if.ic_dp = (char *)&ifr;
1761 if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
1762 syslog (LOG_ERR, "Can't set ifname to arp\n");
1765 if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
1766 syslog(LOG_ERR, "Can't link TAP device to IP");
1767 return -1;
1770 if ((arp_muxid = ioctl (ip_fd, link_type, arp_fd)) < 0)
1771 syslog (LOG_ERR, "Can't link TAP device to ARP");
1773 close (if_fd);
1775 memset(&ifr, 0x0, sizeof(ifr));
1776 pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1777 ifr.lifr_ip_muxid = ip_muxid;
1778 ifr.lifr_arp_muxid = arp_muxid;
1780 if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
1782 ioctl (ip_fd, I_PUNLINK , arp_muxid);
1783 ioctl (ip_fd, I_PUNLINK, ip_muxid);
1784 syslog (LOG_ERR, "Can't set multiplexor id");
1787 snprintf(dev, dev_size, "tap%d", ppa);
1788 return tap_fd;
1791 static int tap_open(char *ifname, int ifname_size, int *vnet_hdr)
1793 char dev[10]="";
1794 int fd;
1795 if( (fd = tap_alloc(dev, sizeof(dev))) < 0 ){
1796 fprintf(stderr, "Cannot allocate TAP device\n");
1797 return -1;
1799 pstrcpy(ifname, ifname_size, dev);
1800 fcntl(fd, F_SETFL, O_NONBLOCK);
1801 return fd;
1803 #elif defined (_AIX)
1804 static int tap_open(char *ifname, int ifname_size)
1806 fprintf (stderr, "no tap on AIX\n");
1807 return -1;
1809 #else
1810 static int tap_open(char *ifname, int ifname_size, int *vnet_hdr)
1812 struct ifreq ifr;
1813 int fd, ret;
1815 TFR(fd = open("/dev/net/tun", O_RDWR));
1816 if (fd < 0) {
1817 fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
1818 return -1;
1820 memset(&ifr, 0, sizeof(ifr));
1821 ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
1823 #if defined(TUNGETFEATURES) && defined(IFF_VNET_HDR)
1825 unsigned int features;
1827 if (ioctl(fd, TUNGETFEATURES, &features) == 0 &&
1828 features & IFF_VNET_HDR) {
1829 *vnet_hdr = 1;
1830 ifr.ifr_flags |= IFF_VNET_HDR;
1833 #endif
1835 if (ifname[0] != '\0')
1836 pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
1837 else
1838 pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
1839 ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
1840 if (ret != 0) {
1841 fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
1842 close(fd);
1843 return -1;
1845 pstrcpy(ifname, ifname_size, ifr.ifr_name);
1846 fcntl(fd, F_SETFL, O_NONBLOCK);
1847 return fd;
1849 #endif
1851 static int launch_script(const char *setup_script, const char *ifname, int fd)
1853 sigset_t oldmask, mask;
1854 int pid, status;
1855 char *args[3];
1856 char **parg;
1858 sigemptyset(&mask);
1859 sigaddset(&mask, SIGCHLD);
1860 sigprocmask(SIG_BLOCK, &mask, &oldmask);
1862 /* try to launch network script */
1863 pid = fork();
1864 if (pid == 0) {
1865 int open_max = sysconf(_SC_OPEN_MAX), i;
1867 for (i = 0; i < open_max; i++) {
1868 if (i != STDIN_FILENO &&
1869 i != STDOUT_FILENO &&
1870 i != STDERR_FILENO &&
1871 i != fd) {
1872 close(i);
1875 parg = args;
1876 *parg++ = (char *)setup_script;
1877 *parg++ = (char *)ifname;
1878 *parg++ = NULL;
1879 execv(setup_script, args);
1880 _exit(1);
1881 } else if (pid > 0) {
1882 while (waitpid(pid, &status, 0) != pid) {
1883 /* loop */
1885 sigprocmask(SIG_SETMASK, &oldmask, NULL);
1887 if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
1888 return 0;
1891 fprintf(stderr, "%s: could not launch network script\n", setup_script);
1892 return -1;
1895 static TAPState *net_tap_init(VLANState *vlan, const char *model,
1896 const char *name, const char *ifname1,
1897 const char *setup_script, const char *down_script)
1899 TAPState *s;
1900 int fd;
1901 int vnet_hdr;
1902 char ifname[128];
1904 if (ifname1 != NULL)
1905 pstrcpy(ifname, sizeof(ifname), ifname1);
1906 else
1907 ifname[0] = '\0';
1908 vnet_hdr = 0;
1909 TFR(fd = tap_open(ifname, sizeof(ifname), &vnet_hdr));
1910 if (fd < 0)
1911 return NULL;
1913 if (!setup_script || !strcmp(setup_script, "no"))
1914 setup_script = "";
1915 if (setup_script[0] != '\0' &&
1916 launch_script(setup_script, ifname, fd)) {
1917 return NULL;
1919 s = net_tap_fd_init(vlan, model, name, fd, vnet_hdr);
1920 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1921 "ifname=%s,script=%s,downscript=%s",
1922 ifname, setup_script, down_script);
1923 if (down_script && strcmp(down_script, "no")) {
1924 snprintf(s->down_script, sizeof(s->down_script), "%s", down_script);
1925 snprintf(s->down_script_arg, sizeof(s->down_script_arg), "%s", ifname);
1927 return s;
1930 #endif /* !_WIN32 */
1932 #if defined(CONFIG_VDE)
1933 typedef struct VDEState {
1934 VLANClientState *vc;
1935 VDECONN *vde;
1936 } VDEState;
1938 static void vde_to_qemu(void *opaque)
1940 VDEState *s = opaque;
1941 uint8_t buf[4096];
1942 int size;
1944 size = vde_recv(s->vde, (char *)buf, sizeof(buf), 0);
1945 if (size > 0) {
1946 qemu_send_packet(s->vc, buf, size);
1950 static ssize_t vde_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1952 VDEState *s = vc->opaque;
1953 ssize_t ret;
1955 do {
1956 ret = vde_send(s->vde, (const char *)buf, size, 0);
1957 } while (ret < 0 && errno == EINTR);
1959 return ret;
1962 static void vde_cleanup(VLANClientState *vc)
1964 VDEState *s = vc->opaque;
1965 qemu_set_fd_handler(vde_datafd(s->vde), NULL, NULL, NULL);
1966 vde_close(s->vde);
1967 qemu_free(s);
1970 static int net_vde_init(VLANState *vlan, const char *model,
1971 const char *name, const char *sock,
1972 int port, const char *group, int mode)
1974 VDEState *s;
1975 char *init_group = (char *)group;
1976 char *init_sock = (char *)sock;
1978 struct vde_open_args args = {
1979 .port = port,
1980 .group = init_group,
1981 .mode = mode,
1984 s = qemu_mallocz(sizeof(VDEState));
1985 s->vde = vde_open(init_sock, (char *)"QEMU", &args);
1986 if (!s->vde){
1987 free(s);
1988 return -1;
1990 s->vc = qemu_new_vlan_client(vlan, NULL, model, name, NULL,
1991 vde_receive, NULL,
1992 vde_cleanup, s);
1993 qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s);
1994 snprintf(s->vc->info_str, sizeof(s->vc->info_str), "sock=%s,fd=%d",
1995 sock, vde_datafd(s->vde));
1996 return 0;
1998 #endif
2000 /* network connection */
2001 typedef struct NetSocketState {
2002 VLANClientState *vc;
2003 int fd;
2004 int state; /* 0 = getting length, 1 = getting data */
2005 unsigned int index;
2006 unsigned int packet_len;
2007 uint8_t buf[4096];
2008 struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
2009 } NetSocketState;
2011 typedef struct NetSocketListenState {
2012 VLANState *vlan;
2013 char *model;
2014 char *name;
2015 int fd;
2016 } NetSocketListenState;
2018 /* XXX: we consider we can send the whole packet without blocking */
2019 static ssize_t net_socket_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
2021 NetSocketState *s = vc->opaque;
2022 uint32_t len;
2023 len = htonl(size);
2025 send_all(s->fd, (const uint8_t *)&len, sizeof(len));
2026 return send_all(s->fd, buf, size);
2029 static ssize_t net_socket_receive_dgram(VLANClientState *vc, const uint8_t *buf, size_t size)
2031 NetSocketState *s = vc->opaque;
2033 return sendto(s->fd, (const void *)buf, size, 0,
2034 (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
2037 static void net_socket_send(void *opaque)
2039 NetSocketState *s = opaque;
2040 int size, err;
2041 unsigned l;
2042 uint8_t buf1[4096];
2043 const uint8_t *buf;
2045 size = recv(s->fd, (void *)buf1, sizeof(buf1), 0);
2046 if (size < 0) {
2047 err = socket_error();
2048 if (err != EWOULDBLOCK)
2049 goto eoc;
2050 } else if (size == 0) {
2051 /* end of connection */
2052 eoc:
2053 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2054 closesocket(s->fd);
2055 return;
2057 buf = buf1;
2058 while (size > 0) {
2059 /* reassemble a packet from the network */
2060 switch(s->state) {
2061 case 0:
2062 l = 4 - s->index;
2063 if (l > size)
2064 l = size;
2065 memcpy(s->buf + s->index, buf, l);
2066 buf += l;
2067 size -= l;
2068 s->index += l;
2069 if (s->index == 4) {
2070 /* got length */
2071 s->packet_len = ntohl(*(uint32_t *)s->buf);
2072 s->index = 0;
2073 s->state = 1;
2075 break;
2076 case 1:
2077 l = s->packet_len - s->index;
2078 if (l > size)
2079 l = size;
2080 if (s->index + l <= sizeof(s->buf)) {
2081 memcpy(s->buf + s->index, buf, l);
2082 } else {
2083 fprintf(stderr, "serious error: oversized packet received,"
2084 "connection terminated.\n");
2085 s->state = 0;
2086 goto eoc;
2089 s->index += l;
2090 buf += l;
2091 size -= l;
2092 if (s->index >= s->packet_len) {
2093 qemu_send_packet(s->vc, s->buf, s->packet_len);
2094 s->index = 0;
2095 s->state = 0;
2097 break;
2102 static void net_socket_send_dgram(void *opaque)
2104 NetSocketState *s = opaque;
2105 int size;
2107 size = recv(s->fd, (void *)s->buf, sizeof(s->buf), 0);
2108 if (size < 0)
2109 return;
2110 if (size == 0) {
2111 /* end of connection */
2112 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2113 return;
2115 qemu_send_packet(s->vc, s->buf, size);
2118 static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
2120 struct ip_mreq imr;
2121 int fd;
2122 int val, ret;
2123 if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
2124 fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
2125 inet_ntoa(mcastaddr->sin_addr),
2126 (int)ntohl(mcastaddr->sin_addr.s_addr));
2127 return -1;
2130 fd = socket(PF_INET, SOCK_DGRAM, 0);
2131 if (fd < 0) {
2132 perror("socket(PF_INET, SOCK_DGRAM)");
2133 return -1;
2136 val = 1;
2137 ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
2138 (const char *)&val, sizeof(val));
2139 if (ret < 0) {
2140 perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
2141 goto fail;
2144 ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
2145 if (ret < 0) {
2146 perror("bind");
2147 goto fail;
2150 /* Add host to multicast group */
2151 imr.imr_multiaddr = mcastaddr->sin_addr;
2152 imr.imr_interface.s_addr = htonl(INADDR_ANY);
2154 ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
2155 (const char *)&imr, sizeof(struct ip_mreq));
2156 if (ret < 0) {
2157 perror("setsockopt(IP_ADD_MEMBERSHIP)");
2158 goto fail;
2161 /* Force mcast msgs to loopback (eg. several QEMUs in same host */
2162 val = 1;
2163 ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
2164 (const char *)&val, sizeof(val));
2165 if (ret < 0) {
2166 perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
2167 goto fail;
2170 socket_set_nonblock(fd);
2171 return fd;
2172 fail:
2173 if (fd >= 0)
2174 closesocket(fd);
2175 return -1;
2178 static void net_socket_cleanup(VLANClientState *vc)
2180 NetSocketState *s = vc->opaque;
2181 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2182 close(s->fd);
2183 qemu_free(s);
2186 static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan,
2187 const char *model,
2188 const char *name,
2189 int fd, int is_connected)
2191 struct sockaddr_in saddr;
2192 int newfd;
2193 socklen_t saddr_len;
2194 NetSocketState *s;
2196 /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
2197 * Because this may be "shared" socket from a "master" process, datagrams would be recv()
2198 * by ONLY ONE process: we must "clone" this dgram socket --jjo
2201 if (is_connected) {
2202 if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
2203 /* must be bound */
2204 if (saddr.sin_addr.s_addr==0) {
2205 fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
2206 fd);
2207 return NULL;
2209 /* clone dgram socket */
2210 newfd = net_socket_mcast_create(&saddr);
2211 if (newfd < 0) {
2212 /* error already reported by net_socket_mcast_create() */
2213 close(fd);
2214 return NULL;
2216 /* clone newfd to fd, close newfd */
2217 dup2(newfd, fd);
2218 close(newfd);
2220 } else {
2221 fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
2222 fd, strerror(errno));
2223 return NULL;
2227 s = qemu_mallocz(sizeof(NetSocketState));
2228 s->fd = fd;
2230 s->vc = qemu_new_vlan_client(vlan, NULL, model, name, NULL,
2231 net_socket_receive_dgram, NULL,
2232 net_socket_cleanup, s);
2233 qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
2235 /* mcast: save bound address as dst */
2236 if (is_connected) s->dgram_dst=saddr;
2238 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2239 "socket: fd=%d (%s mcast=%s:%d)",
2240 fd, is_connected? "cloned" : "",
2241 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2242 return s;
2245 static void net_socket_connect(void *opaque)
2247 NetSocketState *s = opaque;
2248 qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
2251 static NetSocketState *net_socket_fd_init_stream(VLANState *vlan,
2252 const char *model,
2253 const char *name,
2254 int fd, int is_connected)
2256 NetSocketState *s;
2257 s = qemu_mallocz(sizeof(NetSocketState));
2258 s->fd = fd;
2259 s->vc = qemu_new_vlan_client(vlan, NULL, model, name, NULL,
2260 net_socket_receive, NULL,
2261 net_socket_cleanup, s);
2262 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2263 "socket: fd=%d", fd);
2264 if (is_connected) {
2265 net_socket_connect(s);
2266 } else {
2267 qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
2269 return s;
2272 static NetSocketState *net_socket_fd_init(VLANState *vlan,
2273 const char *model, const char *name,
2274 int fd, int is_connected)
2276 int so_type = -1, optlen=sizeof(so_type);
2278 if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
2279 (socklen_t *)&optlen)< 0) {
2280 fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n", fd);
2281 return NULL;
2283 switch(so_type) {
2284 case SOCK_DGRAM:
2285 return net_socket_fd_init_dgram(vlan, model, name, fd, is_connected);
2286 case SOCK_STREAM:
2287 return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2288 default:
2289 /* who knows ... this could be a eg. a pty, do warn and continue as stream */
2290 fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
2291 return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2293 return NULL;
2296 static void net_socket_accept(void *opaque)
2298 NetSocketListenState *s = opaque;
2299 NetSocketState *s1;
2300 struct sockaddr_in saddr;
2301 socklen_t len;
2302 int fd;
2304 for(;;) {
2305 len = sizeof(saddr);
2306 fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
2307 if (fd < 0 && errno != EINTR) {
2308 return;
2309 } else if (fd >= 0) {
2310 break;
2313 s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1);
2314 if (!s1) {
2315 closesocket(fd);
2316 } else {
2317 snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
2318 "socket: connection from %s:%d",
2319 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2323 static int net_socket_listen_init(VLANState *vlan,
2324 const char *model,
2325 const char *name,
2326 const char *host_str)
2328 NetSocketListenState *s;
2329 int fd, val, ret;
2330 struct sockaddr_in saddr;
2332 if (parse_host_port(&saddr, host_str) < 0)
2333 return -1;
2335 s = qemu_mallocz(sizeof(NetSocketListenState));
2337 fd = socket(PF_INET, SOCK_STREAM, 0);
2338 if (fd < 0) {
2339 perror("socket");
2340 return -1;
2342 socket_set_nonblock(fd);
2344 /* allow fast reuse */
2345 val = 1;
2346 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
2348 ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2349 if (ret < 0) {
2350 perror("bind");
2351 return -1;
2353 ret = listen(fd, 0);
2354 if (ret < 0) {
2355 perror("listen");
2356 return -1;
2358 s->vlan = vlan;
2359 s->model = qemu_strdup(model);
2360 s->name = name ? qemu_strdup(name) : NULL;
2361 s->fd = fd;
2362 qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
2363 return 0;
2366 static int net_socket_connect_init(VLANState *vlan,
2367 const char *model,
2368 const char *name,
2369 const char *host_str)
2371 NetSocketState *s;
2372 int fd, connected, ret, err;
2373 struct sockaddr_in saddr;
2375 if (parse_host_port(&saddr, host_str) < 0)
2376 return -1;
2378 fd = socket(PF_INET, SOCK_STREAM, 0);
2379 if (fd < 0) {
2380 perror("socket");
2381 return -1;
2383 socket_set_nonblock(fd);
2385 connected = 0;
2386 for(;;) {
2387 ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2388 if (ret < 0) {
2389 err = socket_error();
2390 if (err == EINTR || err == EWOULDBLOCK) {
2391 } else if (err == EINPROGRESS) {
2392 break;
2393 #ifdef _WIN32
2394 } else if (err == WSAEALREADY) {
2395 break;
2396 #endif
2397 } else {
2398 perror("connect");
2399 closesocket(fd);
2400 return -1;
2402 } else {
2403 connected = 1;
2404 break;
2407 s = net_socket_fd_init(vlan, model, name, fd, connected);
2408 if (!s)
2409 return -1;
2410 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2411 "socket: connect to %s:%d",
2412 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2413 return 0;
2416 static int net_socket_mcast_init(VLANState *vlan,
2417 const char *model,
2418 const char *name,
2419 const char *host_str)
2421 NetSocketState *s;
2422 int fd;
2423 struct sockaddr_in saddr;
2425 if (parse_host_port(&saddr, host_str) < 0)
2426 return -1;
2429 fd = net_socket_mcast_create(&saddr);
2430 if (fd < 0)
2431 return -1;
2433 s = net_socket_fd_init(vlan, model, name, fd, 0);
2434 if (!s)
2435 return -1;
2437 s->dgram_dst = saddr;
2439 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2440 "socket: mcast=%s:%d",
2441 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2442 return 0;
2446 typedef struct DumpState {
2447 VLANClientState *pcap_vc;
2448 int fd;
2449 int pcap_caplen;
2450 } DumpState;
2452 #define PCAP_MAGIC 0xa1b2c3d4
2454 struct pcap_file_hdr {
2455 uint32_t magic;
2456 uint16_t version_major;
2457 uint16_t version_minor;
2458 int32_t thiszone;
2459 uint32_t sigfigs;
2460 uint32_t snaplen;
2461 uint32_t linktype;
2464 struct pcap_sf_pkthdr {
2465 struct {
2466 int32_t tv_sec;
2467 int32_t tv_usec;
2468 } ts;
2469 uint32_t caplen;
2470 uint32_t len;
2473 static ssize_t dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
2475 DumpState *s = vc->opaque;
2476 struct pcap_sf_pkthdr hdr;
2477 int64_t ts;
2478 int caplen;
2480 /* Early return in case of previous error. */
2481 if (s->fd < 0) {
2482 return size;
2485 ts = muldiv64(qemu_get_clock(vm_clock), 1000000, get_ticks_per_sec());
2486 caplen = size > s->pcap_caplen ? s->pcap_caplen : size;
2488 hdr.ts.tv_sec = ts / 1000000;
2489 hdr.ts.tv_usec = ts % 1000000;
2490 hdr.caplen = caplen;
2491 hdr.len = size;
2492 if (write(s->fd, &hdr, sizeof(hdr)) != sizeof(hdr) ||
2493 write(s->fd, buf, caplen) != caplen) {
2494 qemu_log("-net dump write error - stop dump\n");
2495 close(s->fd);
2496 s->fd = -1;
2499 return size;
2502 static void net_dump_cleanup(VLANClientState *vc)
2504 DumpState *s = vc->opaque;
2506 close(s->fd);
2507 qemu_free(s);
2510 static int net_dump_init(VLANState *vlan, const char *device,
2511 const char *name, const char *filename, int len)
2513 struct pcap_file_hdr hdr;
2514 DumpState *s;
2516 s = qemu_malloc(sizeof(DumpState));
2518 s->fd = open(filename, O_CREAT | O_WRONLY | O_BINARY, 0644);
2519 if (s->fd < 0) {
2520 qemu_error("-net dump: can't open %s\n", filename);
2521 return -1;
2524 s->pcap_caplen = len;
2526 hdr.magic = PCAP_MAGIC;
2527 hdr.version_major = 2;
2528 hdr.version_minor = 4;
2529 hdr.thiszone = 0;
2530 hdr.sigfigs = 0;
2531 hdr.snaplen = s->pcap_caplen;
2532 hdr.linktype = 1;
2534 if (write(s->fd, &hdr, sizeof(hdr)) < sizeof(hdr)) {
2535 qemu_error("-net dump write error: %s\n", strerror(errno));
2536 close(s->fd);
2537 qemu_free(s);
2538 return -1;
2541 s->pcap_vc = qemu_new_vlan_client(vlan, NULL, device, name, NULL,
2542 dump_receive, NULL,
2543 net_dump_cleanup, s);
2544 snprintf(s->pcap_vc->info_str, sizeof(s->pcap_vc->info_str),
2545 "dump to %s (len=%d)", filename, len);
2546 return 0;
2549 /* find or alloc a new VLAN */
2550 VLANState *qemu_find_vlan(int id, int allocate)
2552 VLANState *vlan;
2554 QTAILQ_FOREACH(vlan, &vlans, next) {
2555 if (vlan->id == id) {
2556 return vlan;
2560 if (!allocate) {
2561 return NULL;
2564 vlan = qemu_mallocz(sizeof(VLANState));
2565 vlan->id = id;
2566 QTAILQ_INIT(&vlan->clients);
2568 vlan->send_queue = qemu_new_net_queue(qemu_vlan_deliver_packet,
2569 qemu_vlan_deliver_packet_iov,
2570 vlan);
2572 QTAILQ_INSERT_TAIL(&vlans, vlan, next);
2574 return vlan;
2577 VLANClientState *qemu_find_netdev(const char *id)
2579 VLANClientState *vc;
2581 QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
2582 if (!strcmp(vc->name, id)) {
2583 return vc;
2587 return NULL;
2590 static int nic_get_free_idx(void)
2592 int index;
2594 for (index = 0; index < MAX_NICS; index++)
2595 if (!nd_table[index].used)
2596 return index;
2597 return -1;
2600 int qemu_show_nic_models(const char *arg, const char *const *models)
2602 int i;
2604 if (!arg || strcmp(arg, "?"))
2605 return 0;
2607 fprintf(stderr, "qemu: Supported NIC models: ");
2608 for (i = 0 ; models[i]; i++)
2609 fprintf(stderr, "%s%c", models[i], models[i+1] ? ',' : '\n');
2610 return 1;
2613 void qemu_check_nic_model(NICInfo *nd, const char *model)
2615 const char *models[2];
2617 models[0] = model;
2618 models[1] = NULL;
2620 if (qemu_show_nic_models(nd->model, models))
2621 exit(0);
2622 if (qemu_find_nic_model(nd, models, model) < 0)
2623 exit(1);
2626 int qemu_find_nic_model(NICInfo *nd, const char * const *models,
2627 const char *default_model)
2629 int i;
2631 if (!nd->model)
2632 nd->model = qemu_strdup(default_model);
2634 for (i = 0 ; models[i]; i++) {
2635 if (strcmp(nd->model, models[i]) == 0)
2636 return i;
2639 qemu_error("qemu: Unsupported NIC model: %s\n", nd->model);
2640 return -1;
2643 static int net_handle_fd_param(Monitor *mon, const char *param)
2645 if (!qemu_isdigit(param[0])) {
2646 int fd;
2648 fd = monitor_get_fd(mon, param);
2649 if (fd == -1) {
2650 qemu_error("No file descriptor named %s found", param);
2651 return -1;
2654 return fd;
2655 } else {
2656 return strtol(param, NULL, 0);
2660 static int net_init_nic(QemuOpts *opts,
2661 Monitor *mon,
2662 const char *name,
2663 VLANState *vlan)
2665 int idx;
2666 NICInfo *nd;
2667 const char *netdev;
2669 idx = nic_get_free_idx();
2670 if (idx == -1 || nb_nics >= MAX_NICS) {
2671 qemu_error("Too Many NICs\n");
2672 return -1;
2675 nd = &nd_table[idx];
2677 memset(nd, 0, sizeof(*nd));
2679 if ((netdev = qemu_opt_get(opts, "netdev"))) {
2680 nd->netdev = qemu_find_netdev(netdev);
2681 if (!nd->netdev) {
2682 qemu_error("netdev '%s' not found\n", netdev);
2683 return -1;
2685 } else {
2686 assert(vlan);
2687 nd->vlan = vlan;
2689 if (name) {
2690 nd->name = qemu_strdup(name);
2692 if (qemu_opt_get(opts, "model")) {
2693 nd->model = qemu_strdup(qemu_opt_get(opts, "model"));
2695 if (qemu_opt_get(opts, "addr")) {
2696 nd->devaddr = qemu_strdup(qemu_opt_get(opts, "addr"));
2699 nd->macaddr[0] = 0x52;
2700 nd->macaddr[1] = 0x54;
2701 nd->macaddr[2] = 0x00;
2702 nd->macaddr[3] = 0x12;
2703 nd->macaddr[4] = 0x34;
2704 nd->macaddr[5] = 0x56 + idx;
2706 if (qemu_opt_get(opts, "macaddr") &&
2707 parse_macaddr(nd->macaddr, qemu_opt_get(opts, "macaddr")) < 0) {
2708 qemu_error("invalid syntax for ethernet address\n");
2709 return -1;
2712 nd->nvectors = qemu_opt_get_number(opts, "vectors", NIC_NVECTORS_UNSPECIFIED);
2713 if (nd->nvectors != NIC_NVECTORS_UNSPECIFIED &&
2714 (nd->nvectors < 0 || nd->nvectors > 0x7ffffff)) {
2715 qemu_error("invalid # of vectors: %d\n", nd->nvectors);
2716 return -1;
2719 nd->used = 1;
2720 if (vlan) {
2721 nd->vlan->nb_guest_devs++;
2723 nb_nics++;
2725 return idx;
2728 #if defined(CONFIG_SLIRP)
2729 static int net_init_slirp_configs(const char *name, const char *value, void *opaque)
2731 struct slirp_config_str *config;
2733 if (strcmp(name, "hostfwd") != 0 && strcmp(name, "guestfwd") != 0) {
2734 return 0;
2737 config = qemu_mallocz(sizeof(*config));
2739 pstrcpy(config->str, sizeof(config->str), value);
2741 if (!strcmp(name, "hostfwd")) {
2742 config->flags = SLIRP_CFG_HOSTFWD;
2745 config->next = slirp_configs;
2746 slirp_configs = config;
2748 return 0;
2751 static int net_init_slirp(QemuOpts *opts,
2752 Monitor *mon,
2753 const char *name,
2754 VLANState *vlan)
2756 struct slirp_config_str *config;
2757 const char *vhost;
2758 const char *vhostname;
2759 const char *vdhcp_start;
2760 const char *vnamesrv;
2761 const char *tftp_export;
2762 const char *bootfile;
2763 const char *smb_export;
2764 const char *vsmbsrv;
2765 char *vnet = NULL;
2766 int restricted = 0;
2767 int ret;
2769 vhost = qemu_opt_get(opts, "host");
2770 vhostname = qemu_opt_get(opts, "hostname");
2771 vdhcp_start = qemu_opt_get(opts, "dhcpstart");
2772 vnamesrv = qemu_opt_get(opts, "dns");
2773 tftp_export = qemu_opt_get(opts, "tftp");
2774 bootfile = qemu_opt_get(opts, "bootfile");
2775 smb_export = qemu_opt_get(opts, "smb");
2776 vsmbsrv = qemu_opt_get(opts, "smbserver");
2778 if (qemu_opt_get(opts, "ip")) {
2779 const char *ip = qemu_opt_get(opts, "ip");
2780 int l = strlen(ip) + strlen("/24") + 1;
2782 vnet = qemu_malloc(l);
2784 /* emulate legacy ip= parameter */
2785 pstrcpy(vnet, l, ip);
2786 pstrcat(vnet, l, "/24");
2789 if (qemu_opt_get(opts, "net")) {
2790 if (vnet) {
2791 qemu_free(vnet);
2793 vnet = qemu_strdup(qemu_opt_get(opts, "net"));
2796 if (qemu_opt_get(opts, "restrict") &&
2797 qemu_opt_get(opts, "restrict")[0] == 'y') {
2798 restricted = 1;
2801 qemu_opt_foreach(opts, net_init_slirp_configs, NULL, 0);
2803 ret = net_slirp_init(vlan, "user", name, restricted, vnet, vhost,
2804 vhostname, tftp_export, bootfile, vdhcp_start,
2805 vnamesrv, smb_export, vsmbsrv);
2807 while (slirp_configs) {
2808 config = slirp_configs;
2809 slirp_configs = config->next;
2810 qemu_free(config);
2813 if (ret != -1 && vlan) {
2814 vlan->nb_host_devs++;
2817 qemu_free(vnet);
2819 return ret;
2821 #endif /* CONFIG_SLIRP */
2823 #ifdef _WIN32
2824 static int net_init_tap_win32(QemuOpts *opts,
2825 Monitor *mon,
2826 const char *name,
2827 VLANState *vlan)
2829 const char *ifname;
2831 ifname = qemu_opt_get(opts, "ifname");
2833 if (!ifname) {
2834 qemu_error("tap: no interface name\n");
2835 return -1;
2838 if (tap_win32_init(vlan, "tap", name, ifname) == -1) {
2839 return -1;
2842 if (vlan) {
2843 vlan->nb_host_devs++;
2846 return 0;
2848 #elif !defined(_AIX)
2849 static int net_init_tap(QemuOpts *opts,
2850 Monitor *mon,
2851 const char *name,
2852 VLANState *vlan)
2854 TAPState *s;
2856 if (qemu_opt_get(opts, "fd")) {
2857 int fd;
2859 if (qemu_opt_get(opts, "ifname") ||
2860 qemu_opt_get(opts, "script") ||
2861 qemu_opt_get(opts, "downscript")) {
2862 qemu_error("ifname=, script= and downscript= is invalid with fd=\n");
2863 return -1;
2866 fd = net_handle_fd_param(mon, qemu_opt_get(opts, "fd"));
2867 if (fd == -1) {
2868 return -1;
2871 fcntl(fd, F_SETFL, O_NONBLOCK);
2873 s = net_tap_fd_init(vlan, "tap", name, fd, tap_probe_vnet_hdr(fd));
2874 if (!s) {
2875 close(fd);
2877 } else {
2878 const char *ifname, *script, *downscript;
2880 ifname = qemu_opt_get(opts, "ifname");
2881 script = qemu_opt_get(opts, "script");
2882 downscript = qemu_opt_get(opts, "downscript");
2884 if (!script) {
2885 script = DEFAULT_NETWORK_SCRIPT;
2887 if (!downscript) {
2888 downscript = DEFAULT_NETWORK_DOWN_SCRIPT;
2891 s = net_tap_init(vlan, "tap", name, ifname, script, downscript);
2894 if (!s) {
2895 return -1;
2898 if (tap_set_sndbuf(s, opts) < 0) {
2899 return -1;
2902 if (vlan) {
2903 vlan->nb_host_devs++;
2906 return 0;
2908 #endif
2910 static int net_init_socket(QemuOpts *opts,
2911 Monitor *mon,
2912 const char *name,
2913 VLANState *vlan)
2915 if (qemu_opt_get(opts, "fd")) {
2916 int fd;
2918 if (qemu_opt_get(opts, "listen") ||
2919 qemu_opt_get(opts, "connect") ||
2920 qemu_opt_get(opts, "mcast")) {
2921 qemu_error("listen=, connect= and mcast= is invalid with fd=\n");
2922 return -1;
2925 fd = net_handle_fd_param(mon, qemu_opt_get(opts, "fd"));
2926 if (fd == -1) {
2927 return -1;
2930 if (!net_socket_fd_init(vlan, "socket", name, fd, 1)) {
2931 close(fd);
2932 return -1;
2934 } else if (qemu_opt_get(opts, "listen")) {
2935 const char *listen;
2937 if (qemu_opt_get(opts, "fd") ||
2938 qemu_opt_get(opts, "connect") ||
2939 qemu_opt_get(opts, "mcast")) {
2940 qemu_error("fd=, connect= and mcast= is invalid with listen=\n");
2941 return -1;
2944 listen = qemu_opt_get(opts, "listen");
2946 if (net_socket_listen_init(vlan, "socket", name, listen) == -1) {
2947 return -1;
2949 } else if (qemu_opt_get(opts, "connect")) {
2950 const char *connect;
2952 if (qemu_opt_get(opts, "fd") ||
2953 qemu_opt_get(opts, "listen") ||
2954 qemu_opt_get(opts, "mcast")) {
2955 qemu_error("fd=, listen= and mcast= is invalid with connect=\n");
2956 return -1;
2959 connect = qemu_opt_get(opts, "connect");
2961 if (net_socket_connect_init(vlan, "socket", name, connect) == -1) {
2962 return -1;
2964 } else if (qemu_opt_get(opts, "mcast")) {
2965 const char *mcast;
2967 if (qemu_opt_get(opts, "fd") ||
2968 qemu_opt_get(opts, "connect") ||
2969 qemu_opt_get(opts, "listen")) {
2970 qemu_error("fd=, connect= and listen= is invalid with mcast=\n");
2971 return -1;
2974 mcast = qemu_opt_get(opts, "mcast");
2976 if (net_socket_mcast_init(vlan, "socket", name, mcast) == -1) {
2977 return -1;
2979 } else {
2980 qemu_error("-socket requires fd=, listen=, connect= or mcast=\n");
2981 return -1;
2984 if (vlan) {
2985 vlan->nb_host_devs++;
2988 return 0;
2991 #ifdef CONFIG_VDE
2992 static int net_init_vde(QemuOpts *opts,
2993 Monitor *mon,
2994 const char *name,
2995 VLANState *vlan)
2997 const char *sock;
2998 const char *group;
2999 int port, mode;
3001 sock = qemu_opt_get(opts, "sock");
3002 group = qemu_opt_get(opts, "group");
3004 port = qemu_opt_get_number(opts, "port", 0);
3005 mode = qemu_opt_get_number(opts, "mode", 0700);
3007 if (net_vde_init(vlan, "vde", name, sock, port, group, mode) == -1) {
3008 return -1;
3011 if (vlan) {
3012 vlan->nb_host_devs++;
3015 return 0;
3017 #endif
3019 static int net_init_dump(QemuOpts *opts,
3020 Monitor *mon,
3021 const char *name,
3022 VLANState *vlan)
3024 int len;
3025 const char *file;
3026 char def_file[128];
3028 assert(vlan);
3030 file = qemu_opt_get(opts, "file");
3031 if (!file) {
3032 snprintf(def_file, sizeof(def_file), "qemu-vlan%d.pcap", vlan->id);
3033 file = def_file;
3036 len = qemu_opt_get_size(opts, "len", 65536);
3038 return net_dump_init(vlan, "dump", name, file, len);
3041 #define NET_COMMON_PARAMS_DESC \
3043 .name = "type", \
3044 .type = QEMU_OPT_STRING, \
3045 .help = "net client type (nic, tap etc.)", \
3046 }, { \
3047 .name = "vlan", \
3048 .type = QEMU_OPT_NUMBER, \
3049 .help = "vlan number", \
3050 }, { \
3051 .name = "name", \
3052 .type = QEMU_OPT_STRING, \
3053 .help = "identifier for monitor commands", \
3056 typedef int (*net_client_init_func)(QemuOpts *opts,
3057 Monitor *mon,
3058 const char *name,
3059 VLANState *vlan);
3061 /* magic number, but compiler will warn if too small */
3062 #define NET_MAX_DESC 20
3064 static struct {
3065 const char *type;
3066 net_client_init_func init;
3067 QemuOptDesc desc[NET_MAX_DESC];
3068 } net_client_types[] = {
3070 .type = "none",
3071 .desc = {
3072 NET_COMMON_PARAMS_DESC,
3073 { /* end of list */ }
3075 }, {
3076 .type = "nic",
3077 .init = net_init_nic,
3078 .desc = {
3079 NET_COMMON_PARAMS_DESC,
3081 .name = "netdev",
3082 .type = QEMU_OPT_STRING,
3083 .help = "id of -netdev to connect to",
3086 .name = "macaddr",
3087 .type = QEMU_OPT_STRING,
3088 .help = "MAC address",
3089 }, {
3090 .name = "model",
3091 .type = QEMU_OPT_STRING,
3092 .help = "device model (e1000, rtl8139, virtio etc.)",
3093 }, {
3094 .name = "addr",
3095 .type = QEMU_OPT_STRING,
3096 .help = "PCI device address",
3097 }, {
3098 .name = "vectors",
3099 .type = QEMU_OPT_NUMBER,
3100 .help = "number of MSI-x vectors, 0 to disable MSI-X",
3102 { /* end of list */ }
3104 #ifdef CONFIG_SLIRP
3105 }, {
3106 .type = "user",
3107 .init = net_init_slirp,
3108 .desc = {
3109 NET_COMMON_PARAMS_DESC,
3111 .name = "hostname",
3112 .type = QEMU_OPT_STRING,
3113 .help = "client hostname reported by the builtin DHCP server",
3114 }, {
3115 .name = "restrict",
3116 .type = QEMU_OPT_STRING,
3117 .help = "isolate the guest from the host (y|yes|n|no)",
3118 }, {
3119 .name = "ip",
3120 .type = QEMU_OPT_STRING,
3121 .help = "legacy parameter, use net= instead",
3122 }, {
3123 .name = "net",
3124 .type = QEMU_OPT_STRING,
3125 .help = "IP address and optional netmask",
3126 }, {
3127 .name = "host",
3128 .type = QEMU_OPT_STRING,
3129 .help = "guest-visible address of the host",
3130 }, {
3131 .name = "tftp",
3132 .type = QEMU_OPT_STRING,
3133 .help = "root directory of the built-in TFTP server",
3134 }, {
3135 .name = "bootfile",
3136 .type = QEMU_OPT_STRING,
3137 .help = "BOOTP filename, for use with tftp=",
3138 }, {
3139 .name = "dhcpstart",
3140 .type = QEMU_OPT_STRING,
3141 .help = "the first of the 16 IPs the built-in DHCP server can assign",
3142 }, {
3143 .name = "dns",
3144 .type = QEMU_OPT_STRING,
3145 .help = "guest-visible address of the virtual nameserver",
3146 }, {
3147 .name = "smb",
3148 .type = QEMU_OPT_STRING,
3149 .help = "root directory of the built-in SMB server",
3150 }, {
3151 .name = "smbserver",
3152 .type = QEMU_OPT_STRING,
3153 .help = "IP address of the built-in SMB server",
3154 }, {
3155 .name = "hostfwd",
3156 .type = QEMU_OPT_STRING,
3157 .help = "guest port number to forward incoming TCP or UDP connections",
3158 }, {
3159 .name = "guestfwd",
3160 .type = QEMU_OPT_STRING,
3161 .help = "IP address and port to forward guest TCP connections",
3163 { /* end of list */ }
3165 #endif
3166 #ifdef _WIN32
3167 }, {
3168 .type = "tap",
3169 .init = net_init_tap_win32,
3170 .desc = {
3171 NET_COMMON_PARAMS_DESC,
3173 .name = "ifname",
3174 .type = QEMU_OPT_STRING,
3175 .help = "interface name",
3177 { /* end of list */ }
3179 #elif !defined(_AIX)
3180 }, {
3181 .type = "tap",
3182 .init = net_init_tap,
3183 .desc = {
3184 NET_COMMON_PARAMS_DESC,
3186 .name = "fd",
3187 .type = QEMU_OPT_STRING,
3188 .help = "file descriptor of an already opened tap",
3189 }, {
3190 .name = "ifname",
3191 .type = QEMU_OPT_STRING,
3192 .help = "interface name",
3193 }, {
3194 .name = "script",
3195 .type = QEMU_OPT_STRING,
3196 .help = "script to initialize the interface",
3197 }, {
3198 .name = "downscript",
3199 .type = QEMU_OPT_STRING,
3200 .help = "script to shut down the interface",
3201 #ifdef TUNSETSNDBUF
3202 }, {
3203 .name = "sndbuf",
3204 .type = QEMU_OPT_SIZE,
3205 .help = "send buffer limit"
3206 #endif
3208 { /* end of list */ }
3210 #endif
3211 }, {
3212 .type = "socket",
3213 .init = net_init_socket,
3214 .desc = {
3215 NET_COMMON_PARAMS_DESC,
3217 .name = "fd",
3218 .type = QEMU_OPT_STRING,
3219 .help = "file descriptor of an already opened socket",
3220 }, {
3221 .name = "listen",
3222 .type = QEMU_OPT_STRING,
3223 .help = "port number, and optional hostname, to listen on",
3224 }, {
3225 .name = "connect",
3226 .type = QEMU_OPT_STRING,
3227 .help = "port number, and optional hostname, to connect to",
3228 }, {
3229 .name = "mcast",
3230 .type = QEMU_OPT_STRING,
3231 .help = "UDP multicast address and port number",
3233 { /* end of list */ }
3235 #ifdef CONFIG_VDE
3236 }, {
3237 .type = "vde",
3238 .init = net_init_vde,
3239 .desc = {
3240 NET_COMMON_PARAMS_DESC,
3242 .name = "sock",
3243 .type = QEMU_OPT_STRING,
3244 .help = "socket path",
3245 }, {
3246 .name = "port",
3247 .type = QEMU_OPT_NUMBER,
3248 .help = "port number",
3249 }, {
3250 .name = "group",
3251 .type = QEMU_OPT_STRING,
3252 .help = "group owner of socket",
3253 }, {
3254 .name = "mode",
3255 .type = QEMU_OPT_NUMBER,
3256 .help = "permissions for socket",
3258 { /* end of list */ }
3260 #endif
3261 }, {
3262 .type = "dump",
3263 .init = net_init_dump,
3264 .desc = {
3265 NET_COMMON_PARAMS_DESC,
3267 .name = "len",
3268 .type = QEMU_OPT_SIZE,
3269 .help = "per-packet size limit (64k default)",
3270 }, {
3271 .name = "file",
3272 .type = QEMU_OPT_STRING,
3273 .help = "dump file path (default is qemu-vlan0.pcap)",
3275 { /* end of list */ }
3278 { /* end of list */ }
3281 int net_client_init(Monitor *mon, QemuOpts *opts, int is_netdev)
3283 const char *name;
3284 const char *type;
3285 int i;
3287 type = qemu_opt_get(opts, "type");
3288 if (!type) {
3289 qemu_error("No type specified for -net\n");
3290 return -1;
3293 if (is_netdev) {
3294 if (strcmp(type, "tap") != 0 &&
3295 #ifdef CONFIG_SLIRP
3296 strcmp(type, "user") != 0 &&
3297 #endif
3298 #ifdef CONFIG_VDE
3299 strcmp(type, "vde") != 0 &&
3300 #endif
3301 strcmp(type, "socket") != 0) {
3302 qemu_error("The '%s' network backend type is not valid with -netdev\n",
3303 type);
3304 return -1;
3307 if (qemu_opt_get(opts, "vlan")) {
3308 qemu_error("The 'vlan' parameter is not valid with -netdev\n");
3309 return -1;
3311 if (qemu_opt_get(opts, "name")) {
3312 qemu_error("The 'name' parameter is not valid with -netdev\n");
3313 return -1;
3315 if (!qemu_opts_id(opts)) {
3316 qemu_error("The id= parameter is required with -netdev\n");
3317 return -1;
3321 name = qemu_opts_id(opts);
3322 if (!name) {
3323 name = qemu_opt_get(opts, "name");
3326 for (i = 0; net_client_types[i].type != NULL; i++) {
3327 if (!strcmp(net_client_types[i].type, type)) {
3328 VLANState *vlan = NULL;
3330 if (qemu_opts_validate(opts, &net_client_types[i].desc[0]) == -1) {
3331 return -1;
3334 /* Do not add to a vlan if it's a -netdev or a nic with a
3335 * netdev= parameter. */
3336 if (!(is_netdev ||
3337 (strcmp(type, "nic") == 0 && qemu_opt_get(opts, "netdev")))) {
3338 vlan = qemu_find_vlan(qemu_opt_get_number(opts, "vlan", 0), 1);
3341 if (net_client_types[i].init) {
3342 return net_client_types[i].init(opts, mon, name, vlan);
3343 } else {
3344 return 0;
3349 qemu_error("Invalid -net type '%s'\n", type);
3350 return -1;
3353 void net_client_uninit(NICInfo *nd)
3355 if (nd->vlan) {
3356 nd->vlan->nb_guest_devs--;
3358 nb_nics--;
3360 qemu_free(nd->model);
3361 qemu_free(nd->name);
3362 qemu_free(nd->devaddr);
3364 nd->used = 0;
3367 static int net_host_check_device(const char *device)
3369 int i;
3370 const char *valid_param_list[] = { "tap", "socket", "dump"
3371 #ifdef CONFIG_SLIRP
3372 ,"user"
3373 #endif
3374 #ifdef CONFIG_VDE
3375 ,"vde"
3376 #endif
3378 for (i = 0; i < sizeof(valid_param_list) / sizeof(char *); i++) {
3379 if (!strncmp(valid_param_list[i], device,
3380 strlen(valid_param_list[i])))
3381 return 1;
3384 return 0;
3387 void net_host_device_add(Monitor *mon, const QDict *qdict)
3389 const char *device = qdict_get_str(qdict, "device");
3390 const char *opts_str = qdict_get_try_str(qdict, "opts");
3391 QemuOpts *opts;
3393 if (!net_host_check_device(device)) {
3394 monitor_printf(mon, "invalid host network device %s\n", device);
3395 return;
3398 opts = qemu_opts_parse(&qemu_net_opts, opts_str ? opts_str : "", NULL);
3399 if (!opts) {
3400 monitor_printf(mon, "parsing network options '%s' failed\n",
3401 opts_str ? opts_str : "");
3402 return;
3405 qemu_opt_set(opts, "type", device);
3407 if (net_client_init(mon, opts, 0) < 0) {
3408 monitor_printf(mon, "adding host network device %s failed\n", device);
3412 void net_host_device_remove(Monitor *mon, const QDict *qdict)
3414 VLANClientState *vc;
3415 int vlan_id = qdict_get_int(qdict, "vlan_id");
3416 const char *device = qdict_get_str(qdict, "device");
3418 vc = qemu_find_vlan_client_by_name(mon, vlan_id, device);
3419 if (!vc) {
3420 return;
3422 if (!net_host_check_device(vc->model)) {
3423 monitor_printf(mon, "invalid host network device %s\n", device);
3424 return;
3426 qemu_del_vlan_client(vc);
3429 void net_set_boot_mask(int net_boot_mask)
3431 int i;
3433 /* Only the first four NICs may be bootable */
3434 net_boot_mask = net_boot_mask & 0xF;
3436 for (i = 0; i < nb_nics; i++) {
3437 if (net_boot_mask & (1 << i)) {
3438 nd_table[i].bootable = 1;
3439 net_boot_mask &= ~(1 << i);
3443 if (net_boot_mask) {
3444 fprintf(stderr, "Cannot boot from non-existent NIC\n");
3445 exit(1);
3449 void do_info_network(Monitor *mon)
3451 VLANState *vlan;
3453 QTAILQ_FOREACH(vlan, &vlans, next) {
3454 VLANClientState *vc;
3456 monitor_printf(mon, "VLAN %d devices:\n", vlan->id);
3458 QTAILQ_FOREACH(vc, &vlan->clients, next) {
3459 monitor_printf(mon, " %s: %s\n", vc->name, vc->info_str);
3464 void do_set_link(Monitor *mon, const QDict *qdict)
3466 VLANState *vlan;
3467 VLANClientState *vc = NULL;
3468 const char *name = qdict_get_str(qdict, "name");
3469 const char *up_or_down = qdict_get_str(qdict, "up_or_down");
3471 QTAILQ_FOREACH(vlan, &vlans, next) {
3472 QTAILQ_FOREACH(vc, &vlan->clients, next) {
3473 if (strcmp(vc->name, name) == 0) {
3474 goto done;
3478 done:
3480 if (!vc) {
3481 monitor_printf(mon, "could not find network device '%s'\n", name);
3482 return;
3485 if (strcmp(up_or_down, "up") == 0)
3486 vc->link_down = 0;
3487 else if (strcmp(up_or_down, "down") == 0)
3488 vc->link_down = 1;
3489 else
3490 monitor_printf(mon, "invalid link status '%s'; only 'up' or 'down' "
3491 "valid\n", up_or_down);
3493 if (vc->link_status_changed)
3494 vc->link_status_changed(vc);
3497 void net_cleanup(void)
3499 VLANState *vlan;
3500 VLANClientState *vc, *next_vc;
3502 QTAILQ_FOREACH(vlan, &vlans, next) {
3503 QTAILQ_FOREACH_SAFE(vc, &vlan->clients, next, next_vc) {
3504 qemu_del_vlan_client(vc);
3508 QTAILQ_FOREACH_SAFE(vc, &non_vlan_clients, next, next_vc) {
3509 qemu_del_vlan_client(vc);
3513 static void net_check_clients(void)
3515 VLANState *vlan;
3517 QTAILQ_FOREACH(vlan, &vlans, next) {
3518 if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
3519 continue;
3520 if (vlan->nb_guest_devs == 0)
3521 fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
3522 if (vlan->nb_host_devs == 0)
3523 fprintf(stderr,
3524 "Warning: vlan %d is not connected to host network\n",
3525 vlan->id);
3529 static int net_init_client(QemuOpts *opts, void *dummy)
3531 if (net_client_init(NULL, opts, 0) < 0)
3532 return -1;
3533 return 0;
3536 static int net_init_netdev(QemuOpts *opts, void *dummy)
3538 return net_client_init(NULL, opts, 1);
3541 int net_init_clients(void)
3543 if (QTAILQ_EMPTY(&qemu_net_opts.head)) {
3544 /* if no clients, we use a default config */
3545 qemu_opts_set(&qemu_net_opts, NULL, "type", "nic");
3546 #ifdef CONFIG_SLIRP
3547 qemu_opts_set(&qemu_net_opts, NULL, "type", "user");
3548 #endif
3551 QTAILQ_INIT(&vlans);
3552 QTAILQ_INIT(&non_vlan_clients);
3554 if (qemu_opts_foreach(&qemu_netdev_opts, net_init_netdev, NULL, 1) == -1)
3555 return -1;
3557 if (qemu_opts_foreach(&qemu_net_opts, net_init_client, NULL, 1) == -1) {
3558 return -1;
3561 net_check_clients();
3563 return 0;
3566 int net_client_parse(QemuOptsList *opts_list, const char *optarg)
3568 #if defined(CONFIG_SLIRP)
3569 /* handle legacy -net channel,port:chr */
3570 if (!strcmp(opts_list->name, "net") &&
3571 !strncmp(optarg, "channel,", strlen("channel,"))) {
3572 int ret;
3574 optarg += strlen("channel,");
3576 if (QTAILQ_EMPTY(&slirp_stacks)) {
3577 struct slirp_config_str *config;
3579 config = qemu_malloc(sizeof(*config));
3580 pstrcpy(config->str, sizeof(config->str), optarg);
3581 config->flags = SLIRP_CFG_LEGACY;
3582 config->next = slirp_configs;
3583 slirp_configs = config;
3584 ret = 0;
3585 } else {
3586 ret = slirp_guestfwd(QTAILQ_FIRST(&slirp_stacks), optarg, 1);
3589 return ret;
3591 #endif
3592 if (!qemu_opts_parse(opts_list, optarg, "type")) {
3593 return -1;
3596 return 0;