Skip to content

Commit 93144b0

Browse files
committed
Merge branch 'mlxsw-Add-neighbour-offload-indication'
Ido Schimmel says: ==================== mlxsw: Add neighbour offload indication Neighbour entries are programmed to the device's table so that the correct destination MAC will be specified in a packet after it was routed. Despite being programmed to the device and unlike routes and FDB entries, neighbour entries are currently not marked as offloaded. This patchset changes that. Patch kernel-patches#1 is a preparatory patch to make sure we only mark a neighbour as offloaded in case it was successfully programmed to the device. Patch kernel-patches#2 sets the offload indication on neighbours. Patch kernel-patches#3 adds a test to verify above mentioned functionality. Patched iproute2 version that prints the offload indication is available here [1]. [1] https://github.com/idosch/iproute2/tree/idosch-next ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 95337b9 + 3321cff commit 93144b0

File tree

2 files changed

+47
-8
lines changed

2 files changed

+47
-8
lines changed

drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2371,7 +2371,7 @@ static enum mlxsw_reg_rauht_op mlxsw_sp_rauht_op(bool adding)
23712371
MLXSW_REG_RAUHT_OP_WRITE_DELETE;
23722372
}
23732373

2374-
static void
2374+
static int
23752375
mlxsw_sp_router_neigh_entry_op4(struct mlxsw_sp *mlxsw_sp,
23762376
struct mlxsw_sp_neigh_entry *neigh_entry,
23772377
enum mlxsw_reg_rauht_op op)
@@ -2385,10 +2385,10 @@ mlxsw_sp_router_neigh_entry_op4(struct mlxsw_sp *mlxsw_sp,
23852385
if (neigh_entry->counter_valid)
23862386
mlxsw_reg_rauht_pack_counter(rauht_pl,
23872387
neigh_entry->counter_index);
2388-
mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rauht), rauht_pl);
2388+
return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rauht), rauht_pl);
23892389
}
23902390

2391-
static void
2391+
static int
23922392
mlxsw_sp_router_neigh_entry_op6(struct mlxsw_sp *mlxsw_sp,
23932393
struct mlxsw_sp_neigh_entry *neigh_entry,
23942394
enum mlxsw_reg_rauht_op op)
@@ -2402,7 +2402,7 @@ mlxsw_sp_router_neigh_entry_op6(struct mlxsw_sp *mlxsw_sp,
24022402
if (neigh_entry->counter_valid)
24032403
mlxsw_reg_rauht_pack_counter(rauht_pl,
24042404
neigh_entry->counter_index);
2405-
mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rauht), rauht_pl);
2405+
return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rauht), rauht_pl);
24062406
}
24072407

24082408
bool mlxsw_sp_neigh_ipv6_ignore(struct mlxsw_sp_neigh_entry *neigh_entry)
@@ -2424,20 +2424,33 @@ mlxsw_sp_neigh_entry_update(struct mlxsw_sp *mlxsw_sp,
24242424
struct mlxsw_sp_neigh_entry *neigh_entry,
24252425
bool adding)
24262426
{
2427+
enum mlxsw_reg_rauht_op op = mlxsw_sp_rauht_op(adding);
2428+
int err;
2429+
24272430
if (!adding && !neigh_entry->connected)
24282431
return;
24292432
neigh_entry->connected = adding;
24302433
if (neigh_entry->key.n->tbl->family == AF_INET) {
2431-
mlxsw_sp_router_neigh_entry_op4(mlxsw_sp, neigh_entry,
2432-
mlxsw_sp_rauht_op(adding));
2434+
err = mlxsw_sp_router_neigh_entry_op4(mlxsw_sp, neigh_entry,
2435+
op);
2436+
if (err)
2437+
return;
24332438
} else if (neigh_entry->key.n->tbl->family == AF_INET6) {
24342439
if (mlxsw_sp_neigh_ipv6_ignore(neigh_entry))
24352440
return;
2436-
mlxsw_sp_router_neigh_entry_op6(mlxsw_sp, neigh_entry,
2437-
mlxsw_sp_rauht_op(adding));
2441+
err = mlxsw_sp_router_neigh_entry_op6(mlxsw_sp, neigh_entry,
2442+
op);
2443+
if (err)
2444+
return;
24382445
} else {
24392446
WARN_ON_ONCE(1);
2447+
return;
24402448
}
2449+
2450+
if (adding)
2451+
neigh_entry->key.n->flags |= NTF_OFFLOADED;
2452+
else
2453+
neigh_entry->key.n->flags &= ~NTF_OFFLOADED;
24412454
}
24422455

24432456
void

tools/testing/selftests/drivers/net/mlxsw/rtnetlink.sh

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ ALL_TESTS="
2626
lag_dev_deletion_test
2727
vlan_interface_uppers_test
2828
bridge_extern_learn_test
29+
neigh_offload_test
2930
devlink_reload_test
3031
"
3132
NUM_NETIFS=2
@@ -561,6 +562,31 @@ bridge_extern_learn_test()
561562
ip link del dev br0
562563
}
563564

565+
neigh_offload_test()
566+
{
567+
# Test that IPv4 and IPv6 neighbour entries are marked as offloaded
568+
RET=0
569+
570+
ip -4 address add 192.0.2.1/24 dev $swp1
571+
ip -6 address add 2001:db8:1::1/64 dev $swp1
572+
573+
ip -4 neigh add 192.0.2.2 lladdr de:ad:be:ef:13:37 nud perm dev $swp1
574+
ip -6 neigh add 2001:db8:1::2 lladdr de:ad:be:ef:13:37 nud perm \
575+
dev $swp1
576+
577+
ip -4 neigh show dev $swp1 | grep 192.0.2.2 | grep -q offload
578+
check_err $? "ipv4 neigh entry not marked as offloaded when should"
579+
ip -6 neigh show dev $swp1 | grep 2001:db8:1::2 | grep -q offload
580+
check_err $? "ipv6 neigh entry not marked as offloaded when should"
581+
582+
log_test "neighbour offload indication"
583+
584+
ip -6 neigh del 2001:db8:1::2 dev $swp1
585+
ip -4 neigh del 192.0.2.2 dev $swp1
586+
ip -6 address del 2001:db8:1::1/64 dev $swp1
587+
ip -4 address del 192.0.2.1/24 dev $swp1
588+
}
589+
564590
devlink_reload_test()
565591
{
566592
# Test that after executing all the above configuration tests, a

0 commit comments

Comments
 (0)