[API-NEXT,3/6] linux-generic: socket mmap: implement pktio_start and pktio_stop

Message ID 1439466334-16497-4-git-send-email-maxim.uvarov@linaro.org
State New
Headers show

Commit Message

Maxim Uvarov Aug. 13, 2015, 11:45 a.m.
Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
---
 platform/linux-generic/pktio/socket_mmap.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

Comments

Bill Fischofer Aug. 13, 2015, 12:47 p.m. | #1
On Thu, Aug 13, 2015 at 6:45 AM, Maxim Uvarov <maxim.uvarov@linaro.org>
wrote:

> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
> ---
>  platform/linux-generic/pktio/socket_mmap.c | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
>
> diff --git a/platform/linux-generic/pktio/socket_mmap.c
> b/platform/linux-generic/pktio/socket_mmap.c
> index 7d42678..f9ba74e 100644
> --- a/platform/linux-generic/pktio/socket_mmap.c
> +++ b/platform/linux-generic/pktio/socket_mmap.c
> @@ -486,6 +486,7 @@ static int sock_mmap_open(odp_pktio_t id ODP_UNUSED,
>                         goto error;
>         }
>
> +       pktio_entry->s.state = STATE_START;
>         return 0;
>
>  error:
> @@ -497,6 +498,10 @@ static int sock_mmap_recv(pktio_entry_t *pktio_entry,
>                           odp_packet_t pkt_table[], unsigned len)
>  {
>         pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap;
> +
> +       if (pktio_entry->s.state == STATE_STOP)
> +               return 0;
> +
>         return pkt_mmap_v2_rx(pkt_sock->rx_ring.sock, &pkt_sock->rx_ring,
>                               pkt_table, len, pkt_sock->pool,
>                               pkt_sock->if_mac);
> @@ -506,6 +511,9 @@ static int sock_mmap_send(pktio_entry_t *pktio_entry,
>                           odp_packet_t pkt_table[], unsigned len)
>  {
>         pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap;
> +
> +       if (pktio_entry->s.state == STATE_STOP)
> +               return 0;
>

Same comments here.  Attempting to send (and probably recv too) from a
stopped interface should give some sort of an error indicator to avoid
confusion and/or leaks.


>         return pkt_mmap_v2_tx(pkt_sock->tx_ring.sock, &pkt_sock->tx_ring,
>                               pkt_table, len);
>  }
> @@ -535,11 +543,25 @@ static int sock_mmap_promisc_mode_get(pktio_entry_t
> *pktio_entry)
>                                    pktio_entry->s.name);
>  }
>
> +static int sock_mmap_start(pktio_entry_t *pktio_entry)
> +{
> +       pktio_entry->s.state = STATE_START;
> +       return 0;
> +}
> +
> +static int sock_mmap_stop(pktio_entry_t *pktio_entry)
> +{
> +       pktio_entry->s.state = STATE_STOP;
> +       return 0;
> +}
> +
>  const pktio_if_ops_t sock_mmap_pktio_ops = {
>         .init = NULL,
>         .term = NULL,
>         .open = sock_mmap_open,
>         .close = sock_mmap_close,
> +       .start = sock_mmap_start,
> +       .stop = sock_mmap_stop,
>         .recv = sock_mmap_recv,
>         .send = sock_mmap_send,
>         .mtu_get = sock_mmap_mtu_get,
> --
> 1.9.1
>
> _______________________________________________
> lng-odp mailing list
> lng-odp@lists.linaro.org
> https://lists.linaro.org/mailman/listinfo/lng-odp
>

Patch

diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c
index 7d42678..f9ba74e 100644
--- a/platform/linux-generic/pktio/socket_mmap.c
+++ b/platform/linux-generic/pktio/socket_mmap.c
@@ -486,6 +486,7 @@  static int sock_mmap_open(odp_pktio_t id ODP_UNUSED,
 			goto error;
 	}
 
+	pktio_entry->s.state = STATE_START;
 	return 0;
 
 error:
@@ -497,6 +498,10 @@  static int sock_mmap_recv(pktio_entry_t *pktio_entry,
 			  odp_packet_t pkt_table[], unsigned len)
 {
 	pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap;
+
+	if (pktio_entry->s.state == STATE_STOP)
+		return 0;
+
 	return pkt_mmap_v2_rx(pkt_sock->rx_ring.sock, &pkt_sock->rx_ring,
 			      pkt_table, len, pkt_sock->pool,
 			      pkt_sock->if_mac);
@@ -506,6 +511,9 @@  static int sock_mmap_send(pktio_entry_t *pktio_entry,
 			  odp_packet_t pkt_table[], unsigned len)
 {
 	pkt_sock_mmap_t *const pkt_sock = &pktio_entry->s.pkt_sock_mmap;
+
+	if (pktio_entry->s.state == STATE_STOP)
+		return 0;
 	return pkt_mmap_v2_tx(pkt_sock->tx_ring.sock, &pkt_sock->tx_ring,
 			      pkt_table, len);
 }
@@ -535,11 +543,25 @@  static int sock_mmap_promisc_mode_get(pktio_entry_t *pktio_entry)
 				   pktio_entry->s.name);
 }
 
+static int sock_mmap_start(pktio_entry_t *pktio_entry)
+{
+	pktio_entry->s.state = STATE_START;
+	return 0;
+}
+
+static int sock_mmap_stop(pktio_entry_t *pktio_entry)
+{
+	pktio_entry->s.state = STATE_STOP;
+	return 0;
+}
+
 const pktio_if_ops_t sock_mmap_pktio_ops = {
 	.init = NULL,
 	.term = NULL,
 	.open = sock_mmap_open,
 	.close = sock_mmap_close,
+	.start = sock_mmap_start,
+	.stop = sock_mmap_stop,
 	.recv = sock_mmap_recv,
 	.send = sock_mmap_send,
 	.mtu_get = sock_mmap_mtu_get,