summaryrefslogtreecommitdiffstats
path: root/sys/netatm/atm_aal5.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netatm/atm_aal5.c')
-rw-r--r--sys/netatm/atm_aal5.c941
1 files changed, 0 insertions, 941 deletions
diff --git a/sys/netatm/atm_aal5.c b/sys/netatm/atm_aal5.c
deleted file mode 100644
index a0534b7..0000000
--- a/sys/netatm/atm_aal5.c
+++ /dev/null
@@ -1,941 +0,0 @@
-/*-
- * ===================================
- * HARP | Host ATM Research Platform
- * ===================================
- *
- *
- * This Host ATM Research Platform ("HARP") file (the "Software") is
- * made available by Network Computing Services, Inc. ("NetworkCS")
- * "AS IS". NetworkCS does not provide maintenance, improvements or
- * support of any kind.
- *
- * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
- * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
- * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
- * In no event shall NetworkCS be responsible for any damages, including
- * but not limited to consequential damages, arising from or relating to
- * any use of the Software or related support.
- *
- * Copyright 1994-1998 Network Computing Services, Inc.
- *
- * Copies of this Software may be made, however, the above copyright
- * notice must be reproduced on all copies.
- */
-
-/*
- * Core ATM Services
- * -----------------
- *
- * ATM AAL5 socket protocol processing
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/lock.h>
-#include <sys/protosw.h>
-#include <sys/signalvar.h>
-#include <sys/socket.h>
-#include <sys/socketvar.h>
-#include <sys/stat.h>
-#include <sys/sx.h>
-#include <sys/systm.h>
-#include <net/if.h>
-#include <netatm/port.h>
-#include <netatm/queue.h>
-#include <netatm/atm.h>
-#include <netatm/atm_sys.h>
-#include <netatm/atm_sap.h>
-#include <netatm/atm_cm.h>
-#include <netatm/atm_if.h>
-#include <netatm/atm_stack.h>
-#include <netatm/atm_pcb.h>
-#include <netatm/atm_var.h>
-
-
-/*
- * Global variables
- */
-u_long atm_aal5_sendspace = 64 * 1024; /* XXX */
-u_long atm_aal5_recvspace = 64 * 1024; /* XXX */
-
-
-/*
- * Local functions
- */
-static int atm_aal5_attach(struct socket *, int, struct thread *td);
-static void atm_aal5_detach(struct socket *);
-static int atm_aal5_bind(struct socket *, struct sockaddr *,
- struct thread *td);
-static int atm_aal5_listen(struct socket *, int backlog,
- struct thread *td);
-static int atm_aal5_connect(struct socket *, struct sockaddr *,
- struct thread *td);
-static int atm_aal5_accept(struct socket *, struct sockaddr **);
-static int atm_aal5_disconnect(struct socket *);
-static int atm_aal5_shutdown(struct socket *);
-static int atm_aal5_send(struct socket *, int, KBuffer *,
- struct sockaddr *, KBuffer *, struct thread *td);
-static void atm_aal5_abort(struct socket *);
-static int atm_aal5_control(struct socket *, u_long, caddr_t,
- struct ifnet *, struct thread *td);
-static int atm_aal5_sense(struct socket *, struct stat *);
-static int atm_aal5_sockaddr(struct socket *, struct sockaddr **);
-static int atm_aal5_peeraddr(struct socket *, struct sockaddr **);
-static int atm_aal5_incoming(void *, Atm_connection *,
- Atm_attributes *, void **);
-static void atm_aal5_cpcs_data(void *, KBuffer *);
-static caddr_t atm_aal5_getname(void *);
-static void atm_aal5_close(struct socket *);
-
-
-/*
- * New-style socket request routines
- */
-struct pr_usrreqs atm_aal5_usrreqs = {
- .pru_abort = atm_aal5_abort,
- .pru_accept = atm_aal5_accept,
- .pru_attach = atm_aal5_attach,
- .pru_bind = atm_aal5_bind,
- .pru_connect = atm_aal5_connect,
- .pru_control = atm_aal5_control,
- .pru_detach = atm_aal5_detach,
- .pru_disconnect = atm_aal5_disconnect,
- .pru_listen = atm_aal5_listen,
- .pru_peeraddr = atm_aal5_peeraddr,
- .pru_send = atm_aal5_send,
- .pru_sense = atm_aal5_sense,
- .pru_shutdown = atm_aal5_shutdown,
- .pru_sockaddr = atm_aal5_sockaddr,
- .pru_close = atm_aal5_close,
-};
-
-/*
- * Local variables
- */
-static Atm_endpoint atm_aal5_endpt = {
- NULL,
- ENDPT_SOCK_AAL5,
- NULL,
- atm_aal5_getname,
- atm_sock_connected,
- atm_sock_cleared,
- atm_aal5_incoming,
- NULL,
- NULL,
- NULL,
- atm_aal5_cpcs_data,
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-static Atm_attributes atm_aal5_defattr = {
- NULL, /* nif */
- CMAPI_CPCS, /* api */
- 0, /* api_init */
- 0, /* headin */
- 0, /* headout */
- { /* aal */
- T_ATM_PRESENT,
- ATM_AAL5
- },
- { /* traffic */
- T_ATM_ABSENT,
- },
- { /* bearer */
- T_ATM_ABSENT,
- },
- { /* bhli */
- T_ATM_ABSENT
- },
- { /* blli */
- T_ATM_ABSENT,
- T_ATM_ABSENT,
- },
- { /* llc */
- T_ATM_ABSENT,
- },
- { /* called */
- T_ATM_ABSENT,
- {
- T_ATM_ABSENT,
- 0
- },
- {
- T_ATM_ABSENT,
- 0
- }
- },
- { /* calling */
- T_ATM_ABSENT
- },
- { /* qos */
- T_ATM_ABSENT,
- },
- { /* transit */
- T_ATM_ABSENT
- },
- { /* cause */
- T_ATM_ABSENT
- }
-};
-
-
-/*
- * Handy common code macros
- */
-#ifdef DIAGNOSTIC
-#define ATM_INTRO(f) \
- int s, err = 0; \
- s = splnet(); \
- ATM_DEBUG2("aal5 socket %s (%p)\n", f, so); \
- /* \
- * Stack queue should have been drained \
- */ \
- if (atm_stackq_head != NULL) \
- panic("atm_aal5: stack queue not empty"); \
- ;
-#else /* !DIAGNOSTIC */
-#define ATM_INTRO(f) \
- int s, err = 0; \
- s = splnet(); \
- ;
-#endif /* DIAGNOSTIC */
-
-#define ATM_INTRO_NOERR(f) \
- int s; \
- s = splnet(); \
- ;
-
-#define ATM_OUTRO() \
- /* \
- * Drain any deferred calls \
- */ \
- STACK_DRAIN(); \
- (void) splx(s); \
- return (err); \
- ;
-
-#define ATM_OUTRO_NOERR() \
- /* \
- * Drain any deferred calls \
- */ \
- STACK_DRAIN(); \
- (void) splx(s); \
- ;
-
-#define ATM_RETERR(errno) { \
- err = errno; \
- goto out; \
-}
-
-
-/*
- * Attach protocol to socket
- *
- * Arguments:
- * so pointer to socket
- * proto protocol identifier
- * p pointer to process
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static int
-atm_aal5_attach(so, proto, td)
- struct socket *so;
- int proto;
- struct thread *td;
-{
- Atm_pcb *atp;
-
- ATM_INTRO("attach");
-
- /*
- * Do general attach stuff
- */
- err = atm_sock_attach(so, atm_aal5_sendspace, atm_aal5_recvspace);
- if (err)
- ATM_RETERR(err);
-
- /*
- * Finish up any protocol specific stuff
- */
- atp = sotoatmpcb(so);
- atp->atp_type = ATPT_AAL5;
-
- /*
- * Set default connection attributes
- */
- atp->atp_attr = atm_aal5_defattr;
- strncpy(atp->atp_name, "(AAL5)", T_ATM_APP_NAME_LEN);
-
-out:
- ATM_OUTRO();
-}
-
-
-/*
- * Detach protocol from socket
- *
- * Arguments:
- * so pointer to socket
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static void
-atm_aal5_detach(so)
- struct socket *so;
-{
- ATM_INTRO_NOERR("detach");
-
- atm_sock_detach(so);
-
- ATM_OUTRO_NOERR();
-}
-
-
-/*
- * Bind address to socket
- *
- * Arguments:
- * so pointer to socket
- * addr pointer to protocol address
- * p pointer to process
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static int
-atm_aal5_bind(so, addr, td)
- struct socket *so;
- struct sockaddr *addr;
- struct thread *td;
-{
- ATM_INTRO("bind");
-
- err = atm_sock_bind(so, addr);
-
- ATM_OUTRO();
-}
-
-
-/*
- * Listen for incoming connections
- *
- * Arguments:
- * so pointer to socket
- * p pointer to process
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static int
-atm_aal5_listen(so, backlog, td)
- struct socket *so;
- int backlog;
- struct thread *td;
-{
- ATM_INTRO("listen");
-
- err = atm_sock_listen(so, &atm_aal5_endpt, backlog);
-
- ATM_OUTRO();
-}
-
-
-/*
- * Connect socket to peer
- *
- * Arguments:
- * so pointer to socket
- * addr pointer to protocol address
- * p pointer to process
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static int
-atm_aal5_connect(so, addr, td)
- struct socket *so;
- struct sockaddr *addr;
- struct thread *td;
-{
- Atm_pcb *atp;
-
- ATM_INTRO("connect");
-
- atp = sotoatmpcb(so);
-
- /*
- * Resize send socket buffer to maximum sdu size
- */
- if (atp->atp_attr.aal.tag == T_ATM_PRESENT) {
- long size;
-
- size = atp->atp_attr.aal.v.aal5.forward_max_SDU_size;
- if (size != T_ATM_ABSENT)
- if (!sbreserve(&so->so_snd, size, so, td)) {
- err = ENOBUFS;
- ATM_OUTRO();
- }
-
- }
-
- /*
- * Now get the socket connected
- */
- err = atm_sock_connect(so, addr, &atm_aal5_endpt);
-
- ATM_OUTRO();
-}
-
-
-/*
- * Accept pending connection
- *
- * Arguments:
- * so pointer to socket
- * addr pointer to pointer to contain protocol address
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static int
-atm_aal5_accept(so, addr)
- struct socket *so;
- struct sockaddr **addr;
-{
- ATM_INTRO("accept");
-
- /*
- * Everything is pretty much done already, we just need to
- * return the caller's address to the user.
- */
- err = atm_sock_peeraddr(so, addr);
-
- ATM_OUTRO();
-}
-
-
-/*
- * Disconnect connected socket
- *
- * Arguments:
- * so pointer to socket
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static int
-atm_aal5_disconnect(so)
- struct socket *so;
-{
- ATM_INTRO("disconnect");
-
- err = atm_sock_disconnect(so);
-
- ATM_OUTRO();
-}
-
-
-/*
- * Shut down socket data transmission
- *
- * Arguments:
- * so pointer to socket
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static int
-atm_aal5_shutdown(so)
- struct socket *so;
-{
- ATM_INTRO("shutdown");
-
- socantsendmore(so);
-
- ATM_OUTRO();
-}
-
-
-/*
- * Send user data
- *
- * Arguments:
- * so pointer to socket
- * flags send data flags
- * m pointer to buffer containing user data
- * addr pointer to protocol address
- * control pointer to buffer containing protocol control data
- * p pointer to process
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static int
-atm_aal5_send(so, flags, m, addr, control, td)
- struct socket *so;
- int flags;
- KBuffer *m;
- struct sockaddr *addr;
- KBuffer *control;
- struct thread *td;
-{
- Atm_pcb *atp;
-
- ATM_INTRO("send");
-
- /*
- * We don't support any control functions
- */
- if (control) {
- int clen;
-
- clen = KB_LEN(control);
- KB_FREEALL(control);
- if (clen) {
- KB_FREEALL(m);
- ATM_RETERR(EINVAL);
- }
- }
-
- /*
- * We also don't support any flags or send-level addressing
- */
- if (flags || addr) {
- KB_FREEALL(m);
- ATM_RETERR(EINVAL);
- }
-
- /*
- * All we've got left is the data, so push it out
- */
- atp = sotoatmpcb(so);
- err = atm_cm_cpcs_data(atp->atp_conn, m);
- if (err) {
- /*
- * Output problem, drop packet
- */
- atm_sock_stat.as_outdrop[atp->atp_type]++;
- KB_FREEALL(m);
- }
-
-out:
- ATM_OUTRO();
-}
-
-
-/*
- * Abnormally terminate service
- *
- * Arguments:
- * so pointer to socket
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static void
-atm_aal5_abort(so)
- struct socket *so;
-{
- ATM_INTRO_NOERR("abort");
-
- (void)atm_sock_disconnect(so);
- so->so_error = ECONNABORTED;
-
- ATM_OUTRO_NOERR();
-}
-
-static void
-atm_aal5_close(so)
- struct socket *so;
-{
- ATM_INTRO_NOERR("close");
-
- (void)atm_sock_disconnect(so);
-
- ATM_OUTRO_NOERR();
-}
-
-
-/*
- * Do control operation - ioctl system call
- *
- * Arguments:
- * so pointer to socket
- * cmd ioctl code
- * data pointer to code specific parameter data area
- * ifp pointer to ifnet structure if it's an interface ioctl
- * p pointer to process
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static int
-atm_aal5_control(so, cmd, data, ifp, td)
- struct socket *so;
- u_long cmd;
- caddr_t data;
- struct ifnet *ifp;
- struct thread *td;
-{
- ATM_INTRO("control");
-
- switch (cmd) {
-
- default:
- err = EOPNOTSUPP;
- }
-
- ATM_OUTRO();
-}
-
-/*
- * Sense socket status - fstat system call
- *
- * Arguments:
- * so pointer to socket
- * st pointer to file status structure
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static int
-atm_aal5_sense(so, st)
- struct socket *so;
- struct stat *st;
-{
- ATM_INTRO("sense");
-
- /*
- * Just return the max sdu size for the connection
- */
- st->st_blksize = so->so_snd.sb_hiwat;
-
- ATM_OUTRO();
-}
-
-
-/*
- * Retrieve local socket address
- *
- * Arguments:
- * so pointer to socket
- * addr pointer to pointer to contain protocol address
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static int
-atm_aal5_sockaddr(so, addr)
- struct socket *so;
- struct sockaddr **addr;
-{
- ATM_INTRO("sockaddr");
-
- err = atm_sock_sockaddr(so, addr);
-
- ATM_OUTRO();
-}
-
-
-/*
- * Retrieve peer socket address
- *
- * Arguments:
- * so pointer to socket
- * addr pointer to pointer to contain protocol address
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static int
-atm_aal5_peeraddr(so, addr)
- struct socket *so;
- struct sockaddr **addr;
-{
- ATM_INTRO("peeraddr");
-
- err = atm_sock_peeraddr(so, addr);
-
- ATM_OUTRO();
-}
-
-
-/*
- * Process Incoming Calls
- *
- * This function will receive control when an incoming call has been matched
- * to one of our registered listen parameter blocks. Assuming the call passes
- * acceptance criteria and all required resources are available, we will
- * create a new protocol control block and socket association. We must
- * then await notification of the final SVC setup results. If any
- * problems are encountered, we will just tell the connection manager to
- * reject the call.
- *
- * Called at splnet.
- *
- * Arguments:
- * tok owner's matched listening token
- * cop pointer to incoming call's connection block
- * ap pointer to incoming call's attributes
- * tokp pointer to location to store our connection token
- *
- * Returns:
- * 0 call is accepted
- * errno call rejected - reason indicated
- *
- */
-static int
-atm_aal5_incoming(tok, cop, ap, tokp)
- void *tok;
- Atm_connection *cop;
- Atm_attributes *ap;
- void **tokp;
-{
- Atm_pcb *atp0 = tok, *atp;
- struct socket *so;
- int err = 0;
-
- /*
- * Allocate a new socket and pcb for this connection.
- *
- * Note that our attach function will be called via sonewconn
- * and it will allocate and setup most of the pcb.
- */
- atm_sock_stat.as_inconn[atp0->atp_type]++;
- so = sonewconn(atp0->atp_socket, 0);
-
- if (so) {
- /*
- * Finish pcb setup and pass pcb back to CM
- */
- atp = sotoatmpcb(so);
- atp->atp_conn = cop;
- atp->atp_attr = *atp0->atp_conn->co_lattr;
- strncpy(atp->atp_name, atp0->atp_name, T_ATM_APP_NAME_LEN);
- *tokp = atp;
- } else {
- err = ECONNABORTED;
- atm_sock_stat.as_connfail[atp0->atp_type]++;
- }
-
- return (err);
-}
-
-
-/*
- * Process Socket VCC Input Data
- *
- * Arguments:
- * tok owner's connection token (atm_pcb)
- * m pointer to input packet buffer chain
- *
- * Returns:
- * none
- *
- */
-static void
-atm_aal5_cpcs_data(tok, m)
- void *tok;
- KBuffer *m;
-{
- Atm_pcb *atp = tok;
- struct socket *so;
- int len;
-
- so = atp->atp_socket;
-
- KB_PLENGET(m, len);
-
- /*
- * Ensure that the socket is able to receive data and
- * that there's room in the socket buffer
- */
- if (((so->so_state & SS_ISCONNECTED) == 0) ||
- (so->so_rcv.sb_state & SBS_CANTRCVMORE) ||
- (len > sbspace(&so->so_rcv))) {
- atm_sock_stat.as_indrop[atp->atp_type]++;
- KB_FREEALL(m);
- return;
- }
-
- /*
- * Queue the data and notify the user
- */
- sbappendrecord(&so->so_rcv, m);
- sorwakeup(so);
-
- return;
-}
-
-
-/*
- * Process getsockopt/setsockopt system calls
- *
- * Arguments:
- * so pointer to socket
- * sopt pointer to socket option info
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-int
-atm_aal5_ctloutput(so, sopt)
- struct socket *so;
- struct sockopt *sopt;
-{
- Atm_pcb *atp;
-
- ATM_INTRO("ctloutput");
-
- /*
- * Make sure this is for us
- */
- if (sopt->sopt_level != T_ATM_SIGNALING) {
- ATM_RETERR(EINVAL);
- }
- atp = sotoatmpcb(so);
- if (atp == NULL) {
- ATM_RETERR(ENOTCONN);
- }
-
- switch (sopt->sopt_dir) {
-
- case SOPT_SET:
- /*
- * setsockopt()
- */
-
- /*
- * Validate socket state
- */
- switch (sopt->sopt_name) {
-
- case T_ATM_ADD_LEAF:
- case T_ATM_DROP_LEAF:
- if ((so->so_state & SS_ISCONNECTED) == 0) {
- ATM_RETERR(ENOTCONN);
- }
- break;
-
- case T_ATM_CAUSE:
- case T_ATM_APP_NAME:
- break;
-
- default:
- if (so->so_state & SS_ISCONNECTED) {
- ATM_RETERR(EISCONN);
- }
- break;
- }
-
- /*
- * Validate and save user-supplied option data
- */
- err = atm_sock_setopt(so, sopt, atp);
-
- break;
-
- case SOPT_GET:
- /*
- * getsockopt()
- */
-
- /*
- * Return option data
- */
- err = atm_sock_getopt(so, sopt, atp);
-
- break;
- }
-
-out:
- ATM_OUTRO();
-}
-
-
-/*
- * Initialize AAL5 Sockets
- *
- * Arguments:
- * none
- *
- * Returns:
- * none
- *
- */
-void
-atm_aal5_init()
-{
- /*
- * Register our endpoint
- */
- if (atm_endpoint_register(&atm_aal5_endpt))
- panic("atm_aal5_init: register");
-
- /*
- * Set default connection attributes
- */
- atm_aal5_defattr.aal.v.aal5.forward_max_SDU_size = T_ATM_ABSENT;
- atm_aal5_defattr.aal.v.aal5.backward_max_SDU_size = T_ATM_ABSENT;
- atm_aal5_defattr.aal.v.aal5.SSCS_type = T_ATM_NULL;
-}
-
-
-/*
- * Get Connection's Application/Owner Name
- *
- * Arguments:
- * tok owner's connection token (atm_pcb)
- *
- * Returns:
- * addr pointer to string containing our name
- *
- */
-static caddr_t
-atm_aal5_getname(tok)
- void *tok;
-{
- Atm_pcb *atp = tok;
-
- return (atp->atp_name);
-}
-
OpenPOWER on IntegriCloud