]> git.proxmox.com Git - mirror_frr.git/blame - pimd/pim_igmp_join.h
Merge pull request #13649 from donaldsharp/unlock_the_node_or_else
[mirror_frr.git] / pimd / pim_igmp_join.h
CommitLineData
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 24struct 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
32static 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*/
61static 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 */