@@ -376,14 +376,13 @@ check_connection_established(struct context *c)
376376#endif
377377
378378bool
379- send_control_channel_string_dowork (struct tls_session * session , const char * str ,
379+ send_control_channel_string_dowork (struct tls_session * session , struct key_state * ks , const char * str ,
380380 msglvl_t msglevel )
381381{
382382 struct gc_arena gc = gc_new ();
383383 bool stat ;
384384
385385 ASSERT (session );
386- struct key_state * ks = & session -> key [KS_PRIMARY ];
387386
388387 /* buffered cleartext write onto TLS control channel */
389388 stat = tls_send_payload (ks , (uint8_t * )str , strlen (str ) + 1 );
@@ -409,7 +408,18 @@ send_control_channel_string(struct context *c, const char *str, msglvl_t msgleve
409408 if (c -> c2 .tls_multi )
410409 {
411410 struct tls_session * session = & c -> c2 .tls_multi -> session [TM_ACTIVE ];
412- bool ret = send_control_channel_string_dowork (session , str , msglevel );
411+ struct key_state * ks = & session -> key [KS_PRIMARY ];
412+ bool ret = send_control_channel_string_dowork (session , ks , str , msglevel );
413+ reschedule_multi_process (c );
414+
415+ session = & c -> c2 .tls_multi -> session [TM_THREADED ];
416+ ks = & session -> key [KS_PRIMARY ];
417+ send_control_channel_string_dowork (session , ks , str , msglevel );
418+ reschedule_multi_process (c );
419+
420+ session = & c -> c2 .tls_multi -> session [TM_REKEYS ];
421+ ks = & session -> key [KS_PRIMARY ];
422+ ret = send_control_channel_string_dowork (session , ks , str , msglevel );
413423 reschedule_multi_process (c );
414424
415425 return ret ;
@@ -2358,11 +2368,13 @@ get_io_flags_udp(struct context *c, struct multi_io *multi_io, const unsigned in
23582368}
23592369
23602370void
2361- io_wait_dowork (struct context * c , const unsigned int flags )
2371+ io_wait_dowork (struct context * c , const unsigned int flags , int z )
23622372{
23632373 unsigned int out_socket ;
23642374 unsigned int out_tuntap ;
23652375 struct event_set_return esr [4 ];
2376+ struct event_set * event_set = ((z & THREAD_RTWL ) != 0 ) ? c -> c2 .event_set : c -> c2 .event_set2 ;
2377+ unsigned int * event_set_status = ((z & THREAD_RTWL ) != 0 ) ? & (c -> c2 .event_set_status ) : & (c -> c2 .event_set_status2 );
23662378
23672379 /* These shifts all depend on EVENT_READ and EVENT_WRITE */
23682380 static uintptr_t socket_shift = SOCKET_SHIFT ; /* depends on SOCKET_READ and SOCKET_WRITE */
@@ -2380,29 +2392,29 @@ io_wait_dowork(struct context *c, const unsigned int flags)
23802392 /*
23812393 * Decide what kind of events we want to wait for.
23822394 */
2383- event_reset (c -> c2 . event_set );
2395+ event_reset (event_set );
23842396
2385- multi_io_process_flags (c , c -> c2 . event_set , flags , & out_socket , & out_tuntap );
2397+ multi_io_process_flags (c , event_set , flags , & out_socket , & out_tuntap );
23862398
23872399#if defined(TARGET_LINUX ) || defined(TARGET_FREEBSD )
23882400 if (out_socket & EVENT_READ && c -> c2 .did_open_tun )
23892401 {
2390- dco_event_set (& c -> c1 .tuntap -> dco , c -> c2 . event_set , (void * )dco_shift );
2402+ dco_event_set (& c -> c1 .tuntap -> dco , event_set , (void * )dco_shift );
23912403 }
23922404#endif
23932405
23942406#ifdef ENABLE_MANAGEMENT
23952407 if (management )
23962408 {
2397- management_socket_set (management , c -> c2 . event_set , (void * )management_shift , NULL );
2409+ management_socket_set (management , event_set , (void * )management_shift , NULL );
23982410 }
23992411#endif
24002412
24012413#ifdef ENABLE_ASYNC_PUSH
24022414 /* arm inotify watcher */
24032415 if (c -> options .mode == MODE_SERVER )
24042416 {
2405- event_ctl (c -> c2 . event_set , c -> c2 .inotify_fd , EVENT_READ , (void * )file_shift );
2417+ event_ctl (event_set , c -> c2 .inotify_fd , EVENT_READ , (void * )file_shift );
24062418 }
24072419#endif
24082420
@@ -2416,7 +2428,7 @@ io_wait_dowork(struct context *c, const unsigned int flags)
24162428 * (6) timeout (tv) expired
24172429 */
24182430
2419- c -> c2 . event_set_status = ES_ERROR ;
2431+ * event_set_status = ES_ERROR ;
24202432
24212433 if (!c -> sig -> signal_received )
24222434 {
@@ -2434,14 +2446,14 @@ io_wait_dowork(struct context *c, const unsigned int flags)
24342446 /*
24352447 * Wait for something to happen.
24362448 */
2437- status = event_wait (c -> c2 . event_set , & c -> c2 .timeval , esr , SIZE (esr ));
2449+ status = event_wait (event_set , & c -> c2 .timeval , esr , SIZE (esr ));
24382450
24392451 check_status (status , "event_wait" , NULL , NULL );
24402452
24412453 if (status > 0 )
24422454 {
24432455 int i ;
2444- c -> c2 . event_set_status = 0 ;
2456+ * event_set_status = 0 ;
24452457 for (i = 0 ; i < status ; ++ i )
24462458 {
24472459 const struct event_set_return * e = & esr [i ];
@@ -2452,7 +2464,7 @@ io_wait_dowork(struct context *c, const unsigned int flags)
24522464 struct event_arg * ev_arg = (struct event_arg * )e -> arg ;
24532465 if (ev_arg -> type != EVENT_ARG_LINK_SOCKET )
24542466 {
2455- c -> c2 . event_set_status = ES_ERROR ;
2467+ * event_set_status = ES_ERROR ;
24562468 msg (D_LINK_ERRORS , "io_work: non socket event delivered" );
24572469 return ;
24582470 }
@@ -2464,30 +2476,30 @@ io_wait_dowork(struct context *c, const unsigned int flags)
24642476 shift = (uintptr_t )e -> arg ;
24652477 }
24662478
2467- c -> c2 . event_set_status |= ((e -> rwflags & 3 ) << shift );
2479+ * event_set_status |= ((e -> rwflags & 3 ) << shift );
24682480 }
24692481 }
24702482 else if (status == 0 )
24712483 {
2472- c -> c2 . event_set_status = ES_TIMEOUT ;
2484+ * event_set_status = ES_TIMEOUT ;
24732485 }
24742486 }
24752487 else
24762488 {
2477- c -> c2 . event_set_status = SOCKET_READ ;
2489+ * event_set_status = SOCKET_READ ;
24782490 }
24792491 }
24802492
24812493 /* 'now' should always be a reasonably up-to-date timestamp */
24822494 update_time ();
24832495
24842496 /* set signal_received if a signal was received */
2485- if (c -> c2 . event_set_status & ES_ERROR )
2497+ if (* event_set_status & ES_ERROR )
24862498 {
24872499 get_signal (& c -> sig -> signal_received );
24882500 }
24892501
2490- dmsg (D_EVENT_WAIT , "I/O WAIT status=0x%04x" , c -> c2 . event_set_status );
2502+ dmsg (D_EVENT_WAIT , "I/O WAIT status=0x%04x" , * event_set_status );
24912503}
24922504
24932505void threaded_fwd_inp_intf (struct context * c , struct link_socket * sock , struct thread_pointer * b )
@@ -2507,7 +2519,7 @@ void threaded_fwd_inp_intf(struct context *c, struct link_socket *sock, struct t
25072519}
25082520
25092521void
2510- process_io (struct context * c , struct link_socket * sock , struct thread_pointer * b )
2522+ process_io (struct context * c , struct link_socket * sock , struct thread_pointer * b , int z )
25112523{
25122524 const unsigned int status = c -> c2 .event_set_status ;
25132525
@@ -2520,17 +2532,17 @@ process_io(struct context *c, struct link_socket *sock, struct thread_pointer *b
25202532#endif
25212533
25222534 /* TCP/UDP port ready to accept write */
2523- if (status & SOCKET_WRITE )
2535+ if (( status & SOCKET_WRITE ) && (( z & THREAD_RTWL ) != 0 ) )
25242536 {
25252537 process_outgoing_link (c , sock );
25262538 }
25272539 /* TUN device ready to accept write */
2528- else if (status & TUN_WRITE )
2540+ else if (( status & TUN_WRITE ) && (( z & THREAD_RLWT ) != 0 ) )
25292541 {
25302542 process_outgoing_tun (c , sock );
25312543 }
25322544 /* Incoming data on TCP/UDP port */
2533- else if (status & SOCKET_READ )
2545+ else if (( status & SOCKET_READ ) && (( z & THREAD_RLWT ) != 0 ) )
25342546 {
25352547 read_incoming_link (c , sock );
25362548 if (!IS_SIG (c ))
@@ -2539,15 +2551,52 @@ process_io(struct context *c, struct link_socket *sock, struct thread_pointer *b
25392551 }
25402552 }
25412553 /* Incoming data on TUN device */
2542- else if (status & TUN_READ )
2554+ else if (( status & TUN_READ ) && (( z & THREAD_RTWL ) != 0 ) )
25432555 {
25442556 threaded_fwd_inp_intf (c , sock , b );
25452557 }
2546- else if (status & DCO_READ )
2558+ else if (( status & DCO_READ ) && (( z & THREAD_RTWL ) != 0 ) )
25472559 {
25482560 if (!IS_SIG (c ))
25492561 {
25502562 process_incoming_dco (c );
25512563 }
25522564 }
25532565}
2566+
2567+ void threaded_dual_init (struct dual_args * d )
2568+ {
2569+ if ((d -> a == 0 ) && (d -> c -> c2 .buffers ))
2570+ {
2571+ if ((d -> z & THREAD_RLWT ) != 0 )
2572+ {
2573+ d -> c -> c2 .buffers -> read_link_buf .len = 0 ;
2574+ d -> c -> c2 .buf2 = d -> c -> c2 .buffers -> read_link_buf ;
2575+ d -> a = 1 ;
2576+ }
2577+ if ((d -> z & THREAD_RTWL ) != 0 )
2578+ {
2579+ d -> c -> c2 .buffers -> read_tun_buf .len = 0 ;
2580+ d -> c -> c2 .buf = d -> c -> c2 .buffers -> read_tun_buf ;
2581+ d -> a = 1 ;
2582+ }
2583+ }
2584+ }
2585+
2586+ void * threaded_process_io (void * a )
2587+ {
2588+ struct dual_args * d = (struct dual_args * )a ;
2589+ while (true)
2590+ {
2591+ if (d -> b -> p -> z != 1 ) { break ; }
2592+ pthread_mutex_lock (& (d -> i ));
2593+ if (d -> b -> p -> z != 1 ) { break ; }
2594+ threaded_dual_init (d );
2595+ if (d -> a == 1 )
2596+ {
2597+ process_io (d -> c , d -> c -> c2 .link_sockets [0 ], d -> b , d -> z );
2598+ }
2599+ pthread_mutex_unlock (& (d -> o ));
2600+ }
2601+ return NULL ;
2602+ }
0 commit comments