tcp: Allow listen(2) to be called on the same socket for any number of times
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 21 Feb 2011 05:42:28 +0000 (13:42 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 21 Feb 2011 05:42:28 +0000 (13:42 +0800)
DragonFly-bug: http://bugs.dragonflybsd.org/issue1993

sys/netinet/tcp_subr.c
sys/netinet/tcp_usrreq.c
sys/netinet/tcp_var.h

index 1044fc2..c848fe3 100644 (file)
@@ -759,7 +759,7 @@ tcp_listen_detach_handler(netmsg_t msg)
        struct tcpcb *tp = nmsg->nm_tp;
        int cpu = mycpuid, nextcpu;
 
-       if (tp->t_flags & TF_SYNCACHE)
+       if (tp->t_flags & TF_LISTEN)
                syncache_destroy(tp);
 
        in_pcbremwildcardhash_oncpu(tp->t_inpcb, &tcbinfo[cpu]);
@@ -965,7 +965,7 @@ no_valid_rt:
 
        tcp_destroy_timermsg(tp);
 
-       if (tp->t_flags & TF_SYNCACHE)
+       if (tp->t_flags & TF_LISTEN)
                syncache_destroy(tp);
 
        /*
index 504fb81..a50f88c 100644 (file)
@@ -379,6 +379,10 @@ tcp_usr_listen(netmsg_t msg)
 #endif
 
        COMMON_START(so, inp, 0);
+
+       if (tp->t_flags & TF_LISTEN)
+               goto out;
+
        if (inp->inp_lport == 0) {
                error = in_pcbbind(inp, NULL, td);
                if (error)
@@ -386,7 +390,7 @@ tcp_usr_listen(netmsg_t msg)
        }
 
        tp->t_state = TCPS_LISTEN;
-       tp->t_flags |= TF_SYNCACHE;
+       tp->t_flags |= TF_LISTEN;
        tp->tt_msg = NULL; /* Catch any invalid timer usage */
 
 #ifdef SMP
@@ -432,6 +436,10 @@ tcp6_usr_listen(netmsg_t msg)
 #endif
 
        COMMON_START(so, inp, 0);
+
+       if (tp->t_flags & TF_LISTEN)
+               goto out;
+
        if (inp->inp_lport == 0) {
                if (!(inp->inp_flags & IN6P_IPV6_V6ONLY))
                        inp->inp_vflag |= INP_IPV4;
@@ -443,7 +451,7 @@ tcp6_usr_listen(netmsg_t msg)
        }
 
        tp->t_state = TCPS_LISTEN;
-       tp->t_flags |= TF_SYNCACHE;
+       tp->t_flags |= TF_LISTEN;
        tp->tt_msg = NULL; /* Catch any invalid timer usage */
 
 #ifdef SMP
index d05339c..d196eee 100644 (file)
@@ -159,7 +159,7 @@ struct tcpcb {
 #define        TF_NEEDSYN      0x00000400      /* send SYN (implicit state) */
 #define        TF_NEEDFIN      0x00000800      /* send FIN (implicit state) */
 #define        TF_NOPUSH       0x00001000      /* don't push */
-#define TF_SYNCACHE    0x00002000      /* syncache present */
+#define TF_LISTEN      0x00002000      /* listen(2) has been called */
 #define TF_SIGNATURE   0x00004000      /* require MD5 digests (RFC2385) */
 #define TF_FASTKEEP    0x00008000      /* use a faster tcp_keepidle */
 #define        TF_MORETOCOME   0x00010000      /* More data to be appended to sock */