From 1ab15eb45d037345bf0383160c950040cfef227f Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Thu, 15 Oct 2015 14:17:42 -0700 Subject: [PATCH] slirp: Port base QEMU slirp code to build on Windows with Visual Studio --- Visual Studio Projects/MicroVAX1.vcproj | 176 +++++++++++++++++++++++- Visual Studio Projects/MicroVAX2.vcproj | 176 +++++++++++++++++++++++- Visual Studio Projects/PDP11.vcproj | 176 +++++++++++++++++++++++- Visual Studio Projects/VAX.vcproj | 176 +++++++++++++++++++++++- Visual Studio Projects/VAX730.vcproj | 176 +++++++++++++++++++++++- Visual Studio Projects/VAX750.vcproj | 176 +++++++++++++++++++++++- Visual Studio Projects/VAX780.vcproj | 176 +++++++++++++++++++++++- Visual Studio Projects/VAX8600.vcproj | 176 +++++++++++++++++++++++- Visual Studio Projects/rtVAX1000.vcproj | 176 +++++++++++++++++++++++- slirp/ip.h | 24 ++-- slirp/misc.c | 25 ++-- slirp/simh/sim_slirp.c | 26 ++-- slirp/slirp.c | 32 ++--- slirp/slirp.h | 8 +- slirp/socket.c | 3 +- 15 files changed, 1591 insertions(+), 111 deletions(-) diff --git a/Visual Studio Projects/MicroVAX1.vcproj b/Visual Studio Projects/MicroVAX1.vcproj index 96abdfc7..160bb443 100644 --- a/Visual Studio Projects/MicroVAX1.vcproj +++ b/Visual Studio Projects/MicroVAX1.vcproj @@ -41,8 +41,8 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + slirp, slirp->rtcp)) { slirp = NULL; } else { - char db_host[32]; - GPollFD pfd; - int ret; - int64_t rnd_val = qemu_clock_get_ns (0) / 1000000; + char db_host[32]; + GPollFD pfd; + int ret; + int64_t rnd_val = qemu_clock_get_ns (0) / 1000000; pthread_mutex_init (&slirp->write_buffer_lock, NULL); slirp->gpollfds = g_array_new(FALSE, FALSE, sizeof(GPollFD)); /* setup transmit packet wakeup doorbell */ slirp->db_chime = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); - ret = socket_set_fast_reuse(slirp->db_chime); - memset (&slirp->db_addr, 0, sizeof (slirp->db_addr)); - slirp->db_addr.sin_family = AF_INET; - sprintf (db_host, "127.%d.%d.%d", (int)((rnd_val>>16) & 0xFF), (int)((rnd_val>>8) & 0xFF), (int)(rnd_val & 0xFF)); - slirp->db_addr.sin_port = (rnd_val >> 24) & 0xFFFF; - inet_aton (db_host, &slirp->db_addr.sin_addr); - ret = bind(slirp->db_chime, (struct sockaddr *)&slirp->db_addr, sizeof(slirp->db_addr)); - qemu_set_nonblock(slirp->db_chime); + ret = socket_set_fast_reuse(slirp->db_chime); + memset (&slirp->db_addr, 0, sizeof (slirp->db_addr)); + slirp->db_addr.sin_family = AF_INET; + sprintf (db_host, "127.%d.%d.%d", (int)((rnd_val>>16) & 0xFF), (int)((rnd_val>>8) & 0xFF), (int)(rnd_val & 0xFF)); + slirp->db_addr.sin_port = (rnd_val >> 24) & 0xFFFF; + inet_aton (db_host, &slirp->db_addr.sin_addr); + ret = bind(slirp->db_chime, (struct sockaddr *)&slirp->db_addr, sizeof(slirp->db_addr)); + qemu_set_nonblock(slirp->db_chime); memset (&pfd, 0, sizeof (pfd)); pfd.fd = slirp->db_chime; pfd.events = G_IO_IN; g_array_append_val(slirp->gpollfds, pfd); - + sim_slirp_show(slirp, stdout); if (sim_log && (sim_log != stdout)) sim_slirp_show(slirp, sim_log); diff --git a/slirp/slirp.c b/slirp/slirp.c index 457199da..7ddbde72 100644 --- a/slirp/slirp.c +++ b/slirp/slirp.c @@ -335,10 +335,8 @@ void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout) * Set for reading sockets which are accepting */ if (so->so_state & SS_FACCEPTCONN) { - GPollFD pfd = { - .fd = so->s, - .events = G_IO_IN | G_IO_HUP | G_IO_ERR, - }; + GPollFD pfd = { so->s, G_IO_IN | G_IO_HUP | G_IO_ERR, 0 }; + so->pollfds_idx = pollfds->len; g_array_append_val(pollfds, pfd); continue; @@ -348,10 +346,8 @@ void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout) * Set for writing sockets which are connecting */ if (so->so_state & SS_ISFCONNECTING) { - GPollFD pfd = { - .fd = so->s, - .events = G_IO_OUT | G_IO_ERR, - }; + GPollFD pfd = { so->s, G_IO_OUT | G_IO_ERR, 0 }; + so->pollfds_idx = pollfds->len; g_array_append_val(pollfds, pfd); continue; @@ -375,10 +371,8 @@ void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout) } if (events) { - GPollFD pfd = { - .fd = so->s, - .events = events, - }; + GPollFD pfd = { so->s, events, 0 }; + so->pollfds_idx = pollfds->len; g_array_append_val(pollfds, pfd); } @@ -416,10 +410,8 @@ void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout) * (XXX <= 4 ?) */ if ((so->so_state & SS_ISFCONNECTED) && so->so_queued <= 4) { - GPollFD pfd = { - .fd = so->s, - .events = G_IO_IN | G_IO_HUP | G_IO_ERR, - }; + GPollFD pfd = { so->s, G_IO_IN | G_IO_HUP | G_IO_ERR, 0 }; + so->pollfds_idx = pollfds->len; g_array_append_val(pollfds, pfd); } @@ -447,10 +439,8 @@ void slirp_pollfds_fill(GArray *pollfds, uint32_t *timeout) } if (so->so_state & SS_ISFCONNECTED) { - GPollFD pfd = { - .fd = so->s, - .events = G_IO_IN | G_IO_HUP | G_IO_ERR, - }; + GPollFD pfd = { so->s, G_IO_IN | G_IO_HUP | G_IO_ERR, 0 }; + so->pollfds_idx = pollfds->len; g_array_append_val(pollfds, pfd); } @@ -846,7 +836,7 @@ int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, getsockname(so->s, (struct sockaddr *)&addr, &addr_len) == 0 && addr.sin_addr.s_addr == host_addr.s_addr && addr.sin_port == port) { - close(so->s); + closesocket(so->s); sofree(so); return 0; } diff --git a/slirp/slirp.h b/slirp/slirp.h index e6eea0b6..6eaced71 100644 --- a/slirp/slirp.h +++ b/slirp/slirp.h @@ -9,8 +9,8 @@ typedef char *caddr_t; -# include # include +# include # include # include # include @@ -167,12 +167,14 @@ void free(void *ptr); #define ARPOP_REQUEST 1 /* ARP request */ #define ARPOP_REPLY 2 /* ARP reply */ +PACKED_BEGIN struct ethhdr { unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ unsigned char h_source[ETH_ALEN]; /* source ether addr */ unsigned short h_proto; /* packet type ID field */ -}; +} PACKED_END; +PACKED_BEGIN struct arphdr { unsigned short ar_hrd; /* format of hardware address */ unsigned short ar_pro; /* format of protocol address */ @@ -187,7 +189,7 @@ struct arphdr { uint32_t ar_sip; /* sender IP address */ unsigned char ar_tha[ETH_ALEN]; /* target hardware address */ uint32_t ar_tip; /* target IP address */ -} QEMU_PACKED; +} PACKED_END; #define ARP_TABLE_SIZE 16 diff --git a/slirp/socket.c b/slirp/socket.c index 8ab47e69..9c16c2d6 100644 --- a/slirp/socket.c +++ b/slirp/socket.c @@ -632,8 +632,9 @@ tcp_listen(Slirp *slirp, uint32_t haddr, u_int hport, uint32_t laddr, (listen(s,1) < 0)) { int tmperrno = errno; /* Don't clobber the real reason we failed */ - close(s); + closesocket(s); sofree(so); + fprintf (stderr, "\r\nSocket Error %d\r\n", tmperrno); /* Restore the real errno */ #ifdef _WIN32 WSASetLastError(tmperrno);