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;