1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun #include <linux/netlink.h> 3*4882a593Smuzhiyun #include <linux/rtnetlink.h> 4*4882a593Smuzhiyun #include <linux/types.h> 5*4882a593Smuzhiyun #include <net/net_namespace.h> 6*4882a593Smuzhiyun #include <net/netlink.h> 7*4882a593Smuzhiyun #include <linux/in6.h> 8*4882a593Smuzhiyun #include <net/ip.h> 9*4882a593Smuzhiyun rtm_getroute_parse_ip_proto(struct nlattr * attr,u8 * ip_proto,u8 family,struct netlink_ext_ack * extack)10*4882a593Smuzhiyunint rtm_getroute_parse_ip_proto(struct nlattr *attr, u8 *ip_proto, u8 family, 11*4882a593Smuzhiyun struct netlink_ext_ack *extack) 12*4882a593Smuzhiyun { 13*4882a593Smuzhiyun *ip_proto = nla_get_u8(attr); 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun switch (*ip_proto) { 16*4882a593Smuzhiyun case IPPROTO_TCP: 17*4882a593Smuzhiyun case IPPROTO_UDP: 18*4882a593Smuzhiyun return 0; 19*4882a593Smuzhiyun case IPPROTO_ICMP: 20*4882a593Smuzhiyun if (family != AF_INET) 21*4882a593Smuzhiyun break; 22*4882a593Smuzhiyun return 0; 23*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6) 24*4882a593Smuzhiyun case IPPROTO_ICMPV6: 25*4882a593Smuzhiyun if (family != AF_INET6) 26*4882a593Smuzhiyun break; 27*4882a593Smuzhiyun return 0; 28*4882a593Smuzhiyun #endif 29*4882a593Smuzhiyun } 30*4882a593Smuzhiyun NL_SET_ERR_MSG(extack, "Unsupported ip proto"); 31*4882a593Smuzhiyun return -EOPNOTSUPP; 32*4882a593Smuzhiyun } 33*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(rtm_getroute_parse_ip_proto); 34