On 2022-02-22 5:23 PM, Eelco Chaudron wrote:
Verify that the returned ifindex by netdev_get_ifindex() is valid.
This might not be the case in the ERSPAN port scenario, which can
not be offloaded.

Signed-off-by: Eelco Chaudron <echau...@redhat.com>
---
v3:
   - Fixed netdev reference issue on failure
   - Added netdev_flow_api_equals() check

  lib/netdev-offload-tc.c |   18 ++++++++++++++++++
  1 file changed, 18 insertions(+)

diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
index 9845e8d3f..0105d883f 100644
--- a/lib/netdev-offload-tc.c
+++ b/lib/netdev-offload-tc.c
@@ -1841,7 +1841,25 @@ netdev_tc_flow_put(struct netdev *netdev, struct match 
*match,
                  VLOG_DBG_RL(&rl, "Can't find netdev for output port %d", 
port);
                  return ENODEV;
              }
+
+            if (!netdev_flow_api_equals(netdev, outdev)) {
+                VLOG_DBG_RL(&rl,
+                            "Flow API provider mismatch between ingress (%s) "
+                            "and egress (%s) ports",
+                            netdev_get_name(netdev), netdev_get_name(outdev));
+                netdev_close(outdev);
+                return EOPNOTSUPP;
+            }
+
              action->out.ifindex_out = netdev_get_ifindex(outdev);
+            if (action->out.ifindex_out < 0) {
+                VLOG_DBG_RL(&rl,
+                            "Can't find ifindex for output port %s, error %d",
+                            netdev_get_name(outdev), action->out.ifindex_out);
+                netdev_close(outdev);
+                return -action->out.ifindex_out;
+            }
+
              action->out.ingress = is_internal_port(netdev_get_type(outdev));
              action->type = TC_ACT_OUTPUT;
              flower.action_count++;


Acked-by: Roi Dayan <r...@nvidia.com>
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to