@@ -273,9 +273,6 @@ fd_quic_config_from_env( int * pargc,
273
273
cfg -> idle_timeout = idle_timeout_ms * (ulong )1e6 ;
274
274
cfg -> initial_rx_max_stream_data = initial_rx_max_stream_data ;
275
275
276
- cfg -> net .ephem_udp_port .lo = 10000 ;
277
- cfg -> net .ephem_udp_port .hi = 11000 ;
278
-
279
276
return cfg ;
280
277
}
281
278
@@ -397,15 +394,7 @@ fd_quic_init( fd_quic_t * quic ) {
397
394
398
395
switch ( config -> role ) {
399
396
case FD_QUIC_ROLE_SERVER :
400
- if ( FD_UNLIKELY ( !config -> net .listen_udp_port ) ) { FD_LOG_WARNING (( "no cfg.net.listen_udp_port" )); return NULL ; }
401
- break ;
402
397
case FD_QUIC_ROLE_CLIENT :
403
- if ( FD_UNLIKELY ( !config -> net .ephem_udp_port .lo
404
- || !config -> net .ephem_udp_port .hi
405
- || config -> net .ephem_udp_port .lo > config -> net .ephem_udp_port .hi ) ) {
406
- FD_LOG_WARNING (( "invalid cfg.net.ephem_udp_port" ));
407
- return NULL ;
408
- }
409
398
break ;
410
399
default :
411
400
FD_LOG_WARNING (( "invalid cfg.role" ));
@@ -588,9 +577,6 @@ fd_quic_init( fd_quic_t * quic ) {
588
577
FD_QUIC_TRANSPORT_PARAM_SET ( tp , max_ack_delay , max_ack_delay_ms_u );
589
578
/* */ tp -> disable_active_migration_present = 1 ;
590
579
591
- /* Initialize next ephemeral udp port */
592
- state -> next_ephem_udp_port = config -> net .ephem_udp_port .lo ;
593
-
594
580
return quic ;
595
581
}
596
582
@@ -815,11 +801,11 @@ fd_quic_log_full_hdr( fd_quic_conn_t const * conn,
815
801
fd_quic_log_hdr_t hdr = {
816
802
.conn_id = conn -> our_conn_id ,
817
803
.pkt_num = pkt -> pkt_number ,
804
+ .ip4_saddr = pkt -> ip4 -> saddr ,
818
805
.udp_sport = pkt -> udp -> net_sport ,
819
806
.enc_level = (uchar )pkt -> enc_level ,
820
807
.flags = 0
821
808
};
822
- memcpy ( hdr .ip4_saddr , pkt -> ip4 -> saddr_c , 4 );
823
809
return hdr ;
824
810
}
825
811
@@ -1364,9 +1350,7 @@ fd_quic_send_retry( fd_quic_t * quic,
1364
1350
fd_quic_pkt_t * pkt ,
1365
1351
fd_quic_conn_id_t const * odcid ,
1366
1352
fd_quic_conn_id_t const * scid ,
1367
- ulong new_conn_id ,
1368
- uint dst_ip_addr ,
1369
- ushort dst_udp_port ) {
1353
+ ulong new_conn_id ) {
1370
1354
1371
1355
fd_quic_state_t * state = fd_quic_get_state ( quic );
1372
1356
@@ -1385,9 +1369,10 @@ fd_quic_send_retry( fd_quic_t * quic,
1385
1369
retry_pkt ,
1386
1370
// encode buffer
1387
1371
& pkt -> ip4 -> net_id ,
1388
- dst_ip_addr ,
1389
- quic -> config .net .listen_udp_port ,
1390
- dst_udp_port ) == FD_QUIC_FAILED ) ) {
1372
+ pkt -> ip4 -> saddr ,
1373
+ pkt -> udp -> net_sport ,
1374
+ pkt -> ip4 -> daddr ,
1375
+ pkt -> udp -> net_dport ) == FD_QUIC_FAILED ) ) {
1391
1376
return FD_QUIC_PARSE_FAIL ;
1392
1377
}
1393
1378
return 0UL ;
@@ -1487,11 +1472,6 @@ fd_quic_handle_v1_initial( fd_quic_t * quic,
1487
1472
fd_memcpy ( peer_conn_id .conn_id , initial -> src_conn_id , FD_QUIC_MAX_CONN_ID_SZ );
1488
1473
peer_conn_id .sz = initial -> src_conn_id_len ;
1489
1474
1490
- /* Save peer's network endpoint */
1491
-
1492
- ushort dst_udp_port = pkt -> udp -> net_sport ;
1493
- uint dst_ip_addr = FD_LOAD ( uint , pkt -> ip4 -> saddr_c );
1494
-
1495
1475
/* Prepare QUIC-TLS transport params object (sent as a TLS extension).
1496
1476
Take template from state and mutate certain params in-place.
1497
1477
@@ -1531,8 +1511,7 @@ fd_quic_handle_v1_initial( fd_quic_t * quic,
1531
1511
ulong new_conn_id_u64 = fd_rng_ulong ( state -> _rng );
1532
1512
if ( FD_UNLIKELY ( fd_quic_send_retry (
1533
1513
quic , pkt ,
1534
- & odcid , peer_scid , new_conn_id_u64 ,
1535
- dst_ip_addr , dst_udp_port ) ) ) {
1514
+ & odcid , peer_scid , new_conn_id_u64 ) ) ) {
1536
1515
return FD_QUIC_FAILED ;
1537
1516
}
1538
1517
return (initial -> pkt_num_pnoff + initial -> len );
@@ -1614,8 +1593,10 @@ fd_quic_handle_v1_initial( fd_quic_t * quic,
1614
1593
conn = fd_quic_conn_create ( quic ,
1615
1594
scid ,
1616
1595
& peer_conn_id ,
1617
- dst_ip_addr ,
1618
- dst_udp_port ,
1596
+ pkt -> ip4 -> saddr ,
1597
+ pkt -> udp -> net_sport ,
1598
+ pkt -> ip4 -> daddr ,
1599
+ pkt -> udp -> net_dport ,
1619
1600
1 /* server */ );
1620
1601
1621
1602
if ( FD_UNLIKELY ( !conn ) ) { /* no free connections */
@@ -1715,6 +1696,12 @@ fd_quic_handle_v1_initial( fd_quic_t * quic,
1715
1696
return FD_QUIC_PARSE_FAIL ;
1716
1697
}
1717
1698
1699
+ if ( FD_UNLIKELY ( !conn -> host .ip_addr ) ) {
1700
+ /* Lock src IP address in place (previously chosen by layer-4 based
1701
+ on the route table) */
1702
+ conn -> host .ip_addr = pkt -> ip4 -> daddr ;
1703
+ }
1704
+
1718
1705
/* check if reply conn id needs to change */
1719
1706
if ( FD_UNLIKELY ( !( conn -> server | conn -> established ) ) ) {
1720
1707
/* switch to the source connection id for future replies */
@@ -2996,8 +2983,9 @@ fd_quic_tx_buffered_raw(
2996
2983
uchar * tx_buf ,
2997
2984
ushort * ipv4_id ,
2998
2985
uint dst_ipv4_addr ,
2999
- ushort src_udp_port ,
3000
- ushort dst_udp_port
2986
+ ushort dst_udp_port ,
2987
+ uint src_ipv4_addr ,
2988
+ ushort src_udp_port
3001
2989
) {
3002
2990
3003
2991
/* TODO leave space at front of tx_buf for header
@@ -3029,19 +3017,14 @@ fd_quic_tx_buffered_raw(
3029
3017
pkt .ip4 -> ttl = 64 ; /* TODO make configurable */
3030
3018
pkt .ip4 -> protocol = FD_IP4_HDR_PROTOCOL_UDP ;
3031
3019
pkt .ip4 -> check = 0 ;
3020
+ pkt .ip4 -> saddr = src_ipv4_addr ;
3021
+ pkt .ip4 -> daddr = dst_ipv4_addr ;
3032
3022
pkt .udp -> net_sport = src_udp_port ;
3033
3023
pkt .udp -> net_dport = dst_udp_port ;
3034
3024
pkt .udp -> net_len = (ushort )( 8 + payload_sz );
3035
3025
pkt .udp -> check = 0x0000 ;
3036
3026
* ipv4_id = (ushort )( * ipv4_id + 1 );
3037
3027
3038
- /* TODO saddr could be zero -- should use the kernel routing table to
3039
- determine an appropriate source address */
3040
-
3041
- /* copy to avoid alignment issues */
3042
- memcpy ( & pkt .ip4 -> saddr_c , & config -> net .ip_addr , 4 );
3043
- memcpy ( & pkt .ip4 -> daddr_c , & dst_ipv4_addr , 4 );
3044
-
3045
3028
ulong rc = fd_quic_encode_ip4 ( cur_ptr , cur_sz , pkt .ip4 );
3046
3029
if ( FD_UNLIKELY ( rc == FD_QUIC_PARSE_FAIL ) ) {
3047
3030
FD_LOG_ERR (( "fd_quic_encode_ip4 failed with buffer overrun" ));
@@ -3106,8 +3089,9 @@ fd_quic_tx_buffered( fd_quic_t * quic,
3106
3089
conn -> tx_buf_conn ,
3107
3090
& conn -> ipv4_id ,
3108
3091
endpoint -> ip_addr ,
3109
- conn -> host .udp_port ,
3110
- endpoint -> udp_port );
3092
+ endpoint -> udp_port ,
3093
+ conn -> host .ip_addr ,
3094
+ conn -> host .udp_port );
3111
3095
}
3112
3096
3113
3097
static ulong
@@ -4095,7 +4079,9 @@ fd_quic_conn_free( fd_quic_t * quic,
4095
4079
fd_quic_conn_t *
4096
4080
fd_quic_connect ( fd_quic_t * quic ,
4097
4081
uint dst_ip_addr ,
4098
- ushort dst_udp_port ) {
4082
+ ushort dst_udp_port ,
4083
+ uint src_ip_addr ,
4084
+ ushort src_udp_port ) {
4099
4085
4100
4086
fd_quic_state_t * state = fd_quic_get_state ( quic );
4101
4087
@@ -4120,25 +4106,15 @@ fd_quic_connect( fd_quic_t * quic,
4120
4106
& peer_conn_id ,
4121
4107
dst_ip_addr ,
4122
4108
dst_udp_port ,
4109
+ src_ip_addr ,
4110
+ src_udp_port ,
4123
4111
0 /* client */ );
4124
4112
4125
4113
if ( FD_UNLIKELY ( !conn ) ) {
4126
4114
FD_DEBUG ( FD_LOG_DEBUG (( "fd_quic_conn_create failed" )) );
4127
4115
return NULL ;
4128
4116
}
4129
4117
4130
- /* choose a port from ephemeral range */
4131
- fd_quic_config_t * config = & quic -> config ;
4132
- ushort ephem_lo = config -> net .ephem_udp_port .lo ;
4133
- ushort ephem_hi = config -> net .ephem_udp_port .hi ;
4134
- ushort next_ephem = state -> next_ephem_udp_port ;
4135
- ushort src_port = next_ephem ;
4136
- next_ephem ++ ;
4137
- next_ephem = fd_ushort_if ( next_ephem >= ephem_hi , ephem_lo , next_ephem );
4138
- state -> next_ephem_udp_port = next_ephem ;
4139
-
4140
- conn -> host .udp_port = src_port ;
4141
-
4142
4118
/* Prepare QUIC-TLS transport params object (sent as a TLS extension).
4143
4119
Take template from state and mutate certain params in-place.
4144
4120
@@ -4201,8 +4177,10 @@ fd_quic_conn_t *
4201
4177
fd_quic_conn_create ( fd_quic_t * quic ,
4202
4178
ulong our_conn_id ,
4203
4179
fd_quic_conn_id_t const * peer_conn_id ,
4204
- uint dst_ip_addr ,
4205
- ushort dst_udp_port ,
4180
+ uint peer_ip_addr ,
4181
+ ushort peer_udp_port ,
4182
+ uint self_ip_addr ,
4183
+ ushort self_udp_port ,
4206
4184
int server ) {
4207
4185
4208
4186
fd_quic_config_t * config = & quic -> config ;
@@ -4253,10 +4231,8 @@ fd_quic_conn_create( fd_quic_t * quic,
4253
4231
conn -> svc_time = LONG_MAX ;
4254
4232
conn -> our_conn_id = 0 ;
4255
4233
conn -> host = (fd_quic_net_endpoint_t ){
4256
- .ip_addr = config -> net .ip_addr ,
4257
- .udp_port = fd_ushort_if ( server ,
4258
- config -> net .listen_udp_port ,
4259
- state -> next_ephem_udp_port )
4234
+ .ip_addr = self_ip_addr , /* may be 0, if outgoing */
4235
+ .udp_port = self_udp_port ,
4260
4236
};
4261
4237
memset ( & conn -> peer [0 ], 0 , sizeof ( conn -> peer ) );
4262
4238
conn -> conn_gen ++ ;
@@ -4335,8 +4311,8 @@ fd_quic_conn_create( fd_quic_t * quic,
4335
4311
4336
4312
/* peer connection id */
4337
4313
conn -> peer_cids [0 ] = * peer_conn_id ;
4338
- conn -> peer [0 ].ip_addr = dst_ip_addr ;
4339
- conn -> peer [0 ].udp_port = dst_udp_port ;
4314
+ conn -> peer [0 ].ip_addr = peer_ip_addr ;
4315
+ conn -> peer [0 ].udp_port = peer_udp_port ;
4340
4316
4341
4317
fd_quic_ack_gen_init ( conn -> ack_gen );
4342
4318
conn -> unacked_sz = 0UL ;
0 commit comments