|
|
1.1 ! root 1: #include "m68000.h" ! 2: #include "ethernet.h" ! 3: #include "enet_slirp.h" ! 4: #include "queue.h" ! 5: ! 6: #include <SDL.h> ! 7: #ifndef _WIN32 ! 8: #include <signal.h> ! 9: #endif ! 10: ! 11: ! 12: /****************/ ! 13: /* -- SLIRP -- */ ! 14: ! 15: #include <arpa/inet.h> ! 16: ! 17: /* slirp prototypes */ ! 18: extern int slirp_init(void); ! 19: int slirp_redir(int is_udp, int host_port, struct in_addr guest_addr, int guest_port); ! 20: extern void slirp_input(const uint8_t *pkt, int pkt_len); ! 21: extern int slirp_select_fill(int *pnfds, ! 22: fd_set *readfds, fd_set *writefds, fd_set *xfds); ! 23: extern void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds); ! 24: extern void slirp_exit(int); ! 25: void slirp_debug_init(char*,int); ! 26: extern void slirp_output(const unsigned char *pkt, int pkt_len); ! 27: extern int slirp_can_output(void); ! 28: ! 29: /* queue prototypes */ ! 30: queueADT slirpq; ! 31: ! 32: int slirp_inited; ! 33: static SDL_mutex *slirp_mutex = NULL; ! 34: SDL_Thread *tick_func_handle; ! 35: ! 36: //Is slirp initalized? ! 37: //Is set to true from the init, and false on ethernet disconnect ! 38: int slirp_can_output(void) ! 39: { ! 40: return slirp_inited; ! 41: } ! 42: ! 43: //This is a callback function for SLiRP that sends a packet ! 44: //to the calling library. In this case I stuff ! 45: //it in q queue ! 46: void slirp_output (const unsigned char *pkt, int pkt_len) ! 47: { ! 48: struct queuepacket *p; ! 49: p=(struct queuepacket *)malloc(sizeof(struct queuepacket)); ! 50: SDL_LockMutex(slirp_mutex); ! 51: p->len=pkt_len; ! 52: memcpy(p->data,pkt,pkt_len); ! 53: QueueEnter(slirpq,p); ! 54: SDL_UnlockMutex(slirp_mutex); ! 55: Log_Printf(LOG_WARN, "[SLIRP] Output packet with %i bytes to queue",pkt_len); ! 56: } ! 57: ! 58: //This function is to be periodically called ! 59: //to keep the internal packet state flowing. ! 60: void slirp_tick(void) ! 61: { ! 62: int ret2,nfds; ! 63: struct timeval tv; ! 64: fd_set rfds, wfds, xfds; ! 65: int timeout; ! 66: nfds=-1; ! 67: ! 68: if (slirp_inited) ! 69: { ! 70: FD_ZERO(&rfds); ! 71: FD_ZERO(&wfds); ! 72: FD_ZERO(&xfds); ! 73: timeout=slirp_select_fill(&nfds,&rfds,&wfds,&xfds); //this can crash ! 74: ! 75: if(timeout<0) ! 76: timeout=500; ! 77: tv.tv_sec=0; ! 78: tv.tv_usec = timeout; //basilisk default 10000 ! 79: ! 80: ret2 = select(nfds + 1, &rfds, &wfds, &xfds, &tv); ! 81: if(ret2>=0){ ! 82: SDL_LockMutex(slirp_mutex); ! 83: slirp_select_poll(&rfds, &wfds, &xfds); ! 84: SDL_UnlockMutex(slirp_mutex); ! 85: } ! 86: } ! 87: } ! 88: ! 89: static int tick_func(void *arg) ! 90: { ! 91: while(slirp_inited) ! 92: { ! 93: SDL_Delay(10); ! 94: slirp_tick(); ! 95: } ! 96: return 0; ! 97: } ! 98: ! 99: ! 100: void enet_slirp_queue_poll(void) ! 101: { ! 102: SDL_LockMutex(slirp_mutex); ! 103: if (QueuePeek(slirpq)>0) ! 104: { ! 105: struct queuepacket *qp; ! 106: qp=QueueDelete(slirpq); ! 107: Log_Printf(LOG_WARN, "[SLIRP] Getting packet from queue"); ! 108: enet_receive(qp->data,qp->len); ! 109: free(qp); ! 110: } ! 111: SDL_UnlockMutex(slirp_mutex); ! 112: } ! 113: ! 114: void enet_slirp_input(Uint8 *pkt, int pkt_len) { ! 115: if (slirp_inited) { ! 116: Log_Printf(LOG_WARN, "[SLIRP] Input packet with %i bytes",enet_tx_buffer.size); ! 117: SDL_LockMutex(slirp_mutex); ! 118: slirp_input(pkt,pkt_len); ! 119: SDL_UnlockMutex(slirp_mutex); ! 120: } ! 121: } ! 122: ! 123: void enet_slirp_stop(void) { ! 124: int ret; ! 125: ! 126: if(slirp_inited) { ! 127: Log_Printf(LOG_WARN, "Stopping SLIRP"); ! 128: slirp_inited=0; ! 129: //slirp_exit(0); ! 130: QueueDestroy(slirpq); ! 131: SDL_DestroyMutex(slirp_mutex); ! 132: SDL_WaitThread(tick_func_handle, &ret); ! 133: } ! 134: } ! 135: ! 136: void enet_slirp_start(void) { ! 137: struct in_addr guest_addr; ! 138: ! 139: if (!slirp_inited) { ! 140: Log_Printf(LOG_WARN, "Starting SLIRP"); ! 141: #ifndef _WIN32 ! 142: signal(SIGPIPE, SIG_IGN); ! 143: #endif ! 144: slirp_init(); ! 145: slirpq = QueueCreate(); ! 146: slirp_inited=1; ! 147: //SDL_Delay(500); ! 148: slirp_mutex=SDL_CreateMutex(); ! 149: tick_func_handle=SDL_CreateThread(tick_func,"SLiRPTickThread", (void *)NULL); ! 150: inet_aton("10.0.2.15", &guest_addr); ! 151: slirp_redir(0, 42323, guest_addr, 23); ! 152: } ! 153: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.