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{
82106private:
83107 virtual int init_ssl (SSL *ssl)
@@ -92,12 +116,14 @@ class RouteTargetTCPSNI : public RouteTargetTCP
92116 std::string hostname;
93117
94118public:
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{
102128private:
103129 virtual int init_ssl (SSL *ssl)
@@ -112,7 +138,7 @@ class RouteTargetSCTPSNI : public RouteTargetSCTP
112138 std::string hostname;
113139
114140public:
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;
0 commit comments