|
@@ -2909,9 +2909,13 @@ static struct rocker_neigh_tbl_entry *
|
|
|
}
|
|
|
|
|
|
static void _rocker_neigh_add(struct rocker *rocker,
|
|
|
+ enum switchdev_trans trans,
|
|
|
struct rocker_neigh_tbl_entry *entry)
|
|
|
{
|
|
|
- entry->index = rocker->neigh_tbl_next_index++;
|
|
|
+ entry->index = rocker->neigh_tbl_next_index;
|
|
|
+ if (trans == SWITCHDEV_TRANS_PREPARE)
|
|
|
+ return;
|
|
|
+ rocker->neigh_tbl_next_index++;
|
|
|
entry->ref_count++;
|
|
|
hash_add(rocker->neigh_tbl, &entry->entry,
|
|
|
be32_to_cpu(entry->ip_addr));
|
|
@@ -2921,6 +2925,8 @@ static void _rocker_neigh_del(struct rocker_port *rocker_port,
|
|
|
enum switchdev_trans trans,
|
|
|
struct rocker_neigh_tbl_entry *entry)
|
|
|
{
|
|
|
+ if (trans == SWITCHDEV_TRANS_PREPARE)
|
|
|
+ return;
|
|
|
if (--entry->ref_count == 0) {
|
|
|
hash_del(&entry->entry);
|
|
|
rocker_port_kfree(rocker_port, trans, entry);
|
|
@@ -2928,12 +2934,13 @@ static void _rocker_neigh_del(struct rocker_port *rocker_port,
|
|
|
}
|
|
|
|
|
|
static void _rocker_neigh_update(struct rocker_neigh_tbl_entry *entry,
|
|
|
+ enum switchdev_trans trans,
|
|
|
u8 *eth_dst, bool ttl_check)
|
|
|
{
|
|
|
if (eth_dst) {
|
|
|
ether_addr_copy(entry->eth_dst, eth_dst);
|
|
|
entry->ttl_check = ttl_check;
|
|
|
- } else {
|
|
|
+ } else if (trans != SWITCHDEV_TRANS_PREPARE) {
|
|
|
entry->ref_count++;
|
|
|
}
|
|
|
}
|
|
@@ -2973,12 +2980,12 @@ static int rocker_port_ipv4_neigh(struct rocker_port *rocker_port,
|
|
|
entry->dev = rocker_port->dev;
|
|
|
ether_addr_copy(entry->eth_dst, eth_dst);
|
|
|
entry->ttl_check = true;
|
|
|
- _rocker_neigh_add(rocker, entry);
|
|
|
+ _rocker_neigh_add(rocker, trans, entry);
|
|
|
} else if (removing) {
|
|
|
memcpy(entry, found, sizeof(*entry));
|
|
|
_rocker_neigh_del(rocker_port, trans, found);
|
|
|
} else if (updating) {
|
|
|
- _rocker_neigh_update(found, eth_dst, true);
|
|
|
+ _rocker_neigh_update(found, trans, eth_dst, true);
|
|
|
memcpy(entry, found, sizeof(*entry));
|
|
|
} else {
|
|
|
err = -ENOENT;
|
|
@@ -3089,13 +3096,13 @@ static int rocker_port_ipv4_nh(struct rocker_port *rocker_port,
|
|
|
if (adding) {
|
|
|
entry->ip_addr = ip_addr;
|
|
|
entry->dev = rocker_port->dev;
|
|
|
- _rocker_neigh_add(rocker, entry);
|
|
|
+ _rocker_neigh_add(rocker, trans, entry);
|
|
|
*index = entry->index;
|
|
|
resolved = false;
|
|
|
} else if (removing) {
|
|
|
_rocker_neigh_del(rocker_port, trans, found);
|
|
|
} else if (updating) {
|
|
|
- _rocker_neigh_update(found, NULL, false);
|
|
|
+ _rocker_neigh_update(found, trans, NULL, false);
|
|
|
resolved = !is_zero_ether_addr(found->eth_dst);
|
|
|
} else {
|
|
|
err = -ENOENT;
|