aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2017-10-20 08:15:08 -0400
committerDavid S. Miller <davem@davemloft.net>2017-10-20 08:15:08 -0400
commitce12f7ddff2df63b8f9abf33d6fe020e35de4059 (patch)
tree7c80b14c401727fd76a0cd1b4739c1ddb6d30756
parent6b1f8edabad562dc0b2a6d59fa49061eddd91290 (diff)
parentf8fa9b4e6da77311791c7150a6ecc9368396df3b (diff)
Merge branch 'mlxsw-extack'
David Ahern says: ==================== mlxsw: spectrum_router: Add extack messages for RIF and VRF overflow Currently, exceeding the number of VRF instances or the number of router interfaces either fails with a non-intuitive EBUSY: $ ip li set swp1s1.6 vrf vrf-1s1-6 up RTNETLINK answers: Device or resource busy or fails silently (IPv6) since the checks are done in a work queue. This set adds support for the address validator notifier to spectrum which allows ext-ack based messages to be returned on failure. To make that happen the IPv6 version needs to be converted from atomic to blocking (patch 2), and then support for extack needs to be added to the notifier (patch 3). Patch 1 reworks the locking in ipv6_add_addr to work better in the atomic and non-atomic code paths. Patches 4 and 5 add the validator notifier to spectrum and then plumb the extack argument through spectrum_router. With this set, VRF overflows fail with: $ ip li set swp1s1.6 vrf vrf-1s1-6 up Error: spectrum: Exceeded number of supported VRF. and RIF overflows fail with: $ ip addr add dev swp1s2.191 10.12.191.1/24 Error: spectrum: Exceeded number of supported router interfaces. v2 -> v3 - fix surround context of patch 4 which was altered by c30f5d012edf v1 -> v2 - fix error path in ipv6_add_addr: reset rt to NULL (Ido comment) and add in6_dev_put on ifa once the hold has been done RFC -> v1 - addressed various comments from Ido - refactored ipv6_add_addr to allow ifa's to be allocated with GFP_KERNEL as requested by DaveM ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.c15
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.h4
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c162
-rw-r--r--drivers/net/ipvlan/ipvlan_main.c14
-rw-r--r--include/linux/inetdevice.h1
-rw-r--r--include/net/addrconf.h1
-rw-r--r--net/ipv4/devinet.c8
-rw-r--r--net/ipv6/addrconf.c129
-rw-r--r--net/ipv6/addrconf_core.c9
9 files changed, 234 insertions, 109 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index e1e11c726c16..e6519f2906a4 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -4521,9 +4521,16 @@ static int mlxsw_sp_netdevice_event(struct notifier_block *nb,
4521 return notifier_from_errno(err); 4521 return notifier_from_errno(err);
4522} 4522}
4523 4523
4524static struct notifier_block mlxsw_sp_inetaddr_valid_nb __read_mostly = {
4525 .notifier_call = mlxsw_sp_inetaddr_valid_event,
4526};
4527
4524static struct notifier_block mlxsw_sp_inetaddr_nb __read_mostly = { 4528static struct notifier_block mlxsw_sp_inetaddr_nb __read_mostly = {
4525 .notifier_call = mlxsw_sp_inetaddr_event, 4529 .notifier_call = mlxsw_sp_inetaddr_event,
4526 .priority = 10, /* Must be called before FIB notifier block */ 4530};
4531
4532static struct notifier_block mlxsw_sp_inet6addr_valid_nb __read_mostly = {
4533 .notifier_call = mlxsw_sp_inet6addr_valid_event,
4527}; 4534};
4528 4535
4529static struct notifier_block mlxsw_sp_inet6addr_nb __read_mostly = { 4536static struct notifier_block mlxsw_sp_inet6addr_nb __read_mostly = {
@@ -4548,7 +4555,9 @@ static int __init mlxsw_sp_module_init(void)
4548{ 4555{
4549 int err; 4556 int err;
4550 4557
4558 register_inetaddr_validator_notifier(&mlxsw_sp_inetaddr_valid_nb);
4551 register_inetaddr_notifier(&mlxsw_sp_inetaddr_nb); 4559 register_inetaddr_notifier(&mlxsw_sp_inetaddr_nb);
4560 register_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
4552 register_inet6addr_notifier(&mlxsw_sp_inet6addr_nb); 4561 register_inet6addr_notifier(&mlxsw_sp_inet6addr_nb);
4553 register_netevent_notifier(&mlxsw_sp_router_netevent_nb); 4562 register_netevent_notifier(&mlxsw_sp_router_netevent_nb);
4554 4563
@@ -4567,7 +4576,9 @@ err_pci_driver_register:
4567err_core_driver_register: 4576err_core_driver_register:
4568 unregister_netevent_notifier(&mlxsw_sp_router_netevent_nb); 4577 unregister_netevent_notifier(&mlxsw_sp_router_netevent_nb);
4569 unregister_inet6addr_notifier(&mlxsw_sp_inet6addr_nb); 4578 unregister_inet6addr_notifier(&mlxsw_sp_inet6addr_nb);
4579 unregister_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
4570 unregister_inetaddr_notifier(&mlxsw_sp_inetaddr_nb); 4580 unregister_inetaddr_notifier(&mlxsw_sp_inetaddr_nb);
4581 unregister_inetaddr_validator_notifier(&mlxsw_sp_inetaddr_valid_nb);
4571 return err; 4582 return err;
4572} 4583}
4573 4584
@@ -4577,7 +4588,9 @@ static void __exit mlxsw_sp_module_exit(void)
4577 mlxsw_core_driver_unregister(&mlxsw_sp_driver); 4588 mlxsw_core_driver_unregister(&mlxsw_sp_driver);
4578 unregister_netevent_notifier(&mlxsw_sp_router_netevent_nb); 4589 unregister_netevent_notifier(&mlxsw_sp_router_netevent_nb);
4579 unregister_inet6addr_notifier(&mlxsw_sp_inet6addr_nb); 4590 unregister_inet6addr_notifier(&mlxsw_sp_inet6addr_nb);
4591 unregister_inet6addr_validator_notifier(&mlxsw_sp_inet6addr_valid_nb);
4580 unregister_inetaddr_notifier(&mlxsw_sp_inetaddr_nb); 4592 unregister_inetaddr_notifier(&mlxsw_sp_inetaddr_nb);
4593 unregister_inetaddr_validator_notifier(&mlxsw_sp_inetaddr_valid_nb);
4581} 4594}
4582 4595
4583module_init(mlxsw_sp_module_init); 4596module_init(mlxsw_sp_module_init);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
index 28feb745a38a..2a2472a09d8c 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
@@ -391,8 +391,12 @@ int mlxsw_sp_router_netevent_event(struct notifier_block *unused,
391int mlxsw_sp_netdevice_router_port_event(struct net_device *dev); 391int mlxsw_sp_netdevice_router_port_event(struct net_device *dev);
392int mlxsw_sp_inetaddr_event(struct notifier_block *unused, 392int mlxsw_sp_inetaddr_event(struct notifier_block *unused,
393 unsigned long event, void *ptr); 393 unsigned long event, void *ptr);
394int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused,
395 unsigned long event, void *ptr);
394int mlxsw_sp_inet6addr_event(struct notifier_block *unused, 396int mlxsw_sp_inet6addr_event(struct notifier_block *unused,
395 unsigned long event, void *ptr); 397 unsigned long event, void *ptr);
398int mlxsw_sp_inet6addr_valid_event(struct notifier_block *unused,
399 unsigned long event, void *ptr);
396int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event, 400int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event,
397 struct netdev_notifier_changeupper_info *info); 401 struct netdev_notifier_changeupper_info *info);
398bool mlxsw_sp_netdev_is_ipip(const struct mlxsw_sp *mlxsw_sp, 402bool mlxsw_sp_netdev_is_ipip(const struct mlxsw_sp *mlxsw_sp,
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 3330120f2f8e..2420f69797a9 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -731,14 +731,17 @@ static struct mlxsw_sp_fib *mlxsw_sp_vr_fib(const struct mlxsw_sp_vr *vr,
731} 731}
732 732
733static struct mlxsw_sp_vr *mlxsw_sp_vr_create(struct mlxsw_sp *mlxsw_sp, 733static struct mlxsw_sp_vr *mlxsw_sp_vr_create(struct mlxsw_sp *mlxsw_sp,
734 u32 tb_id) 734 u32 tb_id,
735 struct netlink_ext_ack *extack)
735{ 736{
736 struct mlxsw_sp_vr *vr; 737 struct mlxsw_sp_vr *vr;
737 int err; 738 int err;
738 739
739 vr = mlxsw_sp_vr_find_unused(mlxsw_sp); 740 vr = mlxsw_sp_vr_find_unused(mlxsw_sp);
740 if (!vr) 741 if (!vr) {
742 NL_SET_ERR_MSG(extack, "spectrum: Exceeded number of supported virtual routers");
741 return ERR_PTR(-EBUSY); 743 return ERR_PTR(-EBUSY);
744 }
742 vr->fib4 = mlxsw_sp_fib_create(vr, MLXSW_SP_L3_PROTO_IPV4); 745 vr->fib4 = mlxsw_sp_fib_create(vr, MLXSW_SP_L3_PROTO_IPV4);
743 if (IS_ERR(vr->fib4)) 746 if (IS_ERR(vr->fib4))
744 return ERR_CAST(vr->fib4); 747 return ERR_CAST(vr->fib4);
@@ -775,14 +778,15 @@ static void mlxsw_sp_vr_destroy(struct mlxsw_sp_vr *vr)
775 vr->fib4 = NULL; 778 vr->fib4 = NULL;
776} 779}
777 780
778static struct mlxsw_sp_vr *mlxsw_sp_vr_get(struct mlxsw_sp *mlxsw_sp, u32 tb_id) 781static struct mlxsw_sp_vr *mlxsw_sp_vr_get(struct mlxsw_sp *mlxsw_sp, u32 tb_id,
782 struct netlink_ext_ack *extack)
779{ 783{
780 struct mlxsw_sp_vr *vr; 784 struct mlxsw_sp_vr *vr;
781 785
782 tb_id = mlxsw_sp_fix_tb_id(tb_id); 786 tb_id = mlxsw_sp_fix_tb_id(tb_id);
783 vr = mlxsw_sp_vr_find(mlxsw_sp, tb_id); 787 vr = mlxsw_sp_vr_find(mlxsw_sp, tb_id);
784 if (!vr) 788 if (!vr)
785 vr = mlxsw_sp_vr_create(mlxsw_sp, tb_id); 789 vr = mlxsw_sp_vr_create(mlxsw_sp, tb_id, extack);
786 return vr; 790 return vr;
787} 791}
788 792
@@ -948,7 +952,8 @@ static u32 mlxsw_sp_ipip_dev_ul_tb_id(const struct net_device *ol_dev)
948 952
949static struct mlxsw_sp_rif * 953static struct mlxsw_sp_rif *
950mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp, 954mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
951 const struct mlxsw_sp_rif_params *params); 955 const struct mlxsw_sp_rif_params *params,
956 struct netlink_ext_ack *extack);
952 957
953static struct mlxsw_sp_rif_ipip_lb * 958static struct mlxsw_sp_rif_ipip_lb *
954mlxsw_sp_ipip_ol_ipip_lb_create(struct mlxsw_sp *mlxsw_sp, 959mlxsw_sp_ipip_ol_ipip_lb_create(struct mlxsw_sp *mlxsw_sp,
@@ -966,7 +971,7 @@ mlxsw_sp_ipip_ol_ipip_lb_create(struct mlxsw_sp *mlxsw_sp,
966 .lb_config = ipip_ops->ol_loopback_config(mlxsw_sp, ol_dev), 971 .lb_config = ipip_ops->ol_loopback_config(mlxsw_sp, ol_dev),
967 }; 972 };
968 973
969 rif = mlxsw_sp_rif_create(mlxsw_sp, &lb_params.common); 974 rif = mlxsw_sp_rif_create(mlxsw_sp, &lb_params.common, NULL);
970 if (IS_ERR(rif)) 975 if (IS_ERR(rif))
971 return ERR_CAST(rif); 976 return ERR_CAST(rif);
972 return container_of(rif, struct mlxsw_sp_rif_ipip_lb, common); 977 return container_of(rif, struct mlxsw_sp_rif_ipip_lb, common);
@@ -3836,7 +3841,7 @@ mlxsw_sp_fib_node_get(struct mlxsw_sp *mlxsw_sp, u32 tb_id, const void *addr,
3836 struct mlxsw_sp_vr *vr; 3841 struct mlxsw_sp_vr *vr;
3837 int err; 3842 int err;
3838 3843
3839 vr = mlxsw_sp_vr_get(mlxsw_sp, tb_id); 3844 vr = mlxsw_sp_vr_get(mlxsw_sp, tb_id, NULL);
3840 if (IS_ERR(vr)) 3845 if (IS_ERR(vr))
3841 return ERR_CAST(vr); 3846 return ERR_CAST(vr);
3842 fib = mlxsw_sp_vr_fib(vr, proto); 3847 fib = mlxsw_sp_vr_fib(vr, proto);
@@ -4875,7 +4880,7 @@ static int mlxsw_sp_router_fibmr_add(struct mlxsw_sp *mlxsw_sp,
4875 if (mlxsw_sp->router->aborted) 4880 if (mlxsw_sp->router->aborted)
4876 return 0; 4881 return 0;
4877 4882
4878 vr = mlxsw_sp_vr_get(mlxsw_sp, men_info->tb_id); 4883 vr = mlxsw_sp_vr_get(mlxsw_sp, men_info->tb_id, NULL);
4879 if (IS_ERR(vr)) 4884 if (IS_ERR(vr))
4880 return PTR_ERR(vr); 4885 return PTR_ERR(vr);
4881 4886
@@ -4908,7 +4913,7 @@ mlxsw_sp_router_fibmr_vif_add(struct mlxsw_sp *mlxsw_sp,
4908 if (mlxsw_sp->router->aborted) 4913 if (mlxsw_sp->router->aborted)
4909 return 0; 4914 return 0;
4910 4915
4911 vr = mlxsw_sp_vr_get(mlxsw_sp, ven_info->tb_id); 4916 vr = mlxsw_sp_vr_get(mlxsw_sp, ven_info->tb_id, NULL);
4912 if (IS_ERR(vr)) 4917 if (IS_ERR(vr))
4913 return PTR_ERR(vr); 4918 return PTR_ERR(vr);
4914 4919
@@ -5471,7 +5476,8 @@ const struct net_device *mlxsw_sp_rif_dev(const struct mlxsw_sp_rif *rif)
5471 5476
5472static struct mlxsw_sp_rif * 5477static struct mlxsw_sp_rif *
5473mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp, 5478mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
5474 const struct mlxsw_sp_rif_params *params) 5479 const struct mlxsw_sp_rif_params *params,
5480 struct netlink_ext_ack *extack)
5475{ 5481{
5476 u32 tb_id = l3mdev_fib_table(params->dev); 5482 u32 tb_id = l3mdev_fib_table(params->dev);
5477 const struct mlxsw_sp_rif_ops *ops; 5483 const struct mlxsw_sp_rif_ops *ops;
@@ -5485,14 +5491,16 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
5485 type = mlxsw_sp_dev_rif_type(mlxsw_sp, params->dev); 5491 type = mlxsw_sp_dev_rif_type(mlxsw_sp, params->dev);
5486 ops = mlxsw_sp->router->rif_ops_arr[type]; 5492 ops = mlxsw_sp->router->rif_ops_arr[type];
5487 5493
5488 vr = mlxsw_sp_vr_get(mlxsw_sp, tb_id ? : RT_TABLE_MAIN); 5494 vr = mlxsw_sp_vr_get(mlxsw_sp, tb_id ? : RT_TABLE_MAIN, extack);
5489 if (IS_ERR(vr)) 5495 if (IS_ERR(vr))
5490 return ERR_CAST(vr); 5496 return ERR_CAST(vr);
5491 vr->rif_count++; 5497 vr->rif_count++;
5492 5498
5493 err = mlxsw_sp_rif_index_alloc(mlxsw_sp, &rif_index); 5499 err = mlxsw_sp_rif_index_alloc(mlxsw_sp, &rif_index);
5494 if (err) 5500 if (err) {
5501 NL_SET_ERR_MSG(extack, "spectrum: Exceeded number of supported router interfaces");
5495 goto err_rif_index_alloc; 5502 goto err_rif_index_alloc;
5503 }
5496 5504
5497 rif = mlxsw_sp_rif_alloc(ops->rif_size, rif_index, vr->id, params->dev); 5505 rif = mlxsw_sp_rif_alloc(ops->rif_size, rif_index, vr->id, params->dev);
5498 if (!rif) { 5506 if (!rif) {
@@ -5579,7 +5587,8 @@ mlxsw_sp_rif_subport_params_init(struct mlxsw_sp_rif_params *params,
5579 5587
5580static int 5588static int
5581mlxsw_sp_port_vlan_router_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan, 5589mlxsw_sp_port_vlan_router_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
5582 struct net_device *l3_dev) 5590 struct net_device *l3_dev,
5591 struct netlink_ext_ack *extack)
5583{ 5592{
5584 struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port; 5593 struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
5585 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp; 5594 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
@@ -5595,7 +5604,7 @@ mlxsw_sp_port_vlan_router_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
5595 }; 5604 };
5596 5605
5597 mlxsw_sp_rif_subport_params_init(&params, mlxsw_sp_port_vlan); 5606 mlxsw_sp_rif_subport_params_init(&params, mlxsw_sp_port_vlan);
5598 rif = mlxsw_sp_rif_create(mlxsw_sp, &params); 5607 rif = mlxsw_sp_rif_create(mlxsw_sp, &params, extack);
5599 if (IS_ERR(rif)) 5608 if (IS_ERR(rif))
5600 return PTR_ERR(rif); 5609 return PTR_ERR(rif);
5601 } 5610 }
@@ -5650,7 +5659,8 @@ mlxsw_sp_port_vlan_router_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
5650 5659
5651static int mlxsw_sp_inetaddr_port_vlan_event(struct net_device *l3_dev, 5660static int mlxsw_sp_inetaddr_port_vlan_event(struct net_device *l3_dev,
5652 struct net_device *port_dev, 5661 struct net_device *port_dev,
5653 unsigned long event, u16 vid) 5662 unsigned long event, u16 vid,
5663 struct netlink_ext_ack *extack)
5654{ 5664{
5655 struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(port_dev); 5665 struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(port_dev);
5656 struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan; 5666 struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
@@ -5662,7 +5672,7 @@ static int mlxsw_sp_inetaddr_port_vlan_event(struct net_device *l3_dev,
5662 switch (event) { 5672 switch (event) {
5663 case NETDEV_UP: 5673 case NETDEV_UP:
5664 return mlxsw_sp_port_vlan_router_join(mlxsw_sp_port_vlan, 5674 return mlxsw_sp_port_vlan_router_join(mlxsw_sp_port_vlan,
5665 l3_dev); 5675 l3_dev, extack);
5666 case NETDEV_DOWN: 5676 case NETDEV_DOWN:
5667 mlxsw_sp_port_vlan_router_leave(mlxsw_sp_port_vlan); 5677 mlxsw_sp_port_vlan_router_leave(mlxsw_sp_port_vlan);
5668 break; 5678 break;
@@ -5672,19 +5682,22 @@ static int mlxsw_sp_inetaddr_port_vlan_event(struct net_device *l3_dev,
5672} 5682}
5673 5683
5674static int mlxsw_sp_inetaddr_port_event(struct net_device *port_dev, 5684static int mlxsw_sp_inetaddr_port_event(struct net_device *port_dev,
5675 unsigned long event) 5685 unsigned long event,
5686 struct netlink_ext_ack *extack)
5676{ 5687{
5677 if (netif_is_bridge_port(port_dev) || 5688 if (netif_is_bridge_port(port_dev) ||
5678 netif_is_lag_port(port_dev) || 5689 netif_is_lag_port(port_dev) ||
5679 netif_is_ovs_port(port_dev)) 5690 netif_is_ovs_port(port_dev))
5680 return 0; 5691 return 0;
5681 5692
5682 return mlxsw_sp_inetaddr_port_vlan_event(port_dev, port_dev, event, 1); 5693 return mlxsw_sp_inetaddr_port_vlan_event(port_dev, port_dev, event, 1,
5694 extack);
5683} 5695}
5684 5696
5685static int __mlxsw_sp_inetaddr_lag_event(struct net_device *l3_dev, 5697static int __mlxsw_sp_inetaddr_lag_event(struct net_device *l3_dev,
5686 struct net_device *lag_dev, 5698 struct net_device *lag_dev,
5687 unsigned long event, u16 vid) 5699 unsigned long event, u16 vid,
5700 struct netlink_ext_ack *extack)
5688{ 5701{
5689 struct net_device *port_dev; 5702 struct net_device *port_dev;
5690 struct list_head *iter; 5703 struct list_head *iter;
@@ -5694,7 +5707,8 @@ static int __mlxsw_sp_inetaddr_lag_event(struct net_device *l3_dev,
5694 if (mlxsw_sp_port_dev_check(port_dev)) { 5707 if (mlxsw_sp_port_dev_check(port_dev)) {
5695 err = mlxsw_sp_inetaddr_port_vlan_event(l3_dev, 5708 err = mlxsw_sp_inetaddr_port_vlan_event(l3_dev,
5696 port_dev, 5709 port_dev,
5697 event, vid); 5710 event, vid,
5711 extack);
5698 if (err) 5712 if (err)
5699 return err; 5713 return err;
5700 } 5714 }
@@ -5704,16 +5718,19 @@ static int __mlxsw_sp_inetaddr_lag_event(struct net_device *l3_dev,
5704} 5718}
5705 5719
5706static int mlxsw_sp_inetaddr_lag_event(struct net_device *lag_dev, 5720static int mlxsw_sp_inetaddr_lag_event(struct net_device *lag_dev,
5707 unsigned long event) 5721 unsigned long event,
5722 struct netlink_ext_ack *extack)
5708{ 5723{
5709 if (netif_is_bridge_port(lag_dev)) 5724 if (netif_is_bridge_port(lag_dev))
5710 return 0; 5725 return 0;
5711 5726
5712 return __mlxsw_sp_inetaddr_lag_event(lag_dev, lag_dev, event, 1); 5727 return __mlxsw_sp_inetaddr_lag_event(lag_dev, lag_dev, event, 1,
5728 extack);
5713} 5729}
5714 5730
5715static int mlxsw_sp_inetaddr_bridge_event(struct net_device *l3_dev, 5731static int mlxsw_sp_inetaddr_bridge_event(struct net_device *l3_dev,
5716 unsigned long event) 5732 unsigned long event,
5733 struct netlink_ext_ack *extack)
5717{ 5734{
5718 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(l3_dev); 5735 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(l3_dev);
5719 struct mlxsw_sp_rif_params params = { 5736 struct mlxsw_sp_rif_params params = {
@@ -5723,7 +5740,7 @@ static int mlxsw_sp_inetaddr_bridge_event(struct net_device *l3_dev,
5723 5740
5724 switch (event) { 5741 switch (event) {
5725 case NETDEV_UP: 5742 case NETDEV_UP:
5726 rif = mlxsw_sp_rif_create(mlxsw_sp, &params); 5743 rif = mlxsw_sp_rif_create(mlxsw_sp, &params, extack);
5727 if (IS_ERR(rif)) 5744 if (IS_ERR(rif))
5728 return PTR_ERR(rif); 5745 return PTR_ERR(rif);
5729 break; 5746 break;
@@ -5737,7 +5754,8 @@ static int mlxsw_sp_inetaddr_bridge_event(struct net_device *l3_dev,
5737} 5754}
5738 5755
5739static int mlxsw_sp_inetaddr_vlan_event(struct net_device *vlan_dev, 5756static int mlxsw_sp_inetaddr_vlan_event(struct net_device *vlan_dev,
5740 unsigned long event) 5757 unsigned long event,
5758 struct netlink_ext_ack *extack)
5741{ 5759{
5742 struct net_device *real_dev = vlan_dev_real_dev(vlan_dev); 5760 struct net_device *real_dev = vlan_dev_real_dev(vlan_dev);
5743 u16 vid = vlan_dev_vlan_id(vlan_dev); 5761 u16 vid = vlan_dev_vlan_id(vlan_dev);
@@ -5747,27 +5765,28 @@ static int mlxsw_sp_inetaddr_vlan_event(struct net_device *vlan_dev,
5747 5765
5748 if (mlxsw_sp_port_dev_check(real_dev)) 5766 if (mlxsw_sp_port_dev_check(real_dev))
5749 return mlxsw_sp_inetaddr_port_vlan_event(vlan_dev, real_dev, 5767 return mlxsw_sp_inetaddr_port_vlan_event(vlan_dev, real_dev,
5750 event, vid); 5768 event, vid, extack);
5751 else if (netif_is_lag_master(real_dev)) 5769 else if (netif_is_lag_master(real_dev))
5752 return __mlxsw_sp_inetaddr_lag_event(vlan_dev, real_dev, event, 5770 return __mlxsw_sp_inetaddr_lag_event(vlan_dev, real_dev, event,
5753 vid); 5771 vid, extack);
5754 else if (netif_is_bridge_master(real_dev) && br_vlan_enabled(real_dev)) 5772 else if (netif_is_bridge_master(real_dev) && br_vlan_enabled(real_dev))
5755 return mlxsw_sp_inetaddr_bridge_event(vlan_dev, event); 5773 return mlxsw_sp_inetaddr_bridge_event(vlan_dev, event, extack);
5756 5774
5757 return 0; 5775 return 0;
5758} 5776}
5759 5777
5760static int __mlxsw_sp_inetaddr_event(struct net_device *dev, 5778static int __mlxsw_sp_inetaddr_event(struct net_device *dev,
5761 unsigned long event) 5779 unsigned long event,
5780 struct netlink_ext_ack *extack)
5762{ 5781{
5763 if (mlxsw_sp_port_dev_check(dev)) 5782 if (mlxsw_sp_port_dev_check(dev))
5764 return mlxsw_sp_inetaddr_port_event(dev, event); 5783 return mlxsw_sp_inetaddr_port_event(dev, event, extack);
5765 else if (netif_is_lag_master(dev)) 5784 else if (netif_is_lag_master(dev))
5766 return mlxsw_sp_inetaddr_lag_event(dev, event); 5785 return mlxsw_sp_inetaddr_lag_event(dev, event, extack);
5767 else if (netif_is_bridge_master(dev)) 5786 else if (netif_is_bridge_master(dev))
5768 return mlxsw_sp_inetaddr_bridge_event(dev, event); 5787 return mlxsw_sp_inetaddr_bridge_event(dev, event, extack);
5769 else if (is_vlan_dev(dev)) 5788 else if (is_vlan_dev(dev))
5770 return mlxsw_sp_inetaddr_vlan_event(dev, event); 5789 return mlxsw_sp_inetaddr_vlan_event(dev, event, extack);
5771 else 5790 else
5772 return 0; 5791 return 0;
5773} 5792}
@@ -5781,6 +5800,32 @@ int mlxsw_sp_inetaddr_event(struct notifier_block *unused,
5781 struct mlxsw_sp_rif *rif; 5800 struct mlxsw_sp_rif *rif;
5782 int err = 0; 5801 int err = 0;
5783 5802
5803 /* NETDEV_UP event is handled by mlxsw_sp_inetaddr_valid_event */
5804 if (event == NETDEV_UP)
5805 goto out;
5806
5807 mlxsw_sp = mlxsw_sp_lower_get(dev);
5808 if (!mlxsw_sp)
5809 goto out;
5810
5811 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev);
5812 if (!mlxsw_sp_rif_should_config(rif, dev, event))
5813 goto out;
5814
5815 err = __mlxsw_sp_inetaddr_event(dev, event, NULL);
5816out:
5817 return notifier_from_errno(err);
5818}
5819
5820int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused,
5821 unsigned long event, void *ptr)
5822{
5823 struct in_validator_info *ivi = (struct in_validator_info *) ptr;
5824 struct net_device *dev = ivi->ivi_dev->dev;
5825 struct mlxsw_sp *mlxsw_sp;
5826 struct mlxsw_sp_rif *rif;
5827 int err = 0;
5828
5784 mlxsw_sp = mlxsw_sp_lower_get(dev); 5829 mlxsw_sp = mlxsw_sp_lower_get(dev);
5785 if (!mlxsw_sp) 5830 if (!mlxsw_sp)
5786 goto out; 5831 goto out;
@@ -5789,7 +5834,7 @@ int mlxsw_sp_inetaddr_event(struct notifier_block *unused,
5789 if (!mlxsw_sp_rif_should_config(rif, dev, event)) 5834 if (!mlxsw_sp_rif_should_config(rif, dev, event))
5790 goto out; 5835 goto out;
5791 5836
5792 err = __mlxsw_sp_inetaddr_event(dev, event); 5837 err = __mlxsw_sp_inetaddr_event(dev, event, ivi->extack);
5793out: 5838out:
5794 return notifier_from_errno(err); 5839 return notifier_from_errno(err);
5795} 5840}
@@ -5818,7 +5863,7 @@ static void mlxsw_sp_inet6addr_event_work(struct work_struct *work)
5818 if (!mlxsw_sp_rif_should_config(rif, dev, event)) 5863 if (!mlxsw_sp_rif_should_config(rif, dev, event))
5819 goto out; 5864 goto out;
5820 5865
5821 __mlxsw_sp_inetaddr_event(dev, event); 5866 __mlxsw_sp_inetaddr_event(dev, event, NULL);
5822out: 5867out:
5823 rtnl_unlock(); 5868 rtnl_unlock();
5824 dev_put(dev); 5869 dev_put(dev);
@@ -5833,6 +5878,10 @@ int mlxsw_sp_inet6addr_event(struct notifier_block *unused,
5833 struct mlxsw_sp_inet6addr_event_work *inet6addr_work; 5878 struct mlxsw_sp_inet6addr_event_work *inet6addr_work;
5834 struct net_device *dev = if6->idev->dev; 5879 struct net_device *dev = if6->idev->dev;
5835 5880
5881 /* NETDEV_UP event is handled by mlxsw_sp_inet6addr_valid_event */
5882 if (event == NETDEV_UP)
5883 return NOTIFY_DONE;
5884
5836 if (!mlxsw_sp_port_dev_lower_find_rcu(dev)) 5885 if (!mlxsw_sp_port_dev_lower_find_rcu(dev))
5837 return NOTIFY_DONE; 5886 return NOTIFY_DONE;
5838 5887
@@ -5849,6 +5898,28 @@ int mlxsw_sp_inet6addr_event(struct notifier_block *unused,
5849 return NOTIFY_DONE; 5898 return NOTIFY_DONE;
5850} 5899}
5851 5900
5901int mlxsw_sp_inet6addr_valid_event(struct notifier_block *unused,
5902 unsigned long event, void *ptr)
5903{
5904 struct in6_validator_info *i6vi = (struct in6_validator_info *) ptr;
5905 struct net_device *dev = i6vi->i6vi_dev->dev;
5906 struct mlxsw_sp *mlxsw_sp;
5907 struct mlxsw_sp_rif *rif;
5908 int err = 0;
5909
5910 mlxsw_sp = mlxsw_sp_lower_get(dev);
5911 if (!mlxsw_sp)
5912 goto out;
5913
5914 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev);
5915 if (!mlxsw_sp_rif_should_config(rif, dev, event))
5916 goto out;
5917
5918 err = __mlxsw_sp_inetaddr_event(dev, event, i6vi->extack);
5919out:
5920 return notifier_from_errno(err);
5921}
5922
5852static int mlxsw_sp_rif_edit(struct mlxsw_sp *mlxsw_sp, u16 rif_index, 5923static int mlxsw_sp_rif_edit(struct mlxsw_sp *mlxsw_sp, u16 rif_index,
5853 const char *mac, int mtu) 5924 const char *mac, int mtu)
5854{ 5925{
@@ -5921,7 +5992,8 @@ err_rif_edit:
5921} 5992}
5922 5993
5923static int mlxsw_sp_port_vrf_join(struct mlxsw_sp *mlxsw_sp, 5994static int mlxsw_sp_port_vrf_join(struct mlxsw_sp *mlxsw_sp,
5924 struct net_device *l3_dev) 5995 struct net_device *l3_dev,
5996 struct netlink_ext_ack *extack)
5925{ 5997{
5926 struct mlxsw_sp_rif *rif; 5998 struct mlxsw_sp_rif *rif;
5927 5999
@@ -5930,9 +6002,9 @@ static int mlxsw_sp_port_vrf_join(struct mlxsw_sp *mlxsw_sp,
5930 */ 6002 */
5931 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, l3_dev); 6003 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, l3_dev);
5932 if (rif) 6004 if (rif)
5933 __mlxsw_sp_inetaddr_event(l3_dev, NETDEV_DOWN); 6005 __mlxsw_sp_inetaddr_event(l3_dev, NETDEV_DOWN, extack);
5934 6006
5935 return __mlxsw_sp_inetaddr_event(l3_dev, NETDEV_UP); 6007 return __mlxsw_sp_inetaddr_event(l3_dev, NETDEV_UP, extack);
5936} 6008}
5937 6009
5938static void mlxsw_sp_port_vrf_leave(struct mlxsw_sp *mlxsw_sp, 6010static void mlxsw_sp_port_vrf_leave(struct mlxsw_sp *mlxsw_sp,
@@ -5943,7 +6015,7 @@ static void mlxsw_sp_port_vrf_leave(struct mlxsw_sp *mlxsw_sp,
5943 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, l3_dev); 6015 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, l3_dev);
5944 if (!rif) 6016 if (!rif)
5945 return; 6017 return;
5946 __mlxsw_sp_inetaddr_event(l3_dev, NETDEV_DOWN); 6018 __mlxsw_sp_inetaddr_event(l3_dev, NETDEV_DOWN, NULL);
5947} 6019}
5948 6020
5949int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event, 6021int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event,
@@ -5959,10 +6031,14 @@ int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event,
5959 case NETDEV_PRECHANGEUPPER: 6031 case NETDEV_PRECHANGEUPPER:
5960 return 0; 6032 return 0;
5961 case NETDEV_CHANGEUPPER: 6033 case NETDEV_CHANGEUPPER:
5962 if (info->linking) 6034 if (info->linking) {
5963 err = mlxsw_sp_port_vrf_join(mlxsw_sp, l3_dev); 6035 struct netlink_ext_ack *extack;
5964 else 6036
6037 extack = netdev_notifier_info_to_extack(&info->info);
6038 err = mlxsw_sp_port_vrf_join(mlxsw_sp, l3_dev, extack);
6039 } else {
5965 mlxsw_sp_port_vrf_leave(mlxsw_sp, l3_dev); 6040 mlxsw_sp_port_vrf_leave(mlxsw_sp, l3_dev);
6041 }
5966 break; 6042 break;
5967 } 6043 }
5968 6044
@@ -6269,7 +6345,7 @@ mlxsw_sp_rif_ipip_lb_configure(struct mlxsw_sp_rif *rif)
6269 struct mlxsw_sp_vr *ul_vr; 6345 struct mlxsw_sp_vr *ul_vr;
6270 int err; 6346 int err;
6271 6347
6272 ul_vr = mlxsw_sp_vr_get(mlxsw_sp, ul_tb_id); 6348 ul_vr = mlxsw_sp_vr_get(mlxsw_sp, ul_tb_id, NULL);
6273 if (IS_ERR(ul_vr)) 6349 if (IS_ERR(ul_vr))
6274 return PTR_ERR(ul_vr); 6350 return PTR_ERR(ul_vr);
6275 6351
diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c
index 3cf67db513e2..f0ab55df57f1 100644
--- a/drivers/net/ipvlan/ipvlan_main.c
+++ b/drivers/net/ipvlan/ipvlan_main.c
@@ -808,10 +808,6 @@ static int ipvlan_addr6_event(struct notifier_block *unused,
808 struct net_device *dev = (struct net_device *)if6->idev->dev; 808 struct net_device *dev = (struct net_device *)if6->idev->dev;
809 struct ipvl_dev *ipvlan = netdev_priv(dev); 809 struct ipvl_dev *ipvlan = netdev_priv(dev);
810 810
811 /* FIXME IPv6 autoconf calls us from bh without RTNL */
812 if (in_softirq())
813 return NOTIFY_DONE;
814
815 if (!netif_is_ipvlan(dev)) 811 if (!netif_is_ipvlan(dev))
816 return NOTIFY_DONE; 812 return NOTIFY_DONE;
817 813
@@ -851,8 +847,11 @@ static int ipvlan_addr6_validator_event(struct notifier_block *unused,
851 847
852 switch (event) { 848 switch (event) {
853 case NETDEV_UP: 849 case NETDEV_UP:
854 if (ipvlan_addr_busy(ipvlan->port, &i6vi->i6vi_addr, true)) 850 if (ipvlan_addr_busy(ipvlan->port, &i6vi->i6vi_addr, true)) {
851 NL_SET_ERR_MSG(i6vi->extack,
852 "Address already assigned to an ipvlan device");
855 return notifier_from_errno(-EADDRINUSE); 853 return notifier_from_errno(-EADDRINUSE);
854 }
856 break; 855 break;
857 } 856 }
858 857
@@ -921,8 +920,11 @@ static int ipvlan_addr4_validator_event(struct notifier_block *unused,
921 920
922 switch (event) { 921 switch (event) {
923 case NETDEV_UP: 922 case NETDEV_UP:
924 if (ipvlan_addr_busy(ipvlan->port, &ivi->ivi_addr, false)) 923 if (ipvlan_addr_busy(ipvlan->port, &ivi->ivi_addr, false)) {
924 NL_SET_ERR_MSG(ivi->extack,
925 "Address already assigned to an ipvlan device");
925 return notifier_from_errno(-EADDRINUSE); 926 return notifier_from_errno(-EADDRINUSE);
927 }
926 break; 928 break;
927 } 929 }
928 930
diff --git a/include/linux/inetdevice.h b/include/linux/inetdevice.h
index 751d051f0bc7..681dff30940b 100644
--- a/include/linux/inetdevice.h
+++ b/include/linux/inetdevice.h
@@ -154,6 +154,7 @@ struct in_ifaddr {
154struct in_validator_info { 154struct in_validator_info {
155 __be32 ivi_addr; 155 __be32 ivi_addr;
156 struct in_device *ivi_dev; 156 struct in_device *ivi_dev;
157 struct netlink_ext_ack *extack;
157}; 158};
158 159
159int register_inetaddr_notifier(struct notifier_block *nb); 160int register_inetaddr_notifier(struct notifier_block *nb);
diff --git a/include/net/addrconf.h b/include/net/addrconf.h
index 87981cd63180..b8b16437c6d5 100644
--- a/include/net/addrconf.h
+++ b/include/net/addrconf.h
@@ -55,6 +55,7 @@ struct prefix_info {
55struct in6_validator_info { 55struct in6_validator_info {
56 struct in6_addr i6vi_addr; 56 struct in6_addr i6vi_addr;
57 struct inet6_dev *i6vi_dev; 57 struct inet6_dev *i6vi_dev;
58 struct netlink_ext_ack *extack;
58}; 59};
59 60
60#define IN6_ADDR_HSIZE_SHIFT 4 61#define IN6_ADDR_HSIZE_SHIFT 4
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index e1e2ec0525e6..a4573bccd6da 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -444,7 +444,7 @@ static void check_lifetime(struct work_struct *work);
444static DECLARE_DELAYED_WORK(check_lifetime_work, check_lifetime); 444static DECLARE_DELAYED_WORK(check_lifetime_work, check_lifetime);
445 445
446static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh, 446static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh,
447 u32 portid) 447 u32 portid, struct netlink_ext_ack *extack)
448{ 448{
449 struct in_device *in_dev = ifa->ifa_dev; 449 struct in_device *in_dev = ifa->ifa_dev;
450 struct in_ifaddr *ifa1, **ifap, **last_primary; 450 struct in_ifaddr *ifa1, **ifap, **last_primary;
@@ -489,6 +489,7 @@ static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh,
489 */ 489 */
490 ivi.ivi_addr = ifa->ifa_address; 490 ivi.ivi_addr = ifa->ifa_address;
491 ivi.ivi_dev = ifa->ifa_dev; 491 ivi.ivi_dev = ifa->ifa_dev;
492 ivi.extack = extack;
492 ret = blocking_notifier_call_chain(&inetaddr_validator_chain, 493 ret = blocking_notifier_call_chain(&inetaddr_validator_chain,
493 NETDEV_UP, &ivi); 494 NETDEV_UP, &ivi);
494 ret = notifier_to_errno(ret); 495 ret = notifier_to_errno(ret);
@@ -521,7 +522,7 @@ static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh,
521 522
522static int inet_insert_ifa(struct in_ifaddr *ifa) 523static int inet_insert_ifa(struct in_ifaddr *ifa)
523{ 524{
524 return __inet_insert_ifa(ifa, NULL, 0); 525 return __inet_insert_ifa(ifa, NULL, 0, NULL);
525} 526}
526 527
527static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa) 528static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
@@ -902,7 +903,8 @@ static int inet_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
902 return ret; 903 return ret;
903 } 904 }
904 } 905 }
905 return __inet_insert_ifa(ifa, nlh, NETLINK_CB(skb).portid); 906 return __inet_insert_ifa(ifa, nlh, NETLINK_CB(skb).portid,
907 extack);
906 } else { 908 } else {
907 inet_free_ifa(ifa); 909 inet_free_ifa(ifa);
908 910
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 4603aa488f4f..93f9c0a61911 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -957,18 +957,42 @@ static u32 inet6_addr_hash(const struct in6_addr *addr)
957 return hash_32(ipv6_addr_hash(addr), IN6_ADDR_HSIZE_SHIFT); 957 return hash_32(ipv6_addr_hash(addr), IN6_ADDR_HSIZE_SHIFT);
958} 958}
959 959
960static int ipv6_add_addr_hash(struct net_device *dev, struct inet6_ifaddr *ifa)
961{
962 unsigned int hash;
963 int err = 0;
964
965 spin_lock(&addrconf_hash_lock);
966
967 /* Ignore adding duplicate addresses on an interface */
968 if (ipv6_chk_same_addr(dev_net(dev), &ifa->addr, dev)) {
969 ADBG("ipv6_add_addr: already assigned\n");
970 err = -EEXIST;
971 goto out;
972 }
973
974 /* Add to big hash table */
975 hash = inet6_addr_hash(&ifa->addr);
976 hlist_add_head_rcu(&ifa->addr_lst, &inet6_addr_lst[hash]);
977
978out:
979 spin_unlock(&addrconf_hash_lock);
980
981 return err;
982}
983
960/* On success it returns ifp with increased reference count */ 984/* On success it returns ifp with increased reference count */
961 985
962static struct inet6_ifaddr * 986static struct inet6_ifaddr *
963ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, 987ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
964 const struct in6_addr *peer_addr, int pfxlen, 988 const struct in6_addr *peer_addr, int pfxlen,
965 int scope, u32 flags, u32 valid_lft, u32 prefered_lft) 989 int scope, u32 flags, u32 valid_lft, u32 prefered_lft,
990 bool can_block, struct netlink_ext_ack *extack)
966{ 991{
992 gfp_t gfp_flags = can_block ? GFP_KERNEL : GFP_ATOMIC;
967 struct net *net = dev_net(idev->dev); 993 struct net *net = dev_net(idev->dev);
968 struct inet6_ifaddr *ifa = NULL; 994 struct inet6_ifaddr *ifa = NULL;
969 struct rt6_info *rt; 995 struct rt6_info *rt = NULL;
970 struct in6_validator_info i6vi;
971 unsigned int hash;
972 int err = 0; 996 int err = 0;
973 int addr_type = ipv6_addr_type(addr); 997 int addr_type = ipv6_addr_type(addr);
974 998
@@ -978,42 +1002,33 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
978 addr_type & IPV6_ADDR_LOOPBACK)) 1002 addr_type & IPV6_ADDR_LOOPBACK))
979 return ERR_PTR(-EADDRNOTAVAIL); 1003 return ERR_PTR(-EADDRNOTAVAIL);
980 1004
981 rcu_read_lock_bh();
982
983 in6_dev_hold(idev);
984
985 if (idev->dead) { 1005 if (idev->dead) {
986 err = -ENODEV; /*XXX*/ 1006 err = -ENODEV; /*XXX*/
987 goto out2; 1007 goto out;
988 } 1008 }
989 1009
990 if (idev->cnf.disable_ipv6) { 1010 if (idev->cnf.disable_ipv6) {
991 err = -EACCES; 1011 err = -EACCES;
992 goto out2;
993 }
994
995 i6vi.i6vi_addr = *addr;
996 i6vi.i6vi_dev = idev;
997 rcu_read_unlock_bh();
998
999 err = inet6addr_validator_notifier_call_chain(NETDEV_UP, &i6vi);
1000
1001 rcu_read_lock_bh();
1002 err = notifier_to_errno(err);
1003 if (err)
1004 goto out2;
1005
1006 spin_lock(&addrconf_hash_lock);
1007
1008 /* Ignore adding duplicate addresses on an interface */
1009 if (ipv6_chk_same_addr(dev_net(idev->dev), addr, idev->dev)) {
1010 ADBG("ipv6_add_addr: already assigned\n");
1011 err = -EEXIST;
1012 goto out; 1012 goto out;
1013 } 1013 }
1014 1014
1015 ifa = kzalloc(sizeof(struct inet6_ifaddr), GFP_ATOMIC); 1015 /* validator notifier needs to be blocking;
1016 * do not call in atomic context
1017 */
1018 if (can_block) {
1019 struct in6_validator_info i6vi = {
1020 .i6vi_addr = *addr,
1021 .i6vi_dev = idev,
1022 .extack = extack,
1023 };
1024
1025 err = inet6addr_validator_notifier_call_chain(NETDEV_UP, &i6vi);
1026 err = notifier_to_errno(err);
1027 if (err < 0)
1028 goto out;
1029 }
1016 1030
1031 ifa = kzalloc(sizeof(*ifa), gfp_flags);
1017 if (!ifa) { 1032 if (!ifa) {
1018 ADBG("ipv6_add_addr: malloc failed\n"); 1033 ADBG("ipv6_add_addr: malloc failed\n");
1019 err = -ENOBUFS; 1034 err = -ENOBUFS;
@@ -1023,6 +1038,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
1023 rt = addrconf_dst_alloc(idev, addr, false); 1038 rt = addrconf_dst_alloc(idev, addr, false);
1024 if (IS_ERR(rt)) { 1039 if (IS_ERR(rt)) {
1025 err = PTR_ERR(rt); 1040 err = PTR_ERR(rt);
1041 rt = NULL;
1026 goto out; 1042 goto out;
1027 } 1043 }
1028 1044
@@ -1053,16 +1069,21 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
1053 ifa->rt = rt; 1069 ifa->rt = rt;
1054 1070
1055 ifa->idev = idev; 1071 ifa->idev = idev;
1072 in6_dev_hold(idev);
1073
1056 /* For caller */ 1074 /* For caller */
1057 refcount_set(&ifa->refcnt, 1); 1075 refcount_set(&ifa->refcnt, 1);
1058 1076
1059 /* Add to big hash table */ 1077 rcu_read_lock_bh();
1060 hash = inet6_addr_hash(addr);
1061 1078
1062 hlist_add_head_rcu(&ifa->addr_lst, &inet6_addr_lst[hash]); 1079 err = ipv6_add_addr_hash(idev->dev, ifa);
1063 spin_unlock(&addrconf_hash_lock); 1080 if (err < 0) {
1081 rcu_read_unlock_bh();
1082 goto out;
1083 }
1064 1084
1065 write_lock(&idev->lock); 1085 write_lock(&idev->lock);
1086
1066 /* Add to inet6_dev unicast addr list. */ 1087 /* Add to inet6_dev unicast addr list. */
1067 ipv6_link_dev_addr(idev, ifa); 1088 ipv6_link_dev_addr(idev, ifa);
1068 1089
@@ -1073,21 +1094,23 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
1073 1094
1074 in6_ifa_hold(ifa); 1095 in6_ifa_hold(ifa);
1075 write_unlock(&idev->lock); 1096 write_unlock(&idev->lock);
1076out2: 1097
1077 rcu_read_unlock_bh(); 1098 rcu_read_unlock_bh();
1078 1099
1079 if (likely(err == 0)) 1100 inet6addr_notifier_call_chain(NETDEV_UP, ifa);
1080 inet6addr_notifier_call_chain(NETDEV_UP, ifa); 1101out:
1081 else { 1102 if (unlikely(err < 0)) {
1082 kfree(ifa); 1103 if (rt)
1083 in6_dev_put(idev); 1104 ip6_rt_put(rt);
1105 if (ifa) {
1106 if (ifa->idev)
1107 in6_dev_put(ifa->idev);
1108 kfree(ifa);
1109 }
1084 ifa = ERR_PTR(err); 1110 ifa = ERR_PTR(err);
1085 } 1111 }
1086 1112
1087 return ifa; 1113 return ifa;
1088out:
1089 spin_unlock(&addrconf_hash_lock);
1090 goto out2;
1091} 1114}
1092 1115
1093enum cleanup_prefix_rt_t { 1116enum cleanup_prefix_rt_t {
@@ -1334,7 +1357,7 @@ retry:
1334 1357
1335 ift = ipv6_add_addr(idev, &addr, NULL, tmp_plen, 1358 ift = ipv6_add_addr(idev, &addr, NULL, tmp_plen,
1336 ipv6_addr_scope(&addr), addr_flags, 1359 ipv6_addr_scope(&addr), addr_flags,
1337 tmp_valid_lft, tmp_prefered_lft); 1360 tmp_valid_lft, tmp_prefered_lft, true, NULL);
1338 if (IS_ERR(ift)) { 1361 if (IS_ERR(ift)) {
1339 in6_ifa_put(ifp); 1362 in6_ifa_put(ifp);
1340 in6_dev_put(idev); 1363 in6_dev_put(idev);
@@ -2018,7 +2041,7 @@ void addrconf_dad_failure(struct inet6_ifaddr *ifp)
2018 2041
2019 ifp2 = ipv6_add_addr(idev, &new_addr, NULL, pfxlen, 2042 ifp2 = ipv6_add_addr(idev, &new_addr, NULL, pfxlen,
2020 scope, flags, valid_lft, 2043 scope, flags, valid_lft,
2021 preferred_lft); 2044 preferred_lft, false, NULL);
2022 if (IS_ERR(ifp2)) 2045 if (IS_ERR(ifp2))
2023 goto lock_errdad; 2046 goto lock_errdad;
2024 2047
@@ -2476,7 +2499,7 @@ int addrconf_prefix_rcv_add_addr(struct net *net, struct net_device *dev,
2476 pinfo->prefix_len, 2499 pinfo->prefix_len,
2477 addr_type&IPV6_ADDR_SCOPE_MASK, 2500 addr_type&IPV6_ADDR_SCOPE_MASK,
2478 addr_flags, valid_lft, 2501 addr_flags, valid_lft,
2479 prefered_lft); 2502 prefered_lft, false, NULL);
2480 2503
2481 if (IS_ERR_OR_NULL(ifp)) 2504 if (IS_ERR_OR_NULL(ifp))
2482 return -1; 2505 return -1;
@@ -2786,7 +2809,8 @@ static int inet6_addr_add(struct net *net, int ifindex,
2786 const struct in6_addr *pfx, 2809 const struct in6_addr *pfx,
2787 const struct in6_addr *peer_pfx, 2810 const struct in6_addr *peer_pfx,
2788 unsigned int plen, __u32 ifa_flags, 2811 unsigned int plen, __u32 ifa_flags,
2789 __u32 prefered_lft, __u32 valid_lft) 2812 __u32 prefered_lft, __u32 valid_lft,
2813 struct netlink_ext_ack *extack)
2790{ 2814{
2791 struct inet6_ifaddr *ifp; 2815 struct inet6_ifaddr *ifp;
2792 struct inet6_dev *idev; 2816 struct inet6_dev *idev;
@@ -2845,7 +2869,7 @@ static int inet6_addr_add(struct net *net, int ifindex,
2845 } 2869 }
2846 2870
2847 ifp = ipv6_add_addr(idev, pfx, peer_pfx, plen, scope, ifa_flags, 2871 ifp = ipv6_add_addr(idev, pfx, peer_pfx, plen, scope, ifa_flags,
2848 valid_lft, prefered_lft); 2872 valid_lft, prefered_lft, true, extack);
2849 2873
2850 if (!IS_ERR(ifp)) { 2874 if (!IS_ERR(ifp)) {
2851 if (!(ifa_flags & IFA_F_NOPREFIXROUTE)) { 2875 if (!(ifa_flags & IFA_F_NOPREFIXROUTE)) {
@@ -2930,7 +2954,7 @@ int addrconf_add_ifaddr(struct net *net, void __user *arg)
2930 rtnl_lock(); 2954 rtnl_lock();
2931 err = inet6_addr_add(net, ireq.ifr6_ifindex, &ireq.ifr6_addr, NULL, 2955 err = inet6_addr_add(net, ireq.ifr6_ifindex, &ireq.ifr6_addr, NULL,
2932 ireq.ifr6_prefixlen, IFA_F_PERMANENT, 2956 ireq.ifr6_prefixlen, IFA_F_PERMANENT,
2933 INFINITY_LIFE_TIME, INFINITY_LIFE_TIME); 2957 INFINITY_LIFE_TIME, INFINITY_LIFE_TIME, NULL);
2934 rtnl_unlock(); 2958 rtnl_unlock();
2935 return err; 2959 return err;
2936} 2960}
@@ -2960,7 +2984,8 @@ static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
2960 2984
2961 ifp = ipv6_add_addr(idev, addr, NULL, plen, 2985 ifp = ipv6_add_addr(idev, addr, NULL, plen,
2962 scope, IFA_F_PERMANENT, 2986 scope, IFA_F_PERMANENT,
2963 INFINITY_LIFE_TIME, INFINITY_LIFE_TIME); 2987 INFINITY_LIFE_TIME, INFINITY_LIFE_TIME,
2988 true, NULL);
2964 if (!IS_ERR(ifp)) { 2989 if (!IS_ERR(ifp)) {
2965 spin_lock_bh(&ifp->lock); 2990 spin_lock_bh(&ifp->lock);
2966 ifp->flags &= ~IFA_F_TENTATIVE; 2991 ifp->flags &= ~IFA_F_TENTATIVE;
@@ -3060,7 +3085,7 @@ void addrconf_add_linklocal(struct inet6_dev *idev,
3060#endif 3085#endif
3061 3086
3062 ifp = ipv6_add_addr(idev, addr, NULL, 64, IFA_LINK, addr_flags, 3087 ifp = ipv6_add_addr(idev, addr, NULL, 64, IFA_LINK, addr_flags,
3063 INFINITY_LIFE_TIME, INFINITY_LIFE_TIME); 3088 INFINITY_LIFE_TIME, INFINITY_LIFE_TIME, true, NULL);
3064 if (!IS_ERR(ifp)) { 3089 if (!IS_ERR(ifp)) {
3065 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, idev->dev, 0, 0); 3090 addrconf_prefix_route(&ifp->addr, ifp->prefix_len, idev->dev, 0, 0);
3066 addrconf_dad_start(ifp); 3091 addrconf_dad_start(ifp);
@@ -4563,7 +4588,7 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh,
4563 */ 4588 */
4564 return inet6_addr_add(net, ifm->ifa_index, pfx, peer_pfx, 4589 return inet6_addr_add(net, ifm->ifa_index, pfx, peer_pfx,
4565 ifm->ifa_prefixlen, ifa_flags, 4590 ifm->ifa_prefixlen, ifa_flags,
4566 preferred_lft, valid_lft); 4591 preferred_lft, valid_lft, extack);
4567 } 4592 }
4568 4593
4569 if (nlh->nlmsg_flags & NLM_F_EXCL || 4594 if (nlh->nlmsg_flags & NLM_F_EXCL ||
diff --git a/net/ipv6/addrconf_core.c b/net/ipv6/addrconf_core.c
index 9e3488d50b15..32b564dfd02a 100644
--- a/net/ipv6/addrconf_core.c
+++ b/net/ipv6/addrconf_core.c
@@ -88,7 +88,7 @@ int __ipv6_addr_type(const struct in6_addr *addr)
88EXPORT_SYMBOL(__ipv6_addr_type); 88EXPORT_SYMBOL(__ipv6_addr_type);
89 89
90static ATOMIC_NOTIFIER_HEAD(inet6addr_chain); 90static ATOMIC_NOTIFIER_HEAD(inet6addr_chain);
91static ATOMIC_NOTIFIER_HEAD(inet6addr_validator_chain); 91static BLOCKING_NOTIFIER_HEAD(inet6addr_validator_chain);
92 92
93int register_inet6addr_notifier(struct notifier_block *nb) 93int register_inet6addr_notifier(struct notifier_block *nb)
94{ 94{
@@ -110,19 +110,20 @@ EXPORT_SYMBOL(inet6addr_notifier_call_chain);
110 110
111int register_inet6addr_validator_notifier(struct notifier_block *nb) 111int register_inet6addr_validator_notifier(struct notifier_block *nb)
112{ 112{
113 return atomic_notifier_chain_register(&inet6addr_validator_chain, nb); 113 return blocking_notifier_chain_register(&inet6addr_validator_chain, nb);
114} 114}
115EXPORT_SYMBOL(register_inet6addr_validator_notifier); 115EXPORT_SYMBOL(register_inet6addr_validator_notifier);
116 116
117int unregister_inet6addr_validator_notifier(struct notifier_block *nb) 117int unregister_inet6addr_validator_notifier(struct notifier_block *nb)
118{ 118{
119 return atomic_notifier_chain_unregister(&inet6addr_validator_chain, nb); 119 return blocking_notifier_chain_unregister(&inet6addr_validator_chain,
120 nb);
120} 121}
121EXPORT_SYMBOL(unregister_inet6addr_validator_notifier); 122EXPORT_SYMBOL(unregister_inet6addr_validator_notifier);
122 123
123int inet6addr_validator_notifier_call_chain(unsigned long val, void *v) 124int inet6addr_validator_notifier_call_chain(unsigned long val, void *v)
124{ 125{
125 return atomic_notifier_call_chain(&inet6addr_validator_chain, val, v); 126 return blocking_notifier_call_chain(&inet6addr_validator_chain, val, v);
126} 127}
127EXPORT_SYMBOL(inet6addr_validator_notifier_call_chain); 128EXPORT_SYMBOL(inet6addr_validator_notifier_call_chain);
128 129