odi(7)


odi -- ODI (Open DataLink Interface)

Synopsis

#include <sys/lsl.h> 
#include <sys/cmsm.h> 
#include <sys/msmstruc.h> 
#include <sys/tsmdef.h> 
#include <sys/ethdef.h> 
#include <sys/tokdef.h> 
#include <sys/odi.h> 
#include <sys/odi_nsi.h> 
#include <sys/odi_portable.h> 
fd = open ("/dev/$HSM_0", O_RDWR) 

Description

The vendor-supplied NetWare Open DataLink Interface (ODI)-compliant Network Interface Card (NIC) drivers are inputs to the process of ``transmogrification'', which produces Data Link Provider Interface (DLPI) compliant drivers which are functionally equivalent to the original ODI drivers. (The ODI drivers must comply with Revision 3.1 or Revision 3.2 of the NetWare Open DataLink Interface specification.) The resulting DLPI drivers are STREAMS-based and support the Logical Link Control (LLC) protocol.


NOTE: ODI is an obsolete interface. Although most existing transmogrified ODI drivers that work in earlier releases will continue to work in this release, new driver development is not supported for this interface, and kernel support for transmogrified ODI driver binaries will be withdrawn in the near future.

We recommend that you use MAC Driver Interface (MDI) drivers instead. ODI drivers previously supplied with SCO systems have been replaced with MDI drivers. Consult your network adapter vendor concerning availability of MDI drivers for your device. See also the SCO Compatible Hardware Web Pages for complete information about network hardware support on SCO platforms.


The components of the ODI support architecture are described in the following paragraphs.

DLPI/LSL
The DLPI/LSL Dynamic Loadable Module (DLM) is supplied with UnixWare. Conceptually, the DLPI/LSL is a merger of the earlier UnixWare Data Link Provider Interface (DLPI) STREAMS module with the NetWare Link Support Layer (LSL) NetWare Loadable Module. The DLPI/LSL provides the services mandated by the DLPI2 interface specification to STREAMS modules, such as IPX and IP higher up in network protocol stacks. Therefore, no changes in the protocol stacks are required to work with the UnixWare ODI subsystem. For ODI compatibility, the DLPI/LSL presents the interface required by the ODI specification to the MSM layer below it. Internally, the DLPI/LSL performs the essential translation between DLPI semantics and ODI semantics. In particular, the DLPI/LSL binds a UNIX clone device minor number to a Link Service Access Point (LSAP) protocol address and its associated ODI frame type.

MSM
The Media Support Module provides service functions to the TSM and HSM layers below. These services include base kernel services, such as memory management and hardware registration. The MSM also provides the primary service binding of a NIC instance with the DLPI/LSL. The MSM is supplied with UnixWare.

TSM
There is one Topology Support Module for each network topology. UnixWare 2.0 includes TSMs for Ethernet and Token Ring. The HSMs for a given topology use the topology-specific services of the corresponding TSM. In addition, token ring source routing feature is provided by the ODI Source Routing Module (ODISR).

HSM
Each NIC comes with an ODI Hardware Support Module, which performs various services for the NIC. The most important of these services are sending and receiving of frames by the NIC. For a frame type supported by the NIC to be available through ODI, the HSM must also support that frame type.

For Ethernet, UnixWare supports MAC types DL_ETHER and DL_CSMACD, provider style DL_STYLE1, and frame types ETHERNET_802.2, ETHERNET_802.3, ETHERNET_II, and ETHERNET_SNAP.

For Token ring, UnixWare supports MAC type DL_TPR plus LLC2 MODE and RAW MODE pass-through interfaces, provider style DL_STYLE1, and frame types TOKEN-RING and TOKEN-RING_SNAP.

The odi driver can operate as either a cloned or non-cloned device.

A process must issue a DL_BIND_REQ primitive to receive frames from the network. The process must specify the dl_sap member of the dl_bind_req_t structure. The type field of an incoming frame is compared to the dl_sap value. If the values are equal, the frame is placed on the STREAMS read queue of the process. A privileged process may set the dl_sap field to PROMISCUOUS_SAP. PROMISCUOUS_SAP matches all incoming frames.

