mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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