|
|
1.1 root 1: #include "m68000.h"
2: #include "ethernet.h"
3: #include "enet_slirp.h"
4: #include "queue.h"
1.1.1.2 ! root 5: #include "host.h"
1.1 root 6:
7: #ifndef _WIN32
1.1.1.2 ! root 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);
1.1 root 13: #endif
14:
15: /****************/
16: /* -- SLIRP -- */
17:
18:
19: /* slirp prototypes */
1.1.1.2 ! root 20: int slirp_init(void);
1.1 root 21: int slirp_redir(int is_udp, int host_port, struct in_addr guest_addr, int guest_port);
1.1.1.2 ! root 22: void slirp_input(const uint8_t *pkt, int pkt_len);
! 23: int slirp_select_fill(int *pnfds,
1.1 root 24: fd_set *readfds, fd_set *writefds, fd_set *xfds);
1.1.1.2 ! root 25: void slirp_select_poll(fd_set *readfds, fd_set *writefds, fd_set *xfds);
! 26: void slirp_exit(int);
1.1 root 27: void slirp_debug_init(char*,int);
1.1.1.2 ! root 28: void slirp_output(const unsigned char *pkt, int pkt_len);
! 29: int slirp_can_output(void);
1.1 root 30:
31: /* queue prototypes */
32: queueADT slirpq;
33:
34: int slirp_inited;
1.1.1.2 ! root 35: int slirp_started;
1.1 root 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: {
1.1.1.2 ! root 43: return slirp_started;
1.1 root 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.
1.1.1.2 ! root 63: static void slirp_tick(void)
1.1 root 64: {
65: int ret2,nfds;
66: struct timeval tv;
67: fd_set rfds, wfds, xfds;
68: int timeout;
69: nfds=-1;
70:
1.1.1.2 ! root 71: if (slirp_started)
1.1 root 72: {
73: FD_ZERO(&rfds);
74: FD_ZERO(&wfds);
75: FD_ZERO(&xfds);
1.1.1.2 ! root 76: SDL_LockMutex(slirp_mutex);
1.1 root 77: timeout=slirp_select_fill(&nfds,&rfds,&wfds,&xfds); //this can crash
1.1.1.2 ! root 78: SDL_UnlockMutex(slirp_mutex);
1.1 root 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: {
1.1.1.2 ! root 96: while(slirp_started)
1.1 root 97: {
1.1.1.2 ! root 98: host_sleep_ms(10);
1.1 root 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) {
1.1.1.2 ! root 120: if (slirp_started) {
1.1 root 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:
1.1.1.2 ! root 131: if (slirp_started) {
1.1 root 132: Log_Printf(LOG_WARN, "Stopping SLIRP");
1.1.1.2 ! root 133: slirp_started=0;
1.1 root 134: QueueDestroy(slirpq);
135: SDL_DestroyMutex(slirp_mutex);
136: SDL_WaitThread(tick_func_handle, &ret);
137: }
138: }
139:
140: void enet_slirp_start(void) {
141: struct in_addr guest_addr;
142:
143: if (!slirp_inited) {
1.1.1.2 ! root 144: Log_Printf(LOG_WARN, "Initializing SLIRP");
! 145: slirp_inited=1;
1.1 root 146: slirp_init();
1.1.1.2 ! root 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;
1.1 root 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.