346 |
|
|
347 |
|
static __saveds void net_func(void) |
348 |
|
{ |
349 |
+ |
const char *str; |
350 |
+ |
BYTE od_error; |
351 |
|
struct MsgPort *write_port = NULL, *control_port = NULL; |
352 |
|
struct IOSana2Req *write_io = NULL, *control_io = NULL; |
353 |
|
bool opened = false; |
390 |
|
// Parse device name |
391 |
|
char dev_name[256]; |
392 |
|
ULONG dev_unit; |
393 |
< |
if (sscanf(PrefsFindString("ether"), "%[^/]/%ld", dev_name, &dev_unit) < 2) |
393 |
> |
|
394 |
> |
str = PrefsFindString("ether"); |
395 |
> |
if (str) |
396 |
> |
{ |
397 |
> |
const char *FirstSlash = strchr(str, '/'); |
398 |
> |
const char *LastSlash = strrchr(str, '/'); |
399 |
> |
|
400 |
> |
if (FirstSlash && FirstSlash && FirstSlash != LastSlash) |
401 |
> |
{ |
402 |
> |
// Device name contains path, i.e. "Networks/xyzzy.device" |
403 |
> |
const char *lp = str; |
404 |
> |
char *dp = dev_name; |
405 |
> |
|
406 |
> |
while (lp != LastSlash) |
407 |
> |
*dp++ = *lp++; |
408 |
> |
*dp = '\0'; |
409 |
> |
|
410 |
> |
if (strlen(dev_name) < 1) |
411 |
> |
goto quit; |
412 |
> |
|
413 |
> |
if (1 != sscanf(LastSlash, "/%ld", &dev_unit)) |
414 |
> |
goto quit; |
415 |
> |
|
416 |
> |
// printf("dev=<%s> unit=%d\n", dev_name, dev_unit); |
417 |
> |
} |
418 |
> |
else |
419 |
> |
{ |
420 |
> |
if (2 != sscanf(str, "%[^/]/%ld", dev_name, &dev_unit)) |
421 |
> |
goto quit; |
422 |
> |
} |
423 |
> |
} |
424 |
> |
else |
425 |
|
goto quit; |
426 |
|
|
427 |
|
// Open device |
428 |
|
control_io->ios2_BufferManagement = buffer_tags; |
429 |
< |
if (OpenDevice((UBYTE *)dev_name, dev_unit, (struct IORequest *)control_io, 0) || control_io->ios2_Req.io_Device == 0) |
429 |
> |
od_error = OpenDevice((UBYTE *)dev_name, dev_unit, (struct IORequest *)control_io, 0); |
430 |
> |
if (0 != od_error || control_io->ios2_Req.io_Device == 0) |
431 |
> |
{ |
432 |
> |
printf("WARNING: OpenDevice(<%s>, unit=%d) returned error %d)\n", (UBYTE *)dev_name, dev_unit, od_error); |
433 |
|
goto quit; |
434 |
+ |
} |
435 |
|
opened = true; |
436 |
|
|
437 |
|
// Is it Ethernet? |
488 |
|
|
489 |
|
case MSG_ADD_MULTI: |
490 |
|
control_io->ios2_Req.io_Command = S2_ADDMULTICASTADDRESS; |
491 |
< |
memcpy(control_io->ios2_SrcAddr, Mac2HostAddr(msg->pointer + eMultiAddr), 6); |
491 |
> |
Mac2Host_memcpy(control_io->ios2_SrcAddr, msg->pointer + eMultiAddr, 6); |
492 |
|
DoIO((struct IORequest *)control_io); |
493 |
|
if (control_io->ios2_Req.io_Error == S2ERR_NOT_SUPPORTED) { |
494 |
|
WarningAlert(GetString(STR_NO_MULTICAST_WARN)); |
501 |
|
|
502 |
|
case MSG_DEL_MULTI: |
503 |
|
control_io->ios2_Req.io_Command = S2_DELMULTICASTADDRESS; |
504 |
< |
memcpy(control_io->ios2_SrcAddr, Mac2HostAddr(msg->pointer + eMultiAddr), 6); |
504 |
> |
Mac2Host_memcpy(control_io->ios2_SrcAddr, msg->pointer + eMultiAddr, 6); |
505 |
|
DoIO((struct IORequest *)control_io); |
506 |
|
if (control_io->ios2_Req.io_Error) |
507 |
|
msg->result = eMultiErr; |
587 |
|
|
588 |
|
// Get destination address, set source address |
589 |
|
uint32 hdr = ReadMacInt32(wds + 2); |
590 |
< |
memcpy(write_io->ios2_DstAddr, Mac2HostAddr(hdr), 6); |
591 |
< |
memcpy(Mac2HostAddr(hdr + 6), ether_addr, 6); |
590 |
> |
Mac2Host_memcpy(write_io->ios2_DstAddr, hdr, 6); |
591 |
> |
Host2Mac_memcpy(hdr + 6, ether_addr, 6); |
592 |
|
|
593 |
|
// Get packet type |
594 |
|
uint32 type = ReadMacInt16(hdr + 12); |
688 |
|
continue; |
689 |
|
|
690 |
|
// Copy header to RHA |
691 |
< |
memcpy(Mac2HostAddr(ether_data + ed_RHA), io->ios2_Data, 14); |
691 |
> |
Host2Mac_memcpy(ether_data + ed_RHA, io->ios2_Data, 14); |
692 |
|
D(bug(" header %08lx%04lx %08lx%04lx %04lx\n", ReadMacInt32(ether_data + ed_RHA), ReadMacInt16(ether_data + ed_RHA + 4), ReadMacInt32(ether_data + ed_RHA + 6), ReadMacInt16(ether_data + ed_RHA + 10), ReadMacInt16(ether_data + ed_RHA + 12))); |
693 |
|
|
694 |
|
// Call protocol handler |