static void per_packet(libtrace_packet_t *packet) { struct sockaddr_storage addr; struct sockaddr *addr_ptr; uint16_t port; uint8_t *mac; /* Get the source mac */ mac = trace_get_source_mac(packet); /* If this packet does not contain a MAC address, print "NULL" */ if (mac == NULL) printf("NULL "); else print_mac(mac); /* Get the source IP address */ /* Note that we pass a casted sockaddr_storage into this function. This * is because we do not know if the IP address we get back will be a * v4 or v6 address. v6 addresses are much larger than v4 addresses and * will not fit within a sockaddr_in structure used for storing IPv4 * addresses, leading to memory corruption and segmentation faults. * * The safest way to avoid this problem is to use a sockaddr_storage * which is guaranteed to be large enough to contain any known address * format. */ addr_ptr = trace_get_source_address(packet, (struct sockaddr *)&addr); /* No IP address? Print "NULL" instead */ if (addr_ptr == NULL) printf("NULL "); else print_ip(addr_ptr); /* Get the source port */ port = trace_get_source_port(packet); /* If the port is zero, libtrace has told us that there is no * legitimate port number present in the packet */ if (port == 0) printf("NULL\n"); else /* Port numbers are simply 16 bit values so we don't need to * do anything special to print them. trace_get_source_port() * even converts it into host byte order for us */ printf("%u\n", port); }
static int per_packet(libtrace_packet_t * pkt, FILE * fp_write, struct time_adjust_record * time_adjust_flow) { // Create a new packet which is a copy of the old packet. //libtrace_packet_t *copy_pkt = trace_copy_packet(pkt); libtrace_ip_t *ip = trace_get_ip(pkt); libtrace_ip6_t *ip6 = trace_get_ip6(pkt); struct sockaddr_storage src_addr; struct sockaddr_storage dest_addr; struct sockaddr *src_addr_ptr; struct sockaddr *dest_addr_ptr; /* L3 data */ void *l3; uint16_t ethertype; /* Transport data */ void *transport; uint8_t proto; /* Payload data */ uint32_t remaining; struct timeval ts; //printf("In per_packet line:%d\n", __LINE__); l3 = trace_get_layer3(pkt,ðertype,&remaining); if (!l3) { /* Probable ARP or something */ return; } /* Get the UDP/TCP/ICMP header from the IPv4/IPv6 packet */ /*switch (ethertype) { case 0x0800: transport = trace_get_payload_from_ip( (libtrace_ip_t*)l3, &proto, &remaining); if (!transport) return; //++v4; break; case 0x86DD: transport = trace_get_payload_from_ip6( (libtrace_ip6_t*)l3, &proto, &remaining); if (!transport) return; //++v6; break; default: return; }*/ // Get packet information //get port numbers int src_port = trace_get_source_port(pkt); int dest_port = trace_get_destination_port(pkt); src_addr_ptr = trace_get_source_address(pkt, (struct sockaddr *) &src_addr); dest_addr_ptr = trace_get_destination_address(pkt, (struct sockaddr *) &dest_addr); if( (NULL == src_addr_ptr) || (NULL == dest_addr_ptr) ) { //printf("In per_packet line:%d\n", __LINE__); return; } //get source ip address char src_ip[100]; if (src_addr_ptr->sa_family == AF_INET) { struct sockaddr_in *src_v4 = (struct sockaddr_in *) src_addr_ptr; inet_ntop(AF_INET, &(src_v4->sin_addr), src_ip, 100); } //get destination ip address char dest_ip[100]; if (dest_addr_ptr->sa_family == AF_INET) { struct sockaddr_in *dest_v4 = (struct sockaddr_in *) dest_addr_ptr; inet_ntop(AF_INET, &(dest_v4->sin_addr), dest_ip, 100); } ts = trace_get_timeval(pkt); struct timeval ts_adjust; ts_adjust.tv_sec = 0; ts_adjust.tv_usec = 0; //printf("1 %s %d %s %d\n", time_adjust_flow->src_ip, time_adjust_flow->src_port, time_adjust_flow->dest_ip, time_adjust_flow->dest_port); //printf("2 %s %d %s %d\n", src_ip, src_port, dest_ip, dest_port); if( (src_port == time_adjust_flow->src_port) && (strcmp(src_ip, time_adjust_flow->src_ip) == 0) && (dest_port == time_adjust_flow->dest_port) && (strcmp(dest_ip, time_adjust_flow->dest_ip) == 0) ) { //printf("CASE1: in per_packet line:%d\n", __LINE__); if(time_adjust_flow->last_direction == -1) { time_adjust_flow->last_direction = 0; ts_adjust.tv_sec = time_adjust_flow->first_pkt_sec; ts_adjust.tv_usec = time_adjust_flow->first_pkt_usec; } else if(time_adjust_flow->last_direction == 0) //update rtt { //add client inter arrival time if(time_adjust_flow->client_inter_usec + time_adjust_flow->last_tv_usec >= 1000000) { ts_adjust.tv_usec = time_adjust_flow->client_inter_usec + time_adjust_flow->last_tv_usec - 1000000; ts_adjust.tv_sec = time_adjust_flow->client_inter_sec + time_adjust_flow->last_tv_sec + 1; } else { ts_adjust.tv_sec = time_adjust_flow->client_inter_sec + time_adjust_flow->last_tv_sec; ts_adjust.tv_usec = time_adjust_flow->client_inter_usec + time_adjust_flow->last_tv_usec; } } else if(time_adjust_flow->last_direction == 1) { //add reaction time if(time_adjust_flow->reaction_usec + time_adjust_flow->last_tv_usec >= 1000000) { ts_adjust.tv_usec = time_adjust_flow->reaction_usec + time_adjust_flow->last_tv_usec - 1000000; ts_adjust.tv_sec = time_adjust_flow->reaction_sec + time_adjust_flow->last_tv_sec + 1; } else { ts_adjust.tv_usec = time_adjust_flow->reaction_usec + time_adjust_flow->last_tv_usec; ts_adjust.tv_sec = time_adjust_flow->reaction_sec + time_adjust_flow->last_tv_sec; } time_adjust_flow->last_direction = 0; } time_adjust_flow->last_tv_sec = ts_adjust.tv_sec; time_adjust_flow->last_tv_usec = ts_adjust.tv_usec; fprintf(fp_write, "%d, %d\n", time_adjust_flow->last_tv_sec, time_adjust_flow->last_tv_usec); //printf("%d, %d\n", time_adjust_flow->last_tv_sec, time_adjust_flow->last_tv_usec); } if( (src_port == time_adjust_flow->dest_port) && (strcmp(src_ip, time_adjust_flow->dest_ip) == 0) && (dest_port == time_adjust_flow->src_port) && (strcmp(dest_ip, time_adjust_flow->src_ip) == 0) ) { //printf("CASE2 in per_packet line:%d\n", __LINE__); if(time_adjust_flow->last_direction == -1) { time_adjust_flow->last_direction = 1; ts_adjust.tv_sec = time_adjust_flow->first_pkt_sec; ts_adjust.tv_usec = time_adjust_flow->first_pkt_usec; } else if(time_adjust_flow->last_direction == 1) //update rtt { //add server inter arrival time if(time_adjust_flow->server_inter_usec + time_adjust_flow->last_tv_usec >= 1000000) { ts_adjust.tv_usec = time_adjust_flow->server_inter_usec + time_adjust_flow->last_tv_usec - 1000000; ts_adjust.tv_sec = time_adjust_flow->server_inter_sec + time_adjust_flow->last_tv_sec + 1; } else { ts_adjust.tv_usec = time_adjust_flow->server_inter_usec + time_adjust_flow->last_tv_usec; ts_adjust.tv_sec = time_adjust_flow->server_inter_sec + time_adjust_flow->last_tv_sec; } //printf("Pkt: %d, last_tv_sec: %d last_tv_usec: %d, ts.tv_sec: %u, ts.tv_usec: %u, rtt_avg_direct0: %f\n", flow_stats.pkt_count, flow_stats.last_tv_sec, flow_stats.last_tv_usec, ts.tv_sec, ts.tv_usec, flow_stats.rtt_avg_direct1); } else if(time_adjust_flow->last_direction == 0) { // add client RTT if(time_adjust_flow->rtt_usec + time_adjust_flow->last_tv_usec >= 1000000) { ts_adjust.tv_usec = time_adjust_flow->rtt_usec + time_adjust_flow->last_tv_usec - 1000000; ts_adjust.tv_sec = time_adjust_flow->rtt_sec + time_adjust_flow->last_tv_sec + 1; } else { ts_adjust.tv_sec = time_adjust_flow->rtt_sec + time_adjust_flow->last_tv_sec; ts_adjust.tv_usec = time_adjust_flow->rtt_usec + time_adjust_flow->last_tv_usec; } time_adjust_flow->last_direction = 1; } time_adjust_flow->last_tv_sec = ts_adjust.tv_sec; time_adjust_flow->last_tv_usec = ts_adjust.tv_usec; fprintf(fp_write, "%d, %d\n", time_adjust_flow->last_tv_sec, time_adjust_flow->last_tv_usec); //printf("%d, %d\n", time_adjust_flow->last_tv_sec, time_adjust_flow->last_tv_usec); } //trace_destroy_packet(copy_pkt); return 0; /*if ( (strcmp(src_ip, "")) || (strcmp(dest_ip, "")) ) { sprintf(OutputBuffer, "sec: %u, usec: %u, src_ip: %s, src_port: %d, dest_ip: %s, dest_port: %d, pkt_size: %d, remaining: %d", ts.tv_sec, ts.tv_usec, src_ip, src_port, dest_ip, dest_port, pkt_size, remaining); }*/ }