[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20211025222415.983883-8-vladimir.oltean@nxp.com>
Date: Tue, 26 Oct 2021 01:24:07 +0300
From: Vladimir Oltean <vladimir.oltean@....com>
To: netdev@...r.kernel.org, Roopa Prabhu <roopa@...dia.com>,
Nikolay Aleksandrov <nikolay@...dia.com>,
Ido Schimmel <idosch@...dia.com>
Cc: Jakub Kicinski <kuba@...nel.org>,
"David S. Miller" <davem@...emloft.net>,
Andrew Lunn <andrew@...n.ch>,
Florian Fainelli <f.fainelli@...il.com>,
Vivien Didelot <vivien.didelot@...il.com>,
Vladimir Oltean <olteanv@...il.com>,
Jiri Pirko <jiri@...dia.com>
Subject: [RFC PATCH net-next 07/15] net: switchdev: keep the MAC address by value in struct switchdev_notifier_fdb_info
Currently, shallow copies of struct switchdev_notifier_fdb_info cannot
be carried around, since the "addr" member points to bridge memory.
This complicates driver implementations because they need to explicitly
allocate a separate piece of memory for the address.
Replace the pointer with a 6-byte size array and simplify driver
handling. This makes the structure safely copyable, which in turn eases
some of the future changes (having a similar API between
switchdev_fdb_mark_pending and switchdev_fdb_mark_done).
Signed-off-by: Vladimir Oltean <vladimir.oltean@....com>
---
.../ethernet/freescale/dpaa2/dpaa2-switch.c | 14 +-------------
.../marvell/prestera/prestera_switchdev.c | 18 +++---------------
.../mellanox/mlx5/core/en/rep/bridge.c | 10 ----------
.../ethernet/mellanox/mlx5/core/esw/bridge.c | 2 +-
.../ethernet/mellanox/mlxsw/spectrum_router.c | 4 ++--
.../mellanox/mlxsw/spectrum_switchdev.c | 11 ++---------
.../microchip/sparx5/sparx5_mactable.c | 2 +-
.../microchip/sparx5/sparx5_switchdev.c | 12 +-----------
drivers/net/ethernet/rocker/rocker_main.c | 13 ++-----------
drivers/net/ethernet/rocker/rocker_ofdpa.c | 2 +-
drivers/net/ethernet/ti/am65-cpsw-switchdev.c | 14 ++------------
drivers/net/ethernet/ti/cpsw_switchdev.c | 14 ++------------
drivers/s390/net/qeth_l2_main.c | 11 ++++-------
include/net/switchdev.h | 2 +-
net/bridge/br_switchdev.c | 2 +-
net/dsa/slave.c | 2 +-
16 files changed, 25 insertions(+), 108 deletions(-)
diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
index d039457928b0..6190feb44219 100644
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
@@ -2246,7 +2246,6 @@ static void dpaa2_switch_event_work(struct work_struct *work)
}
rtnl_unlock();
- kfree(switchdev_work->fdb_info.addr);
kfree(switchdev_work);
dev_put(dev);
}
@@ -2278,15 +2277,8 @@ static int dpaa2_switch_port_event(struct notifier_block *nb,
switch (event) {
case SWITCHDEV_FDB_ADD_TO_DEVICE:
case SWITCHDEV_FDB_DEL_TO_DEVICE:
- memcpy(&switchdev_work->fdb_info, ptr,
+ memcpy(&switchdev_work->fdb_info, fdb_info,
sizeof(switchdev_work->fdb_info));
- switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
- if (!switchdev_work->fdb_info.addr)
- goto err_addr_alloc;
-
- ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
- fdb_info->addr);
-
/* Take a reference on the device to avoid being freed. */
dev_hold(dev);
break;
@@ -2298,10 +2290,6 @@ static int dpaa2_switch_port_event(struct notifier_block *nb,
queue_work(ethsw->workqueue, &switchdev_work->work);
return NOTIFY_DONE;
-
-err_addr_alloc:
- kfree(switchdev_work);
- return NOTIFY_BAD;
}
static int dpaa2_switch_port_obj_event(unsigned long event,
diff --git a/drivers/net/ethernet/marvell/prestera/prestera_switchdev.c b/drivers/net/ethernet/marvell/prestera/prestera_switchdev.c
index 3ce6ccd0f539..236b07c42df0 100644
--- a/drivers/net/ethernet/marvell/prestera/prestera_switchdev.c
+++ b/drivers/net/ethernet/marvell/prestera/prestera_switchdev.c
@@ -760,7 +760,7 @@ prestera_fdb_offload_notify(struct prestera_port *port,
{
struct switchdev_notifier_fdb_info send_info = {};
- send_info.addr = info->addr;
+ ether_addr_copy(send_info.addr, info->addr);
send_info.vid = info->vid;
send_info.offloaded = true;
@@ -836,7 +836,6 @@ static void prestera_fdb_event_work(struct work_struct *work)
out_unlock:
rtnl_unlock();
- kfree(swdev_work->fdb_info.addr);
kfree(swdev_work);
dev_put(dev);
}
@@ -883,15 +882,8 @@ static int prestera_switchdev_event(struct notifier_block *unused,
info);
INIT_WORK(&swdev_work->work, prestera_fdb_event_work);
- memcpy(&swdev_work->fdb_info, ptr,
+ memcpy(&swdev_work->fdb_info, fdb_info,
sizeof(swdev_work->fdb_info));
-
- swdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
- if (!swdev_work->fdb_info.addr)
- goto out_bad;
-
- ether_addr_copy((u8 *)swdev_work->fdb_info.addr,
- fdb_info->addr);
dev_hold(dev);
break;
@@ -902,10 +894,6 @@ static int prestera_switchdev_event(struct notifier_block *unused,
queue_work(swdev_wq, &swdev_work->work);
return NOTIFY_DONE;
-
-out_bad:
- kfree(swdev_work);
- return NOTIFY_BAD;
}
static int
@@ -1156,7 +1144,7 @@ static void prestera_fdb_event(struct prestera_switch *sw,
if (!dev)
return;
- info.addr = evt->fdb_evt.data.mac;
+ ether_addr_copy(info.addr, evt->fdb_evt.data.mac);
info.vid = evt->fdb_evt.vid;
info.offloaded = true;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c b/drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c
index c6d2f8c78db7..d9735d817073 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/rep/bridge.c
@@ -306,7 +306,6 @@ static void
mlx5_esw_bridge_cleanup_switchdev_fdb_work(struct mlx5_bridge_switchdev_fdb_work *fdb_work)
{
dev_put(fdb_work->dev);
- kfree(fdb_work->fdb_info.addr);
kfree(fdb_work);
}
@@ -345,7 +344,6 @@ mlx5_esw_bridge_init_switchdev_fdb_work(struct net_device *dev, bool add,
struct mlx5_esw_bridge_offloads *br_offloads)
{
struct mlx5_bridge_switchdev_fdb_work *work;
- u8 *addr;
work = kzalloc(sizeof(*work), GFP_ATOMIC);
if (!work)
@@ -354,14 +352,6 @@ mlx5_esw_bridge_init_switchdev_fdb_work(struct net_device *dev, bool add,
INIT_WORK(&work->work, mlx5_esw_bridge_switchdev_fdb_event_work);
memcpy(&work->fdb_info, fdb_info, sizeof(work->fdb_info));
- addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
- if (!addr) {
- kfree(work);
- return ERR_PTR(-ENOMEM);
- }
- ether_addr_copy(addr, fdb_info->addr);
- work->fdb_info.addr = addr;
-
dev_hold(dev);
work->dev = dev;
work->br_offloads = br_offloads;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c b/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c
index 588622ba38c1..30584aad3021 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/esw/bridge.c
@@ -77,7 +77,7 @@ mlx5_esw_bridge_fdb_offload_notify(struct net_device *dev, const unsigned char *
{
struct switchdev_notifier_fdb_info send_info = {};
- send_info.addr = addr;
+ ether_addr_copy(send_info.addr, addr);
send_info.vid = vid;
send_info.offloaded = true;
call_switchdev_notifiers(val, dev, &send_info.info, NULL);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 1e141b5944cd..54bd2b30eb8c 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -9216,7 +9216,7 @@ static void mlxsw_sp_rif_fid_fdb_del(struct mlxsw_sp_rif *rif, const char *mac)
if (!dev)
return;
- info.addr = mac;
+ ether_addr_copy(info.addr, mac);
info.vid = 0;
call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE, dev, &info.info,
NULL);
@@ -9267,7 +9267,7 @@ static void mlxsw_sp_rif_vlan_fdb_del(struct mlxsw_sp_rif *rif, const char *mac)
if (!dev)
return;
- info.addr = mac;
+ ether_addr_copy(info.addr, mac);
info.vid = vid;
call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE, dev, &info.info,
NULL);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
index 81c7e8a7fcf5..2b66a6d8d8a0 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
@@ -2519,7 +2519,7 @@ mlxsw_sp_fdb_call_notifiers(enum switchdev_notifier_type type,
{
struct switchdev_notifier_fdb_info info = {};
- info.addr = mac;
+ ether_addr_copy(info.addr, mac);
info.vid = vid;
info.offloaded = offloaded;
call_switchdev_notifiers(type, dev, &info.info, NULL);
@@ -3010,7 +3010,6 @@ static void mlxsw_sp_switchdev_bridge_fdb_event_work(struct work_struct *work)
out:
rtnl_unlock();
- kfree(switchdev_work->fdb_info.addr);
kfree(switchdev_work);
dev_put(dev);
}
@@ -3253,13 +3252,8 @@ static int mlxsw_sp_switchdev_event(struct notifier_block *unused,
info);
INIT_WORK(&switchdev_work->work,
mlxsw_sp_switchdev_bridge_fdb_event_work);
- memcpy(&switchdev_work->fdb_info, ptr,
+ memcpy(&switchdev_work->fdb_info, fdb_info,
sizeof(switchdev_work->fdb_info));
- switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
- if (!switchdev_work->fdb_info.addr)
- goto err_addr_alloc;
- ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
- fdb_info->addr);
/* Take a reference on the device. This can be either
* upper device containig mlxsw_sp_port or just a
* mlxsw_sp_port
@@ -3286,7 +3280,6 @@ static int mlxsw_sp_switchdev_event(struct notifier_block *unused,
return NOTIFY_DONE;
err_vxlan_work_prepare:
-err_addr_alloc:
kfree(switchdev_work);
return NOTIFY_BAD;
}
diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c
index 9a8e4f201eb1..3dcb6a887ea5 100644
--- a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c
+++ b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c
@@ -279,7 +279,7 @@ static void sparx5_fdb_call_notifiers(enum switchdev_notifier_type type,
{
struct switchdev_notifier_fdb_info info = {};
- info.addr = mac;
+ ether_addr_copy(info.addr, mac);
info.vid = vid;
info.offloaded = offloaded;
call_switchdev_notifiers(type, dev, &info.info, NULL);
diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c
index 649ca609884a..5c5eb557a19c 100644
--- a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c
+++ b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c
@@ -254,7 +254,6 @@ static void sparx5_switchdev_bridge_fdb_event_work(struct work_struct *work)
out:
rtnl_unlock();
- kfree(switchdev_work->fdb_info.addr);
kfree(switchdev_work);
dev_put(dev);
}
@@ -294,14 +293,8 @@ static int sparx5_switchdev_event(struct notifier_block *unused,
info);
INIT_WORK(&switchdev_work->work,
sparx5_switchdev_bridge_fdb_event_work);
- memcpy(&switchdev_work->fdb_info, ptr,
+ memcpy(&switchdev_work->fdb_info, fdb_info,
sizeof(switchdev_work->fdb_info));
- switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
- if (!switchdev_work->fdb_info.addr)
- goto err_addr_alloc;
-
- ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
- fdb_info->addr);
dev_hold(dev);
sparx5_schedule_work(&switchdev_work->work);
@@ -309,9 +302,6 @@ static int sparx5_switchdev_event(struct notifier_block *unused,
}
return NOTIFY_DONE;
-err_addr_alloc:
- kfree(switchdev_work);
- return NOTIFY_BAD;
}
static void sparx5_sync_port_dev_addr(struct sparx5 *sparx5,
diff --git a/drivers/net/ethernet/rocker/rocker_main.c b/drivers/net/ethernet/rocker/rocker_main.c
index ba4062881eed..e5ab9f577808 100644
--- a/drivers/net/ethernet/rocker/rocker_main.c
+++ b/drivers/net/ethernet/rocker/rocker_main.c
@@ -2720,7 +2720,7 @@ rocker_fdb_offload_notify(struct rocker_port *rocker_port,
{
struct switchdev_notifier_fdb_info info = {};
- info.addr = recv_info->addr;
+ ether_addr_copy(info.addr, recv_info->addr);
info.vid = recv_info->vid;
info.offloaded = true;
call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED,
@@ -2759,7 +2759,6 @@ static void rocker_switchdev_event_work(struct work_struct *work)
}
rtnl_unlock();
- kfree(switchdev_work->fdb_info.addr);
kfree(switchdev_work);
dev_put(rocker_port->dev);
}
@@ -2791,16 +2790,8 @@ static int rocker_switchdev_event(struct notifier_block *unused,
switch (event) {
case SWITCHDEV_FDB_ADD_TO_DEVICE:
case SWITCHDEV_FDB_DEL_TO_DEVICE:
- memcpy(&switchdev_work->fdb_info, ptr,
+ memcpy(&switchdev_work->fdb_info, fdb_info,
sizeof(switchdev_work->fdb_info));
- switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
- if (unlikely(!switchdev_work->fdb_info.addr)) {
- kfree(switchdev_work);
- return NOTIFY_BAD;
- }
-
- ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
- fdb_info->addr);
/* Take a reference on the rocker device */
dev_hold(dev);
break;
diff --git a/drivers/net/ethernet/rocker/rocker_ofdpa.c b/drivers/net/ethernet/rocker/rocker_ofdpa.c
index 3e1ca7a8d029..abdb4b49add1 100644
--- a/drivers/net/ethernet/rocker/rocker_ofdpa.c
+++ b/drivers/net/ethernet/rocker/rocker_ofdpa.c
@@ -1824,7 +1824,7 @@ static void ofdpa_port_fdb_learn_work(struct work_struct *work)
bool learned = (lw->flags & OFDPA_OP_FLAG_LEARNED);
struct switchdev_notifier_fdb_info info = {};
- info.addr = lw->addr;
+ ether_addr_copy(info.addr, lw->addr);
info.vid = lw->vid;
rtnl_lock();
diff --git a/drivers/net/ethernet/ti/am65-cpsw-switchdev.c b/drivers/net/ethernet/ti/am65-cpsw-switchdev.c
index 599708a3e81d..860214e1a8ca 100644
--- a/drivers/net/ethernet/ti/am65-cpsw-switchdev.c
+++ b/drivers/net/ethernet/ti/am65-cpsw-switchdev.c
@@ -360,7 +360,7 @@ static void am65_cpsw_fdb_offload_notify(struct net_device *ndev,
{
struct switchdev_notifier_fdb_info info = {};
- info.addr = rcv->addr;
+ ether_addr_copy(info.addr, rcv->addr);
info.vid = rcv->vid;
info.offloaded = true;
call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED,
@@ -414,7 +414,6 @@ static void am65_cpsw_switchdev_event_work(struct work_struct *work)
}
rtnl_unlock();
- kfree(switchdev_work->fdb_info.addr);
kfree(switchdev_work);
dev_put(port->ndev);
}
@@ -450,13 +449,8 @@ static int am65_cpsw_switchdev_event(struct notifier_block *unused,
switch (event) {
case SWITCHDEV_FDB_ADD_TO_DEVICE:
case SWITCHDEV_FDB_DEL_TO_DEVICE:
- memcpy(&switchdev_work->fdb_info, ptr,
+ memcpy(&switchdev_work->fdb_info, fdb_info,
sizeof(switchdev_work->fdb_info));
- switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
- if (!switchdev_work->fdb_info.addr)
- goto err_addr_alloc;
- ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
- fdb_info->addr);
dev_hold(ndev);
break;
default:
@@ -467,10 +461,6 @@ static int am65_cpsw_switchdev_event(struct notifier_block *unused,
queue_work(system_long_wq, &switchdev_work->work);
return NOTIFY_DONE;
-
-err_addr_alloc:
- kfree(switchdev_work);
- return NOTIFY_BAD;
}
static struct notifier_block cpsw_switchdev_notifier = {
diff --git a/drivers/net/ethernet/ti/cpsw_switchdev.c b/drivers/net/ethernet/ti/cpsw_switchdev.c
index a7d97d429e06..786bb848ddeb 100644
--- a/drivers/net/ethernet/ti/cpsw_switchdev.c
+++ b/drivers/net/ethernet/ti/cpsw_switchdev.c
@@ -370,7 +370,7 @@ static void cpsw_fdb_offload_notify(struct net_device *ndev,
{
struct switchdev_notifier_fdb_info info = {};
- info.addr = rcv->addr;
+ ether_addr_copy(info.addr, rcv->addr);
info.vid = rcv->vid;
info.offloaded = true;
call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED,
@@ -424,7 +424,6 @@ static void cpsw_switchdev_event_work(struct work_struct *work)
}
rtnl_unlock();
- kfree(switchdev_work->fdb_info.addr);
kfree(switchdev_work);
dev_put(priv->ndev);
}
@@ -460,13 +459,8 @@ static int cpsw_switchdev_event(struct notifier_block *unused,
switch (event) {
case SWITCHDEV_FDB_ADD_TO_DEVICE:
case SWITCHDEV_FDB_DEL_TO_DEVICE:
- memcpy(&switchdev_work->fdb_info, ptr,
+ memcpy(&switchdev_work->fdb_info, fdb_info,
sizeof(switchdev_work->fdb_info));
- switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
- if (!switchdev_work->fdb_info.addr)
- goto err_addr_alloc;
- ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
- fdb_info->addr);
dev_hold(ndev);
break;
default:
@@ -477,10 +471,6 @@ static int cpsw_switchdev_event(struct notifier_block *unused,
queue_work(system_long_wq, &switchdev_work->work);
return NOTIFY_DONE;
-
-err_addr_alloc:
- kfree(switchdev_work);
- return NOTIFY_BAD;
}
static struct notifier_block cpsw_switchdev_notifier = {
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
index 0347fc184786..deb8e3889f7e 100644
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -283,7 +283,6 @@ static void qeth_l2_dev2br_fdb_flush(struct qeth_card *card)
QETH_CARD_TEXT(card, 2, "fdbflush");
- info.addr = NULL;
/* flush all VLANs: */
info.vid = 0;
info.added_by_user = false;
@@ -637,20 +636,18 @@ static void qeth_l2_dev2br_fdb_notify(struct qeth_card *card, u8 code,
struct mac_addr_lnid *addr_lnid)
{
struct switchdev_notifier_fdb_info info = {};
- u8 ntfy_mac[ETH_ALEN];
- ether_addr_copy(ntfy_mac, addr_lnid->mac);
/* Ignore VLAN only changes */
if (!(code & IPA_ADDR_CHANGE_CODE_MACADDR))
return;
/* Ignore mcast entries */
- if (is_multicast_ether_addr(ntfy_mac))
+ if (is_multicast_ether_addr(addr_lnid->mac))
return;
/* Ignore my own addresses */
if (qeth_is_my_net_if_token(card, token))
return;
- info.addr = ntfy_mac;
+ ether_addr_copy(info.addr, addr_lnid->mac);
/* don't report VLAN IDs */
info.vid = 0;
info.added_by_user = false;
@@ -661,13 +658,13 @@ static void qeth_l2_dev2br_fdb_notify(struct qeth_card *card, u8 code,
card->dev, &info.info, NULL);
QETH_CARD_TEXT(card, 4, "andelmac");
QETH_CARD_TEXT_(card, 4,
- "mc%012llx", ether_addr_to_u64(ntfy_mac));
+ "mc%012llx", ether_addr_to_u64(info.addr));
} else {
call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE,
card->dev, &info.info, NULL);
QETH_CARD_TEXT(card, 4, "anaddmac");
QETH_CARD_TEXT_(card, 4,
- "mc%012llx", ether_addr_to_u64(ntfy_mac));
+ "mc%012llx", ether_addr_to_u64(info.addr));
}
}
diff --git a/include/net/switchdev.h b/include/net/switchdev.h
index 60d806b6a5ae..6764fb7692e2 100644
--- a/include/net/switchdev.h
+++ b/include/net/switchdev.h
@@ -218,7 +218,7 @@ struct switchdev_notifier_info {
struct switchdev_notifier_fdb_info {
struct switchdev_notifier_info info; /* must be first */
- const unsigned char *addr;
+ unsigned char addr[ETH_ALEN];
u16 vid;
u8 added_by_user:1,
is_local:1,
diff --git a/net/bridge/br_switchdev.c b/net/bridge/br_switchdev.c
index 2fbe881cdfe2..f58fb06ae641 100644
--- a/net/bridge/br_switchdev.c
+++ b/net/bridge/br_switchdev.c
@@ -129,7 +129,7 @@ static void br_switchdev_fdb_populate(struct net_bridge *br,
{
const struct net_bridge_port *p = READ_ONCE(fdb->dst);
- item->addr = fdb->key.addr.addr;
+ ether_addr_copy(item->addr, fdb->key.addr.addr);
item->vid = fdb->key.vlan_id;
item->added_by_user = test_bit(BR_FDB_ADDED_BY_USER, &fdb->flags);
item->offloaded = test_bit(BR_FDB_OFFLOADED, &fdb->flags);
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index adcfb2cb4e61..54d53e18a211 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -2395,7 +2395,7 @@ dsa_fdb_offload_notify(struct dsa_switchdev_event_work *switchdev_work)
if (!dsa_is_user_port(ds, switchdev_work->port))
return;
- info.addr = switchdev_work->addr;
+ ether_addr_copy(info.addr, switchdev_work->addr);
info.vid = switchdev_work->vid;
info.offloaded = true;
dp = dsa_to_port(ds, switchdev_work->port);
--
2.25.1
Powered by blists - more mailing lists