Index: /branches/rel_apv_10_7_2_17_sidra/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_if_dpdk.c
===================================================================
--- /branches/rel_apv_10_7_2_17_sidra/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_if_dpdk.c	(revision 39161)
+++ /branches/rel_apv_10_7_2_17_sidra/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_if_dpdk.c	(working copy)
@@ -873,8 +873,9 @@
 
 }
 
+#define MAX_FRAG_BURST	256
 static int
-if_dpdk_send_ipv4_frag(struct if_dpdk_softc *sc, int queue_id, int nb_pkts, struct mbuf **frag_arr)
+if_dpdk_send_ipv4_frag(struct if_dpdk_softc *sc, int queue_id, int nb_pkts, struct mbuf **frag_arr, uint16_t index)
 {
 	int i,j,ret;
 	struct mbuf *m;
@@ -884,18 +885,18 @@
 	void *rm_arr_segs[MAX_MBUF_SEGS_NUM];
 
 	for (i = 0; i < nb_pkts; ++i) {
-		m = frag_arr[i];
+		m = frag_arr[index + i];
 		if (i + 1 != nb_pkts) {
-			prefetch0(frag_arr[i+1]->m_data);
+			prefetch0(frag_arr[index + i + 1]->m_data);
 		}
 
 		m = m_pull(m, m->m_pkthdr.l2hlen + m->m_pkthdr.l3hlen + m->m_pkthdr.l4hlen );
 		if (m == NULL) {
-			frag_arr[i] = NULL;
+			frag_arr[index + i] = NULL;
 			goto send;
 		}
 
-		frag_arr[i] = m;
+		frag_arr[index + i] = m;
 
 		ret = if_dpdk_eth_alloc_mbuf_head(sc->dpdk_host_ctx, queue_id, rm_arr_segs, 1);
 		if (ret < 0) {
@@ -930,8 +931,8 @@
 	if (i < nb_pkts) {
 		/* free left mbufs, and send good rte_mbufs*/
 		for (j = i; j < nb_pkts; ++j) {
-			if (frag_arr[j]) {
-				m_freem_atcp(frag_arr[j]);
+			if (frag_arr[index + j]) {
+				m_freem_atcp(frag_arr[index + j]);
 			}
 		}
 	}
@@ -960,7 +961,7 @@
 
 //Function to create IP fragments from an mbuf chain
 static int
-create_ipv4_fragments(struct mbuf *m, uint16_t mtu, struct mbuf **frag_arr)
+create_ipv4_fragments(struct mbuf *m, uint16_t mtu, struct mbuf **frag_arr, uint16_t *nfrag)
 {
 	struct ip *ip = NULL;
 	struct tcphdr *tcph = NULL;
@@ -970,6 +971,7 @@
 	uint16_t frag_pload_len, offset;
 	uint16_t i, l2_len, frag_count;
 	uint16_t pload_len, iphl , tcpl;
+	uint16_t index = *nfrag;
 
 	//extract ethernet header + ip header
 	eh = mtod(m, struct ether_header *);
@@ -1011,9 +1013,17 @@
 		if (!frag) {
 			printf("Error: Failed to allocate mbuf for fragment\n");
 			for (int j =0; j<i ;j++)
-				m_free(frag_arr[j]);
+				m_freem_atcp(frag_arr[index + j]);
 			return 0;
 		}
+
+		if (index + i == MAX_FRAG_BURST) {
+			printf("frag array overflow \n");
+			for (int j =0; j<i ;j++)
+				m_freem_atcp(frag_arr[index + j]);
+			return 0;
+		}
+
 		// Copy Ethernet header + IP header
 		if (ether_type == ETHERTYPE_VLAN) {
 			frag_eh_vlan = mtod(frag, struct ether_vlan_header *);
@@ -1057,14 +1067,13 @@
 		m_copydata(m, l2_len + iphl + offset, this_frag_size, (caddr_t)((caddr_t)frag_ip + iphl));
 
 		// Add fragment to array
-		frag_arr[i] = frag;
+		frag_arr[index + i] = frag;
 		offset += this_frag_size;
 	}
-
+	*nfrag = index + i;
 	return frag_count;
 }
 
-
 static int
 if_dpdk_send_mbuf(struct if_dpdk_softc *sc, struct mbuf **m0, int pkts_sent, int queue_id)
 {
@@ -1082,7 +1091,8 @@
 	struct ether_vlan_header *eh_vlan = NULL;
 	uint16_t l2_len = 0;
 	uint16_t mtu = 0;
-	struct mbuf *frag_arr[8];
+	uint16_t nfrag = 0;
+	struct mbuf *frag_arr[MAX_FRAG_BURST];
 
 	mtu = sc->ifp->if_mtu;
 	for (i = 0; i < pkts_sent; ++i) {
@@ -1147,13 +1157,13 @@
 		if (ip_frag_reass == 1) {
 			ip = (struct ip *)(mtod(m, u_char *) + l2_len);
 			if ((ip->ip_v == IPv4) && (ip->ip_p == IPPROTO_TCP) && (ntohs(ip->ip_len) > mtu)) {
-				uint16_t nfrag = create_ipv4_fragments(m , mtu, frag_arr);
-				if (nfrag) {
-					int ret = if_dpdk_send_ipv4_frag(sc, queue_id, nfrag, frag_arr);
+				uint16_t count = create_ipv4_fragments(m , mtu, frag_arr, &nfrag);
+				if (count) {
+					m_freem_atcp(m);
+				//	int ret = if_dpdk_send_ipv4_frag(sc, queue_id, nfrag, frag_arr);
 					for (j = i; j+1 < pkts_sent; ++j)
 						m0[j] = m0[j+1];
 					--i ; --pkts_sent;
-					m_freem_atcp(m);
 					continue;
 				} else {
 					printf("IP fragmenation Failed \n");
@@ -1207,10 +1217,25 @@
 			}
 		}
 	}
-	
+
+	int psend = 0;
+	if (nfrag) {
+		uint16_t offset = 0;
+		uint16_t npkt = 0;
+
+		while ( offset < nfrag ) {
+			npkt = (nfrag - offset) > MAX_PKT_BURST ? MAX_PKT_BURST : (nfrag - offset);
+			psend += if_dpdk_send_ipv4_frag(sc, queue_id, npkt, frag_arr, offset);
+			offset += npkt;
+		}
+	}
+
 	if (i) {
-		return if_dpdk_eth_send_pkts(sc->dpdk_host_ctx, queue_id, rm_arr, i);
+		psend += if_dpdk_eth_send_pkts(sc->dpdk_host_ctx, queue_id, rm_arr, i);
+		return psend;
 	} else {
+		if (psend)
+			return psend;
 		return -1;
 	}
 
