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 |
|
|
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 |
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; |
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; |
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 |
|
|
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: |
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) { |
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 |
|
|
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); |
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 |
|
} |
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; |
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; |
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; |
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) |
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 |
|
|
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 |
|
|
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; |
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; |
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); |
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 |
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; |
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 |
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 |
|
|
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 |
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 |
|
|
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 |
|
|
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; |
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 |
|
|
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 |
|
|
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) { |
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; |