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,