X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_gso%2Fgso_udp4.c;h=5d0186aa240b777d3d122c0549de3d5f2bbace94;hb=3127f99274b679124658afdbfc49210730c50617;hp=927dee1213815c296887fa64c6d156f833d54806;hpb=b166d4f30b667b054bdd8bd1cbf30610061f8cc0;p=dpdk.git diff --git a/lib/librte_gso/gso_udp4.c b/lib/librte_gso/gso_udp4.c index 927dee1213..5d0186aa24 100644 --- a/lib/librte_gso/gso_udp4.c +++ b/lib/librte_gso/gso_udp4.c @@ -11,7 +11,7 @@ static inline void update_ipv4_udp_headers(struct rte_mbuf *pkt, struct rte_mbuf **segs, uint16_t nb_segs) { - struct ipv4_hdr *ipv4_hdr; + struct rte_ipv4_hdr *ipv4_hdr; uint16_t frag_offset = 0, is_mf; uint16_t l2_hdrlen = pkt->l2_len, l3_hdrlen = pkt->l3_len; uint16_t tail_idx = nb_segs - 1, length, i; @@ -22,8 +22,8 @@ update_ipv4_udp_headers(struct rte_mbuf *pkt, struct rte_mbuf **segs, * length. */ for (i = 0; i < nb_segs; i++) { - ipv4_hdr = rte_pktmbuf_mtod_offset(segs[i], struct ipv4_hdr *, - l2_hdrlen); + ipv4_hdr = rte_pktmbuf_mtod_offset(segs[i], + struct rte_ipv4_hdr *, l2_hdrlen); length = segs[i]->pkt_len - l2_hdrlen; ipv4_hdr->total_length = rte_cpu_to_be_16(length); @@ -42,18 +42,17 @@ gso_udp4_segment(struct rte_mbuf *pkt, struct rte_mbuf **pkts_out, uint16_t nb_pkts_out) { - struct ipv4_hdr *ipv4_hdr; + struct rte_ipv4_hdr *ipv4_hdr; uint16_t pyld_unit_size, hdr_offset; uint16_t frag_off; int ret; /* Don't process the fragmented packet */ - ipv4_hdr = rte_pktmbuf_mtod_offset(pkt, struct ipv4_hdr *, + ipv4_hdr = rte_pktmbuf_mtod_offset(pkt, struct rte_ipv4_hdr *, pkt->l2_len); frag_off = rte_be_to_cpu_16(ipv4_hdr->fragment_offset); if (unlikely(IS_FRAGMENTED(frag_off))) { - pkts_out[0] = pkt; - return 1; + return 0; } /* @@ -65,11 +64,13 @@ gso_udp4_segment(struct rte_mbuf *pkt, /* Don't process the packet without data. */ if (unlikely(hdr_offset + pkt->l4_len >= pkt->pkt_len)) { - pkts_out[0] = pkt; - return 1; + return 0; } - pyld_unit_size = gso_size - hdr_offset; + /* pyld_unit_size must be a multiple of 8 because frag_off + * uses 8 bytes as unit. + */ + pyld_unit_size = (gso_size - hdr_offset) & ~7U; /* Segment the payload */ ret = gso_do_segment(pkt, hdr_offset, pyld_unit_size, direct_pool,