return 1; // just allow everything
}
-static void gotfunc (struct s2devstruct *dev, const uae_u8 *databuf, int len)
+static void gotfunc (void *devv, const uae_u8 *databuf, int len)
{
int i;
int size, insize, first;
uae_u32 crc32;
uae_u8 tmp[MAX_PACKET_SIZE], *data;
const uae_u8 *dstmac, *srcmac;
+ struct s2devstruct *dev = (struct s2devstruct*)devv;
if (log_a2065 > 1 && log_receive) {
dstmac = databuf;
rethink_a2065 ();
}
-static int getfunc (struct s2devstruct *dev, uae_u8 *d, int *len)
+static int getfunc (void *devv, uae_u8 *d, int *len)
{
+ struct s2devstruct *dev = (struct s2devstruct*)devv;
+
if (transmitlen <= 0)
return 0;
if (transmitlen > *len) {
(d[12] << 8) | d[13], outsize);
}
}
- ethernet_trigger (sysdata);
+ ethernet_trigger (td, sysdata);
}
csr[0] |= CSR0_TINT;
rethink_a2065 ();
{
ethernet_gotfunc *gotfunc;
ethernet_getfunc *getfunc;
+ void *userdata;
};
#define SLIRP_PORT_OFFSET 0
if (!slirp_data)
return;
uae_sem_wait (&slirp_sem1);
- slirp_data->gotfunc (NULL, pkt, pkt_len);
+ slirp_data->gotfunc (slirp_data->userdata, pkt, pkt_len);
uae_sem_post (&slirp_sem1);
}
-void ethernet_trigger (void *vsd)
+void ethernet_trigger (struct netdriverdata *ndd, void *vsd)
{
- switch (netmode)
+ switch (ndd->type)
{
case UAENET_SLIRP:
case UAENET_SLIRP_INBOUND:
int len = sizeof pkt;
int v;
uae_sem_wait (&slirp_sem1);
- v = slirp_data->getfunc(NULL, pkt, &len);
+ v = slirp_data->getfunc(ed->userdata, pkt, &len);
uae_sem_post (&slirp_sem1);
if (v) {
uae_sem_wait (&slirp_sem2);
struct ethernet_data *ed = (struct ethernet_data*)vsd;
ed->gotfunc = gotfunc;
ed->getfunc = getfunc;
+ ed->userdata = user;
slirp_data = ed;
uae_sem_init (&slirp_sem1, 0, 1);
uae_sem_init (&slirp_sem2, 0, 1);
slirp_redir (0, port + SLIRP_PORT_OFFSET, a, port);
}
}
+ netmode = ndd->type;
slirp_start ();
}
return 1;
#ifdef WITH_UAENET_PCAP
case UAENET_PCAP:
- return uaenet_open (vsd, ndd, user, gotfunc, getfunc, promiscuous);
+ if (uaenet_open (vsd, ndd, user, gotfunc, getfunc, promiscuous)) {
+ netmode = ndd->type;
+ return 1;
+ }
+ return 0;
#endif
}
return 0;
};
-typedef void (ethernet_gotfunc)(struct s2devstruct *dev, const uae_u8 *data, int len);
-typedef int (ethernet_getfunc)(struct s2devstruct *dev, uae_u8 *d, int *len);
+typedef void (ethernet_gotfunc)(void *dev, const uae_u8 *data, int len);
+typedef int (ethernet_getfunc)(void *dev, uae_u8 *d, int *len);
extern bool ethernet_enumerate (struct netdriverdata **, const TCHAR *name);
extern void ethernet_enumerate_free (void);
extern void ethernet_close (struct netdriverdata *ndd, void*);
extern void ethernet_gotdata (struct s2devstruct *dev, const uae_u8 *data, int len);
extern int ethernet_getdata (struct s2devstruct *dev, uae_u8 *d, int *len);
-extern void ethernet_trigger (void*);
+extern void ethernet_trigger (struct netdriverdata *ndd, void*);
extern bool slirp_start (void);
extern void slirp_end (void);
#include "ethernet.h"
-typedef void (uaenet_gotfunc)(struct s2devstruct *dev, const uae_u8 *data, int len);
-typedef int (uaenet_getfunc)(struct s2devstruct *dev, uae_u8 *d, int *len);
+typedef void (uaenet_gotfunc)(void *dev, const uae_u8 *data, int len);
+typedef int (uaenet_getfunc)(void *dev, uae_u8 *d, int *len);
extern struct netdriverdata *uaenet_enumerate (const TCHAR *name);
extern void uaenet_enumerate_free (void);
#endif
#include "execio.h"
-void uaenet_gotdata (struct s2devstruct *dev, const uae_u8 *data, int len);
-int uaenet_getdata (struct s2devstruct *dev, uae_u8 *d, int *len);
+static void uaenet_gotdata (void *dev, const uae_u8 *data, int len);
+static int uaenet_getdata (void *dev, uae_u8 *d, int *len);
#define SANA2NAME _T("uaenet.device")
return 1;
}
-void uaenet_gotdata (struct s2devstruct *dev, const uae_u8 *d, int len)
+static void uaenet_gotdata (void *devv, const uae_u8 *d, int len)
{
uae_u16 type;
struct mcast *mc;
struct s2packet *s2p;
+ struct s2devstruct *dev = (struct s2devstruct*)devv;
if (!dev->online)
return;
return s2p;
}
-int uaenet_getdata (struct s2devstruct *dev, uae_u8 *d, int *len)
+static int uaenet_getdata (void *devv, uae_u8 *d, int *len)
{
int gotit;
struct asyncreq *ar;
+ struct s2devstruct *dev = (struct s2devstruct*)devv;
uae_sem_wait (&async_sem);
ar = dev->ar;
uae_ReplyMsg (request);
rem_async_packet (dev, request);
} else {
+ struct priv_s2devstruct *pdev = getps2devstruct (request);
add_async_request (dev, request);
- ethernet_trigger (dev->sysdata);
+ ethernet_trigger (pdev->td, dev->sysdata);
}
uae_sem_post (&change_sem);
}