Correct a number of evolved problems with inp_vflag and inp_flags:
certain flags that should have been in inp_flags ended up in inp_vflag, meaning that they were inconsistently locked, and in one case, interpreted. Move the following flags from inp_vflag to gaps in the inp_flags space (and clean up the inp_flags constants to make gaps more obvious to future takers): INP_TIMEWAIT INP_SOCKREF INP_ONESBCAST INP_DROPPED Some aspects of this change have no effect on kernel ABI at all, as these are UDP/TCP/IP-internal uses; however, netstat and sockstat detect INP_TIMEWAIT when listing TCP sockets, so any MFC will need to take this into account. MFC after: 1 week (or after dependencies are MFC'd) Reviewed by: bz
This commit is contained in:
parent
1723a06485
commit
ad71fe3c35
@ -384,7 +384,7 @@ in_pcbbind_setup(struct inpcb *inp, struct sockaddr *nam, in_addr_t *laddrp,
|
||||
* This entire block sorely needs a rewrite.
|
||||
*/
|
||||
if (t &&
|
||||
((t->inp_vflag & INP_TIMEWAIT) == 0) &&
|
||||
((t->inp_flags & INP_TIMEWAIT) == 0) &&
|
||||
(so->so_type != SOCK_STREAM ||
|
||||
ntohl(t->inp_faddr.s_addr) == INADDR_ANY) &&
|
||||
(ntohl(sin->sin_addr.s_addr) != INADDR_ANY ||
|
||||
@ -397,7 +397,7 @@ in_pcbbind_setup(struct inpcb *inp, struct sockaddr *nam, in_addr_t *laddrp,
|
||||
}
|
||||
t = in_pcblookup_local(pcbinfo, sin->sin_addr,
|
||||
lport, wild, cred);
|
||||
if (t && (t->inp_vflag & INP_TIMEWAIT)) {
|
||||
if (t && (t->inp_flags & INP_TIMEWAIT)) {
|
||||
/*
|
||||
* XXXRW: If an incpb has had its timewait
|
||||
* state recycled, we treat the address as
|
||||
@ -1031,7 +1031,7 @@ in_pcbdrop(struct inpcb *inp)
|
||||
INP_INFO_WLOCK_ASSERT(inp->inp_pcbinfo);
|
||||
INP_WLOCK_ASSERT(inp);
|
||||
|
||||
inp->inp_vflag |= INP_DROPPED;
|
||||
inp->inp_flags |= INP_DROPPED;
|
||||
if (inp->inp_flags & INP_INHASHLIST) {
|
||||
struct inpcbport *phd = inp->inp_phd;
|
||||
|
||||
@ -1818,6 +1818,22 @@ db_print_inpflags(int inp_flags)
|
||||
db_printf("%sIN6P_AUTOFLOWLABEL", comma ? ", " : "");
|
||||
comma = 1;
|
||||
}
|
||||
if (inp_flags & INP_TIMEWAIT) {
|
||||
db_printf("%sINP_TIMEWAIT", comma ? ", " : "");
|
||||
comma = 1;
|
||||
}
|
||||
if (inp_flags & INP_ONESBCAST) {
|
||||
db_printf("%sINP_ONESBCAST", comma ? ", " : "");
|
||||
comma = 1;
|
||||
}
|
||||
if (inp_flags & INP_DROPPED) {
|
||||
db_printf("%sINP_DROPPED", comma ? ", " : "");
|
||||
comma = 1;
|
||||
}
|
||||
if (inp_flags & INP_SOCKREF) {
|
||||
db_printf("%sINP_SOCKREF", comma ? ", " : "");
|
||||
comma = 1;
|
||||
}
|
||||
if (inp_flags & IN6P_RFC2292) {
|
||||
db_printf("%sIN6P_RFC2292", comma ? ", " : "");
|
||||
comma = 1;
|
||||
@ -1846,22 +1862,6 @@ db_print_inpvflag(u_char inp_vflag)
|
||||
db_printf("%sINP_IPV6PROTO", comma ? ", " : "");
|
||||
comma = 1;
|
||||
}
|
||||
if (inp_vflag & INP_TIMEWAIT) {
|
||||
db_printf("%sINP_TIMEWAIT", comma ? ", " : "");
|
||||
comma = 1;
|
||||
}
|
||||
if (inp_vflag & INP_ONESBCAST) {
|
||||
db_printf("%sINP_ONESBCAST", comma ? ", " : "");
|
||||
comma = 1;
|
||||
}
|
||||
if (inp_vflag & INP_DROPPED) {
|
||||
db_printf("%sINP_DROPPED", comma ? ", " : "");
|
||||
comma = 1;
|
||||
}
|
||||
if (inp_vflag & INP_SOCKREF) {
|
||||
db_printf("%sINP_SOCKREF", comma ? ", " : "");
|
||||
comma = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -384,40 +384,38 @@ void inp_4tuple_get(struct inpcb *inp, uint32_t *laddr, uint16_t *lp,
|
||||
#define INP_IPV4 0x1
|
||||
#define INP_IPV6 0x2
|
||||
#define INP_IPV6PROTO 0x4 /* opened under IPv6 protocol */
|
||||
#define INP_TIMEWAIT 0x8 /* inpcb in TIMEWAIT, ppcb is tcptw */
|
||||
#define INP_ONESBCAST 0x10 /* send all-ones broadcast */
|
||||
#define INP_DROPPED 0x20 /* protocol drop flag */
|
||||
#define INP_SOCKREF 0x40 /* strong socket reference */
|
||||
|
||||
/*
|
||||
* Flags for inp_flag.
|
||||
*/
|
||||
#define INP_RECVOPTS 0x01 /* receive incoming IP options */
|
||||
#define INP_RECVRETOPTS 0x02 /* receive IP options for reply */
|
||||
#define INP_RECVDSTADDR 0x04 /* receive IP dst address */
|
||||
#define INP_HDRINCL 0x08 /* user supplies entire IP header */
|
||||
#define INP_HIGHPORT 0x10 /* user wants "high" port binding */
|
||||
#define INP_LOWPORT 0x20 /* user wants "low" port binding */
|
||||
#define INP_ANONPORT 0x40 /* port chosen for user */
|
||||
#define INP_RECVIF 0x80 /* receive incoming interface */
|
||||
#define INP_MTUDISC 0x100 /* user can do MTU discovery */
|
||||
#define INP_FAITH 0x200 /* accept FAITH'ed connections */
|
||||
#define INP_RECVTTL 0x400 /* receive incoming IP TTL */
|
||||
#define INP_DONTFRAG 0x800 /* don't fragment packet */
|
||||
#define INP_NONLOCALOK 0x1000 /* Allow bind to spoof any address */
|
||||
#define INP_RECVOPTS 0x00000001 /* receive incoming IP options */
|
||||
#define INP_RECVRETOPTS 0x00000002 /* receive IP options for reply */
|
||||
#define INP_RECVDSTADDR 0x00000004 /* receive IP dst address */
|
||||
#define INP_HDRINCL 0x00000008 /* user supplies entire IP header */
|
||||
#define INP_HIGHPORT 0x00000010 /* user wants "high" port binding */
|
||||
#define INP_LOWPORT 0x00000020 /* user wants "low" port binding */
|
||||
#define INP_ANONPORT 0x00000040 /* port chosen for user */
|
||||
#define INP_RECVIF 0x00000080 /* receive incoming interface */
|
||||
#define INP_MTUDISC 0x00000100 /* user can do MTU discovery */
|
||||
#define INP_FAITH 0x00000200 /* accept FAITH'ed connections */
|
||||
#define INP_RECVTTL 0x00000400 /* receive incoming IP TTL */
|
||||
#define INP_DONTFRAG 0x00000800 /* don't fragment packet */
|
||||
#define INP_NONLOCALOK 0x00001000 /* Allow bind to spoof any address */
|
||||
/* - requires options IP_NONLOCALBIND */
|
||||
#define INP_INHASHLIST 0x2000 /* in_pcbinshash() has been called */
|
||||
|
||||
#define IN6P_IPV6_V6ONLY 0x008000 /* restrict AF_INET6 socket for v6 */
|
||||
|
||||
#define IN6P_PKTINFO 0x010000 /* receive IP6 dst and I/F */
|
||||
#define IN6P_HOPLIMIT 0x020000 /* receive hoplimit */
|
||||
#define IN6P_HOPOPTS 0x040000 /* receive hop-by-hop options */
|
||||
#define IN6P_DSTOPTS 0x080000 /* receive dst options after rthdr */
|
||||
#define IN6P_RTHDR 0x100000 /* receive routing header */
|
||||
#define IN6P_RTHDRDSTOPTS 0x200000 /* receive dstoptions before rthdr */
|
||||
#define IN6P_TCLASS 0x400000 /* receive traffic class value */
|
||||
#define IN6P_AUTOFLOWLABEL 0x800000 /* attach flowlabel automatically */
|
||||
#define INP_INHASHLIST 0x00002000 /* in_pcbinshash() has been called */
|
||||
#define IN6P_IPV6_V6ONLY 0x00008000 /* restrict AF_INET6 socket for v6 */
|
||||
#define IN6P_PKTINFO 0x00010000 /* receive IP6 dst and I/F */
|
||||
#define IN6P_HOPLIMIT 0x00020000 /* receive hoplimit */
|
||||
#define IN6P_HOPOPTS 0x00040000 /* receive hop-by-hop options */
|
||||
#define IN6P_DSTOPTS 0x00080000 /* receive dst options after rthdr */
|
||||
#define IN6P_RTHDR 0x00100000 /* receive routing header */
|
||||
#define IN6P_RTHDRDSTOPTS 0x00200000 /* receive dstoptions before rthdr */
|
||||
#define IN6P_TCLASS 0x00400000 /* receive traffic class value */
|
||||
#define IN6P_AUTOFLOWLABEL 0x00800000 /* attach flowlabel automatically */
|
||||
#define INP_TIMEWAIT 0x01000000 /* in TIMEWAIT, ppcb is tcptw */
|
||||
#define INP_ONESBCAST 0x02000000 /* send all-ones broadcast */
|
||||
#define INP_DROPPED 0x04000000 /* protocol drop flag */
|
||||
#define INP_SOCKREF 0x08000000 /* strong socket reference */
|
||||
#define IN6P_RFC2292 0x40000000 /* used RFC2292 API on the socket */
|
||||
#define IN6P_MTU 0x80000000 /* receive path MTU */
|
||||
|
||||
|
@ -635,7 +635,7 @@ findpcb:
|
||||
* tried to free the inpcb, in which case we need to loop back and
|
||||
* try to find a new inpcb to deliver to.
|
||||
*/
|
||||
if (inp->inp_vflag & INP_TIMEWAIT) {
|
||||
if (inp->inp_flags & INP_TIMEWAIT) {
|
||||
KASSERT(ti_locked == TI_RLOCKED || ti_locked == TI_WLOCKED,
|
||||
("%s: INP_TIMEWAIT ti_locked %d", __func__, ti_locked));
|
||||
|
||||
|
@ -881,10 +881,10 @@ tcp_close(struct tcpcb *tp)
|
||||
KASSERT(inp->inp_socket != NULL, ("tcp_close: inp_socket NULL"));
|
||||
so = inp->inp_socket;
|
||||
soisdisconnected(so);
|
||||
if (inp->inp_vflag & INP_SOCKREF) {
|
||||
if (inp->inp_flags & INP_SOCKREF) {
|
||||
KASSERT(so->so_state & SS_PROTOREF,
|
||||
("tcp_close: !SS_PROTOREF"));
|
||||
inp->inp_vflag &= ~INP_SOCKREF;
|
||||
inp->inp_flags &= ~INP_SOCKREF;
|
||||
INP_WUNLOCK(inp);
|
||||
ACCEPT_LOCK();
|
||||
SOCK_LOCK(so);
|
||||
@ -921,7 +921,7 @@ tcp_drain(void)
|
||||
*/
|
||||
INP_INFO_RLOCK(&V_tcbinfo);
|
||||
LIST_FOREACH(inpb, V_tcbinfo.ipi_listhead, inp_list) {
|
||||
if (inpb->inp_vflag & INP_TIMEWAIT)
|
||||
if (inpb->inp_flags & INP_TIMEWAIT)
|
||||
continue;
|
||||
INP_WLOCK(inpb);
|
||||
if ((tcpb = intotcpcb(inpb)) != NULL) {
|
||||
@ -962,8 +962,8 @@ tcp_notify(struct inpcb *inp, int error)
|
||||
INP_INFO_WLOCK_ASSERT(&V_tcbinfo);
|
||||
INP_WLOCK_ASSERT(inp);
|
||||
|
||||
if ((inp->inp_vflag & INP_TIMEWAIT) ||
|
||||
(inp->inp_vflag & INP_DROPPED))
|
||||
if ((inp->inp_flags & INP_TIMEWAIT) ||
|
||||
(inp->inp_flags & INP_DROPPED))
|
||||
return (inp);
|
||||
|
||||
tp = intotcpcb(inp);
|
||||
@ -1063,7 +1063,7 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
|
||||
* TCP state changes, is not quite right, but for
|
||||
* now, better than nothing.
|
||||
*/
|
||||
if (inp->inp_vflag & INP_TIMEWAIT) {
|
||||
if (inp->inp_flags & INP_TIMEWAIT) {
|
||||
if (intotw(inp) != NULL)
|
||||
error = cr_cansee(req->td->td_ucred,
|
||||
intotw(inp)->tw_cred);
|
||||
@ -1094,7 +1094,7 @@ tcp_pcblist(SYSCTL_HANDLER_ARGS)
|
||||
inp_ppcb = inp->inp_ppcb;
|
||||
if (inp_ppcb == NULL)
|
||||
bzero((char *) &xt.xt_tp, sizeof xt.xt_tp);
|
||||
else if (inp->inp_vflag & INP_TIMEWAIT) {
|
||||
else if (inp->inp_flags & INP_TIMEWAIT) {
|
||||
bzero((char *) &xt.xt_tp, sizeof xt.xt_tp);
|
||||
xt.xt_tp.t_state = TCPS_TIME_WAIT;
|
||||
} else
|
||||
@ -1293,8 +1293,8 @@ tcp_ctlinput(int cmd, struct sockaddr *sa, void *vip)
|
||||
ip->ip_src, th->th_sport, 0, NULL);
|
||||
if (inp != NULL) {
|
||||
INP_WLOCK(inp);
|
||||
if (!(inp->inp_vflag & INP_TIMEWAIT) &&
|
||||
!(inp->inp_vflag & INP_DROPPED) &&
|
||||
if (!(inp->inp_flags & INP_TIMEWAIT) &&
|
||||
!(inp->inp_flags & INP_DROPPED) &&
|
||||
!(inp->inp_socket == NULL)) {
|
||||
icmp_tcp_seq = htonl(th->th_seq);
|
||||
tp = intotcpcb(inp);
|
||||
@ -1581,8 +1581,8 @@ tcp_drop_syn_sent(struct inpcb *inp, int errno)
|
||||
INP_INFO_WLOCK_ASSERT(&V_tcbinfo);
|
||||
INP_WLOCK_ASSERT(inp);
|
||||
|
||||
if ((inp->inp_vflag & INP_TIMEWAIT) ||
|
||||
(inp->inp_vflag & INP_DROPPED))
|
||||
if ((inp->inp_flags & INP_TIMEWAIT) ||
|
||||
(inp->inp_flags & INP_DROPPED))
|
||||
return (inp);
|
||||
|
||||
tp = intotcpcb(inp);
|
||||
@ -1610,8 +1610,8 @@ tcp_mtudisc(struct inpcb *inp, int errno)
|
||||
struct socket *so;
|
||||
|
||||
INP_WLOCK_ASSERT(inp);
|
||||
if ((inp->inp_vflag & INP_TIMEWAIT) ||
|
||||
(inp->inp_vflag & INP_DROPPED))
|
||||
if ((inp->inp_flags & INP_TIMEWAIT) ||
|
||||
(inp->inp_flags & INP_DROPPED))
|
||||
return (inp);
|
||||
|
||||
tp = intotcpcb(inp);
|
||||
@ -2185,7 +2185,7 @@ sysctl_drop(SYSCTL_HANDLER_ARGS)
|
||||
}
|
||||
if (inp != NULL) {
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & INP_TIMEWAIT) {
|
||||
if (inp->inp_flags & INP_TIMEWAIT) {
|
||||
/*
|
||||
* XXXRW: There currently exists a state where an
|
||||
* inpcb is present, but its timewait state has been
|
||||
@ -2197,7 +2197,7 @@ sysctl_drop(SYSCTL_HANDLER_ARGS)
|
||||
tcp_twclose(tw, 0);
|
||||
else
|
||||
INP_WUNLOCK(inp);
|
||||
} else if (!(inp->inp_vflag & INP_DROPPED) &&
|
||||
} else if (!(inp->inp_flags & INP_DROPPED) &&
|
||||
!(inp->inp_socket->so_options & SO_ACCEPTCONN)) {
|
||||
tp = intotcpcb(inp);
|
||||
tp = tcp_drop(tp, ECONNABORTED);
|
||||
|
@ -182,7 +182,7 @@ tcp_timer_delack(void *xtp)
|
||||
}
|
||||
INP_WLOCK(inp);
|
||||
INP_INFO_RUNLOCK(&V_tcbinfo);
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_delack)
|
||||
if ((inp->inp_flags & INP_DROPPED) || callout_pending(&tp->t_timers->tt_delack)
|
||||
|| !callout_active(&tp->t_timers->tt_delack)) {
|
||||
INP_WUNLOCK(inp);
|
||||
CURVNET_RESTORE();
|
||||
@ -229,7 +229,7 @@ tcp_timer_2msl(void *xtp)
|
||||
}
|
||||
INP_WLOCK(inp);
|
||||
tcp_free_sackholes(tp);
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_2msl) ||
|
||||
if ((inp->inp_flags & INP_DROPPED) || callout_pending(&tp->t_timers->tt_2msl) ||
|
||||
!callout_active(&tp->t_timers->tt_2msl)) {
|
||||
INP_WUNLOCK(tp->t_inpcb);
|
||||
INP_INFO_WUNLOCK(&V_tcbinfo);
|
||||
@ -301,7 +301,7 @@ tcp_timer_keep(void *xtp)
|
||||
return;
|
||||
}
|
||||
INP_WLOCK(inp);
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_keep)
|
||||
if ((inp->inp_flags & INP_DROPPED) || callout_pending(&tp->t_timers->tt_keep)
|
||||
|| !callout_active(&tp->t_timers->tt_keep)) {
|
||||
INP_WUNLOCK(inp);
|
||||
INP_INFO_WUNLOCK(&V_tcbinfo);
|
||||
@ -397,7 +397,7 @@ tcp_timer_persist(void *xtp)
|
||||
return;
|
||||
}
|
||||
INP_WLOCK(inp);
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_persist)
|
||||
if ((inp->inp_flags & INP_DROPPED) || callout_pending(&tp->t_timers->tt_persist)
|
||||
|| !callout_active(&tp->t_timers->tt_persist)) {
|
||||
INP_WUNLOCK(inp);
|
||||
INP_INFO_WUNLOCK(&V_tcbinfo);
|
||||
@ -471,7 +471,7 @@ tcp_timer_rexmt(void * xtp)
|
||||
return;
|
||||
}
|
||||
INP_WLOCK(inp);
|
||||
if ((inp->inp_vflag & INP_DROPPED) || callout_pending(&tp->t_timers->tt_rexmt)
|
||||
if ((inp->inp_flags & INP_DROPPED) || callout_pending(&tp->t_timers->tt_rexmt)
|
||||
|| !callout_active(&tp->t_timers->tt_rexmt)) {
|
||||
INP_WUNLOCK(inp);
|
||||
INP_INFO_WUNLOCK(&V_tcbinfo);
|
||||
|
@ -265,17 +265,17 @@ tcp_twstart(struct tcpcb *tp)
|
||||
if (acknow)
|
||||
tcp_twrespond(tw, TH_ACK);
|
||||
inp->inp_ppcb = tw;
|
||||
inp->inp_vflag |= INP_TIMEWAIT;
|
||||
inp->inp_flags |= INP_TIMEWAIT;
|
||||
tcp_tw_2msl_reset(tw, 0);
|
||||
|
||||
/*
|
||||
* If the inpcb owns the sole reference to the socket, then we can
|
||||
* detach and free the socket as it is not needed in time wait.
|
||||
*/
|
||||
if (inp->inp_vflag & INP_SOCKREF) {
|
||||
if (inp->inp_flags & INP_SOCKREF) {
|
||||
KASSERT(so->so_state & SS_PROTOREF,
|
||||
("tcp_twstart: !SS_PROTOREF"));
|
||||
inp->inp_vflag &= ~INP_SOCKREF;
|
||||
inp->inp_flags &= ~INP_SOCKREF;
|
||||
INP_WUNLOCK(inp);
|
||||
ACCEPT_LOCK();
|
||||
SOCK_LOCK(so);
|
||||
@ -435,7 +435,7 @@ tcp_twclose(struct tcptw *tw, int reuse)
|
||||
* notify the socket layer.
|
||||
*/
|
||||
inp = tw->tw_inpcb;
|
||||
KASSERT((inp->inp_vflag & INP_TIMEWAIT), ("tcp_twclose: !timewait"));
|
||||
KASSERT((inp->inp_flags & INP_TIMEWAIT), ("tcp_twclose: !timewait"));
|
||||
KASSERT(intotw(inp) == tw, ("tcp_twclose: inp_ppcb != tw"));
|
||||
INP_INFO_WLOCK_ASSERT(&V_tcbinfo); /* tcp_tw_2msl_stop(). */
|
||||
INP_WLOCK_ASSERT(inp);
|
||||
@ -453,8 +453,8 @@ tcp_twclose(struct tcptw *tw, int reuse)
|
||||
* in which case another reference exists (XXXRW: think
|
||||
* about this more), and we don't need to take action.
|
||||
*/
|
||||
if (inp->inp_vflag & INP_SOCKREF) {
|
||||
inp->inp_vflag &= ~INP_SOCKREF;
|
||||
if (inp->inp_flags & INP_SOCKREF) {
|
||||
inp->inp_flags &= ~INP_SOCKREF;
|
||||
INP_WUNLOCK(inp);
|
||||
ACCEPT_LOCK();
|
||||
SOCK_LOCK(so);
|
||||
|
@ -169,7 +169,7 @@ tcp_detach(struct socket *so, struct inpcb *inp)
|
||||
|
||||
tp = intotcpcb(inp);
|
||||
|
||||
if (inp->inp_vflag & INP_TIMEWAIT) {
|
||||
if (inp->inp_flags & INP_TIMEWAIT) {
|
||||
/*
|
||||
* There are two cases to handle: one in which the time wait
|
||||
* state is being discarded (INP_DROPPED), and one in which
|
||||
@ -182,7 +182,7 @@ tcp_detach(struct socket *so, struct inpcb *inp)
|
||||
*
|
||||
* XXXRW: Would it be cleaner to free the tcptw here?
|
||||
*/
|
||||
if (inp->inp_vflag & INP_DROPPED) {
|
||||
if (inp->inp_flags & INP_DROPPED) {
|
||||
KASSERT(tp == NULL, ("tcp_detach: INP_TIMEWAIT && "
|
||||
"INP_DROPPED && tp != NULL"));
|
||||
in_pcbdetach(inp);
|
||||
@ -201,7 +201,7 @@ tcp_detach(struct socket *so, struct inpcb *inp)
|
||||
*
|
||||
* XXXRW: Does the second case still occur?
|
||||
*/
|
||||
if (inp->inp_vflag & INP_DROPPED ||
|
||||
if (inp->inp_flags & INP_DROPPED ||
|
||||
tp->t_state < TCPS_SYN_SENT) {
|
||||
tcp_discardcb(tp);
|
||||
in_pcbdetach(inp);
|
||||
@ -262,7 +262,7 @@ tcp_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
|
||||
inp = sotoinpcb(so);
|
||||
KASSERT(inp != NULL, ("tcp_usr_bind: inp == NULL"));
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
error = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@ -303,7 +303,7 @@ tcp6_usr_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
|
||||
inp = sotoinpcb(so);
|
||||
KASSERT(inp != NULL, ("tcp6_usr_bind: inp == NULL"));
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
error = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@ -350,7 +350,7 @@ tcp_usr_listen(struct socket *so, int backlog, struct thread *td)
|
||||
inp = sotoinpcb(so);
|
||||
KASSERT(inp != NULL, ("tcp_usr_listen: inp == NULL"));
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
error = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@ -388,7 +388,7 @@ tcp6_usr_listen(struct socket *so, int backlog, struct thread *td)
|
||||
inp = sotoinpcb(so);
|
||||
KASSERT(inp != NULL, ("tcp6_usr_listen: inp == NULL"));
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
error = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@ -449,7 +449,7 @@ tcp_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
|
||||
inp = sotoinpcb(so);
|
||||
KASSERT(inp != NULL, ("tcp_usr_connect: inp == NULL"));
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
error = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@ -491,7 +491,7 @@ tcp6_usr_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
|
||||
inp = sotoinpcb(so);
|
||||
KASSERT(inp != NULL, ("tcp6_usr_connect: inp == NULL"));
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
error = EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@ -557,7 +557,7 @@ tcp_usr_disconnect(struct socket *so)
|
||||
inp = sotoinpcb(so);
|
||||
KASSERT(inp != NULL, ("tcp_usr_disconnect: inp == NULL"));
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
error = ECONNRESET;
|
||||
goto out;
|
||||
}
|
||||
@ -594,7 +594,7 @@ tcp_usr_accept(struct socket *so, struct sockaddr **nam)
|
||||
KASSERT(inp != NULL, ("tcp_usr_accept: inp == NULL"));
|
||||
INP_INFO_RLOCK(&V_tcbinfo);
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
error = ECONNABORTED;
|
||||
goto out;
|
||||
}
|
||||
@ -637,7 +637,7 @@ tcp6_usr_accept(struct socket *so, struct sockaddr **nam)
|
||||
inp = sotoinpcb(so);
|
||||
KASSERT(inp != NULL, ("tcp6_usr_accept: inp == NULL"));
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
error = ECONNABORTED;
|
||||
goto out;
|
||||
}
|
||||
@ -687,7 +687,7 @@ tcp_usr_shutdown(struct socket *so)
|
||||
inp = sotoinpcb(so);
|
||||
KASSERT(inp != NULL, ("inp == NULL"));
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
error = ECONNRESET;
|
||||
goto out;
|
||||
}
|
||||
@ -695,7 +695,7 @@ tcp_usr_shutdown(struct socket *so)
|
||||
TCPDEBUG1();
|
||||
socantsendmore(so);
|
||||
tcp_usrclosed(tp);
|
||||
if (!(inp->inp_vflag & INP_DROPPED))
|
||||
if (!(inp->inp_flags & INP_DROPPED))
|
||||
error = tcp_output_disconnect(tp);
|
||||
|
||||
out:
|
||||
@ -720,7 +720,7 @@ tcp_usr_rcvd(struct socket *so, int flags)
|
||||
inp = sotoinpcb(so);
|
||||
KASSERT(inp != NULL, ("tcp_usr_rcvd: inp == NULL"));
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
error = ECONNRESET;
|
||||
goto out;
|
||||
}
|
||||
@ -771,7 +771,7 @@ tcp_usr_send(struct socket *so, int flags, struct mbuf *m,
|
||||
inp = sotoinpcb(so);
|
||||
KASSERT(inp != NULL, ("tcp_usr_send: inp == NULL"));
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (control)
|
||||
m_freem(control);
|
||||
if (m)
|
||||
@ -829,7 +829,7 @@ tcp_usr_send(struct socket *so, int flags, struct mbuf *m,
|
||||
INP_INFO_WUNLOCK(&V_tcbinfo);
|
||||
headlocked = 0;
|
||||
}
|
||||
if (!(inp->inp_vflag & INP_DROPPED)) {
|
||||
if (!(inp->inp_flags & INP_DROPPED)) {
|
||||
if (flags & PRUS_MORETOCOME)
|
||||
tp->t_flags |= TF_MORETOCOME;
|
||||
error = tcp_output_send(tp);
|
||||
@ -917,18 +917,18 @@ tcp_usr_abort(struct socket *so)
|
||||
/*
|
||||
* If we still have full TCP state, and we're not dropped, drop.
|
||||
*/
|
||||
if (!(inp->inp_vflag & INP_TIMEWAIT) &&
|
||||
!(inp->inp_vflag & INP_DROPPED)) {
|
||||
if (!(inp->inp_flags & INP_TIMEWAIT) &&
|
||||
!(inp->inp_flags & INP_DROPPED)) {
|
||||
tp = intotcpcb(inp);
|
||||
TCPDEBUG1();
|
||||
tcp_drop(tp, ECONNABORTED);
|
||||
TCPDEBUG2(PRU_ABORT);
|
||||
}
|
||||
if (!(inp->inp_vflag & INP_DROPPED)) {
|
||||
if (!(inp->inp_flags & INP_DROPPED)) {
|
||||
SOCK_LOCK(so);
|
||||
so->so_state |= SS_PROTOREF;
|
||||
SOCK_UNLOCK(so);
|
||||
inp->inp_vflag |= INP_SOCKREF;
|
||||
inp->inp_flags |= INP_SOCKREF;
|
||||
}
|
||||
INP_WUNLOCK(inp);
|
||||
INP_INFO_WUNLOCK(&V_tcbinfo);
|
||||
@ -957,18 +957,18 @@ tcp_usr_close(struct socket *so)
|
||||
* If we still have full TCP state, and we're not dropped, initiate
|
||||
* a disconnect.
|
||||
*/
|
||||
if (!(inp->inp_vflag & INP_TIMEWAIT) &&
|
||||
!(inp->inp_vflag & INP_DROPPED)) {
|
||||
if (!(inp->inp_flags & INP_TIMEWAIT) &&
|
||||
!(inp->inp_flags & INP_DROPPED)) {
|
||||
tp = intotcpcb(inp);
|
||||
TCPDEBUG1();
|
||||
tcp_disconnect(tp);
|
||||
TCPDEBUG2(PRU_CLOSE);
|
||||
}
|
||||
if (!(inp->inp_vflag & INP_DROPPED)) {
|
||||
if (!(inp->inp_flags & INP_DROPPED)) {
|
||||
SOCK_LOCK(so);
|
||||
so->so_state |= SS_PROTOREF;
|
||||
SOCK_UNLOCK(so);
|
||||
inp->inp_vflag |= INP_SOCKREF;
|
||||
inp->inp_flags |= INP_SOCKREF;
|
||||
}
|
||||
INP_WUNLOCK(inp);
|
||||
INP_INFO_WUNLOCK(&V_tcbinfo);
|
||||
@ -988,7 +988,7 @@ tcp_usr_rcvoob(struct socket *so, struct mbuf *m, int flags)
|
||||
inp = sotoinpcb(so);
|
||||
KASSERT(inp != NULL, ("tcp_usr_rcvoob: inp == NULL"));
|
||||
INP_WLOCK(inp);
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
error = ECONNRESET;
|
||||
goto out;
|
||||
}
|
||||
@ -1241,7 +1241,7 @@ tcp_fill_info(struct tcpcb *tp, struct tcp_info *ti)
|
||||
*/
|
||||
#define INP_WLOCK_RECHECK(inp) do { \
|
||||
INP_WLOCK(inp); \
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) { \
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) { \
|
||||
INP_WUNLOCK(inp); \
|
||||
return (ECONNRESET); \
|
||||
} \
|
||||
@ -1275,7 +1275,7 @@ tcp_ctloutput(struct socket *so, struct sockopt *sopt)
|
||||
#endif
|
||||
return (error);
|
||||
}
|
||||
if (inp->inp_vflag & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
if (inp->inp_flags & (INP_TIMEWAIT | INP_DROPPED)) {
|
||||
INP_WUNLOCK(inp);
|
||||
return (ECONNRESET);
|
||||
}
|
||||
@ -1515,7 +1515,7 @@ tcp_disconnect(struct tcpcb *tp)
|
||||
soisdisconnecting(so);
|
||||
sbflush(&so->so_rcv);
|
||||
tcp_usrclosed(tp);
|
||||
if (!(inp->inp_vflag & INP_DROPPED))
|
||||
if (!(inp->inp_flags & INP_DROPPED))
|
||||
tcp_output_disconnect(tp);
|
||||
}
|
||||
}
|
||||
|
@ -197,7 +197,7 @@ in6_pcbbind(register struct inpcb *inp, struct sockaddr *nam,
|
||||
&sin6->sin6_addr, lport,
|
||||
INPLOOKUP_WILDCARD, cred);
|
||||
if (t &&
|
||||
((t->inp_vflag & INP_TIMEWAIT) == 0) &&
|
||||
((t->inp_flags & INP_TIMEWAIT) == 0) &&
|
||||
(so->so_type != SOCK_STREAM ||
|
||||
IN6_IS_ADDR_UNSPECIFIED(&t->in6p_faddr)) &&
|
||||
(!IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr) ||
|
||||
@ -215,7 +215,7 @@ in6_pcbbind(register struct inpcb *inp, struct sockaddr *nam,
|
||||
sin.sin_addr, lport,
|
||||
INPLOOKUP_WILDCARD, cred);
|
||||
if (t &&
|
||||
((t->inp_vflag &
|
||||
((t->inp_flags &
|
||||
INP_TIMEWAIT) == 0) &&
|
||||
(so->so_type != SOCK_STREAM ||
|
||||
ntohl(t->inp_faddr.s_addr) ==
|
||||
@ -227,7 +227,7 @@ in6_pcbbind(register struct inpcb *inp, struct sockaddr *nam,
|
||||
}
|
||||
t = in6_pcblookup_local(pcbinfo, &sin6->sin6_addr,
|
||||
lport, wild, cred);
|
||||
if (t && (reuseport & ((t->inp_vflag & INP_TIMEWAIT) ?
|
||||
if (t && (reuseport & ((t->inp_flags & INP_TIMEWAIT) ?
|
||||
intotw(t)->tw_so_options :
|
||||
t->inp_socket->so_options)) == 0)
|
||||
return (EADDRINUSE);
|
||||
@ -238,7 +238,7 @@ in6_pcbbind(register struct inpcb *inp, struct sockaddr *nam,
|
||||
in6_sin6_2_sin(&sin, sin6);
|
||||
t = in_pcblookup_local(pcbinfo, sin.sin_addr,
|
||||
lport, wild, cred);
|
||||
if (t && t->inp_vflag & INP_TIMEWAIT) {
|
||||
if (t && t->inp_flags & INP_TIMEWAIT) {
|
||||
if ((reuseport &
|
||||
intotw(t)->tw_so_options) == 0 &&
|
||||
(ntohl(t->inp_laddr.s_addr) !=
|
||||
|
@ -257,7 +257,7 @@ pcblist_kvm(u_long off, char **bufp, int istcp)
|
||||
if (istcp) {
|
||||
if (inp->inp_ppcb == NULL)
|
||||
bzero(&xt.xt_tp, sizeof xt.xt_tp);
|
||||
else if (inp->inp_vflag & INP_TIMEWAIT) {
|
||||
else if (inp->inp_flags & INP_TIMEWAIT) {
|
||||
bzero(&xt.xt_tp, sizeof xt.xt_tp);
|
||||
xt.xt_tp.t_state = TCPS_TIME_WAIT;
|
||||
} else
|
||||
|
@ -222,7 +222,7 @@ again:
|
||||
if (nports && !checkport(&inpcb))
|
||||
continue;
|
||||
if (istcp) {
|
||||
if (inpcb.inp_vflag & INP_TIMEWAIT) {
|
||||
if (inpcb.inp_flags & INP_TIMEWAIT) {
|
||||
bzero(&sockb, sizeof(sockb));
|
||||
enter_kvm(&inpcb, &sockb, TCPS_TIME_WAIT,
|
||||
"tcp");
|
||||
|
Loading…
x
Reference in New Issue
Block a user