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