1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright (C) 2008 Everton da Silva Marques
7 #ifndef PIM_IGMP_JOIN_H
8 #define PIM_IGMP_JOIN_H
12 /* required headers #include'd by caller */
15 #define SOL_IP IPPROTO_IP
18 #ifndef MCAST_JOIN_GROUP
19 #define MCAST_JOIN_GROUP 42
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
;
32 static inline int pim_gm_join_source(int fd
, ifindex_t ifindex
,
33 pim_addr group_addr
, pim_addr source_addr
)
35 struct group_source_req req
;
36 struct sockaddr_in group
= {};
37 struct sockaddr_in source
= {};
39 memset(&req
, 0, sizeof(req
));
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
));
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
));
51 req
.gsr_interface
= ifindex
;
53 if (pim_addr_is_any(source_addr
))
54 return setsockopt(fd
, SOL_IP
, MCAST_JOIN_GROUP
, &req
,
57 return setsockopt(fd
, SOL_IP
, MCAST_JOIN_SOURCE_GROUP
, &req
,
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
)
64 struct group_source_req req
;
65 struct sockaddr_in6 group
= {};
66 struct sockaddr_in6 source
= {};
68 memset(&req
, 0, sizeof(req
));
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
));
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
));
80 req
.gsr_interface
= ifindex
;
82 if (pim_addr_is_any(source_addr
))
83 return setsockopt(fd
, SOL_IPV6
, MCAST_JOIN_GROUP
, &req
,
86 return setsockopt(fd
, SOL_IPV6
, MCAST_JOIN_SOURCE_GROUP
, &req
,
89 #endif /* PIM_IPV != 4*/
91 #endif /* PIM_IGMP_JOIN_H */