2022-05-12 10:02:29

by Alaa Mohamed

[permalink] [raw]
Subject: [PATCH net-next v7 0/2] propagate extack to vxlan_fdb_delete

In order to propagate extack to vxlan_fdb_delete and vxlan_fdb_parse,
add extack to .ndo_fdb_del and edit all fdb del handelers.

Alaa Mohamed (2):
rtnetlink: add extack support in fdb del handlers
net: vxlan: Add extack support to vxlan_fdb_delete

drivers/net/ethernet/intel/ice/ice_main.c | 3 +-
drivers/net/ethernet/mscc/ocelot_net.c | 3 +-
.../net/ethernet/qlogic/qlcnic/qlcnic_main.c | 3 +-
drivers/net/macvlan.c | 3 +-
drivers/net/vxlan/vxlan_core.c | 41 +++++++++++++------
include/linux/netdevice.h | 2 +-
net/bridge/br_fdb.c | 3 +-
net/bridge/br_private.h | 3 +-
net/core/rtnetlink.c | 4 +-
9 files changed, 44 insertions(+), 21 deletions(-)

--
2.36.1



2022-05-12 21:27:46

by Alaa Mohamed

[permalink] [raw]
Subject: [PATCH net-next v7 1/2] rtnetlink: add extack support in fdb del handlers

Add extack support to .ndo_fdb_del in netdevice.h and
all related methods.

Signed-off-by: Alaa Mohamed <[email protected]>
---
changes in V3:
fix errors reported by checkpatch.pl
---
changes in V4:
fix errors reported by checkpatch.pl
---
changes in V5:
resubmit after rebase.
---
changes in V6:
update the kdoc on ice_fdb_del
---
changes in V7:
fix alignments in ocelot_port_fdb_del and
vxlan_fdb_delete.
---
drivers/net/ethernet/intel/ice/ice_main.c | 3 ++-
drivers/net/ethernet/mscc/ocelot_net.c | 3 ++-
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | 3 ++-
drivers/net/macvlan.c | 3 ++-
drivers/net/vxlan/vxlan_core.c | 3 ++-
include/linux/netdevice.h | 2 +-
net/bridge/br_fdb.c | 3 ++-
net/bridge/br_private.h | 3 ++-
net/core/rtnetlink.c | 4 ++--
9 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
index fde839ef0613..95f6c9610372 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -5674,11 +5674,12 @@ ice_fdb_add(struct ndmsg *ndm, struct nlattr __always_unused *tb[],
* @dev: the net device pointer
* @addr: the MAC address entry being added
* @vid: VLAN ID
+ * @extack: netlink extended ack
*/
static int
ice_fdb_del(struct ndmsg *ndm, __always_unused struct nlattr *tb[],
struct net_device *dev, const unsigned char *addr,
- __always_unused u16 vid)
+ __always_unused u16 vid, struct netlink_ext_ack *extack)
{
int err;

diff --git a/drivers/net/ethernet/mscc/ocelot_net.c b/drivers/net/ethernet/mscc/ocelot_net.c
index 247bc105bdd2..32d0a9e0a4b0 100644
--- a/drivers/net/ethernet/mscc/ocelot_net.c
+++ b/drivers/net/ethernet/mscc/ocelot_net.c
@@ -774,7 +774,8 @@ static int ocelot_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],

static int ocelot_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
struct net_device *dev,
- const unsigned char *addr, u16 vid)
+ const unsigned char *addr, u16 vid,
+ struct netlink_ext_ack *extack)
{
struct ocelot_port_private *priv = netdev_priv(dev);
struct ocelot_port *ocelot_port = &priv->port;
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index d320567b2cca..28476b982bab 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -368,7 +368,8 @@ static int qlcnic_set_mac(struct net_device *netdev, void *p)

static int qlcnic_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
struct net_device *netdev,
- const unsigned char *addr, u16 vid)
+ const unsigned char *addr, u16 vid,
+ struct netlink_ext_ack *extack)
{
struct qlcnic_adapter *adapter = netdev_priv(netdev);
int err = -EOPNOTSUPP;
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
index b00bc8173abe..cb27631c3a4d 100644
--- a/drivers/net/macvlan.c
+++ b/drivers/net/macvlan.c
@@ -1021,7 +1021,8 @@ static int macvlan_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],

