Merge branch 'mlxsw-fixes'
Ido Schimmel says: ==================== mlxsw fixes This patch set contains various fixes for mlxsw. Patches #1-#2 fix two trap related issues introduced in previous cycle. Patches #3-#5 fix rare use-after-frees discovered by syzkaller. After over a week of fuzzing with the fixes, the bugs did not reproduce. Patch #6 from Amit fixes an issue in the ethtool selftest that was recently discovered after running the test on a new platform that supports only 1Gbps and 10Gbps speeds. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
5d104a5f32
@ -486,6 +486,10 @@ narrow. The description of these groups must be added to the following table:
|
||||
- Contains packet traps for packets that should be locally delivered after
|
||||
routing, but do not match more specific packet traps (e.g.,
|
||||
``ipv4_bgp``)
|
||||
* - ``external_delivery``
|
||||
- Contains packet traps for packets that should be routed through an
|
||||
external interface (e.g., management interface) that does not belong to
|
||||
the same device (e.g., switch ASIC) as the ingress interface
|
||||
* - ``ipv6``
|
||||
- Contains packet traps for various IPv6 control packets (e.g., Router
|
||||
Advertisements)
|
||||
|
@ -1814,7 +1814,7 @@ static int mlxsw_core_reg_access_emad(struct mlxsw_core *mlxsw_core,
|
||||
err = mlxsw_emad_reg_access(mlxsw_core, reg, payload, type, trans,
|
||||
bulk_list, cb, cb_priv, tid);
|
||||
if (err) {
|
||||
kfree(trans);
|
||||
kfree_rcu(trans, rcu);
|
||||
return err;
|
||||
}
|
||||
return 0;
|
||||
@ -2051,11 +2051,13 @@ void mlxsw_core_skb_receive(struct mlxsw_core *mlxsw_core, struct sk_buff *skb,
|
||||
break;
|
||||
}
|
||||
}
|
||||
rcu_read_unlock();
|
||||
if (!found)
|
||||
if (!found) {
|
||||
rcu_read_unlock();
|
||||
goto drop;
|
||||
}
|
||||
|
||||
rxl->func(skb, local_port, rxl_item->priv);
|
||||
rcu_read_unlock();
|
||||
return;
|
||||
|
||||
drop:
|
||||
|
@ -5536,6 +5536,7 @@ enum mlxsw_reg_htgt_trap_group {
|
||||
MLXSW_REG_HTGT_TRAP_GROUP_SP_MULTICAST,
|
||||
MLXSW_REG_HTGT_TRAP_GROUP_SP_NEIGH_DISCOVERY,
|
||||
MLXSW_REG_HTGT_TRAP_GROUP_SP_ROUTER_EXP,
|
||||
MLXSW_REG_HTGT_TRAP_GROUP_SP_EXTERNAL_ROUTE,
|
||||
MLXSW_REG_HTGT_TRAP_GROUP_SP_IP2ME,
|
||||
MLXSW_REG_HTGT_TRAP_GROUP_SP_DHCP,
|
||||
MLXSW_REG_HTGT_TRAP_GROUP_SP_EVENT,
|
||||
|
@ -5001,15 +5001,6 @@ static void mlxsw_sp_router_fib4_del(struct mlxsw_sp *mlxsw_sp,
|
||||
|
||||
static bool mlxsw_sp_fib6_rt_should_ignore(const struct fib6_info *rt)
|
||||
{
|
||||
/* Packets with link-local destination IP arriving to the router
|
||||
* are trapped to the CPU, so no need to program specific routes
|
||||
* for them. Only allow prefix routes (usually one fe80::/64) so
|
||||
* that packets are trapped for the right reason.
|
||||
*/
|
||||
if ((ipv6_addr_type(&rt->fib6_dst.addr) & IPV6_ADDR_LINKLOCAL) &&
|
||||
(rt->fib6_flags & (RTF_LOCAL | RTF_ANYCAST)))
|
||||
return true;
|
||||
|
||||
/* Multicast routes aren't supported, so ignore them. Neighbour
|
||||
* Discovery packets are specifically trapped.
|
||||
*/
|
||||
@ -8078,16 +8069,6 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
|
||||
mlxsw_sp->router = router;
|
||||
router->mlxsw_sp = mlxsw_sp;
|
||||
|
||||
router->inetaddr_nb.notifier_call = mlxsw_sp_inetaddr_event;
|
||||
err = register_inetaddr_notifier(&router->inetaddr_nb);
|
||||
if (err)
|
||||
goto err_register_inetaddr_notifier;
|
||||
|
||||
router->inet6addr_nb.notifier_call = mlxsw_sp_inet6addr_event;
|
||||
err = register_inet6addr_notifier(&router->inet6addr_nb);
|
||||
if (err)
|
||||
goto err_register_inet6addr_notifier;
|
||||
|
||||
INIT_LIST_HEAD(&mlxsw_sp->router->nexthop_neighs_list);
|
||||
err = __mlxsw_sp_router_init(mlxsw_sp);
|
||||
if (err)
|
||||
@ -8128,12 +8109,6 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
|
||||
if (err)
|
||||
goto err_neigh_init;
|
||||
|
||||
mlxsw_sp->router->netevent_nb.notifier_call =
|
||||
mlxsw_sp_router_netevent_event;
|
||||
err = register_netevent_notifier(&mlxsw_sp->router->netevent_nb);
|
||||
if (err)
|
||||
goto err_register_netevent_notifier;
|
||||
|
||||
err = mlxsw_sp_mp_hash_init(mlxsw_sp);
|
||||
if (err)
|
||||
goto err_mp_hash_init;
|
||||
@ -8142,6 +8117,22 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
|
||||
if (err)
|
||||
goto err_dscp_init;
|
||||
|
||||
router->inetaddr_nb.notifier_call = mlxsw_sp_inetaddr_event;
|
||||
err = register_inetaddr_notifier(&router->inetaddr_nb);
|
||||
if (err)
|
||||
goto err_register_inetaddr_notifier;
|
||||
|
||||
router->inet6addr_nb.notifier_call = mlxsw_sp_inet6addr_event;
|
||||
err = register_inet6addr_notifier(&router->inet6addr_nb);
|
||||
if (err)
|
||||
goto err_register_inet6addr_notifier;
|
||||
|
||||
mlxsw_sp->router->netevent_nb.notifier_call =
|
||||
mlxsw_sp_router_netevent_event;
|
||||
err = register_netevent_notifier(&mlxsw_sp->router->netevent_nb);
|
||||
if (err)
|
||||
goto err_register_netevent_notifier;
|
||||
|
||||
mlxsw_sp->router->fib_nb.notifier_call = mlxsw_sp_router_fib_event;
|
||||
err = register_fib_notifier(mlxsw_sp_net(mlxsw_sp),
|
||||
&mlxsw_sp->router->fib_nb,
|
||||
@ -8152,10 +8143,15 @@ int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
|
||||
return 0;
|
||||
|
||||
err_register_fib_notifier:
|
||||
err_dscp_init:
|
||||
err_mp_hash_init:
|
||||
unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb);
|
||||
err_register_netevent_notifier:
|
||||
unregister_inet6addr_notifier(&router->inet6addr_nb);
|
||||
err_register_inet6addr_notifier:
|
||||
unregister_inetaddr_notifier(&router->inetaddr_nb);
|
||||
err_register_inetaddr_notifier:
|
||||
mlxsw_core_flush_owq();
|
||||
err_dscp_init:
|
||||
err_mp_hash_init:
|
||||
mlxsw_sp_neigh_fini(mlxsw_sp);
|
||||
err_neigh_init:
|
||||
mlxsw_sp_vrs_fini(mlxsw_sp);
|
||||
@ -8174,10 +8170,6 @@ err_ipips_init:
|
||||
err_rifs_init:
|
||||
__mlxsw_sp_router_fini(mlxsw_sp);
|
||||
err_router_init:
|
||||
unregister_inet6addr_notifier(&router->inet6addr_nb);
|
||||
err_register_inet6addr_notifier:
|
||||
unregister_inetaddr_notifier(&router->inetaddr_nb);
|
||||
err_register_inetaddr_notifier:
|
||||
mutex_destroy(&mlxsw_sp->router->lock);
|
||||
kfree(mlxsw_sp->router);
|
||||
return err;
|
||||
@ -8188,6 +8180,9 @@ void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp)
|
||||
unregister_fib_notifier(mlxsw_sp_net(mlxsw_sp),
|
||||
&mlxsw_sp->router->fib_nb);
|
||||
unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb);
|
||||
unregister_inet6addr_notifier(&mlxsw_sp->router->inet6addr_nb);
|
||||
unregister_inetaddr_notifier(&mlxsw_sp->router->inetaddr_nb);
|
||||
mlxsw_core_flush_owq();
|
||||
mlxsw_sp_neigh_fini(mlxsw_sp);
|
||||
mlxsw_sp_vrs_fini(mlxsw_sp);
|
||||
mlxsw_sp_mr_fini(mlxsw_sp);
|
||||
@ -8197,8 +8192,6 @@ void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp)
|
||||
mlxsw_sp_ipips_fini(mlxsw_sp);
|
||||
mlxsw_sp_rifs_fini(mlxsw_sp);
|
||||
__mlxsw_sp_router_fini(mlxsw_sp);
|
||||
unregister_inet6addr_notifier(&mlxsw_sp->router->inet6addr_nb);
|
||||
unregister_inetaddr_notifier(&mlxsw_sp->router->inetaddr_nb);
|
||||
mutex_destroy(&mlxsw_sp->router->lock);
|
||||
kfree(mlxsw_sp->router);
|
||||
}
|
||||
|
@ -328,6 +328,9 @@ mlxsw_sp_trap_policer_items_arr[] = {
|
||||
{
|
||||
.policer = MLXSW_SP_TRAP_POLICER(18, 1024, 128),
|
||||
},
|
||||
{
|
||||
.policer = MLXSW_SP_TRAP_POLICER(19, 1024, 512),
|
||||
},
|
||||
};
|
||||
|
||||
static const struct mlxsw_sp_trap_group_item mlxsw_sp_trap_group_items_arr[] = {
|
||||
@ -421,6 +424,11 @@ static const struct mlxsw_sp_trap_group_item mlxsw_sp_trap_group_items_arr[] = {
|
||||
.hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_IP2ME,
|
||||
.priority = 2,
|
||||
},
|
||||
{
|
||||
.group = DEVLINK_TRAP_GROUP_GENERIC(EXTERNAL_DELIVERY, 19),
|
||||
.hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_EXTERNAL_ROUTE,
|
||||
.priority = 1,
|
||||
},
|
||||
{
|
||||
.group = DEVLINK_TRAP_GROUP_GENERIC(IPV6, 15),
|
||||
.hw_group_id = MLXSW_REG_HTGT_TRAP_GROUP_SP_IPV6,
|
||||
@ -882,11 +890,11 @@ static const struct mlxsw_sp_trap_item mlxsw_sp_trap_items_arr[] = {
|
||||
},
|
||||
},
|
||||
{
|
||||
.trap = MLXSW_SP_TRAP_CONTROL(EXTERNAL_ROUTE, LOCAL_DELIVERY,
|
||||
.trap = MLXSW_SP_TRAP_CONTROL(EXTERNAL_ROUTE, EXTERNAL_DELIVERY,
|
||||
TRAP),
|
||||
.listeners_arr = {
|
||||
MLXSW_SP_RXL_MARK(RTR_INGRESS0, IP2ME, TRAP_TO_CPU,
|
||||
false),
|
||||
MLXSW_SP_RXL_MARK(RTR_INGRESS0, EXTERNAL_ROUTE,
|
||||
TRAP_TO_CPU, false),
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -718,6 +718,7 @@ enum devlink_trap_group_generic_id {
|
||||
DEVLINK_TRAP_GROUP_GENERIC_ID_PIM,
|
||||
DEVLINK_TRAP_GROUP_GENERIC_ID_UC_LB,
|
||||
DEVLINK_TRAP_GROUP_GENERIC_ID_LOCAL_DELIVERY,
|
||||
DEVLINK_TRAP_GROUP_GENERIC_ID_EXTERNAL_DELIVERY,
|
||||
DEVLINK_TRAP_GROUP_GENERIC_ID_IPV6,
|
||||
DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_EVENT,
|
||||
DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_GENERAL,
|
||||
@ -915,6 +916,8 @@ enum devlink_trap_group_generic_id {
|
||||
"uc_loopback"
|
||||
#define DEVLINK_TRAP_GROUP_GENERIC_NAME_LOCAL_DELIVERY \
|
||||
"local_delivery"
|
||||
#define DEVLINK_TRAP_GROUP_GENERIC_NAME_EXTERNAL_DELIVERY \
|
||||
"external_delivery"
|
||||
#define DEVLINK_TRAP_GROUP_GENERIC_NAME_IPV6 \
|
||||
"ipv6"
|
||||
#define DEVLINK_TRAP_GROUP_GENERIC_NAME_PTP_EVENT \
|
||||
|
@ -8567,6 +8567,7 @@ static const struct devlink_trap_group devlink_trap_group_generic[] = {
|
||||
DEVLINK_TRAP_GROUP(PIM),
|
||||
DEVLINK_TRAP_GROUP(UC_LB),
|
||||
DEVLINK_TRAP_GROUP(LOCAL_DELIVERY),
|
||||
DEVLINK_TRAP_GROUP(EXTERNAL_DELIVERY),
|
||||
DEVLINK_TRAP_GROUP(IPV6),
|
||||
DEVLINK_TRAP_GROUP(PTP_EVENT),
|
||||
DEVLINK_TRAP_GROUP(PTP_GENERAL),
|
||||
|
@ -252,8 +252,6 @@ check_highest_speed_is_chosen()
|
||||
fi
|
||||
|
||||
local -a speeds_arr=($(common_speeds_get $h1 $h2 0 1))
|
||||
# Remove the first speed, h1 does not advertise this speed.
|
||||
unset speeds_arr[0]
|
||||
|
||||
max_speed=${speeds_arr[0]}
|
||||
for current in ${speeds_arr[@]}; do
|
||||
|
Loading…
Reference in New Issue
Block a user