@@ -511,8 +511,8 @@ int fib_nh_init(struct net *net, struct fib_nh *nh,
511
511
goto init_failure ;
512
512
513
513
nh -> fib_nh_oif = cfg -> fc_oif ;
514
- if (cfg -> fc_gw ) {
515
- nh -> fib_nh_gw4 = cfg -> fc_gw ;
514
+ if (cfg -> fc_gw_family == AF_INET ) {
515
+ nh -> fib_nh_gw4 = cfg -> fc_gw4 ;
516
516
nh -> fib_nh_gw_family = AF_INET ;
517
517
}
518
518
nh -> fib_nh_flags = cfg -> fc_flags ;
@@ -589,8 +589,10 @@ static int fib_get_nhs(struct fib_info *fi, struct rtnexthop *rtnh,
589
589
struct nlattr * nla , * attrs = rtnh_attrs (rtnh );
590
590
591
591
nla = nla_find (attrs , attrlen , RTA_GATEWAY );
592
- if (nla )
593
- fib_cfg .fc_gw = nla_get_in_addr (nla );
592
+ if (nla ) {
593
+ fib_cfg .fc_gw_family = AF_INET ;
594
+ fib_cfg .fc_gw4 = nla_get_in_addr (nla );
595
+ }
594
596
595
597
nla = nla_find (attrs , attrlen , RTA_FLOW );
596
598
if (nla )
@@ -616,10 +618,14 @@ static int fib_get_nhs(struct fib_info *fi, struct rtnexthop *rtnh,
616
618
"Nexthop device index does not match RTA_OIF" );
617
619
goto errout ;
618
620
}
619
- if (cfg -> fc_gw && fi -> fib_nh -> fib_nh_gw4 != cfg -> fc_gw ) {
620
- NL_SET_ERR_MSG (extack ,
621
- "Nexthop gateway does not match RTA_GATEWAY" );
622
- goto errout ;
621
+ if (cfg -> fc_gw_family ) {
622
+ if (cfg -> fc_gw_family != fi -> fib_nh -> fib_nh_gw_family ||
623
+ (cfg -> fc_gw_family == AF_INET &&
624
+ fi -> fib_nh -> fib_nh_gw4 != cfg -> fc_gw4 )) {
625
+ NL_SET_ERR_MSG (extack ,
626
+ "Nexthop gateway does not match RTA_GATEWAY" );
627
+ goto errout ;
628
+ }
623
629
}
624
630
#ifdef CONFIG_IP_ROUTE_CLASSID
625
631
if (cfg -> fc_flow && fi -> fib_nh -> nh_tclassid != cfg -> fc_flow ) {
@@ -719,7 +725,7 @@ int fib_nh_match(struct fib_config *cfg, struct fib_info *fi,
719
725
if (cfg -> fc_priority && cfg -> fc_priority != fi -> fib_priority )
720
726
return 1 ;
721
727
722
- if (cfg -> fc_oif || cfg -> fc_gw ) {
728
+ if (cfg -> fc_oif || cfg -> fc_gw_family ) {
723
729
if (cfg -> fc_encap ) {
724
730
if (fib_encap_match (cfg -> fc_encap_type , cfg -> fc_encap ,
725
731
fi -> fib_nh , cfg , extack ))
@@ -730,10 +736,16 @@ int fib_nh_match(struct fib_config *cfg, struct fib_info *fi,
730
736
cfg -> fc_flow != fi -> fib_nh -> nh_tclassid )
731
737
return 1 ;
732
738
#endif
733
- if ((!cfg -> fc_oif || cfg -> fc_oif == fi -> fib_nh -> fib_nh_oif ) &&
734
- (!cfg -> fc_gw || cfg -> fc_gw == fi -> fib_nh -> fib_nh_gw4 ))
735
- return 0 ;
736
- return 1 ;
739
+ if ((cfg -> fc_oif && cfg -> fc_oif != fi -> fib_nh -> fib_nh_oif ) ||
740
+ (cfg -> fc_gw_family &&
741
+ cfg -> fc_gw_family != fi -> fib_nh -> fib_nh_gw_family ))
742
+ return 1 ;
743
+
744
+ if (cfg -> fc_gw_family == AF_INET &&
745
+ cfg -> fc_gw4 != fi -> fib_nh -> fib_nh_gw4 )
746
+ return 1 ;
747
+
748
+ return 0 ;
737
749
}
738
750
739
751
#ifdef CONFIG_IP_ROUTE_MULTIPATH
@@ -1204,7 +1216,7 @@ struct fib_info *fib_create_info(struct fib_config *cfg,
1204
1216
goto failure ;
1205
1217
1206
1218
if (fib_props [cfg -> fc_type ].error ) {
1207
- if (cfg -> fc_gw || cfg -> fc_oif || cfg -> fc_mp ) {
1219
+ if (cfg -> fc_gw_family || cfg -> fc_oif || cfg -> fc_mp ) {
1208
1220
NL_SET_ERR_MSG (extack ,
1209
1221
"Gateway, device and multipath can not be specified for this route type" );
1210
1222
goto err_inval ;
0 commit comments