162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci#include <linux/netlink.h>
362306a36Sopenharmony_ci#include <linux/rtnetlink.h>
462306a36Sopenharmony_ci#include <linux/types.h>
562306a36Sopenharmony_ci#include <net/net_namespace.h>
662306a36Sopenharmony_ci#include <net/netlink.h>
762306a36Sopenharmony_ci#include <linux/in6.h>
862306a36Sopenharmony_ci#include <net/ip.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciint rtm_getroute_parse_ip_proto(struct nlattr *attr, u8 *ip_proto, u8 family,
1162306a36Sopenharmony_ci				struct netlink_ext_ack *extack)
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	*ip_proto = nla_get_u8(attr);
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	switch (*ip_proto) {
1662306a36Sopenharmony_ci	case IPPROTO_TCP:
1762306a36Sopenharmony_ci	case IPPROTO_UDP:
1862306a36Sopenharmony_ci		return 0;
1962306a36Sopenharmony_ci	case IPPROTO_ICMP:
2062306a36Sopenharmony_ci		if (family != AF_INET)
2162306a36Sopenharmony_ci			break;
2262306a36Sopenharmony_ci		return 0;
2362306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_IPV6)
2462306a36Sopenharmony_ci	case IPPROTO_ICMPV6:
2562306a36Sopenharmony_ci		if (family != AF_INET6)
2662306a36Sopenharmony_ci			break;
2762306a36Sopenharmony_ci		return 0;
2862306a36Sopenharmony_ci#endif
2962306a36Sopenharmony_ci	}
3062306a36Sopenharmony_ci	NL_SET_ERR_MSG(extack, "Unsupported ip proto");
3162306a36Sopenharmony_ci	return -EOPNOTSUPP;
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rtm_getroute_parse_ip_proto);
34