.NC "Network Service Interface"
.sh 1 "Connectionless Network Service"
.pp
This section describes the interface to the ISO connectionless network service.
There are really two interfaces to the CLNS: the internal interface
and the IPC interface.
The internal interface is based on
procedure calls. It is used only within the kernel. The IPC interface
allows a user process to access the CLNS directly. This is used only
for testing and debugging purposes.
.sh 2 "Primitives"
.pp
The CLNS is, by definition, connectionless. Therefore, there are no 
primitives associated with connection establishment or connection release.
There is one primitive associated with data transfer: N-UNITDATA.
The parameters to a N-UNITDATA request are: source NSAP address,
destination NSAP address, quality of service, and user data. 
The parameters of a N-UNITDATA indication are identical to those of the
request.
In this implementation, the quality of service parameter is not supported.
.sh 2 "Internal Interface"
.pp
Within the kernel, an N-UNITDATA request is effected by the procedure
\fIclnp_output()\fR:
.(b
\fC
.TS
tab(+);
l s s.
clnp_output(m0, isop, datalen, flags)
.T&
l l l.
 +struct mbuf+*m0;+/* data */
 +struct isopcb+*isop;+/* ISO protocol control block */
 +int+datalen;+
 +int+flags;+/* flags */
.TE
\fR
.)b
This procedure will construct a DT NPDU, route it, and transmit it on
the appropriate subnetwork. \fIM0\fR is an mbuf chain containing the 
user data portion of the N-UNITDATA request. \fIIsopcb\fR is the iso protocol
control block previously allocated. \fIClnp_output\fR will use the following
fields: \fIisop_laddr\fR, isop_faddr, isop_route, isop_options,
isop_optindex, \fI and \fRisop_clnpcache\fR.
\fIDatalen\fR specifies the number of bytes of user data.
The \fIflags\fR parameter will be discussed in a subsequent chapter.
.pp
A N-UNITDATA indication occurs when a DT NPDU arrives. The indication is
generated by calling the appropriate upper layer protocol input routine. 
In the case of TP, the procedure \fItpclnp_input()\fR is called:
.(b
\fC
.TS
tab(+);
l s s.
tpclnp_input(m, src, dst, len)
.T&
l l l.
 +struct mbuf+*m;+/* DT NPDU */
 +struct iso_addr+*src;+/* source of packet */
 +struct iso_addr+*dst;+/* destination of packet */
 +int+len;+/* length of clnp header */
.TE
\fR
.)b
\fIM\fR contains the entire DT NPDU packet. \fILen\fR indicates the size
of the CLNP header. In other words, the user data of the DT NPDU begins
\fIlen\fR bytes into \fIm\fR. \fISrc\fR and \fIdst\fR indicate the
source and destination NSAP addresses of the packet.
.sh 3 "CLNP/Subnetwork Interface"
.pp
The design of the interface between the subnetwork and the CLNP is 
determined by the design of the Unix network interface drivers. CLNP
follows the conventional mechanisms for exchanging packets with a network
interface. See the section on Network Interface Drivers in Chapter Five
for more information on these conventions.
.sh 2 "IPC (\*(lqRaw\*(rq) Interface"
.pp
The IPC interface to the CLNS allows direct (called \*(lqraw\*(rq) 
access to CLNP. 
This interface is intended for testing and debugging only. 
Its use results in the
transmission of CLNP datagrams with nonstandard identification fields.
These raw packets may be rejected by a system not employing the same
convention. See the section on network implementation for more information
about the conventions.
.pp
In order to gain access to the raw interface
a \fIsocket\fR, with address family AF_ISO and type SOCK_RAW must be created.
With this socket in hand,
the system calls \fIsendto()\fR and \fIrecvfrom()\fR can be used to 
transmit and receive raw CLNP datagrams. 
.sh 3 "Sending raw datagrams"
.pp
The format of the \fIsendto()\fR system call is:
.(b
\fC
.TS
tab(+);
l s s.
cc = sendto(s, msg, len, flags, to, tolen)
.T&
l l l.
int+cc,s;
char+*msg;
int+len,flags;
struct sockaddr+*to;
int+to;
.TE
\fR
.)b
\f\fIS\fR is the socket previously created. \fIMsg\fR is a pointer to
the data for the NPDU. CLNP will prepend a header to this data before
transmission. \fILen\fR specifies the number of bytes of data. The
\fIflags\fR parameter is unused and should be zero. \fITo\fR specifies the
NSAP address to be used as the destination address. The size (in bytes)
of \fIto\fR is given in \fItolen\fR. CLNP will automatically insert
the source address based upon the route taken by the packet. The number of
user data bytes transmitted is returned as \fIcc\fR. See \fIsendto(2)\fR
for more information on this system call.
.sh 3 "Receiving raw datagrams"
.pp
The format of the \fIrecvfrom()\fR system call is:
.(b
\fC
.TS
tab(+);
l s s.
cc = recvfrom(s, buf, len, flags, from, fromlen)
.T&
l l l.
int+cc,s;
char+*buf;
int+len,flags;
struct sockaddr+*from;
int+*fromlen;
.TE
\fR
.)b
When used with a CLNP raw socket \fIs\fR, \fIrecvfrom()\fR will read a 
NPDU from the CLNS. If no packet is available, the call will block.
\fIBuf\fR specifies a buffer of \fIlen\fR bytes into which the NPDU will
be read. The entire packet, including the header, will be read into the
buffer. The \fIflags\fR parameter is unused, and should be zero. If 
\fIfrom\fR is non-zero, the source address of the NPDU is filled in.
\fIFromlen\fR is a value-result parameter, initialized to the size of
the buffer associated with \fIfrom\fR, and modified on return to
indicate the actual size of the address stored there. The total number
of bytes received (header and data) is returned as \fIcc\fR.
See \fIrecvfrom(2)\fR for more information about this system call.
.sh 1 "Connection Oriented Network Service"
.pp
The ARGO Connection Oriented Network Service (CONS) is not a complete
implementation of the
OSI network service.
It is that subset of the OSI network service that is used
by ARGO Transport and by ARGO CLNP.
.\" FIGURE
.so ../wisc/figs/NS_primitives.nr
.pp
.CF
shows which CONS service elements are provided.
