17
17
#include <unistd.h> /* close */
18
18
#include <poll.h> /* poll */
19
19
#include <sys/socket.h> /* socket */
20
- #include <netinet/in.h> /* IPPROTO_TCP */
20
+ #include <netinet/in.h>
21
21
22
22
static void
23
23
fd_bundle_client_reset ( fd_bundle_tile_t * ctx ) {
@@ -58,10 +58,11 @@ fd_bundle_client_reset( fd_bundle_tile_t * ctx ) {
58
58
}
59
59
60
60
static int
61
- fd_bundle_client_do_connect ( fd_bundle_tile_t const * ctx ) {
61
+ fd_bundle_client_do_connect ( fd_bundle_tile_t const * ctx ,
62
+ uint ip4_addr ) {
62
63
struct sockaddr_in addr = {
63
64
.sin_family = AF_INET ,
64
- .sin_addr .s_addr = ctx -> server_ip4_addr ,
65
+ .sin_addr .s_addr = ip4_addr ,
65
66
.sin_port = fd_ushort_bswap ( ctx -> server_tcp_port )
66
67
};
67
68
errno = 0 ;
@@ -76,9 +77,24 @@ static void
76
77
fd_bundle_client_create_conn ( fd_bundle_tile_t * ctx ) {
77
78
fd_bundle_client_reset ( ctx );
78
79
79
- int tcp_sock = socket ( AF_INET , SOCK_STREAM |SOCK_CLOEXEC , IPPROTO_TCP );
80
+ /* FIXME IPv6 support */
81
+ fd_addrinfo_t hints = {0 };
82
+ hints .ai_family = AF_INET ;
83
+ fd_addrinfo_t * res = NULL ;
84
+ uchar scratch [ 4096 ];
85
+ void * pscratch = scratch ;
86
+ int err = fd_getaddrinfo ( ctx -> server_fqdn , & hints , & res , & pscratch , sizeof (scratch ) );
87
+ if ( FD_UNLIKELY ( err ) ) {
88
+ FD_LOG_WARNING (( "fd_getaddrinfo `%s` failed (%d-%s)" , ctx -> server_fqdn , err , fd_gai_strerror ( err ) ));
89
+ fd_bundle_client_reset ( ctx );
90
+ ctx -> metrics .transport_fail_cnt ++ ;
91
+ return ;
92
+ }
93
+ uint const ip4_addr = ((struct sockaddr_in * )res -> ai_addr )-> sin_addr .s_addr ;
94
+
95
+ int tcp_sock = socket ( AF_INET , SOCK_STREAM |SOCK_CLOEXEC , 0 );
80
96
if ( FD_UNLIKELY ( tcp_sock < 0 ) ) {
81
- FD_LOG_ERR (( "socket(AF_INET,SOCK_STREAM|SOCK_CLOEXEC,IPPROTO_TCP ) failed (%i-%s)" , errno , fd_io_strerror ( errno ) ));
97
+ FD_LOG_ERR (( "socket(AF_INET,SOCK_STREAM|SOCK_CLOEXEC,0 ) failed (%i-%s)" , errno , fd_io_strerror ( errno ) ));
82
98
}
83
99
ctx -> tcp_sock = tcp_sock ;
84
100
@@ -97,14 +113,14 @@ fd_bundle_client_create_conn( fd_bundle_tile_t * ctx ) {
97
113
98
114
FD_LOG_INFO (( "Connecting to %s://" FD_IP4_ADDR_FMT ":%hu (%.*s)" ,
99
115
scheme ,
100
- FD_IP4_ADDR_FMT_ARGS ( ctx -> server_ip4_addr ), ctx -> server_tcp_port ,
101
- (int )ctx -> server_fqdn_len , ctx -> server_fqdn ));
116
+ FD_IP4_ADDR_FMT_ARGS ( ip4_addr ), ctx -> server_tcp_port ,
117
+ (int )ctx -> server_sni_len , ctx -> server_sni ));
102
118
103
- int connect_err = fd_bundle_client_do_connect ( ctx );
119
+ int connect_err = fd_bundle_client_do_connect ( ctx , ip4_addr );
104
120
if ( FD_UNLIKELY ( connect_err ) ) {
105
121
if ( FD_UNLIKELY ( connect_err != EINPROGRESS ) ) {
106
122
FD_LOG_WARNING (( "connect(tcp_sock," FD_IP4_ADDR_FMT ":%u) failed (%i-%s)" ,
107
- FD_IP4_ADDR_FMT_ARGS ( ctx -> server_ip4_addr ), ctx -> server_tcp_port ,
123
+ FD_IP4_ADDR_FMT_ARGS ( ip4_addr ), ctx -> server_tcp_port ,
108
124
connect_err , fd_io_strerror ( connect_err ) ));
109
125
fd_bundle_client_reset ( ctx );
110
126
ctx -> metrics .transport_fail_cnt ++ ;
@@ -127,7 +143,7 @@ fd_bundle_client_create_conn( fd_bundle_tile_t * ctx ) {
127
143
SSL_set_bio ( ssl , bio , bio ); /* moves ownership of bio */
128
144
SSL_set_connect_state ( ssl );
129
145
130
- if ( FD_UNLIKELY ( !SSL_set_tlsext_host_name ( ssl , ctx -> server_fqdn ) ) ) {
146
+ if ( FD_UNLIKELY ( !SSL_set_tlsext_host_name ( ssl , ctx -> server_sni ) ) ) {
131
147
FD_LOG_ERR (( "SSL_set_tlsext_host_name failed" ));
132
148
}
133
149
@@ -162,7 +178,7 @@ fd_bundle_client_request_builder_info( fd_bundle_tile_t * ctx ) {
162
178
static char const path [] = "/block_engine.BlockEngineValidator/GetBlockBuilderFeeInfo" ;
163
179
int req_ok = fd_grpc_client_request_start (
164
180
ctx -> grpc_client ,
165
- ctx -> server_fqdn , ctx -> server_fqdn_len , ctx -> server_tcp_port ,
181
+ ctx -> server_sni , ctx -> server_sni_len , ctx -> server_tcp_port ,
166
182
path , sizeof (path )- 1 ,
167
183
FD_BUNDLE_CLIENT_REQ_Bundle_GetBlockBuilderFeeInfo ,
168
184
& block_engine_BlockBuilderFeeInfoRequest_msg , & req ,
@@ -181,7 +197,7 @@ fd_bundle_client_subscribe_packets( fd_bundle_tile_t * ctx ) {
181
197
static char const path [] = "/block_engine.BlockEngineValidator/SubscribePackets" ;
182
198
int req_ok = fd_grpc_client_request_start (
183
199
ctx -> grpc_client ,
184
- ctx -> server_fqdn , ctx -> server_fqdn_len , ctx -> server_tcp_port ,
200
+ ctx -> server_sni , ctx -> server_sni_len , ctx -> server_tcp_port ,
185
201
path , sizeof (path )- 1 ,
186
202
FD_BUNDLE_CLIENT_REQ_Bundle_SubscribePackets ,
187
203
& block_engine_SubscribePacketsRequest_msg , & req ,
@@ -200,7 +216,7 @@ fd_bundle_client_subscribe_bundles( fd_bundle_tile_t * ctx ) {
200
216
static char const path [] = "/block_engine.BlockEngineValidator/SubscribeBundles" ;
201
217
int req_ok = fd_grpc_client_request_start (
202
218
ctx -> grpc_client ,
203
- ctx -> server_fqdn , ctx -> server_fqdn_len , ctx -> server_tcp_port ,
219
+ ctx -> server_sni , ctx -> server_sni_len , ctx -> server_tcp_port ,
204
220
path , sizeof (path )- 1 ,
205
221
FD_BUNDLE_CLIENT_REQ_Bundle_SubscribeBundles ,
206
222
& block_engine_SubscribeBundlesRequest_msg , & req ,
@@ -253,7 +269,7 @@ fd_bundle_client_step( fd_bundle_tile_t * ctx,
253
269
if ( poll_res == 0 ) return ;
254
270
255
271
if ( pfds [0 ].revents & (POLLERR |POLLHUP ) ) {
256
- int connect_err = fd_bundle_client_do_connect ( ctx );
272
+ int connect_err = fd_bundle_client_do_connect ( ctx , 0 );
257
273
FD_LOG_INFO (( "Bundle gRPC connect attempt failed (%i-%s)" , connect_err , fd_io_strerror ( connect_err ) ));
258
274
fd_bundle_client_reset ( ctx );
259
275
ctx -> metrics .transport_fail_cnt ++ ;
@@ -296,7 +312,7 @@ fd_bundle_client_step( fd_bundle_tile_t * ctx,
296
312
297
313
/* Drive auth */
298
314
if ( FD_UNLIKELY ( ctx -> auther .needs_poll ) ) {
299
- fd_bundle_auther_poll ( & ctx -> auther , ctx -> grpc_client , ctx -> keyguard_client , ctx -> server_fqdn , ctx -> server_fqdn_len , ctx -> server_tcp_port );
315
+ fd_bundle_auther_poll ( & ctx -> auther , ctx -> grpc_client , ctx -> keyguard_client , ctx -> server_sni , ctx -> server_sni_len , ctx -> server_tcp_port );
300
316
* charge_busy = 1 ;
301
317
return ;
302
318
}
0 commit comments