version 1.144, 2014/08/08 03:05:45 |
version 1.147, 2015/04/03 20:01:07 |
Line 74 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 74 __KERNEL_RCSID(0, "$NetBSD$"); |
|
|
|
#include <sys/param.h> |
#include <sys/param.h> |
#include <sys/sysctl.h> |
#include <sys/sysctl.h> |
#include <sys/malloc.h> |
|
#include <sys/mbuf.h> |
#include <sys/mbuf.h> |
#include <sys/socket.h> |
#include <sys/socket.h> |
#include <sys/protosw.h> |
#include <sys/protosw.h> |
Line 558 rip_accept(struct socket *so, struct mbu |
|
Line 557 rip_accept(struct socket *so, struct mbu |
|
} |
} |
|
|
static int |
static int |
rip_bind(struct socket *so, struct mbuf *nam, struct lwp *l) |
rip_bind(struct socket *so, struct sockaddr *nam, struct lwp *l) |
{ |
{ |
struct inpcb *inp = sotoinpcb(so); |
struct inpcb *inp = sotoinpcb(so); |
struct sockaddr_in *addr; |
struct sockaddr_in *addr = (struct sockaddr_in *)nam; |
int error = 0; |
int error = 0; |
int s; |
int s; |
|
|
Line 569 rip_bind(struct socket *so, struct mbuf |
|
Line 568 rip_bind(struct socket *so, struct mbuf |
|
KASSERT(inp != NULL); |
KASSERT(inp != NULL); |
KASSERT(nam != NULL); |
KASSERT(nam != NULL); |
|
|
|
if (addr->sin_len != sizeof(*addr)) |
|
return EINVAL; |
|
|
s = splsoftnet(); |
s = splsoftnet(); |
addr = mtod(nam, struct sockaddr_in *); |
|
if (nam->m_len != sizeof(*addr)) { |
|
error = EINVAL; |
|
goto release; |
|
} |
|
if (IFNET_EMPTY()) { |
if (IFNET_EMPTY()) { |
error = EADDRNOTAVAIL; |
error = EADDRNOTAVAIL; |
goto release; |
goto release; |
Line 624 rip_connect(struct socket *so, struct mb |
|
Line 621 rip_connect(struct socket *so, struct mb |
|
} |
} |
|
|
static int |
static int |
|
rip_connect2(struct socket *so, struct socket *so2) |
|
{ |
|
KASSERT(solocked(so)); |
|
|
|
return EOPNOTSUPP; |
|
} |
|
|
|
static int |
rip_disconnect(struct socket *so) |
rip_disconnect(struct socket *so) |
{ |
{ |
struct inpcb *inp = sotoinpcb(so); |
struct inpcb *inp = sotoinpcb(so); |
Line 790 rip_sendoob(struct socket *so, struct mb |
|
Line 795 rip_sendoob(struct socket *so, struct mb |
|
return EOPNOTSUPP; |
return EOPNOTSUPP; |
} |
} |
|
|
|
static int |
|
rip_purgeif(struct socket *so, struct ifnet *ifp) |
|
{ |
|
int s; |
|
|
|
s = splsoftnet(); |
|
mutex_enter(softnet_lock); |
|
in_pcbpurgeif0(&rawcbtable, ifp); |
|
in_purgeif(ifp); |
|
in_pcbpurgeif(&rawcbtable, ifp); |
|
mutex_exit(softnet_lock); |
|
splx(s); |
|
|
|
return 0; |
|
} |
|
|
int |
int |
rip_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, |
rip_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, |
struct mbuf *control, struct lwp *l) |
struct mbuf *control, struct lwp *l) |
{ |
{ |
struct inpcb *inp; |
|
int s, error = 0; |
|
|
|
KASSERT(req != PRU_ATTACH); |
KASSERT(req != PRU_ATTACH); |
KASSERT(req != PRU_DETACH); |
KASSERT(req != PRU_DETACH); |
KASSERT(req != PRU_ACCEPT); |
KASSERT(req != PRU_ACCEPT); |
KASSERT(req != PRU_BIND); |
KASSERT(req != PRU_BIND); |
KASSERT(req != PRU_LISTEN); |
KASSERT(req != PRU_LISTEN); |
KASSERT(req != PRU_CONNECT); |
KASSERT(req != PRU_CONNECT); |
|
KASSERT(req != PRU_CONNECT2); |
KASSERT(req != PRU_DISCONNECT); |
KASSERT(req != PRU_DISCONNECT); |
KASSERT(req != PRU_SHUTDOWN); |
KASSERT(req != PRU_SHUTDOWN); |
KASSERT(req != PRU_ABORT); |
KASSERT(req != PRU_ABORT); |
Line 814 rip_usrreq(struct socket *so, int req, s |
|
Line 833 rip_usrreq(struct socket *so, int req, s |
|
KASSERT(req != PRU_RCVOOB); |
KASSERT(req != PRU_RCVOOB); |
KASSERT(req != PRU_SEND); |
KASSERT(req != PRU_SEND); |
KASSERT(req != PRU_SENDOOB); |
KASSERT(req != PRU_SENDOOB); |
|
KASSERT(req != PRU_PURGEIF); |
s = splsoftnet(); |
|
if (req == PRU_PURGEIF) { |
|
mutex_enter(softnet_lock); |
|
in_pcbpurgeif0(&rawcbtable, (struct ifnet *)control); |
|
in_purgeif((struct ifnet *)control); |
|
in_pcbpurgeif(&rawcbtable, (struct ifnet *)control); |
|
mutex_exit(softnet_lock); |
|
splx(s); |
|
return 0; |
|
} |
|
|
|
KASSERT(solocked(so)); |
KASSERT(solocked(so)); |
inp = sotoinpcb(so); |
|
|
|
KASSERT(!control); |
if (sotoinpcb(so) == NULL) |
if (inp == NULL) { |
|
splx(s); |
|
return EINVAL; |
return EINVAL; |
} |
|
|
|
switch (req) { |
|
|
|
case PRU_CONNECT2: |
|
error = EOPNOTSUPP; |
|
break; |
|
|
|
default: |
panic("rip_usrreq"); |
panic("rip_usrreq"); |
|
} |
|
splx(s); |
|
|
|
return error; |
return 0; |
} |
} |
|
|
PR_WRAP_USRREQS(rip) |
PR_WRAP_USRREQS(rip) |
Line 856 PR_WRAP_USRREQS(rip) |
|
Line 852 PR_WRAP_USRREQS(rip) |
|
#define rip_bind rip_bind_wrapper |
#define rip_bind rip_bind_wrapper |
#define rip_listen rip_listen_wrapper |
#define rip_listen rip_listen_wrapper |
#define rip_connect rip_connect_wrapper |
#define rip_connect rip_connect_wrapper |
|
#define rip_connect2 rip_connect2_wrapper |
#define rip_disconnect rip_disconnect_wrapper |
#define rip_disconnect rip_disconnect_wrapper |
#define rip_shutdown rip_shutdown_wrapper |
#define rip_shutdown rip_shutdown_wrapper |
#define rip_abort rip_abort_wrapper |
#define rip_abort rip_abort_wrapper |
Line 867 PR_WRAP_USRREQS(rip) |
|
Line 864 PR_WRAP_USRREQS(rip) |
|
#define rip_recvoob rip_recvoob_wrapper |
#define rip_recvoob rip_recvoob_wrapper |
#define rip_send rip_send_wrapper |
#define rip_send rip_send_wrapper |
#define rip_sendoob rip_sendoob_wrapper |
#define rip_sendoob rip_sendoob_wrapper |
|
#define rip_purgeif rip_purgeif_wrapper |
#define rip_usrreq rip_usrreq_wrapper |
#define rip_usrreq rip_usrreq_wrapper |
|
|
const struct pr_usrreqs rip_usrreqs = { |
const struct pr_usrreqs rip_usrreqs = { |
Line 876 const struct pr_usrreqs rip_usrreqs = { |
|
Line 874 const struct pr_usrreqs rip_usrreqs = { |
|
.pr_bind = rip_bind, |
.pr_bind = rip_bind, |
.pr_listen = rip_listen, |
.pr_listen = rip_listen, |
.pr_connect = rip_connect, |
.pr_connect = rip_connect, |
|
.pr_connect2 = rip_connect2, |
.pr_disconnect = rip_disconnect, |
.pr_disconnect = rip_disconnect, |
.pr_shutdown = rip_shutdown, |
.pr_shutdown = rip_shutdown, |
.pr_abort = rip_abort, |
.pr_abort = rip_abort, |
Line 887 const struct pr_usrreqs rip_usrreqs = { |
|
Line 886 const struct pr_usrreqs rip_usrreqs = { |
|
.pr_recvoob = rip_recvoob, |
.pr_recvoob = rip_recvoob, |
.pr_send = rip_send, |
.pr_send = rip_send, |
.pr_sendoob = rip_sendoob, |
.pr_sendoob = rip_sendoob, |
|
.pr_purgeif = rip_purgeif, |
.pr_generic = rip_usrreq, |
.pr_generic = rip_usrreq, |
}; |
}; |
|
|