static int macvlan_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
struct net_device *dev,
- const unsigned char *addr, u16 vid)
+ const unsigned char *addr, u16 vid,
+ struct netlink_ext_ack *extack)
{
struct macvlan_dev *vlan = netdev_priv(dev);
int err = -EINVAL;
diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
index 8a5e3a6d32d7..c58c48de4cf4 100644
--- a/drivers/net/vxlan/vxlan_core.c
+++ b/drivers/net/vxlan/vxlan_core.c
@@ -1280,7 +1280,8 @@ int __vxlan_fdb_delete(struct vxlan_dev *vxlan,
/* Delete entry (via netlink) */
static int vxlan_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
struct net_device *dev,
- const unsigned char *addr, u16 vid)
+ const unsigned char *addr, u16 vid,
+ struct netlink_ext_ack *extack)
{
struct vxlan_dev *vxlan = netdev_priv(dev);
union vxlan_addr ip;
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 7dccbfd1bf56..23731804a4b0 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1513,7 +1513,7 @@ struct net_device_ops {
struct nlattr *tb[],
struct net_device *dev,
const unsigned char *addr,
- u16 vid);
+ u16 vid, struct netlink_ext_ack *extack);
int (*ndo_fdb_del_bulk)(struct ndmsg *ndm,
struct nlattr *tb[],
struct net_device *dev,
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
index 1a3d583fbc8e..e7f4fccb6adb 100644
--- a/net/bridge/br_fdb.c
+++ b/net/bridge/br_fdb.c
@@ -1253,7 +1253,8 @@ static int __br_fdb_delete(struct net_bridge *br,
/* Remove neighbor entry with RTM_DELNEIGH */
int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
struct net_device *dev,
- const unsigned char *addr, u16 vid)
+ const unsigned char *addr, u16 vid,
+ struct netlink_ext_ack *extack)
{
struct net_bridge_vlan_group *vg;
struct net_bridge_port *p = NULL;
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 6ae882cfae1c..06e5f6faa431 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -793,7 +793,8 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
const unsigned char *addr, u16 vid, unsigned long flags);

