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