A privileged process can also bind to a SAP already bound by another process. In cases where a frame qualifies to be sent to more than one process, independent copies of the frame will be made and placed on the STREAMS read queue of each process.

Received frames are delivered in dl_unitdata_ind_t structures. The source and destination address each contain a 6-byte Ethernet address, followed by a 2-byte type value.

Usage

ioctl calls

The following ioctls are supported:

DLIOCGMIB
Returns the DL_mib_t structure, which contains the Management Information Base (MIB). The MIB holds the Ethernet statistics kept in the driver.
/* 
 * Ether statistics structure. 
 */ 
typedef struct { 
	ulong_t	etherAlignErrors;	/* Frame alignment errors */ 
	ulong_t	etherCRCerrors;		/* CRC erros */ 
	ulong_t	etherMissedPkts;	/* Packet overflow or missed inter */ 
	ulong_t	etherOverrunErrors;	/* Overrun errors */ 
	ulong_t	etherUnderrunErrors;	/* Underrun errors */ 
	ulong_t	etherCollisions;	/* Total collisions */ 
	ulong_t	etherAbortErrors;	/* Transmits aborted at interface */ 
	ulong_t	etherCarrierLost;	/* Carrier sense signal lost */ 
	ulong_t	etherReadqFull;		/* STREAMS read queue full */ 
	ulong_t	etherRcvResources;	/* Receive resource alloc failure */ 
	ulong_t	etherDependent1;	/* Device dependent statistic */ 
	ulong_t	etherDependent2;	/* Device dependent statistic */ 
	ulong_t	etherDependent3;	/* Device dependent statistic */ 
	ulong_t	etherDependent4;	/* Device dependent statistic */ 
	ulong_t	etherDependent5;	/* Device dependent statistic */ 
} DL_etherstat_t; 

/* * Interface statistics compatible with MIB II SNMP requirements */ typedef struct { int ifIndex; /* ranges between 1 and ifNumber */ int ifDescrLen; /* len of desc. following this struct */ int ifType; /* type of interface */ int ifMtu; /* datagram size that can be sent/rcv */ ulong_t ifSpeed; /* estimate of bandwidth in bits PS */ uchar_t ifPhyAddress[DL_MAC_ADDR_LEN];/* Ethernet Address */ int ifAdminStatus; /* desired state of the interface */ int ifOperStatus; /* current state of the interface */ ulong_t ifLastChange; /* sysUpTime when state was entered */ ulong_t ifInOctets; /* octets received on interface */ ulong_t ifInUcastPkts; /* unicast packets delivered */ ulong_t ifInNUcastPkts; /* non-unicast packets delivered */ ulong_t ifInDiscards; /* good packets received but dropped */ ulong_t ifInErrors; /* packets received with errors */ ulong_t ifInUnknownProtos; /* packets recv'd to unbound proto */ ulong_t ifOutOctets; /* octets transmitted on interface */ ulong_t ifOutUcastPkts; /* unicast packets transmitted */ ulong_t ifOutNUcastPkts; /* non-unicast packets transmitted */ ulong_t ifOutDiscards; /* good outbound packets dropped */ ulong_t ifOutErrors; /* number of transmit errors */ ulong_t ifOutQlen; /* length of output queue */ DL_etherstat_t ifSpecific; /* ethernet specific stats */ } DL_mib_t;

The values in the MIB are compatible with those needed by the SNMP protocol.

The ifDescrLen field shows the length of the null-terminated description string that immediately follows the DL_mib_t structure.

There are three fields in the MIB that are specific to the odi driver. The ifSpecific.etherDependent1 field tracks the number of times the transceiver failed to transmit a collision signal after transmission of a packet. The ifSpecific.etherDependent2 field contains the number of collisions that occurred after a slot time (out of window collisions). The ifSpecific.etherDependent3 field tracks the number of times a transmit interrupt timeout condition occurred.

