static int tc_msg_event_process(tc_event_t *rev) { msg_client_t msg; if (tc_socket_recv(rev->fd, (char *) &msg, MSG_CLIENT_SIZE) == TC_ERROR) { tc_socket_close(rev->fd); tc_log_info(LOG_NOTICE, 0, "close sock:%d", rev->fd); tc_event_del(rev->loop, rev, TC_EVENT_READ); return TC_ERROR; } switch (msg.type) { case CLIENT_ADD: tc_log_debug1(LOG_DEBUG, 0, "add client router:%u", ntohs(msg.client_port)); router_add(msg.client_ip, msg.client_port, rev->fd); break; case CLIENT_DEL: tc_log_debug1(LOG_DEBUG, 0, "del client router:%u", ntohs(msg.client_port)); router_del(msg.client_ip, msg.client_port); break; } return TC_OK; }
static int tc_process_server_msg(tc_event_t *rev) { #if (TCPCOPY_DR) int i; #endif msg_server_t msg; if (tc_socket_recv(rev->fd, (char *) &msg, MSG_SERVER_SIZE) == TC_ERROR) { tc_log_info(LOG_ERR, 0, "Recv socket(%d)error, server may be closed", rev->fd); #if (TCPCOPY_DR) for (i = 0; i < clt_settings.real_servers.num; i++) { if (clt_settings.real_servers.fds[i] == rev->fd) { if (clt_settings.real_servers.active[i]) { clt_settings.real_servers.active[i] = 0; clt_settings.real_servers.active_num--; } tc_socket_close(rev->fd); tc_log_info(LOG_NOTICE, 0, "close sock:%d", rev->fd); tc_event_del(rev->loop, rev, TC_EVENT_READ); break; } } if (clt_settings.real_servers.active_num == 0) { return TC_ERR_EXIT; } else { return TC_OK; } #else return TC_ERR_EXIT; #endif } process((char *) &msg, REMOTE); return TC_OK; }
static int tc_process_server_msg(tc_event_t *rev) { #if (TCPCOPY_DR) int i, j; connections_t *connections; #endif #if (!TCPCOPY_COMBINED) int len; msg_server_t msg; #else int num, k; unsigned char *p, aggr_resp[COMB_LENGTH + sizeof(uint16_t)]; #endif #if (!TCPCOPY_COMBINED) len = MSG_SERVER_SIZE; #endif #if (!TCPCOPY_COMBINED) if (tc_socket_recv(rev->fd, (char *) &msg, len) == TC_ERROR) #else if (tc_socket_cmb_recv(rev->fd, &num, (char *) aggr_resp) == TC_ERROR) #endif { tc_log_info(LOG_ERR, 0, "Recv socket(%d)error", rev->fd); tc_log_info(LOG_ERR, 0, "server may be closed or"); tc_log_info(LOG_ERR, 0, "backend TCP/IP kernel memeory is too low or"); tc_log_info(LOG_ERR, 0, "the version of intercept may not be equal to the version of tcpcopy"); #if (TCPCOPY_DR) for (i = 0; i < clt_settings.real_servers.num; i++) { connections = &(clt_settings.real_servers.connections[i]); for (j = 0; j < connections->num; j++) { if (connections->fds[j] == rev->fd) { tc_socket_close(rev->fd); tc_log_info(LOG_NOTICE, 0, "close sock:%d", rev->fd); tc_event_del(rev->loop, rev, TC_EVENT_READ); connections->num--; if (connections->num == 0 && clt_settings.real_servers.active[i]) { clt_settings.real_servers.active[i] = 0; clt_settings.real_servers.active_num--; } break; } } } if (clt_settings.real_servers.active_num == 0) { return TC_ERR_EXIT; } else { return TC_OK; } #else return TC_ERR_EXIT; #endif } #if (!TCPCOPY_COMBINED) process_out((unsigned char *) &msg); #else tc_log_debug1(LOG_DEBUG, 0, "resp packets:%d", num); p = aggr_resp + sizeof(uint16_t); for (k = 0; k < num; k++) { process_out(p); p = p + MSG_SERVER_SIZE; } #endif return TC_OK; }
static int tc_msg_event_process(tc_event_t *rev) { int fd, version; msg_client_t msg; fd = rev->fd; memset(&msg, 0, sizeof(msg_client_t)); if (tunnel[fd].first_in) { if (tc_socket_recv(fd, (char *) &msg, MSG_CLIENT_MIN_SIZE) == TC_ERROR) { tc_intercept_close_fd(fd, rev); return TC_ERROR; } version = ntohs(msg.type); tunnel[fd].first_in = 0; if (msg.client_ip != 0 || msg.client_port != 0) { tunnel[fd].clt_msg_size = MSG_CLIENT_MIN_SIZE; tc_log_info(LOG_WARN, 0, "too old tcpcopy for intercept"); srv_settings.old = 1; } else { if (version != INTERNAL_VERSION) { tc_log_info(LOG_WARN, 0, "not compatible,tcpcopy:%d,intercept:%d", msg.type, INTERNAL_VERSION); } tunnel[fd].clt_msg_size = MSG_CLIENT_SIZE; if (tc_socket_recv(fd, ((char *) &msg + MSG_CLIENT_MIN_SIZE), MSG_CLIENT_SIZE - MSG_CLIENT_MIN_SIZE) == TC_ERROR) { tc_intercept_close_fd(fd, rev); return TC_ERROR; } return TC_OK; } } else { if (tc_socket_recv(fd, (char *) &msg, tunnel[fd].clt_msg_size) == TC_ERROR) { tc_intercept_close_fd(fd, rev); return TC_ERROR; } } msg.client_ip = msg.client_ip; msg.client_port = msg.client_port; msg.type = ntohs(msg.type); msg.target_ip = msg.target_ip; msg.target_port = msg.target_port; switch (msg.type) { case CLIENT_ADD: #if (!TCPCOPY_SINGLE) tot_router_items++; tc_log_debug1(LOG_DEBUG, 0, "add client router:%u", ntohs(msg.client_port)); router_add(srv_settings.old, msg.client_ip, msg.client_port, msg.target_ip, msg.target_port, fd); #endif break; case CLIENT_DEL: tc_log_debug1(LOG_DEBUG, 0, "del client router:%u", ntohs(msg.client_port)); break; default: tc_log_info(LOG_WARN, 0, "unknown msg type:%u", msg.type); } return TC_OK; }