@ -309,18 +309,25 @@ static void proxy_err_cb(void *arg, err_t err) {
static err_t proxy_poll_cb ( void * arg , struct tcp_pcb * pcb ) {
struct proxy_conn * pc = ( struct proxy_conn * ) arg ;
if ( ! pc ) return LERR_OK ;
if ( pc - > closing_tun & & ! pc - > closing_rem & & pc - > transport & & pc - > transport_to_uip
& & queue_entry_count ( pc - > transport_to_uip ) = = 0 ) {
DEBUG_INFO ( DEBUG_CATEGORY_SOCKET , " PROXY CLOSE stream=%016llx tun=1 (no pending) " , ( unsigned long long ) pc - > remote_stream_id ) ;
pc - > transport - > ops - > close ( pc - > transport ) ;
if ( pc - > closing_tun & & ! pc - > closing_sent & & ! pc - > closing_rem & & pc - > transport & & pc - > pcb ) {
uint32_t pending = pc - > transport_to_uip ? queue_entry_count ( pc - > transport_to_uip ) : 0 ;
int done = ( pending = = 0 & & pc - > pcb - > unsent = = NULL & & pc - > pcb - > unacked = = NULL ) ;
uint32_t sndbuf = tcp_sndbuf ( pc - > pcb ) ;
if ( done | | sndbuf = = 0 ) {
DEBUG_INFO ( DEBUG_CATEGORY_SOCKET , " PROXY CLOSE stream=%016llx tun=1 pending=%u done=%d sndbuf=%u " ,
( unsigned long long ) pc - > remote_stream_id , pending , done , sndbuf ) ;
pc - > transport - > ops - > close ( pc - > transport ) ;
}
}
if ( pc - > closing_tun & & pc - > closing_rem & & pc - > pcb ) {
DEBUG_INFO ( DEBUG_CATEGORY_SOCKET , " PROXY CLOSE stream=%016llx tun=1 rem=1 " , ( unsigned long long ) pc - > remote_stream_id ) ;
if ( pc - > closing_tun & & ( pc - > closing_rem | | pc - > closing_sent ) & & pc - > pcb ) {
DEBUG_INFO ( DEBUG_CATEGORY_SOCKET , " PROXY CLEANUP stream=%016llx tun=1 rem=%d sent=%d " ,
( unsigned long long ) pc - > remote_stream_id , pc - > closing_rem , pc - > closing_sent ) ;
struct tcp_pcb * save = pc - > pcb ;
tcp_arg ( save , NULL ) ; pc - > pcb = NULL ; tcp_close ( save ) ;
struct tcp_proxy * proxy = pc - > proxy ;
struct proxy_conn * * prev = & proxy - > conns ;
while ( * prev ) { if ( * prev = = pc ) { * prev = pc - > next ; proxy - > conn_count - - ; break ; } prev = & ( * prev ) - > next ; }
if ( pc - > transport ) { pc - > transport - > ops - > destroy ( pc - > transport ) ; pc - > transport = NULL ; }
if ( pc - > eim_mapping ) { pc - > eim_mapping - > delete_at_tb = get_time_tb ( ) + proxy - > eim_timeout_tb ; pc - > eim_mapping = NULL ; }
if ( pc - > uip_to_transport ) { struct ll_entry * e2 ; while ( ( e2 = queue_data_get ( pc - > uip_to_transport ) ) ) { queue_dgram_free ( e2 ) ; queue_entry_free ( e2 ) ; } queue_free ( pc - > uip_to_transport ) ; }
if ( pc - > transport_to_uip ) { struct ll_entry * e2 ; while ( ( e2 = queue_data_get ( pc - > transport_to_uip ) ) ) { queue_dgram_free ( e2 ) ; queue_entry_free ( e2 ) ; } queue_free ( pc - > transport_to_uip ) ; }
@ -602,8 +609,8 @@ static void etcp_transport_close(struct tcp_proxy_transport* t) {
etcp_route_send ( et - > inst , et - > remote_node_id , e ) ; } else queue_entry_free ( e ) ;
}
et - > connected = 0 ;
if ( et - > conn ) { et - > conn - > transport = NULL ; et - > conn - > closing_rem = 1 ;
DEBUG_INFO ( DEBUG_CATEGORY_SOCKET , " PROXY REM =1 stream=%016llx (transport close) " , ( unsigned long long ) et - > conn - > remote_stream_id ) ;
if ( et - > conn ) { et - > conn - > transport = NULL ; et - > conn - > closing_sent = 1 ;
DEBUG_INFO ( DEBUG_CATEGORY_SOCKET , " PROXY SENT =1 stream=%016llx (transport close) " , ( unsigned long long ) et - > conn - > remote_stream_id ) ;
}
}
@ -691,6 +698,7 @@ void tcp_proxy_etcp_recv_cb(struct ETCP_CONN* conn, struct ll_entry* entry) {
if ( subcmd = = TCP_PROXY_SUBCMD_CONNECT ) {
uint64_t src_node_id = conn ? conn - > peer_node_id : ( inst ? inst - > node_id : 0 ) ;
DEBUG_INFO ( DEBUG_CATEGORY_SOCKET , " RP CONNECT recv stream=%016llx " , ( unsigned long long ) stream_id ) ;
remote_proxy_handle_connect ( inst , entry , stream_id , src_node_id ) ;
return ;
}