pim.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __LINUX_PIM_H
  3. #define __LINUX_PIM_H
  4. #include <linux/skbuff.h>
  5. #include <asm/byteorder.h>
  6. /* Message types - V1 */
  7. #define PIM_V1_VERSION cpu_to_be32(0x10000000)
  8. #define PIM_V1_REGISTER 1
  9. /* Message types - V2 */
  10. #define PIM_VERSION 2
  11. /* RFC7761, sec 4.9:
  12. * Type
  13. * Types for specific PIM messages. PIM Types are:
  14. *
  15. * Message Type Destination
  16. * ---------------------------------------------------------------------
  17. * 0 = Hello Multicast to ALL-PIM-ROUTERS
  18. * 1 = Register Unicast to RP
  19. * 2 = Register-Stop Unicast to source of Register
  20. * packet
  21. * 3 = Join/Prune Multicast to ALL-PIM-ROUTERS
  22. * 4 = Bootstrap Multicast to ALL-PIM-ROUTERS
  23. * 5 = Assert Multicast to ALL-PIM-ROUTERS
  24. * 6 = Graft (used in PIM-DM only) Unicast to RPF'(S)
  25. * 7 = Graft-Ack (used in PIM-DM only) Unicast to source of Graft
  26. * packet
  27. * 8 = Candidate-RP-Advertisement Unicast to Domain's BSR
  28. */
  29. enum {
  30. PIM_TYPE_HELLO,
  31. PIM_TYPE_REGISTER,
  32. PIM_TYPE_REGISTER_STOP,
  33. PIM_TYPE_JOIN_PRUNE,
  34. PIM_TYPE_BOOTSTRAP,
  35. PIM_TYPE_ASSERT,
  36. PIM_TYPE_GRAFT,
  37. PIM_TYPE_GRAFT_ACK,
  38. PIM_TYPE_CANDIDATE_RP_ADV
  39. };
  40. #define PIM_NULL_REGISTER cpu_to_be32(0x40000000)
  41. /* RFC7761, sec 4.9:
  42. * The PIM header common to all PIM messages is:
  43. * 0 1 2 3
  44. * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  45. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  46. * |PIM Ver| Type | Reserved | Checksum |
  47. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  48. */
  49. struct pimhdr {
  50. __u8 type;
  51. __u8 reserved;
  52. __be16 csum;
  53. };
  54. /* PIMv2 register message header layout (ietf-draft-idmr-pimvsm-v2-00.ps */
  55. struct pimreghdr {
  56. __u8 type;
  57. __u8 reserved;
  58. __be16 csum;
  59. __be32 flags;
  60. };
  61. int pim_rcv_v1(struct sk_buff *skb);
  62. static inline bool ipmr_pimsm_enabled(void)
  63. {
  64. return IS_BUILTIN(CONFIG_IP_PIMSM_V1) || IS_BUILTIN(CONFIG_IP_PIMSM_V2);
  65. }
  66. static inline struct pimhdr *pim_hdr(const struct sk_buff *skb)
  67. {
  68. return (struct pimhdr *)skb_transport_header(skb);
  69. }
  70. static inline u8 pim_hdr_version(const struct pimhdr *pimhdr)
  71. {
  72. return pimhdr->type >> 4;
  73. }
  74. static inline u8 pim_hdr_type(const struct pimhdr *pimhdr)
  75. {
  76. return pimhdr->type & 0xf;
  77. }
  78. /* check if the address is 224.0.0.13, RFC7761 sec 4.3.1 */
  79. static inline bool pim_ipv4_all_pim_routers(__be32 addr)
  80. {
  81. return addr == htonl(0xE000000D);
  82. }
  83. #endif