]> git.proxmox.com Git - qemu.git/blob - net.c
monitor: Port handler_3 to use QDict
[qemu.git] / net.c
1 /*
2 * QEMU System Emulator
3 *
4 * Copyright (c) 2003-2008 Fabrice Bellard
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24 #include <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>
31
32 /* Needed early for CONFIG_BSD etc. */
33 #include "config-host.h"
34
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>
69
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"
74
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
95
96 #if defined(__OpenBSD__)
97 #include <util.h>
98 #endif
99
100 #if defined(CONFIG_VDE)
101 #include <libvdeplug.h>
102 #endif
103
104 #include "qemu-common.h"
105 #include "net.h"
106 #include "monitor.h"
107 #include "sysemu.h"
108 #include "qemu-timer.h"
109 #include "qemu-char.h"
110 #include "audio/audio.h"
111 #include "qemu_socket.h"
112 #include "qemu-log.h"
113
114 #include "slirp/libslirp.h"
115
116
117 static VLANState *first_vlan;
118
119 /***********************************************************/
120 /* network device redirectors */
121
122 #if defined(DEBUG_NET) || defined(DEBUG_SLIRP)
123 static void hex_dump(FILE *f, const uint8_t *buf, int size)
124 {
125 int len, i, j, c;
126
127 for(i=0;i<size;i+=16) {
128 len = size - i;
129 if (len > 16)
130 len = 16;
131 fprintf(f, "%08x ", i);
132 for(j=0;j<16;j++) {
133 if (j < len)
134 fprintf(f, " %02x", buf[i+j]);
135 else
136 fprintf(f, " ");
137 }
138 fprintf(f, " ");
139 for(j=0;j<len;j++) {
140 c = buf[i+j];
141 if (c < ' ' || c > '~')
142 c = '.';
143 fprintf(f, "%c", c);
144 }
145 fprintf(f, "\n");
146 }
147 }
148 #endif
149
150 static int parse_macaddr(uint8_t *macaddr, const char *p)
151 {
152 int i;
153 char *last_char;
154 long int offset;
155
156 errno = 0;
157 offset = strtol(p, &last_char, 0);
158 if (0 == errno && '\0' == *last_char &&
159 offset >= 0 && offset <= 0xFFFFFF) {
160 macaddr[3] = (offset & 0xFF0000) >> 16;
161 macaddr[4] = (offset & 0xFF00) >> 8;
162 macaddr[5] = offset & 0xFF;
163 return 0;
164 } else {
165 for(i = 0; i < 6; i++) {
166 macaddr[i] = strtol(p, (char **)&p, 16);
167 if (i == 5) {
168 if (*p != '\0')
169 return -1;
170 } else {
171 if (*p != ':' && *p != '-')
172 return -1;
173 p++;
174 }
175 }
176 return 0;
177 }
178
179 return -1;
180 }
181
182 static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
183 {
184 const char *p, *p1;
185 int len;
186 p = *pp;
187 p1 = strchr(p, sep);
188 if (!p1)
189 return -1;
190 len = p1 - p;
191 p1++;
192 if (buf_size > 0) {
193 if (len > buf_size - 1)
194 len = buf_size - 1;
195 memcpy(buf, p, len);
196 buf[len] = '\0';
197 }
198 *pp = p1;
199 return 0;
200 }
201
202 int parse_host_src_port(struct sockaddr_in *haddr,
203 struct sockaddr_in *saddr,
204 const char *input_str)
205 {
206 char *str = strdup(input_str);
207 char *host_str = str;
208 char *src_str;
209 const char *src_str2;
210 char *ptr;
211
212 /*
213 * Chop off any extra arguments at the end of the string which
214 * would start with a comma, then fill in the src port information
215 * if it was provided else use the "any address" and "any port".
216 */
217 if ((ptr = strchr(str,',')))
218 *ptr = '\0';
219
220 if ((src_str = strchr(input_str,'@'))) {
221 *src_str = '\0';
222 src_str++;
223 }
224
225 if (parse_host_port(haddr, host_str) < 0)
226 goto fail;
227
228 src_str2 = src_str;
229 if (!src_str || *src_str == '\0')
230 src_str2 = ":0";
231
232 if (parse_host_port(saddr, src_str2) < 0)
233 goto fail;
234
235 free(str);
236 return(0);
237
238 fail:
239 free(str);
240 return -1;
241 }
242
243 int parse_host_port(struct sockaddr_in *saddr, const char *str)
244 {
245 char buf[512];
246 struct hostent *he;
247 const char *p, *r;
248 int port;
249
250 p = str;
251 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
252 return -1;
253 saddr->sin_family = AF_INET;
254 if (buf[0] == '\0') {
255 saddr->sin_addr.s_addr = 0;
256 } else {
257 if (qemu_isdigit(buf[0])) {
258 if (!inet_aton(buf, &saddr->sin_addr))
259 return -1;
260 } else {
261 if ((he = gethostbyname(buf)) == NULL)
262 return - 1;
263 saddr->sin_addr = *(struct in_addr *)he->h_addr;
264 }
265 }
266 port = strtol(p, (char **)&r, 0);
267 if (r == p)
268 return -1;
269 saddr->sin_port = htons(port);
270 return 0;
271 }
272
273 void qemu_format_nic_info_str(VLANClientState *vc, uint8_t macaddr[6])
274 {
275 snprintf(vc->info_str, sizeof(vc->info_str),
276 "model=%s,macaddr=%02x:%02x:%02x:%02x:%02x:%02x",
277 vc->model,
278 macaddr[0], macaddr[1], macaddr[2],
279 macaddr[3], macaddr[4], macaddr[5]);
280 }
281
282 static char *assign_name(VLANClientState *vc1, const char *model)
283 {
284 VLANState *vlan;
285 char buf[256];
286 int id = 0;
287
288 for (vlan = first_vlan; vlan; vlan = vlan->next) {
289 VLANClientState *vc;
290
291 for (vc = vlan->first_client; vc; vc = vc->next)
292 if (vc != vc1 && strcmp(vc->model, model) == 0)
293 id++;
294 }
295
296 snprintf(buf, sizeof(buf), "%s.%d", model, id);
297
298 return strdup(buf);
299 }
300
301 VLANClientState *qemu_new_vlan_client(VLANState *vlan,
302 const char *model,
303 const char *name,
304 NetCanReceive *can_receive,
305 NetReceive *receive,
306 NetReceiveIOV *receive_iov,
307 NetCleanup *cleanup,
308 void *opaque)
309 {
310 VLANClientState *vc, **pvc;
311 vc = qemu_mallocz(sizeof(VLANClientState));
312 vc->model = strdup(model);
313 if (name)
314 vc->name = strdup(name);
315 else
316 vc->name = assign_name(vc, model);
317 vc->can_receive = can_receive;
318 vc->receive = receive;
319 vc->receive_iov = receive_iov;
320 vc->cleanup = cleanup;
321 vc->opaque = opaque;
322 vc->vlan = vlan;
323
324 vc->next = NULL;
325 pvc = &vlan->first_client;
326 while (*pvc != NULL)
327 pvc = &(*pvc)->next;
328 *pvc = vc;
329 return vc;
330 }
331
332 void qemu_del_vlan_client(VLANClientState *vc)
333 {
334 VLANClientState **pvc = &vc->vlan->first_client;
335
336 while (*pvc != NULL)
337 if (*pvc == vc) {
338 *pvc = vc->next;
339 if (vc->cleanup) {
340 vc->cleanup(vc);
341 }
342 free(vc->name);
343 free(vc->model);
344 qemu_free(vc);
345 break;
346 } else
347 pvc = &(*pvc)->next;
348 }
349
350 VLANClientState *qemu_find_vlan_client(VLANState *vlan, void *opaque)
351 {
352 VLANClientState **pvc = &vlan->first_client;
353
354 while (*pvc != NULL)
355 if ((*pvc)->opaque == opaque)
356 return *pvc;
357 else
358 pvc = &(*pvc)->next;
359
360 return NULL;
361 }
362
363 static VLANClientState *
364 qemu_find_vlan_client_by_name(Monitor *mon, int vlan_id,
365 const char *client_str)
366 {
367 VLANState *vlan;
368 VLANClientState *vc;
369
370 vlan = qemu_find_vlan(vlan_id, 0);
371 if (!vlan) {
372 monitor_printf(mon, "unknown VLAN %d\n", vlan_id);
373 return NULL;
374 }
375
376 for (vc = vlan->first_client; vc != NULL; vc = vc->next) {
377 if (!strcmp(vc->name, client_str)) {
378 break;
379 }
380 }
381 if (!vc) {
382 monitor_printf(mon, "can't find device %s on VLAN %d\n",
383 client_str, vlan_id);
384 }
385
386 return vc;
387 }
388
389 int qemu_can_send_packet(VLANClientState *sender)
390 {
391 VLANState *vlan = sender->vlan;
392 VLANClientState *vc;
393
394 for (vc = vlan->first_client; vc != NULL; vc = vc->next) {
395 if (vc == sender) {
396 continue;
397 }
398
399 /* no can_receive() handler, they can always receive */
400 if (!vc->can_receive || vc->can_receive(vc)) {
401 return 1;
402 }
403 }
404 return 0;
405 }
406
407 static int
408 qemu_deliver_packet(VLANClientState *sender, const uint8_t *buf, int size)
409 {
410 VLANClientState *vc;
411 int ret = -1;
412
413 sender->vlan->delivering = 1;
414
415 for (vc = sender->vlan->first_client; vc != NULL; vc = vc->next) {
416 ssize_t len;
417
418 if (vc == sender) {
419 continue;
420 }
421
422 if (vc->link_down) {
423 ret = size;
424 continue;
425 }
426
427 len = vc->receive(vc, buf, size);
428
429 ret = (ret >= 0) ? ret : len;
430 }
431
432 sender->vlan->delivering = 0;
433
434 return ret;
435 }
436
437 void qemu_purge_queued_packets(VLANClientState *vc)
438 {
439 VLANPacket *packet, *next;
440
441 TAILQ_FOREACH_SAFE(packet, &vc->vlan->send_queue, entry, next) {
442 if (packet->sender == vc) {
443 TAILQ_REMOVE(&vc->vlan->send_queue, packet, entry);
444 qemu_free(packet);
445 }
446 }
447 }
448
449 void qemu_flush_queued_packets(VLANClientState *vc)
450 {
451 while (!TAILQ_EMPTY(&vc->vlan->send_queue)) {
452 VLANPacket *packet;
453 int ret;
454
455 packet = TAILQ_FIRST(&vc->vlan->send_queue);
456 TAILQ_REMOVE(&vc->vlan->send_queue, packet, entry);
457
458 ret = qemu_deliver_packet(packet->sender, packet->data, packet->size);
459 if (ret == 0 && packet->sent_cb != NULL) {
460 TAILQ_INSERT_HEAD(&vc->vlan->send_queue, packet, entry);
461 break;
462 }
463
464 if (packet->sent_cb)
465 packet->sent_cb(packet->sender, ret);
466
467 qemu_free(packet);
468 }
469 }
470
471 static void qemu_enqueue_packet(VLANClientState *sender,
472 const uint8_t *buf, int size,
473 NetPacketSent *sent_cb)
474 {
475 VLANPacket *packet;
476
477 packet = qemu_malloc(sizeof(VLANPacket) + size);
478 packet->sender = sender;
479 packet->size = size;
480 packet->sent_cb = sent_cb;
481 memcpy(packet->data, buf, size);
482
483 TAILQ_INSERT_TAIL(&sender->vlan->send_queue, packet, entry);
484 }
485
486 ssize_t qemu_send_packet_async(VLANClientState *sender,
487 const uint8_t *buf, int size,
488 NetPacketSent *sent_cb)
489 {
490 int ret;
491
492 if (sender->link_down) {
493 return size;
494 }
495
496 #ifdef DEBUG_NET
497 printf("vlan %d send:\n", sender->vlan->id);
498 hex_dump(stdout, buf, size);
499 #endif
500
501 if (sender->vlan->delivering) {
502 qemu_enqueue_packet(sender, buf, size, NULL);
503 return size;
504 }
505
506 ret = qemu_deliver_packet(sender, buf, size);
507 if (ret == 0 && sent_cb != NULL) {
508 qemu_enqueue_packet(sender, buf, size, sent_cb);
509 return 0;
510 }
511
512 qemu_flush_queued_packets(sender);
513
514 return ret;
515 }
516
517 void qemu_send_packet(VLANClientState *vc, const uint8_t *buf, int size)
518 {
519 qemu_send_packet_async(vc, buf, size, NULL);
520 }
521
522 static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov,
523 int iovcnt)
524 {
525 uint8_t buffer[4096];
526 size_t offset = 0;
527 int i;
528
529 for (i = 0; i < iovcnt; i++) {
530 size_t len;
531
532 len = MIN(sizeof(buffer) - offset, iov[i].iov_len);
533 memcpy(buffer + offset, iov[i].iov_base, len);
534 offset += len;
535 }
536
537 return vc->receive(vc, buffer, offset);
538 }
539
540 static ssize_t calc_iov_length(const struct iovec *iov, int iovcnt)
541 {
542 size_t offset = 0;
543 int i;
544
545 for (i = 0; i < iovcnt; i++)
546 offset += iov[i].iov_len;
547 return offset;
548 }
549
550 static int qemu_deliver_packet_iov(VLANClientState *sender,
551 const struct iovec *iov, int iovcnt)
552 {
553 VLANClientState *vc;
554 int ret = -1;
555
556 sender->vlan->delivering = 1;
557
558 for (vc = sender->vlan->first_client; vc != NULL; vc = vc->next) {
559 ssize_t len;
560
561 if (vc == sender) {
562 continue;
563 }
564
565 if (vc->link_down) {
566 ret = calc_iov_length(iov, iovcnt);
567 continue;
568 }
569
570 if (vc->receive_iov) {
571 len = vc->receive_iov(vc, iov, iovcnt);
572 } else {
573 len = vc_sendv_compat(vc, iov, iovcnt);
574 }
575
576 ret = (ret >= 0) ? ret : len;
577 }
578
579 sender->vlan->delivering = 0;
580
581 return ret;
582 }
583
584 static ssize_t qemu_enqueue_packet_iov(VLANClientState *sender,
585 const struct iovec *iov, int iovcnt,
586 NetPacketSent *sent_cb)
587 {
588 VLANPacket *packet;
589 size_t max_len = 0;
590 int i;
591
592 max_len = calc_iov_length(iov, iovcnt);
593
594 packet = qemu_malloc(sizeof(VLANPacket) + max_len);
595 packet->sender = sender;
596 packet->sent_cb = sent_cb;
597 packet->size = 0;
598
599 for (i = 0; i < iovcnt; i++) {
600 size_t len = iov[i].iov_len;
601
602 memcpy(packet->data + packet->size, iov[i].iov_base, len);
603 packet->size += len;
604 }
605
606 TAILQ_INSERT_TAIL(&sender->vlan->send_queue, packet, entry);
607
608 return packet->size;
609 }
610
611 ssize_t qemu_sendv_packet_async(VLANClientState *sender,
612 const struct iovec *iov, int iovcnt,
613 NetPacketSent *sent_cb)
614 {
615 int ret;
616
617 if (sender->link_down) {
618 return calc_iov_length(iov, iovcnt);
619 }
620
621 if (sender->vlan->delivering) {
622 return qemu_enqueue_packet_iov(sender, iov, iovcnt, NULL);
623 }
624
625 ret = qemu_deliver_packet_iov(sender, iov, iovcnt);
626 if (ret == 0 && sent_cb != NULL) {
627 qemu_enqueue_packet_iov(sender, iov, iovcnt, sent_cb);
628 return 0;
629 }
630
631 qemu_flush_queued_packets(sender);
632
633 return ret;
634 }
635
636 ssize_t
637 qemu_sendv_packet(VLANClientState *vc, const struct iovec *iov, int iovcnt)
638 {
639 return qemu_sendv_packet_async(vc, iov, iovcnt, NULL);
640 }
641
642 static void config_error(Monitor *mon, const char *fmt, ...)
643 {
644 va_list ap;
645
646 va_start(ap, fmt);
647 if (mon) {
648 monitor_vprintf(mon, fmt, ap);
649 } else {
650 fprintf(stderr, "qemu: ");
651 vfprintf(stderr, fmt, ap);
652 exit(1);
653 }
654 va_end(ap);
655 }
656
657 #if defined(CONFIG_SLIRP)
658
659 /* slirp network adapter */
660
661 #define SLIRP_CFG_HOSTFWD 1
662 #define SLIRP_CFG_LEGACY 2
663
664 struct slirp_config_str {
665 struct slirp_config_str *next;
666 int flags;
667 char str[1024];
668 int legacy_format;
669 };
670
671 typedef struct SlirpState {
672 TAILQ_ENTRY(SlirpState) entry;
673 VLANClientState *vc;
674 Slirp *slirp;
675 #ifndef _WIN32
676 char smb_dir[128];
677 #endif
678 } SlirpState;
679
680 static struct slirp_config_str *slirp_configs;
681 const char *legacy_tftp_prefix;
682 const char *legacy_bootp_filename;
683 static TAILQ_HEAD(slirp_stacks, SlirpState) slirp_stacks =
684 TAILQ_HEAD_INITIALIZER(slirp_stacks);
685
686 static void slirp_hostfwd(SlirpState *s, Monitor *mon, const char *redir_str,
687 int legacy_format);
688 static void slirp_guestfwd(SlirpState *s, Monitor *mon, const char *config_str,
689 int legacy_format);
690
691 #ifndef _WIN32
692 static const char *legacy_smb_export;
693
694 static void slirp_smb(SlirpState *s, Monitor *mon, const char *exported_dir,
695 struct in_addr vserver_addr);
696 static void slirp_smb_cleanup(SlirpState *s);
697 #else
698 static inline void slirp_smb_cleanup(SlirpState *s) { }
699 #endif
700
701 int slirp_can_output(void *opaque)
702 {
703 SlirpState *s = opaque;
704
705 return qemu_can_send_packet(s->vc);
706 }
707
708 void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len)
709 {
710 SlirpState *s = opaque;
711
712 #ifdef DEBUG_SLIRP
713 printf("slirp output:\n");
714 hex_dump(stdout, pkt, pkt_len);
715 #endif
716 qemu_send_packet(s->vc, pkt, pkt_len);
717 }
718
719 static ssize_t slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
720 {
721 SlirpState *s = vc->opaque;
722
723 #ifdef DEBUG_SLIRP
724 printf("slirp input:\n");
725 hex_dump(stdout, buf, size);
726 #endif
727 slirp_input(s->slirp, buf, size);
728 return size;
729 }
730
731 static void net_slirp_cleanup(VLANClientState *vc)
732 {
733 SlirpState *s = vc->opaque;
734
735 slirp_cleanup(s->slirp);
736 slirp_smb_cleanup(s);
737 TAILQ_REMOVE(&slirp_stacks, s, entry);
738 qemu_free(s);
739 }
740
741 static int net_slirp_init(Monitor *mon, VLANState *vlan, const char *model,
742 const char *name, int restricted,
743 const char *vnetwork, const char *vhost,
744 const char *vhostname, const char *tftp_export,
745 const char *bootfile, const char *vdhcp_start,
746 const char *vnameserver, const char *smb_export,
747 const char *vsmbserver)
748 {
749 /* default settings according to historic slirp */
750 struct in_addr net = { .s_addr = htonl(0x0a000200) }; /* 10.0.2.0 */
751 struct in_addr mask = { .s_addr = htonl(0xffffff00) }; /* 255.255.255.0 */
752 struct in_addr host = { .s_addr = htonl(0x0a000202) }; /* 10.0.2.2 */
753 struct in_addr dhcp = { .s_addr = htonl(0x0a00020f) }; /* 10.0.2.15 */
754 struct in_addr dns = { .s_addr = htonl(0x0a000203) }; /* 10.0.2.3 */
755 #ifndef _WIN32
756 struct in_addr smbsrv = { .s_addr = 0 };
757 #endif
758 SlirpState *s;
759 char buf[20];
760 uint32_t addr;
761 int shift;
762 char *end;
763
764 if (!tftp_export) {
765 tftp_export = legacy_tftp_prefix;
766 }
767 if (!bootfile) {
768 bootfile = legacy_bootp_filename;
769 }
770
771 if (vnetwork) {
772 if (get_str_sep(buf, sizeof(buf), &vnetwork, '/') < 0) {
773 if (!inet_aton(vnetwork, &net)) {
774 return -1;
775 }
776 addr = ntohl(net.s_addr);
777 if (!(addr & 0x80000000)) {
778 mask.s_addr = htonl(0xff000000); /* class A */
779 } else if ((addr & 0xfff00000) == 0xac100000) {
780 mask.s_addr = htonl(0xfff00000); /* priv. 172.16.0.0/12 */
781 } else if ((addr & 0xc0000000) == 0x80000000) {
782 mask.s_addr = htonl(0xffff0000); /* class B */
783 } else if ((addr & 0xffff0000) == 0xc0a80000) {
784 mask.s_addr = htonl(0xffff0000); /* priv. 192.168.0.0/16 */
785 } else if ((addr & 0xffff0000) == 0xc6120000) {
786 mask.s_addr = htonl(0xfffe0000); /* tests 198.18.0.0/15 */
787 } else if ((addr & 0xe0000000) == 0xe0000000) {
788 mask.s_addr = htonl(0xffffff00); /* class C */
789 } else {
790 mask.s_addr = htonl(0xfffffff0); /* multicast/reserved */
791 }
792 } else {
793 if (!inet_aton(buf, &net)) {
794 return -1;
795 }
796 shift = strtol(vnetwork, &end, 10);
797 if (*end != '\0') {
798 if (!inet_aton(vnetwork, &mask)) {
799 return -1;
800 }
801 } else if (shift < 4 || shift > 32) {
802 return -1;
803 } else {
804 mask.s_addr = htonl(0xffffffff << (32 - shift));
805 }
806 }
807 net.s_addr &= mask.s_addr;
808 host.s_addr = net.s_addr | (htonl(0x0202) & ~mask.s_addr);
809 dhcp.s_addr = net.s_addr | (htonl(0x020f) & ~mask.s_addr);
810 dns.s_addr = net.s_addr | (htonl(0x0203) & ~mask.s_addr);
811 }
812
813 if (vhost && !inet_aton(vhost, &host)) {
814 return -1;
815 }
816 if ((host.s_addr & mask.s_addr) != net.s_addr) {
817 return -1;
818 }
819
820 if (vdhcp_start && !inet_aton(vdhcp_start, &dhcp)) {
821 return -1;
822 }
823 if ((dhcp.s_addr & mask.s_addr) != net.s_addr ||
824 dhcp.s_addr == host.s_addr || dhcp.s_addr == dns.s_addr) {
825 return -1;
826 }
827
828 if (vnameserver && !inet_aton(vnameserver, &dns)) {
829 return -1;
830 }
831 if ((dns.s_addr & mask.s_addr) != net.s_addr ||
832 dns.s_addr == host.s_addr) {
833 return -1;
834 }
835
836 #ifndef _WIN32
837 if (vsmbserver && !inet_aton(vsmbserver, &smbsrv)) {
838 return -1;
839 }
840 #endif
841
842 s = qemu_mallocz(sizeof(SlirpState));
843 s->slirp = slirp_init(restricted, net, mask, host, vhostname,
844 tftp_export, bootfile, dhcp, dns, s);
845 TAILQ_INSERT_TAIL(&slirp_stacks, s, entry);
846
847 while (slirp_configs) {
848 struct slirp_config_str *config = slirp_configs;
849
850 if (config->flags & SLIRP_CFG_HOSTFWD) {
851 slirp_hostfwd(s, mon, config->str,
852 config->flags & SLIRP_CFG_LEGACY);
853 } else {
854 slirp_guestfwd(s, mon, config->str,
855 config->flags & SLIRP_CFG_LEGACY);
856 }
857 slirp_configs = config->next;
858 qemu_free(config);
859 }
860 #ifndef _WIN32
861 if (!smb_export) {
862 smb_export = legacy_smb_export;
863 }
864 if (smb_export) {
865 slirp_smb(s, mon, smb_export, smbsrv);
866 }
867 #endif
868
869 s->vc = qemu_new_vlan_client(vlan, model, name, NULL, slirp_receive, NULL,
870 net_slirp_cleanup, s);
871 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
872 "net=%s, restricted=%c", inet_ntoa(net), restricted ? 'y' : 'n');
873 return 0;
874 }
875
876 static SlirpState *slirp_lookup(Monitor *mon, const char *vlan,
877 const char *stack)
878 {
879 VLANClientState *vc;
880
881 if (vlan) {
882 vc = qemu_find_vlan_client_by_name(mon, strtol(vlan, NULL, 0), stack);
883 if (!vc) {
884 return NULL;
885 }
886 if (strcmp(vc->model, "user")) {
887 monitor_printf(mon, "invalid device specified\n");
888 return NULL;
889 }
890 return vc->opaque;
891 } else {
892 if (TAILQ_EMPTY(&slirp_stacks)) {
893 monitor_printf(mon, "user mode network stack not in use\n");
894 return NULL;
895 }
896 return TAILQ_FIRST(&slirp_stacks);
897 }
898 }
899
900 void net_slirp_hostfwd_remove(Monitor *mon, const QDict *qdict)
901 {
902 struct in_addr host_addr = { .s_addr = INADDR_ANY };
903 int host_port;
904 char buf[256] = "";
905 const char *src_str, *p;
906 SlirpState *s;
907 int is_udp = 0;
908 int err;
909 const char *arg1 = qdict_get_str(qdict, "arg1");
910 const char *arg2 = qdict_get_try_str(qdict, "arg2");
911 const char *arg3 = qdict_get_try_str(qdict, "arg3");
912
913 if (arg2) {
914 s = slirp_lookup(mon, arg1, arg2);
915 src_str = arg3;
916 } else {
917 s = slirp_lookup(mon, NULL, NULL);
918 src_str = arg1;
919 }
920 if (!s) {
921 return;
922 }
923
924 if (!src_str || !src_str[0])
925 goto fail_syntax;
926
927 p = src_str;
928 get_str_sep(buf, sizeof(buf), &p, ':');
929
930 if (!strcmp(buf, "tcp") || buf[0] == '\0') {
931 is_udp = 0;
932 } else if (!strcmp(buf, "udp")) {
933 is_udp = 1;
934 } else {
935 goto fail_syntax;
936 }
937
938 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
939 goto fail_syntax;
940 }
941 if (buf[0] != '\0' && !inet_aton(buf, &host_addr)) {
942 goto fail_syntax;
943 }
944
945 host_port = atoi(p);
946
947 err = slirp_remove_hostfwd(TAILQ_FIRST(&slirp_stacks)->slirp, is_udp,
948 host_addr, host_port);
949
950 monitor_printf(mon, "host forwarding rule for %s %s\n", src_str,
951 err ? "removed" : "not found");
952 return;
953
954 fail_syntax:
955 monitor_printf(mon, "invalid format\n");
956 }
957
958 static void slirp_hostfwd(SlirpState *s, Monitor *mon, const char *redir_str,
959 int legacy_format)
960 {
961 struct in_addr host_addr = { .s_addr = INADDR_ANY };
962 struct in_addr guest_addr = { .s_addr = 0 };
963 int host_port, guest_port;
964 const char *p;
965 char buf[256];
966 int is_udp;
967 char *end;
968
969 p = redir_str;
970 if (!p || get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
971 goto fail_syntax;
972 }
973 if (!strcmp(buf, "tcp") || buf[0] == '\0') {
974 is_udp = 0;
975 } else if (!strcmp(buf, "udp")) {
976 is_udp = 1;
977 } else {
978 goto fail_syntax;
979 }
980
981 if (!legacy_format) {
982 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
983 goto fail_syntax;
984 }
985 if (buf[0] != '\0' && !inet_aton(buf, &host_addr)) {
986 goto fail_syntax;
987 }
988 }
989
990 if (get_str_sep(buf, sizeof(buf), &p, legacy_format ? ':' : '-') < 0) {
991 goto fail_syntax;
992 }
993 host_port = strtol(buf, &end, 0);
994 if (*end != '\0' || host_port < 1 || host_port > 65535) {
995 goto fail_syntax;
996 }
997
998 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
999 goto fail_syntax;
1000 }
1001 if (buf[0] != '\0' && !inet_aton(buf, &guest_addr)) {
1002 goto fail_syntax;
1003 }
1004
1005 guest_port = strtol(p, &end, 0);
1006 if (*end != '\0' || guest_port < 1 || guest_port > 65535) {
1007 goto fail_syntax;
1008 }
1009
1010 if (slirp_add_hostfwd(s->slirp, is_udp, host_addr, host_port, guest_addr,
1011 guest_port) < 0) {
1012 config_error(mon, "could not set up host forwarding rule '%s'\n",
1013 redir_str);
1014 }
1015 return;
1016
1017 fail_syntax:
1018 config_error(mon, "invalid host forwarding rule '%s'\n", redir_str);
1019 }
1020
1021 void net_slirp_hostfwd_add(Monitor *mon, const QDict *qdict)
1022 {
1023 const char *redir_str;
1024 SlirpState *s;
1025 const char *arg1 = qdict_get_str(qdict, "arg1");
1026 const char *arg2 = qdict_get_try_str(qdict, "arg2");
1027 const char *arg3 = qdict_get_try_str(qdict, "arg3");
1028
1029 if (arg2) {
1030 s = slirp_lookup(mon, arg1, arg2);
1031 redir_str = arg3;
1032 } else {
1033 s = slirp_lookup(mon, NULL, NULL);
1034 redir_str = arg1;
1035 }
1036 if (s) {
1037 slirp_hostfwd(s, mon, redir_str, 0);
1038 }
1039
1040 }
1041
1042 void net_slirp_redir(const char *redir_str)
1043 {
1044 struct slirp_config_str *config;
1045
1046 if (TAILQ_EMPTY(&slirp_stacks)) {
1047 config = qemu_malloc(sizeof(*config));
1048 pstrcpy(config->str, sizeof(config->str), redir_str);
1049 config->flags = SLIRP_CFG_HOSTFWD | SLIRP_CFG_LEGACY;
1050 config->next = slirp_configs;
1051 slirp_configs = config;
1052 return;
1053 }
1054
1055 slirp_hostfwd(TAILQ_FIRST(&slirp_stacks), NULL, redir_str, 1);
1056 }
1057
1058 #ifndef _WIN32
1059
1060 /* automatic user mode samba server configuration */
1061 static void slirp_smb_cleanup(SlirpState *s)
1062 {
1063 char cmd[128];
1064
1065 if (s->smb_dir[0] != '\0') {
1066 snprintf(cmd, sizeof(cmd), "rm -rf %s", s->smb_dir);
1067 system(cmd);
1068 s->smb_dir[0] = '\0';
1069 }
1070 }
1071
1072 static void slirp_smb(SlirpState* s, Monitor *mon, const char *exported_dir,
1073 struct in_addr vserver_addr)
1074 {
1075 static int instance;
1076 char smb_conf[128];
1077 char smb_cmdline[128];
1078 FILE *f;
1079
1080 snprintf(s->smb_dir, sizeof(s->smb_dir), "/tmp/qemu-smb.%ld-%d",
1081 (long)getpid(), instance++);
1082 if (mkdir(s->smb_dir, 0700) < 0) {
1083 config_error(mon, "could not create samba server dir '%s'\n",
1084 s->smb_dir);
1085 return;
1086 }
1087 snprintf(smb_conf, sizeof(smb_conf), "%s/%s", s->smb_dir, "smb.conf");
1088
1089 f = fopen(smb_conf, "w");
1090 if (!f) {
1091 slirp_smb_cleanup(s);
1092 config_error(mon, "could not create samba server "
1093 "configuration file '%s'\n", smb_conf);
1094 return;
1095 }
1096 fprintf(f,
1097 "[global]\n"
1098 "private dir=%s\n"
1099 "smb ports=0\n"
1100 "socket address=127.0.0.1\n"
1101 "pid directory=%s\n"
1102 "lock directory=%s\n"
1103 "log file=%s/log.smbd\n"
1104 "smb passwd file=%s/smbpasswd\n"
1105 "security = share\n"
1106 "[qemu]\n"
1107 "path=%s\n"
1108 "read only=no\n"
1109 "guest ok=yes\n",
1110 s->smb_dir,
1111 s->smb_dir,
1112 s->smb_dir,
1113 s->smb_dir,
1114 s->smb_dir,
1115 exported_dir
1116 );
1117 fclose(f);
1118
1119 snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
1120 SMBD_COMMAND, smb_conf);
1121
1122 if (slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 139) < 0) {
1123 slirp_smb_cleanup(s);
1124 config_error(mon, "conflicting/invalid smbserver address\n");
1125 }
1126 }
1127
1128 /* automatic user mode samba server configuration (legacy interface) */
1129 void net_slirp_smb(const char *exported_dir)
1130 {
1131 struct in_addr vserver_addr = { .s_addr = 0 };
1132
1133 if (legacy_smb_export) {
1134 fprintf(stderr, "-smb given twice\n");
1135 exit(1);
1136 }
1137 legacy_smb_export = exported_dir;
1138 if (!TAILQ_EMPTY(&slirp_stacks)) {
1139 slirp_smb(TAILQ_FIRST(&slirp_stacks), NULL, exported_dir,
1140 vserver_addr);
1141 }
1142 }
1143
1144 #endif /* !defined(_WIN32) */
1145
1146 struct GuestFwd {
1147 CharDriverState *hd;
1148 struct in_addr server;
1149 int port;
1150 Slirp *slirp;
1151 };
1152
1153 static int guestfwd_can_read(void *opaque)
1154 {
1155 struct GuestFwd *fwd = opaque;
1156 return slirp_socket_can_recv(fwd->slirp, fwd->server, fwd->port);
1157 }
1158
1159 static void guestfwd_read(void *opaque, const uint8_t *buf, int size)
1160 {
1161 struct GuestFwd *fwd = opaque;
1162 slirp_socket_recv(fwd->slirp, fwd->server, fwd->port, buf, size);
1163 }
1164
1165 static void slirp_guestfwd(SlirpState *s, Monitor *mon, const char *config_str,
1166 int legacy_format)
1167 {
1168 struct in_addr server = { .s_addr = 0 };
1169 struct GuestFwd *fwd;
1170 const char *p;
1171 char buf[128];
1172 char *end;
1173 int port;
1174
1175 p = config_str;
1176 if (legacy_format) {
1177 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1178 goto fail_syntax;
1179 }
1180 } else {
1181 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1182 goto fail_syntax;
1183 }
1184 if (strcmp(buf, "tcp") && buf[0] != '\0') {
1185 goto fail_syntax;
1186 }
1187 if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1188 goto fail_syntax;
1189 }
1190 if (buf[0] != '\0' && !inet_aton(buf, &server)) {
1191 goto fail_syntax;
1192 }
1193 if (get_str_sep(buf, sizeof(buf), &p, '-') < 0) {
1194 goto fail_syntax;
1195 }
1196 }
1197 port = strtol(buf, &end, 10);
1198 if (*end != '\0' || port < 1 || port > 65535) {
1199 goto fail_syntax;
1200 }
1201
1202 fwd = qemu_malloc(sizeof(struct GuestFwd));
1203 snprintf(buf, sizeof(buf), "guestfwd.tcp:%d", port);
1204 fwd->hd = qemu_chr_open(buf, p, NULL);
1205 if (!fwd->hd) {
1206 config_error(mon, "could not open guest forwarding device '%s'\n",
1207 buf);
1208 qemu_free(fwd);
1209 return;
1210 }
1211
1212 if (slirp_add_exec(s->slirp, 3, fwd->hd, &server, port) < 0) {
1213 config_error(mon, "conflicting/invalid host:port in guest forwarding "
1214 "rule '%s'\n", config_str);
1215 qemu_free(fwd);
1216 return;
1217 }
1218 fwd->server = server;
1219 fwd->port = port;
1220 fwd->slirp = s->slirp;
1221
1222 qemu_chr_add_handlers(fwd->hd, guestfwd_can_read, guestfwd_read,
1223 NULL, fwd);
1224 return;
1225
1226 fail_syntax:
1227 config_error(mon, "invalid guest forwarding rule '%s'\n", config_str);
1228 }
1229
1230 void do_info_usernet(Monitor *mon)
1231 {
1232 SlirpState *s;
1233
1234 TAILQ_FOREACH(s, &slirp_stacks, entry) {
1235 monitor_printf(mon, "VLAN %d (%s):\n", s->vc->vlan->id, s->vc->name);
1236 slirp_connection_info(s->slirp, mon);
1237 }
1238 }
1239
1240 #endif /* CONFIG_SLIRP */
1241
1242 #if !defined(_WIN32)
1243
1244 typedef struct TAPState {
1245 VLANClientState *vc;
1246 int fd;
1247 char down_script[1024];
1248 char down_script_arg[128];
1249 uint8_t buf[4096];
1250 unsigned int read_poll : 1;
1251 unsigned int write_poll : 1;
1252 } TAPState;
1253
1254 static int launch_script(const char *setup_script, const char *ifname, int fd);
1255
1256 static int tap_can_send(void *opaque);
1257 static void tap_send(void *opaque);
1258 static void tap_writable(void *opaque);
1259
1260 static void tap_update_fd_handler(TAPState *s)
1261 {
1262 qemu_set_fd_handler2(s->fd,
1263 s->read_poll ? tap_can_send : NULL,
1264 s->read_poll ? tap_send : NULL,
1265 s->write_poll ? tap_writable : NULL,
1266 s);
1267 }
1268
1269 static void tap_read_poll(TAPState *s, int enable)
1270 {
1271 s->read_poll = !!enable;
1272 tap_update_fd_handler(s);
1273 }
1274
1275 static void tap_write_poll(TAPState *s, int enable)
1276 {
1277 s->write_poll = !!enable;
1278 tap_update_fd_handler(s);
1279 }
1280
1281 static void tap_writable(void *opaque)
1282 {
1283 TAPState *s = opaque;
1284
1285 tap_write_poll(s, 0);
1286
1287 qemu_flush_queued_packets(s->vc);
1288 }
1289
1290 static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
1291 int iovcnt)
1292 {
1293 TAPState *s = vc->opaque;
1294 ssize_t len;
1295
1296 do {
1297 len = writev(s->fd, iov, iovcnt);
1298 } while (len == -1 && errno == EINTR);
1299
1300 if (len == -1 && errno == EAGAIN) {
1301 tap_write_poll(s, 1);
1302 return 0;
1303 }
1304
1305 return len;
1306 }
1307
1308 static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1309 {
1310 TAPState *s = vc->opaque;
1311 ssize_t len;
1312
1313 do {
1314 len = write(s->fd, buf, size);
1315 } while (len == -1 && (errno == EINTR || errno == EAGAIN));
1316
1317 return len;
1318 }
1319
1320 static int tap_can_send(void *opaque)
1321 {
1322 TAPState *s = opaque;
1323
1324 return qemu_can_send_packet(s->vc);
1325 }
1326
1327 #ifdef __sun__
1328 static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1329 {
1330 struct strbuf sbuf;
1331 int f = 0;
1332
1333 sbuf.maxlen = maxlen;
1334 sbuf.buf = (char *)buf;
1335
1336 return getmsg(tapfd, NULL, &sbuf, &f) >= 0 ? sbuf.len : -1;
1337 }
1338 #else
1339 static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1340 {
1341 return read(tapfd, buf, maxlen);
1342 }
1343 #endif
1344
1345 static void tap_send_completed(VLANClientState *vc, ssize_t len)
1346 {
1347 TAPState *s = vc->opaque;
1348 tap_read_poll(s, 1);
1349 }
1350
1351 static void tap_send(void *opaque)
1352 {
1353 TAPState *s = opaque;
1354 int size;
1355
1356 do {
1357 size = tap_read_packet(s->fd, s->buf, sizeof(s->buf));
1358 if (size <= 0) {
1359 break;
1360 }
1361
1362 size = qemu_send_packet_async(s->vc, s->buf, size, tap_send_completed);
1363 if (size == 0) {
1364 tap_read_poll(s, 0);
1365 }
1366 } while (size > 0);
1367 }
1368
1369 #ifdef TUNSETSNDBUF
1370 /* sndbuf should be set to a value lower than the tx queue
1371 * capacity of any destination network interface.
1372 * Ethernet NICs generally have txqueuelen=1000, so 1Mb is
1373 * a good default, given a 1500 byte MTU.
1374 */
1375 #define TAP_DEFAULT_SNDBUF 1024*1024
1376
1377 static void tap_set_sndbuf(TAPState *s, const char *sndbuf_str, Monitor *mon)
1378 {
1379 int sndbuf = TAP_DEFAULT_SNDBUF;
1380
1381 if (sndbuf_str) {
1382 sndbuf = atoi(sndbuf_str);
1383 }
1384
1385 if (!sndbuf) {
1386 sndbuf = INT_MAX;
1387 }
1388
1389 if (ioctl(s->fd, TUNSETSNDBUF, &sndbuf) == -1 && sndbuf_str) {
1390 config_error(mon, "TUNSETSNDBUF ioctl failed: %s\n",
1391 strerror(errno));
1392 }
1393 }
1394 #else
1395 static void tap_set_sndbuf(TAPState *s, const char *sndbuf_str, Monitor *mon)
1396 {
1397 if (sndbuf_str) {
1398 config_error(mon, "No '-net tap,sndbuf=<nbytes>' support available\n");
1399 }
1400 }
1401 #endif /* TUNSETSNDBUF */
1402
1403 static void tap_cleanup(VLANClientState *vc)
1404 {
1405 TAPState *s = vc->opaque;
1406
1407 qemu_purge_queued_packets(vc);
1408
1409 if (s->down_script[0])
1410 launch_script(s->down_script, s->down_script_arg, s->fd);
1411
1412 tap_read_poll(s, 0);
1413 tap_write_poll(s, 0);
1414 close(s->fd);
1415 qemu_free(s);
1416 }
1417
1418 /* fd support */
1419
1420 static TAPState *net_tap_fd_init(VLANState *vlan,
1421 const char *model,
1422 const char *name,
1423 int fd)
1424 {
1425 TAPState *s;
1426
1427 s = qemu_mallocz(sizeof(TAPState));
1428 s->fd = fd;
1429 s->vc = qemu_new_vlan_client(vlan, model, name, NULL, tap_receive,
1430 tap_receive_iov, tap_cleanup, s);
1431 tap_read_poll(s, 1);
1432 snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", fd);
1433 return s;
1434 }
1435
1436 #if defined (CONFIG_BSD) || defined (__FreeBSD_kernel__)
1437 static int tap_open(char *ifname, int ifname_size)
1438 {
1439 int fd;
1440 char *dev;
1441 struct stat s;
1442
1443 TFR(fd = open("/dev/tap", O_RDWR));
1444 if (fd < 0) {
1445 fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
1446 return -1;
1447 }
1448
1449 fstat(fd, &s);
1450 dev = devname(s.st_rdev, S_IFCHR);
1451 pstrcpy(ifname, ifname_size, dev);
1452
1453 fcntl(fd, F_SETFL, O_NONBLOCK);
1454 return fd;
1455 }
1456 #elif defined(__sun__)
1457 #define TUNNEWPPA (('T'<<16) | 0x0001)
1458 /*
1459 * Allocate TAP device, returns opened fd.
1460 * Stores dev name in the first arg(must be large enough).
1461 */
1462 static int tap_alloc(char *dev, size_t dev_size)
1463 {
1464 int tap_fd, if_fd, ppa = -1;
1465 static int ip_fd = 0;
1466 char *ptr;
1467
1468 static int arp_fd = 0;
1469 int ip_muxid, arp_muxid;
1470 struct strioctl strioc_if, strioc_ppa;
1471 int link_type = I_PLINK;;
1472 struct lifreq ifr;
1473 char actual_name[32] = "";
1474
1475 memset(&ifr, 0x0, sizeof(ifr));
1476
1477 if( *dev ){
1478 ptr = dev;
1479 while( *ptr && !qemu_isdigit((int)*ptr) ) ptr++;
1480 ppa = atoi(ptr);
1481 }
1482
1483 /* Check if IP device was opened */
1484 if( ip_fd )
1485 close(ip_fd);
1486
1487 TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
1488 if (ip_fd < 0) {
1489 syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
1490 return -1;
1491 }
1492
1493 TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
1494 if (tap_fd < 0) {
1495 syslog(LOG_ERR, "Can't open /dev/tap");
1496 return -1;
1497 }
1498
1499 /* Assign a new PPA and get its unit number. */
1500 strioc_ppa.ic_cmd = TUNNEWPPA;
1501 strioc_ppa.ic_timout = 0;
1502 strioc_ppa.ic_len = sizeof(ppa);
1503 strioc_ppa.ic_dp = (char *)&ppa;
1504 if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
1505 syslog (LOG_ERR, "Can't assign new interface");
1506
1507 TFR(if_fd = open("/dev/tap", O_RDWR, 0));
1508 if (if_fd < 0) {
1509 syslog(LOG_ERR, "Can't open /dev/tap (2)");
1510 return -1;
1511 }
1512 if(ioctl(if_fd, I_PUSH, "ip") < 0){
1513 syslog(LOG_ERR, "Can't push IP module");
1514 return -1;
1515 }
1516
1517 if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
1518 syslog(LOG_ERR, "Can't get flags\n");
1519
1520 snprintf (actual_name, 32, "tap%d", ppa);
1521 pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1522
1523 ifr.lifr_ppa = ppa;
1524 /* Assign ppa according to the unit number returned by tun device */
1525
1526 if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
1527 syslog (LOG_ERR, "Can't set PPA %d", ppa);
1528 if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
1529 syslog (LOG_ERR, "Can't get flags\n");
1530 /* Push arp module to if_fd */
1531 if (ioctl (if_fd, I_PUSH, "arp") < 0)
1532 syslog (LOG_ERR, "Can't push ARP module (2)");
1533
1534 /* Push arp module to ip_fd */
1535 if (ioctl (ip_fd, I_POP, NULL) < 0)
1536 syslog (LOG_ERR, "I_POP failed\n");
1537 if (ioctl (ip_fd, I_PUSH, "arp") < 0)
1538 syslog (LOG_ERR, "Can't push ARP module (3)\n");
1539 /* Open arp_fd */
1540 TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
1541 if (arp_fd < 0)
1542 syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
1543
1544 /* Set ifname to arp */
1545 strioc_if.ic_cmd = SIOCSLIFNAME;
1546 strioc_if.ic_timout = 0;
1547 strioc_if.ic_len = sizeof(ifr);
1548 strioc_if.ic_dp = (char *)&ifr;
1549 if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
1550 syslog (LOG_ERR, "Can't set ifname to arp\n");
1551 }
1552
1553 if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
1554 syslog(LOG_ERR, "Can't link TAP device to IP");
1555 return -1;
1556 }
1557
1558 if ((arp_muxid = ioctl (ip_fd, link_type, arp_fd)) < 0)
1559 syslog (LOG_ERR, "Can't link TAP device to ARP");
1560
1561 close (if_fd);
1562
1563 memset(&ifr, 0x0, sizeof(ifr));
1564 pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1565 ifr.lifr_ip_muxid = ip_muxid;
1566 ifr.lifr_arp_muxid = arp_muxid;
1567
1568 if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
1569 {
1570 ioctl (ip_fd, I_PUNLINK , arp_muxid);
1571 ioctl (ip_fd, I_PUNLINK, ip_muxid);
1572 syslog (LOG_ERR, "Can't set multiplexor id");
1573 }
1574
1575 snprintf(dev, dev_size, "tap%d", ppa);
1576 return tap_fd;
1577 }
1578
1579 static int tap_open(char *ifname, int ifname_size)
1580 {
1581 char dev[10]="";
1582 int fd;
1583 if( (fd = tap_alloc(dev, sizeof(dev))) < 0 ){
1584 fprintf(stderr, "Cannot allocate TAP device\n");
1585 return -1;
1586 }
1587 pstrcpy(ifname, ifname_size, dev);
1588 fcntl(fd, F_SETFL, O_NONBLOCK);
1589 return fd;
1590 }
1591 #elif defined (_AIX)
1592 static int tap_open(char *ifname, int ifname_size)
1593 {
1594 fprintf (stderr, "no tap on AIX\n");
1595 return -1;
1596 }
1597 #else
1598 static int tap_open(char *ifname, int ifname_size)
1599 {
1600 struct ifreq ifr;
1601 int fd, ret;
1602
1603 TFR(fd = open("/dev/net/tun", O_RDWR));
1604 if (fd < 0) {
1605 fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
1606 return -1;
1607 }
1608 memset(&ifr, 0, sizeof(ifr));
1609 ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
1610 if (ifname[0] != '\0')
1611 pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
1612 else
1613 pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
1614 ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
1615 if (ret != 0) {
1616 fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
1617 close(fd);
1618 return -1;
1619 }
1620 pstrcpy(ifname, ifname_size, ifr.ifr_name);
1621 fcntl(fd, F_SETFL, O_NONBLOCK);
1622 return fd;
1623 }
1624 #endif
1625
1626 static int launch_script(const char *setup_script, const char *ifname, int fd)
1627 {
1628 sigset_t oldmask, mask;
1629 int pid, status;
1630 char *args[3];
1631 char **parg;
1632
1633 sigemptyset(&mask);
1634 sigaddset(&mask, SIGCHLD);
1635 sigprocmask(SIG_BLOCK, &mask, &oldmask);
1636
1637 /* try to launch network script */
1638 pid = fork();
1639 if (pid == 0) {
1640 int open_max = sysconf(_SC_OPEN_MAX), i;
1641
1642 for (i = 0; i < open_max; i++) {
1643 if (i != STDIN_FILENO &&
1644 i != STDOUT_FILENO &&
1645 i != STDERR_FILENO &&
1646 i != fd) {
1647 close(i);
1648 }
1649 }
1650 parg = args;
1651 *parg++ = (char *)setup_script;
1652 *parg++ = (char *)ifname;
1653 *parg++ = NULL;
1654 execv(setup_script, args);
1655 _exit(1);
1656 } else if (pid > 0) {
1657 while (waitpid(pid, &status, 0) != pid) {
1658 /* loop */
1659 }
1660 sigprocmask(SIG_SETMASK, &oldmask, NULL);
1661
1662 if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
1663 return 0;
1664 }
1665 }
1666 fprintf(stderr, "%s: could not launch network script\n", setup_script);
1667 return -1;
1668 }
1669
1670 static TAPState *net_tap_init(VLANState *vlan, const char *model,
1671 const char *name, const char *ifname1,
1672 const char *setup_script, const char *down_script)
1673 {
1674 TAPState *s;
1675 int fd;
1676 char ifname[128];
1677
1678 if (ifname1 != NULL)
1679 pstrcpy(ifname, sizeof(ifname), ifname1);
1680 else
1681 ifname[0] = '\0';
1682 TFR(fd = tap_open(ifname, sizeof(ifname)));
1683 if (fd < 0)
1684 return NULL;
1685
1686 if (!setup_script || !strcmp(setup_script, "no"))
1687 setup_script = "";
1688 if (setup_script[0] != '\0' &&
1689 launch_script(setup_script, ifname, fd)) {
1690 return NULL;
1691 }
1692 s = net_tap_fd_init(vlan, model, name, fd);
1693 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1694 "ifname=%s,script=%s,downscript=%s",
1695 ifname, setup_script, down_script);
1696 if (down_script && strcmp(down_script, "no")) {
1697 snprintf(s->down_script, sizeof(s->down_script), "%s", down_script);
1698 snprintf(s->down_script_arg, sizeof(s->down_script_arg), "%s", ifname);
1699 }
1700 return s;
1701 }
1702
1703 #endif /* !_WIN32 */
1704
1705 #if defined(CONFIG_VDE)
1706 typedef struct VDEState {
1707 VLANClientState *vc;
1708 VDECONN *vde;
1709 } VDEState;
1710
1711 static void vde_to_qemu(void *opaque)
1712 {
1713 VDEState *s = opaque;
1714 uint8_t buf[4096];
1715 int size;
1716
1717 size = vde_recv(s->vde, (char *)buf, sizeof(buf), 0);
1718 if (size > 0) {
1719 qemu_send_packet(s->vc, buf, size);
1720 }
1721 }
1722
1723 static ssize_t vde_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1724 {
1725 VDEState *s = vc->opaque;
1726 ssize_t ret;
1727
1728 do {
1729 ret = vde_send(s->vde, (const char *)buf, size, 0);
1730 } while (ret < 0 && errno == EINTR);
1731
1732 return ret;
1733 }
1734
1735 static void vde_cleanup(VLANClientState *vc)
1736 {
1737 VDEState *s = vc->opaque;
1738 qemu_set_fd_handler(vde_datafd(s->vde), NULL, NULL, NULL);
1739 vde_close(s->vde);
1740 qemu_free(s);
1741 }
1742
1743 static int net_vde_init(VLANState *vlan, const char *model,
1744 const char *name, const char *sock,
1745 int port, const char *group, int mode)
1746 {
1747 VDEState *s;
1748 char *init_group = strlen(group) ? (char *)group : NULL;
1749 char *init_sock = strlen(sock) ? (char *)sock : NULL;
1750
1751 struct vde_open_args args = {
1752 .port = port,
1753 .group = init_group,
1754 .mode = mode,
1755 };
1756
1757 s = qemu_mallocz(sizeof(VDEState));
1758 s->vde = vde_open(init_sock, (char *)"QEMU", &args);
1759 if (!s->vde){
1760 free(s);
1761 return -1;
1762 }
1763 s->vc = qemu_new_vlan_client(vlan, model, name, NULL, vde_receive,
1764 NULL, vde_cleanup, s);
1765 qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s);
1766 snprintf(s->vc->info_str, sizeof(s->vc->info_str), "sock=%s,fd=%d",
1767 sock, vde_datafd(s->vde));
1768 return 0;
1769 }
1770 #endif
1771
1772 /* network connection */
1773 typedef struct NetSocketState {
1774 VLANClientState *vc;
1775 int fd;
1776 int state; /* 0 = getting length, 1 = getting data */
1777 unsigned int index;
1778 unsigned int packet_len;
1779 uint8_t buf[4096];
1780 struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
1781 } NetSocketState;
1782
1783 typedef struct NetSocketListenState {
1784 VLANState *vlan;
1785 char *model;
1786 char *name;
1787 int fd;
1788 } NetSocketListenState;
1789
1790 /* XXX: we consider we can send the whole packet without blocking */
1791 static ssize_t net_socket_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1792 {
1793 NetSocketState *s = vc->opaque;
1794 uint32_t len;
1795 len = htonl(size);
1796
1797 send_all(s->fd, (const uint8_t *)&len, sizeof(len));
1798 return send_all(s->fd, buf, size);
1799 }
1800
1801 static ssize_t net_socket_receive_dgram(VLANClientState *vc, const uint8_t *buf, size_t size)
1802 {
1803 NetSocketState *s = vc->opaque;
1804
1805 return sendto(s->fd, (const void *)buf, size, 0,
1806 (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
1807 }
1808
1809 static void net_socket_send(void *opaque)
1810 {
1811 NetSocketState *s = opaque;
1812 int size, err;
1813 unsigned l;
1814 uint8_t buf1[4096];
1815 const uint8_t *buf;
1816
1817 size = recv(s->fd, (void *)buf1, sizeof(buf1), 0);
1818 if (size < 0) {
1819 err = socket_error();
1820 if (err != EWOULDBLOCK)
1821 goto eoc;
1822 } else if (size == 0) {
1823 /* end of connection */
1824 eoc:
1825 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1826 closesocket(s->fd);
1827 return;
1828 }
1829 buf = buf1;
1830 while (size > 0) {
1831 /* reassemble a packet from the network */
1832 switch(s->state) {
1833 case 0:
1834 l = 4 - s->index;
1835 if (l > size)
1836 l = size;
1837 memcpy(s->buf + s->index, buf, l);
1838 buf += l;
1839 size -= l;
1840 s->index += l;
1841 if (s->index == 4) {
1842 /* got length */
1843 s->packet_len = ntohl(*(uint32_t *)s->buf);
1844 s->index = 0;
1845 s->state = 1;
1846 }
1847 break;
1848 case 1:
1849 l = s->packet_len - s->index;
1850 if (l > size)
1851 l = size;
1852 if (s->index + l <= sizeof(s->buf)) {
1853 memcpy(s->buf + s->index, buf, l);
1854 } else {
1855 fprintf(stderr, "serious error: oversized packet received,"
1856 "connection terminated.\n");
1857 s->state = 0;
1858 goto eoc;
1859 }
1860
1861 s->index += l;
1862 buf += l;
1863 size -= l;
1864 if (s->index >= s->packet_len) {
1865 qemu_send_packet(s->vc, s->buf, s->packet_len);
1866 s->index = 0;
1867 s->state = 0;
1868 }
1869 break;
1870 }
1871 }
1872 }
1873
1874 static void net_socket_send_dgram(void *opaque)
1875 {
1876 NetSocketState *s = opaque;
1877 int size;
1878
1879 size = recv(s->fd, (void *)s->buf, sizeof(s->buf), 0);
1880 if (size < 0)
1881 return;
1882 if (size == 0) {
1883 /* end of connection */
1884 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1885 return;
1886 }
1887 qemu_send_packet(s->vc, s->buf, size);
1888 }
1889
1890 static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
1891 {
1892 struct ip_mreq imr;
1893 int fd;
1894 int val, ret;
1895 if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
1896 fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
1897 inet_ntoa(mcastaddr->sin_addr),
1898 (int)ntohl(mcastaddr->sin_addr.s_addr));
1899 return -1;
1900
1901 }
1902 fd = socket(PF_INET, SOCK_DGRAM, 0);
1903 if (fd < 0) {
1904 perror("socket(PF_INET, SOCK_DGRAM)");
1905 return -1;
1906 }
1907
1908 val = 1;
1909 ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
1910 (const char *)&val, sizeof(val));
1911 if (ret < 0) {
1912 perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
1913 goto fail;
1914 }
1915
1916 ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
1917 if (ret < 0) {
1918 perror("bind");
1919 goto fail;
1920 }
1921
1922 /* Add host to multicast group */
1923 imr.imr_multiaddr = mcastaddr->sin_addr;
1924 imr.imr_interface.s_addr = htonl(INADDR_ANY);
1925
1926 ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
1927 (const char *)&imr, sizeof(struct ip_mreq));
1928 if (ret < 0) {
1929 perror("setsockopt(IP_ADD_MEMBERSHIP)");
1930 goto fail;
1931 }
1932
1933 /* Force mcast msgs to loopback (eg. several QEMUs in same host */
1934 val = 1;
1935 ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
1936 (const char *)&val, sizeof(val));
1937 if (ret < 0) {
1938 perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
1939 goto fail;
1940 }
1941
1942 socket_set_nonblock(fd);
1943 return fd;
1944 fail:
1945 if (fd >= 0)
1946 closesocket(fd);
1947 return -1;
1948 }
1949
1950 static void net_socket_cleanup(VLANClientState *vc)
1951 {
1952 NetSocketState *s = vc->opaque;
1953 qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1954 close(s->fd);
1955 qemu_free(s);
1956 }
1957
1958 static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan,
1959 const char *model,
1960 const char *name,
1961 int fd, int is_connected)
1962 {
1963 struct sockaddr_in saddr;
1964 int newfd;
1965 socklen_t saddr_len;
1966 NetSocketState *s;
1967
1968 /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
1969 * Because this may be "shared" socket from a "master" process, datagrams would be recv()
1970 * by ONLY ONE process: we must "clone" this dgram socket --jjo
1971 */
1972
1973 if (is_connected) {
1974 if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
1975 /* must be bound */
1976 if (saddr.sin_addr.s_addr==0) {
1977 fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
1978 fd);
1979 return NULL;
1980 }
1981 /* clone dgram socket */
1982 newfd = net_socket_mcast_create(&saddr);
1983 if (newfd < 0) {
1984 /* error already reported by net_socket_mcast_create() */
1985 close(fd);
1986 return NULL;
1987 }
1988 /* clone newfd to fd, close newfd */
1989 dup2(newfd, fd);
1990 close(newfd);
1991
1992 } else {
1993 fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
1994 fd, strerror(errno));
1995 return NULL;
1996 }
1997 }
1998
1999 s = qemu_mallocz(sizeof(NetSocketState));
2000 s->fd = fd;
2001
2002 s->vc = qemu_new_vlan_client(vlan, model, name, NULL, net_socket_receive_dgram,
2003 NULL, net_socket_cleanup, s);
2004 qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
2005
2006 /* mcast: save bound address as dst */
2007 if (is_connected) s->dgram_dst=saddr;
2008
2009 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2010 "socket: fd=%d (%s mcast=%s:%d)",
2011 fd, is_connected? "cloned" : "",
2012 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2013 return s;
2014 }
2015
2016 static void net_socket_connect(void *opaque)
2017 {
2018 NetSocketState *s = opaque;
2019 qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
2020 }
2021
2022 static NetSocketState *net_socket_fd_init_stream(VLANState *vlan,
2023 const char *model,
2024 const char *name,
2025 int fd, int is_connected)
2026 {
2027 NetSocketState *s;
2028 s = qemu_mallocz(sizeof(NetSocketState));
2029 s->fd = fd;
2030 s->vc = qemu_new_vlan_client(vlan, model, name, NULL, net_socket_receive,
2031 NULL, net_socket_cleanup, s);
2032 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2033 "socket: fd=%d", fd);
2034 if (is_connected) {
2035 net_socket_connect(s);
2036 } else {
2037 qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
2038 }
2039 return s;
2040 }
2041
2042 static NetSocketState *net_socket_fd_init(VLANState *vlan,
2043 const char *model, const char *name,
2044 int fd, int is_connected)
2045 {
2046 int so_type=-1, optlen=sizeof(so_type);
2047
2048 if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
2049 (socklen_t *)&optlen)< 0) {
2050 fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n", fd);
2051 return NULL;
2052 }
2053 switch(so_type) {
2054 case SOCK_DGRAM:
2055 return net_socket_fd_init_dgram(vlan, model, name, fd, is_connected);
2056 case SOCK_STREAM:
2057 return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2058 default:
2059 /* who knows ... this could be a eg. a pty, do warn and continue as stream */
2060 fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
2061 return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2062 }
2063 return NULL;
2064 }
2065
2066 static void net_socket_accept(void *opaque)
2067 {
2068 NetSocketListenState *s = opaque;
2069 NetSocketState *s1;
2070 struct sockaddr_in saddr;
2071 socklen_t len;
2072 int fd;
2073
2074 for(;;) {
2075 len = sizeof(saddr);
2076 fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
2077 if (fd < 0 && errno != EINTR) {
2078 return;
2079 } else if (fd >= 0) {
2080 break;
2081 }
2082 }
2083 s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1);
2084 if (!s1) {
2085 closesocket(fd);
2086 } else {
2087 snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
2088 "socket: connection from %s:%d",
2089 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2090 }
2091 }
2092
2093 static int net_socket_listen_init(VLANState *vlan,
2094 const char *model,
2095 const char *name,
2096 const char *host_str)
2097 {
2098 NetSocketListenState *s;
2099 int fd, val, ret;
2100 struct sockaddr_in saddr;
2101
2102 if (parse_host_port(&saddr, host_str) < 0)
2103 return -1;
2104
2105 s = qemu_mallocz(sizeof(NetSocketListenState));
2106
2107 fd = socket(PF_INET, SOCK_STREAM, 0);
2108 if (fd < 0) {
2109 perror("socket");
2110 return -1;
2111 }
2112 socket_set_nonblock(fd);
2113
2114 /* allow fast reuse */
2115 val = 1;
2116 setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
2117
2118 ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2119 if (ret < 0) {
2120 perror("bind");
2121 return -1;
2122 }
2123 ret = listen(fd, 0);
2124 if (ret < 0) {
2125 perror("listen");
2126 return -1;
2127 }
2128 s->vlan = vlan;
2129 s->model = strdup(model);
2130 s->name = name ? strdup(name) : NULL;
2131 s->fd = fd;
2132 qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
2133 return 0;
2134 }
2135
2136 static int net_socket_connect_init(VLANState *vlan,
2137 const char *model,
2138 const char *name,
2139 const char *host_str)
2140 {
2141 NetSocketState *s;
2142 int fd, connected, ret, err;
2143 struct sockaddr_in saddr;
2144
2145 if (parse_host_port(&saddr, host_str) < 0)
2146 return -1;
2147
2148 fd = socket(PF_INET, SOCK_STREAM, 0);
2149 if (fd < 0) {
2150 perror("socket");
2151 return -1;
2152 }
2153 socket_set_nonblock(fd);
2154
2155 connected = 0;
2156 for(;;) {
2157 ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2158 if (ret < 0) {
2159 err = socket_error();
2160 if (err == EINTR || err == EWOULDBLOCK) {
2161 } else if (err == EINPROGRESS) {
2162 break;
2163 #ifdef _WIN32
2164 } else if (err == WSAEALREADY) {
2165 break;
2166 #endif
2167 } else {
2168 perror("connect");
2169 closesocket(fd);
2170 return -1;
2171 }
2172 } else {
2173 connected = 1;
2174 break;
2175 }
2176 }
2177 s = net_socket_fd_init(vlan, model, name, fd, connected);
2178 if (!s)
2179 return -1;
2180 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2181 "socket: connect to %s:%d",
2182 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2183 return 0;
2184 }
2185
2186 static int net_socket_mcast_init(VLANState *vlan,
2187 const char *model,
2188 const char *name,
2189 const char *host_str)
2190 {
2191 NetSocketState *s;
2192 int fd;
2193 struct sockaddr_in saddr;
2194
2195 if (parse_host_port(&saddr, host_str) < 0)
2196 return -1;
2197
2198
2199 fd = net_socket_mcast_create(&saddr);
2200 if (fd < 0)
2201 return -1;
2202
2203 s = net_socket_fd_init(vlan, model, name, fd, 0);
2204 if (!s)
2205 return -1;
2206
2207 s->dgram_dst = saddr;
2208
2209 snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2210 "socket: mcast=%s:%d",
2211 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2212 return 0;
2213
2214 }
2215
2216 typedef struct DumpState {
2217 VLANClientState *pcap_vc;
2218 int fd;
2219 int pcap_caplen;
2220 } DumpState;
2221
2222 #define PCAP_MAGIC 0xa1b2c3d4
2223
2224 struct pcap_file_hdr {
2225 uint32_t magic;
2226 uint16_t version_major;
2227 uint16_t version_minor;
2228 int32_t thiszone;
2229 uint32_t sigfigs;
2230 uint32_t snaplen;
2231 uint32_t linktype;
2232 };
2233
2234 struct pcap_sf_pkthdr {
2235 struct {
2236 int32_t tv_sec;
2237 int32_t tv_usec;
2238 } ts;
2239 uint32_t caplen;
2240 uint32_t len;
2241 };
2242
2243 static ssize_t dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
2244 {
2245 DumpState *s = vc->opaque;
2246 struct pcap_sf_pkthdr hdr;
2247 int64_t ts;
2248 int caplen;
2249
2250 /* Early return in case of previous error. */
2251 if (s->fd < 0) {
2252 return size;
2253 }
2254
2255 ts = muldiv64(qemu_get_clock(vm_clock), 1000000, ticks_per_sec);
2256 caplen = size > s->pcap_caplen ? s->pcap_caplen : size;
2257
2258 hdr.ts.tv_sec = ts / 1000000;
2259 hdr.ts.tv_usec = ts % 1000000;
2260 hdr.caplen = caplen;
2261 hdr.len = size;
2262 if (write(s->fd, &hdr, sizeof(hdr)) != sizeof(hdr) ||
2263 write(s->fd, buf, caplen) != caplen) {
2264 qemu_log("-net dump write error - stop dump\n");
2265 close(s->fd);
2266 s->fd = -1;
2267 }
2268
2269 return size;
2270 }
2271
2272 static void net_dump_cleanup(VLANClientState *vc)
2273 {
2274 DumpState *s = vc->opaque;
2275
2276 close(s->fd);
2277 qemu_free(s);
2278 }
2279
2280 static int net_dump_init(Monitor *mon, VLANState *vlan, const char *device,
2281 const char *name, const char *filename, int len)
2282 {
2283 struct pcap_file_hdr hdr;
2284 DumpState *s;
2285
2286 s = qemu_malloc(sizeof(DumpState));
2287
2288 s->fd = open(filename, O_CREAT | O_WRONLY | O_BINARY, 0644);
2289 if (s->fd < 0) {
2290 config_error(mon, "-net dump: can't open %s\n", filename);
2291 return -1;
2292 }
2293
2294 s->pcap_caplen = len;
2295
2296 hdr.magic = PCAP_MAGIC;
2297 hdr.version_major = 2;
2298 hdr.version_minor = 4;
2299 hdr.thiszone = 0;
2300 hdr.sigfigs = 0;
2301 hdr.snaplen = s->pcap_caplen;
2302 hdr.linktype = 1;
2303
2304 if (write(s->fd, &hdr, sizeof(hdr)) < sizeof(hdr)) {
2305 config_error(mon, "-net dump write error: %s\n", strerror(errno));
2306 close(s->fd);
2307 qemu_free(s);
2308 return -1;
2309 }
2310
2311 s->pcap_vc = qemu_new_vlan_client(vlan, device, name, NULL, dump_receive, NULL,
2312 net_dump_cleanup, s);
2313 snprintf(s->pcap_vc->info_str, sizeof(s->pcap_vc->info_str),
2314 "dump to %s (len=%d)", filename, len);
2315 return 0;
2316 }
2317
2318 /* find or alloc a new VLAN */
2319 VLANState *qemu_find_vlan(int id, int allocate)
2320 {
2321 VLANState **pvlan, *vlan;
2322 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2323 if (vlan->id == id)
2324 return vlan;
2325 }
2326 if (!allocate) {
2327 return NULL;
2328 }
2329 vlan = qemu_mallocz(sizeof(VLANState));
2330 vlan->id = id;
2331 TAILQ_INIT(&vlan->send_queue);
2332 vlan->next = NULL;
2333 pvlan = &first_vlan;
2334 while (*pvlan != NULL)
2335 pvlan = &(*pvlan)->next;
2336 *pvlan = vlan;
2337 return vlan;
2338 }
2339
2340 static int nic_get_free_idx(void)
2341 {
2342 int index;
2343
2344 for (index = 0; index < MAX_NICS; index++)
2345 if (!nd_table[index].used)
2346 return index;
2347 return -1;
2348 }
2349
2350 void qemu_check_nic_model(NICInfo *nd, const char *model)
2351 {
2352 const char *models[2];
2353
2354 models[0] = model;
2355 models[1] = NULL;
2356
2357 qemu_check_nic_model_list(nd, models, model);
2358 }
2359
2360 void qemu_check_nic_model_list(NICInfo *nd, const char * const *models,
2361 const char *default_model)
2362 {
2363 int i, exit_status = 0;
2364
2365 if (!nd->model)
2366 nd->model = strdup(default_model);
2367
2368 if (strcmp(nd->model, "?") != 0) {
2369 for (i = 0 ; models[i]; i++)
2370 if (strcmp(nd->model, models[i]) == 0)
2371 return;
2372
2373 fprintf(stderr, "qemu: Unsupported NIC model: %s\n", nd->model);
2374 exit_status = 1;
2375 }
2376
2377 fprintf(stderr, "qemu: Supported NIC models: ");
2378 for (i = 0 ; models[i]; i++)
2379 fprintf(stderr, "%s%c", models[i], models[i+1] ? ',' : '\n');
2380
2381 exit(exit_status);
2382 }
2383
2384 static int net_handle_fd_param(Monitor *mon, const char *param)
2385 {
2386 if (!qemu_isdigit(param[0])) {
2387 int fd;
2388
2389 fd = monitor_get_fd(mon, param);
2390 if (fd == -1) {
2391 config_error(mon, "No file descriptor named %s found", param);
2392 return -1;
2393 }
2394
2395 return fd;
2396 } else {
2397 return strtol(param, NULL, 0);
2398 }
2399 }
2400
2401 int net_client_init(Monitor *mon, const char *device, const char *p)
2402 {
2403 char buf[1024];
2404 int vlan_id, ret;
2405 VLANState *vlan;
2406 char *name = NULL;
2407
2408 vlan_id = 0;
2409 if (get_param_value(buf, sizeof(buf), "vlan", p)) {
2410 vlan_id = strtol(buf, NULL, 0);
2411 }
2412 vlan = qemu_find_vlan(vlan_id, 1);
2413
2414 if (get_param_value(buf, sizeof(buf), "name", p)) {
2415 name = qemu_strdup(buf);
2416 }
2417 if (!strcmp(device, "nic")) {
2418 static const char * const nic_params[] = {
2419 "vlan", "name", "macaddr", "model", "addr", "id", "vectors", NULL
2420 };
2421 NICInfo *nd;
2422 uint8_t *macaddr;
2423 int idx = nic_get_free_idx();
2424
2425 if (check_params(buf, sizeof(buf), nic_params, p) < 0) {
2426 config_error(mon, "invalid parameter '%s' in '%s'\n", buf, p);
2427 ret = -1;
2428 goto out;
2429 }
2430 if (idx == -1 || nb_nics >= MAX_NICS) {
2431 config_error(mon, "Too Many NICs\n");
2432 ret = -1;
2433 goto out;
2434 }
2435 nd = &nd_table[idx];
2436 macaddr = nd->macaddr;
2437 macaddr[0] = 0x52;
2438 macaddr[1] = 0x54;
2439 macaddr[2] = 0x00;
2440 macaddr[3] = 0x12;
2441 macaddr[4] = 0x34;
2442 macaddr[5] = 0x56 + idx;
2443
2444 if (get_param_value(buf, sizeof(buf), "macaddr", p)) {
2445 if (parse_macaddr(macaddr, buf) < 0) {
2446 config_error(mon, "invalid syntax for ethernet address\n");
2447 ret = -1;
2448 goto out;
2449 }
2450 }
2451 if (get_param_value(buf, sizeof(buf), "model", p)) {
2452 nd->model = strdup(buf);
2453 }
2454 if (get_param_value(buf, sizeof(buf), "addr", p)) {
2455 nd->devaddr = strdup(buf);
2456 }
2457 if (get_param_value(buf, sizeof(buf), "id", p)) {
2458 nd->id = strdup(buf);
2459 }
2460 nd->nvectors = NIC_NVECTORS_UNSPECIFIED;
2461 if (get_param_value(buf, sizeof(buf), "vectors", p)) {
2462 char *endptr;
2463 long vectors = strtol(buf, &endptr, 0);
2464 if (*endptr) {
2465 config_error(mon, "invalid syntax for # of vectors\n");
2466 ret = -1;
2467 goto out;
2468 }
2469 if (vectors < 0 || vectors > 0x7ffffff) {
2470 config_error(mon, "invalid # of vectors\n");
2471 ret = -1;
2472 goto out;
2473 }
2474 nd->nvectors = vectors;
2475 }
2476 nd->vlan = vlan;
2477 nd->name = name;
2478 nd->used = 1;
2479 name = NULL;
2480 nb_nics++;
2481 vlan->nb_guest_devs++;
2482 ret = idx;
2483 } else
2484 if (!strcmp(device, "none")) {
2485 if (*p != '\0') {
2486 config_error(mon, "'none' takes no parameters\n");
2487 ret = -1;
2488 goto out;
2489 }
2490 /* does nothing. It is needed to signal that no network cards
2491 are wanted */
2492 ret = 0;
2493 } else
2494 #ifdef CONFIG_SLIRP
2495 if (!strcmp(device, "user")) {
2496 static const char * const slirp_params[] = {
2497 "vlan", "name", "hostname", "restrict", "ip", "net", "host",
2498 "tftp", "bootfile", "dhcpstart", "dns", "smb", "smbserver",
2499 "hostfwd", "guestfwd", NULL
2500 };
2501 struct slirp_config_str *config;
2502 int restricted = 0;
2503 char *vnet = NULL;
2504 char *vhost = NULL;
2505 char *vhostname = NULL;
2506 char *tftp_export = NULL;
2507 char *bootfile = NULL;
2508 char *vdhcp_start = NULL;
2509 char *vnamesrv = NULL;
2510 char *smb_export = NULL;
2511 char *vsmbsrv = NULL;
2512 const char *q;
2513
2514 if (check_params(buf, sizeof(buf), slirp_params, p) < 0) {
2515 config_error(mon, "invalid parameter '%s' in '%s'\n", buf, p);
2516 ret = -1;
2517 goto out;
2518 }
2519 if (get_param_value(buf, sizeof(buf), "ip", p)) {
2520 int vnet_buflen = strlen(buf) + strlen("/24") + 1;
2521 /* emulate legacy parameter */
2522 vnet = qemu_malloc(vnet_buflen);
2523 pstrcpy(vnet, vnet_buflen, buf);
2524 pstrcat(vnet, vnet_buflen, "/24");
2525 }
2526 if (get_param_value(buf, sizeof(buf), "net", p)) {
2527 vnet = qemu_strdup(buf);
2528 }
2529 if (get_param_value(buf, sizeof(buf), "host", p)) {
2530 vhost = qemu_strdup(buf);
2531 }
2532 if (get_param_value(buf, sizeof(buf), "hostname", p)) {
2533 vhostname = qemu_strdup(buf);
2534 }
2535 if (get_param_value(buf, sizeof(buf), "restrict", p)) {
2536 restricted = (buf[0] == 'y') ? 1 : 0;
2537 }
2538 if (get_param_value(buf, sizeof(buf), "dhcpstart", p)) {
2539 vdhcp_start = qemu_strdup(buf);
2540 }
2541 if (get_param_value(buf, sizeof(buf), "dns", p)) {
2542 vnamesrv = qemu_strdup(buf);
2543 }
2544 if (get_param_value(buf, sizeof(buf), "tftp", p)) {
2545 tftp_export = qemu_strdup(buf);
2546 }
2547 if (get_param_value(buf, sizeof(buf), "bootfile", p)) {
2548 bootfile = qemu_strdup(buf);
2549 }
2550 if (get_param_value(buf, sizeof(buf), "smb", p)) {
2551 smb_export = qemu_strdup(buf);
2552 if (get_param_value(buf, sizeof(buf), "smbserver", p)) {
2553 vsmbsrv = qemu_strdup(buf);
2554 }
2555 }
2556 q = p;
2557 while (1) {
2558 config = qemu_malloc(sizeof(*config));
2559 if (!get_next_param_value(config->str, sizeof(config->str),
2560 "hostfwd", &q)) {
2561 break;
2562 }
2563 config->flags = SLIRP_CFG_HOSTFWD;
2564 config->next = slirp_configs;
2565 slirp_configs = config;
2566 config = NULL;
2567 }
2568 q = p;
2569 while (1) {
2570 config = qemu_malloc(sizeof(*config));
2571 if (!get_next_param_value(config->str, sizeof(config->str),
2572 "guestfwd", &q)) {
2573 break;
2574 }
2575 config->flags = 0;
2576 config->next = slirp_configs;
2577 slirp_configs = config;
2578 config = NULL;
2579 }
2580 qemu_free(config);
2581 vlan->nb_host_devs++;
2582 ret = net_slirp_init(mon, vlan, device, name, restricted, vnet, vhost,
2583 vhostname, tftp_export, bootfile, vdhcp_start,
2584 vnamesrv, smb_export, vsmbsrv);
2585 qemu_free(vnet);
2586 qemu_free(vhost);
2587 qemu_free(vhostname);
2588 qemu_free(tftp_export);
2589 qemu_free(bootfile);
2590 qemu_free(vdhcp_start);
2591 qemu_free(vnamesrv);
2592 qemu_free(smb_export);
2593 qemu_free(vsmbsrv);
2594 } else if (!strcmp(device, "channel")) {
2595 if (TAILQ_EMPTY(&slirp_stacks)) {
2596 struct slirp_config_str *config;
2597
2598 config = qemu_malloc(sizeof(*config));
2599 pstrcpy(config->str, sizeof(config->str), p);
2600 config->flags = SLIRP_CFG_LEGACY;
2601 config->next = slirp_configs;
2602 slirp_configs = config;
2603 } else {
2604 slirp_guestfwd(TAILQ_FIRST(&slirp_stacks), mon, p, 1);
2605 }
2606 ret = 0;
2607 } else
2608 #endif
2609 #ifdef _WIN32
2610 if (!strcmp(device, "tap")) {
2611 static const char * const tap_params[] = {
2612 "vlan", "name", "ifname", NULL
2613 };
2614 char ifname[64];
2615
2616 if (check_params(buf, sizeof(buf), tap_params, p) < 0) {
2617 config_error(mon, "invalid parameter '%s' in '%s'\n", buf, p);
2618 ret = -1;
2619 goto out;
2620 }
2621 if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
2622 config_error(mon, "tap: no interface name\n");
2623 ret = -1;
2624 goto out;
2625 }
2626 vlan->nb_host_devs++;
2627 ret = tap_win32_init(vlan, device, name, ifname);
2628 } else
2629 #elif defined (_AIX)
2630 #else
2631 if (!strcmp(device, "tap")) {
2632 char ifname[64], chkbuf[64];
2633 char setup_script[1024], down_script[1024];
2634 TAPState *s;
2635 int fd;
2636 vlan->nb_host_devs++;
2637 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
2638 static const char * const fd_params[] = {
2639 "vlan", "name", "fd", "sndbuf", NULL
2640 };
2641 ret = -1;
2642 if (check_params(chkbuf, sizeof(chkbuf), fd_params, p) < 0) {
2643 config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2644 goto out;
2645 }
2646 fd = net_handle_fd_param(mon, buf);
2647 if (fd == -1) {
2648 goto out;
2649 }
2650 fcntl(fd, F_SETFL, O_NONBLOCK);
2651 s = net_tap_fd_init(vlan, device, name, fd);
2652 if (!s) {
2653 close(fd);
2654 }
2655 } else {
2656 static const char * const tap_params[] = {
2657 "vlan", "name", "ifname", "script", "downscript", "sndbuf", NULL
2658 };
2659 if (check_params(chkbuf, sizeof(chkbuf), tap_params, p) < 0) {
2660 config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2661 ret = -1;
2662 goto out;
2663 }
2664 if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
2665 ifname[0] = '\0';
2666 }
2667 if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
2668 pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
2669 }
2670 if (get_param_value(down_script, sizeof(down_script), "downscript", p) == 0) {
2671 pstrcpy(down_script, sizeof(down_script), DEFAULT_NETWORK_DOWN_SCRIPT);
2672 }
2673 s = net_tap_init(vlan, device, name, ifname, setup_script, down_script);
2674 }
2675 if (s != NULL) {
2676 const char *sndbuf_str = NULL;
2677 if (get_param_value(buf, sizeof(buf), "sndbuf", p)) {
2678 sndbuf_str = buf;
2679 }
2680 tap_set_sndbuf(s, sndbuf_str, mon);
2681 ret = 0;
2682 } else {
2683 ret = -1;
2684 }
2685 } else
2686 #endif
2687 if (!strcmp(device, "socket")) {
2688 char chkbuf[64];
2689 if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
2690 static const char * const fd_params[] = {
2691 "vlan", "name", "fd", NULL
2692 };
2693 int fd;
2694 ret = -1;
2695 if (check_params(chkbuf, sizeof(chkbuf), fd_params, p) < 0) {
2696 config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2697 goto out;
2698 }
2699 fd = net_handle_fd_param(mon, buf);
2700 if (fd == -1) {
2701 goto out;
2702 }
2703 if (!net_socket_fd_init(vlan, device, name, fd, 1)) {
2704 close(fd);
2705 goto out;
2706 }
2707 ret = 0;
2708 } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) {
2709 static const char * const listen_params[] = {
2710 "vlan", "name", "listen", NULL
2711 };
2712 if (check_params(chkbuf, sizeof(chkbuf), listen_params, p) < 0) {
2713 config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2714 ret = -1;
2715 goto out;
2716 }
2717 ret = net_socket_listen_init(vlan, device, name, buf);
2718 } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) {
2719 static const char * const connect_params[] = {
2720 "vlan", "name", "connect", NULL
2721 };
2722 if (check_params(chkbuf, sizeof(chkbuf), connect_params, p) < 0) {
2723 config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2724 ret = -1;
2725 goto out;
2726 }
2727 ret = net_socket_connect_init(vlan, device, name, buf);
2728 } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) {
2729 static const char * const mcast_params[] = {
2730 "vlan", "name", "mcast", NULL
2731 };
2732 if (check_params(chkbuf, sizeof(chkbuf), mcast_params, p) < 0) {
2733 config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2734 ret = -1;
2735 goto out;
2736 }
2737 ret = net_socket_mcast_init(vlan, device, name, buf);
2738 } else {
2739 config_error(mon, "Unknown socket options: %s\n", p);
2740 ret = -1;
2741 goto out;
2742 }
2743 vlan->nb_host_devs++;
2744 } else
2745 #ifdef CONFIG_VDE
2746 if (!strcmp(device, "vde")) {
2747 static const char * const vde_params[] = {
2748 "vlan", "name", "sock", "port", "group", "mode", NULL
2749 };
2750 char vde_sock[1024], vde_group[512];
2751 int vde_port, vde_mode;
2752
2753 if (check_params(buf, sizeof(buf), vde_params, p) < 0) {
2754 config_error(mon, "invalid parameter '%s' in '%s'\n", buf, p);
2755 ret = -1;
2756 goto out;
2757 }
2758 vlan->nb_host_devs++;
2759 if (get_param_value(vde_sock, sizeof(vde_sock), "sock", p) <= 0) {
2760 vde_sock[0] = '\0';
2761 }
2762 if (get_param_value(buf, sizeof(buf), "port", p) > 0) {
2763 vde_port = strtol(buf, NULL, 10);
2764 } else {
2765 vde_port = 0;
2766 }
2767 if (get_param_value(vde_group, sizeof(vde_group), "group", p) <= 0) {
2768 vde_group[0] = '\0';
2769 }
2770 if (get_param_value(buf, sizeof(buf), "mode", p) > 0) {
2771 vde_mode = strtol(buf, NULL, 8);
2772 } else {
2773 vde_mode = 0700;
2774 }
2775 ret = net_vde_init(vlan, device, name, vde_sock, vde_port, vde_group, vde_mode);
2776 } else
2777 #endif
2778 if (!strcmp(device, "dump")) {
2779 int len = 65536;
2780
2781 if (get_param_value(buf, sizeof(buf), "len", p) > 0) {
2782 len = strtol(buf, NULL, 0);
2783 }
2784 if (!get_param_value(buf, sizeof(buf), "file", p)) {
2785 snprintf(buf, sizeof(buf), "qemu-vlan%d.pcap", vlan_id);
2786 }
2787 ret = net_dump_init(mon, vlan, device, name, buf, len);
2788 } else {
2789 config_error(mon, "Unknown network device: %s\n", device);
2790 ret = -1;
2791 goto out;
2792 }
2793 if (ret < 0) {
2794 config_error(mon, "Could not initialize device '%s'\n", device);
2795 }
2796 out:
2797 qemu_free(name);
2798 return ret;
2799 }
2800
2801 void net_client_uninit(NICInfo *nd)
2802 {
2803 nd->vlan->nb_guest_devs--;
2804 nb_nics--;
2805 nd->used = 0;
2806 free((void *)nd->model);
2807 }
2808
2809 static int net_host_check_device(const char *device)
2810 {
2811 int i;
2812 const char *valid_param_list[] = { "tap", "socket", "dump"
2813 #ifdef CONFIG_SLIRP
2814 ,"user"
2815 #endif
2816 #ifdef CONFIG_VDE
2817 ,"vde"
2818 #endif
2819 };
2820 for (i = 0; i < sizeof(valid_param_list) / sizeof(char *); i++) {
2821 if (!strncmp(valid_param_list[i], device,
2822 strlen(valid_param_list[i])))
2823 return 1;
2824 }
2825
2826 return 0;
2827 }
2828
2829 void net_host_device_add(Monitor *mon, const QDict *qdict)
2830 {
2831 const char *device = qdict_get_str(qdict, "device");
2832 const char *opts = qdict_get_try_str(qdict, "opts");
2833
2834 if (!net_host_check_device(device)) {
2835 monitor_printf(mon, "invalid host network device %s\n", device);
2836 return;
2837 }
2838 if (net_client_init(mon, device, opts ? opts : "") < 0) {
2839 monitor_printf(mon, "adding host network device %s failed\n", device);
2840 }
2841 }
2842
2843 void net_host_device_remove(Monitor *mon, const QDict *qdict)
2844 {
2845 VLANClientState *vc;
2846 int vlan_id = qdict_get_int(qdict, "vlan_id");
2847 const char *device = qdict_get_str(qdict, "device");
2848
2849 vc = qemu_find_vlan_client_by_name(mon, vlan_id, device);
2850 if (!vc) {
2851 return;
2852 }
2853 if (!net_host_check_device(vc->model)) {
2854 monitor_printf(mon, "invalid host network device %s\n", device);
2855 return;
2856 }
2857 qemu_del_vlan_client(vc);
2858 }
2859
2860 int net_client_parse(const char *str)
2861 {
2862 const char *p;
2863 char *q;
2864 char device[64];
2865
2866 p = str;
2867 q = device;
2868 while (*p != '\0' && *p != ',') {
2869 if ((q - device) < sizeof(device) - 1)
2870 *q++ = *p;
2871 p++;
2872 }
2873 *q = '\0';
2874 if (*p == ',')
2875 p++;
2876
2877 return net_client_init(NULL, device, p);
2878 }
2879
2880 void net_set_boot_mask(int net_boot_mask)
2881 {
2882 int i;
2883
2884 /* Only the first four NICs may be bootable */
2885 net_boot_mask = net_boot_mask & 0xF;
2886
2887 for (i = 0; i < nb_nics; i++) {
2888 if (net_boot_mask & (1 << i)) {
2889 nd_table[i].bootable = 1;
2890 net_boot_mask &= ~(1 << i);
2891 }
2892 }
2893
2894 if (net_boot_mask) {
2895 fprintf(stderr, "Cannot boot from non-existent NIC\n");
2896 exit(1);
2897 }
2898 }
2899
2900 void do_info_network(Monitor *mon)
2901 {
2902 VLANState *vlan;
2903 VLANClientState *vc;
2904
2905 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2906 monitor_printf(mon, "VLAN %d devices:\n", vlan->id);
2907 for(vc = vlan->first_client; vc != NULL; vc = vc->next)
2908 monitor_printf(mon, " %s: %s\n", vc->name, vc->info_str);
2909 }
2910 }
2911
2912 void do_set_link(Monitor *mon, const QDict *qdict)
2913 {
2914 VLANState *vlan;
2915 VLANClientState *vc = NULL;
2916 const char *name = qdict_get_str(qdict, "name");
2917 const char *up_or_down = qdict_get_str(qdict, "up_or_down");
2918
2919 for (vlan = first_vlan; vlan != NULL; vlan = vlan->next)
2920 for (vc = vlan->first_client; vc != NULL; vc = vc->next)
2921 if (strcmp(vc->name, name) == 0)
2922 goto done;
2923 done:
2924
2925 if (!vc) {
2926 monitor_printf(mon, "could not find network device '%s'\n", name);
2927 return;
2928 }
2929
2930 if (strcmp(up_or_down, "up") == 0)
2931 vc->link_down = 0;
2932 else if (strcmp(up_or_down, "down") == 0)
2933 vc->link_down = 1;
2934 else
2935 monitor_printf(mon, "invalid link status '%s'; only 'up' or 'down' "
2936 "valid\n", up_or_down);
2937
2938 if (vc->link_status_changed)
2939 vc->link_status_changed(vc);
2940 }
2941
2942 void net_cleanup(void)
2943 {
2944 VLANState *vlan;
2945
2946 /* close network clients */
2947 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2948 VLANClientState *vc = vlan->first_client;
2949
2950 while (vc) {
2951 VLANClientState *next = vc->next;
2952
2953 qemu_del_vlan_client(vc);
2954
2955 vc = next;
2956 }
2957 }
2958 }
2959
2960 void net_client_check(void)
2961 {
2962 VLANState *vlan;
2963
2964 for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2965 if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
2966 continue;
2967 if (vlan->nb_guest_devs == 0)
2968 fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
2969 if (vlan->nb_host_devs == 0)
2970 fprintf(stderr,
2971 "Warning: vlan %d is not connected to host network\n",
2972 vlan->id);
2973 }
2974 }