Commit f60c2549 authored by Yotam Gigi's avatar Yotam Gigi Committed by David S. Miller

mlxsw: spectrum: mr: Support trap-and-forward routes

Add the support of trap-and-forward route action in the multicast routing
offloading logic. A route will be set to trap-and-forward action if one (or
more) of its output interfaces is not offload-able, i.e. does not have a
valid Spectrum RIF.

This way, a route with mixed output VIFs list, which contains both
offload-able and un-offload-able devices can go through partial offloading
in hardware, and the rest will be done in the kernel ipmr module.
Signed-off-by: default avatarYotam Gigi <yotamg@mellanox.com>
Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 607feade
...@@ -114,9 +114,9 @@ static bool mlxsw_sp_mr_vif_valid(const struct mlxsw_sp_mr_vif *vif) ...@@ -114,9 +114,9 @@ static bool mlxsw_sp_mr_vif_valid(const struct mlxsw_sp_mr_vif *vif)
return mlxsw_sp_mr_vif_regular(vif) && vif->dev && vif->rif; return mlxsw_sp_mr_vif_regular(vif) && vif->dev && vif->rif;
} }
static bool mlxsw_sp_mr_vif_rif_invalid(const struct mlxsw_sp_mr_vif *vif) static bool mlxsw_sp_mr_vif_exists(const struct mlxsw_sp_mr_vif *vif)
{ {
return mlxsw_sp_mr_vif_regular(vif) && vif->dev && !vif->rif; return vif->dev;
} }
static bool static bool
...@@ -182,14 +182,13 @@ mlxsw_sp_mr_route_action(const struct mlxsw_sp_mr_route *mr_route) ...@@ -182,14 +182,13 @@ mlxsw_sp_mr_route_action(const struct mlxsw_sp_mr_route *mr_route)
if (!mlxsw_sp_mr_route_valid_evifs_num(mr_route)) if (!mlxsw_sp_mr_route_valid_evifs_num(mr_route))
return MLXSW_SP_MR_ROUTE_ACTION_TRAP; return MLXSW_SP_MR_ROUTE_ACTION_TRAP;
/* If either one of the eVIFs is not regular (VIF of type pimreg or /* If one of the eVIFs has no RIF, trap-and-forward the route as there
* tunnel) or one of the VIFs has no matching RIF, trap the packet. * is some more routing to do in software too.
*/ */
list_for_each_entry(rve, &mr_route->evif_list, route_node) { list_for_each_entry(rve, &mr_route->evif_list, route_node)
if (!mlxsw_sp_mr_vif_regular(rve->mr_vif) || if (mlxsw_sp_mr_vif_exists(rve->mr_vif) && !rve->mr_vif->rif)
mlxsw_sp_mr_vif_rif_invalid(rve->mr_vif)) return MLXSW_SP_MR_ROUTE_ACTION_TRAP_AND_FORWARD;
return MLXSW_SP_MR_ROUTE_ACTION_TRAP;
}
return MLXSW_SP_MR_ROUTE_ACTION_FORWARD; return MLXSW_SP_MR_ROUTE_ACTION_FORWARD;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment