461 |
|
void EtherInterrupt(void) |
462 |
|
{ |
463 |
|
D(bug("EtherIRQ\n")); |
464 |
+ |
EthernetPacket ether_packet; |
465 |
+ |
uint32 packet = ether_packet.addr(); |
466 |
|
|
467 |
|
if (udp_tunnel) { |
468 |
|
|
467 |
– |
uint8 packet[1514]; |
469 |
|
ssize_t length; |
470 |
|
|
471 |
|
// Read packets from socket and hand to ether_udp_read() for processing |
472 |
|
while (true) { |
473 |
|
struct sockaddr_in from; |
474 |
|
socklen_t from_len = sizeof(from); |
475 |
< |
length = recvfrom(fd, packet, 1514, 0, (struct sockaddr *)&from, &from_len); |
475 |
> |
length = recvfrom(fd, Mac2HostAddr(packet), 1514, 0, (struct sockaddr *)&from, &from_len); |
476 |
|
if (length < 14) |
477 |
|
break; |
478 |
|
ether_udp_read(packet, length, &from); |
484 |
|
net_packet *p = &net_buffer_ptr->read[rd_pos]; |
485 |
|
while (p->cmd & IN_USE) { |
486 |
|
if ((p->cmd >> 8) == SHEEP_PACKET) { |
487 |
+ |
Host2Mac_memcpy(packet, p->data, p->length); |
488 |
|
#if MONITOR |
489 |
|
bug("Receiving Ethernet packet:\n"); |
490 |
|
for (int i=0; i<p->length; i++) { |
491 |
< |
bug("%02x ", p->data[i]); |
491 |
> |
bug("%02x ", ReadMacInt8(packet + i)); |
492 |
|
} |
493 |
|
bug("\n"); |
494 |
|
#endif |
495 |
|
// Get packet type |
496 |
< |
uint16 type = ntohs(*(uint16 *)(p->data + 12)); |
496 |
> |
uint16 type = ReadMacInt16(packet + 12); |
497 |
|
|
498 |
|
// Look for protocol |
499 |
|
NetProtocol *prot = find_protocol(type); |
505 |
|
goto next; |
506 |
|
|
507 |
|
// Copy header to RHA |
508 |
< |
Host2Mac_memcpy(ether_data + ed_RHA, p->data, 14); |
508 |
> |
Mac2Mac_memcpy(ether_data + ed_RHA, packet, 14); |
509 |
|
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))); |
510 |
|
|
511 |
|
// Call protocol handler |
512 |
|
M68kRegisters r; |
513 |
|
r.d[0] = type; // Packet type |
514 |
|
r.d[1] = p->length - 14; // Remaining packet length (without header, for ReadPacket) |
515 |
< |
r.a[0] = (uint32)p->data + 14; // Pointer to packet (host address, for ReadPacket) |
515 |
> |
r.a[0] = packet + 14; // Pointer to packet (Mac address, for ReadPacket) |
516 |
|
r.a[3] = ether_data + ed_RHA + 14; // Pointer behind header in RHA |
517 |
|
r.a[4] = ether_data + ed_ReadPacket; // Pointer to ReadPacket/ReadRest routines |
518 |
|
D(bug(" calling protocol handler %08lx, type %08lx, length %08lx, data %08lx, rha %08lx, read_packet %08lx\n", prot->handler, r.d[0], r.d[1], r.a[0], r.a[3], r.a[4])); |