X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_ip_frag%2Frte_ipv4_reassembly.c;h=e084ca59a64bf48a7ba809758bad15cb416da4e0;hb=775a8cfc46969a4bb0e7206a2e7b2a630f2f0966;hp=cbac413a2ed8a3d2d94268626e1c27d73c432457;hpb=ad942d78c1b5c0fd558ac7c069278c7c37ddaa68;p=dpdk.git diff --git a/lib/librte_ip_frag/rte_ipv4_reassembly.c b/lib/librte_ip_frag/rte_ipv4_reassembly.c index cbac413a2e..e084ca59a6 100644 --- a/lib/librte_ip_frag/rte_ipv4_reassembly.c +++ b/lib/librte_ip_frag/rte_ipv4_reassembly.c @@ -34,7 +34,6 @@ #include #include -#include #include "ip_frag_common.h" @@ -42,11 +41,12 @@ * Reassemble fragments into one packet. */ struct rte_mbuf * -ipv4_frag_reassemble(const struct rte_ip_frag_pkt *fp) +ipv4_frag_reassemble(struct ip_frag_pkt *fp) { struct ipv4_hdr *ip_hdr; struct rte_mbuf *m, *prev; uint32_t i, n, ofs, first_len; + uint32_t curr_idx = 0; first_len = fp->frags[IP_FIRST_FRAG_IDX].len; n = fp->last_idx - 1; @@ -54,6 +54,7 @@ ipv4_frag_reassemble(const struct rte_ip_frag_pkt *fp) /*start from the last fragment. */ m = fp->frags[IP_LAST_FRAG_IDX].mb; ofs = fp->frags[IP_LAST_FRAG_IDX].ofs; + curr_idx = IP_LAST_FRAG_IDX; while (ofs != first_len) { @@ -64,7 +65,13 @@ ipv4_frag_reassemble(const struct rte_ip_frag_pkt *fp) /* previous fragment found. */ if(fp->frags[i].ofs + fp->frags[i].len == ofs) { - ip_frag_chain(fp->frags[i].mb, m); + /* adjust start of the last fragment data. */ + rte_pktmbuf_adj(m, (uint16_t)(m->l2_len + m->l3_len)); + rte_pktmbuf_chain(fp->frags[i].mb, m); + + /* this mbuf should not be accessed directly */ + fp->frags[curr_idx].mb = NULL; + curr_idx = i; /* update our last fragment and offset. */ m = fp->frags[i].mb; @@ -74,28 +81,28 @@ ipv4_frag_reassemble(const struct rte_ip_frag_pkt *fp) /* error - hole in the packet. */ if (m == prev) { - return (NULL); + return NULL; } } /* chain with the first fragment. */ - ip_frag_chain(fp->frags[IP_FIRST_FRAG_IDX].mb, m); + rte_pktmbuf_adj(m, (uint16_t)(m->l2_len + m->l3_len)); + rte_pktmbuf_chain(fp->frags[IP_FIRST_FRAG_IDX].mb, m); m = fp->frags[IP_FIRST_FRAG_IDX].mb; /* update mbuf fields for reassembled packet. */ m->ol_flags |= PKT_TX_IP_CKSUM; /* update ipv4 header for the reassmebled packet */ - ip_hdr = (struct ipv4_hdr*)(rte_pktmbuf_mtod(m, uint8_t *) + - m->pkt.vlan_macip.f.l2_len); + ip_hdr = rte_pktmbuf_mtod_offset(m, struct ipv4_hdr *, m->l2_len); ip_hdr->total_length = rte_cpu_to_be_16((uint16_t)(fp->total_size + - m->pkt.vlan_macip.f.l3_len)); + m->l3_len)); ip_hdr->fragment_offset = (uint16_t)(ip_hdr->fragment_offset & rte_cpu_to_be_16(IPV4_HDR_DF_FLAG)); ip_hdr->hdr_checksum = 0; - return (m); + return m; } /* @@ -119,9 +126,9 @@ rte_ipv4_frag_reassemble_packet(struct rte_ip_frag_tbl *tbl, struct rte_ip_frag_death_row *dr, struct rte_mbuf *mb, uint64_t tms, struct ipv4_hdr *ip_hdr) { - struct rte_ip_frag_pkt *fp; + struct ip_frag_pkt *fp; struct ip_frag_key key; - const uint64_t *psd; + const unaligned_uint64_t *psd; uint16_t ip_len; uint16_t flag_offset, ip_ofs, ip_flag; @@ -129,7 +136,7 @@ rte_ipv4_frag_reassemble_packet(struct rte_ip_frag_tbl *tbl, ip_ofs = (uint16_t)(flag_offset & IPV4_HDR_OFFSET_MASK); ip_flag = (uint16_t)(flag_offset & IPV4_HDR_MF_FLAG); - psd = (uint64_t *)&ip_hdr->src_addr; + psd = (unaligned_uint64_t *)&ip_hdr->src_addr; /* use first 8 bytes only */ key.src_dst[0] = psd[0]; key.id = ip_hdr->packet_id; @@ -137,7 +144,7 @@ rte_ipv4_frag_reassemble_packet(struct rte_ip_frag_tbl *tbl, ip_ofs *= IPV4_HDR_OFFSET_UNITS; ip_len = (uint16_t)(rte_be_to_cpu_16(ip_hdr->total_length) - - mb->pkt.vlan_macip.f.l3_len); + mb->l3_len); IP_FRAG_LOG(DEBUG, "%s:%d:\n" "mbuf: %p, tms: %" PRIu64 @@ -145,14 +152,14 @@ rte_ipv4_frag_reassemble_packet(struct rte_ip_frag_tbl *tbl, "tbl: %p, max_cycles: %" PRIu64 ", entry_mask: %#x, " "max_entries: %u, use_entries: %u\n\n", __func__, __LINE__, - mb, tms, key.src_dst, key.id, ip_ofs, ip_len, ip_flag, + mb, tms, key.src_dst[0], key.id, ip_ofs, ip_len, ip_flag, tbl, tbl->max_cycles, tbl->entry_mask, tbl->max_entries, tbl->use_entries); /* try to find/add entry into the fragment's table. */ if ((fp = ip_frag_find(tbl, dr, &key, tms)) == NULL) { IP_FRAG_MBUF2DR(dr, mb); - return (NULL); + return NULL; } IP_FRAG_LOG(DEBUG, "%s:%d:\n" @@ -161,7 +168,7 @@ rte_ipv4_frag_reassemble_packet(struct rte_ip_frag_tbl *tbl, ", total_size: %u, frag_size: %u, last_idx: %u\n\n", __func__, __LINE__, tbl, tbl->max_entries, tbl->use_entries, - fp, fp->key.src_dst, fp->key.id, fp->start, + fp, fp->key.src_dst[0], fp->key.id, fp->start, fp->total_size, fp->frag_size, fp->last_idx); @@ -176,8 +183,8 @@ rte_ipv4_frag_reassemble_packet(struct rte_ip_frag_tbl *tbl, ", total_size: %u, frag_size: %u, last_idx: %u\n\n", __func__, __LINE__, mb, tbl, tbl->max_entries, tbl->use_entries, - fp, fp->key.src_dst, fp->key.id, fp->start, + fp, fp->key.src_dst[0], fp->key.id, fp->start, fp->total_size, fp->frag_size, fp->last_idx); - return (mb); + return mb; }