trap_put_long(ctx, p + 54, p + 92 + 4096); // SPReg
tmp1 = here ();
- write_log(_T("uaenet worker: %08x\n"), tmp1);
dl(0x2c780004); // move.l 4.w,a6
dw(0x203c); // move.l #$100,d0
dl(0x00000100);
return s2p;
}
-static int handleread (TrapContext *ctx, struct priv_s2devstruct *pdev, uae_u8 *request, uaecptr arequest, uae_u8 *d, int len, int cmd)
+static int handleread (TrapContext *ctx, struct priv_s2devstruct *pdev, struct s2devstruct *dev, uae_u8 *request, uaecptr arequest, uae_u8 *d, int len, int cmd)
{
uae_u8 flags = get_byte_host(request + 30);
uaecptr data = get_long_host(request + 32 + 4 + 4 + SANA2_MAX_ADDR_BYTES * 2 + 4);
memcpy(dstaddr, d, ADDR_SIZE);
memcpy(srcaddr, d + ADDR_SIZE, ADDR_SIZE);
+ /* drop if CMD_READ and multicast with unknown address */
+ if (cmd == CMD_READ && ismulticast(dstaddr)) {
+ uae_u64 mac64 = addrto64(dstaddr);
+ /* multicast */
+ struct mcast *mc = dev->mc;
+ while (mc) {
+ if (mac64 >= mc->start && mac64 <= mc->end)
+ break;
+ mc = mc->next;
+ }
+ if (!mc)
+ return 0;
+ }
+
put_long_host(request + 32 + 4, type);
if (pdev->tracks[type]) {
pdev->bytesreceived += len;
}
put_long_host(request + 32 + 4 + 4 + SANA2_MAX_ADDR_BYTES * 2, len);
- if (pdev->packetfilter && cmd == CMD_READ && packetfilter (ctx, pdev->packetfilter, arequest, data2) == 0)
- return 0;
+ if (cmd == CMD_READ) {
+ if (pdev->packetfilter && packetfilter (ctx, pdev->packetfilter, arequest, data2) == 0)
+ return 0;
+ }
+
if (!copytobuff (ctx, data2, data, len, pdev->copytobuff)) {
put_long_host(request + 32, S2WERR_BUFF_ERROR);
put_byte_host(request + 31, S2ERR_NO_RESOURCES);
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;
/* drop if not promiscuous and dst != broadcast and dst != me */
if (!dev->promiscuous && !isbroadcast (d) && memcmp (d, dev->td->mac, ADDR_SIZE))
return;
- /* drop if multicast with unknown address */
- if (ismulticast (d)) {
- uae_u64 mac64 = addrto64 (d);
- /* multicast */
- mc = dev->mc;
- while (mc) {
- if (mac64 >= mc->start && mac64 <= mc->end)
- break;
- mc = mc->next;
- }
- if (!mc)
- return;
- }
type = (d[12] << 8) | d[13];
s2p = createreadpacket (dev, d, len);
if (packettype == type || (packettype <= 1500 && type <= 1500)) {
struct priv_s2devstruct *pdev = getps2devstruct(ctx, arequest);
if (pdev && pdev->tmp == 0) {
- if (handleread (ctx, pdev, request, arequest, p->data, p->len, command)) {
+ if (handleread (ctx, pdev, dev, request, arequest, p->data, p->len, command)) {
if (log_net)
write_log (_T("-> %p Accepted, CMD_READ, REQ=%08X LEN=%d\n"), p, arequest, p->len);
ar->ready = 1;
if (pdev && pdev->tmp <= 0) {
if (log_net)
write_log (_T("-> %p Accepted, S2_READORPHAN, REQ=%08X LEN=%d\n"), p, arequest, p->len);
- handleread (ctx, pdev, request, arequest, p->data, p->len, command);
+ handleread (ctx, pdev, dev, request, arequest, p->data, p->len, command);
ar->ready = 1;
uae_sem_wait(&pipe_sem);
trap_set_background(ctx);