DLIOCSMIG
Allows a privileged process to initialize the values in the MIB (the DL_mib_t structure). A process cannot use this ioctl to change the ifPhyAddress, the ifDescrLen, or the text of the description fields.

DLIOCGENADDR
Returns the Ethernet address in network order.

DLIOCGLPCFLG
Returns the state of the local packet copy flag in the ioc_rval of the iocblk structure. The local copy flag determines if packets looped back by the driver should also be sent to the network. A non-zero value indicates that frames should also be sent to the network after being looped back. The default value of this flag is zero.

DLIOCSLPCFLG
Allows a privileged process to set the local packet copy flag, causing all packets looped back by the driver to be sent to the network as well.

DLIOCGPROMISC
Returns the value of the promiscuous flag in the ioc_rval of the iocblk structure. A non-zero value indicates that the Ethernet interface will receive all frames on the network. The default value of this flag is zero.

DLIOCSPROMISC
Allows a privileged process to toggle the current state of the promiscuous flag. When the flag is set, the driver captures all frames from the network. Processes that are bound to a promiscuous SAP, or to a SAP that matches the type field of the received frame, receive a copy of the frame.

DLIOCGETMULTI
Returns a list of multicast addresses (if it exists).

DLIOCADDMULTI
Allows a privileged process to add a new multicast address and enable its reception. A 6-byte buffer pointing to the multicast address must be passed as the parameter.

DLIOCDELMULTI
Allows a privileged process to delete a multicast address by passing a 6-byte multicast address as the parameter.

DLIOCRAWMODE
Allows a Token Ring privileged process to identify itself as a ``raw'' upstream module. This allows an upstream module to transmit a valid MAC frame using a DL_UNITDATA_REQ/IND message.

DLIOCLLC2MODE
Allows a privileged process to identify itself as a ``llc2'' upstream module. This allows a upstream module to transmit a valid LLC Type 2 (connection oriented) frame via a DL_UNITDATA_REQ/IND message.

Errors

The odi driver can return the following error codes:

ENXIO
Invalid major number or board is not installed.

ECHRNG
No minor devices left if configured as a cloned device. Increase HSM_nsaps in /etc/conf/pack.d/HSM/space.c. Invalid minor device number if configured as a non-clone device.

ENOENT
Selected NIC was found in the device database.

ENODEV
An attempt was made to initialize the boards but it failed.

ENOMEM
Not enough memory left in the system.

EPERM
An ioctl was made without the appropriate privilege.

EINVAL
An ioctl was made that did not supply a required input or output buffer.

The odi driver also can return the following errors using the DLPI DL_ERROR_ACK service primitive.

DL_NOTSUPPORTED
Requested service primitive is not supported.

DL_BADPRIM
Unknown service primitive was requested.

DL_OUTSTATE
DL_BIND_REQ was issued when the Stream was bound, or DL_UNBIND_REQ or DL_UNITDATA_REQ was issued when the Stream was not bound.

DL_ACCESS
An attempt was made to bind to PROMISCUOUS_SAP with insufficient privilege.

DL_BOUND
The requested SAP is already bound. A privileged process may bind to an already bound SAP.

DL_NOTINIT
DL_UNITDATA_REQ was made on a NIC that has gone offline because of an error.

DL_BADDATA
DL_UNITDATA_REQ was made with a data size that was either larger than the SPDU maximum or smaller than the SPDU minimum.

Files

/dev/HSM_*

/etc/conf/pack.d/HSM/space.c

/etc/conf/sdevice.d/HSM

/etc/conf/mtune.d/lsl

/etc/conf/mtune.d/msm

/etc/conf/mtune.d/odisr

/etc/conf/dtune.d/lsl

/etc/conf/dtune.d/msm

/etc/conf/dtune.d/odisr

/stand/resmgr

30 January 1998
© 1998 The Santa Cruz Operation, Inc. All rights reserved.