@@ -207,6 +207,12 @@ typedef struct xqc_demo_cli_quic_config_s {
207207 int recreate_path ;
208208 int close_path_id ;
209209
210+ int use_x25519 ;
211+
212+ xqc_msec_t path0_rebind_time ;
213+ xqc_msec_t path1_rebind_time ;
214+ uint8_t read_old_sockets ;
215+
210216} xqc_demo_cli_quic_config_t ;
211217
212218
@@ -1378,16 +1384,22 @@ xqc_demo_cli_socket_read_handler(xqc_demo_cli_user_conn_t *user_conn, int fd)
13781384 {
13791385 user_path = & user_conn -> paths [i ];
13801386 }
1387+
1388+ if (user_conn -> paths [i ].is_active
1389+ && user_conn -> paths [i ].rebind_fd == fd )
1390+ {
1391+ user_path = & user_conn -> paths [i ];
1392+ }
1393+
13811394 }
13821395
13831396 if (user_path == NULL ) {
13841397 return ;
13851398 }
13861399
1387- // printf("socket read: path%"PRIu64" fd:%d\n", user_path->path_id, user_path->fd);
13881400
13891401 do {
1390- recv_size = recvfrom (user_path -> fd , packet_buf , sizeof (packet_buf ), 0 ,
1402+ recv_size = recvfrom (fd , packet_buf , sizeof (packet_buf ), 0 ,
13911403 (struct sockaddr * )& addr , & addr_len );
13921404 if (recv_size < 0 && get_sys_errno () == EAGAIN ) {
13931405 break ;
@@ -1398,7 +1410,7 @@ xqc_demo_cli_socket_read_handler(xqc_demo_cli_user_conn_t *user_conn, int fd)
13981410 }
13991411
14001412 user_path -> local_addrlen = sizeof (struct sockaddr_in6 );
1401- xqc_int_t ret = getsockname (user_path -> fd , (struct sockaddr * )& user_path -> local_addr ,
1413+ xqc_int_t ret = getsockname (fd , (struct sockaddr * )& user_path -> local_addr ,
14021414 & user_path -> local_addrlen );
14031415 if (ret != 0 ) {
14041416 printf ("getsockname error, errno: %d\n" , get_sys_errno ());
@@ -1578,11 +1590,13 @@ xqc_demo_cli_rebind_path0(int fd, short what, void *arg)
15781590 // change fd
15791591 int temp = user_conn -> paths [0 ].fd ;
15801592 user_conn -> paths [0 ].fd = user_conn -> paths [0 ].rebind_fd ;
1581- user_conn -> paths [0 ].rebind_fd = user_conn -> paths [ 0 ]. fd ;
1593+ user_conn -> paths [0 ].rebind_fd = temp ;
15821594
15831595 //stop read from the old socket
1584- event_del (user_conn -> paths [0 ].ev_socket );
1585- user_conn -> paths [0 ].ev_socket = NULL ;
1596+ if (!user_conn -> ctx -> args -> quic_cfg .read_old_sockets ) {
1597+ event_del (user_conn -> paths [0 ].ev_socket );
1598+ user_conn -> paths [0 ].ev_socket = NULL ;
1599+ }
15861600
15871601 xqc_h3_conn_send_ping (user_conn -> ctx -> engine , & user_conn -> cid , NULL );
15881602 }
@@ -1596,10 +1610,12 @@ xqc_demo_cli_rebind_path1(int fd, short what, void *arg)
15961610 // change fd
15971611 int temp = user_conn -> paths [1 ].fd ;
15981612 user_conn -> paths [1 ].fd = user_conn -> paths [1 ].rebind_fd ;
1599- user_conn -> paths [1 ].rebind_fd = user_conn -> paths [ 1 ]. fd ;
1613+ user_conn -> paths [1 ].rebind_fd = temp ;
16001614
1601- event_del (user_conn -> paths [1 ].ev_socket );
1602- user_conn -> paths [1 ].ev_socket = NULL ;
1615+ if (!user_conn -> ctx -> args -> quic_cfg .read_old_sockets ) {
1616+ event_del (user_conn -> paths [1 ].ev_socket );
1617+ user_conn -> paths [1 ].ev_socket = NULL ;
1618+ }
16031619
16041620 xqc_h3_conn_send_ping (user_conn -> ctx -> engine , & user_conn -> cid , NULL );
16051621 }
@@ -1661,6 +1677,10 @@ xqc_demo_cli_init_conn_ssl_config(xqc_conn_ssl_config_t *conn_ssl_config,
16611677 conn_ssl_config -> transport_parameter_data = args -> quic_cfg .tp ;
16621678 conn_ssl_config -> transport_parameter_data_len = args -> quic_cfg .tp_len ;
16631679 }
1680+
1681+ if (args -> quic_cfg .use_x25519 ) {
1682+ conn_ssl_config -> tls_groups = XQC_TLS_GROUP_X25519_FIRST ;
1683+ }
16641684}
16651685
16661686void
@@ -1765,6 +1785,7 @@ xqc_demo_cli_init_args(xqc_demo_cli_client_args_t *args)
17651785 args -> quic_cfg .close_path_id = 1 ;
17661786 args -> quic_cfg .backup_path_id = 1 ;
17671787 args -> quic_cfg .quic_version = XQC_VERSION_V1 ;
1788+ args -> quic_cfg .use_x25519 = 0 ;
17681789
17691790 args -> req_cfg .throttled_req = -1 ;
17701791
@@ -1919,23 +1940,25 @@ xqc_demo_cli_usage(int argc, char *argv[])
19191940 " -B Set initial path standby after recvd first application data, and set initial path available after X ms\n"
19201941 " -I Idle interval between requests (ms)\n"
19211942 " -n Throttling the {1,2,...}xn-th requests\n"
1922- " -e NAT rebinding on path 0\n"
1923- " -E NAT rebinding on path 1\n"
1943+ " -e NAT rebinding on path 0 after x ms\n"
1944+ " -E NAT rebinding on path 1 after x ms\n"
1945+ " -O Also read packets from old sockets after rebinding\n"
19241946 " -F MTU size (default: 1200)\n"
19251947 " -G Google connection options (e.g. CBBR,TBBR)\n"
19261948 " -x Extend the number of requests to X\n"
19271949 " -r Send X requests per batch\n"
19281950 " -y cid rotation after x ms\n"
19291951 " -Y cid retirement after x ms\n"
19301952 " -f max path id\n"
1953+ " -5 use X25519 group as the first choice\n"
19311954 , prog );
19321955}
19331956
19341957void
19351958xqc_demo_cli_parse_args (int argc , char * argv [], xqc_demo_cli_client_args_t * args )
19361959{
19371960 int ch = 0 ;
1938- while ((ch = getopt (argc , argv , "a:p:c:Ct:S:0m:A:D:l:L:k:K:U:u:dMoi:w:Ps:b:Z:NQT:R:V:B:I:n:eEF: G:r:x:y:Y:f:z:q6 " )) != -1 ) {
1961+ while ((ch = getopt (argc , argv , "a:p:c:Ct:S:0m:A:D:l:L:k:K:U:u:dMoi:w:Ps:b:Z:NQT:R:V:B:I:n:e:E:F: G:r:x:y:Y:f:z:q65O " )) != -1 ) {
19391962 switch (ch ) {
19401963 /* server ip */
19411964 case '6' :
@@ -2184,12 +2207,19 @@ xqc_demo_cli_parse_args(int argc, char *argv[], xqc_demo_cli_client_args_t *args
21842207 case 'e' :
21852208 printf ("option rebinding path0 after 2s\n" );
21862209 args -> net_cfg .rebind_p0 = 1 ;
2210+ args -> quic_cfg .path0_rebind_time = atoi (optarg );
21872211 break ;
21882212
21892213 case 'E' :
21902214 printf ("option rebinding path1 after 3s\n" );
21912215 args -> net_cfg .rebind_p1 = 1 ;
2192- break ;
2216+ args -> quic_cfg .path1_rebind_time = atoi (optarg );
2217+ break ;
2218+
2219+ case 'O' :
2220+ printf ("also read from old sockets after rebinding\n" );
2221+ args -> quic_cfg .read_old_sockets = 1 ;
2222+ break ;
21932223
21942224 case 'F' :
21952225 printf ("MTU size: %s\n" , optarg );
@@ -2216,6 +2246,11 @@ xqc_demo_cli_parse_args(int argc, char *argv[], xqc_demo_cli_client_args_t *args
22162246 args -> quic_cfg .init_max_path_id = atoi (optarg );
22172247 break ;
22182248
2249+ case '5' :
2250+ printf ("use x25519\n" );
2251+ args -> quic_cfg .use_x25519 = 1 ;
2252+ break ;
2253+
22192254 default :
22202255 printf ("other option :%c\n" , ch );
22212256 xqc_demo_cli_usage (argc , argv );
@@ -2730,8 +2765,8 @@ xqc_demo_cli_start(xqc_demo_cli_user_conn_t *user_conn, xqc_demo_cli_client_args
27302765 xqc_demo_cli_rebind_path0 ,
27312766 user_conn );
27322767 struct timeval tv = {
2733- .tv_sec = 2 ,
2734- .tv_usec = 0 ,
2768+ .tv_sec = args -> quic_cfg . path0_rebind_time / 1000 ,
2769+ .tv_usec = ( args -> quic_cfg . path0_rebind_time % 1000 ) * 1000 ,
27352770 };
27362771 event_add (user_conn -> ev_rebinding_p0 , & tv );
27372772 }
@@ -2741,8 +2776,8 @@ xqc_demo_cli_start(xqc_demo_cli_user_conn_t *user_conn, xqc_demo_cli_client_args
27412776 xqc_demo_cli_rebind_path1 ,
27422777 user_conn );
27432778 struct timeval tv = {
2744- .tv_sec = 3 ,
2745- .tv_usec = 0 ,
2779+ .tv_sec = args -> quic_cfg . path1_rebind_time / 1000 ,
2780+ .tv_usec = ( args -> quic_cfg . path1_rebind_time % 1000 ) * 1000 ,
27462781 };
27472782 event_add (user_conn -> ev_rebinding_p1 , & tv );
27482783 }
0 commit comments