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