/* Leave from the RIP version 2 multicast group. */ static int ipv4_multicast_leave (int sock, struct in_addr group, struct in_addr ifa, unsigned int ifindex) { int ret; ret = setsockopt_ipv4_multicast (sock, IP_DROP_MEMBERSHIP, group.s_addr, ifindex); if (ret < 0) zlog (NULL, LOG_INFO, "can't setsockopt IP_DROP_MEMBERSHIP"); return ret; }
/* Join to the RIP version 2 multicast group. */ static int ipv4_multicast_join (int sock, struct in_addr group, struct in_addr ifa, unsigned int ifindex) { int ret; ret = setsockopt_ipv4_multicast (sock, IP_ADD_MEMBERSHIP, group.s_addr, ifindex); if (ret < 0) zlog (NULL, LOG_INFO, "can't setsockopt IP_ADD_MEMBERSHIP %s", safe_strerror (errno)); return ret; }
mpls_return_enum mpls_socket_multicast_if_tx(mpls_socket_mgr_handle handle, mpls_socket_handle socket, const ldp_if * iff) { struct in_addr addr; unsigned int ifindex = 0; addr.s_addr = 0; if (iff == NULL) { addr.s_addr = ntohl(INADDR_ANY); } else { ifindex = iff->handle->ifindex; } if (setsockopt_ipv4_multicast (socket->fd, IP_MULTICAST_IF, 0, ifindex)<0) { return MPLS_FAILURE; } return MPLS_SUCCESS; }
void mpls_socket_multicast_if_drop(mpls_socket_mgr_handle handle, mpls_socket_handle socket, const ldp_if * iff, const mpls_inet_addr * mult) { struct in_addr addr; unsigned int ifindex = 0; addr.s_addr = 0; if (iff == NULL) { addr.s_addr = ntohl(INADDR_ANY); } else { ifindex = iff->handle->ifindex; } if (setsockopt_ipv4_multicast(socket->fd, IP_DROP_MEMBERSHIP, htonl(mult->u.ipv4), ifindex)<0) { return; } return; }
mpls_return_enum mpls_socket_multicast_if_join(mpls_socket_mgr_handle handle, mpls_socket_handle socket, const ldp_if * iff, const mpls_inet_addr * mult) { struct in_addr addr; unsigned int ifindex = 0; addr.s_addr = 0; if (iff == NULL) { addr.s_addr = ntohl(INADDR_ANY); } else { ifindex = iff->handle->ifindex; } if (setsockopt_ipv4_multicast (socket->fd, IP_ADD_MEMBERSHIP, htonl(mult->u.ipv4), ifindex)<0) { return MPLS_FAILURE; } return MPLS_SUCCESS; }