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 #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 #2 sets the offload indication on neighbours. Patch #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)