]>
Commit | Line | Data |
---|---|---|
acddc0ed | 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
12e41d03 | 2 | /* |
896014f4 DL |
3 | * PIM for Quagga |
4 | * Copyright (C) 2008 Everton da Silva Marques | |
896014f4 | 5 | */ |
12e41d03 DL |
6 | |
7 | #ifndef PIM_IGMP_JOIN_H | |
8 | #define PIM_IGMP_JOIN_H | |
9 | ||
bd2c824a A |
10 | #include "pim_addr.h" |
11 | ||
5ef104fc | 12 | /* required headers #include'd by caller */ |
12e41d03 | 13 | |
5ef104fc DL |
14 | #ifndef SOL_IP |
15 | #define SOL_IP IPPROTO_IP | |
16 | #endif | |
17 | ||
771ce8ad LM |
18 | #ifndef MCAST_JOIN_GROUP |
19 | #define MCAST_JOIN_GROUP 42 | |
20 | #endif | |
21 | ||
5ef104fc DL |
22 | #ifndef MCAST_JOIN_SOURCE_GROUP |
23 | #define MCAST_JOIN_SOURCE_GROUP 46 | |
d62a17ae | 24 | struct group_source_req { |
25 | uint32_t gsr_interface; | |
26 | struct sockaddr_storage gsr_group; | |
27 | struct sockaddr_storage gsr_source; | |
5ef104fc DL |
28 | }; |
29 | #endif | |
30 | ||
bd2c824a A |
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) | |
5ef104fc | 34 | { |
d62a17ae | 35 | struct group_source_req req; |
bd2c824a A |
36 | struct sockaddr_in group = {}; |
37 | struct sockaddr_in source = {}; | |
5ef104fc | 38 | |
d62a17ae | 39 | memset(&req, 0, sizeof(req)); |
bd2c824a A |
40 | |
41 | group.sin_family = PIM_AF; | |
d62a17ae | 42 | group.sin_addr = group_addr; |
43 | group.sin_port = htons(0); | |
bd2c824a | 44 | memcpy(&req.gsr_group, &group, sizeof(group)); |
5ef104fc | 45 | |
bd2c824a | 46 | source.sin_family = PIM_AF; |
d62a17ae | 47 | source.sin_addr = source_addr; |
48 | source.sin_port = htons(0); | |
bd2c824a | 49 | memcpy(&req.gsr_source, &source, sizeof(source)); |
5ef104fc | 50 | |
d62a17ae | 51 | req.gsr_interface = ifindex; |
5ef104fc | 52 | |
bd2c824a | 53 | if (pim_addr_is_any(source_addr)) |
771ce8ad LM |
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)); | |
5ef104fc | 59 | } |
bd2c824a A |
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*/ | |
12e41d03 DL |
90 | |
91 | #endif /* PIM_IGMP_JOIN_H */ |