Date: Sun, 15 Mar 2009 09:58:31 +0000 (UTC) From: Robert Watson <rwatson@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r189848 - in head: sys/netinet sys/netinet6 usr.bin/netstat usr.bin/systat Message-ID: <200903150958.n2F9wVDt023106@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: rwatson Date: Sun Mar 15 09:58:31 2009 New Revision: 189848 URL: http://svn.freebsd.org/changeset/base/189848 Log: 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 Modified: head/sys/netinet/in_pcb.c head/sys/netinet/in_pcb.h head/sys/netinet/tcp_input.c head/sys/netinet/tcp_subr.c head/sys/netinet/tcp_timer.c head/sys/netinet/tcp_timewait.c head/sys/netinet/tcp_usrreq.c head/sys/netinet6/in6_pcb.c head/usr.bin/netstat/inet.c head/usr.bin/systat/netstat.c Modified: head/sys/netinet/in_pcb.c ============================================================================== --- head/sys/netinet/in_pcb.c Sun Mar 15 09:26:56 2009 (r189847) +++ head/sys/netinet/in_pcb.c Sun Mar 15 09:58:31 2009 (r189848) @@ -384,7 +384,7 @@ in_pcbbind_setup(struct inpcb *inp, stru * 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, stru } 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 Modified: head/sys/netinet/in_pcb.h ============================================================================== --- head/sys/netinet/in_pcb.h Sun Mar 15 09:26:56 2009 (r189847) +++ head/sys/netinet/in_pcb.h Sun Mar 15 09:58:31 2009 (r189848) @@ -384,40 +384,38 @@ void inp_4tuple_get(struct inpcb *inp, #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 */ Modified: head/sys/netinet/tcp_input.c ============================================================================== --- head/sys/netinet/tcp_input.c Sun Mar 15 09:26:56 2009 (r189847) +++ head/sys/netinet/tcp_input.c Sun Mar 15 09:58:31 2009 (r189848) @@ -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)); Modified: head/sys/netinet/tcp_subr.c ============================================================================== --- head/sys/netinet/tcp_subr.c Sun Mar 15 09:26:56 2009 (r189847) +++ head/sys/netinet/tcp_subr.c Sun Mar 15 09:58:31 2009 (r189848) @@ -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 *s 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 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); Modified: head/sys/netinet/tcp_timer.c ============================================================================== --- head/sys/netinet/tcp_timer.c Sun Mar 15 09:26:56 2009 (r189847) +++ head/sys/netinet/tcp_timer.c Sun Mar 15 09:58:31 2009 (r189848) @@ -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); Modified: head/sys/netinet/tcp_timewait.c ============================================================================== --- head/sys/netinet/tcp_timewait.c Sun Mar 15 09:26:56 2009 (r189847) +++ head/sys/netinet/tcp_timewait.c Sun Mar 15 09:58:31 2009 (r189848) @@ -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); Modified: head/sys/netinet/tcp_usrreq.c ============================================================================== --- head/sys/netinet/tcp_usrreq.c Sun Mar 15 09:26:56 2009 (r189847) +++ head/sys/netinet/tcp_usrreq.c Sun Mar 15 09:58:31 2009 (r189848) @@ -169,7 +169,7 @@ tcp_detach(struct socket *so, struct 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 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 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 s 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 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 ba 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 b 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, struc 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, stru 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 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, struc 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 flag 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 flag 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 flag 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 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 t */ #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 #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); } } Modified: head/sys/netinet6/in6_pcb.c ============================================================================== --- head/sys/netinet6/in6_pcb.c Sun Mar 15 09:26:56 2009 (r189847) +++ head/sys/netinet6/in6_pcb.c Sun Mar 15 09:58:31 2009 (r189848) @@ -197,7 +197,7 @@ in6_pcbbind(register struct inpcb *inp, &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, 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, } 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, 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) != Modified: head/usr.bin/netstat/inet.c ============================================================================== --- head/usr.bin/netstat/inet.c Sun Mar 15 09:26:56 2009 (r189847) +++ head/usr.bin/netstat/inet.c Sun Mar 15 09:58:31 2009 (r189848) @@ -257,7 +257,7 @@ pcblist_kvm(u_long off, char **bufp, int 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 Modified: head/usr.bin/systat/netstat.c ============================================================================== --- head/usr.bin/systat/netstat.c Sun Mar 15 09:26:56 2009 (r189847) +++ head/usr.bin/systat/netstat.c Sun Mar 15 09:58:31 2009 (r189848) @@ -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");
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903150958.n2F9wVDt023106>