]> git.proxmox.com Git - mirror_frr.git/blob - pimd/pim_igmp_join.h
Merge pull request #13649 from donaldsharp/unlock_the_node_or_else
[mirror_frr.git] / pimd / pim_igmp_join.h
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3 * PIM for Quagga
4 * Copyright (C) 2008 Everton da Silva Marques
5 */
6
7 #ifndef PIM_IGMP_JOIN_H
8 #define PIM_IGMP_JOIN_H
9
10 #include "pim_addr.h"
11
12 /* required headers #include'd by caller */
13
14 #ifndef SOL_IP
15 #define SOL_IP IPPROTO_IP
16 #endif
17
18 #ifndef MCAST_JOIN_GROUP
19 #define MCAST_JOIN_GROUP 42
20 #endif
21
22 #ifndef MCAST_JOIN_SOURCE_GROUP
23 #define MCAST_JOIN_SOURCE_GROUP 46
24 struct group_source_req {
25 uint32_t gsr_interface;
26 struct sockaddr_storage gsr_group;
27 struct sockaddr_storage gsr_source;
28 };
29 #endif
30
31 #if PIM_IPV == 4
32 static inline int pim_gm_join_source(int fd, ifindex_t ifindex,
33 pim_addr group_addr, pim_addr source_addr)
34 {
35 struct group_source_req req;
36 struct sockaddr_in group = {};
37 struct sockaddr_in source = {};
38
39 memset(&req, 0, sizeof(req));
40
41 group.sin_family = PIM_AF;
42 group.sin_addr = group_addr;
43 group.sin_port = htons(0);
44 memcpy(&req.gsr_group, &group, sizeof(group));
45
46 source.sin_family = PIM_AF;
47 source.sin_addr = source_addr;
48 source.sin_port = htons(0);
49 memcpy(&req.gsr_source, &source, sizeof(source));
50
51 req.gsr_interface = ifindex;
52
53 if (pim_addr_is_any(source_addr))
54 return setsockopt(fd, SOL_IP, MCAST_JOIN_GROUP, &req,
55 sizeof(req));
56 else
57 return setsockopt(fd, SOL_IP, MCAST_JOIN_SOURCE_GROUP, &req,
58 sizeof(req));
59 }
60 #else /* PIM_IPV != 4*/
61 static inline int pim_gm_join_source(int fd, ifindex_t ifindex,
62 pim_addr group_addr, pim_addr source_addr)
63 {
64 struct group_source_req req;
65 struct sockaddr_in6 group = {};
66 struct sockaddr_in6 source = {};
67
68 memset(&req, 0, sizeof(req));
69
70 group.sin6_family = PIM_AF;
71 group.sin6_addr = group_addr;
72 group.sin6_port = htons(0);
73 memcpy(&req.gsr_group, &group, sizeof(group));
74
75 source.sin6_family = PIM_AF;
76 source.sin6_addr = source_addr;
77 source.sin6_port = htons(0);
78 memcpy(&req.gsr_source, &source, sizeof(source));
79
80 req.gsr_interface = ifindex;
81
82 if (pim_addr_is_any(source_addr))
83 return setsockopt(fd, SOL_IPV6, MCAST_JOIN_GROUP, &req,
84 sizeof(req));
85 else
86 return setsockopt(fd, SOL_IPV6, MCAST_JOIN_SOURCE_GROUP, &req,
87 sizeof(req));
88 }
89 #endif /* PIM_IPV != 4*/
90
91 #endif /* PIM_IGMP_JOIN_H */