summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrtr <rtr@NetBSD.org>2014-07-09 04:54:03 +0000
committerrtr <rtr@NetBSD.org>2014-07-09 04:54:03 +0000
commit3bb356e962c4aed85ec2e8e8fe6d9bb419f1a718 (patch)
tree5110a24a30081d19ac2273fb92f7463cc2da8d2a
parente90e70db6d28ea52e5f5a3bf090cff0753bd3c3a (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
-rw-r--r--sys/compat/svr4/svr4_stream.c21
-rw-r--r--sys/kern/uipc_syscalls.c45
-rw-r--r--sys/kern/uipc_usrreq.c38
-rw-r--r--sys/net/if_gre.c27
-rw-r--r--sys/net/link_proto.c26
-rw-r--r--sys/net/raw_usrreq.c22
-rw-r--r--sys/net/rtsock.c40
-rw-r--r--sys/netatalk/ddp_usrreq.c33
-rw-r--r--sys/netbt/hci_socket.c70
-rw-r--r--sys/netbt/l2cap.h8
-rw-r--r--sys/netbt/l2cap_socket.c54
-rw-r--r--sys/netbt/l2cap_upper.c12
-rw-r--r--sys/netbt/rfcomm.h8
-rw-r--r--sys/netbt/rfcomm_dlc.c10
-rw-r--r--sys/netbt/rfcomm_session.c8
-rw-r--r--sys/netbt/rfcomm_socket.c54
-rw-r--r--sys/netbt/rfcomm_upper.c16
-rw-r--r--sys/netbt/sco.h6
-rw-r--r--sys/netbt/sco_socket.c54
-rw-r--r--sys/netbt/sco_upper.c12
-rw-r--r--sys/netinet/raw_ip.c40
-rw-r--r--sys/netinet/tcp_usrreq.c179
-rw-r--r--sys/netinet/udp_usrreq.c40
-rw-r--r--sys/netinet6/raw_ip6.c40
-rw-r--r--sys/netinet6/udp6_usrreq.c40
-rw-r--r--sys/netipsec/keysock.c42
-rw-r--r--sys/netmpls/mpls_proto.c24
-rw-r--r--sys/netnatm/natm.c49
-rw-r--r--sys/rump/net/lib/libsockin/sockin.c57
-rw-r--r--sys/sys/param.h4
-rw-r--r--sys/sys/protosw.h22
-rw-r--r--sys/sys/socketvar.h5
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 *);