forked from mirrors/linux
		
	net: Move fib_convert_metrics to metrics file
Move logic of fib_convert_metrics into ip_metrics_convert. This allows the code that converts netlink attributes into metrics struct to be re-used in a later patch by IPv6. This is mostly a code move with the following changes to variable names: - fi->fib_net becomes net - fc_mx and fc_mx_len are passed as inputs pulled from fib_config - metrics array is passed as an input from fi->fib_metrics->metrics Signed-off-by: David Ahern <dsahern@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									a2d481b326
								
							
						
					
					
						commit
						a919525ad8
					
				
					 4 changed files with 60 additions and 42 deletions
				
			
		|  | @ -396,6 +396,9 @@ static inline unsigned int ip_skb_dst_mtu(struct sock *sk, | ||||||
| 	return min(READ_ONCE(skb_dst(skb)->dev->mtu), IP_MAX_MTU); | 	return min(READ_ONCE(skb_dst(skb)->dev->mtu), IP_MAX_MTU); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | int ip_metrics_convert(struct net *net, struct nlattr *fc_mx, int fc_mx_len, | ||||||
|  | 		       u32 *metrics); | ||||||
|  | 
 | ||||||
| u32 ip_idents_reserve(u32 hash, int segs); | u32 ip_idents_reserve(u32 hash, int segs); | ||||||
| void __ip_select_ident(struct net *net, struct iphdr *iph, int segs); | void __ip_select_ident(struct net *net, struct iphdr *iph, int segs); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -13,7 +13,8 @@ obj-y     := route.o inetpeer.o protocol.o \ | ||||||
| 	     tcp_offload.o datagram.o raw.o udp.o udplite.o \
 | 	     tcp_offload.o datagram.o raw.o udp.o udplite.o \
 | ||||||
| 	     udp_offload.o arp.o icmp.o devinet.o af_inet.o igmp.o \
 | 	     udp_offload.o arp.o icmp.o devinet.o af_inet.o igmp.o \
 | ||||||
| 	     fib_frontend.o fib_semantics.o fib_trie.o fib_notifier.o \
 | 	     fib_frontend.o fib_semantics.o fib_trie.o fib_notifier.o \
 | ||||||
| 	     inet_fragment.o ping.o ip_tunnel_core.o gre_offload.o | 	     inet_fragment.o ping.o ip_tunnel_core.o gre_offload.o \
 | ||||||
|  | 	     metrics.o | ||||||
| 
 | 
 | ||||||
| obj-$(CONFIG_NET_IP_TUNNEL) += ip_tunnel.o | obj-$(CONFIG_NET_IP_TUNNEL) += ip_tunnel.o | ||||||
| obj-$(CONFIG_SYSCTL) += sysctl_net_ipv4.o | obj-$(CONFIG_SYSCTL) += sysctl_net_ipv4.o | ||||||
|  |  | ||||||
|  | @ -1019,47 +1019,8 @@ static bool fib_valid_prefsrc(struct fib_config *cfg, __be32 fib_prefsrc) | ||||||
| static int | static int | ||||||
| fib_convert_metrics(struct fib_info *fi, const struct fib_config *cfg) | fib_convert_metrics(struct fib_info *fi, const struct fib_config *cfg) | ||||||
| { | { | ||||||
| 	bool ecn_ca = false; | 	return ip_metrics_convert(fi->fib_net, cfg->fc_mx, cfg->fc_mx_len, | ||||||
| 	struct nlattr *nla; | 				  fi->fib_metrics->metrics); | ||||||
| 	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(fi->fib_net, tmp, &ecn_ca); |  | ||||||
| 			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; |  | ||||||
| 		if (type == RTAX_HOPLIMIT && val > 255) |  | ||||||
| 			val = 255; |  | ||||||
| 		if (type == RTAX_FEATURES && (val & ~RTAX_FEATURE_MASK)) |  | ||||||
| 			return -EINVAL; |  | ||||||
| 		fi->fib_metrics->metrics[type - 1] = val; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (ecn_ca) |  | ||||||
| 		fi->fib_metrics->metrics[RTAX_FEATURES - 1] |= DST_FEATURE_ECN_CA; |  | ||||||
| 
 |  | ||||||
| 	return 0; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct fib_info *fib_create_info(struct fib_config *cfg, | struct fib_info *fib_create_info(struct fib_config *cfg, | ||||||
|  |  | ||||||
							
								
								
									
										53
									
								
								net/ipv4/metrics.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								net/ipv4/metrics.c
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,53 @@ | ||||||
|  | #include <linux/netlink.h> | ||||||
|  | #include <linux/rtnetlink.h> | ||||||
|  | #include <linux/types.h> | ||||||
|  | #include <net/ip.h> | ||||||
|  | #include <net/net_namespace.h> | ||||||
|  | #include <net/tcp.h> | ||||||
|  | 
 | ||||||
|  | int ip_metrics_convert(struct net *net, struct nlattr *fc_mx, int fc_mx_len, | ||||||
|  | 		       u32 *metrics) | ||||||
|  | { | ||||||
|  | 	bool ecn_ca = false; | ||||||
|  | 	struct nlattr *nla; | ||||||
|  | 	int remaining; | ||||||
|  | 
 | ||||||
|  | 	if (!fc_mx) | ||||||
|  | 		return 0; | ||||||
|  | 
 | ||||||
|  | 	nla_for_each_attr(nla, fc_mx, 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(net, tmp, &ecn_ca); | ||||||
|  | 			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; | ||||||
|  | 		if (type == RTAX_HOPLIMIT && val > 255) | ||||||
|  | 			val = 255; | ||||||
|  | 		if (type == RTAX_FEATURES && (val & ~RTAX_FEATURE_MASK)) | ||||||
|  | 			return -EINVAL; | ||||||
|  | 		metrics[type - 1] = val; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (ecn_ca) | ||||||
|  | 		metrics[RTAX_FEATURES - 1] |= DST_FEATURE_ECN_CA; | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | EXPORT_SYMBOL_GPL(ip_metrics_convert); | ||||||
		Loading…
	
		Reference in a new issue
	
	 David Ahern
						David Ahern