netlink.c 737 B

123456789101112131415161718192021222324252627282930313233
  1. // SPDX-License-Identifier: GPL-2.0-only
  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. int rtm_getroute_parse_ip_proto(struct nlattr *attr, u8 *ip_proto, u8 family,
  10. struct netlink_ext_ack *extack)
  11. {
  12. *ip_proto = nla_get_u8(attr);
  13. switch (*ip_proto) {
  14. case IPPROTO_TCP:
  15. case IPPROTO_UDP:
  16. return 0;
  17. case IPPROTO_ICMP:
  18. if (family != AF_INET)
  19. break;
  20. return 0;
  21. #if IS_ENABLED(CONFIG_IPV6)
  22. case IPPROTO_ICMPV6:
  23. if (family != AF_INET6)
  24. break;
  25. return 0;
  26. #endif
  27. }
  28. NL_SET_ERR_MSG(extack, "Unsupported ip proto");
  29. return -EOPNOTSUPP;
  30. }
  31. EXPORT_SYMBOL_GPL(rtm_getroute_parse_ip_proto);