diff --git a/platform/src/ssl_stream.cpp b/platform/src/ssl_stream.cpp index 19b73c5..39a7f1a 100644 --- a/platform/src/ssl_stream.cpp +++ b/platform/src/ssl_stream.cpp @@ -1033,7 +1033,8 @@ static SSL * downstream_ssl_create(struct ssl_mgr * mgr, struct keyring * crt) SSL_CTX_set_session_cache_mode(sslctx, SSL_SESS_CACHE_SERVER | SSL_SESS_CACHE_NO_INTERNAL); SSL_CTX_set_session_id_context(sslctx, (const unsigned char *) mgr->ssl_session_context, sizeof(mgr->ssl_session_context)); - + ret = SSL_CTX_set_ex_data(sslctx, SSL_EX_DATA_IDX_SSLMGR, mgr); + assert(ret == 1); if (mgr->dh) { SSL_CTX_set_tmp_dh(sslctx, mgr->dh); diff --git a/platform/src/tcp_stream.cpp b/platform/src/tcp_stream.cpp index dc6606d..0b64a2d 100644 --- a/platform/src/tcp_stream.cpp +++ b/platform/src/tcp_stream.cpp @@ -1,5 +1,6 @@ #include +#include #include #include #include @@ -337,10 +338,15 @@ static void __stream_bev_readcb(struct bufferevent * bev, void * arg) if (_stream->is_plugin_opened == 0) { - p_info_iter->on_open(&_stream->head, _stream->thread_ref->thread_id, dir, &(plug_ctx->pme)); + if (p_info_iter->on_open != NULL) + { + p_info_iter->on_open(&_stream->head, _stream->thread_ref->thread_id, dir, &(plug_ctx->pme)); + } + _stream->is_plugin_opened = 1; } - else + + if (p_info_iter->on_data != NULL) { action_tmp = p_info_iter->on_data(&_stream->head, _stream->thread_ref->thread_id, dir, contiguous_data, contigous_len, &(plug_ctx->pme)); @@ -634,6 +640,67 @@ void tfe_stream_destory(struct tfe_stream_private * stream) thread->load--; } +static struct tfe_stream_addr * __stream_addr_create_by_fds(struct tfe_stream * stream, evutil_socket_t fd_downstream) +{ + struct tfe_stream_addr * __stream_addr = NULL; + + struct sockaddr_storage sk_src_storage{}; + struct sockaddr * sk_src_ptr = (struct sockaddr *) &sk_src_storage; + socklen_t sk_src_len = sizeof(sk_src_storage); + + struct sockaddr_storage sk_dst_storage{}; + struct sockaddr * sk_dst_ptr = (struct sockaddr *) &sk_dst_storage; + socklen_t sk_dst_len = sizeof(sk_dst_storage); + + int ret = getsockname(fd_downstream, sk_src_ptr, &sk_src_len); + if (unlikely(ret < 0)) + { + TFE_STREAM_LOG_ERROR(stream, "Failed at calling getsockaddr() for fd %d : %s", fd_downstream, strerror(errno)); + goto __errout; + } + + ret = getpeername(fd_downstream, sk_dst_ptr, &sk_dst_len); + if (unlikely(ret < 0)) + { + TFE_STREAM_LOG_ERROR(stream, "Failed at calling getpeername() for fd %d : %s", fd_downstream, strerror(errno)); + goto __errout; + } + + assert(sk_src_ptr->sa_family == sk_dst_ptr->sa_family); + if (sk_src_ptr->sa_family == AF_INET) + { + __stream_addr = (struct tfe_stream_addr *) malloc( + sizeof(struct tfe_stream_addr) + sizeof(struct tfe_stream_addr_tuple4_v4)); + + struct tfe_stream_addr_ipv4 * st_addr_v4 = __stream_addr->ipv4; + struct sockaddr_in * sk_v4_src_ptr = (struct sockaddr_in *)sk_src_ptr; + struct sockaddr_in * sk_v4_dst_ptr = (struct sockaddr_in *)sk_dst_ptr; + + __stream_addr->addrtype = TFE_ADDR_STREAM_TUPLE4_V4; + __stream_addr->addrlen = sizeof(struct tfe_stream_addr_tuple4_v4); + + st_addr_v4->saddr.s_addr = sk_v4_src_ptr->sin_addr.s_addr; + st_addr_v4->source = sk_v4_src_ptr->sin_port; + st_addr_v4->daddr.s_addr = sk_v4_dst_ptr->sin_addr.s_addr; + st_addr_v4->dest = sk_v4_dst_ptr->sin_port; + } + else if (sk_src_ptr->sa_family == AF_INET6) + { + assert(0); + } + else + { + TFE_STREAM_LOG_ERROR(stream, "Invalid sockaddr family for fd %d: sa_family is %d.", + fd_downstream, sk_src_ptr->sa_family); goto __errout; + } + + return __stream_addr; + +__errout: + if (__stream_addr != NULL) free(__stream_addr); + return NULL; +} + void tfe_stream_init_by_fds(struct tfe_stream * stream, evutil_socket_t fd_downstream, evutil_socket_t fd_upstream) { struct tfe_stream_private * _stream = container_of(stream, struct tfe_stream_private, head); @@ -645,6 +712,12 @@ void tfe_stream_init_by_fds(struct tfe_stream * stream, evutil_socket_t fd_downs evutil_make_socket_nonblocking(fd_downstream); evutil_make_socket_nonblocking(fd_upstream); + _stream->head.addr = __stream_addr_create_by_fds(stream, fd_downstream); + if(unlikely(_stream->head.addr == NULL)) + { + assert(0); + } + if (_stream->session_type == STREAM_PROTO_PLAIN) { _stream->conn_downstream = __conn_private_create_by_fd(_stream, fd_downstream);