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

Reply via email to