| 294 | } |
| 295 | |
| 296 | Result AddMembership(Socket socket, Address multi_addr, Address interface_addr, int ttl) |
| 297 | { |
| 298 | int result = -1; |
| 299 | if (IsSocketIPv4(socket)) |
| 300 | { |
| 301 | assert(multi_addr.m_family == DOMAIN_IPV4 && interface_addr.m_family == DOMAIN_IPV4); |
| 302 | struct ip_mreq group; |
| 303 | group.imr_multiaddr.s_addr = *IPv4(&multi_addr); |
| 304 | group.imr_interface.s_addr = *IPv4(&interface_addr); |
| 305 | result = setsockopt(socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&group, sizeof(group)); |
| 306 | if (result == 0) |
| 307 | { |
| 308 | uint8_t ttl_byte = (uint8_t)ttl; |
| 309 | result = setsockopt(socket, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ttl_byte, sizeof(ttl_byte)); |
| 310 | } |
| 311 | } |
| 312 | else if (IsSocketIPv6(socket)) |
| 313 | { |
| 314 | assert(multi_addr.m_family == DOMAIN_IPV6 && interface_addr.m_family == DOMAIN_IPV6); |
| 315 | assert(false && "Interface membership not implemented for IPv6"); |
| 316 | } |
| 317 | else |
| 318 | { |
| 319 | dmLogError("Failed to add interface membership, unsupported address family!"); |
| 320 | return RESULT_AFNOSUPPORT; |
| 321 | } |
| 322 | |
| 323 | return result == 0 ? RESULT_OK : NATIVETORESULT(DM_SOCKET_ERRNO); |
| 324 | } |
| 325 | |
| 326 | Result SetMulticastIf(Socket socket, Address address) |
| 327 | { |