net: More extack messages
Subsystems (4)
David Ahern
maintainercover net: More extack messages
From: David Ahern <[email protected]>
Add more extack messages for several link create errors (e.g., invalid number of queues, unknown link kind) and invalid metrics argument.
David Ahern (3):
net: Add extack argument to rtnl_create_link
net: Add extack argument to ip_fib_metrics_init
rtnetlink: Add more extack messages to rtnl_newlink
drivers/net/can/vxcan.c | 2 +- drivers/net/geneve.c | 2 +- drivers/net/veth.c | 2 +- drivers/net/vxlan.c | 2 +- include/net/ip.h | 3 ++- include/net/rtnetlink.h | 3 ++- net/core/rtnetlink.c | 24 ++++++++++++++++-------- net/ipv4/fib_semantics.c | 2 +- net/ipv4/ip_gre.c | 2 +- net/ipv4/metrics.c | 26 +++++++++++++++++++------- net/ipv6/route.c | 5 +++-- 11 files changed, 48 insertions(+), 25 deletions(-)
Signature · 1 line
2.11.0
David Ahern
maintainerPATCH 1/3 net: Add extack argument to rtnl_create_link
From: David Ahern <[email protected]>
Add extack arg to rtnl_create_link and add messages for invalid number of Tx or Rx queues.
--- drivers/net/can/vxcan.c | 2 +- drivers/net/geneve.c | 2 +- drivers/net/veth.c | 2 +- drivers/net/vxlan.c | 2 +- include/net/rtnetlink.h | 3 ++- net/core/rtnetlink.c | 18 ++++++++++++------ net/ipv4/ip_gre.c | 2 +- 7 files changed, 19 insertions(+), 12 deletions(-)
drivers/net/can/vxcan.c +1 -1
@@ -207,7 +207,7 @@ static int vxcan_newlink(struct net *net, struct net_device *dev,return PTR_ERR (peer_net); peer =rtnl_create_link (peer_net, ifname, name_assign_type, - &vxcan_link_ops, tbp); + &vxcan_link_ops, tbp, extack);if (IS_ERR (peer)) {put_net (peer_net);return PTR_ERR (peer);
drivers/net/geneve.c +1 -1
@@ -1666,7 +1666,7 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name,memset (tb,0 ,sizeof (tb)); dev =rtnl_create_link (net, name, name_assign_type, - &geneve_link_ops, tb); + &geneve_link_ops, tb,NULL );if (IS_ERR (dev))return dev;
drivers/net/veth.c +1 -1
@@ -1253,7 +1253,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev,return PTR_ERR (net); peer =rtnl_create_link (net, ifname, name_assign_type, - &veth_link_ops, tbp); + &veth_link_ops, tbp, extack);if (IS_ERR (peer)) {put_net (net);return PTR_ERR (peer);
drivers/net/vxlan.c +1 -1
@@ -3749,7 +3749,7 @@ struct net_device *vxlan_dev_create(struct net *net, const char *name,memset (&tb,0 ,sizeof (tb)); dev =rtnl_create_link (net, name, name_assign_type, - &vxlan_link_ops, tb); + &vxlan_link_ops, tb,NULL );if (IS_ERR (dev))return dev;
include/net/rtnetlink.h +2 -1
@@ -159,7 +159,8 @@ struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]);struct net_device *rtnl_create_link (struct net *net,const char *ifname,unsigned char name_assign_type,const struct rtnl_link_ops *ops, -struct nlattr *tb[]); +struct nlattr *tb[], +struct netlink_ext_ack *extack);int rtnl_delete_link (struct net_device *dev);int rtnl_configure_link (struct net_device *dev,const struct ifinfomsg *ifm);
net/core/rtnetlink.c +12 -6
@@ -2885,9 +2885,11 @@ int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm) }EXPORT_SYMBOL (rtnl_configure_link); -struct net_device *rtnl_create_link (struct net *net, -const char *ifname,unsigned char name_assign_type, -const struct rtnl_link_ops *ops,struct nlattr *tb[]) +struct net_device *rtnl_create_link (struct net *net,const char *ifname, +unsigned char name_assign_type, +const struct rtnl_link_ops *ops, +struct nlattr *tb[], +struct netlink_ext_ack *extack) {struct net_device *dev;unsigned int num_tx_queues =1 ;
@@ -2903,11 +2905,15 @@ struct net_device *rtnl_create_link(struct net *net,else if (ops->get_num_rx_queues) num_rx_queues = ops->get_num_rx_queues (); -if (num_tx_queues <1 || num_tx_queues >4096 ) +if (num_tx_queues <1 || num_tx_queues >4096 ) { +NL_SET_ERR_MSG (extack,"Invalid number of transmit queues" );return ERR_PTR (-EINVAL ); + } -if (num_rx_queues <1 || num_rx_queues >4096 ) +if (num_rx_queues <1 || num_rx_queues >4096 ) { +NL_SET_ERR_MSG (extack,"Invalid number of receive queues" );return ERR_PTR (-EINVAL ); + } dev =alloc_netdev_mqs (ops->priv_size, ifname, name_assign_type, ops->setup, num_tx_queues, num_rx_queues);
@@ -3163,7 +3169,7 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, } dev =rtnl_create_link (link_net ? : dest_net, ifname, - name_assign_type, ops, tb); + name_assign_type, ops, tb, extack);if (IS_ERR (dev)) { err =PTR_ERR (dev); goto out;
net/ipv4/ip_gre.c +1 -1
@@ -1601,7 +1601,7 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name,memset (&tb,0 ,sizeof (tb)); dev =rtnl_create_link (net, name, name_assign_type, - &ipgre_tap_ops, tb); + &ipgre_tap_ops, tb,NULL );if (IS_ERR (dev))return dev;
Signature · 1 line
2.11.0
David Ahern
maintainerPATCH 2/3 net: Add extack argument to ip_fib_metrics_init
In reply to David AhernFrom: David Ahern <[email protected]>
Add extack argument to ip_fib_metrics_init and add messages for invalid metrics.
--- include/net/ip.h | 3 ++- net/ipv4/fib_semantics.c | 2 +- net/ipv4/metrics.c | 26 +++++++++++++++++++------- net/ipv6/route.c | 5 +++-- 4 files changed, 25 insertions(+), 11 deletions(-)
include/net/ip.h +2 -1
@@ -421,7 +421,8 @@ static inline unsigned int ip_skb_dst_mtu(struct sock *sk, }struct dst_metrics *ip_fib_metrics_init (struct net *net,struct nlattr *fc_mx, -int fc_mx_len); +int fc_mx_len, +struct netlink_ext_ack *extack);static inline void ip_fib_metrics_put (struct dst_metrics *fib_metrics) { if (fib_metrics != &dst_default_metrics &&
net/ipv4/fib_semantics.c +1 -1
@@ -1076,7 +1076,7 @@ struct fib_info *fib_create_info(struct fib_config *cfg,if (!fi) goto failure; fi->fib_metrics =ip_fib_metrics_init (fi->fib_net, cfg->fc_mx, - cfg->fc_mx_len); + cfg->fc_mx_len, extack);if (unlikely (IS_ERR (fi->fib_metrics))) { err =PTR_ERR (fi->fib_metrics);kfree (fi);
net/ipv4/metrics.c +19 -7
@@ -6,7 +6,8 @@#include <net/tcp.h> static int ip_metrics_convert (struct net *net,struct nlattr *fc_mx, -int fc_mx_len,u32 *metrics) +int fc_mx_len,u32 *metrics, +struct netlink_ext_ack *extack) {bool ecn_ca = false;struct nlattr *nla;
@@ -21,19 +22,26 @@ static int ip_metrics_convert(struct net *net, struct nlattr *fc_mx,if (!type)continue ; -if (type >RTAX_MAX ) +if (type >RTAX_MAX ) { +NL_SET_ERR_MSG (extack,"Invalid metric type" );return -EINVAL ; + }if (type ==RTAX_CC_ALGO ) {char tmp[TCP_CA_NAME_MAX ];nla_strlcpy (tmp, nla,sizeof (tmp)); val =tcp_ca_get_key_by_name (net, tmp, &ecn_ca); -if (val ==TCP_CA_UNSPEC ) +if (val ==TCP_CA_UNSPEC ) { +NL_SET_ERR_MSG (extack,"Unknown tcp congestion algorithm" );return -EINVAL ; + } }else { -if (nla_len (nla) !=sizeof (u32)) +if (nla_len (nla) !=sizeof (u32)) { +NL_SET_ERR_MSG_ATTR (extack, nla, +"Invalid attribute in metrics" );return -EINVAL ; + } val =nla_get_u32 (nla); }if (type ==RTAX_ADVMSS && val >65535 -40 )
@@ -42,8 +50,10 @@ static int ip_metrics_convert(struct net *net, struct nlattr *fc_mx, val =65535 -15 ;if (type ==RTAX_HOPLIMIT && val >255 ) val =255 ; -if (type ==RTAX_FEATURES && (val & ~RTAX_FEATURE_MASK )) +if (type ==RTAX_FEATURES && (val & ~RTAX_FEATURE_MASK )) { +NL_SET_ERR_MSG (extack,"Unknown flag set in feature mask in metrics attribute" );return -EINVAL ; + } metrics[type -1 ] = val; }
@@ -54,7 +64,8 @@ static int ip_metrics_convert(struct net *net, struct nlattr *fc_mx, }struct dst_metrics *ip_fib_metrics_init (struct net *net,struct nlattr *fc_mx, -int fc_mx_len) +int fc_mx_len, +struct netlink_ext_ack *extack) {struct dst_metrics *fib_metrics;int err;
@@ -66,7 +77,8 @@ struct dst_metrics *ip_fib_metrics_init(struct net *net, struct nlattr *fc_mx,if (unlikely (!fib_metrics))return ERR_PTR (-ENOMEM ); - err =ip_metrics_convert (net, fc_mx, fc_mx_len, fib_metrics->metrics); + err =ip_metrics_convert (net, fc_mx, fc_mx_len, fib_metrics->metrics, + extack);if (!err) {refcount_set (&fib_metrics->refcnt,1 ); }else {
net/ipv6/route.c +3 -2
@@ -2975,7 +2975,8 @@ static struct fib6_info *ip6_route_info_create(struct fib6_config *cfg,if (!rt) goto out; - rt->fib6_metrics =ip_fib_metrics_init (net, cfg->fc_mx, cfg->fc_mx_len); + rt->fib6_metrics =ip_fib_metrics_init (net, cfg->fc_mx, cfg->fc_mx_len, + extack);if (IS_ERR (rt->fib6_metrics)) { err =PTR_ERR (rt->fib6_metrics);/* Do not leave garbage there. */
@@ -3708,7 +3709,7 @@ struct fib6_info *addrconf_f6i_alloc(struct net *net,if (!f6i)return ERR_PTR (-ENOMEM ); - f6i->fib6_metrics =ip_fib_metrics_init (net,NULL ,0 ); + f6i->fib6_metrics =ip_fib_metrics_init (net,NULL ,0 ,NULL ); f6i->dst_nocount = true; f6i->dst_host = true; f6i->fib6_protocol =RTPROT_KERNEL ;
Signature · 1 line
2.11.0
David Ahern
maintainerPATCH 3/3 rtnetlink: Add more extack messages to rtnl_newlink
In reply to David AhernFrom: David Ahern <[email protected]>
Add extack arg to the nla_parse_nested calls in rtnl_newlink, and add messages for unknown device type and link network namespace id. In particular, it improves the failure message when the wrong link type is used. From
$ ip li add bond1 type bonding
RTNETLINK answers: Operation not supported
to
$ ip li add bond1 type bonding
Error: Unknown device type.(The module name is bonding but the link type is bond.)
--- net/core/rtnetlink.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/core/rtnetlink.c +4 -2
@@ -3054,7 +3054,7 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,if (ops->maxtype && linkinfo[IFLA_INFO_DATA ]) { err =nla_parse_nested (attr, ops->maxtype, linkinfo[IFLA_INFO_DATA ], - ops->policy,NULL ); + ops->policy, extack);if (err <0 )return err; data = attr;
@@ -3076,7 +3076,7 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, m_ops->slave_maxtype, linkinfo[IFLA_INFO_SLAVE_DATA ], m_ops->slave_policy, - NULL); + extack);if (err <0 )return err; slave_data = slave_attr;
@@ -3140,6 +3140,7 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, goto replay; }#endif +NL_SET_ERR_MSG (extack,"Unknown device type" );return -EOPNOTSUPP ; }
@@ -3160,6 +3161,7 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh, link_net =get_net_ns_by_id (dest_net, id);if (!link_net) { +NL_SET_ERR_MSG (extack,"Unknown network namespace id" ); err = -EINVAL ; goto out; }
Signature · 1 line
2.11.0
David Miller
maintainerFrom: David Ahern <[email protected]>
Date: Tue, 6 Nov 2018 12:51:13 -0800
Quoted 4 lines
From: David Ahern <[email protected]>
Add more extack messages for several link create errors (e.g., invalid number of queues, unknown link kind) and invalid metrics argument.
Series applied, thanks David.