aboutsummaryrefslogtreecommitdiff
path: root/share/examples/atm/atm-sockets.txt
diff options
context:
space:
mode:
Diffstat (limited to 'share/examples/atm/atm-sockets.txt')
-rw-r--r--share/examples/atm/atm-sockets.txt340
1 files changed, 340 insertions, 0 deletions
diff --git a/share/examples/atm/atm-sockets.txt b/share/examples/atm/atm-sockets.txt
new file mode 100644
index 000000000000..258a565f8487
--- /dev/null
+++ b/share/examples/atm/atm-sockets.txt
@@ -0,0 +1,340 @@
+
+ HARP Native ATM Sockets API
+ ===========================
+
+ATM sockets are an extension to the traditional BSD sockets API to allow
+direct user-level access to native ATM protocol services. The ATM sockets
+extensions are implemented via the addition of a new protocol family (PF_ATM)
+and a new socket address structure (struct sockaddr_atm).
+
+The HARP implementation of native ATM sockets capabilities is intended to be
+conformant with The Open Group specifications (with known differences listed
+below) as defined in the following document:
+
+ The Open Group: Networking Services (XNS) Issue 5
+ ISBN 1-85912-165-9
+ http://www.rdg.opengroup.org/public/pubs/catalog/c523.htm
+
+And in particular, it is based on the following ATM-specific sections in the
+above document:
+
+ ATM Transport Protocol Information for Sockets
+ ATM Transport Protocol Information for XTI
+ ATM Transport Headers
+
+The ATM sockets API is an implementation based on the definitions and
+descriptions set forth in the following document:
+
+ The ATM Forum: Native ATM Services: Semantic Description, Version 1.0
+ af-saa-0048.000
+ http://www.atmforum.com/atmforum/specs/approved.html
+
+
+Using the HARP Implementation
+-----------------------------
+This document only provides the HARP-specific information necessary for using
+the ATM sockets API. Please refer to the XNS document described above for
+all of the general interface specifications. There is also sample source
+code for an ATM sockets application included at the end of this document.
+
+All user definitions for the HARP ATM sockets implementation are contained
+in the file /usr/include/netatm/atm.h. This file must be included in the
+user's C program source file. In this file, all HARP extensions to the base
+XNS specifications are denoted with a comment string of "XNS_EXT".
+
+
+HARP Extensions to XNS Issue 5
+------------------------------
+o Socket address structure for ATM addresses
+
+ An ATM socket address structure was not specifically defined by XNS,
+ although the t_atm_sap structure was defined to be used as an ATM protocol
+ address. Thus, HARP has defined an ATM socket address (using address
+ family AF_ATM) as a 'struct sockaddr_atm', which contains 'struct t_atm_sap'
+ as the protocol address. This structure (properly cast) must be used on
+ all ATM socket system calls requiring a 'struct sockaddr' parameter.
+
+o Network Interface Selection socket option (T_ATM_NET_INTF)
+
+ This option is used to specify the name of the network interface to be
+ used to route an outgoing ATM call using a socket connection. This option
+ is only needed when there are multiple ATM network interfaces defined on a
+ system. If this option is not set, then the first network interface on
+ the first physical ATM interface defined will be used.
+
+ See the sample application below for an example of the use of this option.
+
+o LLC Multiplexing socket option (T_ATM_LLC)
+
+ For LLC encapsulated VCCs (BLLI Layer 2 Protocol == T_ATM_BLLI2_I8802),
+ HARP has implemented an LLC multiplexing facility. In order to use this
+ multiplexing facility, a user must issue a setsockopt() call specifying the
+ T_ATM_LLC option before the connect() or listen() system call is invoked.
+
+ If using the LLC multiplexor, the user will only receive PDUs which match
+ the LLC header information specified in the socket option. The kernel
+ multiplexing software will strip the LLC header from all inbound PDUs and
+ add the specified LLC header to all outgoing PDUs - the user will never see
+ the LLC header.
+
+ For listening sockets, the listener will be notified for all incoming LLC
+ calls (which also meet the other incoming call distribution selection
+ criteria), since the LLC header information is only carried in the data
+ PDUs, not in the signalling protocol.
+
+ The T_ATM_LLC_SHARING flag is used to denote whether this user wishes to
+ share the VCC with other LLC users requesting similar connection attributes
+ to the same destination.
+
+o Application Name socket option (T_ATM_APP_NAME)
+
+ This option is used to associate an identifier string (typically, the
+ application's name) with an open ATM socket. Currently, it is only used
+ for the "Owner" field in the output of the 'atm show vcc' command. If this
+ option is not set, then the "Owner" field will default to "(AAL5)".
+
+ See the sample application below for an example of the use of this option.
+
+o PVC support
+
+ The XNS document specifically does not provide support for ATM PVCs.
+ However, due in part to internal HARP requirements (the ILMI daemon), PVC
+ sockets are supported under the HARP implementation.
+
+ To support PVC sockets, there is a new address format (T_ATM_PVC_ADDR) and
+ address definition (Atm_addr_pvc). Since there is no actual signalling
+ involved in setting up a PVC, a PVC socket connection only defines the
+ local socket-to-pvc connection - the remainder of the virtual circuit through
+ the ATM network to the remote endpoint must be defined independent of the
+ local socket creation. PVC socket connections are only allowed via the
+ connect() system call - listen()/accept() sockets cannot be supported.
+ Also, since there are no circuit parameters signalled, most of the
+ setsockopt() options are silently ignored.
+
+o SPANS support
+
+ HARP has added ATM socket support for the FORE-proprietary SPANS address
+ format (T_ATM_SPANS_ADDR). A SPANS socket can only be established over
+ an ATM physical interface which is using the SPANS signalling manager.
+ There is limited ATM socket option support - the socket options can be set,
+ but most are silently ignored, since they are not applicable to the SPANS
+ protocols. The SPANS socket address support has not been thoroughly tested.
+
+o Miscellaneous user convenience typedefs, macros and defines
+
+
+XNS Issue 5 Features Not Supported in HARP
+------------------------------------------
+o ATM_PROTO_SSCOP
+
+ The socket protocol for reliable data transport (ATM_PROTO_SSCOP) is not
+ supported in this HARP release. There is some initial skeleton code for
+ SSCOP support, but it was not completed.
+
+o Multipoint connections
+
+ The core HARP code does not provide support for multipoint connections, so,
+ obviously, multipoint socket connections are also not supported.
+
+ The non-supported socket options are:
+ o T_ATM_ADD_LEAF
+ o T_ATM_DROP_LEAF
+ o T_ATM_LEAF_IND
+
+ The non-supported socket option values are:
+ o For the T_ATM_BEARER_CAP socket option:
+ o connection_configuration == T_ATM_1_TO_MANY
+
+
+Example ATM Socket Application
+------------------------------
+The following is a simple example application using the ATM socket API.
+
+/*
+ * ATM API sample application
+ *
+ * This application will open an ATM socket, send a text string in a PDU
+ * and then read one PDU from the socket and print its contents.
+ *
+ */
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <netatm/atm.h>
+
+#define MAX_LEN 4096 /* Maximum PDU length */
+#define MY_ID 11 /* BLLI Layer 2 protocol */
+#define MY_APPL "SAMPLE"
+
+Atm_addr_nsap dst_addr = {
+ 0x47,
+ {0x00,0x05,0x80,0xff,0xdc,0x00,0x00,0x00,0x00,0x02,0xff,0xff},
+ {0x11,0x22,0x33,0x44,0x55,0x66},
+ 0x00
+};
+
+static char message[] = "Test message to send on connection";
+
+
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ struct sockaddr_atm satm;
+ struct t_atm_aal5 aal5;
+ struct t_atm_traffic traffic;
+ struct t_atm_bearer bearer;
+ struct t_atm_qos qos;
+ struct t_atm_net_intf netintf;
+ struct t_atm_app_name appname;
+ char buffer[MAX_LEN+1];
+ int s, n, optlen;
+
+ /*
+ * Create socket
+ */
+ s = socket(AF_ATM, SOCK_SEQPACKET, ATM_PROTO_AAL5);
+ if (s < 0) {
+ perror("socket");
+ exit(1);
+ }
+
+ /*
+ * Set up destination SAP
+ */
+ bzero((caddr_t) &satm, sizeof(satm));
+ satm.satm_family = AF_ATM;
+#if (defined(BSD) && (BSD >= 199103))
+ satm.satm_len = sizeof(satm);
+#endif
+ /* Destination ATM address */
+ satm.satm_addr.t_atm_sap_addr.SVE_tag_addr = T_ATM_PRESENT;
+ satm.satm_addr.t_atm_sap_addr.SVE_tag_selector = T_ATM_PRESENT;
+ satm.satm_addr.t_atm_sap_addr.address_format = T_ATM_ENDSYS_ADDR;
+ satm.satm_addr.t_atm_sap_addr.address_length = sizeof(Atm_addr_nsap);
+ bcopy((caddr_t)&dst_addr,
+ (caddr_t)satm.satm_addr.t_atm_sap_addr.address,
+ sizeof(dst_addr));
+
+ /* BLLI Layer-2 protocol */
+ satm.satm_addr.t_atm_sap_layer2.SVE_tag = T_ATM_PRESENT;
+ satm.satm_addr.t_atm_sap_layer2.ID_type = T_ATM_USER_ID;
+ satm.satm_addr.t_atm_sap_layer2.ID.user_defined_ID = MY_ID;
+
+ /* BLLI Layer-3 protocol */
+ satm.satm_addr.t_atm_sap_layer3.SVE_tag = T_ATM_ABSENT;
+
+ /* BHLI protocol */
+ satm.satm_addr.t_atm_sap_appl.SVE_tag = T_ATM_ABSENT;
+
+ /*
+ * Set up connection parameters
+ */
+ aal5.forward_max_SDU_size = MAX_LEN;
+ aal5.backward_max_SDU_size = MAX_LEN;
+ aal5.SSCS_type = T_ATM_NULL;
+ optlen = sizeof(aal5);
+ if (setsockopt(s, T_ATM_SIGNALING, T_ATM_AAL5, (caddr_t)&aal5,
+ optlen) < 0) {
+ perror("setsockopt(aal5)");
+ exit(1);
+ }
+
+ traffic.forward.PCR_high_priority = T_ATM_ABSENT;
+ traffic.forward.PCR_all_traffic = 100000;
+ traffic.forward.SCR_high_priority = T_ATM_ABSENT;
+ traffic.forward.SCR_all_traffic = T_ATM_ABSENT;
+ traffic.forward.MBS_high_priority = T_ATM_ABSENT;
+ traffic.forward.MBS_all_traffic = T_ATM_ABSENT;
+ traffic.forward.tagging = T_NO;
+ traffic.backward.PCR_high_priority = T_ATM_ABSENT;
+ traffic.backward.PCR_all_traffic = 100000;
+ traffic.backward.SCR_high_priority = T_ATM_ABSENT;
+ traffic.backward.SCR_all_traffic = T_ATM_ABSENT;
+ traffic.backward.MBS_high_priority = T_ATM_ABSENT;
+ traffic.backward.MBS_all_traffic = T_ATM_ABSENT;
+ traffic.backward.tagging = T_NO;
+ traffic.best_effort = T_YES;
+ optlen = sizeof(traffic);
+ if (setsockopt(s, T_ATM_SIGNALING, T_ATM_TRAFFIC, (caddr_t)&traffic,
+ optlen) < 0) {
+ perror("setsockopt(traffic)");
+ exit(1);
+ }
+
+ bearer.bearer_class = T_ATM_CLASS_X;
+ bearer.traffic_type = T_ATM_NULL;
+ bearer.timing_requirements = T_ATM_NULL;
+ bearer.clipping_susceptibility = T_NO;
+ bearer.connection_configuration = T_ATM_1_TO_1;
+ optlen = sizeof(bearer);
+ if (setsockopt(s, T_ATM_SIGNALING, T_ATM_BEARER_CAP, (caddr_t)&bearer,
+ optlen) < 0) {
+ perror("setsockopt(bearer)");
+ exit(1);
+ }
+
+ qos.coding_standard = T_ATM_NETWORK_CODING;
+ qos.forward.qos_class = T_ATM_QOS_CLASS_0;
+ qos.backward.qos_class = T_ATM_QOS_CLASS_0;
+ optlen = sizeof(qos);
+ if (setsockopt(s, T_ATM_SIGNALING, T_ATM_QOS, (caddr_t)&qos,
+ optlen) < 0) {
+ perror("setsockopt(qos)");
+ exit(1);
+ }
+
+ strncpy(netintf.net_intf, "ni0", IFNAMSIZ);
+ optlen = sizeof(netintf);
+ if (setsockopt(s, T_ATM_SIGNALING, T_ATM_NET_INTF, (caddr_t)&netintf,
+ optlen) < 0) {
+ perror("setsockopt(net_intf)");
+ exit(1);
+ }
+
+ strncpy(appname.app_name, MY_APPL, T_ATM_APP_NAME_LEN);
+ optlen = sizeof(appname);
+ if (setsockopt(s, T_ATM_SIGNALING, T_ATM_APP_NAME, (caddr_t)&appname,
+ optlen) < 0) {
+ perror("setsockopt(app_name)");
+ exit(1);
+ }
+
+ /*
+ * Now try to connect to destination
+ */
+ if (connect(s, (struct sockaddr *) &satm, sizeof(satm)) < 0) {
+ perror("connect");
+ exit(1);
+ }
+
+ /*
+ * Exchange message with peer
+ */
+ if (write(s, message, sizeof(message)) != sizeof(message)) {
+ perror("write");
+ exit(1);
+ }
+
+ if ((n = read(s, buffer, MAX_LEN) < 0)) {
+ perror("read");
+ exit(1);
+ }
+
+ buffer[n] = '\0';
+ printf("received %d bytes: <%s>\n", n, buffer);
+
+ /*
+ * Finish up
+ */
+ if (close(s) < 0) {
+ perror("close");
+ exit(1);
+ }
+
+ exit(0);
+}
+
+ @(#) $Id: atm_sockets,v 1.1 1998/08/26 21:52:01 mks Exp $
+