Skip to content

Commit 31a1bed

Browse files
authored
Set TCP_NODELAY for TCP SSL connections. (sogou#1753)
1 parent 493d666 commit 31a1bed

2 files changed

Lines changed: 56 additions & 12 deletions

File tree

src/manager/RouteManager.cc

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
#include <sys/types.h>
2020
#include <sys/socket.h>
21+
#include <netinet/in.h>
22+
#include <netinet/tcp.h>
2123
#include <netdb.h>
2224
#include <stdlib.h>
2325
#include <stdint.h>
@@ -76,8 +78,30 @@ class RouteTargetSCTP : public RouteManager::RouteTarget
7678
#endif
7779
};
7880

81+
class RouteTargetTCP_SSL : public RouteTargetTCP
82+
{
83+
private:
84+
virtual int create_connect_fd()
85+
{
86+
const struct sockaddr *addr;
87+
socklen_t addrlen;
88+
int sockfd;
89+
90+
this->get_addr(&addr, &addrlen);
91+
sockfd = socket(addr->sa_family, SOCK_STREAM, 0);
92+
if (sockfd >= 0)
93+
{
94+
int nodelay = 1;
95+
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY,
96+
&nodelay, sizeof (int));
97+
}
98+
99+
return sockfd;
100+
}
101+
};
102+
79103
/* To support TLS SNI. */
80-
class RouteTargetTCPSNI : public RouteTargetTCP
104+
class RouteTargetTCP_TLS_SNI : public RouteTargetTCP_SSL
81105
{
82106
private:
83107
virtual int init_ssl(SSL *ssl)
@@ -92,12 +116,14 @@ class RouteTargetTCPSNI : public RouteTargetTCP
92116
std::string hostname;
93117

94118
public:
95-
RouteTargetTCPSNI(const std::string& name) : hostname(name)
119+
RouteTargetTCP_TLS_SNI(const std::string& name) : hostname(name)
96120
{
97121
}
98122
};
99123

100-
class RouteTargetSCTPSNI : public RouteTargetSCTP
124+
using RouteTargetSCTP_SSL = RouteTargetSCTP;
125+
126+
class RouteTargetSCTP_TLS_SNI : public RouteTargetSCTP_SSL
101127
{
102128
private:
103129
virtual int init_ssl(SSL *ssl)
@@ -112,7 +138,7 @@ class RouteTargetSCTPSNI : public RouteTargetSCTP
112138
std::string hostname;
113139

114140
public:
115-
RouteTargetSCTPSNI(const std::string& name) : hostname(name)
141+
RouteTargetSCTP_TLS_SNI(const std::string& name) : hostname(name)
116142
{
117143
}
118144
};
@@ -186,22 +212,26 @@ RouteResultEntry::create_target(const struct RouteParams *params,
186212

187213
switch (params->transport_type)
188214
{
189-
case TT_TCP_SSL:
190-
if (params->use_tls_sni)
191-
target = new RouteTargetTCPSNI(params->hostname);
192-
else
193215
case TT_TCP:
194-
target = new RouteTargetTCP();
216+
target = new RouteTargetTCP();
195217
break;
196218
case TT_UDP:
197219
target = new RouteTargetUDP();
198220
break;
221+
case TT_SCTP:
222+
target = new RouteTargetSCTP();
223+
break;
224+
case TT_TCP_SSL:
225+
if (params->use_tls_sni)
226+
target = new RouteTargetTCP_TLS_SNI(params->hostname);
227+
else
228+
target = new RouteTargetTCP_SSL;
229+
break;
199230
case TT_SCTP_SSL:
200231
if (params->use_tls_sni)
201-
target = new RouteTargetSCTPSNI(params->hostname);
232+
target = new RouteTargetSCTP_TLS_SNI(params->hostname);
202233
else
203-
case TT_SCTP:
204-
target = new RouteTargetSCTP();
234+
target = new RouteTargetSCTP_SSL;
205235
break;
206236
default:
207237
errno = EINVAL;

src/server/WFServer.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
#include <sys/types.h>
2121
#include <sys/socket.h>
22+
#include <netinet/in.h>
23+
#include <netinet/tcp.h>
2224
#include <errno.h>
2325
#include <unistd.h>
2426
#include <stdio.h>
@@ -181,6 +183,18 @@ WFConnection *WFServerBase::new_connection(int accept_fd)
181183
int reuse = 1;
182184
setsockopt(accept_fd, SOL_SOCKET, SO_REUSEADDR,
183185
&reuse, sizeof (int));
186+
187+
if (this->get_ssl_ctx())
188+
{
189+
if (this->params.transport_type == TT_TCP ||
190+
this->params.transport_type == TT_TCP_SSL)
191+
{
192+
int nodelay = 1;
193+
setsockopt(accept_fd, IPPROTO_TCP, TCP_NODELAY,
194+
&nodelay, sizeof (int));
195+
}
196+
}
197+
184198
return new WFServerConnection(&this->conn_count);
185199
}
186200

0 commit comments

Comments
 (0)