/* replicate packets for multiple-copying */ static void replicate_packs(char *packet, int length, int replica_num) { int i; uint16_t orig_port, addition, dest_port, rand_port; uint32_t size_ip; tc_tcp_header_t *tcp_header; tc_ip_header_t *ip_header; ip_header = (tc_ip_header_t *) packet; size_ip = ip_header->ihl << 2; tcp_header = (tc_tcp_header_t *) ((char *) ip_header + size_ip); rand_port = clt_settings.rand_port_shifted; orig_port = ntohs(tcp_header->source); tc_log_debug1(LOG_DEBUG, 0, "orig port:%u", orig_port); for (i = 1; i < replica_num; i++) { addition = (((i << 1) - 1) << 5) + rand_port; dest_port = get_appropriate_port(orig_port, addition); tcp_header->source = htons(dest_port); process_packet(true, packet, length); tc_log_debug2(LOG_DEBUG, 0, "new port:%u,add:%u", dest_port, addition); } }
static void replicate_packs(unsigned char *frame, int frame_len, int replica_num) { int i; uint32_t size_ip; uint16_t orig_port, addition, dest_port, rand_port; unsigned char *packet; tc_ip_header_t *ip_header; tc_udp_header_t *udp_header; packet = frame + ETHERNET_HDR_LEN; ip_header = (tc_ip_header_t *) packet; size_ip = ip_header->ihl << 2; udp_header = (tc_udp_header_t *) ((char *) ip_header + size_ip); orig_port = ntohs(udp_header->source); tc_log_debug1(LOG_DEBUG, 0, "orig port:%u", orig_port); rand_port = clt_settings.rand_port_shifted; for (i = 1; i < replica_num; i++) { addition = (((i << 1) - 1) << 5) + rand_port; dest_port = get_appropriate_port(orig_port, addition); tc_log_debug2(LOG_DEBUG, 0, "new port:%u,add:%u", dest_port, addition); udp_header->source = htons(dest_port); process_packet(true, frame, frame_len); } }