/* Update router table */ void router_update(tc_ip_header_t *ip_header, int len) { void *fd; uint32_t size_ip; uint64_t key; msg_server_t msg; struct tcphdr *tcp_header; size_ip = ip_header->ihl << 2; tcp_header = (struct tcphdr*)((char *)ip_header + size_ip); memcpy(&msg, ip_header, len); key = get_key(ip_header->daddr, tcp_header->dest); pthread_mutex_lock(&mutex); fd = hash_find(table, key); if ( NULL == fd ) { tc_log((LOG_DEBUG), 0, "fd is null"); delay_table_add(key, &msg); pthread_mutex_unlock(&mutex); return ; } pthread_mutex_unlock(&mutex); tc_socket_send((int) (long) fd, (char *) &msg, MSG_SERVER_SIZE); }
/* Update router table */ void router_update(struct iphdr *ip_header) { void *fd; uint32_t size_ip; uint64_t key; msg_server_t msg; struct tcphdr *tcp_header; #if (TCPCOPY_MYSQL_ADVANCED) uint32_t size_tcp, cont_len, tot_len; unsigned char *payload; #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 = (struct tcphdr*)((char *)ip_header + size_ip); memset(&msg, 0, sizeof(struct msg_server_s)); memcpy((void *) &(msg.ip_header), ip_header, sizeof(struct iphdr)); memcpy((void *) &(msg.tcp_header), tcp_header, sizeof(struct tcphdr)); #if (TCPCOPY_MYSQL_ADVANCED) tot_len = ntohs(ip_header->tot_len); size_tcp = tcp_header->doff << 2; 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) { /* * Only transfer payload if content length is less * than MAX_PAYLOAD_LEN */ memcpy((void *) &(msg.payload), payload, cont_len); } } #endif key = get_key(ip_header->daddr, tcp_header->dest); fd = hash_find(table, key); if ( NULL == fd ) { tc_log_debug0(LOG_DEBUG, 0, "fd is null"); delay_table_add(key, &msg); return ; } tc_socket_send((int) (long) fd, (char *) &msg, MSG_SERVER_SIZE); }
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 }