OpenSS7 SS7 for the Common Man | © Copyright 1997-2007 OpenSS7 Corporation All Rights Reserved. Last modified: Sat, 01 Nov 2008 14:12:37 GMT | ||||||||||||||||
| |||||||||||||||||
| DLPI DocumentationDescription: OpenSS7 Project Library Transport DLPIA PDF version of this document is available here. Data Link Provider InterfaceData Link Provider Interface1 IntroductionThis document specifies a STREAMS kernel-level instantiation of the ISO Data Link Service Definition DIS 88861 and Logical Link Control DIS 8802/2 (LLC)2. Where the two standards do not conform, DIS 8886 prevails. The Data Link Provider Interface (DLPI) enables a data link service user to access and use any of a variety of conforming data link service providers without special knowledge of the provider's protocol. Specifically, the interface is intended to support X.25 LAPB, BX.25 level 2, SDLC, ISDN LAPD, Ethernet(TM), CSMA/CD, FDDI, token ring, token bus, and Bisync. Among the expected data link service users are implementations of the OSI network layer and SNA path control. The interface specifies access to data link service providers, and does not define a specific protocol implementation. Thus, issues of network management, protocol performance, and performance analysis tools are beyond the scope of this document and should be addressed by specific implementations of a data link provider. However, accompanying each provider implementation should be information that describes the protocol-specific behavior of that provider. Currently, there are plans to come up with a set of implementor's agreements/guidelines for common data link providers. These agreements will address issues such as DLSAP address space, subsequent addresses, PPA access and control, QoS, supported services, etc. This specification assumes the reader is familiar with OSI Reference Model[4] terminology, OSI Data Link Services, and STREAMS. 1.1 Document OrganizationThis specification is organized as follows:
2 Model of the Data Link LayerThe data link layer (layer 2 in the OSI Reference Model) is responsible for the transmission and error-free delivery of bits of information over a physical communications medium. The model of the data link layer is presented here to describe concepts that are used throughout the specification of DLPI. It is described in terms of an interface architecture, as well as addressing concepts needed to identify different components of that architecture. The description of the model assumes familiarity with the OSI Reference Model. 2.1 Model of the Service InterfaceEach layer of the OSI Reference Model has two standards:
DLPI is an implementation of the first type of standard. It specifies an interface to the services of the data link layer. The following figure depicts the abstract view of DLPI. Figure 1. Abstract View of DLPI
The data link interface is the boundary between the network and data link layers of the OSI Reference Model. The network layer entity is the user of the services of the data link interface (DLS user), and the data link layer entity is the provider of those services (DLS provider). This interface consists of a set of primitives that provide access to the data link layer services, plus the rules for using those primitives (state transition rules). A data link interface service primitive might request a particular service or indicate a pending event. To provide uniformity among the various UNIX system networking products, an effort is underway to develop service interfaces that map to the OSI Reference Model. A set of kernel-level interfaces, based on the STREAMS development environment, constitute a major portion of this effort. The service primitives that make up these interfaces are defined as STREAMS messages that are transferred between the user and provider of the service. DLPI is one such kernel-level interface, and is targeted for STREAMS protocol modules that either use or provide data link services. In addition, user programs that wish to access a STREAMS-based data link provider directly may do so using the putmsg(2) and getmsg(2) system calls. Referring to the abstract view of DLPI (Figure 1), the DLS provider is configured as a STREAMS driver, and the DLS user accesses the provider using open(2) to establish a stream to the DLS provider. The stream acts as a communication endpoint between a DLS user and the DLS provider. After the stream is created, the DLS user and DLS provider communicate via the messages presented later in this specification. DLPI is intended to free data link users from specific knowledge of the characteristics of the data link provider. Specifically, the definition of DLPI hopes to achieve the goal of allowing a DLS user to be implemented independent of a specific communications medium. Any data link provider (supporting any communications medium) that conforms to the DLPI specification may be substituted beneath the DLS user to provide the data link services. Support of a new DLS provider should not require any changes to the implementation of the DLS user. 2.2 Modes of CommunicationThe data link provider interface supports three modes of communication: connection, connectionless and acknowledged connectionless. The connection mode is circuit-oriented and enables data to be transferred over a pre-established connection in a sequenced manner. Data may be lost or corrupted in this service mode, however, due to provider-initiated resynchronization or connection aborts. The connectionless mode is message-oriented and supports data transfer in self-contained units with no logical relationship required between units. Because there is no acknowledgment of each data unit transmission, this service mode can be unreliable in the most general case. However, a specific DLS provider can provide assurance that messages will not be lost, duplicated, or reordered. The acknowledged connectionless mode provides the means by which a data link user can send data and request the return of data at the same time. Although the exchange service is connectionless, in-sequence delivery is guaranteed for data sent by the initiating station. The data unit transfer is point-to-point. 2.2.1 Connection-mode ServiceThe connection-mode service is characterized by four phases of communication: local management, connection establishment, data transfer, and connection release. 2.2.1.1 Local ManagementThis phase enables a DLS user to initialize a stream for use in communication and establish an identity with the DLS provider. 2.2.1.2 Connection EstablishmentThis phase enables two DLS users to establish a data link connection between them to exchange data. One user (the calling DLS user) initiates the connection establishment procedures, while another user (the called DLS user) waits for incoming connect requests. The called DLS user is identified by an address associated with its stream (as will be discussed shortly). A called DLS user may either accept or deny a request for a data link connection. If the request is accepted, a connection is established between the DLS users and they enter the data transfer phase. For both the calling and called DLS users, only one connection may be established per stream. Thus, the stream is the communication endpoint for a data link connection. The called DLS user may choose to accept a connection on the stream where it received the connect request, or it may open a new stream to the DLS provider and accept the connection on this new, responding stream. By accepting the connection on a separate stream, the initial stream can be designated as a listening stream through which all connect requests will be processed. As each request arrives, a new stream (communication endpoint) can be opened to handle the connection, enabling subsequent requests to be queued on a single stream until they can be processed. 2.2.1.3 Data TransferIn this phase, the DLS users are considered peers and may exchange data simultaneously in both directions over an established data link connection. Either DLS user may send data to its peer DLS user at any time. Data sent by a DLS user is guaranteed to be delivered to the remote user in the order in which it was sent. 2.2.1.4 Connection ReleaseThis phase enables either the DLS user, or the DLS provider, to break an established connection. The release procedure is considered abortive, so any data that has not reached the destination user when the connection is released may be discarded by the DLS provider. 2.2.2 Connectionless-mode ServiceThe connectionless mode service does not use the connection establishment and release phases of the connection-mode service. The local management phase is still required to initialize a stream. Once initialized, however, the connectionless data transfer phase is immediately entered. Because there is no established connection, however, the connectionless data transfer phase requires the DLS user to identify the destination of each data unit to be transferred. The destination DLS user is identified by the address associated with that user (as will be discussed shortly). Connectionless data transfer does not guarantee that data units will be delivered to the destination user in the order in which they were sent. Furthermore, it does not guarantee that a given data unit will reach the destination DLS user, although a given DLS provider may provide assurance that data will not be lost. 2.2.3 Acknowledged Connectionless-mode ServiceThe acknowledged connectionless mode service also does not use the connection establishment and release phases of the connection-mode service. The local management phase is still required to initialize a stream. Once initialized, the acknowledged connectionless data transfer phase is immediately entered. Acknowledged connectionless data transfer guarantees that data units will be delivered to the destination user in the order in which they were sent. A data link user entity can send a data unit to the destination DLS User, request a previously prepared data unit from the destination DLS User, or exchange data units. 2.3 DLPI AddressingEach user of DLPI must establish an identity to communicate with other data link users. This identity consists of two pieces. First, the DLS user must somehow identify the physical medium over which it will communicate. This is particularly evident on systems that are attached to multiple physical media. Second, the DLS user must register itself with the DLS provider so that the provider can deliver protocol data units destined for that user. The following figure illustrates the components of this identification approach, which are explained below. Figure 2. Data Link Addressing Components
2.3.1 Physical Attachment IdentificationThe physical point of attachment (PPA in Figure 2) is the point at which a system attaches itself to a physical communications medium. All communication on that physical medium funnels through the PPA. On systems where a DLS provider supports more than one physical medium, the DLS user must identify which medium it will communicate through. A PPA is identified by a unique PPA identifier . For media that support physical layer multiplexing of multiple channels over a single physical medium (such as the B and D channels of ISDN), the PPA identifier must identify the specific channel over which communication will occur. Two styles of DLS provider are defined by DLPI, distinguished by the way they enable a DLS user to choose a particular PPA. The style 1 provider assigns a PPA based on the major/minor device the DLS user opened. One possible implementation of a style 1 driver would reserve a major device for each PPA the data link driver would support. This would allow the STREAMS clone open feature to be used for each PPA configured. This style of provider is appropriate when few PPAs will be supported. If the number of PPAs a DLS provider will support is large, a style 2 provider implementation is more suitable. The style 2 provider requires a DLS user to explicitly identify the desired PPA using a special attach service primitive. For a style 2 driver, the open(2) creates a stream between the DLS user and DLS provider, and the attach primitive then associates a particular PPA with that stream. The format of the PPA identifier is specific to the DLS provider, and should be described in the provider-specific addendum documentation. DLPI provides a mechanism to get and/or modify the physical address. The primitives to handle these functions are described in Optional Primitives to perform Essential Management Functions. The physical address value can be modified in a post-attached state. This would modify the value for all streams for that provider for a particular PPA. The physical address cannot be modified if even a single stream for that PPA is in the bound state. The DLS User uses the supported primitives ( 2.3.2 Data Link User IdentificationA data link user's identity is established by associating it with a data link service access point (DLSAP), which is the point through which the user will communicate with the data link provider. A DLSAP is identified by a DLSAP address. The DLSAP address identifies a particular data link service access
point that is
associated with a stream (communication endpoint). A bind service primitive
enables a DLS user to either choose a specific DLSAP by specifying its
DLSAP address, or to determine the DLSAP associated with a
stream by retrieving the bound DLSAP address. This DLSAP
address can then be used by other DLS users to access a specific DLS user. The
format of the DLSAP address is specific to the DLS provider, and
should be described in the provider-specific addendum documentation. However,
DLPI provides a mechanism for decomposing the DLSAP address into
component pieces. The Certain DLS Providers require the capability of binding on multiple
DLSAP addresses. This can be achieved through subsequent binding of
DLSAP addresses. DLPI supports peer and hierarchical binding of
DLSAPs. When the User requests peer addressing, the DLSAP specified
in a subsequent bind may be used in lieu of the DLSAP bound in the
When the DLS User requests hierarchical binding, the subsequent bind will
specify a DLSAP that will be used in addition to the DLSAP
bound using a If a DLS Provider supports peer subsequent bind operations, the first SAP that is bound is used as the source SAP when there is ambiguity. DLPI supports the ability to associate several streams with a single DLSAP, where each stream may be a unique data link connection endpoint. However, not all DLS providers can support such configurations because some DLS providers may have no mechanism beyond the DLSAP address for distinguishing multiple connections. In such cases, the provider will restrict the DLS user to one stream per DLSAP. 2.4 The Connection Management StreamThe earlier description of the connection-mode service assumed that a DLS user bound a DLSAP to the stream it would use to receive connect requests. In some instances, however, it is expected that a given service may be accessed through any one of several DLSAPs. To handle this scenario, a separate stream would be required for each possible destination DLSAP, regardless of whether any DLS user actually requested a connection to that DLSAP. Obvious resource problems can result in this scenario. To obviate the need for tying up system resources for all possible destination utility is defined in DLPI. A management stream is one that receives any connect requests that are not destined for currently bound DLSAPs capable of receiving connect indications. With this mechanism, a special listener can handle incoming connect requests intended for a set of DLSAPs by opening a connection management stream to the DLS provider that will retrieve all connect requests arriving through a particular PPA. In the model, then, there may be a connection management stream per PPA. 3 DLPI ServicesThe various features of the DLPI interface are defined in terms of the services provided by the DLS provider, and the individual primitives that may flow between the DLS user and DLS provider. The data link provider interface supports three modes of service: connection, connectionless and acknowledged connectionless. The connection mode is circuit-oriented and enables data to be transferred over an established connection in a sequenced manner. The connectionless mode is message-oriented and supports data transfer in self-contained units with no logical relationship required between units. The acknowledged connectionless mode is message-oriented and guarantees that data units will be delivered to the destination user in the order in which they were sent. This specification also defines a set of local management functions that apply to all modes of service. The XID and TEST services that are supported by DLPI are listed below. The DLS User can issue an XID or TEST request to the DLS Provider. The Provider will transmit an XID or TEST frame to the peer DLS Provider. On receiving a response, the DLS Provider sends a confirmation primitive to the DLS User. On receiving an XID or TEST frame from the peer DLS Provider, the local DLS Provider sends up an XID or TEST indication primitive to the DLS User. The User must respond with an XID or TEST response frame to the Provider. The services are tabulated below and described more fully in the remainder of this section. Table 1a. Cross-Reference of DLS Services and Primitives
Table 1b. Cross-Reference of DLS Services and Primitives
Table 1c. Cross-Reference of DLS Services and Primitives
3.1 Local Management ServicesThe local management services apply to the connection, connectionless and acknowledged connectionless modes of transmission. These services, which fall outside the scope of standards specifications, define the method for initializing a stream that is connected to a DLS provider. DLS provider information reporting services are also supported by the local management facilities. 3.1.1 Information Reporting ServiceThis service provides information about the DLPI stream to the DLS user. The
message
Figure 3. Message Flow: Information Reporting
3.1.2 Attach ServiceThe attach service assigns a physical point of attachment (PPA) to a
stream. This service is required for style 2 DLS providers (see Physical Attachment Identification) to specify the physical medium over which
communication will occur. The DLS provider indicates success with a
Figure 4. Message Flow: Attaching a Stream to a Physical Line
A PPA may be disassociated with a stream using the
Figure 5. Message Flow: Detaching a Stream from a Physical Line
3.1.3 Bind ServiceThe bind service associates a data link service access point (DLSAP) with a stream. The DLSAP is identified by a DLSAP address.
The DLS provider indicates success with a Certain DLS providers require the capability of binding on multiple
DLSAP addresses. Figure 6. Message Flow: Binding a Stream to a DLSAP
Figure 7. Message Flow: Unbinding a Stream from a DLSAP
Figure 8. Message Flow: Enabling a specific multicast address on a Stream
Figure 9. Message Flow: Disabling a specific multicast address on a Stream
Figure 10. Message Flow: Enabling promiscuous mode on a Stream
Figure 11. Message Flow: Disabling promiscuous mode on a Stream
3.2 Connection-mode ServicesThe connection-mode services enable a DLS user to establish a data link connection, transfer data over that connection, reset the link, and release the connection when the conversation has terminated. 3.2.1 Connection Establishment ServiceThe connection establishment service establishes a data link connection between a local DLS user and a remote DLS user for the purpose of sending data. Only one data link connection is allowed on each stream. 3.2.1.1 Normal Connection EstablishmentIn the connection establishment model, the calling DLS user initiates connection
establishment, while the called DLS user waits for incoming requests.
The normal sequence of messages is illustrated in the following figure. Figure 12. Message Flow: Successful Connection Establishment
Once the connection is established, the DLS users may exchange user data using
The DLS user may accept an incoming connect request on either the stream where
the connect indication arrived or an alternate, responding stream. The
responding stream is indicated by a token in the Figure 13. Message Flow: Token Retrieval
In the typical connection establishment scenario, the called DLS user processes one connect indication at a time, accepting the connection on another stream. Once the user responds to the current connect indication, the next connect indication (if any) can be processed. DLPI also enables the called DLS user to multi-thread incoming connect indications. The user can receive multiple connect indications before responding to any of them. This enables the DLS user to establish priority schemes on incoming connect requests. 3.2.1.2 Connection Establishment RejectionsIn certain situations, the connection establishment request cannot be completed.
The following paragraphs describe the occasions under which
The following figure illustrates the situation where the called DLS user chooses
to reject the connect request by issuing Figure 14. Message Flow: Called DLS User Rejection of Connection Establishment Attempt
The following figure illustrates the situation where the DLS provider rejects a
connect request for lack of resources or other reason. The DLS provider sends
Figure 15. Message Flow: DLS Provider Rejection of a Connection Establishment Attempt
The following figures illustrate the situation where the calling DLS user
chooses to abort a previous connection attempt. The DLS user issues
Figure 16. Message Flow: Both Primitives are Destroyed by Provider
Figure 17. Message Flow: DL_DISCONNECT Indication Arrives before DL_CONNECT Response is Sent
Figure 18. Message Flow: DL_DISCONNECT Indication Arrives after DL_CONNECT Response is Sent
3.2.2 Data Transfer ServiceThe connection-mode data transfer service provides for the exchange of user data in either direction or in both directions simultaneously between DLS users. Data is transmitted in logical groups called data link service data units (DLSDUs). The DLS provider preserves both the sequence and boundaries of DLSDUs as they are transmitted. Normal data transfer is neither acknowledged nor confirmed. It is up to the DLS users, if they so choose, to implement a confirmation protocol. Each Figure 19. Message Flow: Normal Data Transfer
3.2.3 Connection Release ServiceThe connection release service provides for the DLS users or the DLS provider to initiate the connection release. Connection release is an abortive operation, and any data in transit (has not been delivered to the DLS user) may be discarded.
Figure 20. Message Flow: DLS User-Invoked Connection Release
The next figure illustrates that when two DLS users independently invoke the
connection release service, neither receives a Figure 21. Message Flow: Simultaneous DLS User Invoked Connection Release
The next figure illustrates that when the DLS provider initiates the connection
release service, each DLS user receives a Figure 22. Message Flow: DLS Provider Invoked Connection Release
The next figure illustrates that when the DLS provider and the local DLS user
simultaneously invoke the connection release service, the remote DLS user
receives a Figure 23. Message Flow: Simultaneous DLS User & DLS Provider Invoked Connection Release
3.2.4 Reset ServiceThe reset service may be used by the DLS user to resynchronize the use of a data link connection, or by the DLS provider to report detected loss of data unrecoverable within the data link service. Invocation of the reset service will unblock the flow of DLSDUs if the data link connection is congested; DLSDUs may be discarded by the DLS provider. The DLS user or users that did not invoke the reset will be notified that a reset has occurred. A reset may require a recovery procedure to be performed by the DLS users. The interaction between each DLS user and the DLS provider will be one of the following:
The The resynchronizing properties of the reset service are that:
The complete message flow depends on the origin of the reset, which may be the DLS provider or either DLS user. The following figure illustrates the message flow for a reset invoked by one DLS user. Figure 24. Message Flow: DLS User-Invoked Connection Reset
The following figure illustrates the message flow for a reset invoked by both DLS users simultaneously. Figure 25. Message Flow: Simultaneous DLS User-Invoked Connection Reset
The following figure illustrates the message flow for a reset invoked by the DLS provider. Figure 26. Message Flow: DLS Provider-Invoked Connection Reset
The following figure illustrates the message flow for a reset invoked simultaneously by one DLS user and the DLS provider. Figure 27. Message Flow: Simultaneous DLS User & DLS Provider Invoked Connection Reset
3.3 Connectionless-mode ServicesThe connectionless-mode services enable a DLS user to transfer units of data to peer DLS users without incurring the overhead of establishing and releasing a connection. The connectionless service does not, however, guarantee reliable delivery of data units between peer DLS users (e.g. lack of flow control may cause buffer resource shortages that result in data being discarded). Once a stream has been initialized via the local management services, it may be used to send and receive connectionless data units. 3.3.1 Connectionless Data Transfer ServiceThe connectionless data transfer service provides for the exchange of user data (DLSDUs) in either direction or in both directions simultaneously without having to establish a data link connection. Data transfer is neither acknowledged nor confirmed, and there is no end-to-end flow control provided. As such, the connectionless data transfer service cannot guarantee reliable delivery of data. However, a specific DLS provider can provide assurance that messages will not be lost, duplicated, or reordered.
Figure 28. Message Flow: Connectionless Data Transfer
3.3.2 QOS Management ServiceThe QoS (Quality of Service) management service enables a DLS user to specify
the quality of service it can expect for each invocation of the connectionless
data transfer service. The Figure 29. Message Flow: Connectionless Data Transfer
3.3.3 Error Reporting ServiceThe connectionless-mode error reporting service may be used to notify a DLS user that a previously sent data unit either produced an error or could not be delivered. This service does not, however, guarantee that an error indication will be issued for every undeliverable data unit. Figure 29b. -
3.3.4 XID and TEST ServiceThe XID and TEST service enables the DLS User to issue an XID or TEST request to the DLS Provider. On receiving a response for the XID or TEST frame transmitted to the peer DLS Provider, the DLS Provider sends up an XID or TEST confirmation primitive to the DLS User. On receiving an XID or TEST frame from the peer DLS Provider, the local DLS Provider sends up an XID or TEST indication respectively to the DLS User. The DLS User must respond with an XID or TEST response primitive. If the DLS User requested automatic handling of the XID or TEST response, at bind time, the DLS Provider will send up an error acknowledgment on receiving an XID or TEST request. Also, no indications will be generated to the DLS User on receiving XID or TEST frames from the remote side. The normal flow of messages is illustrated in the figure below. Figure 30. Message Flow: XID Service
Figure 31. Message Flow: TEST Service
3.4 Acknowledged Connectionless-mode ServicesThe acknowledged connectionless-mode services are designed for general use for the reliable transfer of informations between peer DLS Users. These services are intended for applications that require acknowledgment of cross-LAN data unit transfer, but wish to avoid the complexity that is viewed as being associated with the connection-mode services. Although the exchange service is connectionless, in sequence delivery is guaranteed for data sent by the initiating station. 3.4.1 Acknowledged Connectionless-mode Data Transfer ServicesThe acknowledged connectionless-mode data transfer services provide the means by which the DLS User scan exchange DLSDUs which are acknowledged at the LLC sublayer, without the establishment of a Data Link connection. The services provide a means by which a local DLS User can send a data unit to the peer DLS User, request a previously prepared data unit, or exchange data units with the peer DLS User. Figure 32. Message Flow: Acknowledged Connectionless-Mode Data Unit Transmission service
The next figure illustrates the acknowledged connectionless-mode data unit exchange service. Figure 33. Message Flow: Acknowledged Connectionless-Mode Data Unit Exchange service
The next figure illustrates the Reply Data Unit Preparation service. Figure 34. Message Flow: Acknowledged Connectionless-Mode Reply Data Unit Preparation Service
3.4.2 QOS Management ServiceThe Quality of Service (QoS) management service enables a DLS User to
specify the quality of service it can expect for each invocation of the
acknowledged connectionless data transfer service. The 3.4.3 Error Reporting ServiceThe acknowledged connectionless mode error reporting service is the same as the unacknowledged connectionless-mode error reporting service. For the message flow, refer to Error Reporting Service (1). 3.5 An ExampleTo bring it all together, the following example illustrates the primitives that flow during a complete, connection-mode sequence between stream open and stream close. Figure 35. Message Flow: A Connection-mode Example
4 DLPI PrimitivesThe kernel-level interface to the data link layer defines a STREAMS-based message interface between the provider of the data link service (DLS provider) and the consumer of the data link service (DLS user). STREAMS provides the mechanism in which DLPI primitives may be passed between the DLS user and DLS provider. Before DLPI primitives can be passed between the DLS user and the DLS provider, the DLS user must establish a stream to the DLS provider using open(2). The DLS provider must therefore be configured as a STREAMS driver. When interactions between the DLS user and DLS provider have completed, the stream may be closed. The STREAMS messages used to transport data link service primitives across the interface have one of the following formats:
The information contained in the Allowable Sequence of DLPI Primitives, defines the sequence in which DLPI primitives can be passed between DLS user and DLS provider, and Precedence of DLPI Primitives, summarizes the precedence rules associated with each primitive for ordering the primitives on the DLS provider and DLS user queues. The following sections describe the format of the primitives that support the services described in the previous section. The primitives are grouped into four general categories for presentation:
4.1 Local Management Service PrimitivesThis section describes the local management service primitives that are common to the connection, connectionless and acknowledged connectionless service modes. These primitives support the Information Reporting, Attach, Bind, enabling/disabling of multicast addresses and turning on/off the promiscuous mode. Once a stream has been opened by a DLS user, these primitives initialize the stream, preparing it for use. 4.1.1 PPA Initialization / De-initializationThe PPA associated with each stream must be initialized before the DLS
provider can transfer data over the medium. The initialization and
de-initialization of the PPA is a network management issue, but
DLPI
must address the issue because of the impact such actions will have on a DLS
user. More specifically, DLPI requires the DLS provider to initialize the
PPA associated with a stream at some point before it completes the
processing of the A DLS provider may initialize a PPA using the following methods:
A specific DLS provider may support either of these methods, or possibly some
combination of the two, but the method implemented has no impact on the DLS
user. From the DLS user's viewpoint, the PPA is guaranteed to be
initialized on receipt of a If pre-initialization has not been performed and/or automatic initialization
fails, the DLS provider will fail the A DLS provider may handle PPA de-initialization using the following methods:
A specific DLS provider may support any of these methods, or possibly some combination of them, but the method implemented has no impact on the DLS user. From the DLS user's viewpoint, the PPA is guaranteed to be initialized and available for transmission until it closes or unbinds the stream associated with the PPA. DLS provider-specific addendum documentation should describe the method chosen for PPA initialization and de-initialization. 4.1.2 Message DL_INFO_REQ (dl_info_req_t)Requests information of the DLS provider about the DLPI stream. This information includes a set of provider-specific parameters, as well as the current state of the interface. Message FormatThe message consists of one typedef struct { ulong dl_primitive; } dl_info_req_t; Parameters
StateThe message is valid in any state in which a local acknowledgment is not pending, as described in Allowable Sequence of DLPI Primitives. New StateThe resulting state is unchanged. ResponseThe DLS provider responds to the information request with a
4.1.3 Message DL_INFO_ACK (dl_info_ack_t)This message is sent in response to
Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_max_sdu; ulong dl_min_sdu; ulong dl_addr_length; ulong dl_mac_type; ulong dl_reserved; ulong dl_current_state; long dl_sap_length; ulong dl_service_mode; ulong dl_qos_length; ulong dl_qos_offset; ulong dl_qos_range_length; ulong dl_qos_range_offset; ulong dl_provider_style; ulong dl_addr_offset; ulong dl_version; ulong dl_brdcst_addr_length; ulong dl_brdcst_addr_offset; ulong dl_growth; } dl_info_ack_t; Parameters
StateThe message is valid in any state in response to a
New StateThe resulting state is unchanged. 4.1.4 Message DL_ATTACH_REQ (dl_attach_req_t)Requests the DLS provider associate a physical point of attachment
(PPA) with a stream. The DLS provider may initialize the physical line on receipt of this primitive
or the Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_ppa; } dl_attach_req_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
ResponseIf the attach request is successful,
If the request fails, message
Reasons for Failure
4.1.5 Message DL_DETACH_REQ (dl_detach_req_t)For style 2 DLS providers, this requests the DLS provider detach a physical point of attachment (PPA) from a stream. The request may not be issued to a style 1 DLS provider; doing so may cause errors. Message FormatThe message consists of one typedef struct { ulong dl_primitive; } dl_detach_req_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
ResponseIf the detach request is successful,
If the request fails, message
Reasons for Failure
4.1.6 Message DL_BIND_REQ (dl_bind_req_t)Requests the DLS provider bind a DLSAP to the stream. The DLS user must identify the address of the DLSAP to be bound to the stream. For connection-mode service, the DLS user also indicates whether it will accept incoming connection requests on the stream. Finally, the request directs the DLS provider to activate the stream associated with the DLSAP. A stream is viewed as active when the DLS provider may transmit and receive
protocol data units destined to or originating from the stream. The
PPA associated with each stream must be initialized upon completion of
the processing of the A stream may be bound as a "connection management" stream, such that it will receive all connect requests that arrive through a given PPA (see The Connection Management Stream). In this case, the dl_sap will be ignored. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_sap; ulong dl_max_conind; ushort dl_service_mode; ushort dl_conn_mgmt; ulong dl_xidtest_flg; } dl_bind_req_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
ResponseIf the bind request is successful,
If the request fails, message
Reasons for Failure
4.1.7 Message DL_BIND_ACK (dl_bind_ack_t)Reports the successful bind of a DLSAP to a stream, and returns the
bound DLSAP address to the DLS user. This primitive is generated in
response to a Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_sap; ulong dl_addr_length; ulong dl_addr_offset; ulong dl_max_conind; ulong dl_xidtest_flg; } dl_bind_ack_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
4.1.8 Message DL_UNBIND_REQ (dl_unbind_req_t)Requests the DLS provider to unbind the DLSAP that had been bound by a
previous At the successful completion of the request, the DLS user may issue a new
Message FormatThe message consists of one typedef struct { ulong dl_primitive; } dl_unbind_req_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
ResponseIf the unbind request is successful,
If the request fails, message
Reasons for Failure
4.1.9 Message DL_SUBS_BIND_REQ (dl_subs_bind_req_t)Requests the DLS provider bind a subsequent DLSAP to the stream. The DLS user must identify the address of the subsequent DLSAP to be bound to the stream. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_subs_sap_offset; ulong dl_subs_sap_length; ulong dl_subs_bind_class; } dl_subs_bind_req_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
ResponseIf the subsequent bind request is successful,
If the request fails, message
Reasons for Failure
4.1.10 Message DL_SUBS_BIND_ACK (dl_subs_bind_ack_t)Reports the successful bind of a subsequent DLSAP to a stream, and
returns the bound DLSAP address to the DLS user. This primitive is
generated in response to a Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_subs_sap_offset; ulong dl_subs_sap_length; } dl_subs_bind_ack_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
4.1.11 Message DL_SUBS_UNBIND_REQ (dl_subs_unbind_req_t)Requests the DLS Provider to unbind the DLSAP that had been bound by a
previous Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_subs_sap_offset; ulong dl_subs_sap_length; } dl_subs_unbind_req_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
ResponseIf the unbind request is successful, a
If the request fails, message
Reasons for failure
4.1.12 Message DL_ENABMULTI_REQ (dl_enabmulti_req_t)Requests the DLS Provider to enable specific multicast addresses on a per Stream basis. It is invalid for a DLS Provider to pass upstream messages that are destined for any address other than those explicitly enabled on that Stream by the DLS User. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_addr_length; ulong dl_addr_offset; } dl_enabmulti_req_t; Parameters
StateThis message is valid in any state in which a local acknowledgment is not
pending with the exception of
New StateThe resulting state is unchanged. ResponseIf the enable request is successful, a
If the request fails, message
Reasons for failure
4.1.13 Message DL_DISABMULTI_REQ (dl_disabmulti_req_t)Requests the DLS Provider to disable specific multicast addresses on a per Stream basis. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_addr_length; ulong dl_addr_offset; } dl_disabmulti_req_t; Parameters
StateThis message is valid in any state in which a local acknowledgment is not
pending with the exception of
New StateThe resulting state is unchanged. ResponseIf the disable request is successful, a
If the request fails, message
Reasons for failure
4.1.14 Message DL_PROMISCON_REQ (dl_promiscon_req_t)This primitive requests the DLS Provider to enable promiscuous mode on a per Stream basis, either at the physical level or at the SAP level. The DL Provider will route all received messages on the media to the DLS User
until either a
Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_level; } dl_promiscon_req_t; Parameters
StateThe message is valid in any state when there is no pending acknowledgment. New StateThe resulting state is unchanged. ResponseIf enabling of promiscuous mode is successful, a
Reasons for Failure
4.1.15 Message DL_PROMISCOFF_REQ (dl_promiscoff_req_t)This primitive requests the DLS Provider to disable promiscuous mode on a per Stream basis, either at the physical level or at the SAP level. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_level; } dl_promiscoff_req_t; Parameters
StateThe message is valid in any state in which the promiscuous mode is enabled and there is no pending acknowledgment. New StateThe resulting state is unchanged. ResponseIf the promiscuous mode disabling is successful, a
Reasons for Failure
4.1.16 Message DL_OK_ACK (dl_ok_ack_t)Acknowledges to the DLS user that a previously issued request primitive was received successfully. It is only initiated for those primitives that require a positive acknowledgment. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_correct_primitive; } dl_ok_ack_t; Parameters
StateThe message is valid in response to a
New StateThe resulting state depends on the current state and is defined fully in Allowable Sequence of DLPI Primitives. 4.1.17 Message DL_ERROR_ACK (dl_error_ack_t)Informs the DLS user that a previously issued request or response was invalid. It conveys the identity of the primitive in error, a DLPI error code, and if appropriate, a UNIX system error code. Whenever this primitive is generated, it indicates that the DLPI state is identical to what it was before the erroneous request or response. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_error_primitive; ulong dl_errno; ulong dl_unix_errno; } dl_error_ack_t; Parameters
StateThe message is valid in every state where an acknowledgment or confirmation of a previous request or response is pending. New StateThe resulting state is that from which the acknowledged request or response was generated. 4.2 Connection-mode Service PrimitivesThis section describes the service primitives that support the connection-mode service of the data link layer. These primitives support the connection establishment, connection-mode data transfer, and connection release services described earlier. 4.2.1 Multi-threaded Connection EstablishmentIn the connection establishment model, the calling DLS user initiates a request for a connection, and the called DLS user receives each request and either accepts or rejects it. In the simplest form (single threaded), the called DLS user is passed a connect indication and the DLS provider holds any subsequent indications until a response for the current outstanding indication is received. At most one connect indication is outstanding at any time. DLPI also enables a called DLS user to multi-thread connect indications and
responses. This capability is desirable, for example, when imposing a priority
scheme on all DLS users attempting to establish a connection. The DLS provider
will pass all connect indications to the called DLS user (up to some
pre-established limit as set by To support multi-threading, a correlation value is needed to associate responses
with the appropriate connect indication. A correlation value is contained in
each Once a connection has been accepted or rejected, the correlation value has no
meaning to a DLS user. The DLS provider may reuse the correlation value in
another The DLS provider assigns the correlation value for each connect indication. Correlation values must be unique among all outstanding connect indications on a given stream. The values may, but need not, be unique across all streams to the DLS provider. The correlation value must be a positive, non-zero value. There is no implied sequencing of connect indications using the correlation value; the values do not have to increase sequentially for each new connect indication. 4.2.2 Message DL_CONNECT_REQ (dl_connect_req_t)Requests the DLS provider establish a data link connection with a remote DLS user. The request contains the DLSAP address of the remote (called) DLS user and quality of service parameters to be negotiated during connection establishment. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; ulong dl_qos_length; ulong dl_qos_offset; ulong dl_growth; } dl_connect_req_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
ResponseThere is no immediate response to the connect request. However, if the connect
request is accepted by the called DLS user,
If the connect request is rejected by the called DLS user, the called DLS user
cannot be reached, or the DLS provider and/or called DLS user do not agree on the
specified quality of service, a
If the request is erroneous, message
Reasons for Failure
4.2.3 Message DL_CONNECT_IND (dl_connect_ind_t)Conveys to the local DLS user that a remote (calling) DLS user wishes to establish a data link connection. The indication contains the DLSAP address of the calling and called DLS user, and the quality of service parameters as specified by the calling DLS user and negotiated by the DLS provider. The The number of outstanding Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_correlation; ulong dl_called_addr_length; ulong dl_called_addr_offset; ulong dl_calling_addr_length; ulong dl_calling_addr_offset; ulong dl_qos_length; ulong dl_qos_offset; ulong dl_growth; } dl_connect_ind_t; Parameters
StateThe message is valid in state New StateThe resulting state is ResponseThe DLS user must eventually send either 4.2.4 Message DL_CONNECT_RES (dl_connect_res_t)Directs the DLS provider to accept a connect request from a remote (calling) DLS
user on a designated stream. The DLS user may accept the connection on the same
stream where the connect indication arrived, or on a different stream that has
been previously bound. The response contains the correlation number from the
corresponding After issuing this primitive, the DLS user may immediately begin transferring
data using the Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_correlation; ulong dl_resp_token; ulong dl_qos_length; ulong dl_qos_offset; ulong dl_growth; } dl_connect_res_t; Parameters
StateThe primitive is valid in state
New StateThe resulting state is
ResponseIf the connect response is successful,
If the request fails,
Reasons for Failure
4.2.5 Message DL_CONNECT_CON (dl_connec t_con_t)Informs the local DLS user that the requested data link connection has been established. The primitive contains the DLSAP address of the responding DLS user and the quality of service parameters as selected by the responding DLS user. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_resp_addr_length; ulong dl_resp_addr_offset; ulong dl_qos_length; ulong dl_qos_offset; ulong dl_growth; } dl_connect_con_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
4.2.6 Message DL_TOKEN_REQ (dl_token_req_t)Requests that a connection response token be assigned to the stream and returned
to the DLS user. This token can be supplied in the typedef struct { ulong dl_primitive; } dl_token_req_t; Parameters
StateThe message is valid in any state in which a local acknowledgment is not pending, as described in Allowable Sequence of DLPI Primitives. New StateThe resulting state is unchanged. ResponseThe DLS provider responds to the information request with a
4.2.7 Message DL_TOKEN_ACK (dl_token_ack_t)This message is sent in response to
Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_token; } dl_token_ack_t; Parameters
StateThe message is valid in any state in response to a
New StateThe resulting state is unchanged. 4.2.8 Message DL_DATA_REQConveys a complete DLSDU from the DLS user to the DLS provider for transmission over the data link connection. The DLS provider guarantees to deliver each DLSDU to the remote DLS
user in the same order as received from the local DLS user. If the DLS provider
detects unrecoverable data loss during data transfer, this may be indicated to
the DLS user by a Message FormatThe message consists of one or more To simplify support of a read(2)/write(2) interface to the data link layer, the
DLS provider must recognize and process messages that consist of one or more
StateThe message is valid in state New StateThe resulting state is unchanged. ResponseIf the request is valid, no response is generated. If the request is erroneous, a STREAMS
Note (Support of Direct User-Level Access)A STREAMS module would implement "more" field processing itself to support direct user-level access. This module could collect messages and send them in one larger message to the DLS provider, or break large DLSDUs passed to the DLS user into smaller messages. The module would only be pushed if the DLS user was a user-level process. 4.2.9 Message DL_DATA_INDConveys a DLSDU from the DLS provider to the DLS user. The DLS
provider guarantees to deliver each DLSDU to the local DLS user in the
same order as received from the remote DLS user. If the DLS provider detects
unrecoverable data loss during data transfer, this may be indicated to the DLS
user by a Message FormatThe message consists of one or more StateThe message is valid in state New StateThe resulting state is unchanged. 4.2.10 Message DL_DISCONNECT_REQ (dl_disconnect_req_t)Requests the DLS provider to disconnect an active data link connection or one
that was in the process of activation, either outgoing or incoming, as a result
of an earlier Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_reason; ulong dl_correlation; } dl_disconnect_req_t; Parameters
StateThe message is valid in any of the states:
New StateThe resulting state is one of the disconnect pending states, as defined in Allowable Sequence of DLPI Primitives. ResponseIf the disconnect is successful,
If the request fails, message
Reasons for Failure
4.2.11 Message DL_DISCONNECT_IND (dl_disc onnect_ind_t)Informs the DLS user that the data link connection on this stream has been
disconnected, or that a pending connection (either The primitive indicates the origin and the cause of the disconnect. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_originator; ulong dl_reason; ulong dl_correlation; } dl_disconnect_ind_t; Parameters
StateThe message is valid in any of the states:
New StateThe resulting state is
4.2.12 Message DL_RESET_REQ (dl_reset_req_t)Requests that the DLS provider initiate the resynchronization of a data link connection. This service is abortive, so no guarantee of delivery can be assumed about data that is in transit when the reset request is initiated. Message FormatThe message consists of one typedef struct { ulong dl_primitive; } dl_reset_req_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
ResponseThere is no immediate response to the reset request. However, as
resynchronization completes,
If the request fails, message
Reasons for Failure
4.2.13 Message DL_RESET_IND (dl_reset_ind_t)Informs the DLS user that either the remote DLS user is resynchronizing the data link connection, or the DLS provider is reporting loss of data for which it can not recover. The indication conveys the reason for the reset. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_originator; ulong dl_reason; } dl_reset_ind_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
ResponseThe DLS user should issue a
4.2.14 Message DL_RESET_RES (dl_reset_res_t)Directs the DLS provider to complete resynchronizing the data link connection. Message FormatThe message consists of one typedef struct { ulong dl_primitive; } dl_reset_res_t; Parameters
StateThe primitive is valid in state
New StateThe resulting state is
ResponseIf the reset response is successful,
If the reset response is erroneous,
Reasons for Failure
4.2.15 Message DL_RESET_CON (dl_reset_con_t)Informs the reset-initiating DLS user that the reset has completed. Message FormatThe message consists of one typedef struct { ulong dl_primitive; } dl_reset_con_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
4.3 Connectionless-mode Service PrimitivesThis section describes the primitives that support the connectionless-mode service of the data link layer. These primitives support the connectionless data transfer service described earlier. 4.3.1 Message DL_UNITDATA_REQ (dl_unitdata_req_t)Conveys one DLSDU from the DLS user to the DLS provider for transmission to a peer DLS user. Because connectionless data transfer is an unacknowledged service, the DLS provider makes no guarantees of delivery of connectionless DLSDUs. It is the responsibility of the DLS user to do any necessary sequencing or retransmission of DLSDUs in the event of a presumed loss. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; dl_priority_t dl_priority; } dl_unitdata_req_t; Parameters
StateThe message is valid in state
New StateThe resulting state is unchanged. ResponseIf the DLS provider accepts the data for transmission, there is no response. This does not, however, guarantee that the data will be delivered to the destination DLS user, since the connectionless data transfer is not a confirmed service. If the request is erroneous, message
If for some reason the request cannot be processed, the DLS provider may
generate a
Reasons for Failure
4.3.2 Message DL_UNITDATA_IND (dl_unitdata_ind_t)Conveys one DLSDU from the DLS provider to the DLS user. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; ulong dl_src_addr_length; ulong dl_src_addr_offset; ulong dl_group_address; } dl_unitdata_ind_t; Parameters
StateThe message is valid in state
New StateThe resulting state is unchanged. 4.3.3 Message DL_UDERROR_IND (dl_uderror_ind_t)Informs the DLS user that a previously sent
Message FormatThe message consists of either one typedef struct { ulong dl_primitive; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; ulong dl_unix_errno; ulong dl_errno; } dl_uderror_ind_t; Parameters
StateThe message is valid in state
New StateThe resulting state is unchanged. 4.3.4 Message DL_UDQOS_REQ (dl_udqos_req_t)Requests the DLS provider to apply the specified quality of service parameter
values to subsequent data unit transmissions. These new values will remain in
effect until another
Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_qos_length; ulong dl_qos_offset; } dl_udqos_req_t; Parameters
StateThe message is valid in state
New StateThe resulting state is
ResponseIf the quality of service request is successful,
If the request fails, message
Reasons for Failure
4.4 Primitives to handle XID and TEST operationsThis section describes the service primitives that support the XID and TEST operations. The DLS User can issue these primitives to the DLS Provider requesting the provider to send an XID or a TEST frame. On receipt of an XID or TEST frame from the remote side, the DLS Provider can send the appropriate indication to the User. 4.4.1 Message DL_TEST_REQ (dl_test_req_t)Conveys one TEST command DLSDU from the DLS User to the DLS Provider for transmission to a peer DLS Provider. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_flag; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; } dl_test_req_t; Parameters
StateThe message is valid in states
New StateThe resulting state is unchanged. ResponseOn an invalid TEST command request, a
Reasons for failure
4.4.2 Message DL_TEST_IND (dl_test_ind_t)Conveys the TEST response/indication DLSDU from the DLS Provider to the DLS User. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_flag; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; ulong dl_src_addr_length; ulong dl_src_addr_offset; } dl_test_ind_t; Parameters
StateThe message is valid in states
New StateThe resulting state is unchanged. 4.4.3 Message DL_TEST_RES (dl_test_res_t)Conveys the TEST response DLSDU from the DLS User to the DLS Provider in
response to a
Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_flag; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; } dl_test_res_t; Parameters
StateThe message is valid in states
New StateThe resulting state is unchanged. 4.4.4 Message DL_TEST_CON (dl_test_con_t)Conveys the TEST response DLSDU from the DLS Provider to the DLS User in
response to a
Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_flag; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; ulong dl_src_addr_length; ulong dl_src_addr_offset; } dl_test_con_t; Parameters
StateThe message is valid in states
New StateThe resulting state is unchanged. 4.4.5 Message DL_XID_REQ (dl_xid_req_t)Conveys one XID DLSDU from the DLS User to the DLS Provider for transmission to a peer DLS User. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_flag; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; } dl_xid_req_t; Parameters
StateThe message is valid in state
New StateThe resulting state is unchanged. ResponseOn an invalid XID request, a
Reasons for failure
4.4.6 Message DL_XID_IND (dl_xid_ind_t)Conveys an XID DLSDU from the DLS Provider to the DLS User. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_flag; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; ulong dl_src_addr_length; ulong dl_src_addr_offset; } dl_xid_ind_t; Parameters
StateThe message is valid in state
New StateThe resulting state is unchanged. ResponseThe DLS User must respond with a
4.4.7 Message DL_XID_RES (dl_xid_res_t)Conveys an XID DLSDU from the DLS User to the DLS Provider in response to a
Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_flag; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; } dl_xid_res_t; Parameters
StateThe message is valid in states
New StateThe resulting state is unchanged. 4.4.8 Message DL_XID_CON (dl_xid_con_t)Conveys an XID DLSDU from the DLS Provider to the DLS User in response to a
Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_flag; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; ulong dl_src_addr_length; ulong dl_src_addr_offset; } dl_xid_con_t; Parameters
StateThe message is valid in states
New StateThe resulting state is unchanged. 4.5 Acknowledged Connectionless-mode Service PrimitivesThis section describes the primitives that support the acknowledged connectionless-mode service of the data link layer. These primitives support the acknowledged connectionless data transfer service described earlier. 4.5.1 Message DL_DATA_ACK_REQ (dl_data_ack_req_t)This request is passed to the Data Link Provider to request that a DLSDU be sent to a peer DLS User using acknowledged connectionless mode data unit transmission procedures. Message FormatConsists of one typedef struct { ulong dl_primitive; ulong dl_correlation; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; ulong dl_src_addr_length; ulong dl_src_addr_offset; ulong dl_priority; ulong dl_service_class; } dl_data_ack_req_t; Parameters
StateThis message is valid in state
New StateThe resulting state is unchanged. ResponseIf the request is erroneous, message
If the DLS Provider accepts the data for transmission, a
This indication will indicate the success or failure of the data transmission. Although the exchange service is connectionless, in-sequence delivery is guaranteed for data sent by the initiating station. Reasons for Failure
4.5.2 Message DL_DATA_ACK_IND (dl_data_ack_ind_t)Conveys one DLSDU from the DLS Provider to the DLS User. This primitive indicates the arrival of anon-null, non-duplicate DLSDU from a peer Data Link User entity. Message FormatConsists of one typedef struct { ulong dl_primitive; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; ulong dl_src_addr_length; ulong dl_src_addr_offset; ulong dl_priority; ulong dl_service_class; } dl_data_ack_ind_t; Parameters
StateThis message is valid in state
New StateThe resulting state is unchanged. 4.5.3 Message DL_DATA_ACK_STATUS_IND (dl_data_ack_status_ind_t)Conveys the results of the previous associated
Message FormatConsists of one typedef struct { ulong dl_primitive; ulong dl_correlation; ulong dl_status; } dl_data_ack_status_ind_t; Parameters
StateThis message is valid in state
New StateThe resulting state is unchanged. 4.5.4 Message DL_REPLY_REQ (dl_reply_req_t)This request primitive is passed to the DLS Provider by the DLS User to request that a DLSDU be returned from a peer DLS Provider or that DLSDUs be exchanged between stations using acknowledged connectionless mode data unit exchange procedures. Message FormatConsists of one typedef struct { ulong dl_primitive; ulong dl_correlation; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; ulong dl_src_addr_length; ulong dl_src_addr_offset; ulong dl_priority; ulong dl_service_class; } dl_reply_req_t; Parameters
StateThis primitive is valid in state
New StateThe resulting state is unchanged. ResponseIf the request is erroneous, message
Reasons for Failure
4.5.5 Message DL_REPLY_IND (dl_reply_ind_t)This primitive is the service indication primitive for the acknowledged connectionless-mode data unit exchange service. It is passed from the DLS Provider to the DLS User to indicate either a successful request of a DLSDU from the peer data link user entity, or exchange of DLSDUs with a peer data link user entity. Message FormatConsists of one typedef struct { ulong dl_primitive; ulong dl_dest_addr_length; ulong dl_dest_addr_offset; ulong dl_src_addr_length; ulong dl_src_addr_offset; ulong dl_priority; ulong dl_service_class; } dl_reply_ind_t; Parameters
StateThis primitive is valid in state
New StateThe resulting state is unchanged. 4.5.6 Message DL_REPLY_STATUS_IND (dl_reply_status_ind_t)This indication primitive is passed from the DLS Provider to the DLS User to indicate the success or failure of the previous associated acknowledged connectionless mode data unit exchange request. Message FormatConsists of one typedef struct { ulong dl_primitive; ulong dl_correlation; ulong dl_status; } dl_reply_status_ind_t; Parameters
StateThis primitive is valid in state
New StateThe resulting state is unchanged. 4.5.7 Message DL_REPLY_UPDATE_REQ (dl_reply_update_req_t)Conveys a DLSDU to the DLS Provider from the DLS User to be held by the DLS Provider and sent out At later time when requested to do so by the peer DLS Provider. Message FormatConsists of one typedef struct { ulong dl_primitive; ulong dl_correlation; ulong dl_src_addr_length; ulong dl_src_addr_offset; } dl_reply_update_req_t; Parameters
StateThis primitive is valid in state
New StateThe resulting state is unchanged. ResponseIf the request is erroneous, a
Reasons for failure
4.5.8 Message DL_REPLY_UPDATE_STATUS_IND (dl_reply_update_status_ind_t)This primitive is the service confirmation primitive for the reply data unit preparation service. This primitive is sent to the DL User from the DLS Provider to indicate the success or failure of the previous associated data unit preparation request. Message FormatConsists of one typedef struct { ulong dl_primitive; ulong dl_correlation; ulong dl_status; } dl_reply_update_req_t; Parameters
StateThis primitive is valid in state
New StateThe resulting state is unchanged. 5 Quality of Data Link ServiceThe quality of data link service is defined by the term "Quality of Service" (QoS), and describes certain characteristics of transmission between two DLS users. These characteristics are attributable solely to the DLS provider, but are observable by the DLS users. The visibility of QoS characteristics enables a DLS user to determine, and possibly negotiate, the characteristics of transmission needed to communicate with the remote DLS user. 5.1 Overview of Quality of ServiceQuality of service characteristics apply to both the connection and connectionless modes of service. The semantics for each mode are discussed below. 5.1.1 Connection-mode Service"Quality of Service" (QoS) refers to certain characteristics of a data link connection as observed between the connection endpoints. QoS describes the specific aspects of a data link connection that are attributable to the DLS provider. QoS is defined in terms of QoS parameters. The parameters give DLS users a means of specifying their needs. These parameters are divided into two groups, based on how their values are determined:
The QoS parameters that can be negotiated during connection establishment are: throughput, transit delay, priority, and protection. The QoS parameters for throughput and transit delay are negotiated end-to-end between the two DLS users and the DLS provider. The QoS parameters for priority and protection are negotiated locally by each DLS user with the DLS provider. The QoS parameters that cannot be negotiated are residual error rate and resilience. Procedures for QOS Negotiation and Selection, describes the rules for QoS negotiation. Once the connection is established, the agreed QoS values are not renegotiated
at any point. There is no guarantee by any DLS provider that the original
QoS
values will be maintained, and the DLS users are not informed if QoS changes.
The DLS provider also need only record those QoS values selected at connection
establishment for return in response to the
5.1.2 QOS for Connectionless-mode and Acknowledged Connectionless-mode ServiceThe QoS for connectionless-mode and acknowledged connectionless-mode
service refers to characteristics of the data link layer between two DLSAPs,
attributable to the DLS provider. The QoS applied to each
5.2 QOS Parameter DefinitionsThis section describes the quality of service parameters supported by DLPI for both connection-mode and connectionless-mode services. The following table summarizes the supported parameters. It indicates to which service mode (connection, connectionless, or both) the parameter applies. For those parameters supported by the connection-mode service, the table also indicates whether the parameter value is negotiated during connection establishment. If so, the table further indicates whether the QoS values are negotiated end-to-end among both DLS users and the DLS provider, or locally for each DLS user independently with the DLS provider. Table 1x. -
Parameter Service Mode Negotiation throughput connection end-to-end transit delay both end-to-end priority both local protection both local residual error rate both none resilience connection none 5.2.1 ThroughputThroughput is a connection-mode QoS parameter that has end-to-end
significance. It is defined as the total number of DLSDU bits
successfully transferred by a
Throughput is only meaningful for a sequence of complete DLSDUs. Throughput is specified and negotiated for the transmit and receive directions independently at connection establishment. The throughput specification defines the target and minimum acceptable values for a connection. Each specification is an average rate. The DLS user can delay the receipt or sending of DLSDUs. The delay caused by a DLS user is not included in calculating the average throughput values. Parameter Formattypedef struct { long dl_target_value; long dl_accept_value; } dl_through_t; This typedef is used to negotiate the transmit and receive throughput values.
5.2.2 Transit DelayConnection and connectionless modes can specify a transit delay, which indicates
the elapsed time between a
In connection mode, transit delay is negotiated on an end-to-end basis during
connection establishment. For each connection, transit delay is negotiated for
the transmit and receive directions separately by specifying the target value
and maximum acceptable value. For connectionless-mode service, a DLS user selects
a particular value within the supported range using the
Parameter Formattypedef struct { long dl_target_value; long dl_accept_value; } dl_transdelay_t; This typedef is used to negotiate the transmit and receive transit delay values.
5.2.3 PriorityPriority is negotiated locally between each DLS user and the DLS provider in connection-mode service, and can also be specified for connectionless-mode service. The specification of priority is concerned with the relationship between connections or the relationship between connectionless data transfer requests. The parameter specifies the relative importance of a connection with respect to:
For connectionless-mode service, the parameter specifies the relative importance of unitdata objects with respect to gaining use of shared resources. For connection-mode service, each DLS user negotiates a particular priority
value with the DLS provider during connection establishment. The value is
specified by a minimum and a maximum within a given range. For
connectionless-mode service, a DLS user selects a particular priority value
within the supported range using the
Parameter Formattypedef struct { long dl_min; long dl_max; } dl_priority_t;
5.2.4 ProtectionProtection is negotiated locally between each DLS user and the DLS provider in connection-mode service, and can also be specified for connectionless-mode service. Protection is the extent to which a DLS provider attempts to prevent unauthorized monitoring or manipulation of DLS user-originated information. Protection is specified by a minimum and maximum protection option within the following range of possible protection options:
For connection-mode service, each DLS user negotiates a particular value with
the DLS provider during connection establishment. The value is specified by a
minimum and a maximum within a given range. For connectionless-mode service, a
DLS user selects a particular value within the supported range using
the
Parameter Formattypedef struct { long dl_min; long dl_max; } dl_protect_t;
5.2.5 Residual Error RateResidual error rate is the ratio of total incorrect, lost and duplicate DLSDUs to the total DLSDUs transferred between DLS users during a period of time. The relationship between these quantities is defined below: DLSDUl + DLSDUi + DLSDUe RER = --------------------------- DLSDUtot where
Parameter Formatlong dl_residual_error; The residual error value is scaled by a factor of 1,000,000, since the parameter is stored as a long integer in the QoS data structures. Residual error rate is not a negotiated QoS parameter. Its value is determined by procedures outside the definition of DLPI. It is assumed to be set by an administrative mechanism, which is informed of the value by network management. 5.2.6 ResilienceResilience is meaningful in connection mode only, and represents the probability of either: DLS provider-initiated disconnects or DLS provider-initiated resets during a time interval of 10,000 seconds on a connection. Resilience is not a negotiated QoS parameter. Its value is determined by procedures outside the definition of DLPI. It is assumed to be set by an administrative mechanism, which is informed of the value by network management. Parameter Formattypedef struct { long dl_disc_prob; long dl_reset_prob; } dl_resilience_t;
5.3 QOS Data StructuresTo simplify the definition of the primitives containing QoS parameters
and the discussion of QoS negotiation, the QoS parameters
are organized into four structures. This section defines the structures and
indicates which structures apply to which primitives. Each structure is tagged
with a type field contained in the first four bytes of the structure, similar to
the tagging of primitives. The type field has been defined because of the
current volatility of QoS parameter definition within the
international standards bodies. If new QoS parameter sets are defined
in the future for the data link layer, the type field will enable DLPI to
accommodate these sets without breaking existing DLS user or provider
implementations. However, DLS user and provider software should be cognizant of
the possibility that new QoS structure types may be defined in future
issues of the DLPI specification. If a DLS provider receives a structure type
that it does not understand in a given primitive, the error Currently the following QoS structure types are defined:
The syntax and semantics of each structure type is presented in the remainder of this section. 5.3.1 Structure DL_QOS_CO_RANGE1Structure type
typedef struct { ulong dl_qos_type; dl_through_t dl_rcv_throughput; dl_transdelay_t dl_rcv_trans_delay; dl_through_t dl_xmt_throughput; dl_transdelay_t dl_xmt_trans_delay; dl_priority_t dl_priority; dl_protect_t dl_protection; long dl_residual_error; dl_resilience_t dl_resilience; } dl_qos_co_range1_t; where the value of dl_qos_type is
This structure type is returned in the dl_qos_range_length and
dl_qos_range_offset fields of the
For the
5.3.2 Structure DL_QOS_CO_SEL1Structure type
typedef struct { ulong dl_qos_type; long dl_rcv_throughput; long dl_rcv_trans_delay; long dl_xmt_throughput; long dl_xmt_trans_delay; long dl_priority; long dl_protection; long dl_residual_error; dl_resilience_t dl_resilience; } dl_qos_co_sel1_t; where the value of dl_qos_type is
This structure type is returned in the dl_qos_length and dl_qos_offset fields of
the
The structure type is used in the
5.3.3 Structure DL_QOS_CL_RANGE1Structure type
typedef struct { ulong dl_qos_type; dl_transdelay_t dl_trans_delay; dl_priority_t dl_priority; dl_protect_t dl_protection; long dl_residual_error; } dl_qos_cl_range1_t; where the value of dl_qos_type is
This structure type is returned in the dl_qos_range_length and
dl_qos_range_offset fields of the
5.3.4 Structure DL_QOS_CL_SEL1Structure type
typedef struct { ulong dl_qos_type; long dl_trans_delay; long dl_priority; long dl_protection; long dl_residual_error; } dl_qos_cl_sel1_t; where the value of dl_qos_type is
This structure type is returned in the dl_qos_length and dl_qos__offset fields
of the
5.4 Procedures for QOS Negotiation and SelectionThis section describes the methods used for negotiating and/or selecting QoS parameter values. In the connection-mode service, some QoS parameter values may be negotiated during connection establishment. For connectionless-mode service, parameter values may be selected for subsequent data transmission. Throughout this section, two special QoS values are referenced. These are defined for all the parameters used in QoS negotiation and selection. The values are:
These values are used to distinguish between DLS providers that support and negotiate QoS parameters and those that cannot. The following sections include the interpretation of these values during QoS negotiation and selection. 5.4.1 Connection-mode QOS NegotiationThe current connection-mode QoS parameters can be divided into three types as follows:
The rules for processing these three types of parameters during connection establishment are described in this section. The current definition of most existing data link protocols does not describe a mechanism for negotiating QoS parameters during connection establishment. As such, DLPI does not require every DLS provider implementation to support QoS negotiation. If a given DLS provider implementation cannot support QoS negotiation, two alternatives are available:
A DLS user need not select a specific value for each QoS parameter. The special
QoS parameter value,
If QoS parameters are supported by the DLS provider, the provider will define a
set of default QoS parameter values that are used whenever
DLS provider addendum documentation must describe the known ranges of support for the QoS parameters and the default values, and also specify whether they are used in a local manner only. The following procedures are used to negotiate QoS parameter values during connection establishment.
5.4.2 Connectionless-mode QOS SelectionThis section describes the procedures for selecting QoS parameter values that will be associated with the transmission of connectionless data or acknowledged connectionless data. As with connection-mode protocols, the current definition of most existing
(acknowledged) connectionless data link protocols does not define a quality of
service concept. As such, DLPI does not require every DLS provider
implementation to support QoS parameter selection. The DLS provider may specify
that any or all QoS parameters are unsupported. This is indicated to the DLS user
in the
If the DLS provider supports no QoS parameters, the QoS length fields in the
For each
At any point during data transfer, the DLS user may issue a
In the
Appendix A Optional Primitives to perform Essential Management FunctionsThis appendix presents the optional primitives to perform essential management functions. The management functions supported are get and set of physical address, and statistics gathering. A.1 Message DL_PHYS_ADDR_REQ (dl_phys_addr_req_t)This primitive requests the DLS provider to return either the default (factory) or the current value of the physical address associated with the stream depending upon the value of the address type selected in the request. Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_addr_type; } dl_phys_addr_req_t; Parameters
StateThe message is valid in any attached state in which a local acknowledgment is
not pending. For a style 2provider, this would be after a PPA is attached using
the
New StateThe resulting state is unchanged. ResponseThe provider responds to the request with a
Reasons for failure
A.2 Message DL_PHYS_ADDR_ACK (dl_phys_addr_ack_t)This primitive returns the value for the physical address to the link user in
response to a
Message FormatThe message consists of typedef struct { ulong dl_primitive; ulong dl_addr_length; ulong dl_addr_offset; } dl_phys_addr_ack_t; Parameters
StateThe message is valid in any state in response to a
New StateThe resulting state is unchanged. A.3 Message DL_SET_PHYS_ADDR_REQ (dl_set_phys_addr_req_t)Sets the physical address value for all streams for that provider for a particular PPA. Message FormatThe message consists of typedef struct { ulong dl_primitive; ulong dl_addr_length; ulong dl_addr_offset; } dl_set_phys_addr_req_t; Parameters
StateThe message is valid in any attached state in which a local acknowledgment is
not pending. For a Style 2provider, this would be after a PPA is attached using
the
New StateThe resulting state is unchanged ResponseThe provider responds to the request with a
Reasons for failure
A.4 Message DL_GET_STATISTICS_REQ (dl_get_statistics_req_t)Directs the DLS provider to return statistics Message FormatThe message consists of one typedef struct { ulong dl_primitive; } dl_get_statistics_req_t; Parameters
DL_GET_STATISTICS_REQ
StateThe message is valid in any state in which a local acknowledgment is not pending. New StateThe resulting state is unchanged ResponseThe DLS Provider responds to this request with a
Reasons for failure
A.5 Message DL_GET_STATISTICS_ACK (dl_get_statistics_ack_t)Returns statistics in response to the
Message FormatThe message consists of one typedef struct { ulong dl_primitive; ulong dl_stat_length; ulong dl_stat_offset; } dl_get_statistics_ack_t; Parameters
StateThe message is valid in any state in which a local acknowledgment is not pending. New StateThe resulting state is unchanged Appendix B Allowable Sequence of DLPI PrimitivesThis appendix presents the allowable sequence of DLPI primitives. The sequence is described using a state transition table that defines possible states as viewed by the DLS user. The state transition table describes transitions based on the current state of the interface and a given DLPI event. Each transition consists of a state change and possibly an interface action. The states, events, and related transition actions are described below, followed by the state transition table itself. B.1 DLPI StatesThe following table describes the states associated with DLPI. It presents the
state name used in the state transition table, the corresponding DLPI state name
used throughout this specification, a brief description of the state, and an
indication of whether the state is valid for connection-oriented data link
service
( Table 2a. DLPI States
Table 2b. DLPI States
Table 2c. DLPI States
B.2 Variables and Actions for State Transition TableThe following tables describe variables and actions used to describe the
DLPI
state transitions. The variables are used to distinguish various uses of the
same DLPI primitive. For example, a
Table 3. DPLI State Transition Table Variables
The actions represent steps the DLS provider must take during certain state transitions to maintain the interface state. When an action is indicated in the state transition table, the DLS provider should change the state as indicated and perform the specified action. Table 4. DPLI State Transition Actions
B.3 DLPI User-Originated EventsThe following table describes events initiated by the DLS user that correspond
to the various request and response primitives of DLPI. The table presents the
event name used in the state transition table, a brief description of the event
(including the corresponding DLPI primitive), and an indication of whether
the event is valid for connection-oriented data link service
( Table 5. DLPI User-Originated Events
B.4 DLPI Provider-Originated EventsThe following table describes the events initiated by the DLS provider that
correspond to the various indication, confirmation, and acknowledgment
primitives of DLPI. The table presents the event name used in the state
transition table, a brief description of the event (including the corresponding
DLPI primitive), and an indication of whether the event is valid for
connection-oriented data link service
( Table 6. DLPI Provider-Originated Events
B.5 DLPI State Transition TableTable 7, Table 8, Table 9 and Table 10 describe the DLPI state transitions. Each column represents a state of DLPI (Table 2a) and each row represents a DLPI event (Table 5 and Table 6). The intersecting transition cell defines the resulting state transition (i.e. next state) and associated actions, if any, that must be executed by the DLS provider to maintain the interface state. Each cell may contain the following: The
The following rules apply to the maintenance of DLPI state:
The following table presents the allowed sequence of DLPI primitives for the common local management phase of communication. Table 7. DLPI State Transition Table - Local Management Phase
The following table presents the allowed sequence of DLPI primitives for the connectionless data transfer phase. Table 8. DLPI State Transition Table - Connectionless-mode Data Transfer Phase
Table 9. DLPI State Transition Table - Acknowledged Connectionless-mode Data Transfer Phase
The following table presents the allowed sequence of DLPI primitives for the connection establishment phase of connection mode service. Table 10. DLPI State Transition Table - Connection Establishment Phase
The following table presents the allowed sequence of DLPI primitives for the connection mode data transfer phase. Table 11. DLPI State Transition Table - Connection-mode Data Transfer Phase
Appendix C Precedence of DLPI PrimitivesThis appendix presents the precedence of DLPI primitives relative to one another. Two queues are used to describe DLPI precedence rules. One queue contains DLS user-originated primitives and corresponds to the STREAMS write queue of the DLS provider. The other queue contains DLS provider-originated primitives and corresponds to the STREAMS read queue of the DLS user. The DLS provider is responsible for determining precedence on its write queue and the DLS user is responsible for determining precedence on its read queue as indicated in the precedence tables below. For each precedence table, the rows (labeled PRIM X) correspond to primitives that are on the given queue and the columns (labeled PRIM Y) correspond to primitives that are about to be placed on that queue. Each pair of primitives (PRIM X, PRIM Y) may be manipulated resulting in:
C.1 Write Queue PrecedenceThe following table presents the precedence rules for DLS user-originated primitives on the DLS provider's STREAMS write queue. It assumes that only non-local primitives (i.e. those that generate protocol data units to a peer DLS user) are queued by the DLS provider. For connection establishment primitives, this table represents the possible pairs of DLPI primitives when connect indications/responses are single-threaded. For the multi-threading scenario, the following rules apply:
Table 12. Write Queue Precedence
C.2 Read Queue PrecedenceThe following table presents the precedence rules for DLS provider-originated primitives on the DLS user's STREAMS read queue. For connection establishment primitives, this table represents the possible pairs of DLPI primitives when connect indications/responses are single-threaded. For the multi-threading scenario, the following rules apply:
If the DLS user is a user-level process, it's read queue is the stream head read
queue. Because a user process has no control over the placement of DLS
primitives on the stream head read queue, a DLS user cannot straightforwardly
initiate the actions specified in the following precedence table. Except for
the connection
establishment scenario, the DLS user can ignore the precedence rules defined in
the table below. This is equivalent to saying the DLS user's read queue
contains at most one primitive. The only exception to this rule is the
processing of connect indication/response primitives. A problem arises if a
user issues a When connect indications/responses are single-threaded, a non-empty read queue
can only contain a Table 13. Read Queue Precedence
Appendix D Glossary of DLPI Terms and AcronymsD.1 AcronymsThe following acronyms apply to the Data Link Provider Interface:
D.2 TermsThe following terms apply to the Data Link Provider Interface:
Appendix E Guidelines for Protocol Independent DLS UsersDLPI enables a DLS user to be implemented in a protocol-independent manner such that the DLS user can operate over many DLS providers without changing the DLS user software. DLS user implementors must adhere to the following guidelines, however, to achieve this independence.
Appendix F Required Information for DLS Provider-Specific AddendaDLPI is a general interface to the services of any DLS provider. However, areas have been documented in this specification where DLS provider-specific information can be conveyed and interpreted. This appendix summarizes all provider-specific issues as an aid to developers of DLS provider implementations. As such, it forms a checklist of required information that should be documented in some manner as part of the provider implementation. The areas DLS provider-specific addendum documentation must address are:
For each area listed, a brief description of the provider-specific item(s) associated with it will be presented, including references to the appropriate section in this specification. DLSAP Address Space (Sections 2.3.2 and 4.1.6) The format of a DLSAP address is
specific to each DLS provider, as is the management of that address space.
There are no restriction on the format or style of a DLSAP address. As such, a
specific implementation should document the format, size, and restrictions of a
DLSAP address, as well as information on how the address space is managed. For
example, DLPI enables a DLS user to choose a specific DLSAP address to be bound
to a stream, but a given implementation may pre-associate addresses with streams
based, for example, on the major/minor device number of the stream. In this
case, the DLS user could only retrieve the address associated with a stream. If
the DLS provider enables a user to select the DLSAP address for a stream, the
implementation must document the contents of the dl_sap field in the
Another aspect of address management is whether the provider supports the
ability to dynamically allocate DLSAPs other than the requested DLSAP in a
Subsequent DLSAP Addresses (Section 4.1.9) The IEEE 802.2 link layer standard allows two ways of specifying a DLSAP value:
IEEE 802.1 has defined a third way of assigning DLSAP values that will allow for
unique private protocol de-multiplexing. The PPA Access and Control (Sections 2.3.1 and 4.1.1) A physical point of attachment (PPA) is referenced in DLPI by a PPA identifier, which is of type 'ulong'. The format of this identifier is provider-specific. The DLS provider addendum documentation should describe the format and generation of PPA identifiers for all physical media it is expected to control. It should also describe how a PPA is controlled, the capabilities of the PPA, the number of PPAs supported, and the administrative interface. Multiplexing capabilities of a PPA should also be described in the DLS provider addendum documentation. This conveys information on the number of DLSAPs that may be supported per PPA, and the number of PPAs supported. Another item that should be described is the manner in which a PPA is initialized. Section 4.1.1, PPA Initialization/De-initialization, presents the alternative methods supported by DLPI for initializing a PPA. The interactions of auto-initialization or pre-initialization with the Attach and Bind services should be discussed, and the following items should be addressed.
Quality of Service (Section 5) Support of QoS parameter negotiation and selection is a provider-specific issue that must be described for each implementation. The DLS provider addendum documentation should describe which, if any, QoS parameters are supported by the provider. For parameters that are negotiated end-to-end, the addendum should describe whether the provider supports end-to-end negotiation, or whether these parameters are negotiated in a local manner only. Finally, default QoS parameter values should be documented.
Supported Services (Section 3)
The overall services that a specific DLS provider supports should be described.
These include whether a provider supports connection-mode service,
connectionless-mode service (acknowledged or OSI Work Group unacknowledged), or
both, and how a DLS user selects the appropriate mode. For example, the mode
maybe mapped directly to a specific major/minor device, and the user selects an
appropriate mode by opening the corresponding special file. Alternatively, a
DLS provider that supports both modes may enable a DLS user to select the
service mode on the The file name(s) used to access a particular DLS provider and/or specific service modes of that provider must also be documented. Appendix G DLPI Header FileThis appendix contains a listing of the DLPI header file needed by implementations of both DLS user and DLS provider software. #ifndef _SYS_DLPI_H #define _SYS_DLPI_H /* * dlpi.h header for Data Link Provider Interface */ /* * This header file has encoded the values so an existing driver * or user which was written with the Logical Link Interface(LLI) * can migrate to the DLPI interface in a binary compatible manner. * Any fields which require a specific format or value are flagged * with a comment containing the message LLI compatibility. */ /* * DLPI revision definition history */ #define DL_CURRENT_VERSION 0x02 /* current version of dlpi */ #define DL_VERSION_2 0x02 /* version of dlpi March 12,1991 */ /* * Primitives for Local Management Services */ #define DL_INFO_REQ 0x00 /* Information Req, LLI compatibility */ #define DL_INFO_ACK 0x03 /* Information Ack, LLI compatibility */ #define DL_ATTACH_REQ 0x0b /* Attach a PPA */ #define DL_DETACH_REQ 0x0c /* Detach a PPA */ #define DL_BIND_REQ 0x01 /* Bind dlsap address, LLI compatibility */ #define DL_BIND_ACK 0x04 /* Dlsap address bound, LLI compatibility */ #define DL_UNBIND_REQ 0x02 /* Unbind dlsap address, LLI compatibility */ #define DL_OK_ACK 0x06 /* Success acknowledgment, LLI compatibility */ #define DL_ERROR_ACK 0x05 /* Error acknowledgment, LLI compatibility */ #define DL_SUBS_BIND_REQ 0x1b /* Bind Subsequent DLSAP address */ #define DL_SUBS_BIND_ACK 0x1c /* Subsequent DLSAP address bound */ #define DL_SUBS_UNBIND_REQ 0x15 /* Subsequent unbind */ #define DL_ENABMULTI_REQ 0x1d /* Enable multicast addresses */ #define DL_DISABMULTI_REQ 0x1e /* Disable multicast addresses */ #define DL_PROMISCON_REQ 0x1f /* Turn on promiscuous mode */ #define DL_PROMISCOFF_REQ 0x20 /* Turn off promiscuous mode */ /* * Primitives used for Connectionless Service */ #define DL_UNITDATA_REQ 0x07 /* datagram send request, LLI compatibility */ #define DL_UNITDATA_IND 0x08 /* datagram receive indication, LLI compatibility */ #define DL_UDERROR_IND 0x09 /* datagram error indication, LLI compatibility */ #define DL_UDQOS_REQ 0x0a /* set QOS for subsequent datagram transmissions */ /* * Primitives used for Connection-Oriented Service */ #define DL_CONNECT_REQ 0x0d /* Connect request */ #define DL_CONNECT_IND 0x0e /* Incoming connect indication */ #define DL_CONNECT_RES 0x0f /* Accept previous connect indication */ #define DL_CONNECT_CON 0x10 /* Connection established */ #define DL_TOKEN_REQ 0x11 /* Passoff token request */ #define DL_TOKEN_ACK 0x12 /* Passoff token ack */ #define DL_DISCONNECT_REQ 0x13 /* Disconnect request */ #define DL_DISCONNECT_IND 0x14 /* Disconnect indication */ #define DL_RESET_REQ 0x17 /* Reset service request */ #define DL_RESET_IND 0x18 /* Incoming reset indication */ #define DL_RESET_RES 0x19 /* Complete reset processing */ #define DL_RESET_CON 0x1a /* Reset processing complete */ /* * Primitives used for Acknowledged Connectionless Service */ #define DL_DATA_ACK_REQ 0x21 /* data unit transmission request */ #define DL_DATA_ACK_IND 0x22 /* Arrival of a command PDU */ #define DL_DATA_ACK_STATUS_IND 0x23 /* Status indication of DATA_ACK_REQ */ #define DL_REPLY_REQ 0x24 /* Request a DLSDU from the remote */ #define DL_REPLY_IND 0x25 /* Arrival of a command PDU */ #define DL_REPLY_STATUS_IND 0x26 /* Status indication of REPLY_REQ */ #define DL_REPLY_UPDATE_REQ 0x27 /* Hold a DLSDU for transmission */ #define DL_REPLY_UPDATE_STATUS_IND 0x28 /* Status of REPLY_UPDATE req */ /* * Primitives used for XID and TEST operations */ #define DL_XID_REQ 0x29 /* Request to send an XID PDU */ #define DL_XID_IND 0x2a /* Arrival of an XID PDU */ #define DL_XID_RES 0x2b /* request to send a response XID PDU */ #define DL_XID_CON 0x2c /* Arrival of a response XID PDU */ #define DL_TEST_REQ 0x2d /* TEST command request */ #define DL_TEST_IND 0x2e /* TEST response indication */ #define DL_TEST_RES 0x2f /* TEST response */ #define DL_TEST_CON 0x30 /* TEST Confirmation */ /* * Primitives to get and set the physical address, and to get * Statistics */ #define DL_PHYS_ADDR_REQ 0x31 /* Request to get physical addr */ #define DL_PHYS_ADDR_ACK 0x32 /* Return physical addr */ #define DL_SET_PHYS_ADDR_REQ 0x33 /* set physical addr */ #define DL_GET_STATISTICS_REQ 0x34 /* Request to get statistics */ #define DL_GET_STATISTICS_ACK 0x35 /* Return statistics */ /* * DLPI interface states */ #define DL_UNATTACHED 0x04 /* PPA not attached */ #define DL_ATTACH_PENDING 0x05 /* Waiting ack of DL_ATTACH_REQ */ #define DL_DETACH_PENDING 0x06 /* Waiting ack of DL_DETACH_REQ */ #define DL_UNBOUND 0x00 /* PPA attached, LLI compatibility */ #define DL_BIND_PENDING 0x01 /* Waiting ack of DL_BIND_REQ, LLI compatibility */ #define DL_UNBIND_PENDING 0x02 /* Waiting ack of DL_UNBIND_REQ, LLI compatibility */ #define DL_IDLE 0x03 /* dlsap bound, awaiting use, LLI compatibility */ #define DL_UDQOS_PENDING 0x07 /* Waiting ack of DL_UDQOS_REQ */ #define DL_OUTCON_PENDING 0x08 /* outgoing connection, awaiting DL_CONN_CON */ #define DL_INCON_PENDING 0x09 /* incoming connection, awaiting DL_CONN_RES */ #define DL_CONN_RES_PENDING 0x0a /* Waiting ack of DL_CONNECT_RES */ #define DL_DATAXFER 0x0b /* connection-oriented data transfer */ #define DL_USER_RESET_PENDING 0x0c /* user initiated reset, awaiting DL_RESET_CON */ #define DL_PROV_RESET_PENDING 0x0d /* provider initiated reset, awaiting DL_RESET_RES */ #define DL_RESET_RES_PENDING 0x0e /* Waiting ack of DL_RESET_RES */ #define DL_DISCON8_PENDING 0x0f /* Waiting ack of DL_DISC_REQ when in DL_OUTCON_PENDING */ #define DL_DISCON9_PENDING 0x10 /* Waiting ack of DL_DISC_REQ when in DL_INCON_PENDING */ #define DL_DISCON11_PENDING 0x11 /* Waiting ack of DL_DISC_REQ when in DL_DATAXFER */ #define DL_DISCON12_PENDING 0x12 /* Waiting ack of DL_DISC_REQ when in DL_USER_RESET_PENDING */ #define DL_DISCON13_PENDING 0x13 /* Waiting ack of DL_DISC_REQ when in DL_PROV_RESET_PENDING */ #define DL_SUBS_BIND_PND 0x14 /* Waiting ack of DL_SUBS_BIND_REQ */ #define DL_SUBS_UNBIND_PND 0x15 /* Waiting ack of DL_SUBS_UNBIND_REQ */ /* * DL_ERROR_ACK error return values * */ #define DL_ACCESS 0x02 /* Improper permissions for request, LLI compatibility */ #define DL_BADADDR 0x01 /* DLSAP address in improper format or invalid */ #define DL_BADCORR 0x05 /* Sequence number not from outstanding DL_CONN_IND */ #define DL_BADDATA 0x06 /* User data exceeded provider limit */ #define DL_BADPPA 0x08 /* Specified PPA was invalid */ #define DL_BADPRIM 0x09 /* Primitive received is not known by DLS provider */ #define DL_BADQOSPARAM 0x0a /* QOS parameters contained invalid values */ #define DL_BADQOSTYPE 0x0b /* QOS structure type is unknown or unsupported */ #define DL_BADSAP 0x00 /* Bad LSAP selector, LLI compatibility */ #define DL_BADTOKEN 0x0c /* Token used not associated with an active stream */ #define DL_BOUND 0x0d /* Attempted second bind with dl_max_conind or */ /* dl_conn_mgmt > 0 on same DLSAP or PPA */ #define DL_INITFAILED 0x0e /* Physical Link initialization failed */ #define DL_NOADDR 0x0f /* Provider couldn't allocate alternate address */ #define DL_NOTINIT 0x10 /* Physical Link not initialized */ #define DL_OUTSTATE 0x03 /* Primitive issued in improper state, LLI compatibility */ #define DL_SYSERR 0x04 /* UNIX system error occurred, LLI compatibility */ #define DL_UNSUPPORTED 0x07 /* Requested service not supplied by provider */ #define DL_UNDELIVERABLE 0x11 /* Previous data unit could not be delivered */ #define DL_NOTSUPPORTED 0x12 /* Primitive is known but not supported by DLS provider */ #define DL_TOOMANY 0x13 /* limit exceeded */ #define DL_NOTENAB 0x14 /* Promiscuous mode not enabled */ #define DL_BUSY 0x15 /* Other streams for a particular PPA in the post-attached state */ #define DL_NOAUTO 0x16 /* Automatic handling of XID & TEST responses not supported */ #define DL_NOXIDAUTO 0x17 /* Automatic handling of XID not supported */ #define DL_NOTESTAUTO 0x18 /* Automatic handling of TEST not supported */ #define DL_XIDAUTO 0x19 /* Automatic handling of XID response */ #define DL_TESTAUTO 0x1a /* AUtomatic handling of TEST response */ #define DL_PENDING 0x1b /* pending outstanding connect indications */ /* * NOTE: The range of error codes, 0x80 - 0xff is reserved for * implementation specific error codes. This reserved range of error * codes will be defined by the DLS Provider. */ /* * DLPI media types supported */ #define DL_CSMACD 0x0 /* IEEE 802.3 CSMA/CD network, LLI Compatibility */ #define DL_TPB 0x1 /* IEEE 802.4 Token Passing Bus, LLI Compatibility */ #define DL_TPR 0x2 /* IEEE 802.5 Token Passing Ring, LLI Compatibility */ #define DL_METRO 0x3 /* IEEE 802.6 Metro Net, LLI Compatibility */ #define DL_ETHER 0x4 /* Ethernet Bus, LLI Compatibility */ #define DL_HDLC 0x05 /* ISO HDLC protocol support, bit synchronous */ #define DL_CHAR 0x06 /* Character Synchronous protocol support, eg BISYNC */ #define DL_CTCA 0x07 /* IBM Channel-to-Channel Adapter */ #define DL_FDDI 0x08 /* Fiber Distributed data interface */ #define DL_OTHER 0x09 /* Any other medium not listed above */ /* * DLPI provider service supported. * These must be allowed to be bitwise-OR for dl_service_mode in * DL_INFO_ACK. */ #define DL_CODLS 0x01 /* support connection-oriented service */ #define DL_CLDLS 0x02 /* support connectionless data link service */ #define DL_ACLDLS 0x04 /* support acknowledged connectionless service */ /* * DLPI provider style. * The DLPI provider style which determines whether a provider * requires a DL_ATTACH_REQ to inform the provider which PPA * user messages should be sent/received on. */ #define DL_STYLE1 0x0500 /* PPA is implicitly bound by open(2) */ #define DL_STYLE2 0x0501 /* PPA must be explicitly bound via DL_ATTACH_REQ */ /* * DLPI Originator for Disconnect and Resets */ #define DL_PROVIDER 0x0700 #define DL_USER 0x0701 /* * DLPI Disconnect Reasons */ #define DL_CONREJ_DEST_UNKNOWN 0x0800 #define DL_CONREJ_DEST_UNREACH_PERMANENT 0x0801 #define DL_CONREJ_DEST_UNREACH_TRANSIENT 0x0802 #define DL_CONREJ_QOS_UNAVAIL_PERMANENT 0x0803 #define DL_CONREJ_QOS_UNAVAIL_TRANSIENT 0x0804 #define DL_CONREJ_PERMANENT_COND 0x0805 #define DL_CONREJ_TRANSIENT_COND 0x0806 #define DL_DISC_ABNORMAL_CONDITION 0x0807 #define DL_DISC_NORMAL_CONDITION 0x0808 #define DL_DISC_PERMANENT_CONDITION 0x0809 #define DL_DISC_TRANSIENT_CONDITION 0x080a #define DL_DISC_UNSPECIFIED 0x080b /* * DLPI Reset Reasons */ #define DL_RESET_FLOW_CONTROL 0x0900 #define DL_RESET_LINK_ERROR 0x0901 #define DL_RESET_RESYNCH 0x0902 /* * DLPI status values for acknowledged connectionless data transfer */ #define DL_CMD_MASK 0x0f /* mask for command portion of status */ #define DL_CMD_OK 0x00 /* Command Accepted */ #define DL_CMD_RS 0x01 /* Unimplemented or inactivated service */ #define DL_CMD_UE 0x05 /* Data Link User interface error */ #define DL_CMD_PE 0x06 /* Protocol error */ #define DL_CMD_IP 0x07 /* Permanent implementation dependent error */ #define DL_CMD_UN 0x09 /* Resources temporarily unavailable */ #define DL_CMD_IT 0x0f /* Temporary implementation dependent error */ #define DL_RSP_MASK 0xf0 /* mask for response portion of status */ #define DL_RSP_OK 0x00 /* Response DLSDU present */ #define DL_RSP_RS 0x10 /* Unimplemented or inactivated service */ #define DL_RSP_NE 0x30 /* Response DLSDU never submitted */ #define DL_RSP_NR 0x40 /* Response DLSDU not requested */ #define DL_RSP_UE 0x50 /* Data Link User interface error */ #define DL_RSP_IP 0x70 /* Permanent implementation dependent error */ #define DL_RSP_UN 0x90 /* Resources temporarily unavailable */ #define DL_RSP_IT 0xf0 /* Temporary implementation dependent error */ /* * Service Class values for acknowledged connectionless data transfer */ #define DL_RQST_RSP 0x01 /* Use acknowledge capability in MAC sublayer */ #define DL_RQST_NORSP 0x02 /* No acknowledgment service requested */ /* * DLPI address type definition */ #define DL_FACT_PHYS_ADDR 0x01 /* factory physical address */ #define DL_CURR_PHYS_ADDR 0x02 /* current physical address */ /* * DLPI flag definitions */ #define DL_POLL_FINAL 0x01 /* if set, indicates poll/final bit set */ /* * XID and TEST responses supported by the provider */ #define DL_AUTO_XID 0x01 /* provider will respond to XID */ #define DL_AUTO_TEST 0x02 /* provider will respond to TEST */ /* * Subsequent bind type */ #define DL_PEER_BIND 0x01 /* subsequent bind on a peer addr */ #define DL_HIERARCHICAL_BIND 0x02 /* subs_bind on a hierarchical addr */ /* * DLPI promiscuous mode definitions */ #define DL_PROMISC_PHYS 0x01 /* promiscuous mode at phys level */ #define DL_PROMISC_SAP 0x02 /* promiscuous mode at sap level */ #define DL_PROMISC_MULTI 0x03 /* promiscuous mode for multicast */ /* * DLPI Quality Of Service definition for use in QOS structure definitions. * The QOS structures are used in connection establishment, DL_INFO_ACK, * and setting connectionless QOS values. */ /* * Throughput * * This parameter is specified for both directions. */ typedef struct { long dl_target_value; /* desired bits/second desired */ long dl_accept_value; /* min. acceptable bits/second */ } dl_through_t; /* * transit delay specification * * This parameter is specified for both directions. * expressed in milliseconds assuming a DLSDU size of 128 octets. * The scaling of the value to the current DLSDU size is provider dependent. */ typedef struct { long dl_target_value; /* desired value of service */ long dl_accept_value; /* min. acceptable value of service */ } dl_transdelay_t; /* * priority specification * priority range is 0-100, with 0 being highest value. */ typedef struct { long dl_min; long dl_max; } dl_priority_t; /* * protection specification * */ #define DL_NONE 0x0B01 /* no protection supplied */ #define DL_MONITOR 0x0B02 /* protection against passive monitoring */ #define DL_MAXIMUM 0x0B03 /* protection against modification, replay, */ /* addition, or deletion */ typedef struct { long dl_min; long dl_max; } dl_protect_t; /* * Resilience specification * probabilities are scaled by a factor of 10,000 with a time interval * of 10,000 seconds. */ typedef struct { long dl_disc_prob; /* probability of provider init DISC */ long dl_reset_prob; /* probability of provider init RESET */ } dl_resilience_t; /* * QOS type definition to be used for negotiation with the * remote end of a connection, or a connectionless unitdata request. * There are two type definitions to handle the negotiation * process at connection establishment. The typedef dl_qos_range_t * is used to present a range for parameters. This is used * in the DL_CONNECT_REQ and DL_CONNECT_IND messages. The typedef * dl_qos_sel_t is used to select a specific value for the QOS * parameters. This is used in the DL_CONNECT_RES, DL_CONNECT_CON, * and DL_INFO_ACK messages to define the selected QOS parameters * for a connection. * * NOTE * A Data Link provider which has unknown values for any of the fields * will use a value of DL_UNKNOWN for all values in the fields. * * NOTE * A QOS parameter value of DL_QOS_DONT_CARE informs the DLS * provider the user requesting this value doesn't care * what the QOS parameter is set to. This value becomes the * least possible value in the range of QOS parameters. * The order of the QOS parameter range is then: * * DL_QOS_DONT_CARE < 0 < MAXIMUM QOS VALUE */ #define DL_UNKNOWN -1 #define DL_QOS_DONT_CARE -2 /* * Every QOS structure has the first 4 bytes containing a type * field, denoting the definition of the rest of the structure. * This is used in the same manner has the dl_primitive variable * is in messages. * * The following list is the defined QOS structure type values and structures. */ #define DL_QOS_CO_RANGE1 0x0101 /* QOS range struct. for Connection mode service */ #define DL_QOS_CO_SEL1 0x0102 /* QOS selection structure */ #define DL_QOS_CL_RANGE1 0x0103 /* QOS range struct. for connectionless*/ #define DL_QOS_CL_SEL1 0x0104 /* QOS selection for connectionless mode*/ typedef struct { ulong dl_qos_type; dl_through_t dl_rcv_throughput; /* desired and acceptable */ dl_transdelay_t dl_rcv_trans_delay; /* desired and acceptable */ dl_through_t dl_xmt_throughput; dl_transdelay_t dl_xmt_trans_delay; dl_priority_t dl_priority; /* min and max values */ dl_protect_t dl_protection; /* min and max values */ long dl_residual_error; dl_resilience_t dl_resilience; } dl_qos_co_range1_t; typedef struct { ulong dl_qos_type; long dl_rcv_throughput; long dl_rcv_trans_delay; long dl_xmt_throughput; long dl_xmt_trans_delay; long dl_priority; long dl_protection; long dl_residual_error; dl_resilience_t dl_resilience; } dl_qos_co_sel1_t; typedef struct { ulong dl_qos_type; dl_transdelay_t dl_trans_delay; dl_priority_t dl_priority; dl_protect_t dl_protection; long dl_residual_error; } dl_qos_cl_range1_t; typedef struct { ulong dl_qos_type; long dl_trans_delay; long dl_priority; long dl_protection; long dl_residual_error; } dl_qos_cl_sel1_t; /* * DLPI interface primitive definitions. * * Each primitive is sent as a stream message. It is possible that * the messages may be viewed as a sequence of bytes that have the * following form without any padding. The structure definition * of the following messages may have to change depending on the * underlying hardware architecture and crossing of a hardware * boundary with a different hardware architecture. * * Fields in the primitives having a name of the form * dl_reserved cannot be used and have the value of * binary zero, no bits turned on. * * Each message has the name defined followed by the * stream message type (M_PROTO, M_PCPROTO, M_DATA) */ /* * LOCAL MANAGEMENT SERVICE PRIMITIVES */ /* * DL_INFO_REQ, M_PCPROTO type */ typedef struct { ulong dl_primitive; /* set to DL_INFO_REQ */ } dl_info_req_t; /* * DL_INFO_ACK, M_PCPROTO type */ typedef struct { ulong dl_primitive; /* set to DL_INFO_ACK */ ulong dl_max_sdu; /* Max bytes in a DLSDU */ ulong dl_min_sdu; /* Min bytes in a DLSDU */ ulong dl_addr_length; /* length of DLSAP address */ ulong dl_mac_type; /* type of medium supported */ ulong dl_reserved; /* value set to zero */ ulong dl_current_state; /* state of DLPI interface */ long dl_sap_length; /* current length of SAP part of dlsap address */ ulong dl_service_mode; /* CO, CL or ACL */ ulong dl_qos_length; /* length of qos values */ ulong dl_qos_offset; /* offset from beg. of block */ ulong dl_qos_range_length; /* available range of qos */ ulong dl_qos_range_offset; /* offset from beg. of block */ ulong dl_provider_style; /* style1 or style2 */ ulong dl_addr_offset; /* offset of the dlsap addr */ ulong dl_version; /* version number */ ulong dl_brdcst_addr_length; /* length of broadcast addr */ ulong dl_brdcst_addr_offset; /* offset from beg. of block */ ulong dl_growth; /* set to zero */ } dl_info_ack_t; /* * DL_ATTACH_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* set to DL_ATTACH_REQ */ ulong dl_ppa; /* id of the PPA */ } dl_attach_req_t; /* * DL_DETACH_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* set to DL_DETACH_REQ */ } dl_detach_req_t; /* * DL_BIND_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* set to DL_BIND_REQ */ ulong dl_sap; /* info to identify dlsap addr */ ulong dl_max_conind; /* max # of outstanding con_ind */ ushort dl_service_mode; /* CO, CL or ACL */ ushort dl_conn_mgmt; /* if non-zero, is con-mgmt stream */ ulong dl_xidtest_flg; /* if set to 1 indicates automatic initiation of test and xid frames */ } dl_bind_req_t; /* * DL_BIND_ACK, M_PCPROTO type */ typedef struct { ulong dl_primitive; /* DL_BIND_ACK */ ulong dl_sap; /* DLSAP addr info */ ulong dl_addr_length; /* length of complete DLSAP addr */ ulong dl_addr_offset; /* offset from beginning of M_PCPROTO */ ulong dl_max_conind; /* allowed max. # of con-ind */ ulong dl_xidtest_flg; /* responses supported by provider */ } dl_bind_ack_t; /* * DL_SUBS_BIND_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_SUBS_BIND_REQ */ ulong dl_subs_sap_offset; /* offset of subs_sap */ ulong dl_subs_sap_length; /* length of subs_sap */ ulong dl_subs_bind_class; /* peer or hierarchical */ } dl_subs_bind_req_t; /* * DL_SUBS_BIND_ACK, M_PCPROTO type */ typedef struct { ulong dl_primitive; /* DL_SUBS_BIND_ACK */ ulong dl_subs_sap_offset; /* offset of subs_sap */ ulong dl_subs_sap_length; /* length of subs_sap */ } dl_subs_bind_ack_t; /* * DL_UNBIND_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_UNBIND_REQ */ } dl_unbind_req_t; /* * DL_SUBS_UNBIND_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_SUBS_UNBIND_REQ */ ulong dl_subs_sap_offset; /* offset of subs_sap */ ulong dl_subs_sap_length; /* length of subs_sap */ } dl_subs_unbind_req_t; /* * DL_OK_ACK, M_PCPROTO type */ typedef struct { ulong dl_primitive; /* DL_OK_ACK */ ulong dl_correct_primitive; /* primitive being acknowledged */ } dl_ok_ack_t; /* * DL_ERROR_ACK, M_PCPROTO type */ typedef struct { ulong dl_primitive; /* DL_ERROR_ACK */ ulong dl_error_primitive; /* primitive in error */ ulong dl_errno; /* DLPI error code */ ulong dl_unix_errno; /* UNIX system error code */ } dl_error_ack_t; /* * DL_ENABMULTI_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_ENABMULTI_REQ */ ulong dl_addr_length; /* length of multicast address */ ulong dl_addr_offset; /* offset from beg. of M_PROTO block */ } dl_enabmulti_req_t; /* * DL_DISABMULTI_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_DISABMULTI_REQ */ ulong dl_addr_length; /* length of multicast address */ ulong dl_addr_offset; /* offset from beg. of M_PROTO block */ } dl_disabmulti_req_t; /* * DL_PROMISCON_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_PROMISCON_REQ */ ulong dl_level; /* physical, SAP level or ALL multicast */ } dl_promiscon_req_t; /* * DL_PROMISCOFF_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_PROMISCOFF_REQ */ ulong dl_level; /* Physical, SAP level or ALL multicast */ } dl_promiscoff_req_t; /* * Primitives to get and set the Physical address */ /* * DL_PHYS_ADDR_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_PHYS_ADDR_REQ */ ulong dl_addr_type; /* factory or current physical addr */ } dl_phys_addr_req_t; /* * DL_PHYS_ADDR_ACK, M_PCPROTO type */ typedef struct { ulong dl_primitive; /* DL_PHYS_ADDR_ACK */ ulong dl_addr_length; /* length of the physical addr */ ulong dl_addr_offset; /* offset from beg. of block */ } dl_phys_addr_ack_t; /* * DL_SET_PHYS_ADDR_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_SET_PHYS_ADDR_REQ */ ulong dl_addr_length; /* length of physical addr */ ulong dl_addr_offset; /* offset from beg. of block */ } dl_set_phys_addr_req_t; /* * Primitives to get statistics */ /* * DL_GET_STATISTICS_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_GET_STATISTICS_REQ */ } dl_get_statistics_req_t; /* * DL_GET_STATISTICS_ACK, M_PCPROTO type */ typedef struct { ulong dl_primitive; /* DL_GET_STATISTICS_ACK */ ulong dl_stat_length; /* length of statistics structure */ ulong dl_stat_offset; /* offset from beg. of block */ } dl_get_statistics_ack_t; /* * CONNECTION-ORIENTED SERVICE PRIMITIVES */ /* * DL_CONNECT_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_CONNECT_REQ */ ulong dl_dest_addr_length; /* len. of dlsap addr */ ulong dl_dest_addr_offset; /* offset */ ulong dl_qos_length; /* len. of QOS parm val */ ulong dl_qos_offset; /* offset */ ulong dl_growth; /* set to zero */ } dl_connect_req_t; /* * DL_CONNECT_IND, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_CONNECT_IND */ ulong dl_correlation; /* provider's correlation token */ ulong dl_called_addr_length; /* length of called address */ ulong dl_called_addr_offset; /* offset from beginning of block */ ulong dl_calling_addr_length; /* length of calling address */ ulong dl_calling_addr_offset; /* offset from beginning of block */ ulong dl_qos_length; /* length of qos structure */ ulong dl_qos_offset; /* offset from beginning of block */ ulong dl_growth; /* set to zero */ } dl_connect_ind_t; /* * DL_CONNECT_RES, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_CONNECT_RES */ ulong dl_correlation; /* provider's correlation token */ ulong dl_resp_token; /* token associated with responding stream */ ulong dl_qos_length; /* length of qos structure ulong dl_qos_offset; /* offset from beginning of block */ ulong dl_growth; /* set to zero */ } dl_connect_res_t; /* * DL_CONNECT_CON, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_CONNECT_CON */ ulong dl_resp_addr_length; /* length of responder's address */ ulong dl_resp_addr_offset; /* offset from beginning of block */ ulong dl_qos_length; /* length of qos structure */ ulong dl_qos_offset; /* offset from beginning of block */ ulong dl_growth; /* set to zero */ } dl_connect_con_t; /* * DL_TOKEN_REQ, M_PCPROTO type */ typedef struct { ulong dl_primitive; /* DL_TOKEN_REQ */ } dl_token_req_t; /* * DL_TOKEN_ACK, M_PCPROTO type */ typedef struct { ulong dl_primitive; /* DL_TOKEN_ACK */ ulong dl_token; /* Connection response token associated with the stream */ } dl_token_ack_t; /* * DL_DISCONNECT_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_DISCONNECT_REQ */ ulong dl_reason; /* normal, abnormal, perm. or transient */ ulong dl_correlation; /* association with connect_ind */ } dl_disconnect_req_t; /* * DL_DISCONNECT_IND, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_DISCONNECT_IND */ ulong dl_originator; /* USER or PROVIDER */ ulong dl_reason; /* permanent or transient */ ulong dl_correlation; /* association with connect_ind */ } dl_disconnect_ind_t; /* * DL_RESET_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_RESET_REQ */ } dl_reset_req_t; /* * DL_RESET_IND, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_RESET_IND */ ulong dl_originator; /* Provider or User */ ulong dl_reason; /* flow control, link error or resynch */ } dl_reset_ind_t; /* * DL_RESET_RES, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_RESET_RES */ } dl_reset_res_t; /* * DL_RESET_CON, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_RESET_CON */ } dl_reset_con_t; /* * CONNECTIONLESS SERVICE PRIMITIVES */ /* * DL_UNITDATA_REQ, M_PROTO type, with M_DATA block(s) */ typedef struct { ulong dl_primitive; /* DL_UNITDATA_REQ */ ulong dl_dest_addr_length; /* DLSAP length of dest. user */ ulong dl_dest_addr_offset; /* offset from beg. of block */ dl_priority_t dl_priority; /* priority value */ } dl_unitdata_req_t; /* * DL_UNITDATA_IND, M_PROTO type, with M_DATA block(s) */ typedef struct { ulong dl_primitive; /* DL_UNITDATA_IND */ ulong dl_dest_addr_length; /* DLSAP length of dest. user */ ulong dl_dest_addr_offset; /* offset from beg. of block */ ulong dl_src_addr_length; /* DLSAP addr length of sending user */ ulong dl_src_addr_offset; /* offset from beg. of block */ ulong dl_group_address; /* set to one if multicast/broadcast */ } dl_unitdata_ind_t; /* * DL_UDERROR_IND, M_PROTO type * (or M_PCPROTO type if LLI-based provider) */ typedef struct { ulong dl_primitive; /* DL_UDERROR_IND */ ulong dl_dest_addr_length; /* Destination DLSAP */ ulong dl_dest_addr_offset; /* Offset from beg. of block */ ulong dl_unix_errno; /* UNIX system error code */ ulong dl_errno; /* DLPI error code */ } dl_uderror_ind_t; /* * DL_UDQOS_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_UDQOS_REQ */ ulong dl_qos_length; /* length in bytes of requested qos */ ulong dl_qos_offset; /* offset from beg. of block */ } dl_udqos_req_t; /* * Primitives to handle XID and TEST operations */ /* * DL_TEST_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_TEST_REQ */ ulong dl_flag; /* poll/final */ ulong dl_dest_addr_length; /* DLSAP length of dest. user */ ulong dl_dest_addr_offset; /* offset from beg. of block */ } dl_test_req_t; /* * DL_TEST_IND, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_TEST_IND */ ulong dl_flag; /* poll/final */ ulong dl_dest_addr_length; /* dlsap length of dest. user */ ulong dl_dest_addr_offset; /* offset from beg. of block */ ulong dl_src_addr_length; /* dlsap length of source user */ ulong dl_src_addr_offset; /* offset from beg. of block */ } dl_test_ind_t; /* * DL_TEST_RES, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_TEST_RES */ ulong dl_flag; /* poll/final */ ulong dl_dest_addr_length; /* DLSAP length of dest. user */ ulong dl_dest_addr_offset; /* offset from beg. of block */ } dl_test_res_t; /* * DL_TEST_CON, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_TEST_CON */ ulong dl_flag; /* poll/final */ ulong dl_dest_addr_length; /* dlsap length of dest. user */ ulong dl_dest_addr_offset; /* offset from beg. of block */ ulong dl_src_addr_length; /* dlsap length of source user */ ulong dl_src_addr_offset; /* offset from beg. of block */ } dl_test_con_t; /* * DL_XID_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_XID_REQ */ ulong dl_flag; /* poll/final */ ulong dl_dest_addr_length; /* dlsap length of dest. user */ ulong dl_dest_addr_offset; /* offset from beg. of block */ } dl_xid_req_t; /* * DL_XID_IND, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_XID_IND */ ulong dl_flag; /* poll/final */ ulong dl_dest_addr_length; /* dlsap length of dest. user */ ulong dl_dest_addr_offset; /* offset from beg. of block */ ulong dl_src_addr_length; /* dlsap length of source user */ ulong dl_src_addr_offset; /* offset from beg. of block */ } dl_xid_ind_t; /* * DL_XID_RES, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_XID_RES */ ulong dl_flag; /* poll/final */ ulong dl_dest_addr_length; /* DLSAP length of dest. user */ ulong dl_dest_addr_offset; /* offset from beg. of block */ } dl_xid_res_t; /* * DL_XID_CON, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_XID_CON */ ulong dl_flag; /* poll/final */ ulong dl_dest_addr_length; /* dlsap length of dest. user */ ulong dl_dest_addr_offset; /* offset from beg. of block */ ulong dl_src_addr_length; /* dlsap length of source user */ ulong dl_src_addr_offset; /* offset from beg. of block */ } dl_xid_con_t; /* * ACKNOWLEDGED CONNECTIONLESS SERVICE PRIMITIVES */ /* * DL_DATA_ACK_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_DATA_ACK_REQ */ ulong dl_correlation; /* User's correlation token */ ulong dl_dest_addr_length; /* length of destination addr */ ulong dl_dest_addr_offset; /* offset from beginning of block */ ulong dl_src_addr_length; /* length of source address */ ulong dl_src_addr_offset; /* offset from beginning of block */ ulong dl_priority; /* priority */ ulong dl_service_class; /* DL_RQST_RSP or DL_RQST_NORSP */ } dl_data_ack_req_t; /* * DL_DATA_ACK_IND, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_DATA_ACK_IND */ ulong dl_dest_addr_length; /* length of destination addr */ ulong dl_dest_addr_offset; /* offset from beginning of block */ ulong dl_src_addr_length; /* length of source address */ ulong dl_src_addr_offset; /* offset from beginning of block */ ulong dl_priority; /* priority for data unit transm. */ ulong dl_service_class; /* DL_RQST_RSP or DL_RQST_NORSP */ } dl_data_ack_ind_t; /* * DL_DATA_ACK_STATUS_IND, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_DATA_ACK_STATUS_IND */ ulong dl_correlation; /* User's correlation token */ ulong dl_status; /* success or failure of previous req */ } dl_data_ack_status_ind_t; /* * DL_REPLY_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_REPLY_REQ */ ulong dl_correlation; /* User's correlation token */ ulong dl_dest_addr_length; /* length of destination address */ ulong dl_dest_addr_offset; /* offset from beginning of block */ ulong dl_src_addr_length; /* source address length */ ulong dl_src_addr_offset; /* offset from beginning of block */ ulong dl_priority; /* priority for data unit transmission */ ulong dl_service_class; } dl_reply_req_t; /* * DL_REPLY_IND, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_REPLY_IND */ ulong dl_dest_addr_length; /* length of destination address */ ulong dl_dest_addr_offset; /* offset from beginning of block */ ulong dl_src_addr_length; /* length of source address */ ulong dl_src_addr_offset; /* offset from beginning of block */ ulong dl_priority; /* priority for data unit transmission */ ulong dl_service_class; /* DL_RQST_RSP or DL_RQST_NORSP */ } dl_reply_ind_t; /* * DL_REPLY_STATUS_IND, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_REPLY_STATUS_IND */ ulong dl_correlation; /* User's correlation token */ ulong dl_status; /* success or failure of previous req */ } dl_reply_status_ind_t; /* * DL_REPLY_UPDATE_REQ, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_REPLY_UPDATE_REQ */ ulong dl_correlation; /* user's correlation token */ ulong dl_src_addr_length; /* length of source address */ ulong dl_src_addr_offset; /* offset from beginning of block */ } dl_reply_update_req_t; /* * DL_REPLY_UPDATE_STATUS_IND, M_PROTO type */ typedef struct { ulong dl_primitive; /* DL_REPLY_UPDATE_STATUS_IND */ ulong dl_correlation; /* User's correlation token */ ulong dl_status; /* success or failure of previous req */ } dl_reply_update_status_ind_t; union DL_primitives { ulong dl_primitive; dl_info_req_t info_req; dl_info_ack_t info_ack; dl_attach_req_t attach_req; dl_detach_req_t detach_req; dl_bind_req_t bind_req; dl_bind_ack_t bind_ack; dl_unbind_req_t unbind_req; dl_subs_bind_req_t subs_bind_req; dl_subs_bind_ack_t subs_bind_ack; dl_subs_unbind_req_t subs_unbind_req; dl_ok_ack_t ok_ack; dl_error_ack_t error_ack; dl_connect_req_t connect_req; dl_connect_ind_t connect_ind; dl_connect_res_t connect_res; dl_connect_con_t connect_con; dl_token_req_t token_req; dl_token_ack_t token_ack; dl_disconnect_req_t disconnect_req; dl_disconnect_ind_t disconnect_ind; dl_reset_req_t reset_req; dl_reset_ind_t reset_ind; dl_reset_res_t reset_res; dl_reset_con_t reset_con; dl_unitdata_req_t unitdata_req; dl_unitdata_ind_t unitdata_ind; dl_uderror_ind_t uderror_ind; dl_udqos_req_t udqos_req; dl_enabmulti_req_t enabmulti_req; dl_disabmulti_req_t disabmulti_req; dl_promiscon_req_t promiscon_req; dl_promiscoff_req_t promiscoff_req; dl_phys_addr_req_t physaddr_req; dl_phys_addr_ack_t physaddr_ack; dl_set_phys_addr_req_t set_physaddr_req; dl_get_statistics_req_t get_statistics_req; dl_get_statistics_ack_t get_statistics_ack; dl_test_req_t test_req; dl_test_ind_t test_ind; dl_test_res_t test_res; dl_test_con_t test_con; dl_xid_req_t xid_req; dl_xid_ind_t xid_ind; dl_xid_res_t xid_res; dl_xid_con_t xid_con; dl_data_ack_req_t data_ack_req; dl_data_ack_ind_t data_ack_ind; dl_data_ack_status_ind_t data_ack_status_ind; dl_reply_req_t reply_req; dl_reply_ind_t reply_ind; dl_reply_status_ind_t reply_status_ind; dl_reply_update_req_t reply_update_req; dl_reply_update_status_ind_t reply_update_status_ind; }; #define DL_INFO_REQ_SIZE sizeof(dl_info_req_t) #define DL_INFO_ACK_SIZE sizeof(dl_info_ack_t) #define DL_ATTACH_REQ_SIZE sizeof(dl_attach_req_t) #define DL_DETACH_REQ_SIZE sizeof(dl_detach_req_t) #define DL_BIND_REQ_SIZE sizeof(dl_bind_req_t) #define DL_BIND_ACK_SIZE sizeof(dl_bind_ack_t) #define DL_UNBIND_REQ_SIZE sizeof(dl_unbind_req_t) #define DL_SUBS_BIND_REQ_SIZE sizeof(dl_subs_bind_req_t) #define DL_SUBS_BIND_ACK_SIZE sizeof(dl_subs_bind_ack_t) #define DL_SUBS_UNBIND_REQ_SIZE sizeof(dl_subs_unbind_req_t) #define DL_OK_ACK_SIZE sizeof(dl_ok_ack_t) #define DL_ERROR_ACK_SIZE sizeof(dl_error_ack_t) #define DL_CONNECT_REQ_SIZE sizeof(dl_connect_req_t) #define DL_CONNECT_IND_SIZE sizeof(dl_connect_ind_t) #define DL_CONNECT_RES_SIZE sizeof(dl_connect_res_t) #define DL_CONNECT_CON_SIZE sizeof(dl_connect_con_t) #define DL_TOKEN_REQ_SIZE sizeof(dl_token_req_t) #define DL_TOKEN_ACK_SIZE sizeof(dl_token_ack_t) #define DL_DISCONNECT_REQ_SIZE sizeof(dl_disconnect_req_t) #define DL_DISCONNECT_IND_SIZE sizeof(dl_disconnect_ind_t) #define DL_RESET_REQ_SIZE sizeof(dl_reset_req_t) #define DL_RESET_IND_SIZE sizeof(dl_reset_ind_t) #define DL_RESET_RES_SIZE sizeof(dl_reset_res_t) #define DL_RESET_CON_SIZE sizeof(dl_reset_con_t) #define DL_UNITDATA_REQ_SIZE sizeof(dl_unitdata_req_t) #define DL_UNITDATA_IND_SIZE sizeof(dl_unitdata_ind_t) #define DL_UDERROR_IND_SIZE sizeof(dl_uderror_ind_t) #define DL_UDQOS_REQ_SIZE sizeof(dl_udqos_req_t) #define DL_ENABMULTI_REQ_SIZE sizeof(dl_enabmulti_req_t) #define DL_DISABMULTI_REQ_SIZE sizeof(dl_disabmulti_req_t) #define DL_PROMISCON_REQ_SIZE sizeof(dl_promiscon_req_t) #define DL_PROMISCOFF_REQ_SIZE sizeof(dl_promiscoff_req_t) #define DL_PHYS_ADDR_REQ_SIZE sizeof(dl_phys_addr_req_t) #define DL_PHYS_ADDR_ACK_SIZE sizeof(dl_phys_addr_ack_t) #define DL_SET_PHYS_ADDR_REQ_SIZE sizeof(dl_set_phys_addr_req_t) #define DL_GET_STATISTICS_REQ_SIZE sizeof(dl_get_statistics_req_t) #define DL_GET_STATISTICS_ACK_SIZE sizeof(dl_get_statistics_ack_t) #define DL_XID_REQ_SIZE sizeof(dl_xid_req_t) #define DL_XID_IND_SIZE sizeof(dl_xid_ind_t) #define DL_XID_RES_SIZE sizeof(dl_xid_res_t) #define DL_XID_CON_SIZE sizeof(dl_xid_con_t) #define DL_TEST_REQ_SIZE sizeof(dl_test_req_t) #define DL_TEST_IND_SIZE sizeof(dl_test_ind_t) #define DL_TEST_RES_SIZE sizeof(dl_test_res_t) #define DL_TEST_CON_SIZE sizeof(dl_test_con_t) #define DL_DATA_ACK_REQ_SIZE sizeof(dl_data_ack_req_t) #define DL_DATA_ACK_IND_SIZE sizeof(dl_data_ack_ind_t) #define DL_DATA_ACK_STATUS_IND_SIZE sizeof(dl_data_ack_status_ind_t) #define DL_REPLY_REQ_SIZE sizeof(dl_reply_req_t) #define DL_REPLY_IND_SIZE sizeof(dl_reply_ind_t) #define DL_REPLY_STATUS_IND_SIZE sizeof(dl_reply_status_ind_t) #define DL_REPLY_UPDATE_REQ_SIZE sizeof(dl_reply_update_req_t) #define DL_REPLY_UPDATE_STATUS_IND_SIZE sizeof(dl_reply_update_status_ind_t) #endif /* _SYS_DLPI_H */ References
Index
Short Contents
Table of Contents
Footnotes[1] International Organization for Standardization, "Data Link Service Definition for Open Systems Interconnection," DIS 8886, February 1987. [2] International Organization for Standardization, "Logical Link Control," DIS 8802/2, 1985. [3] This does not imply that DLPI will directly support a pure read(2)/write(2). If such an interface is desired, a STREAMS module could be implemented to be pushed above the DLS provider. | ||||||||||||||||
OpenSS7 SS7 for the Common Man |
| ||||||||||||||||
Last modified: Sat, 01 Nov 2008 14:12:37 GMT © Copyright 1997-2007 OpenSS7 Corporation All Rights Reserved. |