Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F143094962
D36488.id110359.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D36488.id110359.diff
View Options
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -800,7 +800,7 @@
return (NULL);
}
- solisten_enqueue(so, connstatus);
+ (void)solisten_enqueue(so, connstatus);
return (so);
}
@@ -808,8 +808,10 @@
/*
* Enqueue socket cloned by solisten_clone() to the listen queue of the
* listener it has been cloned from.
+ *
+ * Return 'true' if socket landed on complete queue, otherwise 'false'.
*/
-void
+bool
solisten_enqueue(struct socket *so, int connstatus)
{
struct socket *head = so->so_listen;
@@ -827,6 +829,7 @@
so->so_qstate = SQ_COMP;
head->sol_qlen++;
solisten_wakeup(head); /* unlocks */
+ return (true);
} else {
/*
* Keep removing sockets from the head until there's room for
@@ -853,6 +856,7 @@
so->so_qstate = SQ_INCOMP;
head->sol_incqlen++;
SOLISTEN_UNLOCK(head);
+ return (false);
}
}
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -2433,7 +2433,10 @@
case TCPS_SYN_RECEIVED:
TCPSTAT_INC(tcps_connects);
- soisconnected(so);
+ if (tp->t_flags & TF_INCQUEUE) {
+ tp->t_flags &= ~TF_INCQUEUE;
+ soisconnected(so);
+ }
/* Do window scaling? */
if ((tp->t_flags & (TF_RCVD_SCALE|TF_REQ_SCALE)) ==
(TF_RCVD_SCALE|TF_REQ_SCALE)) {
diff --git a/sys/netinet/tcp_syncache.c b/sys/netinet/tcp_syncache.c
--- a/sys/netinet/tcp_syncache.c
+++ b/sys/netinet/tcp_syncache.c
@@ -1039,7 +1039,8 @@
TCPSTAT_INC(tcps_accepts);
TCP_PROBE6(state__change, NULL, tp, NULL, tp, NULL, TCPS_LISTEN);
- solisten_enqueue(so, SS_ISCONNECTED);
+ if (!solisten_enqueue(so, SS_ISCONNECTED))
+ tp->t_flags |= TF_INCQUEUE;
return (so);
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -2978,8 +2978,8 @@
db_printf("%sTF_MORETOCOME", comma ? ", " : "");
comma = 1;
}
- if (t_flags & TF_LQ_OVERFLOW) {
- db_printf("%sTF_LQ_OVERFLOW", comma ? ", " : "");
+ if (t_flags & TF_INCQUEUE) {
+ db_printf("%sTF_INCQUEUE", comma ? ", " : "");
comma = 1;
}
if (t_flags & TF_LASTIDLE) {
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -515,7 +515,7 @@
#define TF_WAKESOR 0x00004000 /* wake up receive socket */
#define TF_GPUTINPROG 0x00008000 /* Goodput measurement in progress */
#define TF_MORETOCOME 0x00010000 /* More data to be appended to sock */
-#define TF_LQ_OVERFLOW 0x00020000 /* listen queue overflow */
+#define TF_INCQUEUE 0x00020000 /* on incomplete queue of listener */
#define TF_LASTIDLE 0x00040000 /* connection was previously idle */
#define TF_RXWIN0SENT 0x00080000 /* sent a receiver win 0 in response */
#define TF_FASTRECOVERY 0x00100000 /* in NewReno Fast Recovery */
diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h
--- a/sys/sys/socketvar.h
+++ b/sys/sys/socketvar.h
@@ -474,7 +474,7 @@
void solisten_proto(struct socket *so, int backlog);
void solisten_proto_abort(struct socket *so);
int solisten_proto_check(struct socket *so);
-void solisten_enqueue(struct socket *, int);
+bool solisten_enqueue(struct socket *, int);
int solisten_dequeue(struct socket *, struct socket **, int);
struct socket *
solisten_clone(struct socket *);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Jan 26, 10:36 PM (14 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28029541
Default Alt Text
D36488.id110359.diff (3 KB)
Attached To
Mode
D36488: tcp: avoid call to soisconnected() on transition to ESTABLISHED
Attached
Detach File
Event Timeline
Log In to Comment