From: Matias Elo <matias....@nokia.com>

Use more realistic MTU value. The value is also checked in TX.

Signed-off-by: Matias Elo <matias....@nokia.com>
---
/** Email created from pull request 397 (matiaselo:dev/pktio_fixes)
 ** https://github.com/Linaro/odp/pull/397
 ** Patch: https://github.com/Linaro/odp/pull/397.patch
 ** Base sha: 520c170d758f2d37554631bf1467ec50e027cd3e
 ** Merge commit sha: 926e7716387610a8be67fbc051845450640f8df6
 **/
 platform/linux-generic/pktio/loop.c | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/platform/linux-generic/pktio/loop.c 
b/platform/linux-generic/pktio/loop.c
index 784fa798f..9a2eb4358 100644
--- a/platform/linux-generic/pktio/loop.c
+++ b/platform/linux-generic/pktio/loop.c
@@ -25,6 +25,7 @@
 #include <stdlib.h>
 
 #define MAX_LOOP 16
+#define LOOP_MTU (64 * 1024)
 
 /* MAC address for the "loop" interface */
 static const char pktio_loop_mac[] = {0x02, 0xe9, 0x34, 0x80, 0x73, 0x01};
@@ -176,6 +177,7 @@ static int loopback_send(pktio_entry_t *pktio_entry, int 
index ODP_UNUSED,
        queue_t queue;
        int i;
        int ret;
+       int nb_tx = 0;
        uint32_t bytes = 0;
        uint32_t out_octets_tbl[len];
 
@@ -183,12 +185,22 @@ static int loopback_send(pktio_entry_t *pktio_entry, int 
index ODP_UNUSED,
                len = QUEUE_MULTI_MAX;
 
        for (i = 0; i < len; ++i) {
+               uint32_t pkt_len = odp_packet_len(pkt_tbl[i]);
+
+               if (pkt_len > LOOP_MTU) {
+                       if (nb_tx == 0) {
+                               __odp_errno = EMSGSIZE;
+                               return -1;
+                       }
+                       break;
+               }
                hdr_tbl[i] = packet_to_buf_hdr(pkt_tbl[i]);
-               bytes += odp_packet_len(pkt_tbl[i]);
+               bytes += pkt_len;
                out_octets_tbl[i] = bytes;
+               nb_tx++;
        }
 
-       for (i = 0; i < len; ++i) {
+       for (i = 0; i < nb_tx; ++i) {
                odp_ipsec_packet_result_t result;
 
                if (packet_subtype(pkt_tbl[i]) ==
@@ -204,7 +216,7 @@ static int loopback_send(pktio_entry_t *pktio_entry, int 
index ODP_UNUSED,
        odp_ticketlock_lock(&pktio_entry->s.txl);
 
        queue = queue_fn->from_ext(pktio_entry->s.pkt_loop.loopq);
-       ret = queue_fn->enq_multi(queue, hdr_tbl, len);
+       ret = queue_fn->enq_multi(queue, hdr_tbl, nb_tx);
 
        if (ret > 0) {
                pktio_entry->s.stats.out_ucast_pkts += ret;
@@ -221,8 +233,7 @@ static int loopback_send(pktio_entry_t *pktio_entry, int 
index ODP_UNUSED,
 
 static uint32_t loopback_mtu_get(pktio_entry_t *pktio_entry ODP_UNUSED)
 {
-       /* the loopback interface imposes no maximum transmit size limit */
-       return INT_MAX;
+       return LOOP_MTU;
 }
 
 static int loopback_mac_addr_get(pktio_entry_t *pktio_entry ODP_UNUSED,

Reply via email to