The three other primitives represent acknowledgements of requests, or indications of incoming events, and are passed from the service provider to the service user.
Module Service Interface Example
The following code is part of a module that illustrates the concept of a service interface. The module implements a simple service interface and mirrors the service interface library example. The following rules pertain to service interfaces.
Modules and drivers that support a service interface must act upon all PROTO messages and not pass them through.
Modules can be inserted between a service user and a service provider to manipulate the data part as it passes between them. However, these modules cannot alter the contents of the control part (PROTO block, first message block) nor alter the boundaries of the control or data parts. That is, the message blocks comprising the data part can be changed, but the message cannot be split into separate messages nor combined with other messages.
In addition, modules and drivers must observe the rule that high-priority messages are not subject to flow control and forward them accordingly.
Service Primitive Declarations
The service interface primitives are defined in the declarations shown in the following example:
Example 8-17 Service Primitive Declarations
In general, the M_PROTO or M_PCPROTO block is described by a data structure containing the service interface information in this example, union primitives.
The module recognizes two commands:
BIND_REQ | Give this stream a protocol address (for example, give it a name on the network). After a BIND_REQ is completed, data from other senders will find their way through the network to this particular stream. |
UNITDATA_REQ | Send data to the specified address. |
The module generates three messages:
OK_ACK | A positive acknowledgement (ack) of BIND_REQ. |
ERROR_ACK | A negative acknowledgement (nak) of BIND_REQ. |
UNITDATA_IND | Data from the network has been received. |
The acknowledgement of a BIND_REQ informs the user that the request was syntactically correct (or incorrect if ERROR_ACK). The receipt of a BIND_REQ is acknowledged with an M_PCPROTO to ensure that the acknowledgement reaches the user before any other message. For example, if a UNITDATA_IND comes through before the bind is completed, the application cannot send data to the proper address
The driver uses a per-minor device data structure, dgproto, which contains the following: