diff --git a/mtcp/src/ccp.c b/mtcp/src/ccp.c index a46c206..2880115 100644 --- a/mtcp/src/ccp.c +++ b/mtcp/src/ccp.c @@ -92,9 +92,9 @@ void setup_ccp_connection(mtcp_manager_t mtcp) { mtcp_thread_context_t ctx = mtcp->ctx; int cpu = ctx->cpu; //char cpu_str[2] = ""; - int send_sock, recv_sock; + int recv_sock; int path_len; - struct sockaddr_un local, remote; + struct sockaddr_un local; if ((recv_sock = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1) { TRACE_ERROR("failed to create unix recv socket for ccp comm\n"); @@ -107,23 +107,11 @@ void setup_ccp_connection(mtcp_manager_t mtcp) { unlink(local.sun_path); path_len = strlen(local.sun_path) + sizeof(local.sun_family); if (bind(recv_sock, (struct sockaddr *)&local, path_len) == -1) { - TRACE_ERROR("failed to bind to unix://%s%d\n", FROM_CCP_PREFIX, cpu); + TRACE_ERROR("failed to bind to unix://%s%d because %s\n", FROM_CCP_PREFIX, cpu, strerror(errno)); exit(-1); } mtcp->from_ccp = recv_sock; - if ((send_sock = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1) { - TRACE_ERROR("failed to create unix send socket for ccp comm\n"); - exit(-1); - } - remote.sun_family = AF_UNIX; - strcpy(remote.sun_path, TO_CCP_PREFIX);//TODO:CCP - path_len = strlen(remote.sun_path) + sizeof(remote.sun_family); - if (connect(send_sock, (struct sockaddr *)&remote, path_len) == -1) { - TRACE_ERROR("failed to connect to unix://%s\n", TO_CCP_PREFIX); - exit(-1); - } - mtcp->to_ccp = send_sock; struct ccp_datapath dp = { .set_cwnd = &_dp_set_cwnd, @@ -143,6 +131,24 @@ void setup_ccp_connection(mtcp_manager_t mtcp) { } +void setup_ccp_send_socket(mtcp_manager_t mtcp) { + int send_sock; + int path_len; + struct sockaddr_un remote; + if ((send_sock = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1) { + TRACE_ERROR("failed to create unix send socket for ccp comm\n"); + exit(-1); + } + remote.sun_family = AF_UNIX; + strcpy(remote.sun_path, TO_CCP_PREFIX);//TODO:CCP + path_len = strlen(remote.sun_path) + sizeof(remote.sun_family); + if (connect(send_sock, (struct sockaddr *)&remote, path_len) == -1) { + TRACE_ERROR("failed to connect to unix://%s because %s\n", TO_CCP_PREFIX, strerror(errno)); + exit(-1); + } + mtcp->to_ccp = send_sock; +} + void destroy_ccp_connection(mtcp_manager_t mtcp) { ccp_free(); close(mtcp->from_ccp); diff --git a/mtcp/src/core.c b/mtcp/src/core.c index c205c63..69070c7 100644 --- a/mtcp/src/core.c +++ b/mtcp/src/core.c @@ -1112,6 +1112,9 @@ CCPRecvLoopThread(void *arg) { } break; } + if (!mtcp->to_ccp) { + setup_ccp_send_socket(mtcp); + } ccp_read_msg(recvBuf, bytes_recvd); } while(1); } diff --git a/mtcp/src/include/ccp.h b/mtcp/src/include/ccp.h index 403b89d..f2b0eac 100644 --- a/mtcp/src/include/ccp.h +++ b/mtcp/src/include/ccp.h @@ -20,6 +20,7 @@ #define EVENT_ECN 4 void setup_ccp_connection(mtcp_manager_t mtcp); +void setup_ccp_send_socket(mtcp_manager_t mtcp); void destroy_ccp_connection(mtcp_manager_t mtcp); void ccp_create(mtcp_manager_t mtcp, tcp_stream *stream); void ccp_cong_control(mtcp_manager_t mtcp, tcp_stream *stream, uint32_t ack, uint64_t bytes_delivered, uint64_t packets_delivered); diff --git a/mtcp/src/libccp b/mtcp/src/libccp index 5f91d69..68cce87 160000 --- a/mtcp/src/libccp +++ b/mtcp/src/libccp @@ -1 +1 @@ -Subproject commit 5f91d69f09c4eb4cd1c066f512cc3b24ef02a09b +Subproject commit 68cce87ae82008371d101ff56df971d24ec6acdd