1*457c8996SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 2404eb77eSRoopa Prabhu #include <linux/netlink.h> 3404eb77eSRoopa Prabhu #include <linux/rtnetlink.h> 4404eb77eSRoopa Prabhu #include <linux/types.h> 5404eb77eSRoopa Prabhu #include <net/net_namespace.h> 6404eb77eSRoopa Prabhu #include <net/netlink.h> 75e1a99eaSHangbin Liu #include <linux/in6.h> 8404eb77eSRoopa Prabhu #include <net/ip.h> 9404eb77eSRoopa Prabhu rtm_getroute_parse_ip_proto(struct nlattr * attr,u8 * ip_proto,u8 family,struct netlink_ext_ack * extack)105e1a99eaSHangbin Liuint rtm_getroute_parse_ip_proto(struct nlattr *attr, u8 *ip_proto, u8 family, 11404eb77eSRoopa Prabhu struct netlink_ext_ack *extack) 12404eb77eSRoopa Prabhu { 13404eb77eSRoopa Prabhu *ip_proto = nla_get_u8(attr); 14404eb77eSRoopa Prabhu 15404eb77eSRoopa Prabhu switch (*ip_proto) { 16404eb77eSRoopa Prabhu case IPPROTO_TCP: 17404eb77eSRoopa Prabhu case IPPROTO_UDP: 18404eb77eSRoopa Prabhu return 0; 195e1a99eaSHangbin Liu case IPPROTO_ICMP: 205e1a99eaSHangbin Liu if (family != AF_INET) 215e1a99eaSHangbin Liu break; 225e1a99eaSHangbin Liu return 0; 235e1a99eaSHangbin Liu #if IS_ENABLED(CONFIG_IPV6) 245e1a99eaSHangbin Liu case IPPROTO_ICMPV6: 255e1a99eaSHangbin Liu if (family != AF_INET6) 265e1a99eaSHangbin Liu break; 275e1a99eaSHangbin Liu return 0; 285e1a99eaSHangbin Liu #endif 295e1a99eaSHangbin Liu } 30404eb77eSRoopa Prabhu NL_SET_ERR_MSG(extack, "Unsupported ip proto"); 31404eb77eSRoopa Prabhu return -EOPNOTSUPP; 32404eb77eSRoopa Prabhu } 33404eb77eSRoopa Prabhu EXPORT_SYMBOL_GPL(rtm_getroute_parse_ip_proto); 34