Convert pcbinfo and inpcb mutexes to rwlocks, and modify macros to

explicitly select write locking for all use of the inpcb mutex.
Update some pcbinfo lock assertions to assert locked rather than
write-locked, although in practice almost all uses of the pcbinfo
rwlock main exclusive, and all instances of inpcb lock acquisition
are exclusive.

This change should introduce (ideally) little functional change.
However, it lays the groundwork for significantly increased
parallelism in the TCP/IP code.

MFC after:	3 months
Tested by:	kris (superset of committered patch)
This commit is contained in:
Robert Watson 2008-04-17 21:38:18 +00:00
parent f55f27f862
commit 8501a69cc9
28 changed files with 434 additions and 413 deletions

View File

@ -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;

View File

@ -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);
}

View File

@ -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 },
/*

View File

@ -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;
}

View File

@ -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

View File

@ -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))

View File

@ -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) {
/*

View File

@ -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) {

View File

@ -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;

View File

@ -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

View File

@ -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) {
/*

View File

@ -476,7 +476,7 @@ tcp_input(struct mbuf *m, int off0)
rstreason = BANDLIM_RST_CLOSEDPORT;
goto dropwithreset;
}
INP_LOCK(inp);
INP_WLOCK(inp);
#ifdef IPSEC
#ifdef INET6
@ -533,7 +533,7 @@ tcp_input(struct mbuf *m, int off0)
}
#ifdef MAC
INP_LOCK_ASSERT(inp);
INP_WLOCK_ASSERT(inp);
if (mac_inpcb_check_deliver(inp, m))
goto dropunlock;
#endif
@ -631,9 +631,9 @@ tcp_input(struct mbuf *m, int off0)
* 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 @@ tcp_input(struct mbuf *m, int off0)
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 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
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 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
}
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 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
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 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
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 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
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 @@ tcp_do_segment(struct mbuf *m, struct tcphdr *th, struct socket *so,
&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;

View File

@ -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,

View File

@ -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

View File

@ -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))

View File

@ -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);

View File

@ -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);
/*

View File

@ -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 @@ tcp_timer_keep(void *xtp)
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 @@ tcp_timer_persist(void *xtp)
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 @@ tcp_timer_rexmt(void * xtp)
PRU_SLOWTIMO);
#endif
if (tp != NULL)
INP_UNLOCK(inp);
INP_WUNLOCK(inp);
if (headlocked)
INP_INFO_WUNLOCK(&tcbinfo);
}

View File

@ -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);

View File

@ -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:

View File

@ -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);
}

View File

@ -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--;

View File

@ -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);

View File

@ -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)

View File

@ -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 @@ rip6_input(struct mbuf **mp, int *offp, int proto)
sorwakeup(last->in6p_socket);
opts = NULL;
}
INP_UNLOCK(last);
INP_WUNLOCK(last);
}
last = in6p;
}
@ -220,7 +220,7 @@ rip6_input(struct mbuf **mp, int *offp, int proto)
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 @@ rip6_input(struct mbuf **mp, int *offp, int proto)
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;
}

View File

@ -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);

View File

@ -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;

View File

@ -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);
}