/* send delayed message according to the key */ void delay_table_send(uint64_t key, int fd) { link_list *msg_list; p_link_node first; msg_server_t *msg ; msg_list = (link_list *) hash_find(table, key); if (msg_list == NULL) { return; } while (!link_list_is_empty(msg_list)) { first = link_list_pop_first(msg_list); msg = (first->data); #if (INTERCEPT_COMBINED) buffer_and_send(fd, fd, msg); #else tc_socket_send(fd, (char *) msg, MSG_SERVER_SIZE); #endif msg_delay_sent_cnt++; msg_item_free_cnt++; link_node_internal_free(first); free(first); } }
void send_buffered_packets() { int i; for (i = 0; i <= srv_settings.max_fd; i++) { if (srv_settings.tunnel[i].fd_valid) { buffer_and_send(i, NULL); } } }
void send_buffered_packets(time_t cur_time) { int i; for (i = 0; i <= max_fd; i++) { if (combined[i] != NULL) { buffer_and_send(srv_settings.router_fd, i, NULL); } } }
void router_update(int main_router_fd, tc_ip_header_t *ip_header) { #if (!TCPCOPY_SINGLE) void *fd; uint64_t key; #endif uint32_t size_ip, size_tcp, new_size_tcp; msg_server_t msg; tc_tcp_header_t *tcp_header; #if (TCPCOPY_MYSQL_ADVANCED) uint32_t cont_len, tot_len, new_tot_len; unsigned char *payload, *p; #endif #if (TCPCOPY_SINGLE) if (main_router_fd == 0) { return; } #endif if (ip_header->protocol != IPPROTO_TCP) { tc_log_info(LOG_INFO, 0, "this is not a tcp packet"); return; } size_ip = ip_header->ihl << 2; tcp_header = (tc_tcp_header_t *) ((char *) ip_header + size_ip); size_tcp = tcp_header->doff << 2; #if (TCPCOPY_MYSQL_ADVANCED) tot_len = ntohs(ip_header->tot_len); #endif memset(&msg, 0, sizeof(struct msg_server_s)); new_size_tcp = size_tcp; if (size_tcp > TCP_HEADER_MIN_LEN) { set_wscale(tcp_header); new_size_tcp = tcp_header->doff << 2; #if (TCPCOPY_MYSQL_ADVANCED) new_tot_len = tot_len - (size_tcp - new_size_tcp); ip_header->tot_len = htons(new_tot_len); #endif } memcpy((void *) &(msg.ip_header), ip_header, sizeof(tc_ip_header_t)); memcpy((void *) &(msg.tcp_header), tcp_header, new_size_tcp); #if (TCPCOPY_MYSQL_ADVANCED) cont_len = tot_len - size_ip - size_tcp; if (cont_len > 0) { payload = (unsigned char *) ((char *) tcp_header + size_tcp); if (cont_len <= MAX_PAYLOAD_LEN) { p = ((unsigned char *) &(msg.tcp_header)) + new_size_tcp; /* * only transfer payload if content length is less * than MAX_PAYLOAD_LEN */ memcpy((void *) p, payload, cont_len); } } #endif #if (!TCPCOPY_SINGLE) key = get_key(ip_header->daddr, tcp_header->dest); fd = hash_find(table, key); if (fd == NULL) { if (!tcp_header->syn) { tc_log_info(LOG_NOTICE, 0, "fd is null after session is created"); tc_log_trace(LOG_NOTICE, 0, BACKEND_FLAG, ip_header, tcp_header); } tc_log_debug0(LOG_DEBUG, 0, "fd is null"); fd_null_cnt++; delay_table_add(key, &msg); return ; } #endif tc_log_debug_trace(LOG_NOTICE, 0, BACKEND_FLAG, ip_header, tcp_header); #if (INTERCEPT_COMBINED) #if (!TCPCOPY_SINGLE) buffer_and_send(main_router_fd, (int) (long) fd, &msg); #else buffer_and_send(main_router_fd, main_router_fd, &msg); #endif #else #if (!TCPCOPY_SINGLE) tc_socket_send((int) (long) fd, (char *) &msg, MSG_SERVER_SIZE); #else tc_socket_send(main_router_fd, (char *) &msg, MSG_SERVER_SIZE); #endif #endif }
/* update router table */ void router_update(int main_router_fd, tc_ip_header_t *ip_header, int len) { #if (!TCPCOPY_SINGLE) void *fd; uint64_t key; #endif uint32_t size_ip; msg_server_t msg; tc_tcp_header_t *tcp_header; #if (TCPCOPY_SINGLE) if (main_router_fd == 0) { return; } #endif if (ip_header->protocol != IPPROTO_TCP) { tc_log_info(LOG_INFO, 0, "this is not a tcp packet"); return; } size_ip = ip_header->ihl << 2; tcp_header = (tc_tcp_header_t *) ((char *) ip_header + size_ip); tc_log_debug1(LOG_DEBUG, 0, "router update:%u", ntohs(tcp_header->source)); memcpy(&msg, ip_header, len); #if (!TCPCOPY_SINGLE) key = get_key(ip_header->daddr, tcp_header->dest); pthread_mutex_lock(&mutex); fd = hash_find(table, key); if (fd == NULL) { if (!tcp_header->syn) { tc_log_info(LOG_NOTICE, 0, "fd is null after session is created"); tc_log_trace(LOG_NOTICE, 0, BACKEND_FLAG, ip_header, tcp_header); } tc_log_debug0(LOG_DEBUG, 0, "fd is null"); fd_null_cnt++; delay_table_add(key, &msg); pthread_mutex_unlock(&mutex); return ; } pthread_mutex_unlock(&mutex); #endif tc_log_debug_trace(LOG_NOTICE, 0, BACKEND_FLAG, ip_header, tcp_header); #if (INTERCEPT_COMBINED) #if (!TCPCOPY_SINGLE) buffer_and_send(main_router_fd, (int) (long) fd, &msg); #else buffer_and_send(main_router_fd, main_router_fd, &msg); #endif #else #if (!TCPCOPY_SINGLE) tc_socket_send((int) (long) fd, (char *) &msg, MSG_SERVER_SIZE); #else tc_socket_send(main_router_fd, (char *) &msg, MSG_SERVER_SIZE); #endif #endif }
void router_update(int old, int main_router_fd, tc_ip_header_t *ip_header) { #if (!TCPCOPY_SINGLE) int fd; uint32_t key; #endif uint32_t size_ip, size_tcp, tot_len; msg_server_t msg; tc_tcp_header_t *tcp_header; #if (TCPCOPY_MYSQL_ADVANCED) uint32_t cont_len; unsigned char *payload, *p; #endif #if (TCPCOPY_SINGLE) if (main_router_fd == 0) { return; } #endif if (ip_header->protocol != IPPROTO_TCP) { tc_log_info(LOG_INFO, 0, "this is not a tcp packet"); return; } size_ip = ip_header->ihl << 2; tcp_header = (tc_tcp_header_t *) ((char *) ip_header + size_ip); size_tcp = tcp_header->doff << 2; tot_len = ntohs(ip_header->tot_len); memset(&msg, 0, sizeof(struct msg_server_s)); memcpy((void *) &(msg.ip_header), ip_header, sizeof(tc_ip_header_t)); memcpy((void *) &(msg.tcp_header), tcp_header, size_tcp); #if (TCPCOPY_MYSQL_ADVANCED) cont_len = tot_len - size_ip - size_tcp; if (cont_len > 0) { payload = (unsigned char *) ((char *) tcp_header + size_tcp); if (cont_len <= MAX_PAYLOAD_LEN) { p = ((unsigned char *) &(msg.tcp_header)) + size_tcp; memcpy((void *) p, payload, cont_len); } } #endif #if (!TCPCOPY_SINGLE) key = get_route_key(old, ip_header->daddr, tcp_header->dest, ip_header->saddr, tcp_header->source); fd = router_get(key); if (fd <= 0) { if (tcp_header->syn || tcp_header->rst) { if (tcp_header->rst) { tc_log_info(LOG_NOTICE, 0, "reset from tcp"); } tc_log_debug0(LOG_DEBUG, 0, "fd is null"); delay_table_add(key, &msg); return ; } else { tc_log_info(LOG_NOTICE, 0, "fd is null after session is created"); tc_log_trace(LOG_NOTICE, 0, BACKEND_FLAG, ip_header, tcp_header); return; } } #endif tc_log_debug_trace(LOG_NOTICE, 0, BACKEND_FLAG, ip_header, tcp_header); #if (INTERCEPT_COMBINED) #if (!TCPCOPY_SINGLE) buffer_and_send(main_router_fd, (int) (long) fd, &msg); #else buffer_and_send(main_router_fd, main_router_fd, &msg); #endif #else #if (!TCPCOPY_SINGLE) tc_socket_send((int) (long) fd, (char *) &msg, MSG_SERVER_SIZE); #else tc_socket_send(main_router_fd, (char *) &msg, MSG_SERVER_SIZE); #endif #endif }