net: fib: move metrics parsing to a helper
fib_create_info() is already quite large, so before adding more code to the metrics section move that to a helper, similar to ip6_convert_metrics. Suggested-by: Daniel Borkmann <daniel@iogearbox.net> Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									87583ebb9f
								
							
						
					
					
						commit
						6cf9dfd3bd
					
				| @ -876,6 +876,44 @@ static bool fib_valid_prefsrc(struct fib_config *cfg, __be32 fib_prefsrc) | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| static int | ||||
| fib_convert_metrics(struct fib_info *fi, const struct fib_config *cfg) | ||||
| { | ||||
| 	struct nlattr *nla; | ||||
| 	int remaining; | ||||
| 
 | ||||
| 	if (!cfg->fc_mx) | ||||
| 		return 0; | ||||
| 
 | ||||
| 	nla_for_each_attr(nla, cfg->fc_mx, cfg->fc_mx_len, remaining) { | ||||
| 		int type = nla_type(nla); | ||||
| 		u32 val; | ||||
| 
 | ||||
| 		if (!type) | ||||
| 			continue; | ||||
| 		if (type > RTAX_MAX) | ||||
| 			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(tmp); | ||||
| 			if (val == TCP_CA_UNSPEC) | ||||
| 				return -EINVAL; | ||||
| 		} else { | ||||
| 			val = nla_get_u32(nla); | ||||
| 		} | ||||
| 		if (type == RTAX_ADVMSS && val > 65535 - 40) | ||||
| 			val = 65535 - 40; | ||||
| 		if (type == RTAX_MTU && val > 65535 - 15) | ||||
| 			val = 65535 - 15; | ||||
| 		fi->fib_metrics[type - 1] = val; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| struct fib_info *fib_create_info(struct fib_config *cfg) | ||||
| { | ||||
| 	int err; | ||||
| @ -948,36 +986,9 @@ struct fib_info *fib_create_info(struct fib_config *cfg) | ||||
| 			goto failure; | ||||
| 	} endfor_nexthops(fi) | ||||
| 
 | ||||
| 	if (cfg->fc_mx) { | ||||
| 		struct nlattr *nla; | ||||
| 		int remaining; | ||||
| 
 | ||||
| 		nla_for_each_attr(nla, cfg->fc_mx, cfg->fc_mx_len, remaining) { | ||||
| 			int type = nla_type(nla); | ||||
| 
 | ||||
| 			if (type) { | ||||
| 				u32 val; | ||||
| 
 | ||||
| 				if (type > RTAX_MAX) | ||||
| 					goto err_inval; | ||||
| 				if (type == RTAX_CC_ALGO) { | ||||
| 					char tmp[TCP_CA_NAME_MAX]; | ||||
| 
 | ||||
| 					nla_strlcpy(tmp, nla, sizeof(tmp)); | ||||
| 					val = tcp_ca_get_key_by_name(tmp); | ||||
| 					if (val == TCP_CA_UNSPEC) | ||||
| 						goto err_inval; | ||||
| 				} else { | ||||
| 					val = nla_get_u32(nla); | ||||
| 				} | ||||
| 				if (type == RTAX_ADVMSS && val > 65535 - 40) | ||||
| 					val = 65535 - 40; | ||||
| 				if (type == RTAX_MTU && val > 65535 - 15) | ||||
| 					val = 65535 - 15; | ||||
| 				fi->fib_metrics[type - 1] = val; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	err = fib_convert_metrics(fi, cfg); | ||||
| 	if (err) | ||||
| 		goto failure; | ||||
| 
 | ||||
| 	if (cfg->fc_mp) { | ||||
| #ifdef CONFIG_IP_ROUTE_MULTIPATH | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user