/src/frr/pimd/pim_igmp_join.h
Line | Count | Source |
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 | 0 | { |
35 | 0 | struct group_source_req req; |
36 | 0 | struct sockaddr_in group = {}; |
37 | 0 | struct sockaddr_in source = {}; |
38 | |
|
39 | 0 | memset(&req, 0, sizeof(req)); |
40 | |
|
41 | 0 | group.sin_family = PIM_AF; |
42 | 0 | group.sin_addr = group_addr; |
43 | 0 | group.sin_port = htons(0); |
44 | 0 | memcpy(&req.gsr_group, &group, sizeof(group)); |
45 | |
|
46 | 0 | source.sin_family = PIM_AF; |
47 | 0 | source.sin_addr = source_addr; |
48 | 0 | source.sin_port = htons(0); |
49 | 0 | memcpy(&req.gsr_source, &source, sizeof(source)); |
50 | |
|
51 | 0 | req.gsr_interface = ifindex; |
52 | |
|
53 | 0 | if (pim_addr_is_any(source_addr)) |
54 | 0 | return setsockopt(fd, SOL_IP, MCAST_JOIN_GROUP, &req, |
55 | 0 | sizeof(req)); |
56 | 0 | else |
57 | 0 | return setsockopt(fd, SOL_IP, MCAST_JOIN_SOURCE_GROUP, &req, |
58 | 0 | sizeof(req)); |
59 | 0 | } |
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 */ |