diff options
| author | Donald Sharp <donaldsharp72@gmail.com> | 2024-09-24 15:36:09 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-24 15:36:09 -0400 |
| commit | c0ccf381d49c8c0425cd6b47ec6b367043e4b65d (patch) | |
| tree | 7d16685776da44fa28d6ed1771d5a505edf39ac3 /pimd/pim_sock.c | |
| parent | 354f73d6152b5e6e17b1c6e2c6b643735db94ca9 (diff) | |
| parent | dff1db9ef699a768806d1aa752f0166d33339bc9 (diff) | |
Merge pull request #16634 from nabahr/autorp
PIM: Implement AutoRP functionality
Diffstat (limited to 'pimd/pim_sock.c')
| -rw-r--r-- | pimd/pim_sock.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/pimd/pim_sock.c b/pimd/pim_sock.c index 3476c177b7..8900652df9 100644 --- a/pimd/pim_sock.c +++ b/pimd/pim_sock.c @@ -292,6 +292,36 @@ int pim_socket_join(int fd, pim_addr group, pim_addr ifaddr, ifindex_t ifindex, return ret; } +int pim_socket_leave(int fd, pim_addr group, pim_addr ifaddr, ifindex_t ifindex, + struct pim_interface *pim_ifp) +{ + int ret; + +#if PIM_IPV == 4 + ret = setsockopt_ipv4_multicast(fd, IP_DROP_MEMBERSHIP, ifaddr, + group.s_addr, ifindex); +#else + struct ipv6_mreq opt; + + memcpy(&opt.ipv6mr_multiaddr, &group, 16); + opt.ipv6mr_interface = ifindex; + ret = setsockopt(fd, IPPROTO_IPV6, IPV6_LEAVE_GROUP, &opt, sizeof(opt)); +#endif + + if (ret) { + flog_err(EC_LIB_SOCKET, + "Failure socket leaving fd=%d group %pPAs on interface address %pPAs: %m", + fd, &group, &ifaddr); + pim_ifp->igmp_ifstat_joins_failed++; + return ret; + } + + if (PIM_DEBUG_TRACE) + zlog_debug("Socket fd=%d left group %pPAs on interface address %pPAs", + fd, &group, &ifaddr); + return ret; +} + #if PIM_IPV == 4 static void cmsg_getdstaddr(struct msghdr *mh, struct sockaddr_storage *dst, ifindex_t *ifindex) |
