Le 02/13/2017 à 01:49 PM, Bogdan Pricope a écrit : > Signed-off-by: Bogdan Pricope <bogdan.pric...@linaro.org> > --- > example/generator/odp_generator.c | 131 > +++++++++++++++++++++++++++++++++----- > 1 file changed, 114 insertions(+), 17 deletions(-) > > diff --git a/example/generator/odp_generator.c > b/example/generator/odp_generator.c > index 8062d87..d1e3ecc 100644 > --- a/example/generator/odp_generator.c > +++ b/example/generator/odp_generator.c > @@ -170,21 +170,20 @@ static int scan_ip(char *buf, unsigned int *paddr) > } > > /** > - * set up an udp packet > + * set up an udp packet reference > * > * @param pool Buffer pool to create packet in > * > * @return Handle of created packet > * @retval ODP_PACKET_INVALID Packet could not be created > */ > -static odp_packet_t pack_udp_pkt(odp_pool_t pool) > +static odp_packet_t setup_udp_pkt_ref(odp_pool_t pool) > { > odp_packet_t pkt; > char *buf; > odph_ethhdr_t *eth; > odph_ipv4hdr_t *ip; > odph_udphdr_t *udp; > - unsigned short seq; > > pkt = odp_packet_alloc(pool, args->appl.payload + ODPH_UDPHDR_LEN + > ODPH_IPV4HDR_LEN + ODPH_ETHHDR_LEN); > @@ -200,8 +199,10 @@ static odp_packet_t pack_udp_pkt(odp_pool_t pool) > memcpy((char *)eth->src.addr, args->appl.srcmac.addr, ODPH_ETHADDR_LEN); > memcpy((char *)eth->dst.addr, args->appl.dstmac.addr, ODPH_ETHADDR_LEN); > eth->type = odp_cpu_to_be_16(ODPH_ETHTYPE_IPV4); > + > /* ip */ > odp_packet_l3_offset_set(pkt, ODPH_ETHHDR_LEN); > + odp_packet_has_ipv4_set(pkt, 1); > ip = (odph_ipv4hdr_t *)(buf + ODPH_ETHHDR_LEN); > ip->dst_addr = odp_cpu_to_be_32(args->appl.dstip); > ip->src_addr = odp_cpu_to_be_32(args->appl.srcip); > @@ -209,12 +210,13 @@ static odp_packet_t pack_udp_pkt(odp_pool_t pool) > ip->tot_len = odp_cpu_to_be_16(args->appl.payload + ODPH_UDPHDR_LEN + > ODPH_IPV4HDR_LEN); > ip->proto = ODPH_IPPROTO_UDP; > - seq = odp_atomic_fetch_add_u64(&counters.seq, 1) % 0xFFFF; > - ip->id = odp_cpu_to_be_16(seq); > + ip->id = 0; > + ip->ttl = 64; > ip->chksum = 0; > - odph_ipv4_csum_update(pkt); > + > /* udp */ > odp_packet_l4_offset_set(pkt, ODPH_ETHHDR_LEN + ODPH_IPV4HDR_LEN); > + odp_packet_has_udp_set(pkt, 1); > udp = (odph_udphdr_t *)(buf + ODPH_ETHHDR_LEN + ODPH_IPV4HDR_LEN); > udp->src_port = 0; > udp->dst_port = 0; > @@ -226,27 +228,60 @@ static odp_packet_t pack_udp_pkt(odp_pool_t pool) > } > The calls to odp_packet_has_ipv4_set and odp_packet_has_udp_set are actually a bug fix needed to have the proper checksum computations. Without these calls, the checksum are set to 0 as all the packet parse flags are 0.
It might be worth splitting this into a specific patch. I posted one for monarch without any answer to it, but it's something that should be put in all branches as it's a bug fix. Nicolas