示例#1
0
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,&ethertype,&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);
  }*/

}