summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_usrreq.c
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2005-10-30 19:44:40 +0000
committerrwatson <rwatson@FreeBSD.org>2005-10-30 19:44:40 +0000
commit49831ed8da06ffadf684484671b4561c9ac55f9f (patch)
tree779e3d7a8028f1ac29696c62ad8b70ba7bc70d2e /sys/kern/uipc_usrreq.c
parent1d93f083bf03400439b86271732e2b3f17ba284c (diff)
downloadFreeBSD-src-49831ed8da06ffadf684484671b4561c9ac55f9f.zip
FreeBSD-src-49831ed8da06ffadf684484671b4561c9ac55f9f.tar.gz
Push the assignment of a new or updated so_qlimit from solisten()
following the protocol pru_listen() call to solisten_proto(), so that it occurs under the socket lock acquisition that also sets SO_ACCEPTCONN. This requires passing the new backlog parameter to the protocol, which also allows the protocol to be aware of changes in queue limit should it wish to do something about the new queue limit. This continues a move towards the socket layer acting as a library for the protocol. Bump __FreeBSD_version due to a change in the in-kernel protocol interface. This change has been tested with IPv4 and UNIX domain sockets, but not other protocols.
Diffstat (limited to 'sys/kern/uipc_usrreq.c')
-rw-r--r--sys/kern/uipc_usrreq.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c
index ac23154..286f07c 100644
--- a/sys/kern/uipc_usrreq.c
+++ b/sys/kern/uipc_usrreq.c
@@ -126,7 +126,8 @@ static void unp_mark(struct file *);
static void unp_discard(struct file *);
static void unp_freerights(struct file **, int);
static int unp_internalize(struct mbuf **, struct thread *);
-static int unp_listen(struct socket *, struct unpcb *, struct thread *);
+static int unp_listen(struct socket *, struct unpcb *, int,
+ struct thread *);
static int
uipc_abort(struct socket *so)
@@ -275,7 +276,7 @@ uipc_disconnect(struct socket *so)
}
static int
-uipc_listen(struct socket *so, struct thread *td)
+uipc_listen(struct socket *so, int backlog, struct thread *td)
{
struct unpcb *unp;
int error;
@@ -286,7 +287,7 @@ uipc_listen(struct socket *so, struct thread *td)
UNP_UNLOCK();
return (EINVAL);
}
- error = unp_listen(so, unp, td);
+ error = unp_listen(so, unp, backlog, td);
UNP_UNLOCK();
return (error);
}
@@ -1803,7 +1804,8 @@ unp_dispose(struct mbuf *m)
}
static int
-unp_listen(struct socket *so, struct unpcb *unp, struct thread *td)
+unp_listen(struct socket *so, struct unpcb *unp, int backlog,
+ struct thread *td)
{
int error;
@@ -1814,7 +1816,7 @@ unp_listen(struct socket *so, struct unpcb *unp, struct thread *td)
if (error == 0) {
cru2x(td->td_ucred, &unp->unp_peercred);
unp->unp_flags |= UNP_HAVEPCCACHED;
- solisten_proto(so);
+ solisten_proto(so, backlog);
}
SOCK_UNLOCK(so);
return (error);
OpenPOWER on IntegriCloud