--- SheepShaver/src/ether.cpp 2002/02/04 16:58:13 1.1.1.1 +++ SheepShaver/src/ether.cpp 2008/01/01 09:47:38 1.10 @@ -1,7 +1,7 @@ /* * ether.cpp - SheepShaver Ethernet Device Driver (DLPI) * - * SheepShaver (C) 1997-2002 Marc Hellwig and Christian Bauer + * SheepShaver (C) 1997-2008 Marc Hellwig and 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 @@ -27,17 +27,14 @@ #include #include "sysdeps.h" +#include "cpu_emulation.h" #include "ether.h" #include "ether_defs.h" #include "macos_util.h" -#include "cpu_emulation.h" -#include "emul_op.h" -#include "main.h" #define DEBUG 0 #include "debug.h" - // Packet types enum { kPktDIX = 0, @@ -58,7 +55,7 @@ static const int kGSshift = 6; static const int kGSmask = 0x1F; struct multicast_node { - multicast_node *next; + nw_multicast_node_p next; uint8 addr[kEnetPhysicalAddressLength]; }; @@ -86,7 +83,7 @@ struct DLPIStream { void AddMulticast(uint8 *addr) { - multicast_node *n = new multicast_node; + multicast_node *n = (multicast_node *)Mac2HostAddr(Mac_sysalloc(sizeof(multicast_node))); memcpy(n->addr, addr, kEnetPhysicalAddressLength); n->next = multicast_list; multicast_list = n; @@ -106,7 +103,7 @@ struct DLPIStream { while (q) { if (q->next == p) { q->next = p->next; - delete p; + Mac_sysfree(Host2MacAddr((uint8 *)p)); return; } q = q->next; @@ -124,15 +121,20 @@ struct DLPIStream { return NULL; } - uint32 minor_num; // Minor device number of this stream - uint32 dlpi_state; // DLPI state of this stream - uint32 flags; // Flags - uint16 dlsap; // SAP bound to this stream - bool framing_8022; // Using 802.2 framing? This is only used to report the MAC type for DL_INFO_ACK and can be set with an ioctl() call - queue_t *rdq; // Read queue for this stream - uint32 group_sap[kGroupSAPMapSize]; // Map of bound group SAPs - uint8 snap[k8022SNAPLength]; // SNAP bound to this stream - multicast_node *multicast_list; // List of enabled multicast addresses + nw_uint32 minor_num; // Minor device number of this stream + nw_uint32 dlpi_state; // DLPI state of this stream + nw_uint32 flags; // Flags + nw_uint16 dlsap; // SAP bound to this stream + nw_bool framing_8022; // Using 802.2 framing? This is only used to report the MAC type for DL_INFO_ACK and can be set with an ioctl() call + nw_queue_p rdq; // Read queue for this stream + nw_uint32 group_sap[kGroupSAPMapSize]; // Map of bound group SAPs + uint8 snap[k8022SNAPLength]; // SNAP bound to this stream + nw_multicast_node_p multicast_list; // List of enabled multicast addresses +}; + +// Hack to make DLPIStream list initialization early to NULL (do we really need this?) +struct DLPIStreamInit { + DLPIStreamInit(nw_DLPIStream_p *dlpi_stream_p) { *dlpi_stream_p = NULL; } }; // Stream flags @@ -144,7 +146,8 @@ enum { }; // List of opened streams (used internally by OpenTransport) -static DLPIStream *dlpi_stream_list = NULL; +static nw_DLPIStream_p dlpi_stream_list; +static DLPIStreamInit dlpi_stream_init(&dlpi_stream_list); // Are we open? bool ether_driver_opened = false; @@ -174,7 +177,7 @@ typedef mblk_t *(*allocb_ptr)(size_t siz static uint32 allocb_tvect = 0; mblk_t *allocb(size_t arg1, int arg2) { - return (mblk_t *)CallMacOS2(allocb_ptr, allocb_tvect, arg1, arg2); + return (mblk_t *)Mac2HostAddr((uint32)CallMacOS2(allocb_ptr, allocb_tvect, arg1, arg2)); } typedef void (*freeb_ptr)(mblk_t *); static uint32 freeb_tvect = 0; @@ -192,19 +195,19 @@ typedef mblk_t *(*copyb_ptr)(mblk_t *); static uint32 copyb_tvect = 0; static inline mblk_t *copyb(mblk_t *arg1) { - return (mblk_t *)CallMacOS1(copyb_ptr, copyb_tvect, arg1); + return (mblk_t *)Mac2HostAddr((uint32)CallMacOS1(copyb_ptr, copyb_tvect, arg1)); } typedef mblk_t *(*dupmsg_ptr)(mblk_t *); static uint32 dupmsg_tvect = 0; static inline mblk_t *dupmsg(mblk_t *arg1) { - return (mblk_t *)CallMacOS1(dupmsg_ptr, dupmsg_tvect, arg1); + return (mblk_t *)Mac2HostAddr((uint32)CallMacOS1(dupmsg_ptr, dupmsg_tvect, arg1)); } typedef mblk_t *(*getq_ptr)(queue_t *); static uint32 getq_tvect = 0; static inline mblk_t *getq(queue_t *arg1) { - return (mblk_t *)CallMacOS1(getq_ptr, getq_tvect, arg1); + return (mblk_t *)Mac2HostAddr((uint32)CallMacOS1(getq_ptr, getq_tvect, arg1)); } typedef int (*putq_ptr)(queue_t *, mblk_t *); static uint32 putq_tvect = 0; @@ -276,9 +279,12 @@ typedef DLPIStream *(*mi_next_ptr_ptr)(D static uint32 mi_next_ptr_tvect = 0; static inline DLPIStream *mi_next_ptr(DLPIStream *arg1) { - return (DLPIStream *)CallMacOS1(mi_next_ptr_ptr, mi_next_ptr_tvect, arg1); + return (DLPIStream *)Mac2HostAddr((uint32)CallMacOS1(mi_next_ptr_ptr, mi_next_ptr_tvect, arg1)); } - +#ifdef USE_ETHER_FULL_DRIVER +typedef void (*ether_dispatch_packet_ptr)(uint32 p, uint32 size); +static uint32 ether_dispatch_packet_tvect = 0; +#endif // Prototypes static void ether_ioctl(DLPIStream *the_stream, queue_t* q, mblk_t* mp); @@ -302,7 +308,7 @@ static void DLPI_unit_data(DLPIStream *t * Initialize ethernet stream module */ -uint8 InitStreamModule(void *theID) +static uint8 InitStreamModuleImpl(void *theID) { D(bug("InitStreamModule\n")); @@ -312,107 +318,146 @@ uint8 InitStreamModule(void *theID) ether_driver_opened = false; // Import functions from OTKernelLib - allocb_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\006allocb"); + allocb_tvect = FindLibSymbol("\013OTKernelLib", "\006allocb"); D(bug("allocb TVECT at %08lx\n", allocb_tvect)); if (allocb_tvect == 0) return false; - freeb_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\005freeb"); + freeb_tvect = FindLibSymbol("\013OTKernelLib", "\005freeb"); D(bug("freeb TVECT at %08lx\n", freeb_tvect)); if (freeb_tvect == 0) return false; - freemsg_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\007freemsg"); + freemsg_tvect = FindLibSymbol("\013OTKernelLib", "\007freemsg"); D(bug("freemsg TVECT at %08lx\n", freemsg_tvect)); if (freemsg_tvect == 0) return false; - copyb_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\005copyb"); + copyb_tvect = FindLibSymbol("\013OTKernelLib", "\005copyb"); D(bug("copyb TVECT at %08lx\n", copyb_tvect)); if (copyb_tvect == 0) return false; - dupmsg_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\006dupmsg"); + dupmsg_tvect = FindLibSymbol("\013OTKernelLib", "\006dupmsg"); D(bug("dupmsg TVECT at %08lx\n", dupmsg_tvect)); if (dupmsg_tvect == 0) return false; - getq_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\004getq"); + getq_tvect = FindLibSymbol("\013OTKernelLib", "\004getq"); D(bug("getq TVECT at %08lx\n", getq_tvect)); if (getq_tvect == 0) return false; - putq_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\004putq"); + putq_tvect = FindLibSymbol("\013OTKernelLib", "\004putq"); D(bug("putq TVECT at %08lx\n", putq_tvect)); if (putq_tvect == 0) return false; - putnext_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\007putnext"); + putnext_tvect = FindLibSymbol("\013OTKernelLib", "\007putnext"); D(bug("putnext TVECT at %08lx\n", putnext_tvect)); if (putnext_tvect == 0) return false; - putnextctl1_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\013putnextctl1"); + putnextctl1_tvect = FindLibSymbol("\013OTKernelLib", "\013putnextctl1"); D(bug("putnextctl1 TVECT at %08lx\n", putnextctl1_tvect)); if (putnextctl1_tvect == 0) return false; - canputnext_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\012canputnext"); + canputnext_tvect = FindLibSymbol("\013OTKernelLib", "\012canputnext"); D(bug("canputnext TVECT at %08lx\n", canputnext_tvect)); if (canputnext_tvect == 0) return false; - qreply_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\006qreply"); + qreply_tvect = FindLibSymbol("\013OTKernelLib", "\006qreply"); D(bug("qreply TVECT at %08lx\n", qreply_tvect)); if (qreply_tvect == 0) return false; - flushq_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\006flushq"); + flushq_tvect = FindLibSymbol("\013OTKernelLib", "\006flushq"); D(bug("flushq TVECT at %08lx\n", flushq_tvect)); if (flushq_tvect == 0) return false; - msgdsize_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\010msgdsize"); + msgdsize_tvect = FindLibSymbol("\013OTKernelLib", "\010msgdsize"); D(bug("msgdsize TVECT at %08lx\n", msgdsize_tvect)); if (msgdsize_tvect == 0) return false; - otenterint_tvect = (uint32)FindLibSymbol("\017OTKernelUtilLib", "\020OTEnterInterrupt"); + otenterint_tvect = FindLibSymbol("\017OTKernelUtilLib", "\020OTEnterInterrupt"); D(bug("OTEnterInterrupt TVECT at %08lx\n", otenterint_tvect)); if (otenterint_tvect == 0) return false; - otleaveint_tvect = (uint32)FindLibSymbol("\017OTKernelUtilLib", "\020OTLeaveInterrupt"); + otleaveint_tvect = FindLibSymbol("\017OTKernelUtilLib", "\020OTLeaveInterrupt"); D(bug("OTLeaveInterrupt TVECT at %08lx\n", otleaveint_tvect)); if (otleaveint_tvect == 0) return false; - mi_open_comm_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\014mi_open_comm"); + mi_open_comm_tvect = FindLibSymbol("\013OTKernelLib", "\014mi_open_comm"); D(bug("mi_open_comm TVECT at %08lx\n", mi_open_comm_tvect)); if (mi_open_comm_tvect == 0) return false; - mi_close_comm_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\015mi_close_comm"); + mi_close_comm_tvect = FindLibSymbol("\013OTKernelLib", "\015mi_close_comm"); D(bug("mi_close_comm TVECT at %08lx\n", mi_close_comm_tvect)); if (mi_close_comm_tvect == 0) return false; - mi_next_ptr_tvect = (uint32)FindLibSymbol("\013OTKernelLib", "\013mi_next_ptr"); + mi_next_ptr_tvect = FindLibSymbol("\013OTKernelLib", "\013mi_next_ptr"); D(bug("mi_next_ptr TVECT at %08lx\n", mi_next_ptr_tvect)); if (mi_next_ptr_tvect == 0) return false; +#ifndef USE_ETHER_FULL_DRIVER // Initialize stream list (which might be leftover) dlpi_stream_list = NULL; // Ask add-on for ethernet hardware address - AO_get_ethernet_address(hardware_address); + AO_get_ethernet_address(Host2MacAddr(hardware_address)); +#endif // Yes, we're open ether_driver_opened = true; return true; } +uint8 InitStreamModule(void *theID) +{ + // Common initialization code + bool net_open = InitStreamModuleImpl(theID); + + // Call InitStreamModule() in native side +#ifdef BUILD_ETHER_FULL_DRIVER + extern bool NativeInitStreamModule(void *); + if (!NativeInitStreamModule((void *)ether_dispatch_packet)) + net_open = false; +#endif + + // Import functions from the Ethernet driver +#ifdef USE_ETHER_FULL_DRIVER + ether_dispatch_packet_tvect = (uintptr)theID; + D(bug("ether_dispatch_packet TVECT at %08lx\n", ether_dispatch_packet_tvect)); + if (ether_dispatch_packet_tvect == 0) + net_open = false; +#endif + + return net_open; +} + /* * Terminate ethernet stream module */ -void TerminateStreamModule(void) +static void TerminateStreamModuleImpl(void) { D(bug("TerminateStreamModule\n")); +#ifndef USE_ETHER_FULL_DRIVER // This happens sometimes. I don't know why. if (dlpi_stream_list != NULL) printf("FATAL: TerminateStreamModule() called, but streams still open\n"); +#endif // Sorry, we're closed ether_driver_opened = false; } +void TerminateStreamModule(void) +{ + // Common termination code + TerminateStreamModuleImpl(); + + // Call TerminateStreamModule() in native side +#ifdef BUILD_ETHER_FULL_DRIVER + extern void NativeTerminateStreamModule(void); + NativeTerminateStreamModule(); +#endif +} + /* * Open new stream @@ -433,7 +478,7 @@ int ether_open(queue_t *rdq, void *dev, return 0; // Allocate DLPIStream structure - int err = mi_open_comm(&dlpi_stream_list, sizeof(DLPIStream), rdq, dev, flag, sflag, creds); + int err = mi_open_comm((DLPIStream **)&dlpi_stream_list, sizeof(DLPIStream), rdq, dev, flag, sflag, creds); if (err) return err; DLPIStream *the_stream = (DLPIStream *)rdq->q_ptr; @@ -470,13 +515,13 @@ int ether_close(queue_t *rdq, int flag, // Disable all registered multicast addresses while (the_stream->multicast_list) { - AO_disable_multicast(the_stream->multicast_list->addr); + AO_disable_multicast(Host2MacAddr(the_stream->multicast_list->addr)); the_stream->RemoveMulticast(the_stream->multicast_list->addr); } the_stream->multicast_list = NULL; // Delete the DLPIStream - return mi_close_comm(&dlpi_stream_list, rdq); + return mi_close_comm((DLPIStream **)&dlpi_stream_list, rdq); } @@ -499,7 +544,7 @@ int ether_wput(queue_t *q, mblk_t *mp) if (the_stream == NULL) return MAC_ENXIO; - D(bug(" db_type %d\n", mp->b_datap->db_type)); + D(bug(" db_type %d\n", (int)mp->b_datap->db_type)); switch (mp->b_datap->db_type) { case M_DATA: @@ -511,7 +556,7 @@ int ether_wput(queue_t *q, mblk_t *mp) case M_PROTO: case M_PCPROTO: { - union DL_primitives *dlp = (union DL_primitives *)mp->b_rptr; + union DL_primitives *dlp = (union DL_primitives *)(void *)mp->b_rptr; uint32 prim = dlp->dl_primitive; D(bug(" dl_primitive %d\n", prim)); switch (prim) { @@ -605,8 +650,8 @@ int ether_rsrv(queue_t *q) static void ether_ioctl(DLPIStream *the_stream, queue_t *q, mblk_t *mp) { - struct iocblk *ioc = (struct iocblk *)mp->b_rptr; - D(bug(" ether_ioctl(%p,%p) cmd %d\n", q, mp, ioc->ioc_cmd)); + struct iocblk *ioc = (struct iocblk *)(void *)mp->b_rptr; + D(bug(" ether_ioctl(%p,%p) cmd %d\n", q, mp, (int)ioc->ioc_cmd)); switch (ioc->ioc_cmd) { @@ -616,7 +661,7 @@ static void ether_ioctl(DLPIStream *the_ ioc->ioc_error = MAC_EINVAL; goto ioctl_error; } - uint32 framing_type = *(uint32 *)info_mp->b_rptr; + uint32 framing_type = ntohl(*(uint32 *)(void *)info_mp->b_rptr); D(bug(" I_OTSetFramingType type %d\n", framing_type)); if (framing_type != kOTGetFramingValue) the_stream->framing_8022 = (framing_type == kOTFraming8022); @@ -663,8 +708,8 @@ static void ether_ioctl(DLPIStream *the_ ioc->ioc_error = MAC_EINVAL; goto ioctl_error; } - dlrc = (dl_recv_control_t *)info_mp->b_rptr; - D(bug(" I_OTSetRawMode primitive %d\n", dlrc->dl_primitive)); + dlrc = (dl_recv_control_t *)(void *)info_mp->b_rptr; + D(bug(" I_OTSetRawMode primitive %d\n", (int)dlrc->dl_primitive)); ioc->ioc_error = MAC_EINVAL; goto ioctl_error; } @@ -797,7 +842,7 @@ static mblk_t *reuse_message_block(mblk_ static mblk_t *build_tx_packet_header(DLPIStream *the_stream, mblk_t *mp, bool fast_path) { // Only handle unit_data requests - dl_unitdata_req_t *req = (dl_unitdata_req_t *)mp->b_rptr; + dl_unitdata_req_t *req = (dl_unitdata_req_t *)(void *)mp->b_rptr; if (req->dl_primitive != DL_UNITDATA_REQ) { freemsg(mp); return NULL; @@ -815,10 +860,10 @@ static mblk_t *build_tx_packet_header(DL dlsap = the_stream->dlsap; break; case kEnetAndSAPAddressLength: - dlsap = *(uint16 *)(destAddrOrig + kEnetPhysicalAddressLength); + dlsap = ntohs(*(uint16 *)(destAddrOrig + kEnetPhysicalAddressLength)); break; case kEnetPhysicalAddressLength + k8022DLSAPLength + k8022SNAPLength: // SNAP SAP - dlsap = *(uint16 *)(destAddrOrig + kEnetPhysicalAddressLength); + dlsap = ntohs(*(uint16 *)(destAddrOrig + kEnetPhysicalAddressLength)); break; default: dlsap = the_stream->dlsap; @@ -870,7 +915,7 @@ static mblk_t *build_tx_packet_header(DL // Resize header info in message block if ((mp = reuse_message_block(mp, hdrsize)) == NULL) return NULL; - struct T8022FullPacketHeader *packetHeader = (struct T8022FullPacketHeader *)mp->b_rptr; + struct T8022FullPacketHeader *packetHeader = (struct T8022FullPacketHeader *)(void *)mp->b_rptr; // Set protocol type/size field packetHeader->fEnetPart.fProto = proto; @@ -910,7 +955,7 @@ static mblk_t *build_tx_packet_header(DL static void transmit_packet(mblk_t *mp) { - EnetPacketHeader *enetHeader = (EnetPacketHeader *)mp->b_rptr; + EnetPacketHeader *enetHeader = (EnetPacketHeader *)(void *)mp->b_rptr; // Fill in length in 802.3 packets if (enetHeader->fProto == 0) @@ -920,7 +965,7 @@ static void transmit_packet(mblk_t *mp) OTCopy48BitAddress(hardware_address, enetHeader->fSourceAddr); // Tell add-on to transmit packet - AO_transmit_packet(mp); + AO_transmit_packet(Host2MacAddr((uint8 *)mp)); freemsg(mp); } @@ -967,7 +1012,7 @@ static void handle_received_packet(DLPIS // Set message type nmp->b_datap->db_type = M_PROTO; - dl_unitdata_ind_t *ind = (dl_unitdata_ind_t*)nmp->b_rptr; + dl_unitdata_ind_t *ind = (dl_unitdata_ind_t*)(void *)nmp->b_rptr; ind->dl_primitive = DL_UNITDATA_IND; nmp->b_wptr += (sizeof(dl_unitdata_ind_t) + 2*addr_len); @@ -984,7 +1029,7 @@ static void handle_received_packet(DLPIS ind->dl_group_address = dest_addr_type; // Set address fields - T8022FullPacketHeader *packetHeader = (T8022FullPacketHeader *)mp->b_rptr; + T8022FullPacketHeader *packetHeader = (T8022FullPacketHeader *)(void *)mp->b_rptr; T8022AddressStruct *destAddr = ((T8022AddressStruct*)(nmp->b_rptr + ind->dl_dest_addr_offset)); T8022AddressStruct *srcAddr = ((T8022AddressStruct*)(nmp->b_rptr + ind->dl_src_addr_offset)); @@ -1016,7 +1061,7 @@ static void handle_received_packet(DLPIS void ether_packet_received(mblk_t *mp) { // Extract address and types - EnetPacketHeader *pkt = (EnetPacketHeader *)mp->b_rptr; + EnetPacketHeader *pkt = (EnetPacketHeader *)(void *)mp->b_rptr; T8022FullPacketHeader *fullpkt = (T8022FullPacketHeader *)pkt; uint16 sourceSAP, destSAP; destSAP = fullpkt->fEnetPart.fProto; @@ -1092,6 +1137,29 @@ type_found: } } +void ether_dispatch_packet(uint32 p, uint32 size) +{ +#ifdef USE_ETHER_FULL_DRIVER + // Call handler from the Ethernet driver + D(bug("ether_dispatch_packet\n")); + D(bug(" packet data at %p, %d bytes\n", p, size)); + CallMacOS2(ether_dispatch_packet_ptr, ether_dispatch_packet_tvect, p, size); +#else + // Wrap packet in message block + num_rx_packets++; + mblk_t *mp; + if ((mp = allocb(size, 0)) != NULL) { + D(bug(" packet data at %p\n", (void *)mp->b_rptr)); + Mac2Host_memcpy(mp->b_rptr, p, size); + mp->b_wptr += size; + ether_packet_received(mp); + } else { + D(bug("WARNING: Cannot allocate mblk for received packet\n")); + num_rx_no_mem++; + } +#endif +} + /* * Build and send an error acknowledge @@ -1108,7 +1176,7 @@ static void DLPI_error_ack(DLPIStream *t return; ack_mp->b_datap->db_type = M_PCPROTO; - dl_error_ack_t *errp = (dl_error_ack_t *)ack_mp->b_wptr; + dl_error_ack_t *errp = (dl_error_ack_t *)(void *)ack_mp->b_wptr; errp->dl_primitive = DL_ERROR_ACK; errp->dl_error_primitive = prim; errp->dl_errno = err; @@ -1138,7 +1206,7 @@ static void DLPI_ok_ack(DLPIStream *the_ } ack_mp->b_datap->db_type = M_PCPROTO; - dl_ok_ack_t *ackp = (dl_ok_ack_t *)ack_mp->b_rptr; + dl_ok_ack_t *ackp = (dl_ok_ack_t *)(void *)ack_mp->b_rptr; ackp->dl_primitive = DL_OK_ACK; ackp->dl_correct_primitive = prim; ack_mp->b_wptr = ack_mp->b_rptr + sizeof(dl_ok_ack_t); @@ -1178,7 +1246,7 @@ static void DLPI_info(DLPIStream *the_st // Set up message type ack_mp->b_datap->db_type = M_PCPROTO; - dl_info_ack_t *ackp = (dl_info_ack_t *)ack_mp->b_rptr; + dl_info_ack_t *ackp = (dl_info_ack_t *)(void *)ack_mp->b_rptr; ackp->dl_primitive = DL_INFO_ACK; // Info/version fields @@ -1230,7 +1298,7 @@ static void DLPI_info(DLPIStream *the_st static void DLPI_phys_addr(DLPIStream *the_stream, queue_t *q, mblk_t *mp) { D(bug(" DLPI_phys_addr(%p,%p)\n", the_stream, mp)); - dl_phys_addr_req_t *req = (dl_phys_addr_req_t *)mp->b_rptr; + dl_phys_addr_req_t *req = (dl_phys_addr_req_t *)(void *)mp->b_rptr; // Allocate message block for reply mblk_t *ack_mp; @@ -1241,7 +1309,7 @@ static void DLPI_phys_addr(DLPIStream *t // Set up message type ack_mp->b_datap->db_type = M_PCPROTO; - dl_phys_addr_ack_t *ackp = (dl_phys_addr_ack_t *)ack_mp->b_wptr; + dl_phys_addr_ack_t *ackp = (dl_phys_addr_ack_t *)(void *)ack_mp->b_wptr; ackp->dl_primitive = DL_PHYS_ADDR_ACK; // Fill in address @@ -1270,7 +1338,7 @@ static void DLPI_phys_addr(DLPIStream *t static void DLPI_bind(DLPIStream *the_stream, queue_t *q, mblk_t *mp) { - dl_bind_req_t *req = (dl_bind_req_t *)mp->b_rptr; + dl_bind_req_t *req = (dl_bind_req_t *)(void *)mp->b_rptr; uint32 sap = req->dl_sap; D(bug(" DLPI_bind(%p,%p) SAP %04x\n", the_stream, mp, sap)); @@ -1307,7 +1375,7 @@ static void DLPI_bind(DLPIStream *the_st // Set up message type ack_mp->b_datap->db_type = M_PCPROTO; - dl_bind_ack_t *ackp = (dl_bind_ack_t *)ack_mp->b_rptr; + dl_bind_ack_t *ackp = (dl_bind_ack_t *)(void *)ack_mp->b_rptr; ackp->dl_primitive = DL_BIND_ACK; // Fill in other fields @@ -1380,10 +1448,10 @@ static void DLPI_unbind(DLPIStream *the_ static void DLPI_subs_bind(DLPIStream *the_stream, queue_t *q, mblk_t *mp) { - dl_subs_bind_req_t *req = (dl_subs_bind_req_t *)mp->b_rptr; + dl_subs_bind_req_t *req = (dl_subs_bind_req_t *)(void *)mp->b_rptr; uint8 *sap = ((uint8 *)req) + req->dl_subs_sap_offset; int32 length = req->dl_subs_sap_length; - uint16 theSap = *((uint16 *)sap); + uint16 theSap = ntohs(*((uint16 *)sap)); int32 error = 0; D(bug(" DLPI_subs_bind(%p,%p) SAP %02x%02x%02x%02x%02x\n", the_stream, mp, sap[0], sap[1], sap[2], sap[3], sap[4])); @@ -1438,7 +1506,7 @@ static void DLPI_subs_bind(DLPIStream *t // Set up message type ack_mp->b_datap->db_type = M_PCPROTO; - dl_subs_bind_ack_t *ackp = (dl_subs_bind_ack_t *)ack_mp->b_wptr; + dl_subs_bind_ack_t *ackp = (dl_subs_bind_ack_t *)(void *)ack_mp->b_wptr; memset(ackp, 0, sizeof(dl_subs_bind_ack_t) + length); ackp->dl_primitive = DL_SUBS_BIND_ACK; @@ -1465,7 +1533,7 @@ static void DLPI_subs_bind(DLPIStream *t static void DLPI_subs_unbind(DLPIStream *the_stream, queue_t *q, mblk_t *mp) { - dl_subs_unbind_req_t *req = (dl_subs_unbind_req_t *)mp->b_rptr; + dl_subs_unbind_req_t *req = (dl_subs_unbind_req_t *)(void *)mp->b_rptr; uint8 *sap = ((uint8 *)req) + req->dl_subs_sap_offset; int32 length = req->dl_subs_sap_length; int32 error = 0; @@ -1516,7 +1584,7 @@ static void DLPI_subs_unbind(DLPIStream static void DLPI_enable_multi(DLPIStream *the_stream, queue_t *q, mblk_t *mp) { - dl_enabmulti_req_t* req = (dl_enabmulti_req_t*)mp->b_rptr; + dl_enabmulti_req_t* req = (dl_enabmulti_req_t*)(void *)mp->b_rptr; uint8 *reqaddr = (uint8 *)(mp->b_rptr + req->dl_addr_offset); D(bug(" DLPI_enable_multi(%p,%p) addr %02x%02x%02x%02x%02x%02x\n", the_stream, mp, reqaddr[0], reqaddr[1], reqaddr[2], reqaddr[3], reqaddr[4], reqaddr[5])); @@ -1533,10 +1601,10 @@ static void DLPI_enable_multi(DLPIStream } // Tell add-on to enable multicast address - AO_enable_multicast(reqaddr); + AO_enable_multicast(Host2MacAddr((uint8 *)reqaddr)); // Add new address to multicast list - uint8 *addr = new uint8[kEnetPhysicalAddressLength]; + uint8 *addr = Mac2HostAddr(Mac_sysalloc(kEnetPhysicalAddressLength)); OTCopy48BitAddress(reqaddr, addr); the_stream->AddMulticast(addr); @@ -1555,7 +1623,7 @@ static void DLPI_enable_multi(DLPIStream static void DLPI_disable_multi(DLPIStream *the_stream, queue_t *q, mblk_t *mp) { - dl_disabmulti_req_t *req = (dl_disabmulti_req_t*)mp->b_rptr; + dl_disabmulti_req_t *req = (dl_disabmulti_req_t*)(void *)mp->b_rptr; uint8 *reqaddr = (uint8 *)(mp->b_rptr + req->dl_addr_offset); D(bug(" DLPI_disable_multi(%p,%p) addr %02x%02x%02x%02x%02x%02x\n", the_stream, mp, reqaddr[0], reqaddr[1], reqaddr[2], reqaddr[3], reqaddr[4], reqaddr[5])); @@ -1574,10 +1642,10 @@ static void DLPI_disable_multi(DLPIStrea // Found, then remove the_stream->RemoveMulticast(addr); - delete addr; + Mac_sysfree(Host2MacAddr(addr)); // Tell add-on to disable multicast address - AO_disable_multicast(reqaddr); + AO_disable_multicast(Host2MacAddr((uint8 *)reqaddr)); // No longer check multicast packets if no multicast addresses are registered if (the_stream->multicast_list == NULL) @@ -1596,7 +1664,7 @@ static void DLPI_disable_multi(DLPIStrea static void DLPI_unit_data(DLPIStream *the_stream, queue_t *q, mblk_t *mp) { D(bug(" DLPI_unit_data(%p,%p)\n", the_stream, mp)); - dl_unitdata_req_t *req = (dl_unitdata_req_t *)mp->b_rptr; + dl_unitdata_req_t *req = (dl_unitdata_req_t *)(void *)mp->b_rptr; // Stream must be idle if (the_stream->dlpi_state != DL_IDLE) { @@ -1611,7 +1679,7 @@ static void DLPI_unit_data(DLPIStream *t return; } bp->b_datap->db_type = M_PROTO; - errp = (dl_uderror_ind_t *)bp->b_wptr; + errp = (dl_uderror_ind_t *)(void *)bp->b_wptr; errp->dl_primitive = DL_UDERROR_IND; errp->dl_errno = DL_OUTSTATE; errp->dl_unix_errno = 0; @@ -1630,3 +1698,37 @@ static void DLPI_unit_data(DLPIStream *t if ((mp = build_tx_packet_header(the_stream, mp, false)) != NULL) transmit_packet(mp); } + + +/* + * Ethernet packet allocator + */ + +#if SIZEOF_VOID_P != 4 || REAL_ADDRESSING == 0 +static uint32 ether_packet = 0; // Ethernet packet (cached allocation) +static uint32 n_ether_packets = 0; // Number of ethernet packets allocated so far (should be at most 1) + +EthernetPacket::EthernetPacket() +{ + ++n_ether_packets; + if (ether_packet && n_ether_packets == 1) + packet = ether_packet; + else { + packet = Mac_sysalloc(1516); + assert(packet != 0); + Mac_memset(packet, 0, 1516); + if (ether_packet == 0) + ether_packet = packet; + } +} + +EthernetPacket::~EthernetPacket() +{ + --n_ether_packets; + if (packet != ether_packet) + Mac_sysfree(packet); + if (n_ether_packets > 0) { + bug("WARNING: Nested allocation of ethernet packets!\n"); + } +} +#endif