int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
- struct net_device *dev, const unsigned char *addr, u16 vid);
+ struct net_device *dev, const unsigned char *addr, u16 vid,
+ struct netlink_ext_ack *extack);
int br_fdb_delete_bulk(struct ndmsg *ndm, struct nlattr *tb[],
struct net_device *dev, u16 vid,
struct netlink_ext_ack *extack);
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 73f2cbc440c9..3130df52b56a 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -4240,7 +4240,7 @@ static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
ops = br_dev->netdev_ops;
if (!del_bulk) {
if (ops->ndo_fdb_del)
- err = ops->ndo_fdb_del(ndm, tb, dev, addr, vid);
+ err = ops->ndo_fdb_del(ndm, tb, dev, addr, vid, extack);
} else {
if (ops->ndo_fdb_del_bulk)
err = ops->ndo_fdb_del_bulk(ndm, tb, dev, vid,
@@ -4258,7 +4258,7 @@ static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh,
ops = dev->netdev_ops;
if (!del_bulk) {
if (ops->ndo_fdb_del)
- err = ops->ndo_fdb_del(ndm, tb, dev, addr, vid);
+ err = ops->ndo_fdb_del(ndm, tb, dev, addr, vid, extack);
else
err = ndo_dflt_fdb_del(ndm, tb, dev, addr, vid);
} else {
--
2.36.1


2022-05-14 00:55:58

by Alaa Mohamed

[permalink] [raw]
Subject: [PATCH net-next v7 2/2] net: vxlan: Add extack support to vxlan_fdb_delete

This patch adds extack msg support to vxlan_fdb_delete and vxlan_fdb_parse.
extack is used to propagate meaningful error msgs to the user of vxlan
fdb netlink api

Signed-off-by: Alaa Mohamed <[email protected]>
---
changes in V2:
- fix spelling vxlan_fdb_delete
- add missing braces
- edit error message
---
changes in V3:
fix errors reported by checkpatch.pl
---
changes in V4:
- fix errors reported by checkpatch.pl
- edit commit message.
---
changes in V5:
- edit commit message
---
changes in V7:
fix checkpatch issue:
CHECK:Alignment should match open parenthesis
---
drivers/net/vxlan/vxlan_core.c | 38 ++++++++++++++++++++++++----------
1 file changed, 27 insertions(+), 11 deletions(-)

diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
index c58c48de4cf4..cb955bd79cb1 100644
--- a/drivers/net/vxlan/vxlan_core.c
+++ b/drivers/net/vxlan/vxlan_core.c
@@ -1129,19 +1129,25 @@ static void vxlan_fdb_dst_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f,

static int vxlan_fdb_parse(struct nlattr *tb[], struct vxlan_dev *vxlan,
union vxlan_addr *ip, __be16 *port, __be32 *src_vni,
- __be32 *vni, u32 *ifindex, u32 *nhid)
+ __be32 *vni, u32 *ifindex, u32 *nhid,
+ struct netlink_ext_ack *extack)
{
struct net *net = dev_net(vxlan->dev);
int err;

if (tb[NDA_NH_ID] && (tb[NDA_DST] || tb[NDA_VNI] || tb[NDA_IFINDEX] ||
- tb[NDA_PORT]))
- return -EINVAL;
+ tb[NDA_PORT])) {
+ NL_SET_ERR_MSG(extack,
+ "DST, VNI, ifindex and port are mutually exclusive with NH_ID");
+ return -EINVAL;
+ }

if (tb[NDA_DST]) {
err = vxlan_nla_get_addr(ip, tb[NDA_DST]);
- if (err)
+ if (err) {
+ NL_SET_ERR_MSG(extack, "Unsupported address family");
return err;
+ }
} else {
union vxlan_addr *remote = &vxlan->default_dst.remote_ip;

@@ -1157,24 +1163,30 @@ static int vxlan_fdb_parse(struct nlattr *tb[], struct vxlan_dev *vxlan,
}

if (tb[NDA_PORT]) {
- if (nla_len(tb[NDA_PORT]) != sizeof(__be16))
+ if (nla_len(tb[NDA_PORT]) != sizeof(__be16)) {
+ NL_SET_ERR_MSG(extack, "Invalid vxlan port");
return -EINVAL;
+ }
*port = nla_get_be16(tb[NDA_PORT]);
} else {
*port = vxlan->cfg.dst_port;
}

if (tb[NDA_VNI]) {
- if (nla_len(tb[NDA_VNI]) != sizeof(u32))
+ if (nla_len(tb[NDA_VNI]) != sizeof(u32)) {
+ NL_SET_ERR_MSG(extack, "Invalid vni");
return -EINVAL;
+ }
*vni = cpu_to_be32(nla_get_u32(tb[NDA_VNI]));
} else {
*vni = vxlan->default_dst.remote_vni;
}

if (tb[NDA_SRC_VNI]) {
- if (nla_len(tb[NDA_SRC_VNI]) != sizeof(u32))
+ if (nla_len(tb[NDA_SRC_VNI]) != sizeof(u32)) {
+ NL_SET_ERR_MSG(extack, "Invalid src vni");
return -EINVAL;
+ }
*src_vni = cpu_to_be32(nla_get_u32(tb[NDA_SRC_VNI]));
} else {
*src_vni = vxlan->default_dst.remote_vni;
@@ -1183,12 +1195,16 @@ static int vxlan_fdb_parse(struct nlattr *tb[], struct vxlan_dev *vxlan,
if (tb[NDA_IFINDEX]) {
struct net_device *tdev;

- if (nla_len(tb[NDA_IFINDEX]) != sizeof(u32))
+ if (nla_len(tb[NDA_IFINDEX]) != sizeof(u32)) {
+ NL_SET_ERR_MSG(extack, "Invalid ifindex");
return -EINVAL;
+ }
*ifindex = nla_get_u32(tb[NDA_IFINDEX]);
tdev = __dev_get_by_index(net, *ifindex);
- if (!tdev)
+ if (!tdev) {
+ NL_SET_ERR_MSG(extack, "Device not found");
return -EADDRNOTAVAIL;
+ }
} else {
*ifindex = 0;
}
@@ -1226,7 +1242,7 @@ static int vxlan_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
return -EINVAL;

err = vxlan_fdb_parse(tb, vxlan, &ip, &port, &src_vni, &vni, &ifindex,
- &nhid);
+ &nhid, extack);
if (err)
return err;

@@ -1292,7 +1308,7 @@ static int vxlan_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
int err;

err = vxlan_fdb_parse(tb, vxlan, &ip, &port, &src_vni, &vni, &ifindex,
- &nhid);
+ &nhid, extack);
if (err)
return err;

--
2.36.1


2022-05-14 01:19:52

by Vladimir Oltean

[permalink] [raw]
Subject: Re: [PATCH net-next v7 2/2] net: vxlan: Add extack support to vxlan_fdb_delete

On Thu, May 12, 2022 at 10:17:13AM -0700, Roopa Prabhu wrote:
>
> On 5/12/22 09:47, Jakub Kicinski wrote:
> > On Thu, 12 May 2022 09:22:17 -0700 Roopa Prabhu wrote:
> > > On 5/12/22 02:55, Alaa Mohamed wrote:
> > > > This patch adds extack msg support to vxlan_fdb_delete and vxlan_fdb_parse.
> > > > extack is used to propagate meaningful error msgs to the user of vxlan
> > > > fdb netlink api
> > > >
> > > > Signed-off-by: Alaa Mohamed <[email protected]>
> > Also the patches don't apply to net-next, again.
>
> that's probably because the patches were already applied. Ido just told me
> abt it also
>
> https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=5dd6da25255a9d64622c693b99d7668da939a980
>
> I have requested Alaa send an incremental fix (offline).
>
> thanks
>

Alaa, when you send the incremental fixup patch requested by Roopa,
could you please also:

- properly align the extack argument of the ocelot_port_fdb_del()
function
- properly align the extack argument of the vxlan_fdb_delete() function
- properly align the "DST, VNI, ifindex and port are mutually exclusive with NH_ID"
string to the open parenthesis of the NL_SET_ERR_MSG macro in vxlan_fdb_parse().
- make actual use of the extack in ice_fdb_add() and ice_fdb_del(), and
remove the __always_unused from ice_fdb_add().

Thank you.

2022-05-14 03:50:22

by Roopa Prabhu

[permalink] [raw]
Subject: Re: [PATCH net-next v7 2/2] net: vxlan: Add extack support to vxlan_fdb_delete


On 5/12/22 02:55, Alaa Mohamed wrote:
> This patch adds extack msg support to vxlan_fdb_delete and vxlan_fdb_parse.
> extack is used to propagate meaningful error msgs to the user of vxlan
> fdb netlink api
>
> Signed-off-by: Alaa Mohamed <[email protected]>
> ---
> changes in V2:
> - fix spelling vxlan_fdb_delete
> - add missing braces
> - edit error message
> ---
> changes in V3:
> fix errors reported by checkpatch.pl
> ---
> changes in V4:
> - fix errors reported by checkpatch.pl
> - edit commit message.
> ---
> changes in V5:
> - edit commit message
> ---
> changes in V7:
> fix checkpatch issue:
> CHECK:Alignment should match open parenthesis
> ---
> drivers/net/vxlan/vxlan_core.c | 38 ++++++++++++++++++++++++----------
> 1 file changed, 27 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/net/vxlan/vxlan_core.c b/drivers/net/vxlan/vxlan_core.c
> index c58c48de4cf4..cb955bd79cb1 100644
> --- a/drivers/net/vxlan/vxlan_core.c
> +++ b/drivers/net/vxlan/vxlan_core.c
> @@ -1129,19 +1129,25 @@ static void vxlan_fdb_dst_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f,
>
> static int vxlan_fdb_parse(struct nlattr *tb[], struct vxlan_dev *vxlan,
> union vxlan_addr *ip, __be16 *port, __be32 *src_vni,
> - __be32 *vni, u32 *ifindex, u32 *nhid)
> + __be32 *vni, u32 *ifindex, u32 *nhid,
> + struct netlink_ext_ack *extack)
> {
> struct net *net = dev_net(vxlan->dev);
> int err;
>
> if (tb[NDA_NH_ID] && (tb[NDA_DST] || tb[NDA_VNI] || tb[NDA_IFINDEX] ||
> - tb[NDA_PORT]))
> - return -EINVAL;
> + tb[NDA_PORT])) {
> + NL_SET_ERR_MSG(extack,
> + "DST, VNI, ifindex and port are mutually exclusive with NH_ID");
> + return -EINVAL;
> + }


