[ovs-dev] [PATCH 61/62] [netdev-offload-dpdk] fix some multicast output action errors.

Tao YunXiang taoyunxiang at cmss.chinamobile.com
Mon Dec 28 09:25:19 UTC 2020


From: LIU CHANG <liuchang at cmss.chinamobile.com>

when unsupported multicast output action happens, the datapath flow will be
NOT offloaded, but datapath flow statistics show offloaded status is yes rather
than partial. At the same time, ovs-vswitchd log shows the dp flow successed to
add the corresponding netdev flow wrongly.
---
 lib/netdev-offload-dpdk.c | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index 3ee4f33..58e6bc9 100644
--- a/lib/netdev-offload-dpdk.c
+++ b/lib/netdev-offload-dpdk.c
@@ -768,7 +768,7 @@ add_flow_pattern(struct flow_patterns *patterns, enum rte_flow_item_type type,
     patterns->cnt++;
 }
 
-static void
+static int
 add_flow_action(struct flow_actions *actions, enum rte_flow_action_type type,
                 const void *conf)
 {
@@ -777,7 +777,7 @@ add_flow_action(struct flow_actions *actions, enum rte_flow_action_type type,
     if ( (actions->valid_ucast == true) && 
          (type == RTE_FLOW_ACTION_TYPE_PORT_ID) ) {
         VLOG_DBG_RL(&rl, "Unsupported multicast output action");
-        return ;
+        return -1;
     }
     if (cnt == 0) {
         actions->current_max = 8;
@@ -1303,15 +1303,22 @@ add_port_id_action(struct flow_actions *actions,
 {
     struct rte_flow_action_port_id *port_id;
     int outdev_id;
+    int ret;
 
     VLOG_DBG("TIMO DBG: in add_port_id_action");
+
     outdev_id = netdev_dpdk_get_port_id(outdev);
     if (outdev_id < 0) {
         return -1;
     }
+
     port_id = xzalloc(sizeof *port_id);
     port_id->id = outdev_id;
-    add_flow_action(actions, RTE_FLOW_ACTION_TYPE_PORT_ID, port_id);
+    ret=add_flow_action(actions, RTE_FLOW_ACTION_TYPE_PORT_ID, port_id);
+    if (ret < 0){
+        return -1;
+    }
+
     return 0;
 }
 
@@ -2256,12 +2263,10 @@ netdev_offload_dpdk_add_flow(struct dpif *dpif, struct netdev *netdev,
                                             info->flow_mark);
          */
         actions_offloaded = false;
-    }
-
-    if (!flow) {
         ret = -1;
         goto out;
     }
+
     ufid_to_rte_flow_associate(ufid, flow, actions_offloaded,netdev->name);
     VLOG_DBG("%s: installed flow %p by ufid "UUID_FMT"\n",
              netdev_get_name(netdev), flow, UUID_ARGS((struct uuid *)ufid));
-- 
1.8.3.1





More information about the dev mailing list