--- previous/src/enet_slirp.c 2018/04/24 19:29:49 1.1 +++ previous/src/enet_slirp.c 2018/04/24 19:33:10 1.1.1.3 @@ -2,34 +2,37 @@ #include "ethernet.h" #include "enet_slirp.h" #include "queue.h" +#include "host.h" -#include #ifndef _WIN32 -#include +#include +#else +#undef TCHAR +#include +int inet_aton(const char *cp, struct in_addr *addr); #endif - /****************/ /* -- SLIRP -- */ -#include /* slirp prototypes */ -extern int slirp_init(void); +int slirp_init(void); int slirp_redir(int is_udp, int host_port, struct in_addr guest_addr, int guest_port); -extern void slirp_input(const uint8_t *pkt, int pkt_len); -extern int slirp_select_fill(int *pnfds, +void slirp_input(const uint8_t *pkt, int pkt_len); +int slirp_select_fill(int *pnfds, fd_set *readfds, fd_set *writefds, fd_set *xfds); -extern void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds); -extern void slirp_exit(int); +void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds); +void slirp_exit(int); void slirp_debug_init(char*,int); -extern void slirp_output(const unsigned char *pkt, int pkt_len); -extern int slirp_can_output(void); +void slirp_output(const unsigned char *pkt, int pkt_len); +int slirp_can_output(void); /* queue prototypes */ queueADT slirpq; int slirp_inited; +int slirp_started; static SDL_mutex *slirp_mutex = NULL; SDL_Thread *tick_func_handle; @@ -37,7 +40,7 @@ SDL_Thread *tick_func_handle; //Is set to true from the init, and false on ethernet disconnect int slirp_can_output(void) { - return slirp_inited; + return slirp_started; } //This is a callback function for SLiRP that sends a packet @@ -57,7 +60,7 @@ void slirp_output (const unsigned char * //This function is to be periodically called //to keep the internal packet state flowing. -void slirp_tick(void) +static void slirp_tick(void) { int ret2,nfds; struct timeval tv; @@ -65,12 +68,14 @@ void slirp_tick(void) int timeout; nfds=-1; - if (slirp_inited) + if (slirp_started) { FD_ZERO(&rfds); FD_ZERO(&wfds); FD_ZERO(&xfds); + SDL_LockMutex(slirp_mutex); timeout=slirp_select_fill(&nfds,&rfds,&wfds,&xfds); //this can crash + SDL_UnlockMutex(slirp_mutex); if(timeout<0) timeout=500; @@ -88,9 +93,9 @@ void slirp_tick(void) static int tick_func(void *arg) { - while(slirp_inited) + while(slirp_started) { - SDL_Delay(10); + host_sleep_ms(10); slirp_tick(); } return 0; @@ -112,7 +117,7 @@ void enet_slirp_queue_poll(void) } void enet_slirp_input(Uint8 *pkt, int pkt_len) { - if (slirp_inited) { + if (slirp_started) { Log_Printf(LOG_WARN, "[SLIRP] Input packet with %i bytes",enet_tx_buffer.size); SDL_LockMutex(slirp_mutex); slirp_input(pkt,pkt_len); @@ -123,31 +128,30 @@ void enet_slirp_input(Uint8 *pkt, int pk void enet_slirp_stop(void) { int ret; - if(slirp_inited) { + if (slirp_started) { Log_Printf(LOG_WARN, "Stopping SLIRP"); - slirp_inited=0; - //slirp_exit(0); + slirp_started=0; QueueDestroy(slirpq); SDL_DestroyMutex(slirp_mutex); SDL_WaitThread(tick_func_handle, &ret); } } -void enet_slirp_start(void) { +void enet_slirp_start(Uint8 *mac) { struct in_addr guest_addr; if (!slirp_inited) { - Log_Printf(LOG_WARN, "Starting SLIRP"); -#ifndef _WIN32 - signal(SIGPIPE, SIG_IGN); -#endif + Log_Printf(LOG_WARN, "Initializing SLIRP"); + slirp_inited=1; slirp_init(); + inet_aton("10.0.2.15", &guest_addr); + slirp_redir(0, 42323, guest_addr, 23); + } + if (slirp_inited && !slirp_started) { + Log_Printf(LOG_WARN, "Starting SLIRP"); + slirp_started=1; slirpq = QueueCreate(); - slirp_inited=1; - //SDL_Delay(500); slirp_mutex=SDL_CreateMutex(); tick_func_handle=SDL_CreateThread(tick_func,"SLiRPTickThread", (void *)NULL); - inet_aton("10.0.2.15", &guest_addr); - slirp_redir(0, 42323, guest_addr, 23); } }