@@ -731,14 +731,17 @@ static struct mlxsw_sp_fib *mlxsw_sp_vr_fib(const struct mlxsw_sp_vr *vr,
731
731
}
732
732
733
733
static 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
737
struct mlxsw_sp_vr * vr ;
737
738
int err ;
738
739
739
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
743
return ERR_PTR (- EBUSY );
744
+ }
742
745
vr -> fib4 = mlxsw_sp_fib_create (vr , MLXSW_SP_L3_PROTO_IPV4 );
743
746
if (IS_ERR (vr -> fib4 ))
744
747
return ERR_CAST (vr -> fib4 );
@@ -775,14 +778,15 @@ static void mlxsw_sp_vr_destroy(struct mlxsw_sp_vr *vr)
775
778
vr -> fib4 = NULL ;
776
779
}
777
780
778
- static struct mlxsw_sp_vr * mlxsw_sp_vr_get (struct mlxsw_sp * mlxsw_sp , u32 tb_id )
781
+ static 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
784
struct mlxsw_sp_vr * vr ;
781
785
782
786
tb_id = mlxsw_sp_fix_tb_id (tb_id );
783
787
vr = mlxsw_sp_vr_find (mlxsw_sp , tb_id );
784
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
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
949
953
static struct mlxsw_sp_rif *
950
954
mlxsw_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
953
958
static struct mlxsw_sp_rif_ipip_lb *
954
959
mlxsw_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
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
975
if (IS_ERR (rif ))
971
976
return ERR_CAST (rif );
972
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
3841
struct mlxsw_sp_vr * vr ;
3837
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
3845
if (IS_ERR (vr ))
3841
3846
return ERR_CAST (vr );
3842
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
4880
if (mlxsw_sp -> router -> aborted )
4876
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
4884
if (IS_ERR (vr ))
4880
4885
return PTR_ERR (vr );
4881
4886
@@ -4908,7 +4913,7 @@ mlxsw_sp_router_fibmr_vif_add(struct mlxsw_sp *mlxsw_sp,
4908
4913
if (mlxsw_sp -> router -> aborted )
4909
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
4917
if (IS_ERR (vr ))
4913
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
5472
5477
static struct mlxsw_sp_rif *
5473
5478
mlxsw_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
5482
u32 tb_id = l3mdev_fib_table (params -> dev );
5477
5483
const struct mlxsw_sp_rif_ops * ops ;
@@ -5485,14 +5491,16 @@ mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
5485
5491
type = mlxsw_sp_dev_rif_type (mlxsw_sp , params -> dev );
5486
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
5495
if (IS_ERR (vr ))
5490
5496
return ERR_CAST (vr );
5491
5497
vr -> rif_count ++ ;
5492
5498
5493
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
5502
goto err_rif_index_alloc ;
5503
+ }
5496
5504
5497
5505
rif = mlxsw_sp_rif_alloc (ops -> rif_size , rif_index , vr -> id , params -> dev );
5498
5506
if (!rif ) {
@@ -5579,7 +5587,8 @@ mlxsw_sp_rif_subport_params_init(struct mlxsw_sp_rif_params *params,
5579
5587
5580
5588
static int
5581
5589
mlxsw_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
5593
struct mlxsw_sp_port * mlxsw_sp_port = mlxsw_sp_port_vlan -> mlxsw_sp_port ;
5585
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
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
5608
if (IS_ERR (rif ))
5600
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
5651
5660
static int mlxsw_sp_inetaddr_port_vlan_event (struct net_device * l3_dev ,
5652
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
5665
struct mlxsw_sp_port * mlxsw_sp_port = netdev_priv (port_dev );
5656
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
5672
switch (event ) {
5663
5673
case NETDEV_UP :
5664
5674
return mlxsw_sp_port_vlan_router_join (mlxsw_sp_port_vlan ,
5665
- l3_dev );
5675
+ l3_dev , extack );
5666
5676
case NETDEV_DOWN :
5667
5677
mlxsw_sp_port_vlan_router_leave (mlxsw_sp_port_vlan );
5668
5678
break ;
@@ -5672,19 +5682,22 @@ static int mlxsw_sp_inetaddr_port_vlan_event(struct net_device *l3_dev,
5672
5682
}
5673
5683
5674
5684
static 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
5688
if (netif_is_bridge_port (port_dev ) ||
5678
5689
netif_is_lag_port (port_dev ) ||
5679
5690
netif_is_ovs_port (port_dev ))
5680
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
5685
5697
static int __mlxsw_sp_inetaddr_lag_event (struct net_device * l3_dev ,
5686
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
5702
struct net_device * port_dev ;
5690
5703
struct list_head * iter ;
@@ -5694,7 +5707,8 @@ static int __mlxsw_sp_inetaddr_lag_event(struct net_device *l3_dev,
5694
5707
if (mlxsw_sp_port_dev_check (port_dev )) {
5695
5708
err = mlxsw_sp_inetaddr_port_vlan_event (l3_dev ,
5696
5709
port_dev ,
5697
- event , vid );
5710
+ event , vid ,
5711
+ extack );
5698
5712
if (err )
5699
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
5706
5720
static 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
5724
if (netif_is_bridge_port (lag_dev ))
5710
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
5715
5731
static 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
5735
struct mlxsw_sp * mlxsw_sp = mlxsw_sp_lower_get (l3_dev );
5719
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
5741
switch (event ) {
5725
5742
case NETDEV_UP :
5726
- rif = mlxsw_sp_rif_create (mlxsw_sp , & params );
5743
+ rif = mlxsw_sp_rif_create (mlxsw_sp , & params , extack );
5727
5744
if (IS_ERR (rif ))
5728
5745
return PTR_ERR (rif );
5729
5746
break ;
@@ -5737,7 +5754,8 @@ static int mlxsw_sp_inetaddr_bridge_event(struct net_device *l3_dev,
5737
5754
}
5738
5755
5739
5756
static 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
5760
struct net_device * real_dev = vlan_dev_real_dev (vlan_dev );
5743
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
5766
if (mlxsw_sp_port_dev_check (real_dev ))
5749
5767
return mlxsw_sp_inetaddr_port_vlan_event (vlan_dev , real_dev ,
5750
- event , vid );
5768
+ event , vid , extack );
5751
5769
else if (netif_is_lag_master (real_dev ))
5752
5770
return __mlxsw_sp_inetaddr_lag_event (vlan_dev , real_dev , event ,
5753
- vid );
5771
+ vid , extack );
5754
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
5775
return 0 ;
5758
5776
}
5759
5777
5760
5778
static 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
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
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
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
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
5790
else
5772
5791
return 0 ;
5773
5792
}
@@ -5793,7 +5812,7 @@ int mlxsw_sp_inetaddr_event(struct notifier_block *unused,
5793
5812
if (!mlxsw_sp_rif_should_config (rif , dev , event ))
5794
5813
goto out ;
5795
5814
5796
- err = __mlxsw_sp_inetaddr_event (dev , event );
5815
+ err = __mlxsw_sp_inetaddr_event (dev , event , NULL );
5797
5816
out :
5798
5817
return notifier_from_errno (err );
5799
5818
}
@@ -5815,7 +5834,7 @@ int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused,
5815
5834
if (!mlxsw_sp_rif_should_config (rif , dev , event ))
5816
5835
goto out ;
5817
5836
5818
- err = __mlxsw_sp_inetaddr_event (dev , event );
5837
+ err = __mlxsw_sp_inetaddr_event (dev , event , ivi -> extack );
5819
5838
out :
5820
5839
return notifier_from_errno (err );
5821
5840
}
@@ -5844,7 +5863,7 @@ static void mlxsw_sp_inet6addr_event_work(struct work_struct *work)
5844
5863
if (!mlxsw_sp_rif_should_config (rif , dev , event ))
5845
5864
goto out ;
5846
5865
5847
- __mlxsw_sp_inetaddr_event (dev , event );
5866
+ __mlxsw_sp_inetaddr_event (dev , event , NULL );
5848
5867
out :
5849
5868
rtnl_unlock ();
5850
5869
dev_put (dev );
@@ -5896,7 +5915,7 @@ int mlxsw_sp_inet6addr_valid_event(struct notifier_block *unused,
5896
5915
if (!mlxsw_sp_rif_should_config (rif , dev , event ))
5897
5916
goto out ;
5898
5917
5899
- err = __mlxsw_sp_inetaddr_event (dev , event );
5918
+ err = __mlxsw_sp_inetaddr_event (dev , event , i6vi -> extack );
5900
5919
out :
5901
5920
return notifier_from_errno (err );
5902
5921
}
@@ -5973,7 +5992,8 @@ int mlxsw_sp_netdevice_router_port_event(struct net_device *dev)
5973
5992
}
5974
5993
5975
5994
static int mlxsw_sp_port_vrf_join (struct mlxsw_sp * mlxsw_sp ,
5976
- struct net_device * l3_dev )
5995
+ struct net_device * l3_dev ,
5996
+ struct netlink_ext_ack * extack )
5977
5997
{
5978
5998
struct mlxsw_sp_rif * rif ;
5979
5999
@@ -5982,9 +6002,9 @@ static int mlxsw_sp_port_vrf_join(struct mlxsw_sp *mlxsw_sp,
5982
6002
*/
5983
6003
rif = mlxsw_sp_rif_find_by_dev (mlxsw_sp , l3_dev );
5984
6004
if (rif )
5985
- __mlxsw_sp_inetaddr_event (l3_dev , NETDEV_DOWN );
6005
+ __mlxsw_sp_inetaddr_event (l3_dev , NETDEV_DOWN , extack );
5986
6006
5987
- return __mlxsw_sp_inetaddr_event (l3_dev , NETDEV_UP );
6007
+ return __mlxsw_sp_inetaddr_event (l3_dev , NETDEV_UP , extack );
5988
6008
}
5989
6009
5990
6010
static void mlxsw_sp_port_vrf_leave (struct mlxsw_sp * mlxsw_sp ,
@@ -5995,7 +6015,7 @@ static void mlxsw_sp_port_vrf_leave(struct mlxsw_sp *mlxsw_sp,
5995
6015
rif = mlxsw_sp_rif_find_by_dev (mlxsw_sp , l3_dev );
5996
6016
if (!rif )
5997
6017
return ;
5998
- __mlxsw_sp_inetaddr_event (l3_dev , NETDEV_DOWN );
6018
+ __mlxsw_sp_inetaddr_event (l3_dev , NETDEV_DOWN , NULL );
5999
6019
}
6000
6020
6001
6021
int mlxsw_sp_netdevice_vrf_event (struct net_device * l3_dev , unsigned long event ,
@@ -6011,10 +6031,14 @@ int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event,
6011
6031
case NETDEV_PRECHANGEUPPER :
6012
6032
return 0 ;
6013
6033
case NETDEV_CHANGEUPPER :
6014
- if (info -> linking )
6015
- err = mlxsw_sp_port_vrf_join (mlxsw_sp , l3_dev );
6016
- else
6034
+ if (info -> linking ) {
6035
+ struct netlink_ext_ack * extack ;
6036
+
6037
+ extack = netdev_notifier_info_to_extack (& info -> info );
6038
+ err = mlxsw_sp_port_vrf_join (mlxsw_sp , l3_dev , extack );
6039
+ } else {
6017
6040
mlxsw_sp_port_vrf_leave (mlxsw_sp , l3_dev );
6041
+ }
6018
6042
break ;
6019
6043
}
6020
6044
@@ -6321,7 +6345,7 @@ mlxsw_sp_rif_ipip_lb_configure(struct mlxsw_sp_rif *rif)
6321
6345
struct mlxsw_sp_vr * ul_vr ;
6322
6346
int err ;
6323
6347
6324
- ul_vr = mlxsw_sp_vr_get (mlxsw_sp , ul_tb_id );
6348
+ ul_vr = mlxsw_sp_vr_get (mlxsw_sp , ul_tb_id , NULL );
6325
6349
if (IS_ERR (ul_vr ))
6326
6350
return PTR_ERR (ul_vr );
6327
6351
0 commit comments