Signed-off-by: Gaetan Rivet <gaetan.ri...@6wind.com>
---
 drivers/net/failsafe/failsafe_ether.c   | 12 ++++++++++++
 drivers/net/failsafe/failsafe_flow.c    | 29 +++++++++++++++++++++++++++++
 drivers/net/failsafe/failsafe_private.h |  4 ++++
 3 files changed, 45 insertions(+)

diff --git a/drivers/net/failsafe/failsafe_ether.c 
b/drivers/net/failsafe/failsafe_ether.c
index 3401a18..3a691a1 100644
--- a/drivers/net/failsafe/failsafe_ether.c
+++ b/drivers/net/failsafe/failsafe_ether.c
@@ -218,6 +218,18 @@ fs_eth_dev_conf_apply(struct rte_eth_dev *dev,
                DEBUG("VLAN filter already set");
        }
        /* rte_flow */
+       if (!PRIV(dev)->flow_isolated) {
+               DEBUG("Flow isolation already disabled");
+       } else {
+               DEBUG("Enabling flow isolation");
+               ret = rte_flow_isolate(PORT_ID(sdev),
+                                      PRIV(dev)->flow_isolated,
+                                      &ferror);
+               if (ret) {
+                       fs_flow_complain(&ferror);
+                       return ret;
+               }
+       }
        if (TAILQ_EMPTY(&PRIV(dev)->flow_list)) {
                DEBUG("rte_flow already set");
        } else {
diff --git a/drivers/net/failsafe/failsafe_flow.c 
b/drivers/net/failsafe/failsafe_flow.c
index d8f59a1..a5598ae 100644
--- a/drivers/net/failsafe/failsafe_flow.c
+++ b/drivers/net/failsafe/failsafe_flow.c
@@ -207,10 +207,39 @@ fs_flow_query(struct rte_eth_dev *dev,
        return -1;
 }
 
+static int
+fs_flow_isolate(struct rte_eth_dev *dev,
+               int set,
+               struct rte_flow_error *error)
+{
+       struct sub_device *sdev;
+       uint8_t i;
+       int ret;
+
+       FOREACH_SUBDEV(sdev, i, dev) {
+               if (sdev->state < DEV_PROBED)
+                       continue;
+               DEBUG("Calling rte_flow_isolate on sub_device %d", i);
+               if (PRIV(dev)->flow_isolated != sdev->flow_isolated)
+                       WARN("flow isolation mode of sub_device %d in 
incoherent state.",
+                               i);
+               ret = rte_flow_isolate(PORT_ID(sdev), set, error);
+               if (ret) {
+                       ERROR("Operation rte_flow_isolate failed for sub_device 
%d"
+                             " with error %d", i, ret);
+                       return ret;
+               }
+               sdev->flow_isolated = set;
+       }
+       PRIV(dev)->flow_isolated = set;
+       return 0;
+}
+
 const struct rte_flow_ops fs_flow_ops = {
        .validate = fs_flow_validate,
        .create = fs_flow_create,
        .destroy = fs_flow_destroy,
        .flush = fs_flow_flush,
        .query = fs_flow_query,
+       .isolate = fs_flow_isolate,
 };
diff --git a/drivers/net/failsafe/failsafe_private.h 
b/drivers/net/failsafe/failsafe_private.h
index 66303cd..a3885e8 100644
--- a/drivers/net/failsafe/failsafe_private.h
+++ b/drivers/net/failsafe/failsafe_private.h
@@ -109,6 +109,8 @@ struct sub_device {
        struct rte_eth_dev *fs_dev;
        /* flag calling for recollection */
        volatile unsigned int remove:1;
+       /* flow isolation state */
+       int flow_isolated:1;
 };
 
 struct fs_priv {
@@ -140,6 +142,8 @@ struct fs_priv {
         */
        enum dev_state state;
        unsigned int pending_alarm:1; /* An alarm is pending */
+       /* flow isolation state */
+       int flow_isolated:1;
 };
 
 /* MISC */
-- 
2.1.4

Reply via email to