| 204 | } |
| 205 | |
| 206 | Result AddMembership(Socket socket, Address multi_addr, Address interface_addr, int ttl) |
| 207 | { |
| 208 | #if defined(__EMSCRIPTEN__) |
| 209 | return RESULT_AFNOSUPPORT; |
| 210 | #else |
| 211 | int result = -1; |
| 212 | if (IsSocketIPv4(socket)) |
| 213 | { |
| 214 | assert(multi_addr.m_family == DOMAIN_IPV4 && interface_addr.m_family == DOMAIN_IPV4); |
| 215 | struct ip_mreq group; |
| 216 | group.imr_multiaddr.s_addr = *IPv4(&multi_addr); |
| 217 | group.imr_interface.s_addr = *IPv4(&interface_addr); |
| 218 | result = setsockopt(socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)); |
| 219 | if (result == 0) |
| 220 | { |
| 221 | uint8_t ttl_byte = (uint8_t) ttl; |
| 222 | result = setsockopt(socket, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&ttl_byte, sizeof(ttl_byte)); |
| 223 | } |
| 224 | } else if (IsSocketIPv6(socket)) |
| 225 | { |
| 226 | assert(multi_addr.m_family == DOMAIN_IPV6 && interface_addr.m_family == DOMAIN_IPV6); |
| 227 | assert(false && "Interface membership not implemented for IPv6"); |
| 228 | } |
| 229 | else |
| 230 | { |
| 231 | dmLogError("Failed to add interface membership, unsupported address family!"); |
| 232 | return RESULT_AFNOSUPPORT; |
| 233 | } |
| 234 | |
| 235 | return result == 0 ? RESULT_OK : NATIVETORESULT(DM_SOCKET_ERRNO); |
| 236 | #endif |
| 237 | } |
| 238 | |
| 239 | Result SetMulticastIf(Socket socket, Address address) |
| 240 | { |
nothing calls this directly
no test coverage detected