summaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorrtr <rtr@NetBSD.org>2015-04-03 20:01:07 +0000
committerrtr <rtr@NetBSD.org>2015-04-03 20:01:07 +0000
commit0da58ac00a9b5753aba6c2f4714b9d499759d1f2 (patch)
treef85b2abd805d39ad26a562d1836377ec5f5a012d /sys/netinet
parent96d58810e5e839733058d3448402f7aac437b4ea (diff)
* change pr_bind to accept struct sockaddr * instead of struct mbuf *
* update protocol bind implementations to use/expect sockaddr * instead of mbuf * * introduce sockaddr_big struct for storage of addr data passed via sys_bind; sockaddr_big is of sufficient size and alignment to accommodate all addr data sizes received. * modify sys_bind to allocate sockaddr_big instead of using an mbuf. * bump kernel version to 7.99.9 for change to pr_bind() parameter type. Patch posted to tech-net@ http://mail-index.netbsd.org/tech-net/2015/03/15/msg005004.html The choice to use a new structure sockaddr_big has been retained since changing sockaddr_storage size would lead to unnecessary ABI change. The use of the new structure does not preclude future work that increases the size of sockaddr_storage and at that time sockaddr_big may be trivially replaced. Tested by mrg@ and myself, discussed with rmind@, posted to tech-net@
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/in_pcb.c12
-rw-r--r--sys/netinet/in_pcb.h4
-rw-r--r--sys/netinet/raw_ip.c16
-rw-r--r--sys/netinet/tcp_usrreq.c14
-rw-r--r--sys/netinet/udp_usrreq.c9
5 files changed, 28 insertions, 27 deletions
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
index 8f68ca05698..ba2bc311c56 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -1,4 +1,4 @@
-/* $NetBSD: in_pcb.c,v 1.155 2014/11/25 19:09:13 seanb Exp $ */
+/* $NetBSD: in_pcb.c,v 1.156 2015/04/03 20:01:07 rtr Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -93,7 +93,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.155 2014/11/25 19:09:13 seanb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.156 2015/04/03 20:01:07 rtr Exp $");
#include "opt_inet.h"
#include "opt_ipsec.h"
@@ -401,10 +401,9 @@ in_pcbbind_port(struct inpcb *inp, struct sockaddr_in *sin, kauth_cred_t cred)
}
int
-in_pcbbind(void *v, struct mbuf *nam, struct lwp *l)
+in_pcbbind(void *v, struct sockaddr_in *sin, struct lwp *l)
{
struct inpcb *inp = v;
- struct sockaddr_in *sin = NULL; /* XXXGCC */
struct sockaddr_in lsin;
int error;
@@ -416,9 +415,8 @@ in_pcbbind(void *v, struct mbuf *nam, struct lwp *l)
if (inp->inp_lport || !in_nullhost(inp->inp_laddr))
return (EINVAL);
- if (nam != NULL) {
- sin = mtod(nam, struct sockaddr_in *);
- if (nam->m_len != sizeof (*sin))
+ if (NULL != sin) {
+ if (sin->sin_len != sizeof(*sin))
return (EINVAL);
} else {
lsin = *((const struct sockaddr_in *)
diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h
index 2e824d0da43..a02a5e026cc 100644
--- a/sys/netinet/in_pcb.h
+++ b/sys/netinet/in_pcb.h
@@ -1,4 +1,4 @@
-/* $NetBSD: in_pcb.h,v 1.55 2014/11/25 15:04:37 seanb Exp $ */
+/* $NetBSD: in_pcb.h,v 1.56 2015/04/03 20:01:07 rtr Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -131,7 +131,7 @@ struct inpcb {
#ifdef _KERNEL
void in_losing(struct inpcb *);
int in_pcballoc(struct socket *, void *);
-int in_pcbbind(void *, struct mbuf *, struct lwp *);
+int in_pcbbind(void *, struct sockaddr_in *, struct lwp *);
int in_pcbconnect(void *, struct mbuf *, struct lwp *);
void in_pcbdetach(void *);
void in_pcbdisconnect(void *);
diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c
index 8049dca8c46..b93e151a6ee 100644
--- a/sys/netinet/raw_ip.c
+++ b/sys/netinet/raw_ip.c
@@ -1,4 +1,4 @@
-/* $NetBSD: raw_ip.c,v 1.146 2014/11/10 18:52:51 maxv Exp $ */
+/* $NetBSD: raw_ip.c,v 1.147 2015/04/03 20:01:07 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.146 2014/11/10 18:52:51 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.147 2015/04/03 20:01:07 rtr Exp $");
#include "opt_inet.h"
#include "opt_compat_netbsd.h"
@@ -557,10 +557,10 @@ rip_accept(struct socket *so, struct mbuf *nam)
}
static int
-rip_bind(struct socket *so, struct mbuf *nam, struct lwp *l)
+rip_bind(struct socket *so, struct sockaddr *nam, struct lwp *l)
{
struct inpcb *inp = sotoinpcb(so);
- struct sockaddr_in *addr;
+ struct sockaddr_in *addr = (struct sockaddr_in *)nam;
int error = 0;
int s;
@@ -568,12 +568,10 @@ rip_bind(struct socket *so, struct mbuf *nam, struct lwp *l)
KASSERT(inp != NULL);
KASSERT(nam != NULL);
+ if (addr->sin_len != sizeof(*addr))
+ return EINVAL;
+
s = splsoftnet();
- addr = mtod(nam, struct sockaddr_in *);
- if (nam->m_len != sizeof(*addr)) {
- error = EINVAL;
- goto release;
- }
if (IFNET_EMPTY()) {
error = EADDRNOTAVAIL;
goto release;
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
index 13f703684d5..31464c4f066 100644
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -1,4 +1,4 @@
-/* $NetBSD: tcp_usrreq.c,v 1.204 2015/03/31 08:47:01 ozaki-r Exp $ */
+/* $NetBSD: tcp_usrreq.c,v 1.205 2015/04/03 20:01:07 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.204 2015/03/31 08:47:01 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.205 2015/04/03 20:01:07 rtr Exp $");
#include "opt_inet.h"
#include "opt_tcp_debug.h"
@@ -711,10 +711,14 @@ tcp_accept(struct socket *so, struct mbuf *nam)
}
static int
-tcp_bind(struct socket *so, struct mbuf *nam, struct lwp *l)
+tcp_bind(struct socket *so, struct sockaddr *nam, struct lwp *l)
{
struct inpcb *inp = NULL;
struct in6pcb *in6p = NULL;
+ struct sockaddr_in *sin = (struct sockaddr_in *)nam;
+#ifdef INET6
+ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)nam;
+#endif /* INET6 */
struct tcpcb *tp = NULL;
int s;
int error = 0;
@@ -732,12 +736,12 @@ tcp_bind(struct socket *so, struct mbuf *nam, struct lwp *l)
switch (so->so_proto->pr_domain->dom_family) {
#ifdef INET
case PF_INET:
- error = in_pcbbind(inp, nam, l);
+ error = in_pcbbind(inp, sin, l);
break;
#endif
#ifdef INET6
case PF_INET6:
- error = in6_pcbbind(in6p, nam, l);
+ error = in6_pcbbind(in6p, sin6, l);
if (!error) {
/* mapped addr case */
if (IN6_IS_ADDR_V4MAPPED(&in6p->in6p_laddr))
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c
index 4c184ba1843..9da95c0f1ad 100644
--- a/sys/netinet/udp_usrreq.c
+++ b/sys/netinet/udp_usrreq.c
@@ -1,4 +1,4 @@
-/* $NetBSD: udp_usrreq.c,v 1.217 2014/08/09 05:33:01 rtr Exp $ */
+/* $NetBSD: udp_usrreq.c,v 1.218 2015/04/03 20:01:07 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.217 2014/08/09 05:33:01 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.218 2015/04/03 20:01:07 rtr Exp $");
#include "opt_inet.h"
#include "opt_compat_netbsd.h"
@@ -905,9 +905,10 @@ udp_accept(struct socket *so, struct mbuf *nam)
}
static int
-udp_bind(struct socket *so, struct mbuf *nam, struct lwp *l)
+udp_bind(struct socket *so, struct sockaddr *nam, struct lwp *l)
{
struct inpcb *inp = sotoinpcb(so);
+ struct sockaddr_in *sin = (struct sockaddr_in *)nam;
int error = 0;
int s;
@@ -916,7 +917,7 @@ udp_bind(struct socket *so, struct mbuf *nam, struct lwp *l)
KASSERT(nam != NULL);
s = splsoftnet();
- error = in_pcbbind(inp, nam, l);
+ error = in_pcbbind(inp, sin, l);
splx(s);
return error;