Exemple #1
0
/**
 * Print odp packets
 *
 * @param  thr worker id
 * @param  pkt_tbl packets to be print
 * @param  len packet number
 */
static void print_pkts(int thr, odp_packet_t pkt_tbl[], unsigned len)
{
	odp_packet_t pkt;
	char *buf;
	odph_ipv4hdr_t *ip;
	odph_icmphdr_t *icmp;
	struct timeval tvrecv;
	struct timeval tvsend;
	double rtt;
	unsigned i;
	size_t offset;
	char msg[1024];
	int rlen;
	for (i = 0; i < len; ++i) {
		pkt = pkt_tbl[i];
		rlen = 0;

		/* only ip pkts */
		if (!odp_packet_has_ipv4(pkt))
			continue;

		odp_atomic_inc_u64(&counters.ip);
		buf = odp_packet_data(pkt);
		ip = (odph_ipv4hdr_t *)(buf + odp_packet_l3_offset(pkt));
		offset = odp_packet_l4_offset(pkt);

		/* udp */
		if (ip->proto == ODPH_IPPROTO_UDP) {
			odp_atomic_inc_u64(&counters.udp);
		}

		/* icmp */
		if (ip->proto == ODPH_IPPROTO_ICMP) {
			icmp = (odph_icmphdr_t *)(buf + offset);
			/* echo reply */
			if (icmp->type == ICMP_ECHOREPLY) {
				odp_atomic_inc_u64(&counters.icmp);
				memcpy(&tvsend, buf + offset + ODPH_ICMPHDR_LEN,
				       sizeof(struct timeval));
				/* TODO This should be changed to use an
				 * ODP timer API once one exists. */
				gettimeofday(&tvrecv, NULL);
				tv_sub(&tvrecv, &tvsend);
				rtt = tvrecv.tv_sec*1000 + tvrecv.tv_usec/1000;
				rlen += sprintf(msg + rlen,
					"ICMP Echo Reply seq %d time %.1f ",
					odp_be_to_cpu_16(icmp->un.echo.sequence)
					, rtt);
			} else if (icmp->type == ICMP_ECHO) {
				rlen += sprintf(msg + rlen,
						"Icmp Echo Request");
			}

			msg[rlen] = '\0';
			printf("  [%02i] %s\n", thr, msg);
		}
	}
}
proc_result_t pktinf_input(odp_packet_t pkt,void* args){
	proc_result_t result;
	struct pkt_info *info = args;
	result.packet_handle = pkt;
	result.next_action = NA_CONTINUE;
	if(odp_packet_has_ipv4(pkt)){
		odph_ipv4hdr_t* hdr = odp_packet_l3_ptr(pkt,NULL);
		*((uint32be_t*)info->src_ip) = hdr->src_addr;
		*((uint32be_t*)info->dst_ip) = hdr->dst_addr;
	}else if(odp_packet_has_ipv6(pkt)){
		odph_ipv6hdr_t* hdr = odp_packet_l3_ptr(pkt,NULL);
		*((ipv6addr*)info->src_ip) = *((ipv6addr*)hdr->src_addr);
		*((ipv6addr*)info->dst_ip) = *((ipv6addr*)hdr->dst_addr);
	}
	if(odp_packet_has_tcp(pkt)||odp_packet_has_udp(pkt)||odp_packet_has_sctp(pkt)){
		ports p = *((ports*)odp_packet_l4_ptr(pkt,NULL));
		info->src_port = p.src;
		info->dst_port = p.dest;
	}
	return result;
}