mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-28 11:57:28 +00:00
103 lines
2.8 KiB
Groff
103 lines
2.8 KiB
Groff
.\" $FreeBSD$
|
|
.\"
|
|
.Dd December 29, 1997
|
|
.Dt NATM 4
|
|
.Os
|
|
.Sh NAME
|
|
.Nm natm
|
|
.Nd Native Mode ATM protocol layer
|
|
.Sh DESCRIPTION
|
|
The
|
|
.Bx
|
|
ATM software comes with a
|
|
.Em native mode ATM protocol layer
|
|
which provides socket level access to AAL0 and AAL5 virtual circuits.
|
|
To enable this protocol layer, add
|
|
.Dl options NATM
|
|
.Dl device atm
|
|
to your kernel configuration file and re-make the kernel (do not forget
|
|
to do
|
|
.Dq make clean ) .
|
|
.Sh NATM API
|
|
The NATM layer uses a
|
|
.Vt struct sockaddr_natm
|
|
to specify a virtual circuit:
|
|
.Bd -literal -offset indent
|
|
struct sockaddr_natm {
|
|
uint8_t snatm_len; /* length */
|
|
uint8_t snatm_family; /* AF_NATM */
|
|
char snatm_if[IFNAMSIZ]; /* interface name */
|
|
uint16_t snatm_vci; /* vci */
|
|
uint8_t snatm_vpi; /* vpi */
|
|
};
|
|
.Ed
|
|
.Pp
|
|
To create an AAL5 connection to a virtual circuit with VPI 0, VCI 201
|
|
one would use the following:
|
|
.Bd -literal -offset indent
|
|
struct sockaddr_natm snatm;
|
|
int s, r;
|
|
s = socket(AF_NATM, SOCK_STREAM, PROTO_NATMAAL5);
|
|
/* note: PROTO_NATMAAL0 is AAL0 */
|
|
if (s < 0) { perror("socket"); exit(1); }
|
|
bzero(&snatm, sizeof(snatm));
|
|
snatm.snatm_len = sizeof(snatm);
|
|
snatm.snatm_family = AF_NATM;
|
|
sprintf(snatm.snatm_if, "en0");
|
|
snatm.snatm_vci = 201;
|
|
snatm.snatm_vpi = 0;
|
|
r = connect(s, (struct sockaddr *)&snatm, sizeof(snatm));
|
|
if (r < 0) { perror("connect"); exit(1); }
|
|
/* s now connected to ATM! */
|
|
.Ed
|
|
.Pp
|
|
The
|
|
.Fn socket
|
|
call simply creates an unconnected NATM socket.
|
|
The
|
|
.Fn connect
|
|
call associates an unconnected NATM socket with a
|
|
virtual circuit and tells the driver to enable that virtual circuit
|
|
for receiving data.
|
|
After the
|
|
.Fn connect
|
|
call one can
|
|
.Fn read
|
|
or
|
|
.Fn write
|
|
to the socket to perform ATM I/O.
|
|
.Sh Internal NATM operation
|
|
Internally, the NATM protocol layer keeps a list of all active virtual
|
|
circuits on the system in
|
|
.Dv natm_pcbs .
|
|
This includes circuits currently being used for IP to prevent NATM and
|
|
IP from clashing over virtual circuit usage.
|
|
.Pp
|
|
When a virtual circuit is enabled for receiving data, the NATM
|
|
protocol layer passes the address of the protocol control block down
|
|
to the driver as a receive
|
|
.Dq handle .
|
|
When inbound data arrives, the driver passes the data back with the
|
|
appropriate receive handle.
|
|
The NATM layer uses this to avoid the
|
|
overhead of a protocol control block lookup.
|
|
This allows us to take
|
|
advantage of the fact that ATM has already demultiplexed the data for
|
|
us.
|
|
.Sh SEE ALSO
|
|
.Xr en 4 ,
|
|
.Xr fatm 4 ,
|
|
.Xr hatm 4 ,
|
|
.Xr natmip 4 ,
|
|
.Xr patm 4
|
|
.Sh AUTHORS
|
|
.An Chuck Cranor
|
|
of Washington University implemented the NATM protocol layer
|
|
along with the EN ATM driver in 1996 for
|
|
.Nx .
|
|
.Sh CAVEATS
|
|
The NATM protocol support is subject to change as
|
|
the ATM protocols develop.
|
|
Users should not depend on details of the current implementation, but rather
|
|
the services exported.
|