Skip to content
Snippets Groups Projects
Commit a9acfaef authored by clohr's avatar clohr
Browse files

support de l'unicast

git-svn-id: https://redmine.imt-atlantique.fr/svn/xaal/code/C/branches/version-0.7@2317 b32b6428-25c9-4566-ad07-03861ab6144f
parent 7d0e086f
Branches
No related tags found
No related merge requests found
......@@ -90,39 +90,53 @@ bool xAAL_join_bus(const char *addr,
return false;
}
/* Now, join the group */
/* Now, join the group if it is a multicast address, or connect to it if it is an unicast address */
switch (rp->ai_family) {
case AF_INET:
memcpy(&mreqn.imr_multiaddr.s_addr, &(((struct sockaddr_in*)(rp->ai_addr))->sin_addr), sizeof(struct in_addr));
mreqn.imr_address.s_addr = INADDR_ANY;
mreqn.imr_ifindex = 0;
if ( setsockopt(bus->sfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreqn, sizeof(mreqn)) == -1) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could not join the multicast group: %s\n", strerror(errno));
return false;
}
if ( setsockopt(bus->sfd, IPPROTO_IP, IP_MULTICAST_TTL, &hops, sizeof(hops)) == -1) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could not set TTL to %d: %s\n", hops, strerror(errno));
return false;
}
if ( setsockopt(bus->sfd, IPPROTO_IP, IP_MULTICAST_LOOP, &mcast_loop, sizeof(mcast_loop)) == -1) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could not %s multicast loop: %s\n", mcast_loop?"enable":"disable", strerror(errno));
return false;
if ( IN_MULTICAST(ntohl( ((struct sockaddr_in*)(rp->ai_addr))->sin_addr.s_addr )) ) {
memcpy(&mreqn.imr_multiaddr.s_addr, &(((struct sockaddr_in*)(rp->ai_addr))->sin_addr), sizeof(struct in_addr));
mreqn.imr_address.s_addr = INADDR_ANY;
mreqn.imr_ifindex = 0;
if ( setsockopt(bus->sfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreqn, sizeof(mreqn)) == -1) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could not join the multicast group: %s\n", strerror(errno));
return false;
}
if ( setsockopt(bus->sfd, IPPROTO_IP, IP_MULTICAST_TTL, &hops, sizeof(hops)) == -1) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could not set TTL to %d: %s\n", hops, strerror(errno));
return false;
}
if ( setsockopt(bus->sfd, IPPROTO_IP, IP_MULTICAST_LOOP, &mcast_loop, sizeof(mcast_loop)) == -1) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could not %s multicast loop: %s\n", mcast_loop?"enable":"disable", strerror(errno));
return false;
}
} else {
if ( connect(bus->sfd, rp->ai_addr, rp->ai_addrlen) ) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could connect the unicast peer: %s\n", strerror(errno));
return false;
}
}
break;
case AF_INET6:
memcpy(&mreq6.ipv6mr_multiaddr, &(((struct sockaddr_in6*)(rp->ai_addr))->sin6_addr), sizeof(struct in6_addr));
mreq6.ipv6mr_interface = 0;
if ( setsockopt(bus->sfd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq6, sizeof(mreq6)) == -1) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could not join the multicast group: %s\n", strerror(errno));
return false;
}
if ( setsockopt(bus->sfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)) == -1) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could not set Hops to %d: %s\n", hops, strerror(errno));
return false;
}
if ( setsockopt(bus->sfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &mcast_loop, sizeof(mcast_loop)) == -1) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could not %s multicast loop: %s\n", mcast_loop?"enable":"disable", strerror(errno));
return false;
if ( IN6_IS_ADDR_MULTICAST( ((struct sockaddr_in6 *)(rp->ai_addr))->sin6_addr.s6_addr) ) {
memcpy(&mreq6.ipv6mr_multiaddr, &(((struct sockaddr_in6*)(rp->ai_addr))->sin6_addr), sizeof(struct in6_addr));
mreq6.ipv6mr_interface = 0;
if ( setsockopt(bus->sfd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &mreq6, sizeof(mreq6)) == -1) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could not join the multicast group: %s\n", strerror(errno));
return false;
}
if ( setsockopt(bus->sfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)) == -1) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could not set Hops to %d: %s\n", hops, strerror(errno));
return false;
}
if ( setsockopt(bus->sfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &mcast_loop, sizeof(mcast_loop)) == -1) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could not %s multicast loop: %s\n", mcast_loop?"enable":"disable", strerror(errno));
return false;
}
} else {
if ( connect(bus->sfd, rp->ai_addr, rp->ai_addrlen) ) {
if (xAAL_error_log) fprintf(xAAL_error_log, "Could connect the unicast peer: %s\n", strerror(errno));
return false;
}
}
break;
default:
......@@ -133,7 +147,7 @@ bool xAAL_join_bus(const char *addr,
memcpy(&bus->addr, rp->ai_addr, rp->ai_addrlen);
bus->addrlen = rp->ai_addrlen;
freeaddrinfo(result); /* No longer needed */
freeaddrinfo(result);
if (sodium_init() == -1)
return false;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment