summaryrefslogtreecommitdiffstats
path: root/sys/netatm/atm_usrreq.c
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2008-05-25 22:11:40 +0000
committerrwatson <rwatson@FreeBSD.org>2008-05-25 22:11:40 +0000
commita3623cb733d4a3ddcf8ba280724b8ce3f19a7a58 (patch)
treeafe56b8f23cfc7884850445d064a110b6ac85c9e /sys/netatm/atm_usrreq.c
parent2f956b205ca6c855f85983809448ddc387407d46 (diff)
downloadFreeBSD-src-a3623cb733d4a3ddcf8ba280724b8ce3f19a7a58.zip
FreeBSD-src-a3623cb733d4a3ddcf8ba280724b8ce3f19a7a58.tar.gz
Remove netatm from HEAD as it is not MPSAFE and relies on the now removed
NET_NEEDS_GIANT. netatm has been disconnected from the build for ten months in HEAD/RELENG_7. Specifics: - netatm include files - netatm command line management tools - libatm - ATM parts in rescue and sysinstall - sample configuration files and documents - kernel support as a module or in NOTES - netgraph wrapper nodes for netatm - ctags data for netatm. - netatm-specific device drivers. MFC after: 3 weeks Reviewed by: bz Discussed with: bms, bz, harti
Diffstat (limited to 'sys/netatm/atm_usrreq.c')
-rw-r--r--sys/netatm/atm_usrreq.c739
1 files changed, 0 insertions, 739 deletions
diff --git a/sys/netatm/atm_usrreq.c b/sys/netatm/atm_usrreq.c
deleted file mode 100644
index 6f40a46..0000000
--- a/sys/netatm/atm_usrreq.c
+++ /dev/null
@@ -1,739 +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 DGRAM socket protocol processing
- */
-
-#include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/sockio.h>
-#include <sys/priv.h>
-#include <sys/protosw.h>
-#include <sys/socket.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_ioctl.h>
-#include <netatm/atm_sigmgr.h>
-#include <netatm/atm_stack.h>
-#include <netatm/atm_pcb.h>
-#include <netatm/atm_var.h>
-
-
-/*
- * Local functions
- */
-static int atm_dgram_attach(struct socket *, int, struct thread *);
-static int atm_dgram_control(struct socket *, u_long, caddr_t,
- struct ifnet *, struct thread *);
-static int atm_dgram_info(caddr_t);
-
-
-/*
- * New-style socket request routines
- */
-struct pr_usrreqs atm_dgram_usrreqs = {
- .pru_abort = atm_proto_notsupp5,
- .pru_attach = atm_dgram_attach,
- .pru_bind = atm_proto_notsupp2,
- .pru_control = atm_dgram_control,
- .pru_detach = atm_proto_notsupp5,
- .pru_disconnect = atm_proto_notsupp1,
- .pru_peeraddr = atm_proto_notsupp3,
- .pru_send = atm_proto_notsupp4,
- .pru_shutdown = atm_proto_notsupp1,
- .pru_sockaddr = atm_proto_notsupp3,
- .pru_sosend = NULL,
- .pru_soreceive = NULL,
- .pru_sopoll = NULL,
- .pru_close = atm_proto_notsupp5,
-};
-
-
-/*
- * Handy common code macros
- */
-#ifdef DIAGNOSTIC
-#define ATM_INTRO() \
- int s, err = 0; \
- s = splnet(); \
- /* \
- * Stack queue should have been drained \
- */ \
- if (atm_stackq_head != NULL) \
- panic("atm_usrreq: stack queue not empty"); \
- ;
-#else
-#define ATM_INTRO() \
- int s, err = 0; \
- s = splnet(); \
- ;
-#endif
-
-#define ATM_OUTRO() \
- /* \
- * Drain any deferred calls \
- */ \
- STACK_DRAIN(); \
- (void) splx(s); \
- return (err); \
- ;
-
-#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_dgram_attach(so, proto, td)
- struct socket *so;
- int proto;
- struct thread *td;
-{
- ATM_INTRO();
-
- /*
- * Nothing to do here for ioctl()-only sockets
- */
- ATM_OUTRO();
-}
-
-
-/*
- * Process ioctl system calls
- *
- * 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_dgram_control(so, cmd, data, ifp, td)
- struct socket *so;
- u_long cmd;
- caddr_t data;
- struct ifnet *ifp;
- struct thread *td;
-{
- ATM_INTRO();
-
- /*
- * First, figure out which ioctl we're dealing with and
- * then process it based on the sub-op code
- */
- switch (cmd) {
-
- case AIOCCFG: {
- struct atmcfgreq *acp = (struct atmcfgreq *)data;
- struct atm_pif *pip;
-
- if (td != NULL) {
- err = priv_check(td, PRIV_NETATM_CFG);
- if (err)
- ATM_RETERR(err);
- }
-
- switch (acp->acr_opcode) {
-
- case AIOCS_CFG_ATT:
- /*
- * Attach signalling manager
- */
- if ((pip = atm_pifname(acp->acr_att_intf)) == NULL)
- ATM_RETERR(ENXIO);
- err = atm_sigmgr_attach(pip, acp->acr_att_proto);
- break;
-
- case AIOCS_CFG_DET:
- /*
- * Detach signalling manager
- */
- if ((pip = atm_pifname(acp->acr_det_intf)) == NULL)
- ATM_RETERR(ENXIO);
- err = atm_sigmgr_detach(pip);
- break;
-
- default:
- err = EOPNOTSUPP;
- }
- break;
- }
-
- case AIOCADD: {
- struct atmaddreq *aap = (struct atmaddreq *)data;
- Atm_endpoint *epp;
-
- if (td != NULL) {
- err = priv_check(td, PRIV_NETATM_ADD);
- if (err)
- ATM_RETERR(err);
- }
-
- switch (aap->aar_opcode) {
-
- case AIOCS_ADD_PVC:
- /*
- * Add a PVC definition
- */
-
- /*
- * Locate requested endpoint service
- */
- epp = aap->aar_pvc_sap > ENDPT_MAX ? NULL :
- atm_endpoints[aap->aar_pvc_sap];
- if (epp == NULL)
- ATM_RETERR(ENOPROTOOPT);
-
- /*
- * Let endpoint service handle it from here
- */
- err = (*epp->ep_ioctl)(AIOCS_ADD_PVC, data, NULL);
- break;
-
- case AIOCS_ADD_ARP:
- /*
- * Add an ARP mapping
- */
- epp = atm_endpoints[ENDPT_IP];
- if (epp == NULL)
- ATM_RETERR(ENOPROTOOPT);
-
- /*
- * Let IP/ATM endpoint handle this
- */
- err = (*epp->ep_ioctl) (AIOCS_ADD_ARP, data, NULL);
- break;
-
- default:
- err = EOPNOTSUPP;
- }
- break;
- }
-
- case AIOCDEL: {
- struct atmdelreq *adp = (struct atmdelreq *)data;
- struct atm_pif *pip;
- struct sigmgr *smp;
- Atm_endpoint *epp;
-
- if (td != NULL) {
- err = priv_check(td, PRIV_NETATM_DEL);
- if (err)
- ATM_RETERR(err);
- }
-
- switch (adp->adr_opcode) {
-
- case AIOCS_DEL_PVC:
- case AIOCS_DEL_SVC:
- /*
- * Delete a PVC or SVC
- */
-
- /*
- * Locate appropriate sigmgr
- */
- if ((pip = atm_pifname(adp->adr_pvc_intf)) == NULL)
- ATM_RETERR(ENXIO);
- if ((smp = pip->pif_sigmgr) == NULL)
- ATM_RETERR(ENOENT);
-
- /*
- * Let sigmgr handle it from here
- */
- err = (*smp->sm_ioctl)(adp->adr_opcode, data,
- (caddr_t)pip->pif_siginst);
- break;
-
- case AIOCS_DEL_ARP:
- /*
- * Delete an ARP mapping
- */
- epp = atm_endpoints[ENDPT_IP];
- if (epp == NULL)
- ATM_RETERR(ENOPROTOOPT);
-
- /*
- * Let IP/ATM endpoint handle this
- */
- err = (*epp->ep_ioctl) (AIOCS_DEL_ARP, data, NULL);
- break;
-
- default:
- err = EOPNOTSUPP;
- }
- break;
- }
-
- case AIOCSET: {
- struct atmsetreq *asp = (struct atmsetreq *)data;
- struct atm_pif *pip;
- struct atm_nif *nip;
- struct sigmgr *smp;
- struct ifnet *ifp2;
-
- if (td != NULL) {
- err = priv_check(td, PRIV_NETATM_SET);
- if (err)
- ATM_RETERR(err);
- }
-
- switch (asp->asr_opcode) {
-
- case AIOCS_SET_ASV:
- /*
- * Set an ARP server address
- */
-
- /*
- * Locate appropriate sigmgr
- */
- if ((nip = atm_nifname(asp->asr_arp_intf)) == NULL)
- ATM_RETERR(ENXIO);
- pip = nip->nif_pif;
- if ((smp = pip->pif_sigmgr) == NULL)
- ATM_RETERR(ENOENT);
-
- /*
- * Let sigmgr handle it from here
- */
- err = (*smp->sm_ioctl)(AIOCS_SET_ASV, data,
- (caddr_t)nip);
- break;
-
- case AIOCS_SET_MAC:
- /*
- * Set physical interface MAC/ESI address
- */
-
- /*
- * Locate physical interface
- */
- if ((pip = atm_pifname(asp->asr_mac_intf)) == NULL)
- ATM_RETERR(ENXIO);
-
- /*
- * Interface must be detached
- */
- if (pip->pif_sigmgr != NULL)
- ATM_RETERR(EADDRINUSE);
-
- /*
- * Just plunk the address into the pif
- */
- bcopy((caddr_t)&asp->asr_mac_addr,
- (caddr_t)&pip->pif_macaddr,
- sizeof(struct mac_addr));
- break;
-
- case AIOCS_SET_NIF:
- /*
- * Define network interfaces
- */
- if ((pip = atm_pifname(asp->asr_nif_intf)) == NULL)
- ATM_RETERR(ENXIO);
-
- /*
- * Validate interface count - logical interfaces
- * are differentiated by the atm address selector.
- */
- if (asp->asr_nif_cnt == 0 || asp->asr_nif_cnt > 256)
- ATM_RETERR(EINVAL);
-
- /*
- * Make sure prefix name is unique
- */
- IFNET_RLOCK();
- TAILQ_FOREACH(ifp2, &ifnet, if_link) {
- if (!strcmp(ifp2->if_dname, asp->asr_nif_pref)) {
- /*
- * If this is for the interface we're
- * (re-)defining, let it through
- */
- for (nip = pip->pif_nif; nip;
- nip = nip->nif_pnext) {
- if (ANIF2IFP(nip) == ifp2)
- break;
- }
- if (nip)
- continue;
- IFNET_RUNLOCK();
- ATM_RETERR(EEXIST);
- }
- }
- IFNET_RUNLOCK();
-
- /*
- * Let interface handle it from here
- */
- err = (*pip->pif_ioctl)(AIOCS_SET_NIF, data,
- (caddr_t)pip);
- break;
-
- case AIOCS_SET_PRF:
- /*
- * Set interface NSAP Prefix
- */
-
- /*
- * Locate appropriate sigmgr
- */
- if ((pip = atm_pifname(asp->asr_prf_intf)) == NULL)
- ATM_RETERR(ENXIO);
- if ((smp = pip->pif_sigmgr) == NULL)
- ATM_RETERR(ENOENT);
-
- /*
- * Let sigmgr handle it from here
- */
- err = (*smp->sm_ioctl)(AIOCS_SET_PRF, data,
- (caddr_t)pip->pif_siginst);
- break;
-
- default:
- err = EOPNOTSUPP;
- }
- break;
- }
-
- case AIOCINFO:
- err = atm_dgram_info(data);
- break;
-
- default:
- err = EOPNOTSUPP;
- }
-
-out:
- ATM_OUTRO();
-}
-
-
-/*
- * Process AIOCINFO ioctl system calls
- *
- * Called at splnet.
- *
- * Arguments:
- * data pointer to AIOCINFO parameter structure
- *
- * Returns:
- * 0 request processed
- * errno error processing request - reason indicated
- *
- */
-static int
-atm_dgram_info(data)
- caddr_t data;
-{
- struct atminfreq *aip = (struct atminfreq *)data;
- struct atm_pif *pip;
- struct atm_nif *nip;
- struct sigmgr *smp;
- Atm_endpoint *epp;
- int len = aip->air_buf_len;
- int err = 0;
-
- switch (aip->air_opcode) {
-
- case AIOCS_INF_VST:
- case AIOCS_INF_CFG:
- /*
- * Get vendor interface information
- */
- if (aip->air_vinfo_intf[0] != '\0') {
- /*
- * Interface specified
- */
- if ((pip = atm_pifname(aip->air_vinfo_intf))) {
- err = (*pip->pif_ioctl)(aip->air_opcode, data,
- (caddr_t)pip);
- } else {
- err = ENXIO;
- }
- } else {
- /*
- * Want info for every interface
- */
- for (pip = atm_interface_head; pip;
- pip = pip->pif_next) {
- err = (*pip->pif_ioctl)(aip->air_opcode, data,
- (caddr_t)pip);
- if (err)
- break;
- }
- }
- break;
-
- case AIOCS_INF_IPM:
- /*
- * Get IP Map information
- */
- epp = atm_endpoints[ENDPT_IP];
- if (epp) {
- err = (*epp->ep_ioctl) (AIOCS_INF_IPM, data, NULL);
- } else {
- err = ENOPROTOOPT;
- }
- break;
-
- case AIOCS_INF_ARP:
- /*
- * Get ARP table information
- */
- for (pip = atm_interface_head; pip; pip = pip->pif_next) {
- if ((smp = pip->pif_sigmgr) != NULL) {
- err = (*smp->sm_ioctl)(AIOCS_INF_ARP,
- data, (caddr_t)pip->pif_siginst);
- }
- if (err)
- break;
- }
- break;
-
- case AIOCS_INF_ASV:
- /*
- * Get ARP server information
- */
- if (aip->air_asrv_intf[0] != '\0') {
- /*
- * Interface specified
- */
- if ((nip = atm_nifname(aip->air_asrv_intf))) {
- if ((smp = nip->nif_pif->pif_sigmgr) != NULL) {
- err = (*smp->sm_ioctl)(AIOCS_INF_ASV,
- data, (caddr_t)nip);
- }
- } else {
- err = ENXIO;
- }
- } else {
- /*
- * Want info for all arp servers
- */
- for (pip = atm_interface_head; pip;
- pip = pip->pif_next) {
- if ((smp = pip->pif_sigmgr) != NULL) {
- for (nip = pip->pif_nif; nip;
- nip = nip->nif_pnext) {
- err = (*smp->sm_ioctl)
- (AIOCS_INF_ASV, data,
- (caddr_t)nip);
- if (err)
- break;
- }
- if (err)
- break;
- }
- }
- }
- break;
-
- case AIOCS_INF_INT:
- /*
- * Get physical interface info
- */
- if (aip->air_int_intf[0] != '\0') {
- /*
- * Interface specified
- */
- if ((pip = atm_pifname(aip->air_int_intf))) {
- err = (*pip->pif_ioctl)(AIOCS_INF_INT,
- data, (caddr_t)pip);
- } else {
- err = ENXIO;
- }
- } else {
- /*
- * Want info for every physical interface
- */
- for (pip = atm_interface_head; pip;
- pip = pip->pif_next) {
- err = (*pip->pif_ioctl)(AIOCS_INF_INT,
- data, (caddr_t)pip);
- if (err)
- break;
- }
- }
- break;
-
- case AIOCS_INF_VCC:
- /*
- * Get VCC information
- */
- if (aip->air_vcc_intf[0] != '\0') {
- /*
- * Interface specified
- */
- if ((pip = atm_pifname(aip->air_vcc_intf))) {
- if ((smp = pip->pif_sigmgr) != NULL) {
- err = (*smp->sm_ioctl)(AIOCS_INF_VCC,
- data,
- (caddr_t)pip->pif_siginst);
- }
- } else {
- err = ENXIO;
- }
- } else {
- /*
- * Want info for every interface
- */
- for (pip = atm_interface_head; pip;
- pip = pip->pif_next) {
- if ((smp = pip->pif_sigmgr) != NULL) {
- err = (*smp->sm_ioctl)(AIOCS_INF_VCC,
- data,
- (caddr_t)pip->pif_siginst);
- }
- if (err)
- break;
- }
- }
- break;
-
- case AIOCS_INF_NIF:
- /*
- * Get network interface info
- */
- if (aip->air_int_intf[0] != '\0') {
- /*
- * Interface specified
- */
- if ((nip = atm_nifname(aip->air_int_intf))) {
- pip = nip->nif_pif;
- err = (*pip->pif_ioctl)(AIOCS_INF_NIF,
- data, (caddr_t)nip);
- } else {
- err = ENXIO;
- }
- } else {
- /*
- * Want info for every network interface
- */
- for (pip = atm_interface_head; pip;
- pip = pip->pif_next) {
- for (nip = pip->pif_nif; nip;
- nip = nip->nif_pnext) {
- err = (*pip->pif_ioctl)(AIOCS_INF_NIF,
- data, (caddr_t)nip);
- if (err)
- break;
- }
- if (err)
- break;
- }
- }
- break;
-
- case AIOCS_INF_PIS:
- /*
- * Get physical interface statistics
- */
- if (aip->air_physt_intf[0] != '\0') {
- /*
- * Interface specified
- */
- if ((pip = atm_pifname(aip->air_physt_intf))) {
- err = (*pip->pif_ioctl)(AIOCS_INF_PIS,
- data, (caddr_t)pip);
- } else {
- err = ENXIO;
- }
- } else {
- /*
- * Want statistics for every physical interface
- */
- for (pip = atm_interface_head; pip;
- pip = pip->pif_next) {
- err = (*pip->pif_ioctl)(AIOCS_INF_PIS,
- data, (caddr_t)pip);
- if (err)
- break;
- }
- }
- break;
-
- case AIOCS_INF_VER:
- /*
- * Get ATM software version
- */
- if (len < sizeof(atm_version)) {
- err = ENOSPC;
- break;
- }
- if ((err = copyout((caddr_t)&atm_version,
- aip->air_buf_addr,
- sizeof(atm_version))) != 0) {
- break;
- }
- aip->air_buf_addr += sizeof(atm_version);
- aip->air_buf_len -= sizeof(atm_version);
- break;
-
- default:
- err = EOPNOTSUPP;
- }
-
- /*
- * Calculate returned buffer length
- */
- aip->air_buf_len = len - aip->air_buf_len;
-
- return (err);
-}
-
OpenPOWER on IntegriCloud