ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/SheepShaver/src/ether.cpp
(Generate patch)

Comparing SheepShaver/src/ether.cpp (file contents):
Revision 1.2 by cebix, 2004-01-12T15:37:18Z vs.
Revision 1.3 by gbeauche, 2004-05-10T12:05:43Z

# Line 58 | Line 58 | static const int kGSshift = 6;
58   static const int kGSmask = 0x1F;
59  
60   struct multicast_node {
61 <        multicast_node *next;
61 >        nw_multicast_node_p next;
62          uint8 addr[kEnetPhysicalAddressLength];
63   };
64  
# Line 124 | Line 124 | struct DLPIStream {
124                  return NULL;
125          }
126  
127 <        uint32 minor_num;                                       // Minor device number of this stream
128 <        uint32 dlpi_state;                                      // DLPI state of this stream
129 <        uint32 flags;                                           // Flags
130 <        uint16 dlsap;                                           // SAP bound to this stream
131 <        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
132 <        queue_t *rdq;                                           // Read queue for this stream
133 <        uint32 group_sap[kGroupSAPMapSize];     // Map of bound group SAPs
134 <        uint8 snap[k8022SNAPLength];            // SNAP bound to this stream
135 <        multicast_node *multicast_list;         // List of enabled multicast addresses
127 >        nw_uint32 minor_num;                                    // Minor device number of this stream
128 >        nw_uint32 dlpi_state;                                   // DLPI state of this stream
129 >        nw_uint32 flags;                                                // Flags
130 >        nw_uint16 dlsap;                                                // SAP bound to this stream
131 >        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
132 >        nw_queue_p rdq;                                                 // Read queue for this stream
133 >        nw_uint32 group_sap[kGroupSAPMapSize];  // Map of bound group SAPs
134 >        uint8 snap[k8022SNAPLength];                    // SNAP bound to this stream
135 >        nw_multicast_node_p multicast_list;             // List of enabled multicast addresses
136 > };
137 >
138 > // Hack to make DLPIStream list initialization early to NULL (do we really need this?)
139 > struct DLPIStreamInit {
140 >        DLPIStreamInit(nw_DLPIStream_p *dlpi_stream_p) { *dlpi_stream_p = NULL; }
141   };
142  
143   // Stream flags
# Line 144 | Line 149 | enum {
149   };
150  
151   // List of opened streams (used internally by OpenTransport)
152 < static DLPIStream *dlpi_stream_list = NULL;
152 > static nw_DLPIStream_p dlpi_stream_list;
153 > static DLPIStreamInit dlpi_stream_init(&dlpi_stream_list);
154  
155   // Are we open?
156   bool ether_driver_opened = false;
# Line 433 | Line 439 | int ether_open(queue_t *rdq, void *dev,
439                  return 0;
440  
441          // Allocate DLPIStream structure
442 <        int err = mi_open_comm(&dlpi_stream_list, sizeof(DLPIStream), rdq, dev, flag, sflag, creds);
442 >        int err = mi_open_comm((DLPIStream **)&dlpi_stream_list, sizeof(DLPIStream), rdq, dev, flag, sflag, creds);
443          if (err)
444                  return err;
445          DLPIStream *the_stream = (DLPIStream *)rdq->q_ptr;
# Line 476 | Line 482 | int ether_close(queue_t *rdq, int flag,
482          the_stream->multicast_list = NULL;
483  
484          // Delete the DLPIStream
485 <        return mi_close_comm(&dlpi_stream_list, rdq);
485 >        return mi_close_comm((DLPIStream **)&dlpi_stream_list, rdq);
486   }
487  
488  
# Line 499 | Line 505 | int ether_wput(queue_t *q, mblk_t *mp)
505          if (the_stream == NULL)
506                  return MAC_ENXIO;
507  
508 <        D(bug(" db_type %d\n", mp->b_datap->db_type));
508 >        D(bug(" db_type %d\n", (int)mp->b_datap->db_type));
509          switch (mp->b_datap->db_type) {
510  
511                  case M_DATA:
# Line 511 | Line 517 | int ether_wput(queue_t *q, mblk_t *mp)
517  
518                  case M_PROTO:
519                  case M_PCPROTO: {
520 <                        union DL_primitives *dlp = (union DL_primitives *)mp->b_rptr;
520 >                        union DL_primitives *dlp = (union DL_primitives *)(void *)mp->b_rptr;
521                          uint32 prim = dlp->dl_primitive;
522                          D(bug(" dl_primitive %d\n", prim));
523                          switch (prim) {
# Line 605 | Line 611 | int ether_rsrv(queue_t *q)
611  
612   static void ether_ioctl(DLPIStream *the_stream, queue_t *q, mblk_t *mp)
613   {
614 <        struct iocblk *ioc = (struct iocblk *)mp->b_rptr;
615 <        D(bug(" ether_ioctl(%p,%p) cmd %d\n", q, mp, ioc->ioc_cmd));
614 >        struct iocblk *ioc = (struct iocblk *)(void *)mp->b_rptr;
615 >        D(bug(" ether_ioctl(%p,%p) cmd %d\n", q, mp, (int)ioc->ioc_cmd));
616  
617          switch (ioc->ioc_cmd) {
618  
# Line 616 | Line 622 | static void ether_ioctl(DLPIStream *the_
622                                  ioc->ioc_error = MAC_EINVAL;
623                                  goto ioctl_error;
624                          }
625 <                        uint32 framing_type = *(uint32 *)info_mp->b_rptr;
625 >                        uint32 framing_type = ntohl(*(uint32 *)(void *)info_mp->b_rptr);
626                          D(bug("  I_OTSetFramingType type %d\n", framing_type));
627                          if (framing_type != kOTGetFramingValue)
628                                  the_stream->framing_8022 = (framing_type == kOTFraming8022);
# Line 663 | Line 669 | static void ether_ioctl(DLPIStream *the_
669                                  ioc->ioc_error = MAC_EINVAL;
670                                  goto ioctl_error;
671                          }
672 <                        dlrc = (dl_recv_control_t *)info_mp->b_rptr;
673 <                        D(bug("  I_OTSetRawMode primitive %d\n", dlrc->dl_primitive));
672 >                        dlrc = (dl_recv_control_t *)(void *)info_mp->b_rptr;
673 >                        D(bug("  I_OTSetRawMode primitive %d\n", (int)dlrc->dl_primitive));
674                          ioc->ioc_error = MAC_EINVAL;
675                          goto ioctl_error;
676                  }
# Line 797 | Line 803 | static mblk_t *reuse_message_block(mblk_
803   static mblk_t *build_tx_packet_header(DLPIStream *the_stream, mblk_t *mp, bool fast_path)
804   {
805          // Only handle unit_data requests
806 <        dl_unitdata_req_t *req = (dl_unitdata_req_t *)mp->b_rptr;
806 >        dl_unitdata_req_t *req = (dl_unitdata_req_t *)(void *)mp->b_rptr;
807          if (req->dl_primitive != DL_UNITDATA_REQ) {
808                  freemsg(mp);
809                  return NULL;
# Line 815 | Line 821 | static mblk_t *build_tx_packet_header(DL
821                          dlsap = the_stream->dlsap;
822                          break;
823                  case kEnetAndSAPAddressLength:  
824 <                        dlsap = *(uint16 *)(destAddrOrig + kEnetPhysicalAddressLength);
824 >                        dlsap = ntohs(*(uint16 *)(destAddrOrig + kEnetPhysicalAddressLength));
825                          break;
826                  case kEnetPhysicalAddressLength + k8022DLSAPLength + k8022SNAPLength:   // SNAP SAP
827 <                        dlsap = *(uint16 *)(destAddrOrig + kEnetPhysicalAddressLength);
827 >                        dlsap = ntohs(*(uint16 *)(destAddrOrig + kEnetPhysicalAddressLength));
828                          break;
829                  default:
830                          dlsap = the_stream->dlsap;
# Line 870 | Line 876 | static mblk_t *build_tx_packet_header(DL
876          // Resize header info in message block
877          if ((mp = reuse_message_block(mp, hdrsize)) == NULL)
878                  return NULL;
879 <        struct T8022FullPacketHeader *packetHeader = (struct T8022FullPacketHeader *)mp->b_rptr;
879 >        struct T8022FullPacketHeader *packetHeader = (struct T8022FullPacketHeader *)(void *)mp->b_rptr;
880  
881          // Set protocol type/size field
882          packetHeader->fEnetPart.fProto = proto;
# Line 910 | Line 916 | static mblk_t *build_tx_packet_header(DL
916  
917   static void transmit_packet(mblk_t *mp)
918   {
919 <        EnetPacketHeader *enetHeader = (EnetPacketHeader *)mp->b_rptr;
919 >        EnetPacketHeader *enetHeader = (EnetPacketHeader *)(void *)mp->b_rptr;
920  
921          // Fill in length in 802.3 packets
922          if (enetHeader->fProto == 0)
# Line 967 | Line 973 | static void handle_received_packet(DLPIS
973  
974          // Set message type
975          nmp->b_datap->db_type = M_PROTO;
976 <        dl_unitdata_ind_t *ind = (dl_unitdata_ind_t*)nmp->b_rptr;
976 >        dl_unitdata_ind_t *ind = (dl_unitdata_ind_t*)(void *)nmp->b_rptr;
977          ind->dl_primitive = DL_UNITDATA_IND;
978          nmp->b_wptr += (sizeof(dl_unitdata_ind_t) + 2*addr_len);
979  
# Line 984 | Line 990 | static void handle_received_packet(DLPIS
990          ind->dl_group_address = dest_addr_type;
991  
992          // Set address fields
993 <        T8022FullPacketHeader *packetHeader = (T8022FullPacketHeader *)mp->b_rptr;
993 >        T8022FullPacketHeader *packetHeader = (T8022FullPacketHeader *)(void *)mp->b_rptr;
994          T8022AddressStruct *destAddr = ((T8022AddressStruct*)(nmp->b_rptr + ind->dl_dest_addr_offset));
995          T8022AddressStruct *srcAddr = ((T8022AddressStruct*)(nmp->b_rptr + ind->dl_src_addr_offset));
996  
# Line 1016 | Line 1022 | static void handle_received_packet(DLPIS
1022   void ether_packet_received(mblk_t *mp)
1023   {
1024          // Extract address and types
1025 <        EnetPacketHeader *pkt = (EnetPacketHeader *)mp->b_rptr;
1025 >        EnetPacketHeader *pkt = (EnetPacketHeader *)(void *)mp->b_rptr;
1026          T8022FullPacketHeader *fullpkt = (T8022FullPacketHeader *)pkt;
1027          uint16 sourceSAP, destSAP;
1028          destSAP = fullpkt->fEnetPart.fProto;
# Line 1108 | Line 1114 | static void DLPI_error_ack(DLPIStream *t
1114                  return;
1115  
1116          ack_mp->b_datap->db_type = M_PCPROTO;
1117 <        dl_error_ack_t *errp = (dl_error_ack_t *)ack_mp->b_wptr;
1117 >        dl_error_ack_t *errp = (dl_error_ack_t *)(void *)ack_mp->b_wptr;
1118          errp->dl_primitive = DL_ERROR_ACK;
1119          errp->dl_error_primitive = prim;
1120          errp->dl_errno = err;
# Line 1138 | Line 1144 | static void DLPI_ok_ack(DLPIStream *the_
1144          }
1145  
1146          ack_mp->b_datap->db_type = M_PCPROTO;
1147 <        dl_ok_ack_t *ackp = (dl_ok_ack_t *)ack_mp->b_rptr;
1147 >        dl_ok_ack_t *ackp = (dl_ok_ack_t *)(void *)ack_mp->b_rptr;
1148          ackp->dl_primitive = DL_OK_ACK;
1149          ackp->dl_correct_primitive = prim;
1150          ack_mp->b_wptr = ack_mp->b_rptr + sizeof(dl_ok_ack_t);
# Line 1178 | Line 1184 | static void DLPI_info(DLPIStream *the_st
1184  
1185          // Set up message type
1186          ack_mp->b_datap->db_type = M_PCPROTO;
1187 <        dl_info_ack_t *ackp = (dl_info_ack_t *)ack_mp->b_rptr;
1187 >        dl_info_ack_t *ackp = (dl_info_ack_t *)(void *)ack_mp->b_rptr;
1188          ackp->dl_primitive = DL_INFO_ACK;
1189  
1190          // Info/version fields
# Line 1230 | Line 1236 | static void DLPI_info(DLPIStream *the_st
1236   static void DLPI_phys_addr(DLPIStream *the_stream, queue_t *q, mblk_t *mp)
1237   {
1238          D(bug("  DLPI_phys_addr(%p,%p)\n", the_stream, mp));
1239 <        dl_phys_addr_req_t *req = (dl_phys_addr_req_t *)mp->b_rptr;
1239 >        dl_phys_addr_req_t *req = (dl_phys_addr_req_t *)(void *)mp->b_rptr;
1240  
1241          // Allocate message block for reply
1242          mblk_t *ack_mp;
# Line 1241 | Line 1247 | static void DLPI_phys_addr(DLPIStream *t
1247  
1248          // Set up message type
1249          ack_mp->b_datap->db_type = M_PCPROTO;
1250 <        dl_phys_addr_ack_t *ackp = (dl_phys_addr_ack_t *)ack_mp->b_wptr;
1250 >        dl_phys_addr_ack_t *ackp = (dl_phys_addr_ack_t *)(void *)ack_mp->b_wptr;
1251          ackp->dl_primitive = DL_PHYS_ADDR_ACK;
1252  
1253          // Fill in address
# Line 1270 | Line 1276 | static void DLPI_phys_addr(DLPIStream *t
1276  
1277   static void DLPI_bind(DLPIStream *the_stream, queue_t *q, mblk_t *mp)
1278   {
1279 <        dl_bind_req_t *req = (dl_bind_req_t *)mp->b_rptr;
1279 >        dl_bind_req_t *req = (dl_bind_req_t *)(void *)mp->b_rptr;
1280          uint32 sap = req->dl_sap;
1281          D(bug("  DLPI_bind(%p,%p) SAP %04x\n", the_stream, mp, sap));
1282  
# Line 1307 | Line 1313 | static void DLPI_bind(DLPIStream *the_st
1313  
1314          // Set up message type
1315          ack_mp->b_datap->db_type = M_PCPROTO;
1316 <        dl_bind_ack_t *ackp = (dl_bind_ack_t *)ack_mp->b_rptr;
1316 >        dl_bind_ack_t *ackp = (dl_bind_ack_t *)(void *)ack_mp->b_rptr;
1317          ackp->dl_primitive = DL_BIND_ACK;
1318  
1319          // Fill in other fields
# Line 1380 | Line 1386 | static void DLPI_unbind(DLPIStream *the_
1386  
1387   static void DLPI_subs_bind(DLPIStream *the_stream, queue_t *q, mblk_t *mp)
1388   {
1389 <        dl_subs_bind_req_t *req = (dl_subs_bind_req_t *)mp->b_rptr;
1389 >        dl_subs_bind_req_t *req = (dl_subs_bind_req_t *)(void *)mp->b_rptr;
1390          uint8 *sap = ((uint8 *)req) + req->dl_subs_sap_offset;
1391          int32 length = req->dl_subs_sap_length;
1392 <        uint16 theSap = *((uint16 *)sap);
1392 >        uint16 theSap = ntohs(*((uint16 *)sap));
1393          int32 error = 0;
1394          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]));
1395  
# Line 1438 | Line 1444 | static void DLPI_subs_bind(DLPIStream *t
1444  
1445          // Set up message type
1446          ack_mp->b_datap->db_type = M_PCPROTO;
1447 <        dl_subs_bind_ack_t *ackp = (dl_subs_bind_ack_t *)ack_mp->b_wptr;
1447 >        dl_subs_bind_ack_t *ackp = (dl_subs_bind_ack_t *)(void *)ack_mp->b_wptr;
1448          memset(ackp, 0, sizeof(dl_subs_bind_ack_t) + length);
1449          ackp->dl_primitive = DL_SUBS_BIND_ACK;
1450  
# Line 1465 | Line 1471 | static void DLPI_subs_bind(DLPIStream *t
1471  
1472   static void DLPI_subs_unbind(DLPIStream *the_stream, queue_t *q, mblk_t *mp)
1473   {
1474 <        dl_subs_unbind_req_t *req = (dl_subs_unbind_req_t *)mp->b_rptr;
1474 >        dl_subs_unbind_req_t *req = (dl_subs_unbind_req_t *)(void *)mp->b_rptr;
1475          uint8 *sap = ((uint8 *)req) + req->dl_subs_sap_offset;
1476          int32 length = req->dl_subs_sap_length;
1477          int32 error = 0;
# Line 1516 | Line 1522 | static void DLPI_subs_unbind(DLPIStream
1522  
1523   static void DLPI_enable_multi(DLPIStream *the_stream, queue_t *q, mblk_t *mp)
1524   {
1525 <        dl_enabmulti_req_t*     req = (dl_enabmulti_req_t*)mp->b_rptr;
1525 >        dl_enabmulti_req_t*     req = (dl_enabmulti_req_t*)(void *)mp->b_rptr;
1526          uint8 *reqaddr = (uint8 *)(mp->b_rptr + req->dl_addr_offset);
1527          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]));
1528  
# Line 1555 | Line 1561 | static void DLPI_enable_multi(DLPIStream
1561  
1562   static void DLPI_disable_multi(DLPIStream *the_stream, queue_t *q, mblk_t *mp)
1563   {
1564 <        dl_disabmulti_req_t *req = (dl_disabmulti_req_t*)mp->b_rptr;
1564 >        dl_disabmulti_req_t *req = (dl_disabmulti_req_t*)(void *)mp->b_rptr;
1565          uint8 *reqaddr = (uint8 *)(mp->b_rptr + req->dl_addr_offset);
1566          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]));
1567  
# Line 1596 | Line 1602 | static void DLPI_disable_multi(DLPIStrea
1602   static void DLPI_unit_data(DLPIStream *the_stream, queue_t *q, mblk_t *mp)
1603   {
1604          D(bug("  DLPI_unit_data(%p,%p)\n", the_stream, mp));
1605 <        dl_unitdata_req_t *req = (dl_unitdata_req_t *)mp->b_rptr;
1605 >        dl_unitdata_req_t *req = (dl_unitdata_req_t *)(void *)mp->b_rptr;
1606  
1607          // Stream must be idle
1608          if (the_stream->dlpi_state != DL_IDLE) {
# Line 1611 | Line 1617 | static void DLPI_unit_data(DLPIStream *t
1617                          return;
1618                  }
1619                  bp->b_datap->db_type = M_PROTO;
1620 <                errp = (dl_uderror_ind_t *)bp->b_wptr;
1620 >                errp = (dl_uderror_ind_t *)(void *)bp->b_wptr;
1621                  errp->dl_primitive = DL_UDERROR_IND;
1622                  errp->dl_errno = DL_OUTSTATE;
1623                  errp->dl_unix_errno = 0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines