mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	For ip rules, we need to use 'ipproto ipv6-icmp' to match ICMPv6 headers.
But for ip -6 route, currently we only support tcp, udp and icmp.
Add ICMPv6 support so we can match ipv6-icmp rules for route lookup.
v2: As David Ahern and Sabrina Dubroca suggested, Add an argument to
rtm_getroute_parse_ip_proto() to handle ICMP/ICMPv6 with different family.
Reported-by: Jianlin Shi <jishi@redhat.com>
Fixes: eacb9384a3 ("ipv6: support sport, dport and ip_proto in RTM_GETROUTE")
Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
		
	
			
		
			
				
	
	
		
			32 lines
		
	
	
	
		
			696 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			32 lines
		
	
	
	
		
			696 B
		
	
	
	
		
			C
		
	
	
	
	
	
#include <linux/netlink.h>
 | 
						|
#include <linux/rtnetlink.h>
 | 
						|
#include <linux/types.h>
 | 
						|
#include <net/net_namespace.h>
 | 
						|
#include <net/netlink.h>
 | 
						|
#include <linux/in6.h>
 | 
						|
#include <net/ip.h>
 | 
						|
 | 
						|
int rtm_getroute_parse_ip_proto(struct nlattr *attr, u8 *ip_proto, u8 family,
 | 
						|
				struct netlink_ext_ack *extack)
 | 
						|
{
 | 
						|
	*ip_proto = nla_get_u8(attr);
 | 
						|
 | 
						|
	switch (*ip_proto) {
 | 
						|
	case IPPROTO_TCP:
 | 
						|
	case IPPROTO_UDP:
 | 
						|
		return 0;
 | 
						|
	case IPPROTO_ICMP:
 | 
						|
		if (family != AF_INET)
 | 
						|
			break;
 | 
						|
		return 0;
 | 
						|
#if IS_ENABLED(CONFIG_IPV6)
 | 
						|
	case IPPROTO_ICMPV6:
 | 
						|
		if (family != AF_INET6)
 | 
						|
			break;
 | 
						|
		return 0;
 | 
						|
#endif
 | 
						|
	}
 | 
						|
	NL_SET_ERR_MSG(extack, "Unsupported ip proto");
 | 
						|
	return -EOPNOTSUPP;
 | 
						|
}
 | 
						|
EXPORT_SYMBOL_GPL(rtm_getroute_parse_ip_proto);
 |