Alaa, the closing brace should align with the if.

>
> if (tb[NDA_DST]) {
> err = vxlan_nla_get_addr(ip, tb[NDA_DST]);
> - if (err)
> + if (err) {
> + NL_SET_ERR_MSG(extack, "Unsupported address family");
> return err;
> + }
> } else {
> union vxlan_addr *remote = &vxlan->default_dst.remote_ip;
>
> @@ -1157,24 +1163,30 @@ static int vxlan_fdb_parse(struct nlattr *tb[], struct vxlan_dev *vxlan,
> }
>
> if (tb[NDA_PORT]) {
> - if (nla_len(tb[NDA_PORT]) != sizeof(__be16))
> + if (nla_len(tb[NDA_PORT]) != sizeof(__be16)) {
> + NL_SET_ERR_MSG(extack, "Invalid vxlan port");
> return -EINVAL;
> + }
> *port = nla_get_be16(tb[NDA_PORT]);
> } else {
> *port = vxlan->cfg.dst_port;
> }
>
> if (tb[NDA_VNI]) {
> - if (nla_len(tb[NDA_VNI]) != sizeof(u32))
> + if (nla_len(tb[NDA_VNI]) != sizeof(u32)) {
> + NL_SET_ERR_MSG(extack, "Invalid vni");
> return -EINVAL;
> + }
> *vni = cpu_to_be32(nla_get_u32(tb[NDA_VNI]));
> } else {
> *vni = vxlan->default_dst.remote_vni;
> }
>
> if (tb[NDA_SRC_VNI]) {
> - if (nla_len(tb[NDA_SRC_VNI]) != sizeof(u32))
> + if (nla_len(tb[NDA_SRC_VNI]) != sizeof(u32)) {
> + NL_SET_ERR_MSG(extack, "Invalid src vni");
> return -EINVAL;
> + }
> *src_vni = cpu_to_be32(nla_get_u32(tb[NDA_SRC_VNI]));
> } else {
> *src_vni = vxlan->default_dst.remote_vni;
> @@ -1183,12 +1195,16 @@ static int vxlan_fdb_parse(struct nlattr *tb[], struct vxlan_dev *vxlan,
> if (tb[NDA_IFINDEX]) {
> struct net_device *tdev;
>
> - if (nla_len(tb[NDA_IFINDEX]) != sizeof(u32))
> + if (nla_len(tb[NDA_IFINDEX]) != sizeof(u32)) {
> + NL_SET_ERR_MSG(extack, "Invalid ifindex");
> return -EINVAL;
> + }
> *ifindex = nla_get_u32(tb[NDA_IFINDEX]);
> tdev = __dev_get_by_index(net, *ifindex);
> - if (!tdev)
> + if (!tdev) {
> + NL_SET_ERR_MSG(extack, "Device not found");
> return -EADDRNOTAVAIL;
> + }
> } else {
> *ifindex = 0;
> }
> @@ -1226,7 +1242,7 @@ static int vxlan_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
> return -EINVAL;
>
> err = vxlan_fdb_parse(tb, vxlan, &ip, &port, &src_vni, &vni, &ifindex,
> - &nhid);
> + &nhid, extack);
> if (err)
> return err;
>
> @@ -1292,7 +1308,7 @@ static int vxlan_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
> int err;
>
> err = vxlan_fdb_parse(tb, vxlan, &ip, &port, &src_vni, &vni, &ifindex,
> - &nhid);
> + &nhid, extack);
> if (err)
> return err;
>
> --
> 2.36.1
>