V10/man/man4/tcp.4

.TH TCP 4
.CT comm_mach
.SH NAME
tcp, tcp_ld \- DARPA transmission control protocol
.SH SYNOPSIS
.B #include <sys/inio.h>
.br
.B #include <sys/inet/tcp_user.h>
.SH DESCRIPTION
The
.I tcp_ld
line discipline
and the
.F /dev/tcp*
devices together implement the DARPA TCP circuit protocol.
They are normally used through
.IR tcpmgr (8)
and the routines in
.IR ipc (3).
.PP
One instance of
.I tcp_ld
should be pushed on an IP device stream,
usually
.FR /dev/ip6 ;
see
.IR ip (4).
Thereafter,
data written on the
.I tcp
devices is turned into IP packets
written to the IP device,
and vice versa.
.PP
Different
.I tcp
devices represent different software channels.
Files with odd minor device numbers
are for placing calls;
while such a file is open,
it may not be opened again.
Files with even device numbers
receive calls.
.PP
To place a call,
open an unused odd-numbered
.I tcp
file;
write a
.B struct tcpuser
describing the address to be called;
and read a
.B struct tcpuser
for status.
The structure is defined in
.BR <sys/inet/tcp_user.h> :
.PP
.EX
struct tcpuser {
	int code;
	tcp_port lport, fport;
	in_addr laddr, faddr;
	int param;
};

#define TCPC_LISTEN	1
#define TCPC_CONNECT	2

#define TCPC_OK		3
#define TCPC_SORRY	4	/* unknown error */
#define TCPC_BADDEV	5	/* tcp device is bad */
#define TCPC_NOROUTE	6	/* no routing to dest */
#define TCPC_BADLOCAL	7	/* bad local address */
#define TCPC_BOUND	8	/* address already bound */

#define SO_KEEPALIVE	0x2	/* generate keepalives */
.EE
.PP
In the structure describing the call,
.B code
should be
.BR TCPC_CONNECT ;
.B faddr
and
.B fport
are the destination IP address and TCP port number;
.B laddr
is the IP address associated with a local IP interface,
or
.B INADDR_ANY
to let the system pick;
.B lport
is the local TCP port number,
or
0
to let the system pick;
.B param
is 0 or
.BR SO_KEEPALIVE .
.PP
In the structure returned for status,
.B code
is
.B TCPC_OK
if the call completed correctly;
henceforth data written to and read from the file
is transported on the circuit.
Other codes mean the circuit was not set up.
.PP
To listen for incoming calls,
open an odd-numbered device
and write a
.B struct tcpuser
with
.B code
set to
.BR TCPC_LISTEN ;
.B laddr
set to the local IP address for which calls should be taken,
or
.B INADDR_ANY
to catch any calls not explicitly taken by another listener;
.B lport
set to the port on which to listen,
or 0 for any port;
and
.B param
set to 0.
Thereafter,
reads return successive
.B tcpuser
structures,
each describing a new call;
.B faddr
and
.B fport
identify the caller,
.B laddr
and
.B lport
the assigned local address.
The local
.I tcp
device number,
.I n,
assigned to the call
is returned in
.BR param .
The corresponding device,
.BI /dev/tcp n,
should be opened;
data read and written there is transported by the circuit.
.PP
Several
.IR ioctl (2)
calls, defined in
.BR <sys/inio.h> ,
apply to
.I tcp
devices:
.nr Pw \w'\f5TCPIOMAXSEG 'u
.TP \n(Pwu
.B TCPIOHUP
When the remote end of the circuit is disconnected,
send signal
.B SIGHUP
to the local process group associated with the stream.
.TP
.B TCPMAXSEG
The third argument points to an integer
giving the maximum segment size for this connection:
the greatest number of bytes to be packed into one IP packet.
.TP
.B TCPGETADDR
The third argument points to a
.BR "struct tcpuser" ;
fill in
.BR laddr ,
.BR lport ,
.BR faddr ,
and
.BR fport
with the local and foreign addresses associated with the circuit.
.SH FILES
.F /dev/tcp??
.br
.F /dev/ip6
.SH SEE ALSO
.IR ip (4),
.IR internet (3),
.IR tcpmgr (8)
.br
DARPA standards RFC 793, 1122