/** * Join a socket into a multicast group * @param sock filedescriptor of socket * @param multicast multicast ip/port to join * @param os_if pointer to outgoing interface data for multicast * @param loop true if multicast loop should be activated, false otherwise * @param log_src logging source for error messages * @return -1 if an error happened, 0 otherwise */ int os_fd_generic_join_mcast_send(struct os_fd *sock, const struct netaddr *multicast, const struct os_interface *os_if, bool loop, enum oonf_log_source log_src __attribute__((unused))) { struct netaddr_str buf1, buf2; unsigned i; if (netaddr_get_address_family(multicast) == AF_INET) { OONF_DEBUG(log_src, "Socket on interface %s joining sending multicast %s (src %s)\n", os_if->name, netaddr_to_string(&buf2, multicast), netaddr_to_string(&buf1, os_if->if_v4)); if (setsockopt(sock->fd, IPPROTO_IP, IP_MULTICAST_IF, netaddr_get_binptr(os_if->if_v4), 4) < 0) { OONF_WARN(log_src, "Cannot set multicast %s on interface %s (src %s): %s (%d)\n", netaddr_to_string(&buf2, multicast), os_if->name, netaddr_to_string(&buf1, os_if->if_v4), strerror(errno), errno); return -1; } i = loop ? 1 : 0; if(setsockopt(sock->fd, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&i, sizeof(i)) < 0) { OONF_WARN(log_src, "Cannot %sactivate local loop of multicast interface: %s (%d)\n", loop ? "" : "de", strerror(errno), errno); return -1; } } else { OONF_DEBUG(log_src, "Socket on interface %s (%d) joining sending multicast %s (src %s)\n", os_if->name, os_if->index, netaddr_to_string(&buf2, multicast), netaddr_to_string(&buf1, os_if->if_linklocal_v6)); if (setsockopt(sock->fd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &os_if->index, sizeof(os_if->index)) < 0) { OONF_WARN(log_src, "Cannot set multicast %s on interface %s (src %s): %s (%d)\n", netaddr_to_string(&buf2, multicast), os_if->name, netaddr_to_string(&buf1, os_if->if_linklocal_v6), strerror(errno), errno); return -1; } i = loop ? 1 : 0; if(setsockopt(sock->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &i, sizeof(i)) < 0) { OONF_WARN(log_src, "Cannot deactivate local loop of multicast interface: %s (%d)\n", strerror(errno), errno); return -1; } } return 0; }
static int addMessageHeader(struct rfc5444_writer *wr, struct rfc5444_writer_message *msg) { struct netaddr orig; CHECK_TRUE(0 == netaddr_from_string(&orig, "10.5.11.1"), "failed to initialize ip"); rfc5444_writer_set_msg_header(wr, msg, true, false, false, false); rfc5444_writer_set_msg_originator(wr, msg, netaddr_get_binptr(&orig)); return RFC5444_OKAY; }