Remove FreeBSD 2.2 protocol usrreq compatibility code.
Remove minor #ifdefs for early NetBSD and OpenBSD compatibility. Remove spl-related definitions. MFC after: 2 weeks
This commit is contained in:
parent
d49765d3fd
commit
1fc26580fc
@ -73,10 +73,6 @@ struct mtx natm_mtx;
|
||||
/*
|
||||
* user requests
|
||||
*/
|
||||
#ifdef FREEBSD_USRREQS
|
||||
/*
|
||||
* FreeBSD new usrreqs supersedes pr_usrreq.
|
||||
*/
|
||||
static int natm_usr_attach(struct socket *, int, d_thread_t *);
|
||||
static int natm_usr_detach(struct socket *);
|
||||
static int natm_usr_connect(struct socket *, struct sockaddr *, d_thread_t *);
|
||||
@ -410,283 +406,8 @@ struct pr_usrreqs natm_usrreqs = {
|
||||
.pru_sockaddr = natm_usr_sockaddr,
|
||||
};
|
||||
|
||||
#else /* !FREEBSD_USRREQS */
|
||||
#error "!FREEBSD_USRREQS not implemented - locking"
|
||||
|
||||
#if defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
int natm_usrreq(so, req, m, nam, control, p)
|
||||
#elif defined(__FreeBSD__)
|
||||
int natm_usrreq(so, req, m, nam, control)
|
||||
#endif
|
||||
|
||||
struct socket *so;
|
||||
int req;
|
||||
struct mbuf *m, *nam, *control;
|
||||
#if defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
struct proc *p;
|
||||
#endif
|
||||
|
||||
{
|
||||
int error = 0, s, s2;
|
||||
struct natmpcb *npcb;
|
||||
struct sockaddr_natm *snatm;
|
||||
struct atm_pseudoioctl api;
|
||||
struct atm_pseudohdr *aph;
|
||||
struct atm_rawioctl ario;
|
||||
struct ifnet *ifp;
|
||||
int proto = so->so_proto->pr_protocol;
|
||||
|
||||
s = SPLSOFTNET();
|
||||
|
||||
npcb = (struct natmpcb *) so->so_pcb;
|
||||
|
||||
if (npcb == NULL && req != PRU_ATTACH) {
|
||||
error = EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
||||
switch (req) {
|
||||
case PRU_ATTACH: /* attach protocol to up */
|
||||
|
||||
if (npcb) {
|
||||
error = EISCONN;
|
||||
break;
|
||||
}
|
||||
|
||||
if (so->so_snd.sb_hiwat == 0 || so->so_rcv.sb_hiwat == 0) {
|
||||
if (proto == PROTO_NATMAAL5)
|
||||
error = soreserve(so, natm5_sendspace, natm5_recvspace);
|
||||
else
|
||||
error = soreserve(so, natm0_sendspace, natm0_recvspace);
|
||||
if (error)
|
||||
break;
|
||||
}
|
||||
|
||||
so->so_pcb = (caddr_t) (npcb = npcb_alloc(M_WAITOK));
|
||||
npcb->npcb_socket = so;
|
||||
|
||||
break;
|
||||
|
||||
case PRU_DETACH: /* detach protocol from up */
|
||||
|
||||
/*
|
||||
* we turn on 'drain' *before* we sofree.
|
||||
*/
|
||||
|
||||
npcb_free(npcb, NPCB_DESTROY); /* drain */
|
||||
ACCEPT_LOCK();
|
||||
SOCK_LOCK(so);
|
||||
so->so_pcb = NULL;
|
||||
sotryfree(so);
|
||||
|
||||
break;
|
||||
|
||||
case PRU_CONNECT: /* establish connection to peer */
|
||||
|
||||
/*
|
||||
* validate nam and npcb
|
||||
*/
|
||||
|
||||
if (nam->m_len != sizeof(*snatm)) {
|
||||
error = EINVAL;
|
||||
break;
|
||||
}
|
||||
snatm = mtod(nam, struct sockaddr_natm *);
|
||||
if (snatm->snatm_len != sizeof(*snatm) ||
|
||||
(npcb->npcb_flags & NPCB_FREE) == 0) {
|
||||
error = EINVAL;
|
||||
break;
|
||||
}
|
||||
if (snatm->snatm_family != AF_NATM) {
|
||||
error = EAFNOSUPPORT;
|
||||
break;
|
||||
}
|
||||
|
||||
snatm->snatm_if[IFNAMSIZ-1] = '\0'; /* XXX ensure null termination
|
||||
since ifunit() uses strcmp */
|
||||
|
||||
/*
|
||||
* convert interface string to ifp, validate.
|
||||
*/
|
||||
|
||||
ifp = ifunit(snatm->snatm_if);
|
||||
if (ifp == NULL || (ifp->if_flags & IFF_RUNNING) == 0) {
|
||||
error = ENXIO;
|
||||
break;
|
||||
}
|
||||
if (ifp->if_output != atm_output) {
|
||||
error = EAFNOSUPPORT;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* register us with the NATM PCB layer
|
||||
*/
|
||||
|
||||
if (npcb_add(npcb, ifp, snatm->snatm_vci, snatm->snatm_vpi) != npcb) {
|
||||
error = EADDRINUSE;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* enable rx
|
||||
*/
|
||||
|
||||
ATM_PH_FLAGS(&api.aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0;
|
||||
ATM_PH_VPI(&api.aph) = npcb->npcb_vpi;
|
||||
ATM_PH_SETVCI(&api.aph, npcb->npcb_vci);
|
||||
api.rxhand = npcb;
|
||||
s2 = splimp();
|
||||
if (ifp->if_ioctl == NULL ||
|
||||
ifp->if_ioctl(ifp, SIOCATMENA, (caddr_t) &api) != 0) {
|
||||
splx(s2);
|
||||
npcb_free(npcb, NPCB_REMOVE);
|
||||
error = EIO;
|
||||
break;
|
||||
}
|
||||
splx(s2);
|
||||
|
||||
soisconnected(so);
|
||||
|
||||
break;
|
||||
|
||||
case PRU_DISCONNECT: /* disconnect from peer */
|
||||
|
||||
if ((npcb->npcb_flags & NPCB_CONNECTED) == 0) {
|
||||
printf("natm: disconnected check\n");
|
||||
error = EIO;
|
||||
break;
|
||||
}
|
||||
ifp = npcb->npcb_ifp;
|
||||
|
||||
/*
|
||||
* disable rx
|
||||
*/
|
||||
|
||||
ATM_PH_FLAGS(&api.aph) = ATM_PH_AAL5;
|
||||
ATM_PH_VPI(&api.aph) = npcb->npcb_vpi;
|
||||
ATM_PH_SETVCI(&api.aph, npcb->npcb_vci);
|
||||
api.rxhand = npcb;
|
||||
s2 = splimp();
|
||||
if (ifp->if_ioctl != NULL)
|
||||
ifp->if_ioctl(ifp, SIOCATMDIS, (caddr_t) &api);
|
||||
splx(s2);
|
||||
|
||||
npcb_free(npcb, NPCB_REMOVE);
|
||||
soisdisconnected(so);
|
||||
|
||||
break;
|
||||
|
||||
case PRU_SHUTDOWN: /* won't send any more data */
|
||||
socantsendmore(so);
|
||||
break;
|
||||
|
||||
case PRU_SEND: /* send this data */
|
||||
if (control && control->m_len) {
|
||||
m_freem(control);
|
||||
m_freem(m);
|
||||
error = EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* send the data. we must put an atm_pseudohdr on first
|
||||
*/
|
||||
|
||||
M_PREPEND(m, sizeof(*aph), M_TRYWAIT);
|
||||
if (m == NULL) {
|
||||
error = ENOBUFS;
|
||||
break;
|
||||
}
|
||||
aph = mtod(m, struct atm_pseudohdr *);
|
||||
ATM_PH_VPI(aph) = npcb->npcb_vpi;
|
||||
ATM_PH_SETVCI(aph, npcb->npcb_vci);
|
||||
ATM_PH_FLAGS(aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0;
|
||||
|
||||
error = atm_output(npcb->npcb_ifp, m, NULL, NULL);
|
||||
|
||||
break;
|
||||
|
||||
case PRU_SENSE: /* return status into m */
|
||||
/* return zero? */
|
||||
break;
|
||||
|
||||
case PRU_PEERADDR: /* fetch peer's address */
|
||||
snatm = mtod(nam, struct sockaddr_natm *);
|
||||
bzero(snatm, sizeof(*snatm));
|
||||
nam->m_len = snatm->snatm_len = sizeof(*snatm);
|
||||
snatm->snatm_family = AF_NATM;
|
||||
#if defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
bcopy(npcb->npcb_ifp->if_xname, snatm->snatm_if, sizeof(snatm->snatm_if));
|
||||
#elif defined(__FreeBSD__)
|
||||
snprintf(snatm->snatm_if, sizeof(snatm->snatm_if),
|
||||
"%s%d", npcb->npcb_ifp->if_name, npcb->npcb_ifp->if_unit);
|
||||
#endif
|
||||
snatm->snatm_vci = npcb->npcb_vci;
|
||||
snatm->snatm_vpi = npcb->npcb_vpi;
|
||||
break;
|
||||
|
||||
case PRU_CONTROL: /* control operations on protocol */
|
||||
/*
|
||||
* raw atm ioctl. comes in as a SIOCRAWATM. we convert it to
|
||||
* SIOCXRAWATM and pass it to the driver.
|
||||
*/
|
||||
if ((u_long)m == SIOCRAWATM) {
|
||||
if (npcb->npcb_ifp == NULL) {
|
||||
error = ENOTCONN;
|
||||
break;
|
||||
}
|
||||
ario.npcb = npcb;
|
||||
ario.rawvalue = *((int *)nam);
|
||||
error = npcb->npcb_ifp->if_ioctl(npcb->npcb_ifp,
|
||||
SIOCXRAWATM, (caddr_t) &ario);
|
||||
if (!error) {
|
||||
if (ario.rawvalue)
|
||||
npcb->npcb_flags |= NPCB_RAW;
|
||||
else
|
||||
npcb->npcb_flags &= ~(NPCB_RAW);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
error = EOPNOTSUPP;
|
||||
break;
|
||||
|
||||
case PRU_BIND: /* bind socket to address */
|
||||
case PRU_LISTEN: /* listen for connection */
|
||||
case PRU_ACCEPT: /* accept connection from peer */
|
||||
case PRU_CONNECT2: /* connect two sockets */
|
||||
case PRU_ABORT: /* abort (fast DISCONNECT, DETATCH) */
|
||||
/* (only happens if LISTEN socket) */
|
||||
case PRU_RCVD: /* have taken data; more room now */
|
||||
case PRU_FASTTIMO: /* 200ms timeout */
|
||||
case PRU_SLOWTIMO: /* 500ms timeout */
|
||||
case PRU_RCVOOB: /* retrieve out of band data */
|
||||
case PRU_SENDOOB: /* send out of band data */
|
||||
case PRU_PROTORCV: /* receive from below */
|
||||
case PRU_PROTOSEND: /* send to below */
|
||||
case PRU_SOCKADDR: /* fetch socket's address */
|
||||
#ifdef DIAGNOSTIC
|
||||
printf("natm: PRU #%d unsupported\n", req);
|
||||
#endif
|
||||
error = EOPNOTSUPP;
|
||||
break;
|
||||
|
||||
default: panic("natm usrreq");
|
||||
}
|
||||
|
||||
done:
|
||||
splx(s);
|
||||
return(error);
|
||||
}
|
||||
|
||||
#endif /* !FREEBSD_USRREQS */
|
||||
|
||||
/*
|
||||
* natmintr: splsoftnet interrupt
|
||||
* natmintr: interrupt
|
||||
*
|
||||
* note: we expect a socket pointer in rcvif rather than an interface
|
||||
* pointer. we can get the interface pointer from the so's PCB if
|
||||
|
@ -55,16 +55,6 @@ struct sockaddr_natm {
|
||||
u_int8_t snatm_vpi; /* vpi */
|
||||
};
|
||||
|
||||
#if defined(__FreeBSD__) && defined(_KERNEL)
|
||||
|
||||
#define SPLSOFTNET() splnet()
|
||||
|
||||
#elif defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
|
||||
#define SPLSOFTNET() splsoftnet()
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef _KERNEL
|
||||
|
||||
/*
|
||||
@ -119,22 +109,7 @@ void npcb_free(struct natmpcb *, int);
|
||||
struct natmpcb *npcb_add(struct natmpcb *, struct ifnet *, uint16_t, uint8_t);
|
||||
|
||||
/* natm.c */
|
||||
#if defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
int natm_usrreq(struct socket *, int, struct mbuf *,
|
||||
struct mbuf *, struct mbuf *, struct proc *);
|
||||
#elif defined(__FreeBSD__)
|
||||
#if __FreeBSD__ > 2
|
||||
/*
|
||||
* FreeBSD new usrreqs style appeared since 2.2. compatibility to old style
|
||||
* has gone since 3.0.
|
||||
*/
|
||||
#define FREEBSD_USRREQS
|
||||
extern struct pr_usrreqs natm_usrreqs;
|
||||
#else /* !( __FreeBSD__ > 2) */
|
||||
int natm_usrreq(struct socket *, int, struct mbuf *,
|
||||
struct mbuf *, struct mbuf *);
|
||||
#endif /* !( __FreeBSD__ > 2) */
|
||||
#endif
|
||||
|
||||
#ifdef SYSCTL_HANDLER_ARGS
|
||||
int natm0_sysctl(SYSCTL_HANDLER_ARGS);
|
||||
|
@ -59,45 +59,21 @@ static void natm_init(void);
|
||||
static struct protosw natmsw[] = {
|
||||
{ SOCK_STREAM, &natmdomain, PROTO_NATMAAL5, PR_CONNREQUIRED,
|
||||
0, 0, 0, 0,
|
||||
#ifdef FREEBSD_USRREQS
|
||||
0,
|
||||
#else
|
||||
natm_usrreq,
|
||||
#endif
|
||||
0, 0, 0, 0,
|
||||
#if defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
natm5_sysctl
|
||||
#elif defined(FREEBSD_USRREQS)
|
||||
&natm_usrreqs
|
||||
#endif
|
||||
},
|
||||
{ SOCK_DGRAM, &natmdomain, PROTO_NATMAAL5, PR_CONNREQUIRED | PR_ATOMIC,
|
||||
0, 0, 0, 0,
|
||||
#ifdef FREEBSD_USRREQS
|
||||
0,
|
||||
#else
|
||||
natm_usrreq,
|
||||
#endif
|
||||
0, 0, 0, 0,
|
||||
#if defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
natm5_sysctl
|
||||
#elif defined(FREEBSD_USRREQS)
|
||||
&natm_usrreqs
|
||||
#endif
|
||||
},
|
||||
{ SOCK_STREAM, &natmdomain, PROTO_NATMAAL0, PR_CONNREQUIRED,
|
||||
0, 0, 0, 0,
|
||||
#ifdef FREEBSD_USRREQS
|
||||
0,
|
||||
#else
|
||||
natm_usrreq,
|
||||
#endif
|
||||
0, 0, 0, 0,
|
||||
#if defined(__NetBSD__) || defined(__OpenBSD__)
|
||||
natm0_sysctl
|
||||
#elif defined(FREEBSD_USRREQS)
|
||||
&natm_usrreqs
|
||||
#endif
|
||||
},
|
||||
};
|
||||
|
||||
@ -126,6 +102,4 @@ natm_init(void)
|
||||
netisr_register(NETISR_NATM, natmintr, &natmintrq, NETISR_MPSAFE);
|
||||
}
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
DOMAIN_SET(natm);
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user