c172c249be6afe40d75866dd679c8a9e0c9b3da7
[sdk/emulator/qemu.git] / net / socket.c
1 /*
2  * QEMU System Emulator
3  *
4  * Copyright (c) 2003-2008 Fabrice Bellard
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 #include "net/socket.h"
25
26 #include "config-host.h"
27
28 #include "net.h"
29 #include "monitor.h"
30 #include "qemu-char.h"
31 #include "qemu-common.h"
32 #include "qemu-error.h"
33 #include "qemu-option.h"
34 #include "qemu_socket.h"
35
36 typedef struct NetSocketState {
37     NetClientState nc;
38     int listen_fd;
39     int fd;
40     int state; /* 0 = getting length, 1 = getting data */
41     unsigned int index;
42     unsigned int packet_len;
43     uint8_t buf[4096];
44     struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
45 } NetSocketState;
46
47 static void net_socket_accept(void *opaque);
48
49 /* XXX: we consider we can send the whole packet without blocking */
50 static ssize_t net_socket_receive(NetClientState *nc, const uint8_t *buf, size_t size)
51 {
52     NetSocketState *s = DO_UPCAST(NetSocketState, nc, nc);
53     uint32_t len;
54     len = htonl(size);
55
56     send_all(s->fd, (const uint8_t *)&len, sizeof(len));
57     return send_all(s->fd, buf, size);
58 }
59
60 static ssize_t net_socket_receive_dgram(NetClientState *nc, const uint8_t *buf, size_t size)
61 {
62     NetSocketState *s = DO_UPCAST(NetSocketState, nc, nc);
63
64     return sendto(s->fd, (const void *)buf, size, 0,
65                   (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
66 }
67
68 static void net_socket_send(void *opaque)
69 {
70     NetSocketState *s = opaque;
71     int size, err;
72     unsigned l;
73     uint8_t buf1[4096];
74     const uint8_t *buf;
75
76     size = qemu_recv(s->fd, buf1, sizeof(buf1), 0);
77     if (size < 0) {
78         err = socket_error();
79         if (err != EWOULDBLOCK)
80             goto eoc;
81     } else if (size == 0) {
82         /* end of connection */
83     eoc:
84         qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
85         if (s->listen_fd != -1) {
86             qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
87         }
88         closesocket(s->fd);
89
90         s->fd = -1;
91         s->state = 0;
92         s->index = 0;
93         s->packet_len = 0;
94         s->nc.link_down = true;
95         memset(s->buf, 0, sizeof(s->buf));
96         memset(s->nc.info_str, 0, sizeof(s->nc.info_str));
97
98         return;
99     }
100     buf = buf1;
101     while (size > 0) {
102         /* reassemble a packet from the network */
103         switch(s->state) {
104         case 0:
105             l = 4 - s->index;
106             if (l > size)
107                 l = size;
108             memcpy(s->buf + s->index, buf, l);
109             buf += l;
110             size -= l;
111             s->index += l;
112             if (s->index == 4) {
113                 /* got length */
114                 s->packet_len = ntohl(*(uint32_t *)s->buf);
115                 s->index = 0;
116                 s->state = 1;
117             }
118             break;
119         case 1:
120             l = s->packet_len - s->index;
121             if (l > size)
122                 l = size;
123             if (s->index + l <= sizeof(s->buf)) {
124                 memcpy(s->buf + s->index, buf, l);
125             } else {
126                 fprintf(stderr, "serious error: oversized packet received,"
127                     "connection terminated.\n");
128                 s->state = 0;
129                 goto eoc;
130             }
131
132             s->index += l;
133             buf += l;
134             size -= l;
135             if (s->index >= s->packet_len) {
136                 qemu_send_packet(&s->nc, s->buf, s->packet_len);
137                 s->index = 0;
138                 s->state = 0;
139             }
140             break;
141         }
142     }
143 }
144
145 static void net_socket_send_dgram(void *opaque)
146 {
147     NetSocketState *s = opaque;
148     int size;
149
150     size = qemu_recv(s->fd, s->buf, sizeof(s->buf), 0);
151     if (size < 0)
152         return;
153     if (size == 0) {
154         /* end of connection */
155         qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
156         return;
157     }
158     qemu_send_packet(&s->nc, s->buf, size);
159 }
160
161 static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr *localaddr)
162 {
163     struct ip_mreq imr;
164     int fd;
165     int val, ret;
166 #ifdef __OpenBSD__
167     unsigned char loop;
168 #else
169     int loop;
170 #endif
171
172     if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
173         fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) "
174                 "does not contain a multicast address\n",
175                 inet_ntoa(mcastaddr->sin_addr),
176                 (int)ntohl(mcastaddr->sin_addr.s_addr));
177         return -1;
178
179     }
180     fd = qemu_socket(PF_INET, SOCK_DGRAM, 0);
181     if (fd < 0) {
182         perror("socket(PF_INET, SOCK_DGRAM)");
183         return -1;
184     }
185
186     val = 1;
187     ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
188                    (const char *)&val, sizeof(val));
189     if (ret < 0) {
190         perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
191         goto fail;
192     }
193
194     ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
195     if (ret < 0) {
196         perror("bind");
197         goto fail;
198     }
199
200     /* Add host to multicast group */
201     imr.imr_multiaddr = mcastaddr->sin_addr;
202     if (localaddr) {
203         imr.imr_interface = *localaddr;
204     } else {
205         imr.imr_interface.s_addr = htonl(INADDR_ANY);
206     }
207
208     ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
209                      (const char *)&imr, sizeof(struct ip_mreq));
210     if (ret < 0) {
211         perror("setsockopt(IP_ADD_MEMBERSHIP)");
212         goto fail;
213     }
214
215     /* Force mcast msgs to loopback (eg. several QEMUs in same host */
216     loop = 1;
217     ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
218                    (const char *)&loop, sizeof(loop));
219     if (ret < 0) {
220         perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
221         goto fail;
222     }
223
224     /* If a bind address is given, only send packets from that address */
225     if (localaddr != NULL) {
226         ret = setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
227                          (const char *)localaddr, sizeof(*localaddr));
228         if (ret < 0) {
229             perror("setsockopt(IP_MULTICAST_IF)");
230             goto fail;
231         }
232     }
233
234     socket_set_nonblock(fd);
235     return fd;
236 fail:
237     if (fd >= 0)
238         closesocket(fd);
239     return -1;
240 }
241
242 static void net_socket_cleanup(NetClientState *nc)
243 {
244     NetSocketState *s = DO_UPCAST(NetSocketState, nc, nc);
245     if (s->fd != -1) {
246         qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
247         close(s->fd);
248         s->fd = -1;
249     }
250     if (s->listen_fd != -1) {
251         qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
252         closesocket(s->listen_fd);
253         s->listen_fd = -1;
254     }
255 }
256
257 static NetClientInfo net_dgram_socket_info = {
258     .type = NET_CLIENT_OPTIONS_KIND_SOCKET,
259     .size = sizeof(NetSocketState),
260     .receive = net_socket_receive_dgram,
261     .cleanup = net_socket_cleanup,
262 };
263
264 static NetSocketState *net_socket_fd_init_dgram(NetClientState *peer,
265                                                 const char *model,
266                                                 const char *name,
267                                                 int fd, int is_connected)
268 {
269     struct sockaddr_in saddr;
270     int newfd;
271     socklen_t saddr_len;
272     NetClientState *nc;
273     NetSocketState *s;
274
275     /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
276      * Because this may be "shared" socket from a "master" process, datagrams would be recv()
277      * by ONLY ONE process: we must "clone" this dgram socket --jjo
278      */
279
280     if (is_connected) {
281         if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
282             /* must be bound */
283             if (saddr.sin_addr.s_addr == 0) {
284                 fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, "
285                         "cannot setup multicast dst addr\n", fd);
286                 goto err;
287             }
288             /* clone dgram socket */
289             newfd = net_socket_mcast_create(&saddr, NULL);
290             if (newfd < 0) {
291                 /* error already reported by net_socket_mcast_create() */
292                 goto err;
293             }
294             /* clone newfd to fd, close newfd */
295             dup2(newfd, fd);
296             close(newfd);
297
298         } else {
299             fprintf(stderr,
300                     "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
301                     fd, strerror(errno));
302             goto err;
303         }
304     }
305
306     nc = qemu_new_net_client(&net_dgram_socket_info, peer, model, name);
307
308     snprintf(nc->info_str, sizeof(nc->info_str),
309             "socket: fd=%d (%s mcast=%s:%d)",
310             fd, is_connected ? "cloned" : "",
311             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
312
313     s = DO_UPCAST(NetSocketState, nc, nc);
314
315     s->fd = fd;
316     s->listen_fd = -1;
317
318     qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
319
320     /* mcast: save bound address as dst */
321     if (is_connected) {
322         s->dgram_dst = saddr;
323     }
324
325     return s;
326
327 err:
328     closesocket(fd);
329     return NULL;
330 }
331
332 static void net_socket_connect(void *opaque)
333 {
334     NetSocketState *s = opaque;
335     qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
336 }
337
338 static NetClientInfo net_socket_info = {
339     .type = NET_CLIENT_OPTIONS_KIND_SOCKET,
340     .size = sizeof(NetSocketState),
341     .receive = net_socket_receive,
342     .cleanup = net_socket_cleanup,
343 };
344
345 static NetSocketState *net_socket_fd_init_stream(NetClientState *peer,
346                                                  const char *model,
347                                                  const char *name,
348                                                  int fd, int is_connected)
349 {
350     NetClientState *nc;
351     NetSocketState *s;
352
353     nc = qemu_new_net_client(&net_socket_info, peer, model, name);
354
355     snprintf(nc->info_str, sizeof(nc->info_str), "socket: fd=%d", fd);
356
357     s = DO_UPCAST(NetSocketState, nc, nc);
358
359     s->fd = fd;
360     s->listen_fd = -1;
361
362     if (is_connected) {
363         net_socket_connect(s);
364     } else {
365         qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
366     }
367     return s;
368 }
369
370 static NetSocketState *net_socket_fd_init(NetClientState *peer,
371                                           const char *model, const char *name,
372                                           int fd, int is_connected)
373 {
374     int so_type = -1, optlen=sizeof(so_type);
375
376     if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
377         (socklen_t *)&optlen)< 0) {
378         fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n",
379                 fd);
380         closesocket(fd);
381         return NULL;
382     }
383     switch(so_type) {
384     case SOCK_DGRAM:
385         return net_socket_fd_init_dgram(peer, model, name, fd, is_connected);
386     case SOCK_STREAM:
387         return net_socket_fd_init_stream(peer, model, name, fd, is_connected);
388     default:
389         /* who knows ... this could be a eg. a pty, do warn and continue as stream */
390         fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
391         return net_socket_fd_init_stream(peer, model, name, fd, is_connected);
392     }
393     return NULL;
394 }
395
396 static void net_socket_accept(void *opaque)
397 {
398     NetSocketState *s = opaque;
399     struct sockaddr_in saddr;
400     socklen_t len;
401     int fd;
402
403     for(;;) {
404         len = sizeof(saddr);
405         fd = qemu_accept(s->listen_fd, (struct sockaddr *)&saddr, &len);
406         if (fd < 0 && errno != EINTR) {
407             return;
408         } else if (fd >= 0) {
409             qemu_set_fd_handler(s->listen_fd, NULL, NULL, NULL);
410             break;
411         }
412     }
413
414     s->fd = fd;
415     s->nc.link_down = false;
416     net_socket_connect(s);
417     snprintf(s->nc.info_str, sizeof(s->nc.info_str),
418              "socket: connection from %s:%d",
419              inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
420 }
421
422 static int net_socket_listen_init(NetClientState *peer,
423                                   const char *model,
424                                   const char *name,
425                                   const char *host_str)
426 {
427     NetClientState *nc;
428     NetSocketState *s;
429     struct sockaddr_in saddr;
430     int fd, val, ret;
431
432     if (parse_host_port(&saddr, host_str) < 0)
433         return -1;
434
435     fd = qemu_socket(PF_INET, SOCK_STREAM, 0);
436     if (fd < 0) {
437         perror("socket");
438         return -1;
439     }
440     socket_set_nonblock(fd);
441
442     /* allow fast reuse */
443     val = 1;
444     setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
445
446     ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
447     if (ret < 0) {
448         perror("bind");
449         closesocket(fd);
450         return -1;
451     }
452     ret = listen(fd, 0);
453     if (ret < 0) {
454         perror("listen");
455         closesocket(fd);
456         return -1;
457     }
458
459     nc = qemu_new_net_client(&net_socket_info, peer, model, name);
460     s = DO_UPCAST(NetSocketState, nc, nc);
461     s->fd = -1;
462     s->listen_fd = fd;
463     s->nc.link_down = true;
464
465     qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
466     return 0;
467 }
468
469 static int net_socket_connect_init(NetClientState *peer,
470                                    const char *model,
471                                    const char *name,
472                                    const char *host_str)
473 {
474     NetSocketState *s;
475     int fd, connected, ret, err;
476     struct sockaddr_in saddr;
477
478     if (parse_host_port(&saddr, host_str) < 0)
479         return -1;
480
481     fd = qemu_socket(PF_INET, SOCK_STREAM, 0);
482     if (fd < 0) {
483         perror("socket");
484         return -1;
485     }
486     socket_set_nonblock(fd);
487
488     connected = 0;
489     for(;;) {
490         ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
491         if (ret < 0) {
492             err = socket_error();
493             if (err == EINTR || err == EWOULDBLOCK) {
494             } else if (err == EINPROGRESS) {
495                 break;
496 #ifdef _WIN32
497             } else if (err == WSAEALREADY || err == WSAEINVAL) {
498                 break;
499 #endif
500             } else {
501                 perror("connect");
502                 closesocket(fd);
503                 return -1;
504             }
505         } else {
506             connected = 1;
507             break;
508         }
509     }
510     s = net_socket_fd_init(peer, model, name, fd, connected);
511     if (!s)
512         return -1;
513     snprintf(s->nc.info_str, sizeof(s->nc.info_str),
514              "socket: connect to %s:%d",
515              inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
516     return 0;
517 }
518
519 static int net_socket_mcast_init(NetClientState *peer,
520                                  const char *model,
521                                  const char *name,
522                                  const char *host_str,
523                                  const char *localaddr_str)
524 {
525     NetSocketState *s;
526     int fd;
527     struct sockaddr_in saddr;
528     struct in_addr localaddr, *param_localaddr;
529
530     if (parse_host_port(&saddr, host_str) < 0)
531         return -1;
532
533     if (localaddr_str != NULL) {
534         if (inet_aton(localaddr_str, &localaddr) == 0)
535             return -1;
536         param_localaddr = &localaddr;
537     } else {
538         param_localaddr = NULL;
539     }
540
541     fd = net_socket_mcast_create(&saddr, param_localaddr);
542     if (fd < 0)
543         return -1;
544
545     s = net_socket_fd_init(peer, model, name, fd, 0);
546     if (!s)
547         return -1;
548
549     s->dgram_dst = saddr;
550
551     snprintf(s->nc.info_str, sizeof(s->nc.info_str),
552              "socket: mcast=%s:%d",
553              inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
554     return 0;
555
556 }
557
558 static int net_socket_udp_init(NetClientState *peer,
559                                  const char *model,
560                                  const char *name,
561                                  const char *rhost,
562                                  const char *lhost)
563 {
564     NetSocketState *s;
565     int fd, val, ret;
566     struct sockaddr_in laddr, raddr;
567
568     if (parse_host_port(&laddr, lhost) < 0) {
569         return -1;
570     }
571
572     if (parse_host_port(&raddr, rhost) < 0) {
573         return -1;
574     }
575
576     fd = qemu_socket(PF_INET, SOCK_DGRAM, 0);
577     if (fd < 0) {
578         perror("socket(PF_INET, SOCK_DGRAM)");
579         return -1;
580     }
581     val = 1;
582     ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
583                    (const char *)&val, sizeof(val));
584     if (ret < 0) {
585         perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
586         closesocket(fd);
587         return -1;
588     }
589     ret = bind(fd, (struct sockaddr *)&laddr, sizeof(laddr));
590     if (ret < 0) {
591         perror("bind");
592         closesocket(fd);
593         return -1;
594     }
595
596     s = net_socket_fd_init(peer, model, name, fd, 0);
597     if (!s) {
598         return -1;
599     }
600
601     s->dgram_dst = raddr;
602
603     snprintf(s->nc.info_str, sizeof(s->nc.info_str),
604              "socket: udp=%s:%d",
605              inet_ntoa(raddr.sin_addr), ntohs(raddr.sin_port));
606     return 0;
607 }
608
609 int net_init_socket(const NetClientOptions *opts, const char *name,
610                     NetClientState *peer)
611 {
612     const NetdevSocketOptions *sock;
613
614     assert(opts->kind == NET_CLIENT_OPTIONS_KIND_SOCKET);
615     sock = opts->socket;
616
617     if (sock->has_fd + sock->has_listen + sock->has_connect + sock->has_mcast +
618         sock->has_udp != 1) {
619         error_report("exactly one of fd=, listen=, connect=, mcast= or udp="
620                      " is required");
621         return -1;
622     }
623
624     if (sock->has_localaddr && !sock->has_mcast && !sock->has_udp) {
625         error_report("localaddr= is only valid with mcast= or udp=");
626         return -1;
627     }
628
629     if (sock->has_fd) {
630         int fd;
631
632         fd = net_handle_fd_param(cur_mon, sock->fd);
633         if (fd == -1 || !net_socket_fd_init(peer, "socket", name, fd, 1)) {
634             return -1;
635         }
636         return 0;
637     }
638
639     if (sock->has_listen) {
640         if (net_socket_listen_init(peer, "socket", name, sock->listen) == -1) {
641             return -1;
642         }
643         return 0;
644     }
645
646     if (sock->has_connect) {
647         if (net_socket_connect_init(peer, "socket", name, sock->connect) ==
648             -1) {
649             return -1;
650         }
651         return 0;
652     }
653
654     if (sock->has_mcast) {
655         /* if sock->localaddr is missing, it has been initialized to "all bits
656          * zero" */
657         if (net_socket_mcast_init(peer, "socket", name, sock->mcast,
658             sock->localaddr) == -1) {
659             return -1;
660         }
661         return 0;
662     }
663
664     assert(sock->has_udp);
665     if (!sock->has_localaddr) {
666         error_report("localaddr= is mandatory with udp=");
667         return -1;
668     }
669     if (net_socket_udp_init(peer, "udp", name, sock->udp, sock->localaddr) ==
670         -1) {
671         return -1;
672     }
673     return 0;
674 }