| /* |
| * ether_dummy.cpp - Ethernet device driver, dummy implementation |
| * |
| * Basilisk II (C) 1997-2008 Christian Bauer |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| |
| #include "sysdeps.h" |
| |
| #if SUPPORTS_UDP_TUNNEL |
| #include <netinet/in.h> |
| #include <sys/socket.h> |
| #endif |
| |
| #include "cpu_emulation.h" |
| #include "main.h" |
| #include "macos_util.h" |
| #include "prefs.h" |
| #include "user_strings.h" |
| #include "ether.h" |
| #include "ether_defs.h" |
| |
| #define DEBUG 0 |
| #include "debug.h" |
| |
| #define MONITOR 0 |
| |
| |
| // Global variables |
| #if SUPPORTS_UDP_TUNNEL |
| static int fd = -1; // UDP tunnel socket fd |
| static bool udp_tunnel_active = false; |
| #endif |
| |
| |
| /* |
| * Initialization |
| */ |
| |
| bool ether_init(void) |
| { |
| return true; |
| } |
| |
| |
| /* |
| * Deinitialization |
| */ |
| |
| void ether_exit(void) |
| { |
| } |
| |
| |
| /* |
| * Reset |
| */ |
| |
| void ether_reset(void) |
| { |
| } |
| |
| |
| /* |
| * Add multicast address |
| */ |
| |
| int16 ether_add_multicast(uint32 pb) |
| { |
| return noErr; |
| } |
| |
| |
| /* |
| * Delete multicast address |
| */ |
| |
| int16 ether_del_multicast(uint32 pb) |
| { |
| return noErr; |
| } |
| |
| |
| /* |
| * Attach protocol handler |
| */ |
| |
| int16 ether_attach_ph(uint16 type, uint32 handler) |
| { |
| return noErr; |
| } |
| |
| |
| /* |
| * Detach protocol handler |
| */ |
| |
| int16 ether_detach_ph(uint16 type) |
| { |
| return noErr; |
| } |
| |
| |
| /* |
| * Transmit raw ethernet packet |
| */ |
| |
| int16 ether_write(uint32 wds) |
| { |
| // Set source address |
| uint32 hdr = ReadMacInt32(wds + 2); |
| memcpy(Mac2HostAddr(hdr + 6), ether_addr, 6); |
| return noErr; |
| } |
| |
| |
| /* |
| * Start UDP packet reception thread |
| */ |
| |
| bool ether_start_udp_thread(int socket_fd) |
| { |
| #if SUPPORTS_UDP_TUNNEL |
| fd = socket_fd; |
| udp_tunnel_active = true; |
| return true; |
| #else |
| return false; |
| #endif |
| } |
| |
| |
| /* |
| * Stop UDP packet reception thread |
| */ |
| |
| void ether_stop_udp_thread(void) |
| { |
| #if SUPPORTS_UDP_TUNNEL |
| udp_tunnel_active = false; |
| #endif |
| } |
| |
| |
| /* |
| * Ethernet interrupt - activate deferred tasks to call IODone or protocol handlers |
| */ |
| |
| void EtherInterrupt(void) |
| { |
| #if SUPPORTS_UDP_TUNNEL |
| if (udp_tunnel_active) { |
| EthernetPacket ether_packet; |
| uint32 packet = ether_packet.addr(); |
| ssize_t length; |
| |
| // Read packets from socket and hand to ether_udp_read() for processing |
| while (true) { |
| struct sockaddr_in from; |
| socklen_t from_len = sizeof(from); |
| length = recvfrom(fd, Mac2HostAddr(packet), 1514, 0, (struct sockaddr *)&from, &from_len); |
| if (length < 14) |
| break; |
| ether_udp_read(packet, length, &from); |
| } |
| } |
| #endif |
| } |