summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/contrib/pf/net/pf.c8
-rw-r--r--sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c4
-rw-r--r--sys/kern/subr_witness.c10
-rw-r--r--sys/netinet/in_mcast.c56
-rw-r--r--sys/netinet/in_pcb.c71
-rw-r--r--sys/netinet/in_pcb.h44
-rw-r--r--sys/netinet/ip_divert.c34
-rw-r--r--sys/netinet/ip_fw2.c6
-rw-r--r--sys/netinet/ip_options.c2
-rw-r--r--sys/netinet/ip_output.c14
-rw-r--r--sys/netinet/raw_ip.c62
-rw-r--r--sys/netinet/tcp_input.c40
-rw-r--r--sys/netinet/tcp_output.c2
-rw-r--r--sys/netinet/tcp_reass.c2
-rw-r--r--sys/netinet/tcp_sack.c16
-rw-r--r--sys/netinet/tcp_subr.c58
-rw-r--r--sys/netinet/tcp_syncache.c12
-rw-r--r--sys/netinet/tcp_timer.c32
-rw-r--r--sys/netinet/tcp_timewait.c28
-rw-r--r--sys/netinet/tcp_usrreq.c136
-rw-r--r--sys/netinet/udp_usrreq.c70
-rw-r--r--sys/netinet6/icmp6.c8
-rw-r--r--sys/netinet6/in6_pcb.c36
-rw-r--r--sys/netinet6/in6_src.c2
-rw-r--r--sys/netinet6/raw_ip6.c34
-rw-r--r--sys/netinet6/udp6_usrreq.c50
-rw-r--r--sys/security/audit/audit_arg.c4
-rw-r--r--sys/security/mac/mac_inet.c6
28 files changed, 434 insertions, 413 deletions
diff --git a/sys/contrib/pf/net/pf.c b/sys/contrib/pf/net/pf.c
index 69a7de5..69fe3de 100644
--- a/sys/contrib/pf/net/pf.c
+++ b/sys/contrib/pf/net/pf.c
@@ -2915,7 +2915,7 @@ pf_socket_lookup(int direction, struct pf_pdesc *pd)
pd->lookup.pid = NO_PID; /* XXX: revisit */
#ifdef __FreeBSD__
if (inp_arg != NULL) {
- INP_LOCK_ASSERT(inp_arg);
+ INP_WLOCK_ASSERT(inp_arg);
if (inp_arg->inp_socket) {
pd->lookup.uid = inp_arg->inp_socket->so_cred->cr_uid;
pd->lookup.gid =
@@ -3018,15 +3018,15 @@ pf_socket_lookup(int direction, struct pf_pdesc *pd)
return (-1);
}
#ifdef __FreeBSD__
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if ((inp->inp_socket == NULL) || (inp->inp_socket->so_cred == NULL)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(pi);
return (-1);
}
pd->lookup.uid = inp->inp_socket->so_cred->cr_uid;
pd->lookup.gid = inp->inp_socket->so_cred->cr_groups[0];
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(pi);
#else
pd->lookup.uid = inp->inp_socket->so_euid;
diff --git a/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c b/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c
index 2ad4520..2f9a92e 100644
--- a/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c
+++ b/sys/dev/cxgb/ulp/tom/cxgb_cpl_socket.c
@@ -336,9 +336,9 @@ copy_data(const struct mbuf *m, int offset, int len, struct uio *uio)
static void
cxgb_wait_dma_completion(struct toepcb *toep)
{
- struct mtx *lock;
+ struct rwlock *lock;
- lock = &toep->tp_tp->t_inpcb->inp_mtx;
+ lock = &toep->tp_tp->t_inpcb->inp_lock;
inp_wlock(toep->tp_tp->t_inpcb);
cv_wait_unlock(&toep->tp_cv, lock);
}
diff --git a/sys/kern/subr_witness.c b/sys/kern/subr_witness.c
index da114f1..f54e087 100644
--- a/sys/kern/subr_witness.c
+++ b/sys/kern/subr_witness.c
@@ -346,7 +346,7 @@ static struct witness_order_list_entry order_lists[] = {
/*
* Multicast - protocol locks before interface locks, after UDP locks.
*/
- { "udpinp", &lock_class_mtx_sleep },
+ { "udpinp", &lock_class_rw },
{ "in_multi_mtx", &lock_class_mtx_sleep },
{ "igmp_mtx", &lock_class_mtx_sleep },
{ "if_addr_mtx", &lock_class_mtx_sleep },
@@ -360,15 +360,15 @@ static struct witness_order_list_entry order_lists[] = {
/*
* UDP/IP
*/
- { "udp", &lock_class_mtx_sleep },
- { "udpinp", &lock_class_mtx_sleep },
+ { "udp", &lock_class_rw },
+ { "udpinp", &lock_class_rw },
{ "so_snd", &lock_class_mtx_sleep },
{ NULL, NULL },
/*
* TCP/IP
*/
- { "tcp", &lock_class_mtx_sleep },
- { "tcpinp", &lock_class_mtx_sleep },
+ { "tcp", &lock_class_rw },
+ { "tcpinp", &lock_class_rw },
{ "so_snd", &lock_class_mtx_sleep },
{ NULL, NULL },
/*
diff --git a/sys/netinet/in_mcast.c b/sys/netinet/in_mcast.c
index 34e7916..be2208a 100644
--- a/sys/netinet/in_mcast.c
+++ b/sys/netinet/in_mcast.c
@@ -651,7 +651,7 @@ inp_change_source_filter(struct inpcb *inp, struct sockopt *sopt)
}
out_locked:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -667,11 +667,11 @@ inp_findmoptions(struct inpcb *inp)
struct in_mfilter *imfp;
size_t idx;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_moptions != NULL)
return (inp->inp_moptions);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
imo = (struct ip_moptions *)malloc(sizeof(*imo), M_IPMOPTS,
M_WAITOK);
@@ -698,7 +698,7 @@ inp_findmoptions(struct inpcb *inp)
}
imo->imo_mfilters = imfp;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_moptions != NULL) {
free(imfp, M_IPMSOURCE);
free(immp, M_IPMOPTS);
@@ -762,12 +762,12 @@ inp_get_source_filters(struct inpcb *inp, struct sockopt *sopt)
int error;
size_t idx;
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
imo = inp->inp_moptions;
KASSERT(imo != NULL, ("%s: null ip_moptions", __func__));
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyin(sopt, &msfr, sizeof(struct __msfilterreq),
sizeof(struct __msfilterreq));
@@ -781,7 +781,7 @@ inp_get_source_filters(struct inpcb *inp, struct sockopt *sopt)
if (ifp == NULL)
return (EINVAL);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
/*
* Lookup group on the socket.
@@ -789,7 +789,7 @@ inp_get_source_filters(struct inpcb *inp, struct sockopt *sopt)
gsa = (sockunion_t *)&msfr.msfr_group;
idx = imo_match_group(imo, ifp, &gsa->sa);
if (idx == -1 || imo->imo_mfilters == NULL) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (EADDRNOTAVAIL);
}
@@ -826,7 +826,7 @@ inp_get_source_filters(struct inpcb *inp, struct sockopt *sopt)
}
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (tss != NULL) {
error = copyout(tss, msfr.msfr_srcs,
@@ -855,7 +855,7 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
int error, optval;
u_char coptval;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
imo = inp->inp_moptions;
/*
* If socket is neither of type SOCK_RAW or SOCK_DGRAM,
@@ -864,7 +864,7 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
if (inp->inp_socket->so_proto->pr_protocol == IPPROTO_DIVERT ||
(inp->inp_socket->so_proto->pr_type != SOCK_RAW &&
inp->inp_socket->so_proto->pr_type != SOCK_DGRAM)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (EOPNOTSUPP);
}
@@ -875,7 +875,7 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
optval = imo->imo_multicast_vif;
else
optval = -1;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &optval, sizeof(int));
break;
@@ -894,7 +894,7 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
}
}
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (sopt->sopt_valsize == sizeof(struct ip_mreqn)) {
error = sooptcopyout(sopt, &mreqn,
sizeof(struct ip_mreqn));
@@ -909,7 +909,7 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
optval = coptval = IP_DEFAULT_MULTICAST_TTL;
else
optval = coptval = imo->imo_multicast_ttl;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (sopt->sopt_valsize == sizeof(u_char))
error = sooptcopyout(sopt, &coptval, sizeof(u_char));
else
@@ -921,7 +921,7 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
optval = coptval = IP_DEFAULT_MULTICAST_LOOP;
else
optval = coptval = imo->imo_multicast_loop;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (sopt->sopt_valsize == sizeof(u_char))
error = sooptcopyout(sopt, &coptval, sizeof(u_char));
else
@@ -931,14 +931,14 @@ inp_getmoptions(struct inpcb *inp, struct sockopt *sopt)
case IP_MSFILTER:
if (imo == NULL) {
error = EADDRNOTAVAIL;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
} else {
error = inp_get_source_filters(inp, sopt);
}
break;
default:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = ENOPROTOOPT;
break;
}
@@ -1192,14 +1192,14 @@ inp_join_group(struct inpcb *inp, struct sockopt *sopt)
* to prevent a lock order reversal.
*/
--imo->imo_num_memberships;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
in_delmulti(inm);
return (error);
}
}
out_locked:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -1382,7 +1382,7 @@ inp_leave_group(struct inpcb *inp, struct sockopt *sopt)
imo->imo_num_memberships--;
out_locked:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -1454,7 +1454,7 @@ inp_set_multicast_if(struct inpcb *inp, struct sockopt *sopt)
imo = inp_findmoptions(inp);
imo->imo_multicast_ifp = ifp;
imo->imo_multicast_addr.s_addr = INADDR_ANY;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (0);
}
@@ -1545,7 +1545,7 @@ inp_set_source_filters(struct inpcb *inp, struct sockopt *sopt)
* in order to satisfy a malloc request.
* We will re-take it before changing socket state.
*/
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
#ifdef DIAGNOSTIC
if (bootverbose) {
printf("%s: loading %lu source list entries\n",
@@ -1646,7 +1646,7 @@ inp_set_source_filters(struct inpcb *inp, struct sockopt *sopt)
* Re-take the inp lock; we are changing socket state.
*/
pkss = kss;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
for (i = 0; i < msfr.msfr_nsrcs; i++, pkss++) {
memcpy(&(pnims[i]->ims_addr), pkss,
sizeof(struct sockaddr_storage));
@@ -1661,11 +1661,11 @@ inp_set_source_filters(struct inpcb *inp, struct sockopt *sopt)
/*
* Update the filter mode on the socket before releasing the inpcb.
*/
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
imf->imf_fmode = msfr.msfr_fmode;
out_locked:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -1716,7 +1716,7 @@ inp_setmoptions(struct inpcb *inp, struct sockopt *sopt)
}
imo = inp_findmoptions(inp);
imo->imo_multicast_vif = vifi;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
}
@@ -1753,7 +1753,7 @@ inp_setmoptions(struct inpcb *inp, struct sockopt *sopt)
}
imo = inp_findmoptions(inp);
imo->imo_multicast_ttl = ttl;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
}
@@ -1782,7 +1782,7 @@ inp_setmoptions(struct inpcb *inp, struct sockopt *sopt)
}
imo = inp_findmoptions(inp);
imo->imo_multicast_loop = !!loop;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
}
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
index f6a45cb..d13418f1 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -218,7 +218,7 @@ in_pcballoc(struct socket *so, struct inpcbinfo *pcbinfo)
if (ip6_auto_flowlabel)
inp->inp_flags |= IN6P_AUTOFLOWLABEL;
#endif
- INP_LOCK(inp);
+ INP_WLOCK(inp);
inp->inp_gencnt = ++pcbinfo->ipi_gencnt;
#if defined(IPSEC) || defined(MAC)
@@ -235,7 +235,7 @@ in_pcbbind(struct inpcb *inp, struct sockaddr *nam, struct ucred *cred)
int anonport, error;
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (inp->inp_lport != 0 || inp->inp_laddr.s_addr != INADDR_ANY)
return (EINVAL);
@@ -278,7 +278,11 @@ in_pcbbind_setup(struct inpcb *inp, struct sockaddr *nam, in_addr_t *laddrp,
int error, prison = 0;
int dorandom;
- INP_INFO_WLOCK_ASSERT(pcbinfo);
+ /*
+ * Because no actual state changes occur here, a write global write
+ * lock on the pcbinfo isn't required.
+ */
+ INP_INFO_LOCK_ASSERT(pcbinfo);
INP_LOCK_ASSERT(inp);
if (TAILQ_EMPTY(&in_ifaddrhead)) /* XXX broken! */
@@ -484,7 +488,7 @@ in_pcbconnect(struct inpcb *inp, struct sockaddr *nam, struct ucred *cred)
int anonport, error;
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
lport = inp->inp_lport;
laddr = inp->inp_laddr.s_addr;
@@ -546,7 +550,11 @@ in_pcbconnect_setup(struct inpcb *inp, struct sockaddr *nam,
u_short lport, fport;
int error;
- INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
+ /*
+ * Because a global state change doesn't actually occur here, a read
+ * lock is sufficient.
+ */
+ INP_INFO_LOCK_ASSERT(inp->inp_pcbinfo);
INP_LOCK_ASSERT(inp);
if (oinpp != NULL)
@@ -666,7 +674,7 @@ in_pcbdisconnect(struct inpcb *inp)
{
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
inp->inp_faddr.s_addr = INADDR_ANY;
inp->inp_fport = 0;
@@ -695,8 +703,9 @@ in_pcbfree(struct inpcb *inp)
struct inpcbinfo *ipi = inp->inp_pcbinfo;
KASSERT(inp->inp_socket == NULL, ("in_pcbfree: inp_socket != NULL"));
+
INP_INFO_WLOCK_ASSERT(ipi);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef IPSEC
ipsec4_delete_pcbpolicy(inp);
@@ -712,7 +721,7 @@ in_pcbfree(struct inpcb *inp)
#ifdef MAC
mac_inpcb_destroy(inp);
#endif
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
uma_zfree(ipi->ipi_zone, inp);
}
@@ -727,7 +736,7 @@ in_pcbdrop(struct inpcb *inp)
{
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
inp->inp_vflag |= INP_DROPPED;
if (inp->inp_lport) {
@@ -771,10 +780,10 @@ in_getsockaddr(struct socket *so, struct sockaddr **nam)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in_getsockaddr: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
port = inp->inp_lport;
addr = inp->inp_laddr;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
*nam = in_sockaddr(port, &addr);
return 0;
@@ -790,10 +799,10 @@ in_getpeeraddr(struct socket *so, struct sockaddr **nam)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in_getpeeraddr: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
port = inp->inp_fport;
addr = inp->inp_faddr;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
*nam = in_sockaddr(port, &addr);
return 0;
@@ -807,20 +816,20 @@ in_pcbnotifyall(struct inpcbinfo *pcbinfo, struct in_addr faddr, int errno,
INP_INFO_WLOCK(pcbinfo);
LIST_FOREACH_SAFE(inp, pcbinfo->ipi_listhead, inp_list, inp_temp) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
#ifdef INET6
if ((inp->inp_vflag & INP_IPV4) == 0) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
continue;
}
#endif
if (inp->inp_faddr.s_addr != faddr.s_addr ||
inp->inp_socket == NULL) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
continue;
}
if ((*notify)(inp, errno))
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_WUNLOCK(pcbinfo);
}
@@ -834,7 +843,7 @@ in_pcbpurgeif0(struct inpcbinfo *pcbinfo, struct ifnet *ifp)
INP_INFO_RLOCK(pcbinfo);
LIST_FOREACH(inp, pcbinfo->ipi_listhead, inp_list) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
imo = inp->inp_moptions;
if ((inp->inp_vflag & INP_IPV4) &&
imo != NULL) {
@@ -860,7 +869,7 @@ in_pcbpurgeif0(struct inpcbinfo *pcbinfo, struct ifnet *ifp)
}
imo->imo_num_memberships -= gap;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(pcbinfo);
}
@@ -882,7 +891,7 @@ in_pcblookup_local(struct inpcbinfo *pcbinfo, struct in_addr laddr,
int wildcard;
u_short lport = lport_arg;
- INP_INFO_WLOCK_ASSERT(pcbinfo);
+ INP_INFO_LOCK_ASSERT(pcbinfo);
if (!wild_okay) {
struct inpcbhead *head;
@@ -989,7 +998,7 @@ in_pcblookup_hash(struct inpcbinfo *pcbinfo, struct in_addr faddr,
struct inpcb *inp;
u_short fport = fport_arg, lport = lport_arg;
- INP_INFO_RLOCK_ASSERT(pcbinfo);
+ INP_INFO_LOCK_ASSERT(pcbinfo);
/*
* First look for an exact match.
@@ -1064,7 +1073,7 @@ in_pcbinshash(struct inpcb *inp)
u_int32_t hashkey_faddr;
INP_INFO_WLOCK_ASSERT(pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef INET6
if (inp->inp_vflag & INP_IPV6)
@@ -1118,7 +1127,7 @@ in_pcbrehash(struct inpcb *inp)
u_int32_t hashkey_faddr;
INP_INFO_WLOCK_ASSERT(pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef INET6
if (inp->inp_vflag & INP_IPV6)
@@ -1143,7 +1152,7 @@ in_pcbremlists(struct inpcb *inp)
struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
INP_INFO_WLOCK_ASSERT(pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
inp->inp_gencnt = ++pcbinfo->ipi_gencnt;
if (inp->inp_lport) {
@@ -1173,11 +1182,11 @@ in_pcbsosetlabel(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in_pcbsosetlabel: so->so_pcb == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
SOCK_LOCK(so);
mac_inpcb_sosetlabel(so, inp);
SOCK_UNLOCK(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
#endif
}
@@ -1205,28 +1214,28 @@ void
inp_wlock(struct inpcb *inp)
{
- INP_LOCK(inp);
+ INP_WLOCK(inp);
}
void
inp_wunlock(struct inpcb *inp)
{
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
void
inp_rlock(struct inpcb *inp)
{
- INP_LOCK(inp);
+ INP_WLOCK(inp);
}
void
inp_runlock(struct inpcb *inp)
{
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
#ifdef INVARIANTS
@@ -1234,7 +1243,7 @@ void
inp_lock_assert(struct inpcb *inp)
{
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
}
void
diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h
index 2bdfb4e..afb4dd2 100644
--- a/sys/netinet/in_pcb.h
+++ b/sys/netinet/in_pcb.h
@@ -36,9 +36,14 @@
#include <sys/queue.h>
#include <sys/_lock.h>
#include <sys/_mutex.h>
+#include <sys/_rwlock.h>
#include <net/route.h>
+#ifdef _KERNEL
+#include <sys/rwlock.h>
+#endif
+
#define in6pcb inpcb /* for KAME src sync over BSD*'s */
#define in6p_sp inp_sp /* for KAME src sync over BSD*'s */
struct inpcbpolicy;
@@ -171,7 +176,7 @@ struct inpcb {
struct inpcbport *inp_phd; /* head of this list */
#define inp_zero_size offsetof(struct inpcb, inp_gencnt)
inp_gen_t inp_gencnt; /* generation count of this instance */
- struct mtx inp_mtx;
+ struct rwlock inp_lock;
#define in6p_faddr inp_inc.inc6_faddr
#define in6p_laddr inp_inc.inc6_laddr
@@ -264,7 +269,7 @@ struct inpcbinfo {
* or freed.
*/
u_quad_t ipi_gencnt;
- struct mtx ipi_mtx;
+ struct rwlock ipi_lock;
/*
* vimage 1
@@ -274,12 +279,16 @@ struct inpcbinfo {
};
#define INP_LOCK_INIT(inp, d, t) \
- mtx_init(&(inp)->inp_mtx, (d), (t), MTX_DEF | MTX_RECURSE | MTX_DUPOK)
-#define INP_LOCK_DESTROY(inp) mtx_destroy(&(inp)->inp_mtx)
-#define INP_LOCK(inp) mtx_lock(&(inp)->inp_mtx)
-#define INP_UNLOCK(inp) mtx_unlock(&(inp)->inp_mtx)
-#define INP_LOCK_ASSERT(inp) mtx_assert(&(inp)->inp_mtx, MA_OWNED)
-#define INP_UNLOCK_ASSERT(inp) mtx_assert(&(inp)->inp_mtx, MA_NOTOWNED)
+ rw_init_flags(&(inp)->inp_lock, (t), RW_RECURSE | RW_DUPOK)
+#define INP_LOCK_DESTROY(inp) rw_destroy(&(inp)->inp_lock)
+#define INP_RLOCK(inp) rw_rlock(&(inp)->inp_lock)
+#define INP_WLOCK(inp) rw_wlock(&(inp)->inp_lock)
+#define INP_RUNLOCK(inp) rw_runlock(&(inp)->inp_lock)
+#define INP_WUNLOCK(inp) rw_wunlock(&(inp)->inp_lock)
+#define INP_LOCK_ASSERT(inp) rw_assert(&(inp)->inp_lock, RA_LOCKED)
+#define INP_RLOCK_ASSERT(inp) rw_assert(&(inp)->inp_lock, RA_RLOCKED)
+#define INP_WLOCK_ASSERT(inp) rw_assert(&(inp)->inp_lock, RA_WLOCKED)
+#define INP_UNLOCK_ASSERT(inp) rw_assert(&(inp)->inp_lock, RA_UNLOCKED)
#ifdef _KERNEL
/*
@@ -311,15 +320,16 @@ inp_unlock_assert(struct inpcb *inp __unused)
#define INP_INFO_LOCK_INIT(ipi, d) \
- mtx_init(&(ipi)->ipi_mtx, (d), NULL, MTX_DEF | MTX_RECURSE)
-#define INP_INFO_LOCK_DESTROY(ipi) mtx_destroy(&(ipi)->ipi_mtx)
-#define INP_INFO_RLOCK(ipi) mtx_lock(&(ipi)->ipi_mtx)
-#define INP_INFO_WLOCK(ipi) mtx_lock(&(ipi)->ipi_mtx)
-#define INP_INFO_RUNLOCK(ipi) mtx_unlock(&(ipi)->ipi_mtx)
-#define INP_INFO_WUNLOCK(ipi) mtx_unlock(&(ipi)->ipi_mtx)
-#define INP_INFO_RLOCK_ASSERT(ipi) mtx_assert(&(ipi)->ipi_mtx, MA_OWNED)
-#define INP_INFO_WLOCK_ASSERT(ipi) mtx_assert(&(ipi)->ipi_mtx, MA_OWNED)
-#define INP_INFO_UNLOCK_ASSERT(ipi) mtx_assert(&(ipi)->ipi_mtx, MA_NOTOWNED)
+ rw_init_flags(&(ipi)->ipi_lock, (d), RW_RECURSE)
+#define INP_INFO_LOCK_DESTROY(ipi) rw_destroy(&(ipi)->ipi_lock)
+#define INP_INFO_RLOCK(ipi) rw_rlock(&(ipi)->ipi_lock)
+#define INP_INFO_WLOCK(ipi) rw_wlock(&(ipi)->ipi_lock)
+#define INP_INFO_RUNLOCK(ipi) rw_runlock(&(ipi)->ipi_lock)
+#define INP_INFO_WUNLOCK(ipi) rw_wunlock(&(ipi)->ipi_lock)
+#define INP_INFO_LOCK_ASSERT(ipi) rw_assert(&(ipi)->ipi_lock, RA_LOCKED)
+#define INP_INFO_RLOCK_ASSERT(ipi) rw_assert(&(ipi)->ipi_lock, RA_RLOCKED)
+#define INP_INFO_WLOCK_ASSERT(ipi) rw_assert(&(ipi)->ipi_lock, RA_WLOCKED)
+#define INP_INFO_UNLOCK_ASSERT(ipi) rw_assert(&(ipi)->ipi_lock, RA_UNLOCKED)
#define INP_PCBHASH(faddr, lport, fport, mask) \
(((faddr) ^ ((faddr) >> 16) ^ ntohs((lport) ^ (fport))) & (mask))
diff --git a/sys/netinet/ip_divert.c b/sys/netinet/ip_divert.c
index ee81288..b2ec79f 100644
--- a/sys/netinet/ip_divert.c
+++ b/sys/netinet/ip_divert.c
@@ -268,7 +268,7 @@ divert_packet(struct mbuf *m, int incoming)
nport = htons((u_int16_t)divert_info(mtag));
INP_INFO_RLOCK(&divcbinfo);
LIST_FOREACH(inp, &divcb, inp_list) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
/* XXX why does only one socket match? */
if (inp->inp_lport == nport) {
sa = inp->inp_socket;
@@ -280,10 +280,10 @@ divert_packet(struct mbuf *m, int incoming)
sa = NULL; /* force mbuf reclaim below */
} else
sorwakeup_locked(sa);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(&divcbinfo);
if (sa == NULL) {
@@ -356,7 +356,7 @@ div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin,
dt->info |= IP_FW_DIVERT_OUTPUT_FLAG;
INP_INFO_WLOCK(&divcbinfo);
inp = sotoinpcb(so);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
/*
* Don't allow both user specified and setsockopt options,
* and don't allow packet length sizes that will crash
@@ -364,7 +364,7 @@ div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin,
if (((ip->ip_hl != (sizeof (*ip) >> 2)) && inp->inp_options) ||
((u_short)ntohs(ip->ip_len) > m->m_pkthdr.len)) {
error = EINVAL;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&divcbinfo);
m_freem(m);
} else {
@@ -405,7 +405,7 @@ div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin,
if (options == NULL)
error = ENOBUFS;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&divcbinfo);
if (error == ENOBUFS) {
m_freem(m);
@@ -480,7 +480,7 @@ div_attach(struct socket *so, int proto, struct thread *td)
inp->inp_ip_p = proto;
inp->inp_vflag |= INP_IPV4;
inp->inp_flags |= INP_HDRINCL;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return 0;
}
@@ -492,7 +492,7 @@ div_detach(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("div_detach: inp == NULL"));
INP_INFO_WLOCK(&divcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
in_pcbdetach(inp);
in_pcbfree(inp);
INP_INFO_WUNLOCK(&divcbinfo);
@@ -517,9 +517,9 @@ div_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
return EAFNOSUPPORT;
((struct sockaddr_in *)nam)->sin_addr.s_addr = INADDR_ANY;
INP_INFO_WLOCK(&divcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
error = in_pcbbind(inp, nam, td->td_ucred);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&divcbinfo);
return error;
}
@@ -531,9 +531,9 @@ div_shutdown(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("div_shutdown: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
socantsendmore(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return 0;
}
@@ -615,11 +615,11 @@ div_pcblist(SYSCTL_HANDLER_ARGS)
INP_INFO_RLOCK(&divcbinfo);
for (inp = LIST_FIRST(divcbinfo.ipi_listhead), i = 0; inp && i < n;
inp = LIST_NEXT(inp, inp_list)) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt &&
cr_canseesocket(req->td->td_ucred, inp->inp_socket) == 0)
inp_list[i++] = inp;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(&divcbinfo);
n = i;
@@ -627,7 +627,7 @@ div_pcblist(SYSCTL_HANDLER_ARGS)
error = 0;
for (i = 0; i < n; i++) {
inp = inp_list[i];
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt) {
struct xinpcb xi;
bzero(&xi, sizeof(xi));
@@ -636,10 +636,10 @@ div_pcblist(SYSCTL_HANDLER_ARGS)
bcopy(inp, &xi.xi_inp, sizeof *inp);
if (inp->inp_socket)
sotoxsocket(inp->inp_socket, &xi.xi_socket);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = SYSCTL_OUT(req, &xi, sizeof xi);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
if (!error) {
/*
diff --git a/sys/netinet/ip_fw2.c b/sys/netinet/ip_fw2.c
index a3347e5..428a182 100644
--- a/sys/netinet/ip_fw2.c
+++ b/sys/netinet/ip_fw2.c
@@ -1974,7 +1974,7 @@ check_uidgid(ipfw_insn_u32 *insn, int proto, struct ifnet *oif,
* up the PCB, we can use the one that was supplied.
*/
if (inp && *lookup == 0) {
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (inp->inp_socket != NULL) {
fill_ugid_cache(inp, ugp);
*lookup = 1;
@@ -2008,12 +2008,12 @@ check_uidgid(ipfw_insn_u32 *insn, int proto, struct ifnet *oif,
dst_ip, htons(dst_port),
wildcard, NULL);
if (pcb != NULL) {
- INP_LOCK(pcb);
+ INP_WLOCK(pcb);
if (pcb->inp_socket != NULL) {
fill_ugid_cache(pcb, ugp);
*lookup = 1;
}
- INP_UNLOCK(pcb);
+ INP_WUNLOCK(pcb);
}
INP_INFO_RUNLOCK(pi);
if (*lookup == 0) {
diff --git a/sys/netinet/ip_options.c b/sys/netinet/ip_options.c
index 6eeec01..72b6edd 100644
--- a/sys/netinet/ip_options.c
+++ b/sys/netinet/ip_options.c
@@ -589,7 +589,7 @@ ip_pcbopts(struct inpcb *inp, int optname, struct mbuf *m)
struct mbuf **pcbopt;
u_char opt;
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
pcbopt = &inp->inp_options;
diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c
index 7ce2104..5e08dac 100644
--- a/sys/netinet/ip_output.c
+++ b/sys/netinet/ip_output.c
@@ -130,7 +130,7 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags,
}
if (inp != NULL)
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (opt) {
len = 0;
@@ -844,9 +844,9 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt)
m_free(m);
break;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
error = ip_pcbopts(inp, sopt->sopt_name, m);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -883,12 +883,12 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt)
break;
#define OPTSET(bit) do { \
- INP_LOCK(inp); \
+ INP_WLOCK(inp); \
if (optval) \
inp->inp_flags |= bit; \
else \
inp->inp_flags &= ~bit; \
- INP_UNLOCK(inp); \
+ INP_WUNLOCK(inp); \
} while (0)
case IP_RECVOPTS:
@@ -955,7 +955,7 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt)
if (error)
break;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
switch (optval) {
case IP_PORTRANGE_DEFAULT:
inp->inp_flags &= ~(INP_LOWPORT);
@@ -976,7 +976,7 @@ ip_ctloutput(struct socket *so, struct sockopt *sopt)
error = EINVAL;
break;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
#ifdef IPSEC
diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c
index f23aaf1..ead5219 100644
--- a/sys/netinet/raw_ip.c
+++ b/sys/netinet/raw_ip.c
@@ -155,7 +155,7 @@ raw_append(struct inpcb *last, struct ip *ip, struct mbuf *n)
{
int policyfail = 0;
- INP_LOCK_ASSERT(last);
+ INP_WLOCK_ASSERT(last);
#ifdef IPSEC
/* check AH/ESP integrity. */
@@ -209,10 +209,10 @@ rip_input(struct mbuf *m, int off)
ripsrc.sin_addr = ip->ip_src;
last = NULL;
LIST_FOREACH(inp, &ripcb, inp_list) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_ip_p && inp->inp_ip_p != proto) {
docontinue:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
continue;
}
#ifdef INET6
@@ -236,14 +236,14 @@ rip_input(struct mbuf *m, int off)
if (n != NULL)
(void) raw_append(last, ip, n);
/* XXX count dropped packet */
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
}
last = inp;
}
if (last != NULL) {
if (raw_append(last, ip, m) != 0)
ipstat.ips_delivered--;
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
} else {
m_freem(m);
ipstat.ips_noproto++;
@@ -278,7 +278,7 @@ rip_output(struct mbuf *m, struct socket *so, u_long dst)
if (m == NULL)
return(ENOBUFS);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
ip = mtod(m, struct ip *);
ip->ip_tos = inp->inp_ip_tos;
if (inp->inp_flags & INP_DONTFRAG)
@@ -299,12 +299,12 @@ rip_output(struct mbuf *m, struct socket *so, u_long dst)
m_freem(m);
return(EMSGSIZE);
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
ip = mtod(m, struct ip *);
if (jailed(inp->inp_socket->so_cred)) {
if (ip->ip_src.s_addr !=
htonl(prison_getip(inp->inp_socket->so_cred))) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
m_freem(m);
return (EPERM);
}
@@ -315,7 +315,7 @@ rip_output(struct mbuf *m, struct socket *so, u_long dst)
&& inp->inp_options)
|| (ip->ip_len > m->m_pkthdr.len)
|| (ip->ip_len < (ip->ip_hl << 2))) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
m_freem(m);
return EINVAL;
}
@@ -335,7 +335,7 @@ rip_output(struct mbuf *m, struct socket *so, u_long dst)
error = ip_output(m, inp->inp_options, NULL, flags,
inp->inp_moptions, inp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return error;
}
@@ -621,7 +621,7 @@ rip_attach(struct socket *so, int proto, struct thread *td)
inp->inp_vflag |= INP_IPV4;
inp->inp_ip_p = proto;
inp->inp_ip_ttl = ip_defttl;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return 0;
}
@@ -636,7 +636,7 @@ rip_detach(struct socket *so)
("rip_detach: not closed"));
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (so == ip_mrouter && ip_mrouter_done)
ip_mrouter_done();
if (ip_rsvp_force_done)
@@ -652,7 +652,7 @@ static void
rip_dodisconnect(struct socket *so, struct inpcb *inp)
{
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
inp->inp_faddr.s_addr = INADDR_ANY;
SOCK_LOCK(so);
@@ -669,9 +669,9 @@ rip_abort(struct socket *so)
KASSERT(inp != NULL, ("rip_abort: inp == NULL"));
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
rip_dodisconnect(so, inp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
}
@@ -684,9 +684,9 @@ rip_close(struct socket *so)
KASSERT(inp != NULL, ("rip_close: inp == NULL"));
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
rip_dodisconnect(so, inp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
}
@@ -701,9 +701,9 @@ rip_disconnect(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("rip_disconnect: inp == NULL"));
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
rip_dodisconnect(so, inp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return (0);
}
@@ -734,9 +734,9 @@ rip_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("rip_bind: inp == NULL"));
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
inp->inp_laddr = addr->sin_addr;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return 0;
}
@@ -757,10 +757,10 @@ rip_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("rip_connect: inp == NULL"));
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
inp->inp_faddr = addr->sin_addr;
soisconnected(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return 0;
}
@@ -772,9 +772,9 @@ rip_shutdown(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("rip_shutdown: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
socantsendmore(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return 0;
}
@@ -847,17 +847,17 @@ rip_pcblist(SYSCTL_HANDLER_ARGS)
inp_list = malloc(n * sizeof *inp_list, M_TEMP, M_WAITOK);
if (inp_list == 0)
return ENOMEM;
-
+
INP_INFO_RLOCK(&ripcbinfo);
for (inp = LIST_FIRST(ripcbinfo.ipi_listhead), i = 0; inp && i < n;
inp = LIST_NEXT(inp, inp_list)) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt &&
cr_canseesocket(req->td->td_ucred, inp->inp_socket) == 0) {
/* XXX held references? */
inp_list[i++] = inp;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(&ripcbinfo);
n = i;
@@ -865,7 +865,7 @@ rip_pcblist(SYSCTL_HANDLER_ARGS)
error = 0;
for (i = 0; i < n; i++) {
inp = inp_list[i];
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt) {
struct xinpcb xi;
bzero(&xi, sizeof(xi));
@@ -874,10 +874,10 @@ rip_pcblist(SYSCTL_HANDLER_ARGS)
bcopy(inp, &xi.xi_inp, sizeof *inp);
if (inp->inp_socket)
sotoxsocket(inp->inp_socket, &xi.xi_socket);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = SYSCTL_OUT(req, &xi, sizeof xi);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
if (!error) {
/*
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index d7f42867..a344ae5 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -476,7 +476,7 @@ findpcb:
rstreason = BANDLIM_RST_CLOSEDPORT;
goto dropwithreset;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
#ifdef IPSEC
#ifdef INET6
@@ -533,7 +533,7 @@ findpcb:
}
#ifdef MAC
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (mac_inpcb_check_deliver(inp, m))
goto dropunlock;
#endif
@@ -631,9 +631,9 @@ findpcb:
* Unlock the listen socket, lock the newly
* created socket and update the tp variable.
*/
- INP_UNLOCK(inp); /* listen socket */
+ INP_WUNLOCK(inp); /* listen socket */
inp = sotoinpcb(so);
- INP_LOCK(inp); /* new connection */
+ INP_WLOCK(inp); /* new connection */
tp = intotcpcb(inp);
KASSERT(tp->t_state == TCPS_SYN_RECEIVED,
("%s: ", __func__));
@@ -853,7 +853,7 @@ dropwithreset:
dropunlock:
INP_INFO_WLOCK_ASSERT(&tcbinfo);
if (inp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
drop:
INP_INFO_UNLOCK_ASSERT(&tcbinfo);
@@ -886,7 +886,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
thflags = th->th_flags;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
KASSERT(tp->t_state > TCPS_LISTEN, ("%s: TCPS_LISTEN",
__func__));
KASSERT(tp->t_state != TCPS_TIME_WAIT, ("%s: TCPS_TIME_WAIT",
@@ -1330,7 +1330,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
KASSERT(headlocked, ("%s: trimthenstep6: head not locked",
__func__));
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/*
* Advance th->th_seq to correspond to first data byte.
@@ -1938,7 +1938,7 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
process_ACK:
KASSERT(headlocked, ("%s: process_ACK: head not locked",
__func__));
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
acked = th->th_ack - tp->snd_una;
tcpstat.tcps_rcvackpack++;
@@ -2121,7 +2121,7 @@ process_ACK:
step6:
KASSERT(headlocked, ("%s: step6: head not locked", __func__));
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/*
* Update window information.
@@ -2207,7 +2207,7 @@ step6:
}
dodata: /* XXX */
KASSERT(headlocked, ("%s: dodata: head not locked", __func__));
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/*
* Process the segment text, merging it into the TCP sequencing queue,
@@ -2350,12 +2350,12 @@ check_delack:
KASSERT(headlocked == 0, ("%s: check_delack: head locked",
__func__));
INP_INFO_UNLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
if (tp->t_flags & TF_DELACK) {
tp->t_flags &= ~TF_DELACK;
tcp_timer_activate(tp, TT_DELACK, tcp_delacktime);
}
- INP_UNLOCK(tp->t_inpcb);
+ INP_WUNLOCK(tp->t_inpcb);
return;
dropafterack:
@@ -2390,7 +2390,7 @@ dropafterack:
INP_INFO_WUNLOCK(&tcbinfo);
tp->t_flags |= TF_ACKNOW;
(void) tcp_output(tp);
- INP_UNLOCK(tp->t_inpcb);
+ INP_WUNLOCK(tp->t_inpcb);
m_freem(m);
return;
@@ -2400,7 +2400,7 @@ dropwithreset:
tcp_dropwithreset(m, th, tp, tlen, rstreason);
if (tp != NULL)
- INP_UNLOCK(tp->t_inpcb);
+ INP_WUNLOCK(tp->t_inpcb);
if (headlocked)
INP_INFO_WUNLOCK(&tcbinfo);
return;
@@ -2415,7 +2415,7 @@ drop:
&tcp_savetcp, 0);
#endif
if (tp != NULL)
- INP_UNLOCK(tp->t_inpcb);
+ INP_WUNLOCK(tp->t_inpcb);
if (headlocked)
INP_INFO_WUNLOCK(&tcbinfo);
m_freem(m);
@@ -2437,7 +2437,7 @@ tcp_dropwithreset(struct mbuf *m, struct tcphdr *th, struct tcpcb *tp,
#endif
if (tp != NULL) {
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
}
/* Don't bother if destination was broadcast/multicast. */
@@ -2589,7 +2589,7 @@ tcp_pulloutofband(struct socket *so, struct tcphdr *th, struct mbuf *m,
char *cp = mtod(m, caddr_t) + cnt;
struct tcpcb *tp = sototcpcb(so);
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
tp->t_iobc = *cp;
tp->t_oobflags |= TCPOOB_HAVEDATA;
@@ -2616,7 +2616,7 @@ tcp_xmit_timer(struct tcpcb *tp, int rtt)
{
int delta;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
tcpstat.tcps_rttupdated++;
tp->t_rttupdated++;
@@ -2736,7 +2736,7 @@ tcp_mss(struct tcpcb *tp, int offer)
const size_t min_protoh = sizeof(struct tcpiphdr);
#endif
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/* Initialize. */
#ifdef INET6
@@ -3006,7 +3006,7 @@ tcp_newreno_partial_ack(struct tcpcb *tp, struct tcphdr *th)
tcp_seq onxt = tp->snd_nxt;
u_long ocwnd = tp->snd_cwnd;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
tcp_timer_activate(tp, TT_REXMT, 0);
tp->t_rtttime = 0;
diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c
index 5c659a3..5566ccf 100644
--- a/sys/netinet/tcp_output.c
+++ b/sys/netinet/tcp_output.c
@@ -152,7 +152,7 @@ tcp_output(struct tcpcb *tp)
isipv6 = (tp->t_inpcb->inp_vflag & INP_IPV6) != 0;
#endif
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/*
* Determine length of data that should be transmitted,
diff --git a/sys/netinet/tcp_reass.c b/sys/netinet/tcp_reass.c
index d011878..1502242 100644
--- a/sys/netinet/tcp_reass.c
+++ b/sys/netinet/tcp_reass.c
@@ -131,7 +131,7 @@ tcp_reass(struct tcpcb *tp, struct tcphdr *th, int *tlenp, struct mbuf *m)
struct socket *so = tp->t_inpcb->inp_socket;
int flags;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/*
* XXX: tcp_reass() is rather inefficient with its data structures
diff --git a/sys/netinet/tcp_sack.c b/sys/netinet/tcp_sack.c
index aa0849c..0b55a04 100644
--- a/sys/netinet/tcp_sack.c
+++ b/sys/netinet/tcp_sack.c
@@ -160,7 +160,7 @@ tcp_update_sack_list(struct tcpcb *tp, tcp_seq rcv_start, tcp_seq rcv_end)
struct sackblk head_blk, saved_blks[MAX_SACK_BLKS];
int num_head, num_saved, i;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/* Check arguments. */
KASSERT(SEQ_LT(rcv_start, rcv_end), ("rcv_start < rcv_end"));
@@ -240,7 +240,7 @@ tcp_clean_sackreport(struct tcpcb *tp)
{
int i;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
tp->rcv_numsacks = 0;
for (i = 0; i < MAX_SACK_BLKS; i++)
tp->sackblks[i].start = tp->sackblks[i].end=0;
@@ -347,7 +347,7 @@ tcp_sack_doack(struct tcpcb *tp, struct tcpopt *to, tcp_seq th_ack)
struct sackblk sack, sack_blocks[TCP_MAX_SACK + 1], *sblkp;
int i, j, num_sack_blks;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
num_sack_blks = 0;
/*
@@ -544,7 +544,7 @@ tcp_free_sackholes(struct tcpcb *tp)
{
struct sackhole *q;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
while ((q = TAILQ_FIRST(&tp->snd_holes)) != NULL)
tcp_sackhole_remove(tp, q);
tp->sackhint.sack_bytes_rexmit = 0;
@@ -567,7 +567,7 @@ tcp_sack_partialack(struct tcpcb *tp, struct tcphdr *th)
{
int num_segs = 1;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
tcp_timer_activate(tp, TT_REXMT, 0);
tp->t_rtttime = 0;
/* Send one or 2 segments based on how much new data was acked. */
@@ -591,7 +591,7 @@ tcp_sack_output_debug(struct tcpcb *tp, int *sack_bytes_rexmt)
{
struct sackhole *p;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
*sack_bytes_rexmt = 0;
TAILQ_FOREACH(p, &tp->snd_holes, scblink) {
if (SEQ_LT(p->rxmit, p->end)) {
@@ -629,7 +629,7 @@ tcp_sack_output(struct tcpcb *tp, int *sack_bytes_rexmt)
{
struct sackhole *hole = NULL;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
*sack_bytes_rexmt = tp->sackhint.sack_bytes_rexmit;
hole = tp->sackhint.nexthole;
if (hole == NULL || SEQ_LT(hole->rxmit, hole->end))
@@ -654,7 +654,7 @@ tcp_sack_adjust(struct tcpcb *tp)
{
struct sackhole *p, *cur = TAILQ_FIRST(&tp->snd_holes);
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
if (cur == NULL)
return; /* No holes */
if (SEQ_GEQ(tp->snd_nxt, tp->snd_fack))
diff --git a/sys/netinet/tcp_subr.c b/sys/netinet/tcp_subr.c
index 214dc3e..aaac6d6 100644
--- a/sys/netinet/tcp_subr.c
+++ b/sys/netinet/tcp_subr.c
@@ -332,7 +332,7 @@ tcpip_fillheaders(struct inpcb *inp, void *ip_ptr, void *tcp_ptr)
{
struct tcphdr *th = (struct tcphdr *)tcp_ptr;
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef INET6
if ((inp->inp_vflag & INP_IPV6) != 0) {
@@ -438,7 +438,7 @@ tcp_respond(struct tcpcb *tp, void *ipgen, struct tcphdr *th, struct mbuf *m,
if (tp != NULL) {
inp = tp->t_inpcb;
KASSERT(inp != NULL, ("tcp control block w/o inpcb"));
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
} else
inp = NULL;
@@ -525,7 +525,7 @@ tcp_respond(struct tcpcb *tp, void *ipgen, struct tcphdr *th, struct mbuf *m,
* Packet is associated with a socket, so allow the
* label of the response to reflect the socket label.
*/
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
mac_inpcb_create_mbuf(inp, m);
} else {
/*
@@ -648,7 +648,7 @@ tcp_drop(struct tcpcb *tp, int errno)
struct socket *so = tp->t_inpcb->inp_socket;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
if (TCPS_HAVERCVDSYN(tp->t_state)) {
tp->t_state = TCPS_CLOSED;
@@ -672,7 +672,7 @@ tcp_discardcb(struct tcpcb *tp)
int isipv6 = (inp->inp_vflag & INP_IPV6) != 0;
#endif /* INET6 */
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
/*
* Make sure that all of our timers are stopped before we
@@ -770,7 +770,7 @@ tcp_close(struct tcpcb *tp)
struct socket *so;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
/* Notify any offload devices of listener close */
if (tp->t_state == TCPS_LISTEN)
@@ -784,7 +784,7 @@ tcp_close(struct tcpcb *tp)
KASSERT(so->so_state & SS_PROTOREF,
("tcp_close: !SS_PROTOREF"));
inp->inp_vflag &= ~INP_SOCKREF;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
ACCEPT_LOCK();
SOCK_LOCK(so);
so->so_state &= ~SS_PROTOREF;
@@ -815,7 +815,7 @@ tcp_drain(void)
LIST_FOREACH(inpb, tcbinfo.ipi_listhead, inp_list) {
if (inpb->inp_vflag & INP_TIMEWAIT)
continue;
- INP_LOCK(inpb);
+ INP_WLOCK(inpb);
if ((tcpb = intotcpcb(inpb)) != NULL) {
while ((te = LIST_FIRST(&tcpb->t_segq))
!= NULL) {
@@ -827,7 +827,7 @@ tcp_drain(void)
}
tcp_clean_sackreport(tcpb);
}
- INP_UNLOCK(inpb);
+ INP_WUNLOCK(inpb);
}
INP_INFO_RUNLOCK(&tcbinfo);
}
@@ -847,7 +847,7 @@ tcp_notify(struct inpcb *inp, int error)
struct tcpcb *tp;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if ((inp->inp_vflag & INP_TIMEWAIT) ||
(inp->inp_vflag & INP_DROPPED))
@@ -942,7 +942,7 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
INP_INFO_RLOCK(&tcbinfo);
for (inp = LIST_FIRST(tcbinfo.ipi_listhead), i = 0; inp != NULL && i
< n; inp = LIST_NEXT(inp, inp_list)) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt) {
/*
* XXX: This use of cr_cansee(), introduced with
@@ -961,7 +961,7 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
if (error == 0)
inp_list[i++] = inp;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(&tcbinfo);
n = i;
@@ -969,7 +969,7 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
error = 0;
for (i = 0; i < n; i++) {
inp = inp_list[i];
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt) {
struct xtcpcb xt;
void *inp_ppcb;
@@ -993,10 +993,10 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
xt.xt_socket.xso_protocol = IPPROTO_TCP;
}
xt.xt_inp.inp_gencnt = inp->inp_gencnt;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = SYSCTL_OUT(req, &xt, sizeof xt);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
if (!error) {
@@ -1042,7 +1042,7 @@ tcp_getcred(SYSCTL_HANDLER_ARGS)
error = ENOENT;
goto outunlocked;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_socket == NULL) {
error = ENOENT;
goto out;
@@ -1052,7 +1052,7 @@ tcp_getcred(SYSCTL_HANDLER_ARGS)
goto out;
cru2x(inp->inp_socket->so_cred, &xuc);
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
outunlocked:
INP_INFO_RUNLOCK(&tcbinfo);
if (error == 0)
@@ -1106,7 +1106,7 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS)
error = ENOENT;
goto outunlocked;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_socket == NULL) {
error = ENOENT;
goto out;
@@ -1116,7 +1116,7 @@ tcp6_getcred(SYSCTL_HANDLER_ARGS)
goto out;
cru2x(inp->inp_socket->so_cred, &xuc);
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
outunlocked:
INP_INFO_RUNLOCK(&tcbinfo);
if (error == 0)
@@ -1181,7 +1181,7 @@ tcp_ctlinput(int cmd, struct sockaddr *sa, void *vip)
inp = in_pcblookup_hash(&tcbinfo, faddr, th->th_dport,
ip->ip_src, th->th_sport, 0, NULL);
if (inp != NULL) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (!(inp->inp_vflag & INP_TIMEWAIT) &&
!(inp->inp_vflag & INP_DROPPED) &&
!(inp->inp_socket == NULL)) {
@@ -1230,7 +1230,7 @@ tcp_ctlinput(int cmd, struct sockaddr *sa, void *vip)
}
}
if (inp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
} else {
inc.inc_fport = th->th_dport;
inc.inc_lport = th->th_sport;
@@ -1381,7 +1381,7 @@ tcp_new_isn(struct tcpcb *tp)
u_int32_t md5_buffer[4];
tcp_seq new_isn;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
ISN_LOCK();
/* Seed if this is the first use, reseed if requested. */
@@ -1452,7 +1452,7 @@ tcp_drop_syn_sent(struct inpcb *inp, int errno)
struct tcpcb *tp;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if ((inp->inp_vflag & INP_TIMEWAIT) ||
(inp->inp_vflag & INP_DROPPED))
@@ -1487,7 +1487,7 @@ tcp_mtudisc(struct inpcb *inp, int errno)
int isipv6;
#endif /* INET6 */
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if ((inp->inp_vflag & INP_TIMEWAIT) ||
(inp->inp_vflag & INP_DROPPED))
return (inp);
@@ -1752,7 +1752,7 @@ tcp_xmit_bandwidth_limit(struct tcpcb *tp, tcp_seq ack_seq)
u_long bwnd;
int save_ticks;
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
/*
* If inflight_enable is disabled in the middle of a tcp connection,
@@ -2045,7 +2045,7 @@ sysctl_drop(SYSCTL_HANDLER_ARGS)
break;
}
if (inp != NULL) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & INP_TIMEWAIT) {
/*
* XXXRW: There currently exists a state where an
@@ -2057,15 +2057,15 @@ sysctl_drop(SYSCTL_HANDLER_ARGS)
if (tw != NULL)
tcp_twclose(tw, 0);
else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
} else if (!(inp->inp_vflag & INP_DROPPED) &&
!(inp->inp_socket->so_options & SO_ACCEPTCONN)) {
tp = intotcpcb(inp);
tp = tcp_drop(tp, ECONNABORTED);
if (tp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
} else
error = ESRCH;
INP_INFO_WUNLOCK(&tcbinfo);
diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c
index a824316..f54c6c9 100644
--- a/sys/netinet/tcp_syncache.c
+++ b/sys/netinet/tcp_syncache.c
@@ -670,7 +670,7 @@ syncache_socket(struct syncache *sc, struct socket *lso, struct mbuf *m)
#endif
inp = sotoinpcb(so);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
/* Insert new socket into PCB hash list. */
inp->inp_inc.inc_isipv6 = sc->sc_inc.inc_isipv6;
@@ -817,13 +817,13 @@ syncache_socket(struct syncache *sc, struct socket *lso, struct mbuf *m)
tp->snd_cwnd = tp->t_maxseg;
tcp_timer_activate(tp, TT_KEEP, tcp_keepinit);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
tcpstat.tcps_accepts++;
return (so);
abort:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
abort2:
if (so != NULL)
soabort(so);
@@ -987,7 +987,7 @@ _syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
struct syncache scs;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp); /* listen socket */
+ INP_WLOCK_ASSERT(inp); /* listen socket */
KASSERT((th->th_flags & (TH_RST|TH_ACK|TH_SYN)) == TH_SYN,
("%s: unexpected tcp flags", __func__));
@@ -1014,13 +1014,13 @@ _syncache_add(struct in_conninfo *inc, struct tcpopt *to, struct tcphdr *th,
#ifdef MAC
if (mac_syncache_init(&maclabel) != 0) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
goto done;
} else
mac_syncache_create(maclabel, inp);
#endif
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
/*
diff --git a/sys/netinet/tcp_timer.c b/sys/netinet/tcp_timer.c
index 2a78477..765156e 100644
--- a/sys/netinet/tcp_timer.c
+++ b/sys/netinet/tcp_timer.c
@@ -166,11 +166,11 @@ tcp_timer_delack(void *xtp)
INP_INFO_RUNLOCK(&tcbinfo);
return;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
INP_INFO_RUNLOCK(&tcbinfo);
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_delack)
|| !callout_active(&tp->t_timers->tt_delack)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return;
}
callout_deactivate(&tp->t_timers->tt_delack);
@@ -178,7 +178,7 @@ tcp_timer_delack(void *xtp)
tp->t_flags |= TF_ACKNOW;
tcpstat.tcps_delack++;
(void) tcp_output(tp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
void
@@ -208,11 +208,11 @@ tcp_timer_2msl(void *xtp)
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
tcp_free_sackholes(tp);
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_2msl) ||
!callout_active(&tp->t_timers->tt_2msl)) {
- INP_UNLOCK(tp->t_inpcb);
+ INP_WUNLOCK(tp->t_inpcb);
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
@@ -247,7 +247,7 @@ tcp_timer_2msl(void *xtp)
PRU_SLOWTIMO);
#endif
if (tp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
}
@@ -276,10 +276,10 @@ tcp_timer_keep(void *xtp)
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_keep)
|| !callout_active(&tp->t_timers->tt_keep)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
@@ -324,7 +324,7 @@ tcp_timer_keep(void *xtp)
tcp_trace(TA_USER, ostate, tp, (void *)0, (struct tcphdr *)0,
PRU_SLOWTIMO);
#endif
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return;
@@ -338,7 +338,7 @@ dropit:
PRU_SLOWTIMO);
#endif
if (tp != NULL)
- INP_UNLOCK(tp->t_inpcb);
+ INP_WUNLOCK(tp->t_inpcb);
INP_INFO_WUNLOCK(&tcbinfo);
}
@@ -366,10 +366,10 @@ tcp_timer_persist(void *xtp)
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_persist)
|| !callout_active(&tp->t_timers->tt_persist)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
@@ -404,7 +404,7 @@ out:
tcp_trace(TA_USER, ostate, tp, NULL, NULL, PRU_SLOWTIMO);
#endif
if (tp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
}
@@ -435,10 +435,10 @@ tcp_timer_rexmt(void * xtp)
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_rexmt)
|| !callout_active(&tp->t_timers->tt_rexmt)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
@@ -560,7 +560,7 @@ out:
PRU_SLOWTIMO);
#endif
if (tp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (headlocked)
INP_INFO_WUNLOCK(&tcbinfo);
}
diff --git a/sys/netinet/tcp_timewait.c b/sys/netinet/tcp_timewait.c
index 6882642..9d4b6e2 100644
--- a/sys/netinet/tcp_timewait.c
+++ b/sys/netinet/tcp_timewait.c
@@ -186,12 +186,12 @@ tcp_twstart(struct tcpcb *tp)
struct socket *so;
INP_INFO_WLOCK_ASSERT(&tcbinfo); /* tcp_tw_2msl_reset(). */
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (nolocaltimewait && in_localip(inp->inp_faddr)) {
tp = tcp_close(tp);
if (tp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return;
}
@@ -201,7 +201,7 @@ tcp_twstart(struct tcpcb *tp)
if (tw == NULL) {
tp = tcp_close(tp);
if (tp != NULL)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return;
}
}
@@ -267,13 +267,13 @@ tcp_twstart(struct tcpcb *tp)
KASSERT(so->so_state & SS_PROTOREF,
("tcp_twstart: !SS_PROTOREF"));
inp->inp_vflag &= ~INP_SOCKREF;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
ACCEPT_LOCK();
SOCK_LOCK(so);
so->so_state &= ~SS_PROTOREF;
sofree(so);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
#if 0
@@ -328,7 +328,7 @@ tcp_twcheck(struct inpcb *inp, struct tcpopt *to, struct tcphdr *th,
/* tcbinfo lock required for tcp_twclose(), tcp_tw_2msl_reset(). */
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
/*
* XXXRW: Time wait state for inpcb has been recycled, but inpcb is
@@ -441,11 +441,11 @@ tcp_twcheck(struct inpcb *inp, struct tcpopt *to, struct tcphdr *th,
tcp_respond(NULL,
mtod(m, void *), th, m, seq, 0, TH_RST|TH_ACK);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (0);
drop:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
m_freem(m);
return (0);
}
@@ -469,7 +469,7 @@ tcp_twclose(struct tcptw *tw, int reuse)
KASSERT((inp->inp_vflag & INP_TIMEWAIT), ("tcp_twclose: !timewait"));
KASSERT(intotw(inp) == tw, ("tcp_twclose: inp_ppcb != tw"));
INP_INFO_WLOCK_ASSERT(&tcbinfo); /* tcp_tw_2msl_stop(). */
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
tw->tw_inpcb = NULL;
tcp_tw_2msl_stop(tw);
@@ -486,7 +486,7 @@ tcp_twclose(struct tcptw *tw, int reuse)
*/
if (inp->inp_vflag & INP_SOCKREF) {
inp->inp_vflag &= ~INP_SOCKREF;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
ACCEPT_LOCK();
SOCK_LOCK(so);
KASSERT(so->so_state & SS_PROTOREF,
@@ -499,7 +499,7 @@ tcp_twclose(struct tcptw *tw, int reuse)
* inpcb need to be left around to be handled by
* tcp_usr_detach() later.
*/
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
} else {
#ifdef INET6
@@ -532,7 +532,7 @@ tcp_twrespond(struct tcptw *tw, int flags)
int isipv6 = inp->inp_inc.inc_isipv6;
#endif
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
m = m_gethdr(M_DONTWAIT, MT_DATA);
if (m == NULL)
@@ -615,7 +615,7 @@ tcp_tw_2msl_reset(struct tcptw *tw, int rearm)
{
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(tw->tw_inpcb);
+ INP_WLOCK_ASSERT(tw->tw_inpcb);
if (rearm)
TAILQ_REMOVE(&twq_2msl, tw, tw_2msl);
tw->tw_time = ticks + 2 * tcp_msl;
@@ -640,7 +640,7 @@ tcp_tw_2msl_scan(int reuse)
tw = TAILQ_FIRST(&twq_2msl);
if (tw == NULL || (!reuse && tw->tw_time > ticks))
break;
- INP_LOCK(tw->tw_inpcb);
+ INP_WLOCK(tw->tw_inpcb);
tcp_twclose(tw, reuse);
if (reuse)
return (tw);
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
index c19bc0c..6a68337 100644
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -160,7 +160,7 @@ tcp_detach(struct socket *so, struct inpcb *inp)
#endif
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
KASSERT(so->so_pcb == inp, ("tcp_detach: so_pcb != inp"));
KASSERT(inp->inp_socket == so, ("tcp_detach: inp_socket != so"));
@@ -201,7 +201,7 @@ tcp_detach(struct socket *so, struct inpcb *inp)
else
#endif
in_pcbdetach(inp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
} else {
/*
@@ -253,7 +253,7 @@ tcp_usr_detach(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_detach: inp == NULL"));
INP_INFO_WLOCK(&tcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
KASSERT(inp->inp_socket != NULL,
("tcp_usr_detach: inp_socket == NULL"));
tcp_detach(so, inp);
@@ -286,7 +286,7 @@ tcp_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_bind: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
goto out;
@@ -296,7 +296,7 @@ tcp_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
error = in_pcbbind(inp, nam, td->td_ucred);
out:
TCPDEBUG2(PRU_BIND);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
@@ -326,7 +326,7 @@ tcp6_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp6_usr_bind: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
goto out;
@@ -352,7 +352,7 @@ tcp6_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
error = in6_pcbbind(inp, nam, td->td_ucred);
out:
TCPDEBUG2(PRU_BIND);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
}
@@ -372,7 +372,7 @@ tcp_usr_listen(struct socket *so, int backlog, struct thread *td)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_listen: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
goto out;
@@ -392,7 +392,7 @@ tcp_usr_listen(struct socket *so, int backlog, struct thread *td)
out:
TCPDEBUG2(PRU_LISTEN);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
}
@@ -409,7 +409,7 @@ tcp6_usr_listen(struct socket *so, int backlog, struct thread *td)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp6_usr_listen: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
goto out;
@@ -432,7 +432,7 @@ tcp6_usr_listen(struct socket *so, int backlog, struct thread *td)
out:
TCPDEBUG2(PRU_LISTEN);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
}
@@ -469,7 +469,7 @@ tcp_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_connect: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
goto out;
@@ -481,7 +481,7 @@ tcp_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
error = tcp_output_connect(so, nam);
out:
TCPDEBUG2(PRU_CONNECT);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
}
@@ -510,7 +510,7 @@ tcp6_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp6_usr_connect: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = EINVAL;
goto out;
@@ -542,7 +542,7 @@ tcp6_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
out:
TCPDEBUG2(PRU_CONNECT);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
}
@@ -570,7 +570,7 @@ tcp_usr_disconnect(struct socket *so)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_disconnect: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = ECONNRESET;
goto out;
@@ -580,7 +580,7 @@ tcp_usr_disconnect(struct socket *so)
tcp_disconnect(tp);
out:
TCPDEBUG2(PRU_DISCONNECT);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
}
@@ -606,7 +606,7 @@ tcp_usr_accept(struct socket *so, struct sockaddr **nam)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_accept: inp == NULL"));
INP_INFO_RLOCK(&tcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = ECONNABORTED;
goto out;
@@ -624,7 +624,7 @@ tcp_usr_accept(struct socket *so, struct sockaddr **nam)
out:
TCPDEBUG2(PRU_ACCEPT);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(&tcbinfo);
if (error == 0)
*nam = in_sockaddr(port, &addr);
@@ -649,7 +649,7 @@ tcp6_usr_accept(struct socket *so, struct sockaddr **nam)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp6_usr_accept: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = ECONNABORTED;
goto out;
@@ -673,7 +673,7 @@ tcp6_usr_accept(struct socket *so, struct sockaddr **nam)
out:
TCPDEBUG2(PRU_ACCEPT);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (error == 0) {
if (v4)
*nam = in6_v4mapsin6_sockaddr(port, &addr);
@@ -698,7 +698,7 @@ tcp_usr_shutdown(struct socket *so)
INP_INFO_WLOCK(&tcbinfo);
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = ECONNRESET;
goto out;
@@ -711,7 +711,7 @@ tcp_usr_shutdown(struct socket *so)
out:
TCPDEBUG2(PRU_SHUTDOWN);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
@@ -730,7 +730,7 @@ tcp_usr_rcvd(struct socket *so, int flags)
TCPDEBUG0;
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_rcvd: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = ECONNRESET;
goto out;
@@ -741,7 +741,7 @@ tcp_usr_rcvd(struct socket *so, int flags)
out:
TCPDEBUG2(PRU_RCVD);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -780,7 +780,7 @@ tcp_usr_send(struct socket *so, int flags, struct mbuf *m,
}
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_send: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
if (control)
m_freem(control);
@@ -899,7 +899,7 @@ tcp_usr_send(struct socket *so, int flags, struct mbuf *m,
out:
TCPDEBUG2((flags & PRUS_OOB) ? PRU_SENDOOB :
((flags & PRUS_EOF) ? PRU_SEND_EOF : PRU_SEND));
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (headlocked)
INP_INFO_WUNLOCK(&tcbinfo);
return (error);
@@ -919,7 +919,7 @@ tcp_usr_abort(struct socket *so)
KASSERT(inp != NULL, ("tcp_usr_abort: inp == NULL"));
INP_INFO_WLOCK(&tcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
KASSERT(inp->inp_socket != NULL,
("tcp_usr_abort: inp_socket == NULL"));
@@ -939,7 +939,7 @@ tcp_usr_abort(struct socket *so)
SOCK_UNLOCK(so);
inp->inp_vflag |= INP_SOCKREF;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
}
@@ -957,7 +957,7 @@ tcp_usr_close(struct socket *so)
KASSERT(inp != NULL, ("tcp_usr_close: inp == NULL"));
INP_INFO_WLOCK(&tcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
KASSERT(inp->inp_socket != NULL,
("tcp_usr_close: inp_socket == NULL"));
@@ -978,7 +978,7 @@ tcp_usr_close(struct socket *so)
SOCK_UNLOCK(so);
inp->inp_vflag |= INP_SOCKREF;
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
}
@@ -995,7 +995,7 @@ tcp_usr_rcvoob(struct socket *so, struct mbuf *m, int flags)
TCPDEBUG0;
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_usr_rcvoob: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
error = ECONNRESET;
goto out;
@@ -1020,7 +1020,7 @@ tcp_usr_rcvoob(struct socket *so, struct mbuf *m, int flags)
out:
TCPDEBUG2(PRU_RCVOOB);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
}
@@ -1086,7 +1086,7 @@ tcp_connect(struct tcpcb *tp, struct sockaddr *nam, struct thread *td)
int error;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (inp->inp_lport == 0) {
error = in_pcbbind(inp, (struct sockaddr *)0, td->td_ucred);
@@ -1141,7 +1141,7 @@ tcp6_connect(struct tcpcb *tp, struct sockaddr *nam, struct thread *td)
int error;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (inp->inp_lport == 0) {
error = in6_pcbbind(inp, (struct sockaddr *)0, td->td_ucred);
@@ -1205,7 +1205,7 @@ static void
tcp_fill_info(struct tcpcb *tp, struct tcp_info *ti)
{
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
bzero(ti, sizeof(*ti));
ti->tcpi_state = tp->t_state;
@@ -1239,10 +1239,10 @@ tcp_fill_info(struct tcpcb *tp, struct tcp_info *ti)
* has to revalidate that the connection is still valid for the socket
* option.
*/
-#define INP_LOCK_RECHECK(inp) do { \
- INP_LOCK(inp); \
+#define INP_WLOCK_RECHECK(inp) do { \
+ INP_WLOCK(inp); \
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) { \
- INP_UNLOCK(inp); \
+ INP_WUNLOCK(inp); \
return (ECONNRESET); \
} \
tp = intotcpcb(inp); \
@@ -1259,15 +1259,15 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
error = 0;
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("tcp_ctloutput: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (sopt->sopt_level != IPPROTO_TCP) {
#ifdef INET6
if (INP_CHECK_SOCKAF(so, AF_INET6)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = ip6_ctloutput(so, sopt);
} else {
#endif /* INET6 */
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = ip_ctloutput(so, sopt);
#ifdef INET6
}
@@ -1275,7 +1275,7 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
return (error);
}
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (ECONNRESET);
}
@@ -1284,29 +1284,29 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
switch (sopt->sopt_name) {
#ifdef TCP_SIGNATURE
case TCP_MD5SIG:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyin(sopt, &optval, sizeof optval,
sizeof optval);
if (error)
return (error);
- INP_LOCK_RECHECK(inp);
+ INP_WLOCK_RECHECK(inp);
if (optval > 0)
tp->t_flags |= TF_SIGNATURE;
else
tp->t_flags &= ~TF_SIGNATURE;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
#endif /* TCP_SIGNATURE */
case TCP_NODELAY:
case TCP_NOOPT:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyin(sopt, &optval, sizeof optval,
sizeof optval);
if (error)
return (error);
- INP_LOCK_RECHECK(inp);
+ INP_WLOCK_RECHECK(inp);
switch (sopt->sopt_name) {
case TCP_NODELAY:
opt = TF_NODELAY;
@@ -1323,49 +1323,49 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
tp->t_flags |= opt;
else
tp->t_flags &= ~opt;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
case TCP_NOPUSH:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyin(sopt, &optval, sizeof optval,
sizeof optval);
if (error)
return (error);
- INP_LOCK_RECHECK(inp);
+ INP_WLOCK_RECHECK(inp);
if (optval)
tp->t_flags |= TF_NOPUSH;
else {
tp->t_flags &= ~TF_NOPUSH;
error = tcp_output(tp);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
case TCP_MAXSEG:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyin(sopt, &optval, sizeof optval,
sizeof optval);
if (error)
return (error);
- INP_LOCK_RECHECK(inp);
+ INP_WLOCK_RECHECK(inp);
if (optval > 0 && optval <= tp->t_maxseg &&
optval + 40 >= tcp_minmss)
tp->t_maxseg = optval;
else
error = EINVAL;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
break;
case TCP_INFO:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = EINVAL;
break;
default:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = ENOPROTOOPT;
break;
}
@@ -1377,38 +1377,38 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
#ifdef TCP_SIGNATURE
case TCP_MD5SIG:
optval = (tp->t_flags & TF_SIGNATURE) ? 1 : 0;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &optval, sizeof optval);
break;
#endif
case TCP_NODELAY:
optval = tp->t_flags & TF_NODELAY;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &optval, sizeof optval);
break;
case TCP_MAXSEG:
optval = tp->t_maxseg;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &optval, sizeof optval);
break;
case TCP_NOOPT:
optval = tp->t_flags & TF_NOOPT;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &optval, sizeof optval);
break;
case TCP_NOPUSH:
optval = tp->t_flags & TF_NOPUSH;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &optval, sizeof optval);
break;
case TCP_INFO:
tcp_fill_info(tp, &ti);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = sooptcopyout(sopt, &ti, sizeof ti);
break;
default:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = ENOPROTOOPT;
break;
}
@@ -1416,7 +1416,7 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
}
return (error);
}
-#undef INP_LOCK_RECHECK
+#undef INP_WLOCK_RECHECK
/*
* tcp_sendspace and tcp_recvspace are the default send and receive window
@@ -1484,7 +1484,7 @@ tcp_attach(struct socket *so)
return (ENOBUFS);
}
tp->t_state = TCPS_CLOSED;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&tcbinfo);
return (0);
}
@@ -1504,7 +1504,7 @@ tcp_disconnect(struct tcpcb *tp)
struct socket *so = inp->inp_socket;
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
/*
* Neither tcp_close() nor tcp_drop() should return NULL, as the
@@ -1542,7 +1542,7 @@ tcp_usrclosed(struct tcpcb *tp)
{
INP_INFO_WLOCK_ASSERT(&tcbinfo);
- INP_LOCK_ASSERT(tp->t_inpcb);
+ INP_WLOCK_ASSERT(tp->t_inpcb);
switch (tp->t_state) {
case TCPS_LISTEN:
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c
index d55377f..d765899 100644
--- a/sys/netinet/udp_usrreq.c
+++ b/sys/netinet/udp_usrreq.c
@@ -195,7 +195,7 @@ udp_append(struct inpcb *inp, struct ip *ip, struct mbuf *n, int off,
struct sockaddr_in6 udp_in6;
#endif
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef IPSEC
/* Check AH/ESP integrity. */
@@ -412,7 +412,7 @@ udp_input(struct mbuf *m, int off)
inp->inp_fport != uh->uh_sport)
continue;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
/*
* Handle socket delivery policy for any-source
@@ -469,7 +469,7 @@ udp_input(struct mbuf *m, int off)
}
}
if (blocked != 0) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
continue;
}
}
@@ -480,7 +480,7 @@ udp_input(struct mbuf *m, int off)
if (n != NULL)
udp_append(last, ip, n, iphlen +
sizeof(struct udphdr), &udp_in);
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
}
last = inp;
/*
@@ -507,7 +507,7 @@ udp_input(struct mbuf *m, int off)
}
udp_append(last, ip, m, iphlen + sizeof(struct udphdr),
&udp_in);
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
INP_INFO_RUNLOCK(&udbinfo);
return;
}
@@ -546,17 +546,17 @@ udp_input(struct mbuf *m, int off)
/*
* Check the minimum TTL for socket.
*/
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_ip_minttl && inp->inp_ip_minttl > ip->ip_ttl)
goto badheadlocked;
udp_append(inp, ip, m, iphlen + sizeof(struct udphdr), &udp_in);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(&udbinfo);
return;
badheadlocked:
if (inp)
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(&udbinfo);
badunlocked:
m_freem(m);
@@ -570,6 +570,8 @@ struct inpcb *
udp_notify(struct inpcb *inp, int errno)
{
+ INP_WLOCK_ASSERT(inp);
+
inp->inp_socket->so_error = errno;
sorwakeup(inp->inp_socket);
sowwakeup(inp->inp_socket);
@@ -610,11 +612,11 @@ udp_ctlinput(int cmd, struct sockaddr *sa, void *vip)
inp = in_pcblookup_hash(&udbinfo, faddr, uh->uh_dport,
ip->ip_src, uh->uh_sport, 0, NULL);
if (inp != NULL) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_socket != NULL) {
udp_notify(inp, inetctlerrmap[cmd]);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(&udbinfo);
} else
@@ -672,11 +674,11 @@ udp_pcblist(SYSCTL_HANDLER_ARGS)
INP_INFO_RLOCK(&udbinfo);
for (inp = LIST_FIRST(udbinfo.ipi_listhead), i = 0; inp && i < n;
inp = LIST_NEXT(inp, inp_list)) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt &&
cr_canseesocket(req->td->td_ucred, inp->inp_socket) == 0)
inp_list[i++] = inp;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_RUNLOCK(&udbinfo);
n = i;
@@ -684,7 +686,7 @@ udp_pcblist(SYSCTL_HANDLER_ARGS)
error = 0;
for (i = 0; i < n; i++) {
inp = inp_list[i];
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_gencnt <= gencnt) {
struct xinpcb xi;
bzero(&xi, sizeof(xi));
@@ -694,10 +696,10 @@ udp_pcblist(SYSCTL_HANDLER_ARGS)
if (inp->inp_socket)
sotoxsocket(inp->inp_socket, &xi.xi_socket);
xi.xi_inp.inp_gencnt = inp->inp_gencnt;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
error = SYSCTL_OUT(req, &xi, sizeof xi);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
if (!error) {
/*
@@ -840,7 +842,7 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
unlock_udbinfo = 1;
} else
unlock_udbinfo = 0;
- INP_LOCK(inp);
+ INP_WLOCK(inp);
#ifdef MAC
mac_inpcb_create_mbuf(inp, m);
@@ -971,11 +973,11 @@ udp_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr,
INP_INFO_WUNLOCK(&udbinfo);
error = ip_output(m, inp->inp_options, NULL, ipflags,
inp->inp_moptions, inp);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (error);
release:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
if (unlock_udbinfo)
INP_INFO_WUNLOCK(&udbinfo);
m_freem(m);
@@ -990,13 +992,13 @@ udp_abort(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("udp_abort: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_faddr.s_addr != INADDR_ANY) {
in_pcbdisconnect(inp);
inp->inp_laddr.s_addr = INADDR_ANY;
soisdisconnected(so);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
}
@@ -1022,7 +1024,7 @@ udp_attach(struct socket *so, int proto, struct thread *td)
INP_INFO_WUNLOCK(&udbinfo);
inp->inp_vflag |= INP_IPV4;
inp->inp_ip_ttl = ip_defttl;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (0);
}
@@ -1035,9 +1037,9 @@ udp_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("udp_bind: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
error = in_pcbbind(inp, nam, td->td_ucred);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (error);
}
@@ -1050,13 +1052,13 @@ udp_close(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("udp_close: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_faddr.s_addr != INADDR_ANY) {
in_pcbdisconnect(inp);
inp->inp_laddr.s_addr = INADDR_ANY;
soisdisconnected(so);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
}
@@ -1070,9 +1072,9 @@ udp_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("udp_connect: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_faddr.s_addr != INADDR_ANY) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (EISCONN);
}
@@ -1082,7 +1084,7 @@ udp_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
error = in_pcbconnect(inp, nam, td->td_ucred);
if (error == 0)
soisconnected(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (error);
}
@@ -1097,7 +1099,7 @@ udp_detach(struct socket *so)
KASSERT(inp->inp_faddr.s_addr == INADDR_ANY,
("udp_detach: not disconnected"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
in_pcbdetach(inp);
in_pcbfree(inp);
INP_INFO_WUNLOCK(&udbinfo);
@@ -1111,10 +1113,10 @@ udp_disconnect(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("udp_disconnect: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_faddr.s_addr == INADDR_ANY) {
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
- INP_UNLOCK(inp);
return (ENOTCONN);
}
@@ -1123,7 +1125,7 @@ udp_disconnect(struct socket *so)
SOCK_LOCK(so);
so->so_state &= ~SS_ISCONNECTED; /* XXX */
SOCK_UNLOCK(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (0);
}
@@ -1146,9 +1148,9 @@ udp_shutdown(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("udp_shutdown: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
socantsendmore(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (0);
}
diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c
index ea5a646..7039edd 100644
--- a/sys/netinet6/icmp6.c
+++ b/sys/netinet6/icmp6.c
@@ -1891,10 +1891,10 @@ icmp6_rip6_input(struct mbuf **mp, int off)
INP_INFO_RLOCK(&ripcbinfo);
LIST_FOREACH(in6p, &ripcb, inp_list) {
- INP_LOCK(in6p);
+ INP_WLOCK(in6p);
if ((in6p->inp_vflag & INP_IPV6) == 0) {
docontinue:
- INP_UNLOCK(in6p);
+ INP_WUNLOCK(in6p);
continue;
}
if (in6p->in6p_ip6_nxt != IPPROTO_ICMPV6)
@@ -1965,7 +1965,7 @@ icmp6_rip6_input(struct mbuf **mp, int off)
sorwakeup_locked(last->in6p_socket);
opts = NULL;
}
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
}
last = in6p;
}
@@ -2003,7 +2003,7 @@ icmp6_rip6_input(struct mbuf **mp, int off)
SOCKBUF_UNLOCK(&last->in6p_socket->so_rcv);
} else
sorwakeup_locked(last->in6p_socket);
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
} else {
m_freem(m);
ip6stat.ip6s_delivered--;
diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c
index a93b45a..9986e69 100644
--- a/sys/netinet6/in6_pcb.c
+++ b/sys/netinet6/in6_pcb.c
@@ -122,7 +122,7 @@ in6_pcbbind(register struct inpcb *inp, struct sockaddr *nam,
int wild = 0, reuseport = (so->so_options & SO_REUSEPORT);
INP_INFO_WLOCK_ASSERT(pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (!in6_ifaddr) /* XXX broken! */
return (EADDRNOTAVAIL);
@@ -288,7 +288,7 @@ in6_pcbladdr(register struct inpcb *inp, struct sockaddr *nam,
int scope_ambiguous = 0;
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (nam->sa_len != sizeof (*sin6))
return (EINVAL);
@@ -354,7 +354,7 @@ in6_pcbconnect(register struct inpcb *inp, struct sockaddr *nam,
int error;
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
/*
* Call inner routine, to assign local interface address.
@@ -396,7 +396,7 @@ in6_pcbdisconnect(struct inpcb *inp)
{
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
bzero((caddr_t)&inp->in6p_faddr, sizeof(inp->in6p_faddr));
inp->inp_fport = 0;
@@ -421,7 +421,7 @@ in6_pcbfree(struct inpcb *inp)
KASSERT(inp->inp_socket == NULL, ("in6_pcbfree: inp_socket != NULL"));
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef IPSEC
if (inp->in6p_sp != NULL)
@@ -440,7 +440,7 @@ in6_pcbfree(struct inpcb *inp)
#ifdef MAC
mac_inpcb_destroy(inp);
#endif
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
uma_zfree(ipi->ipi_zone, inp);
}
@@ -489,10 +489,10 @@ in6_getsockaddr(struct socket *so, struct sockaddr **nam)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in6_getsockaddr: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
port = inp->inp_lport;
addr = inp->in6p_laddr;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
*nam = in6_sockaddr(port, &addr);
return 0;
@@ -508,10 +508,10 @@ in6_getpeeraddr(struct socket *so, struct sockaddr **nam)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("in6_getpeeraddr: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
port = inp->inp_fport;
addr = inp->in6p_faddr;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
*nam = in6_sockaddr(port, &addr);
return 0;
@@ -611,9 +611,9 @@ in6_pcbnotify(struct inpcbinfo *pcbinfo, struct sockaddr *dst,
errno = inet6ctlerrmap[cmd];
INP_INFO_WLOCK(pcbinfo);
LIST_FOREACH_SAFE(inp, pcbinfo->ipi_listhead, inp_list, inp_temp) {
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if ((inp->inp_vflag & INP_IPV6) == 0) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
continue;
}
@@ -654,16 +654,16 @@ in6_pcbnotify(struct inpcbinfo *pcbinfo, struct sockaddr *dst,
!IN6_ARE_ADDR_EQUAL(&inp->in6p_laddr,
&sa6_src.sin6_addr)) ||
(fport && inp->inp_fport != fport)) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
continue;
}
do_notify:
if (notify) {
if ((*notify)(inp, errno))
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
} else
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
}
INP_INFO_WUNLOCK(pcbinfo);
}
@@ -765,7 +765,7 @@ in6_pcbpurgeif0(struct inpcbinfo *pcbinfo, struct ifnet *ifp)
INP_INFO_RLOCK(pcbinfo);
LIST_FOREACH(in6p, pcbinfo->ipi_listhead, inp_list) {
- INP_LOCK(in6p);
+ INP_WLOCK(in6p);
im6o = in6p->in6p_moptions;
if ((in6p->inp_vflag & INP_IPV6) &&
im6o) {
@@ -792,7 +792,7 @@ in6_pcbpurgeif0(struct inpcbinfo *pcbinfo, struct ifnet *ifp)
}
}
}
- INP_UNLOCK(in6p);
+ INP_WUNLOCK(in6p);
}
INP_INFO_RUNLOCK(pcbinfo);
}
@@ -839,7 +839,7 @@ in6_pcblookup_hash(struct inpcbinfo *pcbinfo, struct in6_addr *faddr,
u_short fport = fport_arg, lport = lport_arg;
int faith;
- INP_INFO_RLOCK_ASSERT(pcbinfo);
+ INP_INFO_LOCK_ASSERT(pcbinfo);
if (faithprefix_p != NULL)
faith = (*faithprefix_p)(laddr);
diff --git a/sys/netinet6/in6_src.c b/sys/netinet6/in6_src.c
index eeba82b..b6e2856 100644
--- a/sys/netinet6/in6_src.c
+++ b/sys/netinet6/in6_src.c
@@ -763,7 +763,7 @@ in6_pcbsetport(struct in6_addr *laddr, struct inpcb *inp, struct ucred *cred)
struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
INP_INFO_WLOCK_ASSERT(pcbinfo);
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
/* XXX: this is redundant when called from in6_pcbbind */
if ((so->so_options & (SO_REUSEADDR|SO_REUSEPORT)) == 0)
diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c
index 30fcbea..c12bde1 100644
--- a/sys/netinet6/raw_ip6.c
+++ b/sys/netinet6/raw_ip6.c
@@ -154,10 +154,10 @@ rip6_input(struct mbuf **mp, int *offp, int proto)
INP_INFO_RLOCK(&ripcbinfo);
LIST_FOREACH(in6p, &ripcb, inp_list) {
- INP_LOCK(in6p);
+ INP_WLOCK(in6p);
if ((in6p->in6p_vflag & INP_IPV6) == 0) {
docontinue:
- INP_UNLOCK(in6p);
+ INP_WUNLOCK(in6p);
continue;
}
if (in6p->in6p_ip6_nxt &&
@@ -207,7 +207,7 @@ docontinue:
sorwakeup(last->in6p_socket);
opts = NULL;
}
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
}
last = in6p;
}
@@ -220,7 +220,7 @@ docontinue:
ipsec6stat.in_polvio++;
ip6stat.ip6s_delivered--;
/* do not inject data into pcb */
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
} else
#endif /* IPSEC */
if (last) {
@@ -237,7 +237,7 @@ docontinue:
rip6stat.rip6s_fullsock++;
} else
sorwakeup(last->in6p_socket);
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
} else {
rip6stat.rip6s_nosock++;
if (m->m_flags & M_MCAST)
@@ -335,7 +335,7 @@ rip6_output(m, va_alist)
va_end(ap);
in6p = sotoin6pcb(so);
- INP_LOCK(in6p);
+ INP_WLOCK(in6p);
dst = &dstsock->sin6_addr;
if (control) {
@@ -465,7 +465,7 @@ rip6_output(m, va_alist)
ip6_clearpktopts(&opt, -1);
m_freem(control);
}
- INP_UNLOCK(in6p);
+ INP_WUNLOCK(in6p);
return (error);
}
@@ -569,7 +569,7 @@ rip6_attach(struct socket *so, int proto, struct thread *td)
inp->in6p_cksum = -1;
inp->in6p_icmp6filt = filter;
ICMP6_FILTER_SETPASSALL(inp->in6p_icmp6filt);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return 0;
}
@@ -585,7 +585,7 @@ rip6_detach(struct socket *so)
ip6_mrouter_done();
/* xxx: RSVP */
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->in6p_icmp6filt) {
FREE(inp->in6p_icmp6filt, M_PCB);
inp->in6p_icmp6filt = NULL;
@@ -656,9 +656,9 @@ rip6_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
return (EADDRNOTAVAIL);
}
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
inp->in6p_laddr = addr->sin6_addr;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return 0;
}
@@ -694,13 +694,13 @@ rip6_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
return(error);
INP_INFO_WLOCK(&ripcbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
/* Source address selection. XXX: need pcblookup? */
in6a = in6_selectsrc(addr, inp->in6p_outputopts,
inp->in6p_moptions, NULL,
&inp->in6p_laddr, &ifp, &error);
if (in6a == NULL) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return (error ? error : EADDRNOTAVAIL);
}
@@ -708,14 +708,14 @@ rip6_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
/* XXX: see above */
if (ifp && scope_ambiguous &&
(error = in6_setscope(&addr->sin6_addr, ifp, NULL)) != 0) {
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return(error);
}
inp->in6p_faddr = addr->sin6_addr;
inp->in6p_laddr = *in6a;
soisconnected(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&ripcbinfo);
return 0;
}
@@ -727,9 +727,9 @@ rip6_shutdown(struct socket *so)
inp = sotoinpcb(so);
KASSERT(inp != NULL, ("rip6_shutdown: inp == NULL"));
- INP_LOCK(inp);
+ INP_WLOCK(inp);
socantsendmore(so);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return 0;
}
diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c
index 803e32d..b019ca7 100644
--- a/sys/netinet6/udp6_usrreq.c
+++ b/sys/netinet6/udp6_usrreq.c
@@ -129,7 +129,7 @@ udp6_append(struct inpcb *inp, struct mbuf *n, int off,
struct socket *so;
struct mbuf *opts;
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
#ifdef IPSEC
/* Check AH/ESP integrity. */
@@ -277,9 +277,9 @@ udp6_input(struct mbuf **mp, int *offp, int proto)
struct mbuf *n;
if ((n = m_copy(m, 0, M_COPYALL)) != NULL) {
- INP_LOCK(last);
+ INP_WLOCK(last);
udp6_append(last, n, off, &fromsa);
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
}
}
last = inp;
@@ -306,9 +306,9 @@ udp6_input(struct mbuf **mp, int *offp, int proto)
udpstat.udps_noportmcast++;
goto badheadlocked;
}
- INP_LOCK(last);
+ INP_WLOCK(last);
udp6_append(last, m, off, &fromsa);
- INP_UNLOCK(last);
+ INP_WUNLOCK(last);
INP_INFO_RUNLOCK(&udbinfo);
return (IPPROTO_DONE);
}
@@ -343,9 +343,9 @@ udp6_input(struct mbuf **mp, int *offp, int proto)
icmp6_error(m, ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_NOPORT, 0);
return (IPPROTO_DONE);
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
udp6_append(inp, m, off, &fromsa);
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(&udbinfo);
return (IPPROTO_DONE);
@@ -453,7 +453,7 @@ udp6_getcred(SYSCTL_HANDLER_ARGS)
INP_INFO_RUNLOCK(&udbinfo);
return (ENOENT);
}
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (inp->inp_socket == NULL) {
error = ENOENT;
goto out;
@@ -463,7 +463,7 @@ udp6_getcred(SYSCTL_HANDLER_ARGS)
goto out;
cru2x(inp->inp_socket->so_cred, &xuc);
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(&udbinfo);
if (error == 0)
error = SYSCTL_OUT(req, &xuc, sizeof(struct xucred));
@@ -492,7 +492,7 @@ udp6_output(struct inpcb *inp, struct mbuf *m, struct sockaddr *addr6,
int flags;
struct sockaddr_in6 tmp;
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
if (addr6) {
/* addr6 has been validated in udp6_send(). */
@@ -708,13 +708,13 @@ udp6_abort(struct socket *so)
#endif
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) {
in6_pcbdisconnect(inp);
inp->in6p_laddr = in6addr_any;
soisdisconnected(so);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
}
@@ -752,7 +752,7 @@ udp6_attach(struct socket *so, int proto, struct thread *td)
* which may match an IPv4-mapped IPv6 address.
*/
inp->inp_ip_ttl = ip_defttl;
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
return (0);
}
@@ -766,7 +766,7 @@ udp6_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
KASSERT(inp != NULL, ("udp6_bind: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
inp->inp_vflag &= ~INP_IPV4;
inp->inp_vflag |= INP_IPV6;
if ((inp->inp_flags & IN6P_IPV6_V6ONLY) == 0) {
@@ -790,7 +790,7 @@ udp6_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
error = in6_pcbbind(inp, nam, td->td_ucred);
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (error);
}
@@ -813,13 +813,13 @@ udp6_close(struct socket *so)
}
#endif
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (!IN6_IS_ADDR_UNSPECIFIED(&inp->in6p_faddr)) {
in6_pcbdisconnect(inp);
inp->in6p_laddr = in6addr_any;
soisdisconnected(so);
}
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
}
@@ -833,7 +833,7 @@ udp6_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
KASSERT(inp != NULL, ("udp6_connect: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if ((inp->inp_flags & IN6P_IPV6_V6ONLY) == 0) {
struct sockaddr_in6 *sin6_p;
@@ -870,7 +870,7 @@ udp6_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
soisconnected(so);
}
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (error);
}
@@ -884,7 +884,7 @@ udp6_detach(struct socket *so)
KASSERT(inp != NULL, ("udp6_detach: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
in6_pcbdetach(inp);
in6_pcbfree(inp);
INP_INFO_WUNLOCK(&udbinfo);
@@ -900,7 +900,7 @@ udp6_disconnect(struct socket *so)
KASSERT(inp != NULL, ("udp6_disconnect: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
#ifdef INET
if (inp->inp_vflag & INP_IPV4) {
@@ -922,7 +922,7 @@ udp6_disconnect(struct socket *so)
/* XXXRW: so_state locking? */
so->so_state &= ~SS_ISCONNECTED; /* XXX */
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (0);
}
@@ -938,7 +938,7 @@ udp6_send(struct socket *so, int flags, struct mbuf *m,
KASSERT(inp != NULL, ("udp6_send: inp == NULL"));
INP_INFO_WLOCK(&udbinfo);
- INP_LOCK(inp);
+ INP_WLOCK(inp);
if (addr) {
if (addr->sa_len != sizeof(struct sockaddr_in6)) {
error = EINVAL;
@@ -991,12 +991,12 @@ udp6_send(struct socket *so, int flags, struct mbuf *m,
#endif
error = udp6_output(inp, m, addr, control, td);
out:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
return (error);
bad:
- INP_UNLOCK(inp);
+ INP_WUNLOCK(inp);
INP_INFO_WUNLOCK(&udbinfo);
m_freem(m);
return (error);
diff --git a/sys/security/audit/audit_arg.c b/sys/security/audit/audit_arg.c
index 309b90d..ffdfde6 100644
--- a/sys/security/audit/audit_arg.c
+++ b/sys/security/audit/audit_arg.c
@@ -649,7 +649,7 @@ audit_arg_file(struct proc *p, struct file *fp)
so->so_proto->pr_protocol;
SOCK_UNLOCK(so);
pcb = (struct inpcb *)so->so_pcb;
- INP_LOCK(pcb);
+ INP_WLOCK(pcb);
ar->k_ar.ar_arg_sockinfo.so_raddr =
pcb->inp_faddr.s_addr;
ar->k_ar.ar_arg_sockinfo.so_laddr =
@@ -658,7 +658,7 @@ audit_arg_file(struct proc *p, struct file *fp)
pcb->inp_fport;
ar->k_ar.ar_arg_sockinfo.so_lport =
pcb->inp_lport;
- INP_UNLOCK(pcb);
+ INP_WUNLOCK(pcb);
ARG_SET_VALID(ar, ARG_SOCKINFO);
}
break;
diff --git a/sys/security/mac/mac_inet.c b/sys/security/mac/mac_inet.c
index 6533cf0..0445d91 100644
--- a/sys/security/mac/mac_inet.c
+++ b/sys/security/mac/mac_inet.c
@@ -201,7 +201,7 @@ mac_inpcb_create_mbuf(struct inpcb *inp, struct mbuf *m)
{
struct label *mlabel;
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
mlabel = mac_mbuf_to_label(m);
MAC_PERFORM(inpcb_create_mbuf, inp, inp->inp_label, m, mlabel);
@@ -306,7 +306,7 @@ void
mac_inpcb_sosetlabel(struct socket *so, struct inpcb *inp)
{
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
SOCK_LOCK_ASSERT(so);
MAC_PERFORM(inpcb_sosetlabel, so, so->so_label, inp, inp->inp_label);
}
@@ -376,7 +376,7 @@ void
mac_syncache_create(struct label *label, struct inpcb *inp)
{
- INP_LOCK_ASSERT(inp);
+ INP_WLOCK_ASSERT(inp);
MAC_PERFORM(syncache_create, label, inp);
}
OpenPOWER on IntegriCloud