This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "".
The branch, master has been updated via b122176ee59494dd957f0f5ff41d4b55a1477e13 (commit) via 22193a06524fa8dc43dfd106cf7eab46745b86f4 (commit) via 6582992616b1d95844d41ba93aeb0bb6c7dd6bd7 (commit) via 5911355121d94a192c9336b036cebb3734a78db2 (commit) via d48d55d846c3e711c2632a66db485f9079a768cf (commit) via 3c2b4804a2c3bca57febe2aea8a56b586c44f035 (commit) via a4767f0cbe844cd7f61f43557f0f90eaa2969192 (commit) via 7915f861ea56bbb0f5a0c22d93a7b4ff6b3c76e2 (commit) via 741bdb906e946d22194ab5676c9ea06e3debb2a1 (commit) from ac8b5f2a26edfa6249e134572a151dbd36c8dce6 (commit)
Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below.
- Log ----------------------------------------------------------------- commit b122176ee59494dd957f0f5ff41d4b55a1477e13 Author: Matias Elo matias.elo@nokia.com Date: Thu Jan 18 16:26:44 2018 +0200
linux-gen: pktio: unify send/recv function argument naming
Use argument named 'num' on all pktio devices to pass the number of packets to receive/transmit.
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/pktio/ipc.c b/platform/linux-generic/pktio/ipc.c index c8880ae9..b6c493ea 100644 --- a/platform/linux-generic/pktio/ipc.c +++ b/platform/linux-generic/pktio/ipc.c @@ -565,13 +565,13 @@ repeat: }
static int ipc_pktio_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - odp_packet_t pkt_table[], int len) + odp_packet_t pkt_table[], int num) { int ret;
odp_ticketlock_lock(&pktio_entry->s.rxl);
- ret = ipc_pktio_recv_lockless(pktio_entry, pkt_table, len); + ret = ipc_pktio_recv_lockless(pktio_entry, pkt_table, num);
odp_ticketlock_unlock(&pktio_entry->s.rxl);
@@ -579,16 +579,16 @@ static int ipc_pktio_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, }
static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry, - const odp_packet_t pkt_table[], int len) + const odp_packet_t pkt_table[], int num) { _ring_t *r; void **rbuf_p; int ret; int i; uint32_t ready = odp_atomic_load_u32(&pktio_entry->s.ipc.ready); - odp_packet_t pkt_table_mapped[len]; /**< Ready to send packet has to be + odp_packet_t pkt_table_mapped[num]; /**< Ready to send packet has to be * in memory mapped pool. */ - uintptr_t offsets[len]; + uintptr_t offsets[num];
if (odp_unlikely(!ready)) return 0; @@ -598,7 +598,7 @@ static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry, /* Copy packets to shm shared pool if they are in different * pool, or if they are references (we can't share across IPC). */ - for (i = 0; i < len; i++) { + for (i = 0; i < num; i++) { odp_packet_t pkt = pkt_table[i]; pool_t *ipc_pool = pool_entry_from_hdl(pktio_entry->s.ipc.pool); odp_packet_hdr_t *pkt_hdr; @@ -623,7 +623,7 @@ static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry, }
/* Set offset to phdr for outgoing packets */ - for (i = 0; i < len; i++) { + for (i = 0; i < num; i++) { uint64_t data_pool_off; odp_packet_t pkt = pkt_table_mapped[i]; odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt); @@ -639,7 +639,7 @@ static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry, pkt_hdr->buf_hdr.ipc_data_offset = data_pool_off; IPC_ODP_DBG("%d/%d send packet %llx, pool %llx," "phdr = %p, offset %x sendoff %x, addr %llx iaddr %llx\n", - i, len, + i, num, odp_packet_to_u64(pkt), odp_pool_to_u64(pool_hdl), pkt_hdr, pkt_hdr->buf_hdr.ipc_data_offset, offsets[i], odp_shm_addr(pool->shm), @@ -650,7 +650,7 @@ static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry, /* Put packets to ring to be processed by other process. */ rbuf_p = (void *)&offsets[0]; r = pktio_entry->s.ipc.tx.send; - ret = _ring_mp_enqueue_burst(r, rbuf_p, len); + ret = _ring_mp_enqueue_burst(r, rbuf_p, num); if (odp_unlikely(ret < 0)) { ODP_ERR("pid %d odp_ring_mp_enqueue_bulk fail, ipc_slave %d, ret %d\n", getpid(), @@ -662,17 +662,17 @@ static int ipc_pktio_send_lockless(pktio_entry_t *pktio_entry, ODP_ABORT("Unexpected!\n"); }
- return len; + return num; }
static int ipc_pktio_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - const odp_packet_t pkt_table[], int len) + const odp_packet_t pkt_table[], int num) { int ret;
odp_ticketlock_lock(&pktio_entry->s.txl);
- ret = ipc_pktio_send_lockless(pktio_entry, pkt_table, len); + ret = ipc_pktio_send_lockless(pktio_entry, pkt_table, num);
odp_ticketlock_unlock(&pktio_entry->s.txl);
diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c index 1461b64d..aecb0263 100644 --- a/platform/linux-generic/pktio/loop.c +++ b/platform/linux-generic/pktio/loop.c @@ -70,7 +70,7 @@ static int loopback_close(pktio_entry_t *pktio_entry) }
static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - odp_packet_t pkts[], int len) + odp_packet_t pkts[], int num) { int nbr, i; odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX]; @@ -82,13 +82,13 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, int num_rx = 0; int failed = 0;
- if (odp_unlikely(len > QUEUE_MULTI_MAX)) - len = QUEUE_MULTI_MAX; + if (odp_unlikely(num > QUEUE_MULTI_MAX)) + num = QUEUE_MULTI_MAX;
odp_ticketlock_lock(&pktio_entry->s.rxl);
queue = queue_fn->from_ext(pktio_entry->s.pkt_loop.loopq); - nbr = queue_fn->deq_multi(queue, hdr_tbl, len); + nbr = queue_fn->deq_multi(queue, hdr_tbl, num);
if (pktio_entry->s.config.pktin.bit.ts_all || pktio_entry->s.config.pktin.bit.ts_ptp) { @@ -171,7 +171,7 @@ static int loopback_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, }
static int loopback_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - const odp_packet_t pkt_tbl[], int len) + const odp_packet_t pkt_tbl[], int num) { odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX]; queue_t queue; @@ -179,12 +179,12 @@ static int loopback_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, int ret; int nb_tx = 0; uint32_t bytes = 0; - uint32_t out_octets_tbl[len]; + uint32_t out_octets_tbl[num];
- if (odp_unlikely(len > QUEUE_MULTI_MAX)) - len = QUEUE_MULTI_MAX; + if (odp_unlikely(num > QUEUE_MULTI_MAX)) + num = QUEUE_MULTI_MAX;
- for (i = 0; i < len; ++i) { + for (i = 0; i < num; ++i) { uint32_t pkt_len = odp_packet_len(pkt_tbl[i]);
if (pkt_len > LOOP_MTU) { diff --git a/platform/linux-generic/pktio/pcap.c b/platform/linux-generic/pktio/pcap.c index 596bf6f2..7fc92514 100644 --- a/platform/linux-generic/pktio/pcap.c +++ b/platform/linux-generic/pktio/pcap.c @@ -204,7 +204,7 @@ static int _pcapif_reopen(pkt_pcap_t *pcap) }
static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - odp_packet_t pkts[], int len) + odp_packet_t pkts[], int num) { int i; struct pcap_pkthdr *hdr; @@ -226,7 +226,7 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, pktio_entry->s.config.pktin.bit.ts_ptp) ts = &ts_val;
- for (i = 0; i < len; ) { + for (i = 0; i < num; ) { int ret;
ret = pcap_next_ex(pcap->rx, &hdr, &data); @@ -293,7 +293,7 @@ static int _pcapif_dump_pkt(pkt_pcap_t *pcap, odp_packet_t pkt) }
static int pcapif_send_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - const odp_packet_t pkts[], int len) + const odp_packet_t pkts[], int num) { pkt_pcap_t *pcap = &pktio_entry->s.pkt_pcap; int i; @@ -305,7 +305,7 @@ static int pcapif_send_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, return 0; }
- for (i = 0; i < len; ++i) { + for (i = 0; i < num; ++i) { int pkt_len = odp_packet_len(pkts[i]);
if (pkt_len > PKTIO_PCAP_MTU) { diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index 5c86ff60..71980b54 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -601,15 +601,15 @@ static uint32_t _rx_pkt_to_iovec(odp_packet_t pkt, * ODP_PACKET_SOCKET_MMSG: */ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - odp_packet_t pkt_table[], int len) + odp_packet_t pkt_table[], int num) { pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock; odp_pool_t pool = pkt_sock->pool; odp_time_t ts_val; odp_time_t *ts = NULL; const int sockfd = pkt_sock->sockfd; - struct mmsghdr msgvec[len]; - struct iovec iovecs[len][MAX_SEGS]; + struct mmsghdr msgvec[num]; + struct iovec iovecs[num][MAX_SEGS]; int nb_rx = 0; int nb_pkts; int recv_msgs; @@ -623,7 +623,7 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
memset(msgvec, 0, sizeof(msgvec));
- nb_pkts = packet_alloc_multi(pool, pkt_sock->mtu, pkt_table, len); + nb_pkts = packet_alloc_multi(pool, pkt_sock->mtu, pkt_table, num); for (i = 0; i < nb_pkts; i++) { msgvec[i].msg_hdr.msg_iovlen = _rx_pkt_to_iovec(pkt_table[i], iovecs[i]); @@ -804,11 +804,11 @@ static uint32_t _tx_pkt_to_iovec(odp_packet_t pkt, * ODP_PACKET_SOCKET_MMSG: */ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - const odp_packet_t pkt_table[], int len) + const odp_packet_t pkt_table[], int num) { pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock; - struct mmsghdr msgvec[len]; - struct iovec iovecs[len][MAX_SEGS]; + struct mmsghdr msgvec[num]; + struct iovec iovecs[num][MAX_SEGS]; int ret; int sockfd; int n, i; @@ -818,14 +818,14 @@ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, sockfd = pkt_sock->sockfd; memset(msgvec, 0, sizeof(msgvec));
- for (i = 0; i < len; i++) { + for (i = 0; i < num; i++) { msgvec[i].msg_hdr.msg_iov = iovecs[i]; msgvec[i].msg_hdr.msg_iovlen = _tx_pkt_to_iovec(pkt_table[i], iovecs[i]); }
- for (i = 0; i < len; ) { - ret = sendmmsg(sockfd, &msgvec[i], len - i, MSG_DONTWAIT); + for (i = 0; i < num; ) { + ret = sendmmsg(sockfd, &msgvec[i], num - i, MSG_DONTWAIT); if (odp_unlikely(ret <= -1)) { if (i == 0 && SOCK_ERR_REPORT(errno)) { __odp_errno = errno; diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index 20ac9d12..b53173d2 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -163,7 +163,7 @@ static inline unsigned next_frame(unsigned cur_frame, unsigned frame_count)
static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, pkt_sock_mmap_t *pkt_sock, - odp_packet_t pkt_table[], unsigned len, + odp_packet_t pkt_table[], unsigned num, unsigned char if_mac[]) { union frame_map ppd; @@ -185,11 +185,11 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, ring = &pkt_sock->rx_ring; frame_num = ring->frame_num;
- for (i = 0, nb_rx = 0; i < len; i++) { + for (i = 0, nb_rx = 0; i < num; i++) { odp_packet_hdr_t *hdr; odp_packet_hdr_t parsed_hdr; odp_pool_t pool = pkt_sock->pool; - int num; + int pkts;
if (!mmap_rx_kernel_ready(ring->rd[frame_num].iov_base)) break; @@ -234,9 +234,9 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, } }
- num = packet_alloc_multi(pool, pkt_len, &pkt_table[nb_rx], 1); + pkts = packet_alloc_multi(pool, pkt_len, &pkt_table[nb_rx], 1);
- if (odp_unlikely(num != 1)) { + if (odp_unlikely(pkts != 1)) { pkt_table[nb_rx] = ODP_PACKET_INVALID; mmap_rx_user_ready(ppd.raw); /* drop */ frame_num = next_frame_num; @@ -317,7 +317,7 @@ static unsigned handle_pending_frames(int sock, struct ring *ring, int frames)
static inline unsigned pkt_mmap_v2_tx(int sock, struct ring *ring, const odp_packet_t pkt_table[], - unsigned len) + unsigned num) { union frame_map ppd; uint32_t pkt_len; @@ -333,7 +333,7 @@ static inline unsigned pkt_mmap_v2_tx(int sock, struct ring *ring, frame_num = first_frame_num; frame_count = ring->rd_num;
- while (i < len) { + while (i < num) { ppd.raw = ring->rd[frame_num].iov_base; if (!odp_unlikely(mmap_tx_kernel_ready(ppd.raw))) break; @@ -661,13 +661,13 @@ static int sock_mmap_fd_set(pktio_entry_t *pktio_entry, int index ODP_UNUSED, }
static int sock_mmap_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - odp_packet_t pkt_table[], int len) + odp_packet_t pkt_table[], int num) { pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap; int ret;
odp_ticketlock_lock(&pktio_entry->s.rxl); - ret = pkt_mmap_v2_rx(pktio_entry, pkt_sock, pkt_table, len, + ret = pkt_mmap_v2_rx(pktio_entry, pkt_sock, pkt_table, num, pkt_sock->if_mac); odp_ticketlock_unlock(&pktio_entry->s.rxl);
@@ -748,14 +748,14 @@ static int sock_mmap_recv_mq_tmo(pktio_entry_t *pktio_entry[], int index[], }
static int sock_mmap_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - const odp_packet_t pkt_table[], int len) + const odp_packet_t pkt_table[], int num) { int ret; pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap;
odp_ticketlock_lock(&pktio_entry->s.txl); ret = pkt_mmap_v2_tx(pkt_sock->tx_ring.sock, &pkt_sock->tx_ring, - pkt_table, len); + pkt_table, num); odp_ticketlock_unlock(&pktio_entry->s.txl);
return ret; diff --git a/platform/linux-generic/pktio/tap.c b/platform/linux-generic/pktio/tap.c index d8b78f3f..ebd4d94b 100644 --- a/platform/linux-generic/pktio/tap.c +++ b/platform/linux-generic/pktio/tap.c @@ -294,7 +294,7 @@ static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data, }
static int tap_pktio_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - odp_packet_t pkts[], int len) + odp_packet_t pkts[], int num) { ssize_t retval; int i; @@ -309,7 +309,7 @@ static int tap_pktio_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, pktio_entry->s.config.pktin.bit.ts_ptp) ts = &ts_val;
- for (i = 0; i < len; i++) { + for (i = 0; i < num; i++) { do { retval = read(tap->fd, buf, BUF_SIZE); } while (retval < 0 && errno == EINTR); @@ -333,7 +333,7 @@ static int tap_pktio_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, }
static int tap_pktio_send_lockless(pktio_entry_t *pktio_entry, - const odp_packet_t pkts[], int len) + const odp_packet_t pkts[], int num) { ssize_t retval; int i, n; @@ -341,7 +341,7 @@ static int tap_pktio_send_lockless(pktio_entry_t *pktio_entry, uint8_t buf[BUF_SIZE]; pkt_tap_t *tap = &pktio_entry->s.pkt_tap;
- for (i = 0; i < len; i++) { + for (i = 0; i < num; i++) { pkt_len = odp_packet_len(pkts[i]);
if (pkt_len > tap->mtu) { @@ -385,13 +385,13 @@ static int tap_pktio_send_lockless(pktio_entry_t *pktio_entry, }
static int tap_pktio_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, - const odp_packet_t pkts[], int len) + const odp_packet_t pkts[], int num) { int ret;
odp_ticketlock_lock(&pktio_entry->s.txl);
- ret = tap_pktio_send_lockless(pktio_entry, pkts, len); + ret = tap_pktio_send_lockless(pktio_entry, pkts, num);
odp_ticketlock_unlock(&pktio_entry->s.txl);
commit 22193a06524fa8dc43dfd106cf7eab46745b86f4 Author: Matias Elo matias.elo@nokia.com Date: Tue Jan 16 16:59:10 2018 +0200
linux-gen: netmap: check that packet obeys MTU in receive
Some NICs do not automatically drop packets which exceed MTU.
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/include/odp_packet_netmap.h b/platform/linux-generic/include/odp_packet_netmap.h index 616541b5..fa950158 100644 --- a/platform/linux-generic/include/odp_packet_netmap.h +++ b/platform/linux-generic/include/odp_packet_netmap.h @@ -44,7 +44,6 @@ typedef struct { /** Packet socket using netmap mmaped rings for both Rx and Tx */ typedef struct { odp_pool_t pool; /**< pool to alloc packets from */ - size_t max_frame_len; /**< buf_size - sizeof(pkt_hdr) */ uint32_t if_flags; /**< interface flags */ uint32_t mtu; /**< maximum transmission unit */ int sockfd; /**< control socket */ diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c index dd5debb8..a7c47900 100644 --- a/platform/linux-generic/pktio/netmap.c +++ b/platform/linux-generic/pktio/netmap.c @@ -350,9 +350,6 @@ static int netmap_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry, pkt_nm->sockfd = -1; pkt_nm->pool = pool;
- /* max frame len taking into account the l2-offset */ - pkt_nm->max_frame_len = pool_entry_from_hdl(pool)->max_len; - /* allow interface to be opened with or without the 'netmap:' prefix */ prefix = "netmap:"; if (strncmp(netdev, "netmap:", 7) == 0) @@ -642,12 +639,6 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry,
odp_prefetch(slot.buf);
- if (odp_unlikely(len > pktio_entry->s.pkt_nm.max_frame_len)) { - ODP_ERR("RX: frame too big %" PRIu16 " %zu!\n", len, - pktio_entry->s.pkt_nm.max_frame_len); - goto fail; - } - if (pktio_cls_enabled(pktio_entry)) { if (cls_classify_packet(pktio_entry, (const uint8_t *)slot.buf, len, @@ -692,6 +683,7 @@ static inline int netmap_recv_desc(pktio_entry_t *pktio_entry, netmap_slot_t slot_tbl[num]; char *buf; uint32_t slot_id; + uint32_t mtu = pktio_entry->s.pkt_nm.mtu; int i; int ring_id = desc->cur_rx_ring; int num_rx = 0; @@ -711,10 +703,12 @@ static inline int netmap_recv_desc(pktio_entry_t *pktio_entry, slot_id = ring->cur; buf = NETMAP_BUF(ring, ring->slot[slot_id].buf_idx);
- slot_tbl[num_rx].buf = buf; - slot_tbl[num_rx].len = ring->slot[slot_id].len; - num_rx++; - + if (odp_likely(ring->slot[slot_id].len <= mtu)) { + slot_tbl[num_rx].buf = buf; + slot_tbl[num_rx].len = ring->slot[slot_id].len; + ODP_DBG("dropped oversized packet\n"); + num_rx++; + } ring->cur = nm_ring_next(ring, slot_id); } ring->head = ring->cur;
commit 6582992616b1d95844d41ba93aeb0bb6c7dd6bd7 Author: Matias Elo matias.elo@nokia.com Date: Tue Jan 16 16:07:29 2018 +0200
linux-gen: socket_mmap: check that packet obeys MTU in receive
Some NICs do not automatically drop packets which exceed MTU.
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/include/odp_packet_socket.h b/platform/linux-generic/include/odp_packet_socket.h index 52d2776b..88d2306c 100644 --- a/platform/linux-generic/include/odp_packet_socket.h +++ b/platform/linux-generic/include/odp_packet_socket.h @@ -73,6 +73,7 @@ typedef struct {
int ODP_ALIGNED_CACHE sockfd; odp_pool_t pool; + int mtu; /**< maximum transmission unit */ size_t frame_offset; /**< frame start offset from start of pkt buf */ uint8_t *mmap_base; unsigned mmap_len; diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index 96254f9a..20ac9d12 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -203,6 +203,13 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, pkt_buf = (uint8_t *)ppd.raw + ppd.v2->tp_h.tp_mac; pkt_len = ppd.v2->tp_h.tp_snaplen;
+ if (odp_unlikely(pkt_len > pkt_sock->mtu)) { + mmap_rx_user_ready(ppd.raw); + frame_num = next_frame_num; + ODP_DBG("dropped oversized packet\n"); + continue; + } + /* Don't receive packets sent by ourselves */ eth_hdr = (struct ethhdr *)pkt_buf; if (odp_unlikely(ethaddrs_equal(if_mac, @@ -593,6 +600,10 @@ static int sock_mmap_open(odp_pktio_t id ODP_UNUSED, if (ret != 0) goto error;
+ pkt_sock->mtu = mtu_get_fd(pkt_sock->sockfd, netdev); + if (!pkt_sock->mtu) + goto error; + if_idx = if_nametoindex(netdev); if (if_idx == 0) { __odp_errno = errno;
commit 5911355121d94a192c9336b036cebb3734a78db2 Author: Matias Elo matias.elo@nokia.com Date: Tue Jan 16 15:11:49 2018 +0200
linux-gen: socket: drop truncated packets on receive
Drop truncated packets received from kernel during sock_mmsg_recv() call.
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index 7843b611..5c86ff60 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -643,6 +643,11 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, uint16_t pkt_len = msgvec[i].msg_len; int ret;
+ if (odp_unlikely(msgvec[i].msg_hdr.msg_flags & MSG_TRUNC)) { + odp_packet_free(pkt); + ODP_DBG("dropped truncated packet\n"); + continue; + } if (pktio_cls_enabled(pktio_entry)) { uint16_t seg_len = pkt_len;
commit d48d55d846c3e711c2632a66db485f9079a768cf Author: Matias Elo matias.elo@nokia.com Date: Tue Jan 16 08:51:43 2018 +0200
linux-gen: socket_mmap: fix short send handling
During sock_mmap_send() when all packets are not transmitted by sendto() call the used ring slots have to be marked as TP_STATUS_AVAILABLE or they will be transmitted during the next sock_mmap_send() call, thus breaking the function logic.
To reduce the number of failed TX operations (visible to applications) the pktio implementation can call sendto() up to TX_RETRIES times during a single sock_mmap_recv() call.
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index b4357f7b..96254f9a 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -23,6 +23,7 @@ #include <poll.h> #include <sys/ioctl.h> #include <errno.h> +#include <time.h>
#include <odp_api.h> #include <odp_packet_socket.h> @@ -37,6 +38,12 @@ #include <protocols/eth.h> #include <protocols/ip.h>
+/* Maximum number of retries per sock_mmap_send() call */ +#define TX_RETRIES 10 + +/* Number of nanoseconds to wait between TX retries */ +#define TX_RETRY_NSEC 1000 + /* Maximum number of packets to store in each RX/TX block */ #define MAX_PKTS_PER_BLOCK 512
@@ -149,6 +156,11 @@ static uint8_t *pkt_mmap_vlan_insert(uint8_t *l2_hdr_ptr, return l2_hdr_ptr; }
+static inline unsigned next_frame(unsigned cur_frame, unsigned frame_count) +{ + return odp_unlikely(cur_frame + 1 >= frame_count) ? 0 : cur_frame + 1; +} + static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, pkt_sock_mmap_t *pkt_sock, odp_packet_t pkt_table[], unsigned len, @@ -186,7 +198,7 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, ts_val = odp_time_global();
ppd.raw = ring->rd[frame_num].iov_base; - next_frame_num = (frame_num + 1) % ring->rd_num; + next_frame_num = next_frame(frame_num, ring->rd_num);
pkt_buf = (uint8_t *)ppd.raw + ppd.v2->tp_h.tp_mac; pkt_len = ppd.v2->tp_h.tp_snaplen; @@ -252,6 +264,50 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, return nb_rx; }
+static unsigned handle_pending_frames(int sock, struct ring *ring, int frames) +{ + int i; + int retry = 0; + unsigned nb_tx = 0; + unsigned frame_num; + unsigned frame_count = ring->rd_num; + unsigned first_frame_num = ring->frame_num; + + for (frame_num = first_frame_num, i = 0; i < frames; i++) { + struct tpacket2_hdr *hdr = ring->rd[frame_num].iov_base; + + if (odp_likely(hdr->tp_status == TP_STATUS_AVAILABLE || + hdr->tp_status == TP_STATUS_SENDING)) { + nb_tx++; + } else if (hdr->tp_status == TP_STATUS_SEND_REQUEST) { + if (retry++ < TX_RETRIES) { + struct timespec ts = { .tv_nsec = TX_RETRY_NSEC, + .tv_sec = 0 }; + + sendto(sock, NULL, 0, MSG_DONTWAIT, NULL, 0); + nanosleep(&ts, NULL); + i--; + continue; + } else { + hdr->tp_status = TP_STATUS_AVAILABLE; + } + } else { /* TP_STATUS_WRONG_FORMAT */ + /* Don't try re-sending frames after failure */ + for (; i < frames; i++) { + hdr = ring->rd[frame_num].iov_base; + hdr->tp_status = TP_STATUS_AVAILABLE; + frame_num = next_frame(frame_num, frame_count); + } + break; + } + frame_num = next_frame(frame_num, frame_count); + } + + ring->frame_num = next_frame(first_frame_num + nb_tx - 1, frame_count); + + return nb_tx; +} + static inline unsigned pkt_mmap_v2_tx(int sock, struct ring *ring, const odp_packet_t pkt_table[], unsigned len) @@ -261,7 +317,7 @@ static inline unsigned pkt_mmap_v2_tx(int sock, struct ring *ring, unsigned first_frame_num, frame_num, frame_count; int ret; uint8_t *buf; - unsigned n, i = 0; + unsigned i = 0; unsigned nb_tx = 0; int send_errno; int total_len = 0; @@ -286,9 +342,7 @@ static inline unsigned pkt_mmap_v2_tx(int sock, struct ring *ring,
mmap_tx_user_ready(ppd.raw);
- if (++frame_num >= frame_count) - frame_num = 0; - + frame_num = next_frame(frame_num, frame_count); i++; }
@@ -302,27 +356,11 @@ static inline unsigned pkt_mmap_v2_tx(int sock, struct ring *ring, if (odp_likely(ret == total_len)) { nb_tx = i; ring->frame_num = frame_num; - } else if (ret == -1) { - for (frame_num = first_frame_num, n = 0; n < i; ++n) { - struct tpacket2_hdr *hdr = ring->rd[frame_num].iov_base; - - if (odp_likely(hdr->tp_status == TP_STATUS_AVAILABLE || - hdr->tp_status == TP_STATUS_SENDING)) { - nb_tx++; - } else { - /* The remaining frames weren't sent, clear - * their status to indicate we're not waiting - * for the kernel to process them. */ - hdr->tp_status = TP_STATUS_AVAILABLE; - } - - if (++frame_num >= frame_count) - frame_num = 0; - } - - ring->frame_num = (first_frame_num + nb_tx) % frame_count; + } else { + nb_tx = handle_pending_frames(sock, ring, i);
- if (nb_tx == 0 && SOCK_ERR_REPORT(send_errno)) { + if (odp_unlikely(ret == -1 && nb_tx == 0 && + SOCK_ERR_REPORT(send_errno))) { __odp_errno = send_errno; /* ENOBUFS indicates that the transmit queue is full, * which will happen regularly when overloaded so don't @@ -332,16 +370,6 @@ static inline unsigned pkt_mmap_v2_tx(int sock, struct ring *ring, strerror(send_errno)); return -1; } - } else { - /* Short send, return value is number of bytes sent so use this - * to determine number of complete frames sent. */ - for (n = 0; n < i && ret > 0; ++n) { - ret -= odp_packet_len(pkt_table[n]); - if (ret >= 0) - nb_tx++; - } - - ring->frame_num = (first_frame_num + nb_tx) % frame_count; }
for (i = 0; i < nb_tx; ++i)
commit 3c2b4804a2c3bca57febe2aea8a56b586c44f035 Author: Matias Elo matias.elo@nokia.com Date: Mon Jan 15 13:20:16 2018 +0200
linux-gen: socket_mmap: reduce memory usage
Allocating enough memory for storing each packet in the packet pool in each RX/TX block wastes a lot of memory. Also, the following mmap() call in mmap_sock() can start failing when the number of memory blocks increases (large number of CPU cores). Reduce the amount of required memory by limiting the size of memory blocks.
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index b8348677..b4357f7b 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -37,6 +37,9 @@ #include <protocols/eth.h> #include <protocols/ip.h>
+/* Maximum number of packets to store in each RX/TX block */ +#define MAX_PKTS_PER_BLOCK 512 + static int disable_pktio; /** !0 this pktio disabled, 0 enabled */
static int set_pkt_sock_fanout_mmap(pkt_sock_mmap_t *const pkt_sock, @@ -349,6 +352,7 @@ static inline unsigned pkt_mmap_v2_tx(int sock, struct ring *ring,
static void mmap_fill_ring(struct ring *ring, odp_pool_t pool_hdl, int fanout) { + uint32_t num_frames; int pz = getpagesize(); pool_t *pool;
@@ -360,13 +364,15 @@ static void mmap_fill_ring(struct ring *ring, odp_pool_t pool_hdl, int fanout) /* Frame has to capture full packet which can fit to the pool block.*/ ring->req.tp_frame_size = (pool->headroom + pool->seg_len + pool->tailroom + TPACKET_HDRLEN + - TPACKET_ALIGNMENT + + (pz - 1)) & (-pz); + TPACKET_ALIGNMENT + (pz - 1)) & (-pz);
- /* Calculate how many pages do we need to hold all pool packets - * and align size to page boundary. - */ - ring->req.tp_block_size = (ring->req.tp_frame_size * - pool->num + (pz - 1)) & (-pz); + /* Calculate how many pages we need to hold at most MAX_PKTS_PER_BLOCK + * packets and align size to page boundary. + */ + num_frames = pool->num < MAX_PKTS_PER_BLOCK ? pool->num : + MAX_PKTS_PER_BLOCK; + ring->req.tp_block_size = (ring->req.tp_frame_size * num_frames + + (pz - 1)) & (-pz);
if (!fanout) { /* Single socket is in use. Use 1 block with buf_num frames. */
commit a4767f0cbe844cd7f61f43557f0f90eaa2969192 Author: Matias Elo matias.elo@nokia.com Date: Fri Jan 12 15:39:22 2018 +0200
linux-gen: pktio: loop: use more realistic MTU value
Use more realistic MTU value. The value is also checked in TX.
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c index 347b4943..1461b64d 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,15 +185,25 @@ 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; /* Store cumulative byte counts to update 'stats.out_octets' * correctly in case enq_multi() fails to enqueue all packets. */ 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]) == @@ -207,7 +219,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; @@ -224,8 +236,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,
commit 7915f861ea56bbb0f5a0c22d93a7b4ff6b3c76e2 Author: Matias Elo matias.elo@nokia.com Date: Fri Jan 12 15:27:57 2018 +0200
linux-gen: pktio: loop: update stats.out_octets correctly
odp_pktio_stats_t.out_octets was updated incorrectly if all packets were not successfully enqueued.
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c index ad2cb39f..347b4943 100644 --- a/platform/linux-generic/pktio/loop.c +++ b/platform/linux-generic/pktio/loop.c @@ -177,6 +177,7 @@ static int loopback_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, int i; int ret; uint32_t bytes = 0; + uint32_t out_octets_tbl[len];
if (odp_unlikely(len > QUEUE_MULTI_MAX)) len = QUEUE_MULTI_MAX; @@ -184,6 +185,10 @@ static int loopback_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, for (i = 0; i < len; ++i) { hdr_tbl[i] = packet_to_buf_hdr(pkt_tbl[i]); bytes += odp_packet_len(pkt_tbl[i]); + /* Store cumulative byte counts to update 'stats.out_octets' + * correctly in case enq_multi() fails to enqueue all packets. + */ + out_octets_tbl[i] = bytes; }
for (i = 0; i < len; ++i) { @@ -206,7 +211,7 @@ static int loopback_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED,
if (ret > 0) { pktio_entry->s.stats.out_ucast_pkts += ret; - pktio_entry->s.stats.out_octets += bytes; + pktio_entry->s.stats.out_octets += out_octets_tbl[ret - 1]; } else { ODP_DBG("queue enqueue failed %i\n", ret); ret = -1;
commit 741bdb906e946d22194ab5676c9ea06e3debb2a1 Author: Matias Elo matias.elo@nokia.com Date: Fri Jan 12 12:43:15 2018 +0200
linux-gen: pktio: use correct maximum frame length
The maximum frame length should include Ethernet header.
Signed-off-by: Matias Elo matias.elo@nokia.com Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c index ace0dd85..dd5debb8 100644 --- a/platform/linux-generic/pktio/netmap.c +++ b/platform/linux-generic/pktio/netmap.c @@ -417,14 +417,13 @@ static int netmap_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry, } pkt_nm->sockfd = sockfd;
- /* Use either interface MTU (+ ethernet header length) or netmap buffer - * size as MTU, whichever is smaller. */ + /* Use either interface MTU or netmap buffer size as MTU, whichever is + * smaller. */ mtu = mtu_get_fd(pktio_entry->s.pkt_nm.sockfd, pkt_nm->if_name); if (mtu == 0) { ODP_ERR("Unable to read interface MTU\n"); goto error; } - mtu += _ODP_ETHHDR_LEN; pkt_nm->mtu = (mtu < buf_size) ? mtu : buf_size;
/* Check if RSS is supported. If not, set 'max_input_queues' to 1. */ diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index c41152d4..7843b611 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -143,7 +143,7 @@ uint32_t mtu_get_fd(int fd, const char *name) ifr.ifr_name); return 0; } - return ifr.ifr_mtu; + return ifr.ifr_mtu + _ODP_ETHHDR_LEN; }
/*
-----------------------------------------------------------------------
Summary of changes: platform/linux-generic/include/odp_packet_netmap.h | 1 - platform/linux-generic/include/odp_packet_socket.h | 1 + platform/linux-generic/pktio/ipc.c | 24 ++-- platform/linux-generic/pktio/loop.c | 44 ++++-- platform/linux-generic/pktio/netmap.c | 25 ++-- platform/linux-generic/pktio/pcap.c | 8 +- platform/linux-generic/pktio/socket.c | 27 ++-- platform/linux-generic/pktio/socket_mmap.c | 149 ++++++++++++++------- platform/linux-generic/pktio/tap.c | 12 +- 9 files changed, 175 insertions(+), 116 deletions(-)
hooks/post-receive