diff options
| author | rtr <rtr@NetBSD.org> | 2014-07-09 04:54:03 +0000 |
|---|---|---|
| committer | rtr <rtr@NetBSD.org> | 2014-07-09 04:54:03 +0000 |
| commit | 3bb356e962c4aed85ec2e8e8fe6d9bb419f1a718 (patch) | |
| tree | 5110a24a30081d19ac2273fb92f7463cc2da8d2a | |
| parent | e90e70db6d28ea52e5f5a3bf090cff0753bd3c3a (diff) | |
* split PRU_PEERADDR and PRU_SOCKADDR function out of pr_generic()
usrreq switches and put into separate functions
xxx_{peer,sock}addr(struct socket *, struct mbuf *).
- KASSERT(solocked(so)) always in new functions even if request
is not implemented
- KASSERT(pcb != NULL) and KASSERT(nam) if the request is
implemented and not for tcp.
* for tcp roll #ifdef KPROF and #ifdef DEBUG code from tcp_usrreq() into
easier to cut & paste functions tcp_debug_capture() and
tcp_debug_trace()
- functions provided by rmind
- remaining use of PRU_{PEER,SOCK}ADDR #define to be removed in a
future commit.
* rename netbt functions to permit consistency of pru function names
(as has been done with other requests already split out).
- l2cap_{peer,sock}addr() -> l2cap_{peer,sock}_addr_pcb()
- rfcomm_{peer,sock}addr() -> rfcomm_{peer,sock}_addr_pcb()
- sco_{peer,sock}addr() -> sco_{peer,sock}_addr_pcb()
* split/refactor do_sys_getsockname(lwp, fd, which, nam) into
two functions do_sys_get{peer,sock}name(fd, nam).
- move PRU_PEERADDR handling into do_sys_getpeername() from
do_sys_getsockname()
- have svr4_stream directly call do_sys_get{sock,peer}name()
respectively instead of providing `which' & fix a DPRINTF string
that incorrectly wrote "getpeername" when it meant "getsockname"
- fix sys_getpeername() and sys_getsockname() to call
do_sys_get{sock,peer}name() without `which' and `lwp' & adjust
comments
- bump kernel version for removal of lwp & which parameters from
do_sys_getsockname()
note: future cleanup to remove struct mbuf * abuse in
xxx_{peer,sock}name()
still to come, not done in this commit since it is easier to do post
split.
patch reviewed by rmind
welcome to 6.99.47
32 files changed, 798 insertions, 308 deletions
diff --git a/sys/compat/svr4/svr4_stream.c b/sys/compat/svr4/svr4_stream.c index bf356760aa9..50236e9cefa 100644 --- a/sys/compat/svr4/svr4_stream.c +++ b/sys/compat/svr4/svr4_stream.c @@ -1,4 +1,4 @@ -/* $NetBSD: svr4_stream.c,v 1.79 2011/06/26 16:42:41 christos Exp $ */ +/* $NetBSD: svr4_stream.c,v 1.80 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 1994, 2008 The NetBSD Foundation, Inc. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: svr4_stream.c,v 1.79 2011/06/26 16:42:41 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: svr4_stream.c,v 1.80 2014/07/09 04:54:03 rtr Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -893,12 +893,16 @@ svr4_stream_ti_ioctl(file_t *fp, struct lwp *l, register_t *retval, int fd, u_lo switch (cmd) { case SVR4_TI_GETMYNAME: DPRINTF(("TI_GETMYNAME\n")); - cmd = PRU_SOCKADDR; + error = do_sys_getsockname(fd, &name); + if (error != 0) + return error; break; case SVR4_TI_GETPEERNAME: DPRINTF(("TI_GETPEERNAME\n")); - cmd = PRU_PEERADDR; + error = do_sys_getpeername(fd, &name); + if (error != 0) + return error; break; case SVR4_TI_SETMYNAME: @@ -913,10 +917,6 @@ svr4_stream_ti_ioctl(file_t *fp, struct lwp *l, register_t *retval, int fd, u_lo return ENOSYS; } - error = do_sys_getsockname(l, fd, cmd, &name); - if (error != 0) - return error; - switch (st->s_family) { case AF_INET: sockaddr_to_netaddr_in(&sc, mtod(name, void *)); @@ -1624,10 +1624,9 @@ svr4_sys_getmsg(struct lwp *l, const struct svr4_sys_getmsg_args *uap, register_ * a connect verification. */ - error = do_sys_getsockname(l, SCARG(uap, fd), PRU_SOCKADDR, - &name); + error = do_sys_getsockname(SCARG(uap, fd), &name); if (error != 0) { - DPRINTF(("getmsg: getpeername failed %d\n", error)); + DPRINTF(("getmsg: getsockname failed %d\n", error)); goto out; } diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 110fa7f1757..d968414d49c 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_syscalls.c,v 1.170 2014/05/18 14:46:15 rmind Exp $ */ +/* $NetBSD: uipc_syscalls.c,v 1.171 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.170 2014/05/18 14:46:15 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.171 2014/07/09 04:54:03 rtr Exp $"); #include "opt_pipe.h" @@ -1296,10 +1296,10 @@ pipe1(struct lwp *l, register_t *retval, int flags) #endif /* PIPE_SOCKETPAIR */ /* - * Get socket name. + * Get peer socket name. */ int -do_sys_getsockname(struct lwp *l, int fd, int which, struct mbuf **nam) +do_sys_getpeername(int fd, struct mbuf **nam) { struct socket *so; struct mbuf *m; @@ -1312,12 +1312,11 @@ do_sys_getsockname(struct lwp *l, int fd, int which, struct mbuf **nam) MCLAIM(m, so->so_mowner); solock(so); - if (which == PRU_PEERADDR && (so->so_state & SS_ISCONNECTED) == 0) { + if ((so->so_state & SS_ISCONNECTED) == 0) error = ENOTCONN; - } else { + else { *nam = m; - error = (*so->so_proto->pr_usrreqs->pr_generic)(so, - which, NULL, m, NULL, NULL); + error = (*so->so_proto->pr_usrreqs->pr_peeraddr)(so, m); } sounlock(so); if (error != 0) @@ -1326,6 +1325,32 @@ do_sys_getsockname(struct lwp *l, int fd, int which, struct mbuf **nam) return error; } +/* + * Get local socket name. + */ +int +do_sys_getsockname(int fd, struct mbuf **nam) +{ + struct socket *so; + struct mbuf *m; + int error; + + if ((error = fd_getsock(fd, &so)) != 0) + return error; + + m = m_getclr(M_WAIT, MT_SONAME); + MCLAIM(m, so->so_mowner); + + *nam = m; + solock(so); + error = (*so->so_proto->pr_usrreqs->pr_sockaddr)(so, m); + sounlock(so); + if (error != 0) + m_free(m); + fd_putfile(fd); + return error; +} + int copyout_sockname(struct sockaddr *asa, unsigned int *alen, int flags, struct mbuf *addr) @@ -1382,7 +1407,7 @@ sys_getsockname(struct lwp *l, const struct sys_getsockname_args *uap, struct mbuf *m; int error; - error = do_sys_getsockname(l, SCARG(uap, fdes), PRU_SOCKADDR, &m); + error = do_sys_getsockname(SCARG(uap, fdes), &m); if (error != 0) return error; @@ -1408,7 +1433,7 @@ sys_getpeername(struct lwp *l, const struct sys_getpeername_args *uap, struct mbuf *m; int error; - error = do_sys_getsockname(l, SCARG(uap, fdes), PRU_PEERADDR, &m); + error = do_sys_getpeername(SCARG(uap, fdes), &m); if (error != 0) return error; diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index f24ada234f3..a267ff145ff 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_usrreq.c,v 1.157 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: uipc_usrreq.c,v 1.158 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 1998, 2000, 2004, 2008, 2009 The NetBSD Foundation, Inc. @@ -96,7 +96,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.157 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.158 2014/07/09 04:54:03 rtr Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -378,6 +378,8 @@ unp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); KASSERT(solocked(so)); unp = sotounpcb(so); @@ -638,14 +640,6 @@ unp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, error = EOPNOTSUPP; break; - case PRU_SOCKADDR: - unp_setaddr(so, nam, false); - break; - - case PRU_PEERADDR: - unp_setaddr(so, nam, true); - break; - default: panic("piusrreq"); } @@ -882,6 +876,28 @@ unp_stat(struct socket *so, struct stat *ub) return (0); } +static int +unp_peeraddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + KASSERT(sotounpcb(so) != NULL); + KASSERT(nam != NULL); + + unp_setaddr(so, nam, true); + return 0; +} + +static int +unp_sockaddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + KASSERT(sotounpcb(so) != NULL); + KASSERT(nam != NULL); + + unp_setaddr(so, nam, false); + return 0; +} + /* * Allocate the new sockaddr. We have to allocate one * extra byte so that we can ensure that the pathname @@ -1829,5 +1845,7 @@ const struct pr_usrreqs unp_usrreqs = { .pr_detach = unp_detach, .pr_ioctl = unp_ioctl, .pr_stat = unp_stat, + .pr_peeraddr = unp_peeraddr, + .pr_sockaddr = unp_sockaddr, .pr_generic = unp_usrreq, }; diff --git a/sys/net/if_gre.c b/sys/net/if_gre.c index 3a7e287085e..aa584ac2d72 100644 --- a/sys/net/if_gre.c +++ b/sys/net/if_gre.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_gre.c,v 1.156 2014/06/05 23:48:16 rmind Exp $ */ +/* $NetBSD: if_gre.c,v 1.157 2014/07/09 04:54:03 rtr Exp $ */ /* * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc. @@ -45,7 +45,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.156 2014/06/05 23:48:16 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.157 2014/07/09 04:54:03 rtr Exp $"); #include "opt_atalk.h" #include "opt_gre.h" @@ -149,8 +149,8 @@ static bool gre_is_nullconf(const struct gre_soparm *); static int gre_output(struct ifnet *, struct mbuf *, const struct sockaddr *, struct rtentry *); static int gre_ioctl(struct ifnet *, u_long, void *); -static int gre_getsockname(struct socket *, struct mbuf *, struct lwp *); -static int gre_getpeername(struct socket *, struct mbuf *, struct lwp *); +static int gre_getsockname(struct socket *, struct mbuf *); +static int gre_getpeername(struct socket *, struct mbuf *); static int gre_getnames(struct socket *, struct lwp *, struct sockaddr_storage *, struct sockaddr_storage *); static void gre_clearconf(struct gre_soparm *, bool); @@ -969,22 +969,15 @@ gre_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst, } static int -gre_getname(struct socket *so, int req, struct mbuf *nam, struct lwp *l) +gre_getsockname(struct socket *so, struct mbuf *nam) { - return (*so->so_proto->pr_usrreqs->pr_generic)(so, - req, NULL, nam, NULL, l); + return (*so->so_proto->pr_usrreqs->pr_sockaddr)(so, nam); } static int -gre_getsockname(struct socket *so, struct mbuf *nam, struct lwp *l) +gre_getpeername(struct socket *so, struct mbuf *nam) { - return gre_getname(so, PRU_SOCKADDR, nam, l); -} - -static int -gre_getpeername(struct socket *so, struct mbuf *nam, struct lwp *l) -{ - return gre_getname(so, PRU_PEERADDR, nam, l); + return (*so->so_proto->pr_usrreqs->pr_peeraddr)(so, nam); } static int @@ -1001,11 +994,11 @@ gre_getnames(struct socket *so, struct lwp *l, struct sockaddr_storage *src, ss = mtod(m, struct sockaddr_storage *); solock(so); - if ((rc = gre_getsockname(so, m, l)) != 0) + if ((rc = gre_getsockname(so, m)) != 0) goto out; *src = *ss; - if ((rc = gre_getpeername(so, m, l)) != 0) + if ((rc = gre_getpeername(so, m)) != 0) goto out; *dst = *ss; out: diff --git a/sys/net/link_proto.c b/sys/net/link_proto.c index e4d7832657d..0731200f2a3 100644 --- a/sys/net/link_proto.c +++ b/sys/net/link_proto.c @@ -1,4 +1,4 @@ -/* $NetBSD: link_proto.c,v 1.14 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: link_proto.c,v 1.15 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 1982, 1986, 1993 @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.14 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.15 2014/07/09 04:54:03 rtr Exp $"); #include <sys/param.h> #include <sys/socket.h> @@ -52,6 +52,8 @@ static int link_attach(struct socket *, int); static void link_detach(struct socket *); static int link_ioctl(struct socket *, u_long, void *, struct ifnet *); static int link_stat(struct socket *, struct stat *); +static int link_peeraddr(struct socket *, struct mbuf *); +static int link_sockaddr(struct socket *, struct mbuf *); static int link_usrreq(struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *); static void link_init(void); @@ -67,6 +69,8 @@ static const struct pr_usrreqs link_usrreqs = { .pr_detach = link_detach, .pr_ioctl = link_ioctl, .pr_stat = link_stat, + .pr_peeraddr = link_peeraddr, + .pr_sockaddr = link_sockaddr, .pr_generic = link_usrreq, }; @@ -248,6 +252,22 @@ link_stat(struct socket *so, struct stat *ub) } static int +link_peeraddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int +link_sockaddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int link_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { @@ -255,6 +275,8 @@ link_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); return EOPNOTSUPP; } diff --git a/sys/net/raw_usrreq.c b/sys/net/raw_usrreq.c index 4a37e48e694..58d33f20da9 100644 --- a/sys/net/raw_usrreq.c +++ b/sys/net/raw_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: raw_usrreq.c,v 1.41 2014/07/06 03:33:33 rtr Exp $ */ +/* $NetBSD: raw_usrreq.c,v 1.42 2014/07/09 04:54:03 rtr Exp $ */ /* * Copyright (c) 1980, 1986, 1993 @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.41 2014/07/06 03:33:33 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.42 2014/07/09 04:54:03 rtr Exp $"); #include <sys/param.h> #include <sys/mbuf.h> @@ -164,6 +164,8 @@ raw_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); s = splsoftnet(); KERNEL_LOCK(1, NULL); @@ -251,22 +253,6 @@ raw_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, error = EOPNOTSUPP; break; - case PRU_SOCKADDR: - if (rp->rcb_laddr == NULL) { - error = EINVAL; - break; - } - raw_setsockaddr(rp, nam); - break; - - case PRU_PEERADDR: - if (rp->rcb_faddr == NULL) { - error = ENOTCONN; - break; - } - raw_setpeeraddr(rp, nam); - break; - default: panic("raw_usrreq"); } diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 831895d7b9b..1fb63972cc6 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -1,4 +1,4 @@ -/* $NetBSD: rtsock.c,v 1.153 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: rtsock.c,v 1.154 2014/07/09 04:54:03 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.153 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.154 2014/07/09 04:54:03 rtr Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -239,6 +239,38 @@ COMPATNAME(route_stat)(struct socket *so, struct stat *ub) } static int +COMPATNAME(route_peeraddr)(struct socket *so, struct mbuf *nam) +{ + struct rawcb *rp = sotorawcb(so); + + KASSERT(solocked(so)); + KASSERT(rp != NULL); + KASSERT(nam != NULL); + + if (rp->rcb_faddr == NULL) + return ENOTCONN; + + raw_setpeeraddr(rp, nam); + return 0; +} + +static int +COMPATNAME(route_sockaddr)(struct socket *so, struct mbuf *nam) +{ + struct rawcb *rp = sotorawcb(so); + + KASSERT(solocked(so)); + KASSERT(rp != NULL); + KASSERT(nam != NULL); + + if (rp->rcb_faddr == NULL) + return ENOTCONN; + + raw_setsockaddr(rp, nam); + return 0; +} + +static int COMPATNAME(route_usrreq)(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { @@ -248,6 +280,8 @@ COMPATNAME(route_usrreq)(struct socket *so, int req, struct mbuf *m, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); s = splsoftnet(); error = raw_usrreq(so, req, m, nam, control, l); @@ -1346,6 +1380,8 @@ static const struct pr_usrreqs route_usrreqs = { .pr_detach = COMPATNAME(route_detach_wrapper), .pr_ioctl = COMPATNAME(route_ioctl_wrapper), .pr_stat = COMPATNAME(route_stat_wrapper), + .pr_peeraddr = COMPATNAME(route_peeraddr_wrapper), + .pr_sockaddr = COMPATNAME(route_sockaddr_wrapper), .pr_generic = COMPATNAME(route_usrreq_wrapper), }; diff --git a/sys/netatalk/ddp_usrreq.c b/sys/netatalk/ddp_usrreq.c index 4d68ac182db..a9f7807f23d 100644 --- a/sys/netatalk/ddp_usrreq.c +++ b/sys/netatalk/ddp_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: ddp_usrreq.c,v 1.51 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: ddp_usrreq.c,v 1.52 2014/07/09 04:54:03 rtr Exp $ */ /* * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.51 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.52 2014/07/09 04:54:03 rtr Exp $"); #include "opt_mbuftrace.h" @@ -86,6 +86,8 @@ ddp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); ddp = sotoddpcb(so); @@ -108,10 +110,6 @@ ddp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr, error = at_pcbsetaddr(ddp, addr, l); break; - case PRU_SOCKADDR: - at_sockaddr(ddp, addr); - break; - case PRU_CONNECT: if (ddp->ddp_fsat.sat_port != ATADDR_ANYPORT) { error = EISCONN; @@ -487,6 +485,25 @@ ddp_stat(struct socket *so, struct stat *ub) return 0; } +static int +ddp_peeraddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int +ddp_sockaddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + KASSERT(sotoddpcb(so) != NULL); + KASSERT(nam != NULL); + + at_sockaddr(sotoddpcb(so), nam); + return 0; +} + /* * For the moment, this just find the pcb with the correct local address. * In the future, this will actually do some real searching, so we can use @@ -562,6 +579,8 @@ PR_WRAP_USRREQS(ddp) #define ddp_detach ddp_detach_wrapper #define ddp_ioctl ddp_ioctl_wrapper #define ddp_stat ddp_stat_wrapper +#define ddp_peeraddr ddp_peeraddr_wrapper +#define ddp_sockaddr ddp_sockaddr_wrapper #define ddp_usrreq ddp_usrreq_wrapper const struct pr_usrreqs ddp_usrreqs = { @@ -569,6 +588,8 @@ const struct pr_usrreqs ddp_usrreqs = { .pr_detach = ddp_detach, .pr_ioctl = ddp_ioctl, .pr_stat = ddp_stat, + .pr_peeraddr = ddp_peeraddr, + .pr_sockaddr = ddp_sockaddr, .pr_generic = ddp_usrreq, }; diff --git a/sys/netbt/hci_socket.c b/sys/netbt/hci_socket.c index 00e00457fcd..f37bd7aa4fc 100644 --- a/sys/netbt/hci_socket.c +++ b/sys/netbt/hci_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: hci_socket.c,v 1.30 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: hci_socket.c,v 1.31 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.30 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.31 2014/07/09 04:54:03 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -501,6 +501,44 @@ hci_stat(struct socket *so, struct stat *ub) return 0; } +static int +hci_peeraddr(struct socket *so, struct mbuf *nam) +{ + struct hci_pcb *pcb = (struct hci_pcb *)so->so_pcb; + struct sockaddr_bt *sa; + + KASSERT(solocked(so)); + KASSERT(pcb != NULL); + KASSERT(nam != NULL); + + sa = mtod(nam, struct sockaddr_bt *); + memset(sa, 0, sizeof(struct sockaddr_bt)); + nam->m_len = + sa->bt_len = sizeof(struct sockaddr_bt); + sa->bt_family = AF_BLUETOOTH; + bdaddr_copy(&sa->bt_bdaddr, &pcb->hp_raddr); + return 0; +} + +static int +hci_sockaddr(struct socket *so, struct mbuf *nam) +{ + struct hci_pcb *pcb = (struct hci_pcb *)so->so_pcb; + struct sockaddr_bt *sa; + + KASSERT(solocked(so)); + KASSERT(pcb != NULL); + KASSERT(nam != NULL); + + sa = mtod(nam, struct sockaddr_bt *); + memset(sa, 0, sizeof(struct sockaddr_bt)); + nam->m_len = + sa->bt_len = sizeof(struct sockaddr_bt); + sa->bt_family = AF_BLUETOOTH; + bdaddr_copy(&sa->bt_bdaddr, &pcb->hp_laddr); + return 0; +} + /* * User Request. * up is socket @@ -524,6 +562,8 @@ hci_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); switch(req) { case PRU_PURGEIF: @@ -590,28 +630,6 @@ hci_usrreq(struct socket *up, int req, struct mbuf *m, soisconnected(up); return 0; - case PRU_PEERADDR: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - - memset(sa, 0, sizeof(struct sockaddr_bt)); - nam->m_len = - sa->bt_len = sizeof(struct sockaddr_bt); - sa->bt_family = AF_BLUETOOTH; - bdaddr_copy(&sa->bt_bdaddr, &pcb->hp_raddr); - return 0; - - case PRU_SOCKADDR: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - - memset(sa, 0, sizeof(struct sockaddr_bt)); - nam->m_len = - sa->bt_len = sizeof(struct sockaddr_bt); - sa->bt_family = AF_BLUETOOTH; - bdaddr_copy(&sa->bt_bdaddr, &pcb->hp_laddr); - return 0; - case PRU_SHUTDOWN: socantsendmore(up); break; @@ -876,6 +894,8 @@ PR_WRAP_USRREQS(hci) #define hci_detach hci_detach_wrapper #define hci_ioctl hci_ioctl_wrapper #define hci_stat hci_stat_wrapper +#define hci_peeraddr hci_peeraddr_wrapper +#define hci_sockaddr hci_sockaddr_wrapper #define hci_usrreq hci_usrreq_wrapper const struct pr_usrreqs hci_usrreqs = { @@ -883,5 +903,7 @@ const struct pr_usrreqs hci_usrreqs = { .pr_detach = hci_detach, .pr_ioctl = hci_ioctl, .pr_stat = hci_stat, + .pr_peeraddr = hci_peeraddr, + .pr_sockaddr = hci_sockaddr, .pr_generic = hci_usrreq, }; diff --git a/sys/netbt/l2cap.h b/sys/netbt/l2cap.h index 0afc7e1ea1d..5b4d6ff412d 100644 --- a/sys/netbt/l2cap.h +++ b/sys/netbt/l2cap.h @@ -1,4 +1,4 @@ -/* $NetBSD: l2cap.h,v 1.13 2014/05/20 18:25:54 rmind Exp $ */ +/* $NetBSD: l2cap.h,v 1.14 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -54,7 +54,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: l2cap.h,v 1.13 2014/05/20 18:25:54 rmind Exp $ + * $Id: l2cap.h,v 1.14 2014/07/09 04:54:03 rtr Exp $ * $FreeBSD: src/sys/netgraph/bluetooth/include/l2cap.h,v 1.4 2005/08/31 18:13:23 emax Exp $ */ @@ -463,9 +463,9 @@ int l2cap_ctloutput(int, struct socket *, struct sockopt *); /* l2cap_upper.c */ int l2cap_attach_pcb(struct l2cap_channel **, const struct btproto *, void *); int l2cap_bind(struct l2cap_channel *, struct sockaddr_bt *); -int l2cap_sockaddr(struct l2cap_channel *, struct sockaddr_bt *); +int l2cap_sockaddr_pcb(struct l2cap_channel *, struct sockaddr_bt *); int l2cap_connect(struct l2cap_channel *, struct sockaddr_bt *); -int l2cap_peeraddr(struct l2cap_channel *, struct sockaddr_bt *); +int l2cap_peeraddr_pcb(struct l2cap_channel *, struct sockaddr_bt *); int l2cap_disconnect(struct l2cap_channel *, int); void l2cap_detach_pcb(struct l2cap_channel **); int l2cap_listen(struct l2cap_channel *); diff --git a/sys/netbt/l2cap_socket.c b/sys/netbt/l2cap_socket.c index f638fc5fe3f..1aa23bb7149 100644 --- a/sys/netbt/l2cap_socket.c +++ b/sys/netbt/l2cap_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: l2cap_socket.c,v 1.21 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: l2cap_socket.c,v 1.22 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.21 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.22 2014/07/09 04:54:03 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -130,6 +130,36 @@ l2cap_stat(struct socket *so, struct stat *ub) return 0; } +static int +l2cap_peeraddr(struct socket *so, struct mbuf *nam) +{ + struct l2cap_channel *pcb = so->so_pcb; + struct sockaddr_bt *sa; + + KASSERT(solocked(so)); + KASSERT(pcb != NULL); + KASSERT(nam != NULL); + + sa = mtod(nam, struct sockaddr_bt *); + nam->m_len = sizeof(struct sockaddr_bt); + return l2cap_peeraddr_pcb(pcb, sa); +} + +static int +l2cap_sockaddr(struct socket *so, struct mbuf *nam) +{ + struct l2cap_channel *pcb = so->so_pcb; + struct sockaddr_bt *sa; + + KASSERT(solocked(so)); + KASSERT(pcb != NULL); + KASSERT(nam != NULL); + + sa = mtod(nam, struct sockaddr_bt *); + nam->m_len = sizeof(struct sockaddr_bt); + return l2cap_sockaddr_pcb(pcb, sa); +} + /* * User Request. * up is socket @@ -159,6 +189,8 @@ l2cap_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); switch (req) { case PRU_PURGEIF: @@ -206,18 +238,6 @@ l2cap_usrreq(struct socket *up, int req, struct mbuf *m, soisconnecting(up); return l2cap_connect(pcb, sa); - case PRU_PEERADDR: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - nam->m_len = sizeof(struct sockaddr_bt); - return l2cap_peeraddr(pcb, sa); - - case PRU_SOCKADDR: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - nam->m_len = sizeof(struct sockaddr_bt); - return l2cap_sockaddr(pcb, sa); - case PRU_SHUTDOWN: socantsendmore(up); break; @@ -255,7 +275,7 @@ l2cap_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(nam != NULL); sa = mtod(nam, struct sockaddr_bt *); nam->m_len = sizeof(struct sockaddr_bt); - return l2cap_peeraddr(pcb, sa); + return l2cap_peeraddr_pcb(pcb, sa); case PRU_CONNECT2: case PRU_SENDOOB: @@ -424,6 +444,8 @@ PR_WRAP_USRREQS(l2cap) #define l2cap_detach l2cap_detach_wrapper #define l2cap_ioctl l2cap_ioctl_wrapper #define l2cap_stat l2cap_stat_wrapper +#define l2cap_peeraddr l2cap_peeraddr_wrapper +#define l2cap_sockaddr l2cap_sockaddr_wrapper #define l2cap_usrreq l2cap_usrreq_wrapper const struct pr_usrreqs l2cap_usrreqs = { @@ -431,5 +453,7 @@ const struct pr_usrreqs l2cap_usrreqs = { .pr_detach = l2cap_detach, .pr_ioctl = l2cap_ioctl, .pr_stat = l2cap_stat, + .pr_peeraddr = l2cap_peeraddr, + .pr_sockaddr = l2cap_sockaddr, .pr_generic = l2cap_usrreq, }; diff --git a/sys/netbt/l2cap_upper.c b/sys/netbt/l2cap_upper.c index d0d55b724d3..ba742919e9e 100644 --- a/sys/netbt/l2cap_upper.c +++ b/sys/netbt/l2cap_upper.c @@ -1,4 +1,4 @@ -/* $NetBSD: l2cap_upper.c,v 1.13 2014/05/20 18:25:54 rmind Exp $ */ +/* $NetBSD: l2cap_upper.c,v 1.14 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: l2cap_upper.c,v 1.13 2014/05/20 18:25:54 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: l2cap_upper.c,v 1.14 2014/07/09 04:54:03 rtr Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -118,12 +118,12 @@ l2cap_bind(struct l2cap_channel *chan, struct sockaddr_bt *addr) } /* - * l2cap_sockaddr(l2cap_channel, sockaddr) + * l2cap_sockaddr_pcb(l2cap_channel, sockaddr) * * get local address of channel */ int -l2cap_sockaddr(struct l2cap_channel *chan, struct sockaddr_bt *addr) +l2cap_sockaddr_pcb(struct l2cap_channel *chan, struct sockaddr_bt *addr) { memcpy(addr, &chan->lc_laddr, sizeof(struct sockaddr_bt)); @@ -209,12 +209,12 @@ fail: } /* - * l2cap_peeraddr(l2cap_channel, sockaddr) + * l2cap_peeraddr_pcb(l2cap_channel, sockaddr) * * get remote address of channel */ int -l2cap_peeraddr(struct l2cap_channel *chan, struct sockaddr_bt *addr) +l2cap_peeraddr_pcb(struct l2cap_channel *chan, struct sockaddr_bt *addr) { memcpy(addr, &chan->lc_raddr, sizeof(struct sockaddr_bt)); diff --git a/sys/netbt/rfcomm.h b/sys/netbt/rfcomm.h index b6d2923203d..efc6948af5a 100644 --- a/sys/netbt/rfcomm.h +++ b/sys/netbt/rfcomm.h @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm.h,v 1.12 2014/05/20 18:25:54 rmind Exp $ */ +/* $NetBSD: rfcomm.h,v 1.13 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -55,7 +55,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: rfcomm.h,v 1.12 2014/05/20 18:25:54 rmind Exp $ + * $Id: rfcomm.h,v 1.13 2014/07/09 04:54:03 rtr Exp $ * $FreeBSD: src/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h,v 1.4 2005/01/11 01:39:53 emax Exp $ */ @@ -409,9 +409,9 @@ int rfcomm_ctloutput(int, struct socket *, struct sockopt *); /* rfcomm_upper.c */ int rfcomm_attach_pcb(struct rfcomm_dlc **, const struct btproto *, void *); int rfcomm_bind(struct rfcomm_dlc *, struct sockaddr_bt *); -int rfcomm_sockaddr(struct rfcomm_dlc *, struct sockaddr_bt *); +int rfcomm_sockaddr_pcb(struct rfcomm_dlc *, struct sockaddr_bt *); int rfcomm_connect(struct rfcomm_dlc *, struct sockaddr_bt *); -int rfcomm_peeraddr(struct rfcomm_dlc *, struct sockaddr_bt *); +int rfcomm_peeraddr_pcb(struct rfcomm_dlc *, struct sockaddr_bt *); int rfcomm_disconnect(struct rfcomm_dlc *, int); void rfcomm_detach_pcb(struct rfcomm_dlc **); int rfcomm_listen(struct rfcomm_dlc *); diff --git a/sys/netbt/rfcomm_dlc.c b/sys/netbt/rfcomm_dlc.c index c1069343601..28b2e46e66f 100644 --- a/sys/netbt/rfcomm_dlc.c +++ b/sys/netbt/rfcomm_dlc.c @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm_dlc.c,v 1.7 2011/08/21 14:20:34 plunky Exp $ */ +/* $NetBSD: rfcomm_dlc.c,v 1.8 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rfcomm_dlc.c,v 1.7 2011/08/21 14:20:34 plunky Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rfcomm_dlc.c,v 1.8 2014/07/09 04:54:03 rtr Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -84,14 +84,14 @@ rfcomm_dlc_newconn(struct rfcomm_session *rs, int dlci) * a note of the best address and BDADDR_ANY matches in order to find * the oldest and most specific match. */ - l2cap_sockaddr(rs->rs_l2cap, &laddr); - l2cap_peeraddr(rs->rs_l2cap, &raddr); + l2cap_sockaddr_pcb(rs->rs_l2cap, &laddr); + l2cap_peeraddr_pcb(rs->rs_l2cap, &raddr); chan = RFCOMM_CHANNEL(dlci); new = NULL; any = best = NULL; LIST_FOREACH(ls, &rfcomm_session_listen, rs_next) { - l2cap_sockaddr(ls->rs_l2cap, &addr); + l2cap_sockaddr_pcb(ls->rs_l2cap, &addr); if (addr.bt_psm != laddr.bt_psm) continue; diff --git a/sys/netbt/rfcomm_session.c b/sys/netbt/rfcomm_session.c index 42856defca5..d18c78f59ea 100644 --- a/sys/netbt/rfcomm_session.c +++ b/sys/netbt/rfcomm_session.c @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm_session.c,v 1.19 2014/05/20 18:25:54 rmind Exp $ */ +/* $NetBSD: rfcomm_session.c,v 1.20 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rfcomm_session.c,v 1.19 2014/05/20 18:25:54 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rfcomm_session.c,v 1.20 2014/07/09 04:54:03 rtr Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -271,13 +271,13 @@ rfcomm_session_lookup(struct sockaddr_bt *src, struct sockaddr_bt *dest) if (rs->rs_state == RFCOMM_SESSION_CLOSED) continue; - l2cap_sockaddr(rs->rs_l2cap, &addr); + l2cap_sockaddr_pcb(rs->rs_l2cap, &addr); if (bdaddr_same(&src->bt_bdaddr, &addr.bt_bdaddr) == 0) if (bdaddr_any(&src->bt_bdaddr) == 0) continue; - l2cap_peeraddr(rs->rs_l2cap, &addr); + l2cap_peeraddr_pcb(rs->rs_l2cap, &addr); if (addr.bt_psm != dest->bt_psm) continue; diff --git a/sys/netbt/rfcomm_socket.c b/sys/netbt/rfcomm_socket.c index ae424bb1171..604de5704f9 100644 --- a/sys/netbt/rfcomm_socket.c +++ b/sys/netbt/rfcomm_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm_socket.c,v 1.22 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: rfcomm_socket.c,v 1.23 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.22 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.23 2014/07/09 04:54:03 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -138,6 +138,36 @@ rfcomm_stat(struct socket *so, struct stat *ub) return 0; } +static int +rfcomm_peeraddr(struct socket *so, struct mbuf *nam) +{ + struct rfcomm_dlc *pcb = so->so_pcb; + struct sockaddr_bt *sa; + + KASSERT(solocked(so)); + KASSERT(pcb != NULL); + KASSERT(nam != NULL); + + sa = mtod(nam, struct sockaddr_bt *); + nam->m_len = sizeof(struct sockaddr_bt); + return rfcomm_peeraddr_pcb(pcb, sa); +} + +static int +rfcomm_sockaddr(struct socket *so, struct mbuf *nam) +{ + struct rfcomm_dlc *pcb = so->so_pcb; + struct sockaddr_bt *sa; + + KASSERT(solocked(so)); + KASSERT(pcb != NULL); + KASSERT(nam != NULL); + + sa = mtod(nam, struct sockaddr_bt *); + nam->m_len = sizeof(struct sockaddr_bt); + return rfcomm_sockaddr_pcb(pcb, sa); +} + /* * User Request. * up is socket @@ -167,6 +197,8 @@ rfcomm_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); switch (req) { case PRU_PURGEIF: @@ -213,18 +245,6 @@ rfcomm_usrreq(struct socket *up, int req, struct mbuf *m, soisconnecting(up); return rfcomm_connect(pcb, sa); - case PRU_PEERADDR: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - nam->m_len = sizeof(struct sockaddr_bt); - return rfcomm_peeraddr(pcb, sa); - - case PRU_SOCKADDR: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - nam->m_len = sizeof(struct sockaddr_bt); - return rfcomm_sockaddr(pcb, sa); - case PRU_SHUTDOWN: socantsendmore(up); break; @@ -256,7 +276,7 @@ rfcomm_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(nam != NULL); sa = mtod(nam, struct sockaddr_bt *); nam->m_len = sizeof(struct sockaddr_bt); - return rfcomm_peeraddr(pcb, sa); + return rfcomm_peeraddr_pcb(pcb, sa); case PRU_CONNECT2: case PRU_SENDOOB: @@ -437,6 +457,8 @@ PR_WRAP_USRREQS(rfcomm) #define rfcomm_detach rfcomm_detach_wrapper #define rfcomm_ioctl rfcomm_ioctl_wrapper #define rfcomm_stat rfcomm_stat_wrapper +#define rfcomm_peeraddr rfcomm_peeraddr_wrapper +#define rfcomm_sockaddr rfcomm_sockaddr_wrapper #define rfcomm_usrreq rfcomm_usrreq_wrapper const struct pr_usrreqs rfcomm_usrreqs = { @@ -444,5 +466,7 @@ const struct pr_usrreqs rfcomm_usrreqs = { .pr_detach = rfcomm_detach, .pr_ioctl = rfcomm_ioctl, .pr_stat = rfcomm_stat, + .pr_peeraddr = rfcomm_peeraddr, + .pr_sockaddr = rfcomm_sockaddr, .pr_generic = rfcomm_usrreq, }; diff --git a/sys/netbt/rfcomm_upper.c b/sys/netbt/rfcomm_upper.c index 231dcf2bf70..885b03ee36b 100644 --- a/sys/netbt/rfcomm_upper.c +++ b/sys/netbt/rfcomm_upper.c @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm_upper.c,v 1.15 2014/05/20 18:25:54 rmind Exp $ */ +/* $NetBSD: rfcomm_upper.c,v 1.16 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.15 2014/05/20 18:25:54 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.16 2014/07/09 04:54:03 rtr Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -112,12 +112,12 @@ rfcomm_bind(struct rfcomm_dlc *dlc, struct sockaddr_bt *addr) } /* - * rfcomm_sockaddr(dlc, sockaddr) + * rfcomm_sockaddr_pcb(dlc, sockaddr) * * return local address */ int -rfcomm_sockaddr(struct rfcomm_dlc *dlc, struct sockaddr_bt *addr) +rfcomm_sockaddr_pcb(struct rfcomm_dlc *dlc, struct sockaddr_bt *addr) { memcpy(addr, &dlc->rd_laddr, sizeof(struct sockaddr_bt)); @@ -184,7 +184,7 @@ rfcomm_connect(struct rfcomm_dlc *dlc, struct sockaddr_bt *dest) if (rfcomm_dlc_lookup(rs, dlc->rd_dlci)) return EBUSY; - l2cap_sockaddr(rs->rs_l2cap, &dlc->rd_laddr); + l2cap_sockaddr_pcb(rs->rs_l2cap, &dlc->rd_laddr); /* * attach the DLC to the session and start it off @@ -200,12 +200,12 @@ rfcomm_connect(struct rfcomm_dlc *dlc, struct sockaddr_bt *dest) } /* - * rfcomm_peeraddr(dlc, sockaddr) + * rfcomm_peeraddr_pcb(dlc, sockaddr) * * return remote address */ int -rfcomm_peeraddr(struct rfcomm_dlc *dlc, struct sockaddr_bt *addr) +rfcomm_peeraddr_pcb(struct rfcomm_dlc *dlc, struct sockaddr_bt *addr) { memcpy(addr, &dlc->rd_raddr, sizeof(struct sockaddr_bt)); @@ -332,7 +332,7 @@ rfcomm_listen(struct rfcomm_dlc *dlc) return EADDRNOTAVAIL; LIST_FOREACH(rs, &rfcomm_session_listen, rs_next) { - l2cap_sockaddr(rs->rs_l2cap, &addr); + l2cap_sockaddr_pcb(rs->rs_l2cap, &addr); if (addr.bt_psm != dlc->rd_laddr.bt_psm) continue; diff --git a/sys/netbt/sco.h b/sys/netbt/sco.h index d9732b34ddb..2093607c48e 100644 --- a/sys/netbt/sco.h +++ b/sys/netbt/sco.h @@ -1,4 +1,4 @@ -/* $NetBSD: sco.h,v 1.6 2014/05/20 18:25:54 rmind Exp $ */ +/* $NetBSD: sco.h,v 1.7 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -70,9 +70,9 @@ int sco_ctloutput(int, struct socket *, struct sockopt *); /* sco_upper.c */ int sco_attach_pcb(struct sco_pcb **, const struct btproto *, void *); int sco_bind(struct sco_pcb *, struct sockaddr_bt *); -int sco_sockaddr(struct sco_pcb *, struct sockaddr_bt *); +int sco_sockaddr_pcb(struct sco_pcb *, struct sockaddr_bt *); int sco_connect(struct sco_pcb *, struct sockaddr_bt *); -int sco_peeraddr(struct sco_pcb *, struct sockaddr_bt *); +int sco_peeraddr_pcb(struct sco_pcb *, struct sockaddr_bt *); int sco_disconnect(struct sco_pcb *, int); void sco_detach_pcb(struct sco_pcb **); int sco_listen(struct sco_pcb *); diff --git a/sys/netbt/sco_socket.c b/sys/netbt/sco_socket.c index 05bd6837546..8bb6db95b8a 100644 --- a/sys/netbt/sco_socket.c +++ b/sys/netbt/sco_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: sco_socket.c,v 1.23 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: sco_socket.c,v 1.24 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.23 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.24 2014/07/09 04:54:03 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -121,6 +121,36 @@ sco_stat(struct socket *so, struct stat *ub) return 0; } +static int +sco_peeraddr(struct socket *so, struct mbuf *nam) +{ + struct sco_pcb *pcb = (struct sco_pcb *)so->so_pcb; + struct sockaddr_bt *sa; + + KASSERT(solocked(so)); + KASSERT(pcb != NULL); + KASSERT(nam != NULL); + + sa = mtod(nam, struct sockaddr_bt *); + nam->m_len = sizeof(struct sockaddr_bt); + return sco_peeraddr_pcb(pcb, sa); +} + +static int +sco_sockaddr(struct socket *so, struct mbuf *nam) +{ + struct sco_pcb *pcb = (struct sco_pcb *)so->so_pcb; + struct sockaddr_bt *sa; + + KASSERT(solocked(so)); + KASSERT(pcb != NULL); + KASSERT(nam != NULL); + + sa = mtod(nam, struct sockaddr_bt *); + nam->m_len = sizeof(struct sockaddr_bt); + return sco_sockaddr_pcb(pcb, sa); +} + /* * User Request. * up is socket @@ -146,6 +176,8 @@ sco_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); switch(req) { case PRU_PURGEIF: @@ -194,18 +226,6 @@ sco_usrreq(struct socket *up, int req, struct mbuf *m, soisconnecting(up); return sco_connect(pcb, sa); - case PRU_PEERADDR: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - nam->m_len = sizeof(struct sockaddr_bt); - return sco_peeraddr(pcb, sa); - - case PRU_SOCKADDR: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - nam->m_len = sizeof(struct sockaddr_bt); - return sco_sockaddr(pcb, sa); - case PRU_SHUTDOWN: socantsendmore(up); break; @@ -243,7 +263,7 @@ sco_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(nam != NULL); sa = mtod(nam, struct sockaddr_bt *); nam->m_len = sizeof(struct sockaddr_bt); - return sco_peeraddr(pcb, sa); + return sco_peeraddr_pcb(pcb, sa); case PRU_CONNECT2: case PRU_SENDOOB: @@ -391,6 +411,8 @@ PR_WRAP_USRREQS(sco) #define sco_detach sco_detach_wrapper #define sco_ioctl sco_ioctl_wrapper #define sco_stat sco_stat_wrapper +#define sco_peeraddr sco_peeraddr_wrapper +#define sco_sockaddr sco_sockaddr_wrapper #define sco_usrreq sco_usrreq_wrapper const struct pr_usrreqs sco_usrreqs = { @@ -398,5 +420,7 @@ const struct pr_usrreqs sco_usrreqs = { .pr_detach = sco_detach, .pr_ioctl = sco_ioctl, .pr_stat = sco_stat, + .pr_peeraddr = sco_peeraddr, + .pr_sockaddr = sco_sockaddr, .pr_generic = sco_usrreq, }; diff --git a/sys/netbt/sco_upper.c b/sys/netbt/sco_upper.c index 1bcbe2def31..18c6b846e7c 100644 --- a/sys/netbt/sco_upper.c +++ b/sys/netbt/sco_upper.c @@ -1,4 +1,4 @@ -/* $NetBSD: sco_upper.c,v 1.11 2014/05/20 18:25:54 rmind Exp $ */ +/* $NetBSD: sco_upper.c,v 1.12 2014/07/09 04:54:03 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sco_upper.c,v 1.11 2014/05/20 18:25:54 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sco_upper.c,v 1.12 2014/07/09 04:54:03 rtr Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -98,12 +98,12 @@ sco_bind(struct sco_pcb *pcb, struct sockaddr_bt *addr) } /* - * sco_sockaddr(pcb, sockaddr) + * sco_sockaddr_pcb(pcb, sockaddr) * * Copy local address of PCB to sockaddr */ int -sco_sockaddr(struct sco_pcb *pcb, struct sockaddr_bt *addr) +sco_sockaddr_pcb(struct sco_pcb *pcb, struct sockaddr_bt *addr) { memset(addr, 0, sizeof(struct sockaddr_bt)); @@ -177,12 +177,12 @@ sco_connect(struct sco_pcb *pcb, struct sockaddr_bt *dest) } /* - * sco_peeraddr(pcb, sockaddr) + * sco_peeraddr_pcb(pcb, sockaddr) * * Copy remote address of SCO pcb to sockaddr */ int -sco_peeraddr(struct sco_pcb *pcb, struct sockaddr_bt *addr) +sco_peeraddr_pcb(struct sco_pcb *pcb, struct sockaddr_bt *addr) { memset(addr, 0, sizeof(struct sockaddr_bt)); diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index f2f98343b79..7cbbebb0123 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip.c,v 1.131 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: raw_ip.c,v 1.132 2014/07/09 04:54:04 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.131 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.132 2014/07/09 04:54:04 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -581,6 +581,28 @@ rip_stat(struct socket *so, struct stat *ub) return 0; } +static int +rip_peeraddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(0)); + KASSERT(sotoinpcb(so) != NULL); + KASSERT(nam != NULL); + + in_setpeeraddr(sotoinpcb(so), nam); + return 0; +} + +static int +rip_sockaddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(0)); + KASSERT(sotoinpcb(so) != NULL); + KASSERT(nam != NULL); + + in_setsockaddr(sotoinpcb(so), nam); + return 0; +} + int rip_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) @@ -592,6 +614,8 @@ rip_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); s = splsoftnet(); if (req == PRU_PURGEIF) { @@ -695,14 +719,6 @@ rip_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, error = EOPNOTSUPP; break; - case PRU_SOCKADDR: - in_setsockaddr(inp, nam); - break; - - case PRU_PEERADDR: - in_setpeeraddr(inp, nam); - break; - default: panic("rip_usrreq"); } @@ -716,6 +732,8 @@ PR_WRAP_USRREQS(rip) #define rip_detach rip_detach_wrapper #define rip_ioctl rip_ioctl_wrapper #define rip_stat rip_stat_wrapper +#define rip_peeraddr rip_peeraddr_wrapper +#define rip_sockaddr rip_sockaddr_wrapper #define rip_usrreq rip_usrreq_wrapper const struct pr_usrreqs rip_usrreqs = { @@ -723,6 +741,8 @@ const struct pr_usrreqs rip_usrreqs = { .pr_detach = rip_detach, .pr_ioctl = rip_ioctl, .pr_stat = rip_stat, + .pr_peeraddr = rip_peeraddr, + .pr_sockaddr = rip_sockaddr, .pr_generic = rip_usrreq, }; diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index 6c06e294929..21b009ae999 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_usrreq.c,v 1.184 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: tcp_usrreq.c,v 1.185 2014/07/09 04:54:04 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -99,7 +99,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.184 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.185 2014/07/09 04:54:04 rtr Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -156,6 +156,27 @@ __KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.184 2014/07/07 17:13:56 rtr Exp $") #include "opt_tcp_space.h" +static int +tcp_debug_capture(struct tcpcb *tp, int req) +{ +#ifdef KPROF + tcp_acounts[tp->t_state][req]++; +#endif +#ifdef TCP_DEBUG + return tp->t_state; +#endif + return 0; +} + +static inline void +tcp_debug_trace(struct socket *so, struct tcpcb *tp, int ostate, int req) +{ +#ifdef TCP_DEBUG + if (tp && (so->so_options & SO_DEBUG)) + tcp_trace(TA_USER, ostate, tp, NULL, req); +#endif +} + /* * Process a TCP user request for TCP tb. If this is a send request * then m is the mbuf chain of send data. If this is a timer expiration @@ -172,15 +193,15 @@ tcp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct tcpcb *tp = NULL; int s; int error = 0; -#ifdef TCP_DEBUG int ostate = 0; -#endif int family; /* family of the socket */ KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); family = so->so_proto->pr_domain->dom_family; @@ -256,24 +277,14 @@ tcp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, if (inp) { tp = intotcpcb(inp); /* WHAT IF TP IS 0? */ -#ifdef KPROF - tcp_acounts[tp->t_state][req]++; -#endif -#ifdef TCP_DEBUG - ostate = tp->t_state; -#endif + ostate = tcp_debug_capture(tp, req); } #endif #ifdef INET6 if (in6p) { tp = in6totcpcb(in6p); /* WHAT IF TP IS 0? */ -#ifdef KPROF - tcp_acounts[tp->t_state][req]++; -#endif -#ifdef TCP_DEBUG - ostate = tp->t_state; -#endif + ostate = tcp_debug_capture(tp, req); } #endif @@ -521,35 +532,11 @@ tcp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, tp->t_force = 0; break; - case PRU_SOCKADDR: -#ifdef INET - if (inp) - in_setsockaddr(inp, nam); -#endif -#ifdef INET6 - if (in6p) - in6_setsockaddr(in6p, nam); -#endif - break; - - case PRU_PEERADDR: -#ifdef INET - if (inp) - in_setpeeraddr(inp, nam); -#endif -#ifdef INET6 - if (in6p) - in6_setpeeraddr(in6p, nam); -#endif - break; - default: panic("tcp_usrreq"); } -#ifdef TCP_DEBUG - if (tp && (so->so_options & SO_DEBUG)) - tcp_trace(TA_USER, ostate, tp, NULL, req); -#endif + + tcp_debug_trace(so, tp, ostate, req); release: splx(s); @@ -962,6 +949,110 @@ tcp_stat(struct socket *so, struct stat *ub) return 0; } +static int +tcp_peeraddr(struct socket *so, struct mbuf *nam) +{ + struct inpcb *inp = NULL; +#ifdef INET6 + struct in6pcb *in6p = NULL; +#endif + struct tcpcb *tp = NULL; + int ostate = 0; + + switch (so->so_proto->pr_domain->dom_family) { +#ifdef INET + case PF_INET: + inp = sotoinpcb(so); + break; +#endif +#ifdef INET6 + case PF_INET6: + in6p = sotoin6pcb(so); + break; +#endif + default: + return EAFNOSUPPORT; + } + + if (inp == NULL +#ifdef INET6 + && in6p == NULL +#endif + ) + return EINVAL; + +#ifdef INET + if (inp) { + tp = intotcpcb(inp); + ostate = tcp_debug_capture(tp, PRU_PEERADDR); + in_setpeeraddr(inp, nam); + } +#endif +#ifdef INET6 + if (in6p) { + tp = in6totcpcb(in6p); + ostate = tcp_debug_capture(tp, PRU_PEERADDR); + in6_setpeeraddr(in6p, nam); + } +#endif + + tcp_debug_trace(so, tp, ostate, PRU_PEERADDR); + + return 0; +} + +static int +tcp_sockaddr(struct socket *so, struct mbuf *nam) +{ + struct inpcb *inp = NULL; +#ifdef INET6 + struct in6pcb *in6p = NULL; +#endif + struct tcpcb *tp = NULL; + int ostate = 0; + + switch (so->so_proto->pr_domain->dom_family) { +#ifdef INET + case PF_INET: + inp = sotoinpcb(so); + break; +#endif +#ifdef INET6 + case PF_INET6: + in6p = sotoin6pcb(so); + break; +#endif + default: + return EAFNOSUPPORT; + } + + if (inp == NULL +#ifdef INET6 + && in6p == NULL +#endif + ) + return EINVAL; + +#ifdef INET + if (inp) { + tp = intotcpcb(inp); + ostate = tcp_debug_capture(tp, PRU_SOCKADDR); + in_setsockaddr(inp, nam); + } +#endif +#ifdef INET6 + if (in6p) { + tp = in6totcpcb(in6p); + ostate = tcp_debug_capture(tp, PRU_SOCKADDR); + in6_setsockaddr(in6p, nam); + } +#endif + + tcp_debug_trace(so, tp, ostate, PRU_SOCKADDR); + + return 0; +} + /* * Initiate (or continue) disconnect. * If embryonic state, just send reset (once). @@ -2200,6 +2291,8 @@ PR_WRAP_USRREQS(tcp) #define tcp_detach tcp_detach_wrapper #define tcp_ioctl tcp_ioctl_wrapper #define tcp_stat tcp_stat_wrapper +#define tcp_peeraddr tcp_peeraddr_wrapper +#define tcp_sockaddr tcp_sockaddr_wrapper #define tcp_usrreq tcp_usrreq_wrapper const struct pr_usrreqs tcp_usrreqs = { @@ -2207,5 +2300,7 @@ const struct pr_usrreqs tcp_usrreqs = { .pr_detach = tcp_detach, .pr_ioctl = tcp_ioctl, .pr_stat = tcp_stat, + .pr_peeraddr = tcp_peeraddr, + .pr_sockaddr = tcp_sockaddr, .pr_generic = tcp_usrreq, }; diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index a77118157d5..b732b19305d 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: udp_usrreq.c,v 1.206 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: udp_usrreq.c,v 1.207 2014/07/09 04:54:04 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.206 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.207 2014/07/09 04:54:04 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -910,6 +910,28 @@ udp_stat(struct socket *so, struct stat *ub) } static int +udp_peeraddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + KASSERT(sotoinpcb(so) != NULL); + KASSERT(nam != NULL); + + in_setpeeraddr(sotoinpcb(so), nam); + return 0; +} + +static int +udp_sockaddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + KASSERT(sotoinpcb(so) != NULL); + KASSERT(nam != NULL); + + in_setsockaddr(sotoinpcb(so), nam); + return 0; +} + +static int udp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { @@ -920,6 +942,8 @@ udp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); s = splsoftnet(); if (req == PRU_PURGEIF) { @@ -1030,14 +1054,6 @@ udp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, error = EOPNOTSUPP; break; - case PRU_SOCKADDR: - in_setsockaddr(inp, nam); - break; - - case PRU_PEERADDR: - in_setpeeraddr(inp, nam); - break; - default: panic("udp_usrreq"); } @@ -1268,6 +1284,8 @@ PR_WRAP_USRREQS(udp) #define udp_detach udp_detach_wrapper #define udp_ioctl udp_ioctl_wrapper #define udp_stat udp_stat_wrapper +#define udp_peeraddr udp_peeraddr_wrapper +#define udp_sockaddr udp_sockaddr_wrapper #define udp_usrreq udp_usrreq_wrapper const struct pr_usrreqs udp_usrreqs = { @@ -1275,5 +1293,7 @@ const struct pr_usrreqs udp_usrreqs = { .pr_detach = udp_detach, .pr_ioctl = udp_ioctl, .pr_stat = udp_stat, + .pr_peeraddr = udp_peeraddr, + .pr_sockaddr = udp_sockaddr, .pr_generic = udp_usrreq, }; diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c index 78250bb2132..f6401f9d036 100644 --- a/sys/netinet6/raw_ip6.c +++ b/sys/netinet6/raw_ip6.c @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip6.c,v 1.125 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: raw_ip6.c,v 1.126 2014/07/09 04:54:04 rtr Exp $ */ /* $KAME: raw_ip6.c,v 1.82 2001/07/23 18:57:56 jinmei Exp $ */ /* @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.125 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.126 2014/07/09 04:54:04 rtr Exp $"); #include "opt_ipsec.h" @@ -659,6 +659,28 @@ rip6_stat(struct socket *so, struct stat *ub) return 0; } +static int +rip6_peeraddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + KASSERT(sotoin6pcb(so) != NULL); + KASSERT(nam != NULL); + + in6_setpeeraddr(sotoin6pcb(so), nam); + return 0; +} + +static int +rip6_sockaddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + KASSERT(sotoin6pcb(so) != NULL); + KASSERT(nam != NULL); + + in6_setsockaddr(sotoin6pcb(so), nam); + return 0; +} + int rip6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) @@ -668,6 +690,8 @@ rip6_usrreq(struct socket *so, int req, struct mbuf *m, KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); if (req == PRU_PURGEIF) { mutex_enter(softnet_lock); @@ -847,14 +871,6 @@ rip6_usrreq(struct socket *so, int req, struct mbuf *m, error = EOPNOTSUPP; break; - case PRU_SOCKADDR: - in6_setsockaddr(in6p, nam); - break; - - case PRU_PEERADDR: - in6_setpeeraddr(in6p, nam); - break; - default: panic("rip6_usrreq"); } @@ -907,6 +923,8 @@ PR_WRAP_USRREQS(rip6) #define rip6_detach rip6_detach_wrapper #define rip6_ioctl rip6_ioctl_wrapper #define rip6_stat rip6_stat_wrapper +#define rip6_peeraddr rip6_peeraddr_wrapper +#define rip6_sockaddr rip6_sockaddr_wrapper #define rip6_usrreq rip6_usrreq_wrapper const struct pr_usrreqs rip6_usrreqs = { @@ -914,5 +932,7 @@ const struct pr_usrreqs rip6_usrreqs = { .pr_detach = rip6_detach, .pr_ioctl = rip6_ioctl, .pr_stat = rip6_stat, + .pr_peeraddr = rip6_peeraddr, + .pr_sockaddr = rip6_sockaddr, .pr_generic = rip6_usrreq, }; diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c index d434cd812bd..c5a61813fce 100644 --- a/sys/netinet6/udp6_usrreq.c +++ b/sys/netinet6/udp6_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: udp6_usrreq.c,v 1.105 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: udp6_usrreq.c,v 1.106 2014/07/09 04:54:04 rtr Exp $ */ /* $KAME: udp6_usrreq.c,v 1.86 2001/05/27 17:33:00 itojun Exp $ */ /* @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.105 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.106 2014/07/09 04:54:04 rtr Exp $"); #include "opt_inet.h" #include "opt_inet_csum.h" @@ -702,6 +702,28 @@ udp6_stat(struct socket *so, struct stat *ub) return 0; } +static int +udp6_peeraddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + KASSERT(sotoin6pcb(so) != NULL); + KASSERT(nam != NULL); + + in6_setpeeraddr(sotoin6pcb(so), nam); + return 0; +} + +static int +udp6_sockaddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + KASSERT(sotoin6pcb(so) != NULL); + KASSERT(nam != NULL); + + in6_setsockaddr(sotoin6pcb(so), nam); + return 0; +} + int udp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr6, struct mbuf *control, struct lwp *l) @@ -713,6 +735,8 @@ udp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr6, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); if (req == PRU_PURGEIF) { mutex_enter(softnet_lock); @@ -775,14 +799,6 @@ udp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr6, in6_pcbdetach(in6p); break; - case PRU_SOCKADDR: - in6_setsockaddr(in6p, addr6); - break; - - case PRU_PEERADDR: - in6_setpeeraddr(in6p, addr6); - break; - case PRU_LISTEN: case PRU_CONNECT2: case PRU_ACCEPT: @@ -883,6 +899,8 @@ PR_WRAP_USRREQS(udp6) #define udp6_detach udp6_detach_wrapper #define udp6_ioctl udp6_ioctl_wrapper #define udp6_stat udp6_stat_wrapper +#define udp6_peeraddr udp6_peeraddr_wrapper +#define udp6_sockaddr udp6_sockaddr_wrapper #define udp6_usrreq udp6_usrreq_wrapper const struct pr_usrreqs udp6_usrreqs = { @@ -890,5 +908,7 @@ const struct pr_usrreqs udp6_usrreqs = { .pr_detach = udp6_detach, .pr_ioctl = udp6_ioctl, .pr_stat = udp6_stat, + .pr_peeraddr = udp6_peeraddr, + .pr_sockaddr = udp6_sockaddr, .pr_generic = udp6_usrreq, }; diff --git a/sys/netipsec/keysock.c b/sys/netipsec/keysock.c index 81361a3b50c..9ca6d955b87 100644 --- a/sys/netipsec/keysock.c +++ b/sys/netipsec/keysock.c @@ -1,4 +1,4 @@ -/* $NetBSD: keysock.c,v 1.33 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: keysock.c,v 1.34 2014/07/09 04:54:04 rtr Exp $ */ /* $FreeBSD: src/sys/netipsec/keysock.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $ */ /* $KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $ */ @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.33 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.34 2014/07/09 04:54:04 rtr Exp $"); #include "opt_ipsec.h" @@ -498,6 +498,38 @@ key_stat(struct socket *so, struct stat *ub) return 0; } +static int +key_peeraddr(struct socket *so, struct mbuf *nam) +{ + struct rawcb *rp = sotorawcb(so); + + KASSERT(solocked(so)); + KASSERT(rp != NULL); + KASSERT(nam != NULL); + + if (rp->rcb_faddr == NULL) + return ENOTCONN; + + raw_setpeeraddr(rp, nam); + return 0; +} + +static int +key_sockaddr(struct socket *so, struct mbuf *nam) +{ + struct rawcb *rp = sotorawcb(so); + + KASSERT(solocked(so)); + KASSERT(rp != NULL); + KASSERT(nam != NULL); + + if (rp->rcb_faddr == NULL) + return ENOTCONN; + + raw_setsockaddr(rp, nam); + return 0; +} + /* * key_usrreq() * derived from net/rtsock.c:route_usrreq() @@ -512,6 +544,8 @@ key_usrreq(struct socket *so, int req,struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); s = splsoftnet(); error = raw_usrreq(so, req, m, nam, control, l); @@ -532,6 +566,8 @@ PR_WRAP_USRREQS(key) #define key_detach key_detach_wrapper #define key_ioctl key_ioctl_wrapper #define key_stat key_stat_wrapper +#define key_peeraddr key_peeraddr_wrapper +#define key_sockaddr key_sockaddr_wrapper #define key_usrreq key_usrreq_wrapper const struct pr_usrreqs key_usrreqs = { @@ -539,6 +575,8 @@ const struct pr_usrreqs key_usrreqs = { .pr_detach = key_detach, .pr_ioctl = key_ioctl, .pr_stat = key_stat, + .pr_peeraddr = key_peeraddr, + .pr_sockaddr = key_sockaddr, .pr_generic = key_usrreq, }; diff --git a/sys/netmpls/mpls_proto.c b/sys/netmpls/mpls_proto.c index d23ec024d98..4c06ba4fad4 100644 --- a/sys/netmpls/mpls_proto.c +++ b/sys/netmpls/mpls_proto.c @@ -1,4 +1,4 @@ -/* $NetBSD: mpls_proto.c,v 1.13 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: mpls_proto.c,v 1.14 2014/07/09 04:54:04 rtr Exp $ */ /* * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.13 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.14 2014/07/09 04:54:04 rtr Exp $"); #include "opt_inet.h" #include "opt_mbuftrace.h" @@ -109,6 +109,22 @@ mpls_stat(struct socket *so, struct stat *ub) } static int +mpls_peeraddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int +mpls_sockaddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int mpls_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { @@ -201,6 +217,8 @@ PR_WRAP_USRREQS(mpls) #define mpls_detach mpls_detach_wrapper #define mpls_ioctl mpls_ioctl_wrapper #define mpls_stat mpls_stat_wrapper +#define mpls_peeraddr mpls_peeraddr_wrapper +#define mpls_sockaddr mpls_sockaddr_wrapper #define mpls_usrreq mpls_usrreq_wrapper static const struct pr_usrreqs mpls_usrreqs = { @@ -208,6 +226,8 @@ static const struct pr_usrreqs mpls_usrreqs = { .pr_detach = mpls_detach, .pr_ioctl = mpls_ioctl, .pr_stat = mpls_stat, + .pr_peeraddr = mpls_peeraddr, + .pr_sockaddr = mpls_sockaddr, .pr_generic = mpls_usrreq, }; diff --git a/sys/netnatm/natm.c b/sys/netnatm/natm.c index 684bb8e2d4c..0d5c23c9300 100644 --- a/sys/netnatm/natm.c +++ b/sys/netnatm/natm.c @@ -1,4 +1,4 @@ -/* $NetBSD: natm.c,v 1.35 2014/07/07 17:13:56 rtr Exp $ */ +/* $NetBSD: natm.c,v 1.36 2014/07/09 04:54:04 rtr Exp $ */ /* * Copyright (c) 1996 Charles D. Cranor and Washington University. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.35 2014/07/07 17:13:56 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.36 2014/07/09 04:54:04 rtr Exp $"); #include <sys/param.h> #include <sys/kmem.h> @@ -145,6 +145,34 @@ natm_stat(struct socket *so, struct stat *ub) return 0; } +static int +natm_peeraddr(struct socket *so, struct mbuf *nam) +{ + struct natmpcb *npcb = (struct natmpcb *) so->so_pcb; + struct sockaddr_natm *snatm; + + KASSERT(solocked(so)); + KASSERT(pcb != NULL); + KASSERT(nam != NULL); + + snatm = mtod(nam, struct sockaddr_natm *); + memset(snatm, 0, sizeof(*snatm)); + nam->m_len = snatm->snatm_len = sizeof(*snatm); + snatm->snatm_family = AF_NATM; + memcpy(snatm->snatm_if, npcb->npcb_ifp->if_xname, sizeof(snatm->snatm_if)); + snatm->snatm_vci = npcb->npcb_vci; + snatm->snatm_vpi = npcb->npcb_vpi; + return 0; +} + +static int +natm_sockaddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + /* * user requests */ @@ -165,6 +193,8 @@ natm_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_DETACH); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); s = SPLSOFTNET(); @@ -301,16 +331,6 @@ natm_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, break; - case PRU_PEERADDR: /* fetch peer's address */ - snatm = mtod(nam, struct sockaddr_natm *); - memset(snatm, 0, sizeof(*snatm)); - nam->m_len = snatm->snatm_len = sizeof(*snatm); - snatm->snatm_family = AF_NATM; - memcpy(snatm->snatm_if, npcb->npcb_ifp->if_xname, sizeof(snatm->snatm_if)); - snatm->snatm_vci = npcb->npcb_vci; - snatm->snatm_vpi = npcb->npcb_vpi; - break; - case PRU_BIND: /* bind socket to address */ case PRU_LISTEN: /* listen for connection */ case PRU_ACCEPT: /* accept connection from peer */ @@ -324,7 +344,6 @@ natm_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, 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 @@ -422,6 +441,8 @@ PR_WRAP_USRREQS(natm) #define natm_detach natm_detach_wrapper #define natm_ioctl natm_ioctl_wrapper #define natm_stat natm_stat_wrapper +#define natm_peeraddr natm_peeraddr_wrapper +#define natm_sockaddr natm_sockaddr_wrapper #define natm_usrreq natm_usrreq_wrapper const struct pr_usrreqs natm_usrreqs = { @@ -429,5 +450,7 @@ const struct pr_usrreqs natm_usrreqs = { .pr_detach = natm_detach, .pr_ioctl = natm_ioctl, .pr_stat = natm_stat, + .pr_peeraddr = natm_peeraddr, + .pr_sockaddr = natm_sockaddr, .pr_generic = natm_usrreq, }; diff --git a/sys/rump/net/lib/libsockin/sockin.c b/sys/rump/net/lib/libsockin/sockin.c index 60e40111580..c05496c1f9f 100644 --- a/sys/rump/net/lib/libsockin/sockin.c +++ b/sys/rump/net/lib/libsockin/sockin.c @@ -1,4 +1,4 @@ -/* $NetBSD: sockin.c,v 1.46 2014/07/07 17:13:57 rtr Exp $ */ +/* $NetBSD: sockin.c,v 1.47 2014/07/09 04:54:04 rtr Exp $ */ /* * Copyright (c) 2008, 2009 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.46 2014/07/07 17:13:57 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.47 2014/07/09 04:54:04 rtr Exp $"); #include <sys/param.h> #include <sys/condvar.h> @@ -70,6 +70,8 @@ static int sockin_attach(struct socket *, int); static void sockin_detach(struct socket *); static int sockin_ioctl(struct socket *, u_long, void *, struct ifnet *); static int sockin_stat(struct socket *, struct stat *); +static int sockin_peeraddr(struct socket *, struct mbuf *); +static int sockin_sockaddr(struct socket *, struct mbuf *); static int sockin_usrreq(struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *); static int sockin_ctloutput(int op, struct socket *, struct sockopt *); @@ -79,6 +81,8 @@ static const struct pr_usrreqs sockin_usrreqs = { .pr_detach = sockin_detach, .pr_ioctl = sockin_ioctl, .pr_stat = sockin_stat, + .pr_peeraddr = sockin_peeraddr, + .pr_sockaddr = sockin_sockaddr, .pr_generic = sockin_usrreq, }; @@ -468,6 +472,36 @@ sockin_stat(struct socket *so, struct stat *ub) } static int +sockin_peeraddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + int error = 0; + int slen = nam->m_len; + + error = rumpcomp_sockin_getname(SO2S(so), + mtod(nam, struct sockaddr *), &slen, RUMPCOMP_SOCKIN_PEERNAME); + if (error == 0) + nam->m_len = slen; + return error; +} + +static int +sockin_sockaddr(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + int error = 0; + int slen = nam->m_len; + + error = rumpcomp_sockin_getname(SO2S(so), + mtod(nam, struct sockaddr *), &slen, RUMPCOMP_SOCKIN_SOCKNAME); + if (error == 0) + nam->m_len = slen; + return error; +} + +static int sockin_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { @@ -475,6 +509,8 @@ sockin_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); + KASSERT(req != PRU_PEERADDR); + KASSERT(req != PRU_SOCKADDR); switch (req) { case PRU_ACCEPT: @@ -558,23 +594,6 @@ sockin_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, removesock(so); break; - case PRU_SOCKADDR: - case PRU_PEERADDR: - { - int slen = nam->m_len; - enum rumpcomp_sockin_getnametype which; - - if (req == PRU_SOCKADDR) - which = RUMPCOMP_SOCKIN_SOCKNAME; - else - which = RUMPCOMP_SOCKIN_PEERNAME; - error = rumpcomp_sockin_getname(SO2S(so), - mtod(nam, struct sockaddr *), &slen, which); - if (error == 0) - nam->m_len = slen; - break; - } - default: panic("sockin_usrreq: IMPLEMENT ME, req %d not supported", req); } diff --git a/sys/sys/param.h b/sys/sys/param.h index 6836dcbfb12..117c1819c74 100644 --- a/sys/sys/param.h +++ b/sys/sys/param.h @@ -1,4 +1,4 @@ -/* $NetBSD: param.h,v 1.456 2014/07/05 09:33:15 hannken Exp $ */ +/* $NetBSD: param.h,v 1.457 2014/07/09 04:54:04 rtr Exp $ */ /*- * Copyright (c) 1982, 1986, 1989, 1993 @@ -63,7 +63,7 @@ * 2.99.9 (299000900) */ -#define __NetBSD_Version__ 699004600 /* NetBSD 6.99.46 */ +#define __NetBSD_Version__ 699004700 /* NetBSD 6.99.47 */ #define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \ (m) * 1000000) + (p) * 100) <= __NetBSD_Version__) diff --git a/sys/sys/protosw.h b/sys/sys/protosw.h index 7d1fe23d4ca..40425a9ef7a 100644 --- a/sys/sys/protosw.h +++ b/sys/sys/protosw.h @@ -1,4 +1,4 @@ -/* $NetBSD: protosw.h,v 1.50 2014/07/06 03:33:33 rtr Exp $ */ +/* $NetBSD: protosw.h,v 1.51 2014/07/09 04:54:04 rtr Exp $ */ /*- * Copyright (c) 1982, 1986, 1993 @@ -240,6 +240,8 @@ struct pr_usrreqs { void (*pr_detach)(struct socket *); int (*pr_ioctl)(struct socket *, u_long, void *, struct ifnet *); int (*pr_stat)(struct socket *, struct stat *); + int (*pr_peeraddr)(struct socket *, struct mbuf *); + int (*pr_sockaddr)(struct socket *, struct mbuf *); int (*pr_generic)(struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *); }; @@ -311,6 +313,24 @@ name##_stat_wrapper(struct socket *a, struct stat *b) \ return rv; \ } \ static int \ +name##_peeraddr_wrapper(struct socket *a, struct mbuf *b) \ +{ \ + int rv; \ + KERNEL_LOCK(1, NULL); \ + rv = name##_peeraddr(a, b); \ + KERNEL_UNLOCK_ONE(NULL); \ + return rv; \ +} \ +static int \ +name##_sockaddr_wrapper(struct socket *a, struct mbuf *b) \ +{ \ + int rv; \ + KERNEL_LOCK(1, NULL); \ + rv = name##_sockaddr(a, b); \ + KERNEL_UNLOCK_ONE(NULL); \ + return rv; \ +} \ +static int \ name##_usrreq_wrapper(struct socket *a, int b, \ struct mbuf *c, struct mbuf *d, struct mbuf *e, \ struct lwp *f) \ diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h index 3e827a0b8d3..cf1a710925e 100644 --- a/sys/sys/socketvar.h +++ b/sys/sys/socketvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: socketvar.h,v 1.133 2014/05/17 23:27:59 rmind Exp $ */ +/* $NetBSD: socketvar.h,v 1.134 2014/07/09 04:54:04 rtr Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -346,7 +346,8 @@ int copyout_sockname(struct sockaddr *, unsigned int *, int, struct mbuf *); int copyout_msg_control(struct lwp *, struct msghdr *, struct mbuf *); void free_control_mbuf(struct lwp *, struct mbuf *, struct mbuf *); -int do_sys_getsockname(struct lwp *, int, int, struct mbuf **); +int do_sys_getpeername(int, struct mbuf **); +int do_sys_getsockname(int, struct mbuf **); int do_sys_sendmsg(struct lwp *, int, struct msghdr *, int, register_t *); int do_sys_recvmsg(struct lwp *, int, struct msghdr *, struct mbuf **, struct mbuf **, register_t *); |
