Input arrays should be defined as const, so that user can be sure that the implementation does not overwrite it during processing.
Signed-off-by: Petri Savolainen <[email protected]> --- include/odp/api/spec/packet_io.h | 3 ++- platform/linux-generic/include/odp_packet_io_internal.h | 8 ++++---- platform/linux-generic/odp_packet_io.c | 10 ++++++---- platform/linux-generic/pktio/dpdk.c | 4 ++-- platform/linux-generic/pktio/ipc.c | 12 ++++++++---- platform/linux-generic/pktio/loop.c | 4 ++-- platform/linux-generic/pktio/netmap.c | 2 +- platform/linux-generic/pktio/socket.c | 2 +- platform/linux-generic/pktio/socket_mmap.c | 5 +++-- platform/linux-generic/pktio/tap.c | 2 +- 10 files changed, 30 insertions(+), 22 deletions(-) diff --git a/include/odp/api/spec/packet_io.h b/include/odp/api/spec/packet_io.h index 7c29176..a7d06da 100644 --- a/include/odp/api/spec/packet_io.h +++ b/include/odp/api/spec/packet_io.h @@ -805,7 +805,8 @@ uint64_t odp_pktin_wait_time(uint64_t nsec); * @return Number of packets sent * @retval <0 on failure */ -int odp_pktout_send(odp_pktout_queue_t queue, odp_packet_t packets[], int num); +int odp_pktout_send(odp_pktout_queue_t queue, const odp_packet_t packets[], + int num); /** * Return the currently configured MTU value of a packet IO interface. diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h index 9fc13a9..5d102f4 100644 --- a/platform/linux-generic/include/odp_packet_io_internal.h +++ b/platform/linux-generic/include/odp_packet_io_internal.h @@ -189,7 +189,7 @@ typedef struct pktio_if_ops { odp_time_t (*pktin_ts_from_ns)(pktio_entry_t *pktio_entry, uint64_t ns); int (*recv)(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[], unsigned len); - int (*send)(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[], + int (*send)(pktio_entry_t *pktio_entry, const odp_packet_t pkt_table[], unsigned len); uint32_t (*mtu_get)(pktio_entry_t *pktio_entry); int (*promisc_mode_set)(pktio_entry_t *pktio_entry, int enable); @@ -207,7 +207,7 @@ typedef struct pktio_if_ops { int (*recv_queue)(pktio_entry_t *entry, int index, odp_packet_t packets[], int num); int (*send_queue)(pktio_entry_t *entry, int index, - odp_packet_t packets[], int num); + const odp_packet_t packets[], int num); } pktio_if_ops_t; int _odp_packet_cls_enq(pktio_entry_t *pktio_entry, const uint8_t *base, @@ -257,8 +257,8 @@ int single_output_queues_config(pktio_entry_t *entry, const odp_pktout_queue_param_t *param); int single_recv_queue(pktio_entry_t *entry, int index, odp_packet_t packets[], int num); -int single_send_queue(pktio_entry_t *entry, int index, odp_packet_t packets[], - int num); +int single_send_queue(pktio_entry_t *entry, int index, + const odp_packet_t packets[], int num); extern const pktio_if_ops_t netmap_pktio_ops; extern const pktio_if_ops_t dpdk_pktio_ops; diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c index 148adc9..609f3e1 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -557,7 +557,8 @@ static int _odp_pktio_recv(odp_pktio_t id, odp_packet_t pkt_table[], int len) return pkts; } -static int _odp_pktio_send(odp_pktio_t id, odp_packet_t pkt_table[], int len) +static int _odp_pktio_send(odp_pktio_t id, const odp_packet_t pkt_table[], + int len) { pktio_entry_t *pktio_entry = get_pktio_entry(id); int pkts; @@ -1616,7 +1617,8 @@ uint64_t odp_pktin_wait_time(uint64_t nsec) return (nsec / SLEEP_NSEC) + 1; } -int odp_pktout_send(odp_pktout_queue_t queue, odp_packet_t packets[], int num) +int odp_pktout_send(odp_pktout_queue_t queue, const odp_packet_t packets[], + int num) { pktio_entry_t *entry; odp_pktio_t pktio = queue.pktio; @@ -1651,8 +1653,8 @@ int single_recv_queue(pktio_entry_t *entry, int index, odp_packet_t packets[], return _odp_pktio_recv(entry->s.handle, packets, num); } -int single_send_queue(pktio_entry_t *entry, int index, odp_packet_t packets[], - int num) +int single_send_queue(pktio_entry_t *entry, int index, + const odp_packet_t packets[], int num) { (void)index; return _odp_pktio_send(entry->s.handle, packets, num); diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c index edd304d..d2167e7 100644 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@ -741,7 +741,7 @@ fail: static inline int pkt_to_mbuf(pktio_entry_t *pktio_entry, struct rte_mbuf *mbuf_table[], - odp_packet_t pkt_table[], uint16_t num) + const odp_packet_t pkt_table[], uint16_t num) { pkt_dpdk_t *pkt_dpdk = &pktio_entry->s.pkt_dpdk; int i; @@ -852,7 +852,7 @@ static int dpdk_recv_queue(pktio_entry_t *pktio_entry, static int dpdk_send_queue(pktio_entry_t *pktio_entry, int index, - odp_packet_t pkt_table[], + const odp_packet_t pkt_table[], int num) { struct rte_mbuf *tx_mbufs[num]; diff --git a/platform/linux-generic/pktio/ipc.c b/platform/linux-generic/pktio/ipc.c index 381380e..4a17e36 100644 --- a/platform/linux-generic/pktio/ipc.c +++ b/platform/linux-generic/pktio/ipc.c @@ -575,8 +575,8 @@ static int ipc_pktio_recv(pktio_entry_t *pktio_entry, return pkts; } -static int ipc_pktio_send(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[], - unsigned len) +static int ipc_pktio_send(pktio_entry_t *pktio_entry, + const odp_packet_t pkt_table[], unsigned len) { _ring_t *r; void **rbuf_p; @@ -610,7 +610,8 @@ static int ipc_pktio_send(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[], ODP_ABORT("Unable to copy packet\n"); odp_packet_free(pkt); - pkt_table[i] = newpkt; + /* Cannot do this. Packet table is const. */ + /*pkt_table[i] = newpkt;*/ } rbuf_p = (void *)&pkt; @@ -625,7 +626,10 @@ static int ipc_pktio_send(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[], } /* Put packets to ring to be processed by other process. */ - rbuf_p = (void *)&pkt_table[0]; + /* BUG: Cannot store pointer to user provided memory, + which is likely allocated from the stack and will be overwritten + after this function returns. */ +/* rbuf_p = (void *)&pkt_table[0]; */ r = pktio_entry->s.ipc.tx.send; ret = _ring_mp_enqueue_burst(r, rbuf_p, len); if (odp_unlikely(ret < 0)) { diff --git a/platform/linux-generic/pktio/loop.c b/platform/linux-generic/pktio/loop.c index f04824f..cd7cbec 100644 --- a/platform/linux-generic/pktio/loop.c +++ b/platform/linux-generic/pktio/loop.c @@ -104,8 +104,8 @@ static int loopback_recv(pktio_entry_t *pktio_entry, odp_packet_t pkts[], return nbr; } -static int loopback_send(pktio_entry_t *pktio_entry, odp_packet_t pkt_tbl[], - unsigned len) +static int loopback_send(pktio_entry_t *pktio_entry, + const odp_packet_t pkt_tbl[], unsigned len) { odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX]; queue_entry_t *qentry; diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c index 1047a1e..6065922 100644 --- a/platform/linux-generic/pktio/netmap.c +++ b/platform/linux-generic/pktio/netmap.c @@ -743,7 +743,7 @@ static int netmap_recv_queue(pktio_entry_t *pktio_entry, int index, } static int netmap_send_queue(pktio_entry_t *pktio_entry, int index, - odp_packet_t pkt_table[], int num) + const odp_packet_t pkt_table[], int num) { pkt_netmap_t *pkt_nm = &pktio_entry->s.pkt_nm; struct pollfd polld; diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index da5c4ec..6f06170 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -743,7 +743,7 @@ 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, - odp_packet_t pkt_table[], unsigned len) + const odp_packet_t pkt_table[], unsigned len) { pkt_sock_t *pkt_sock = &pktio_entry->s.pkt_sock; struct mmsghdr msgvec[ODP_PACKET_SOCKET_MAX_BURST_TX]; diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index d895690..efb5f78 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -197,7 +197,8 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, } static inline unsigned pkt_mmap_v2_tx(int sock, struct ring *ring, - odp_packet_t pkt_table[], unsigned len) + const odp_packet_t pkt_table[], + unsigned len) { union frame_map ppd; uint32_t pkt_len; @@ -554,7 +555,7 @@ static int sock_mmap_recv(pktio_entry_t *pktio_entry, } static int sock_mmap_send(pktio_entry_t *pktio_entry, - odp_packet_t pkt_table[], unsigned len) + const odp_packet_t pkt_table[], unsigned len) { pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap; diff --git a/platform/linux-generic/pktio/tap.c b/platform/linux-generic/pktio/tap.c index dac3b13..45c4ae1 100644 --- a/platform/linux-generic/pktio/tap.c +++ b/platform/linux-generic/pktio/tap.c @@ -238,7 +238,7 @@ static int tap_pktio_recv(pktio_entry_t *pktio_entry, odp_packet_t pkts[], return i; } -static int tap_pktio_send(pktio_entry_t *pktio_entry, odp_packet_t pkts[], +static int tap_pktio_send(pktio_entry_t *pktio_entry, const odp_packet_t pkts[], unsigned len) { ssize_t retval; -- 2.8.1 _______________________________________________ lng-odp mailing list [email protected] https://lists.linaro.org/mailman/listinfo/lng-odp
