Annotation of previous/src/enet_slirp.c, revision 1.1.1.2

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.