On 17 Feb 2022, at 16:07, Ilya Maximets wrote:

> On 2/17/22 13:57, Ilya Maximets wrote:
>> On 1/31/22 11:34, 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.
>>
>> Why exactly we can't get ifindex of the kernel interface?
>
> Hmm.  I see that netdev_vport_tunnel_register() doesn't register
> the .get_ifindex callback for erspan and some other tunnel types,
> but I'm not sure why...

Same here. I could not think of a reason. But did not want to break anything by 
adding it.

>>>
>>> Signed-off-by: Eelco Chaudron <[email protected]>
>>> ---
>>>  lib/netdev-offload-tc.c |    9 +++++++++
>>>  1 file changed, 9 insertions(+)
>>>
>>> diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
>>> index 9845e8d3f..8135441c6 100644
>>> --- a/lib/netdev-offload-tc.c
>>> +++ b/lib/netdev-offload-tc.c
>>> @@ -1842,6 +1842,15 @@ netdev_tc_flow_put(struct netdev *netdev, struct 
>>> match *match,
>>>                  return ENODEV;
>>>              }
>>>              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);
>>> +
>>
>> We're leaking netdev reference here.

Good catch!

>> Shouldn't we check netdev_flow_api_equals(netdev, outdev) here instead?
>> This way we will be sure that flow API was successfully initialized for
>> the outdev and we're not mixing different offload providers.

Decided to add it, and keep the index check also. So it will look something 
like:

@@ -1841,7 +1841,24 @@ 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,
+                            "Egress port %s is using a different flow API "
+                            "provider", 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;
+            }
+

>>> +                return -action->out.ifindex_out;
>>> +            }
>>> +
>>>              action->out.ingress = 
>>> is_internal_port(netdev_get_type(outdev));
>>>              action->type = TC_ACT_OUTPUT;
>>>              flower.action_count++;
>>>

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to