Extract a class with the name Multicast, that handles send and receive of DTM
node discovery datagram messages. The underlying protocol can be IP broadcast,
IP multicast, and - implemented in this ticket: IP unicast.
Note that this refactoring isn't complete - the new class has private methods
that are in fact more or less unmodified copies of the old C functions.
---
src/dtm/Makefile.am | 3 +-
src/dtm/dtmnd/Multicast.cc | 780 ++++++++++++++++++++++++++++++++++++++
src/dtm/dtmnd/Multicast.h | 96 +++++
src/dtm/dtmnd/dtm.h | 3 +-
src/dtm/dtmnd/dtm_cb.h | 56 +--
src/dtm/dtmnd/dtm_inter.h | 3 +-
src/dtm/dtmnd/dtm_inter_svc.cc | 3 +-
src/dtm/dtmnd/dtm_intra.cc | 11 +-
src/dtm/dtmnd/dtm_intra.h | 5 +-
src/dtm/dtmnd/dtm_intra_disc.h | 8 +-
src/dtm/dtmnd/dtm_intra_svc.cc | 10 +-
src/dtm/dtmnd/dtm_main.cc | 151 +++-----
src/dtm/dtmnd/dtm_node.cc | 33 +-
src/dtm/dtmnd/dtm_node.h | 14 +-
src/dtm/dtmnd/dtm_node_sockets.cc | 732 +----------------------------------
src/dtm/dtmnd/dtm_read_config.cc | 54 +--
src/dtm/dtmnd/dtm_socket.h | 28 --
17 files changed, 1025 insertions(+), 965 deletions(-)
create mode 100644 src/dtm/dtmnd/Multicast.cc
create mode 100644 src/dtm/dtmnd/Multicast.h
delete mode 100644 src/dtm/dtmnd/dtm_socket.h
diff --git a/src/dtm/Makefile.am b/src/dtm/Makefile.am
index 7f540d9b6..0c9685c3c 100644
--- a/src/dtm/Makefile.am
+++ b/src/dtm/Makefile.am
@@ -19,6 +19,7 @@ EXTRA_DIST += \
src/dtm/README
noinst_HEADERS += \
+ src/dtm/dtmnd/Multicast.h \
src/dtm/dtmnd/dtm.h \
src/dtm/dtmnd/dtm_cb.h \
src/dtm/dtmnd/dtm_inter.h \
@@ -28,7 +29,6 @@ noinst_HEADERS += \
src/dtm/dtmnd/dtm_intra_disc.h \
src/dtm/dtmnd/dtm_intra_trans.h \
src/dtm/dtmnd/dtm_node.h \
- src/dtm/dtmnd/dtm_socket.h \
src/dtm/transport/log_server.h \
src/dtm/transport/log_writer.h \
src/dtm/transport/tests/mock_logtrace.h \
@@ -63,6 +63,7 @@ bin_osafdtmd_CPPFLAGS = \
$(AM_CPPFLAGS)
bin_osafdtmd_SOURCES = \
+ src/dtm/dtmnd/Multicast.cc \
src/dtm/dtmnd/dtm_inter_svc.cc \
src/dtm/dtmnd/dtm_inter_trans.cc \
src/dtm/dtmnd/dtm_intra.cc \
diff --git a/src/dtm/dtmnd/Multicast.cc b/src/dtm/dtmnd/Multicast.cc
new file mode 100644
index 000000000..922124a9c
--- /dev/null
+++ b/src/dtm/dtmnd/Multicast.cc
@@ -0,0 +1,780 @@
+/* -*- OpenSAF -*-
+ *
+ * (C) Copyright 2010 The OpenSAF Foundation
+ * Copyright Ericsson AB 2017 - All Rights Reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): GoAhead Software
+ * Ericsson AB
+ *
+ */
+
+#include "dtm/dtmnd/Multicast.h"
+#include <arpa/inet.h>
+#include <endian.h>
+#include <inttypes.h>
+#include <net/if.h>
+#include <unistd.h>
+#include <cerrno>
+#include <cstdio>
+#include <cstring>
+#include "base/logtrace.h"
+
+Multicast::Multicast(uint16_t cluster_id, uint32_t node_id,
+ in_port_t stream_port, in_port_t dgram_port,
+ sa_family_t address_family,
+ const std::string &stream_address,
+ const std::string &dgram_address,
+ const std::string &multicast_address,
+ const std::string &ifname, bool scope_link)
+ : cluster_id_{cluster_id},
+ node_id_{node_id},
+ stream_port_{stream_port},
+ dgram_port_{dgram_port},
+ address_family_{address_family},
+ stream_address_{stream_address},
+ dgram_address_{dgram_address},
+ multicast_address_{multicast_address},
+ ifname_{ifname},
+ scope_link_{scope_link},
+ dest_addr_size_{},
+ dgram_sock_sndr{-1},
+ dgram_sock_rcvr{-1},
+ dest_addr_{} {
+ if (!multicast_address.empty()) {
+ /*
+ 0
+ restricted to the same host
+ 1
+ restricted to the same subnet
+ 32
+ restricted to the same site
+ 64
+ restricted to the same region
+ 128
+ restricted to the same continent
+ 255
+ unrestricted
+ */
+ uint32_t rc = dtm_dgram_mcast_sender(64); /*TODO */
+ if (rc == NCSCC_RC_SUCCESS) {
+ rc = dtm_dgram_mcast_listener();
+ if (rc != NCSCC_RC_SUCCESS) {
+ LOG_ER("DTM:Set up the initial mcast receiver socket failed");
+ }
+ } else {
+ LOG_ER("DTM:Set up the initial mcast sender socket failed rc: %d", rc);
+ }
+ } else {
+ uint32_t rc = dtm_dgram_bcast_sender();
+ if (rc == NCSCC_RC_SUCCESS) {
+ rc = dtm_dgram_bcast_listener();
+ if (rc != NCSCC_RC_SUCCESS) {
+ LOG_ER("DTM:Set up the initial bcast receiver socket failed");
+ }
+ } else {
+ LOG_ER("DTM:Set up the initial bcast sender socket failed rc: %d", rc);
+ }
+ }
+}
+
+Multicast::~Multicast() {
+ if (dgram_sock_sndr >= 0) close(dgram_sock_sndr);
+ if (dgram_sock_rcvr >= 0) close(dgram_sock_rcvr);
+}
+
+/**
+ * Function for sending the bcast
+ *
+ * @param dtms_cb
+ *
+ * @return NCSCC_RC_SUCCESS
+ * @return NCSCC_RC_FAILURE
+ *
+ */
+uint32_t Multicast::dtm_dgram_bcast_sender() {
+ TRACE_ENTER();
+
+ dgram_sock_sndr = -1;
+ dest_addr_size_ = 0;
+ memset(&dest_addr_, 0, sizeof(dest_addr_));
+
+ if (address_family_ == AF_INET) {
+ /* Holder for bcast_dest_address address */
+ struct sockaddr_in *bcast_sender_addr_in =
+ reinterpret_cast<struct sockaddr_in *>(&dest_addr_);
+ bcast_sender_addr_in->sin_family = AF_INET;
+ bcast_sender_addr_in->sin_port = htons(dgram_port_);
+ TRACE("DTM: IP address : %s Bcast address : %s sa_family : %d ",
+ stream_address_.c_str(), dgram_address_.c_str(), address_family_);
+ int rc = inet_pton(AF_INET, dgram_address_.c_str(),
+ &bcast_sender_addr_in->sin_addr);
+ if (rc != 1) {
+ LOG_ER("DTM : inet_pton failed");
+ TRACE_LEAVE2("rc :%d", rc);
+ return NCSCC_RC_FAILURE;
+ }
+
+ memset(bcast_sender_addr_in->sin_zero, '\0',
+ sizeof(bcast_sender_addr_in->sin_zero));
+ dest_addr_size_ = sizeof(struct sockaddr_in);
+ } else if (address_family_ == AF_INET6) {
+ /* Holder for bcast_dest_address address */
+ struct sockaddr_in6 *bcast_sender_addr_in6 =
+ reinterpret_cast<struct sockaddr_in6 *>(&dest_addr_);
+ bcast_sender_addr_in6->sin6_family = AF_INET6;
+ bcast_sender_addr_in6->sin6_port = htons(dgram_port_);
+ bcast_sender_addr_in6->sin6_flowinfo = 0;
+ bcast_sender_addr_in6->sin6_scope_id = if_nametoindex(ifname_.c_str());
+ TRACE("DTM: IP address : %s Bcast address : %s sa_family : %d ",
+ stream_address_.c_str(), dgram_address_.c_str(), address_family_);
+ inet_pton(AF_INET6, dgram_address_.c_str(),
+ &bcast_sender_addr_in6->sin6_addr);
+ dest_addr_size_ = sizeof(struct sockaddr_in6);
+ } else {
+ LOG_ER("DTM : dgram_enable_bcast failed");
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ /* Create socket for sending/receiving datagrams */
+ dgram_sock_sndr =
+ socket(dest_addr_.ss_family, SOCK_DGRAM | SOCK_NONBLOCK | SOCK_CLOEXEC,
+ IPPROTO_UDP);
+ if (dgram_sock_sndr == -1) {
+ LOG_ER("DTM :socket create failederr :%s", strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ if (dgram_enable_bcast(dgram_sock_sndr) != NCSCC_RC_SUCCESS) {
+ LOG_ER("DTM : dgram_enable_bcast failed");
+ if (close(dgram_sock_sndr) != 0 && errno != EINTR) {
+ LOG_ER("Failed to close socket, errno=%d", errno);
+ }
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ if (address_family_ == AF_INET6) {
+ struct sockaddr_in6 *bcast_sender_addr_in6 =
+ reinterpret_cast<struct sockaddr_in6 *>(&dest_addr_);
+ int yes = 1;
+ if (setsockopt(dgram_sock_sndr, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &yes,
+ sizeof(yes)) < 0) {
+ LOG_ER("DTM :setsockopt(IPV6_MULTICAST_HOPS) failed err :%s",
+ strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ if (setsockopt(dgram_sock_sndr, SOL_SOCKET, SO_REUSEADDR, &yes,
+ sizeof(yes)) < 0) {
+ LOG_ER("DTM :setsockopt(SO_REUSEADDR) failed err :%s", strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ unsigned int ifindex;
+ ifindex = if_nametoindex(ifname_.c_str());
+ if (setsockopt(dgram_sock_sndr, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifindex,
+ sizeof(ifindex)) < 0) {
+ LOG_ER("DTM :setsockopt(IPV6_MULTICAST_IF) failed err :%s ifname :%d",
+ strerror(errno), if_nametoindex(ifname_.c_str()));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ struct ipv6_mreq maddr;
+ memset(&maddr, 0, sizeof(maddr));
+ maddr.ipv6mr_multiaddr = bcast_sender_addr_in6->sin6_addr;
+ maddr.ipv6mr_interface = if_nametoindex(ifname_.c_str());
+ if (setsockopt(dgram_sock_sndr, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, &maddr,
+ sizeof(maddr)) < 0) {
+ LOG_ER("DTM :setsockopt(IPV6_ADD_MEMBERSHIP) failed err :%s",
+ strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+ }
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
+ return NCSCC_RC_SUCCESS;
+}
+
+/**
+ * Enable the dgram bcast
+ *
+ * @param sock_desc
+ *
+ * @return NCSCC_RC_SUCCESS
+ * @return NCSCC_RC_FAILURE
+ *
+ */
+uint32_t Multicast::dgram_enable_bcast(int sock_desc) {
+ TRACE_ENTER();
+ /* If this fails, we'll hear about it when we try to send. This will
+ * allow */
+ /* system that cannot bcast to continue if they don't plan to bcast */
+ int bcast_permission = 1;
+ if (setsockopt(sock_desc, SOL_SOCKET, SO_BROADCAST, &bcast_permission,
+ sizeof(bcast_permission)) < 0) {
+ LOG_ER("DTM :setsockopt(SO_BROADCAST) failed err :%s ", strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
+ return NCSCC_RC_SUCCESS;
+}
+
+/**
+ * Function to send the mcast message
+ *
+ * @param dtms_cb mcast_ttl
+ *
+ * @return NCSCC_RC_SUCCESS
+ * @return NCSCC_RC_FAILURE
+ *
+ */
+uint32_t Multicast::dtm_dgram_mcast_sender(int mcast_ttl) {
+ /* Construct the serv address structure */
+ struct addrinfo addr_criteria; // Criteria for address match
+ char local_port_str[INET6_ADDRSTRLEN];
+ int rv;
+ TRACE_ENTER();
+
+ dgram_sock_sndr = -1;
+
+ TRACE("DTM :dgram_port_rcvr :%d", dgram_port_);
+ snprintf(local_port_str, sizeof(local_port_str), "%d", (dgram_port_));
+
+ memset(&addr_criteria, 0, sizeof(addr_criteria)); /* Zero out structure */
+ addr_criteria.ai_family = AF_UNSPEC; /* v4 or v6 is OK */
+ addr_criteria.ai_socktype = SOCK_DGRAM; /* Only datagram sockets */
+ addr_criteria.ai_protocol = IPPROTO_UDP; /* Only UDP please */
+ addr_criteria.ai_flags |= AI_NUMERICHOST; /* Don't try to resolve address */
+
+ struct addrinfo *mcast_sender_addr;
+ /* For link-local address, need to set sin6_scope_id to match the
+ device index of the network device on it has to connecct */
+ if (scope_link_) {
+ char mcast_addr_eth[INET6_ADDRSTRLEN + IFNAMSIZ];
+ memset(mcast_addr_eth, 0, (INET6_ADDRSTRLEN + IFNAMSIZ));
+ sprintf(mcast_addr_eth, "%s%%%s", multicast_address_.c_str(),
+ ifname_.c_str());
+ rv = getaddrinfo(mcast_addr_eth, local_port_str, &addr_criteria,
+ &mcast_sender_addr);
+ TRACE("DTM :mcast_addr : %s local_port_str :%s", mcast_addr_eth,
+ local_port_str);
+ } else {
+ rv = getaddrinfo(multicast_address_.c_str(), local_port_str,
&addr_criteria,
+ &mcast_sender_addr);
+ TRACE("DTM :mcast_addr : %s local_port_str :%s",
multicast_address_.c_str(),
+ local_port_str);
+ }
+ if (rv != 0) {
+ LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
+ strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ if (mcast_sender_addr == nullptr) {
+ LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
+ strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ TRACE("DTM :family : %d, socktype : %d, protocol :%d",
+ mcast_sender_addr->ai_family, mcast_sender_addr->ai_socktype,
+ mcast_sender_addr->ai_protocol);
+ /* Create socket for sending multicast datagrams */
+ if ((dgram_sock_sndr =
+ socket(mcast_sender_addr->ai_family,
+ mcast_sender_addr->ai_socktype | SOCK_NONBLOCK |
SOCK_CLOEXEC,
+ mcast_sender_addr->ai_protocol)) == -1) {
+ LOG_ER("DTM:Socket creation failed (socket()) err :%s", strerror(errno));
+ freeaddrinfo(mcast_sender_addr);
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ if (dgram_set_mcast_ttl(mcast_ttl, mcast_sender_addr->ai_family) !=
+ NCSCC_RC_SUCCESS) {
+ LOG_ER("DTM : dgram_set_mcast_ttl() failed");
+ if (close(dgram_sock_sndr) != 0 && errno != EINTR) {
+ LOG_ER("Failed to close socket, errno=%d", errno);
+ }
+ freeaddrinfo(mcast_sender_addr);
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ size_t addrlen = mcast_sender_addr->ai_addrlen;
+ if (addrlen > sizeof(dest_addr_)) {
+ LOG_ER("getaddrinfo() returned too large address: %zu", addrlen);
+ addrlen = sizeof(dest_addr_);
+ }
+ memcpy(&dest_addr_, mcast_sender_addr->ai_addr, addrlen);
+
+ freeaddrinfo(mcast_sender_addr);
+
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
+ return NCSCC_RC_SUCCESS;
+}
+
+Multicast::Message::Message(uint16_t i_cluster_id, uint32_t i_node_id,
+ bool i_use_multicast, in_port_t i_stream_port,
+ sa_family_t i_address_family,
+ const std::string &i_stream_address)
+ : message_size{htobe16(sizeof(Message))},
+ cluster_id{htobe16(i_cluster_id)},
+ node_id{htobe32(i_node_id)},
+ use_multicast{i_use_multicast ? uint8_t{1} : uint8_t{0}},
+ stream_port{htobe16(i_stream_port)},
+ address_family{static_cast<uint8_t>(i_address_family)},
+ stream_address{} {
+ size_t len = i_stream_address.size();
+ if (len >= sizeof(stream_address) - 1) len = sizeof(stream_address) - 1;
+ memcpy(stream_address, i_stream_address.data(), len);
+ memset(stream_address + len, 0, sizeof(stream_address) - len);
+}
+
+/**
+ * Set the mcast ttl
+ *
+ * @param dtms_cb mcast_ttl
+ *
+ * @return NCSCC_RC_SUCCESS
+ * @return NCSCC_RC_FAILURE
+ *
+ */
+uint32_t Multicast::dgram_set_mcast_ttl(int mcast_ttl, int family) {
+ TRACE_ENTER();
+ /* Set TTL of mcast packet. Unfortunately this requires */
+ /* address-family-specific code */
+ if (family == AF_INET6) { // v6-specific
+ /* The v6 mcast TTL socket option requires that the value be */
+ /* passed in as an integer */
+ if (setsockopt(dgram_sock_sndr, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
+ &mcast_ttl, sizeof(mcast_ttl)) < 0) {
+ LOG_ER("DTM : setsockopt(IPV6_MULTICAST_HOPS) failed err :%s",
+ strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+ unsigned int ifindex;
+ ifindex = if_nametoindex(ifname_.c_str());
+ if (setsockopt(dgram_sock_sndr, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifindex,
+ sizeof(ifindex)) < 0) {
+ LOG_ER("DTM :setsockopt(IPV6_MULTICAST_IF) failed err :%s ifname :%d",
+ strerror(errno), if_nametoindex(ifname_.c_str()));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+ } else if (family == AF_INET) { /* v4 specific */
+ if (setsockopt(dgram_sock_sndr, IPPROTO_IP, IP_MULTICAST_TTL, &mcast_ttl,
+ sizeof(mcast_ttl)) < 0) {
+ LOG_ER("DTM :setsockopt(IP_MULTICAST_TTL) failed err :%s",
+ strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+ } else {
+ LOG_ER("DTM: AF not supported :%d", family);
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
+ return NCSCC_RC_SUCCESS;
+}
+
+bool Multicast::Send() {
+ TRACE_ENTER();
+ Message msg{cluster_id_, node_id_, !multicast_address_.empty(),
+ stream_port_, address_family_, stream_address_};
+ bool success = true;
+ ssize_t num_bytes =
+ sendto(dgram_sock_sndr, &msg, sizeof(msg), 0,
+ reinterpret_cast<struct sockaddr *>(&dest_addr_),
dest_addr_size_);
+ if (num_bytes < 0) {
+ LOG_ER("sendto() failed: %s ", strerror(errno));
+ success = false;
+ } else if (static_cast<size_t>(num_bytes) != sizeof(msg)) {
+ LOG_ER("sendto() sent unexpected number of bytes %zd", num_bytes);
+ success = false;
+ }
+
+ TRACE_LEAVE2("success: %d", success ? 1 : 0);
+ return success;
+}
+
+/**
+ * Function to rcv the bcast message
+ *
+ * @param dtms_cb node_ip buffer buffer_len
+ *
+ * @return NCSCC_RC_SUCCESS
+ * @return NCSCC_RC_FAILURE
+ *
+ */
+ssize_t Multicast::Receive(void *buffer, size_t buffer_len) {
+ TRACE_ENTER();
+
+ ssize_t rtn;
+ do {
+ rtn = recv(dgram_sock_rcvr, buffer, buffer_len, MSG_DONTWAIT);
+ } while (rtn < 0 && errno == EINTR);
+ if (rtn < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
+ LOG_ER("DTM:Receive failed (recv()) err :%s", strerror(errno));
+ }
+
+ TRACE_LEAVE2("rc :%zd", rtn);
+ return rtn;
+}
+
+/**
+ * Join the mcast group
+ *
+ * @param dtms_cb mcast_receiver_addr
+ *
+ * @return NCSCC_RC_SUCCESS
+ * @return NCSCC_RC_FAILURE
+ *
+ */
+uint32_t Multicast::dgram_join_mcast_group(
+ struct addrinfo *mcast_receiver_addr) {
+ TRACE_ENTER();
+
+ /* we need some address-family-specific pieces */
+ if (mcast_receiver_addr->ai_family == AF_INET6) {
+ /* Now join the mcast "group" (address) */
+ struct ipv6_mreq join_request;
+ memcpy(
+ &join_request.ipv6mr_multiaddr,
+ &(reinterpret_cast<struct sockaddr_in6
*>(mcast_receiver_addr->ai_addr))
+ ->sin6_addr,
+ sizeof(struct in6_addr));
+ join_request.ipv6mr_interface = if_nametoindex(ifname_.c_str());
+ TRACE("DTM :Joining IPv6 mcast group...");
+ if (setsockopt(dgram_sock_rcvr, IPPROTO_IPV6, IPV6_JOIN_GROUP,
+ &join_request, sizeof(join_request)) < 0) {
+ LOG_ER("DTM :setsockopt(IPV6_JOIN_GROUP) failed err :%s",
+ strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+ } else if (mcast_receiver_addr->ai_family == AF_INET) {
+ /* Now join the mcast "group" */
+ struct ip_mreq join_request;
+ memset(&join_request, 0, sizeof(join_request));
+ join_request.imr_multiaddr =
+ reinterpret_cast<struct sockaddr_in *>(mcast_receiver_addr->ai_addr)
+ ->sin_addr;
+ if (inet_aton(stream_address_.c_str(), &join_request.imr_interface) == 0) {
+ LOG_ER("Invalid IPv4 address '%s'", stream_address_.c_str());
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+ TRACE("DTM :Joining IPv4 mcast group...");
+ if (setsockopt(dgram_sock_rcvr, IPPROTO_IP, IP_ADD_MEMBERSHIP,
+ &join_request, sizeof(join_request)) < 0) {
+ LOG_ER("DTM :setsockopt(IP_ADD_MEMBERSHIP) failed err :%s ",
+ strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+ } else {
+ LOG_ER("DTM: AF not supported :%d", mcast_receiver_addr->ai_family);
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
+ return NCSCC_RC_SUCCESS;
+}
+
+/**
+ * Function to listen to mcast message
+ *
+ * @param dtms_cb
+ *
+ * @return NCSCC_RC_SUCCESS
+ * @return NCSCC_RC_FAILURE
+ *
+ */
+uint32_t Multicast::dtm_dgram_mcast_listener() {
+ /* Construct the serv address structure */
+ struct addrinfo addr_criteria; /* Criteria for address match */
+ char local_port_str[INET6_ADDRSTRLEN];
+ int rv;
+ struct addrinfo *addr_list; /* Holder serv address */
+ TRACE_ENTER();
+
+ TRACE("DTM :dgram_port_rcvr :%d", dgram_port_);
+ snprintf(local_port_str, sizeof(local_port_str), "%" PRIu16, dgram_port_);
+
+ dgram_sock_rcvr = -1;
+
+ memset(&addr_criteria, 0, sizeof(addr_criteria)); /* Zero out structure */
+ addr_criteria.ai_family = AF_UNSPEC; /* v4 or v6 is OK */
+ addr_criteria.ai_socktype = SOCK_DGRAM; /* Only datagram sockets */
+ addr_criteria.ai_protocol = IPPROTO_UDP; /* Only UDP protocol */
+ addr_criteria.ai_flags |= AI_NUMERICHOST; /* Don't try to resolve address */
+
+ /* For link-local address, need to set sin6_scope_id to match the
+ device index of the network device on it has to connecct */
+ if (scope_link_) {
+ char mcast_addr_eth[INET6_ADDRSTRLEN + IFNAMSIZ];
+ memset(mcast_addr_eth, 0, (INET6_ADDRSTRLEN + IFNAMSIZ));
+ sprintf(mcast_addr_eth, "%s%%%s", multicast_address_.c_str(),
+ ifname_.c_str());
+ rv =
+ getaddrinfo(mcast_addr_eth, local_port_str, &addr_criteria,
&addr_list);
+ TRACE("DTM:mcast_addr_eth : %s local_port_str :%s", mcast_addr_eth,
+ local_port_str);
+ } else {
+ rv = getaddrinfo(multicast_address_.c_str(), local_port_str,
&addr_criteria,
+ &addr_list);
+ TRACE("DTM :mcast_addr : %s local_port_str :%s",
multicast_address_.c_str(),
+ local_port_str);
+ }
+ if (rv != 0) {
+ LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
+ strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ if (addr_list == nullptr) {
+ LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
+ strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ TRACE("DTM :family : %d, socktype : %d, protocol :%d", addr_list->ai_family,
+ addr_list->ai_socktype, addr_list->ai_protocol);
+ /* Create socket for sending multicast datagrams */
+ if ((dgram_sock_rcvr =
+ socket(addr_list->ai_family,
+ addr_list->ai_socktype | SOCK_NONBLOCK | SOCK_CLOEXEC,
+ addr_list->ai_protocol)) == -1) {
+ LOG_ER("DTM:Socket creation failed (socket()) err :%s", strerror(errno));
+ freeaddrinfo(addr_list);
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ if (dgram_sock_rcvr == -1) {
+ LOG_ER("DTM:Socket creation failed (socket())");
+ freeaddrinfo(addr_list);
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ if (bind(dgram_sock_rcvr, addr_list->ai_addr, addr_list->ai_addrlen) < 0) {
+ LOG_ER("DTM : bind() failed err :%s ", strerror(errno));
+ if (close(dgram_sock_rcvr) != 0 && errno != EINTR)
+ LOG_ER("close() failed, errno=%d", errno);
+ freeaddrinfo(addr_list);
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ if (dgram_join_mcast_group(addr_list) != NCSCC_RC_SUCCESS) {
+ LOG_ER("DTM : dgram_join_mcast_group() failed");
+ if (close(dgram_sock_rcvr) != 0 && errno != EINTR)
+ LOG_ER("close() failed, errno=%d", errno);
+ freeaddrinfo(addr_list);
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ /* Free address structure(s) allocated by getaddrinfo() */
+ freeaddrinfo(addr_list);
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
+ return NCSCC_RC_SUCCESS;
+}
+
+/**
+ * Function to listen to the bcast message
+ *
+ * @param dtms_cb
+ *
+ * @return NCSCC_RC_SUCCESS
+ * @return NCSCC_RC_FAILURE
+ *
+ */
+uint32_t Multicast::dtm_dgram_bcast_listener() {
+ struct addrinfo addr_criteria, *addr_list = nullptr,
+ *p; // Criteria for address
+ char local_port_str[INET6_ADDRSTRLEN];
+ int rv;
+ char bcast_addr_eth[INET6_ADDRSTRLEN + IFNAMSIZ];
+ TRACE_ENTER();
+
+ TRACE("DTM :dgram_port_rcvr :%d", dgram_port_);
+ snprintf(local_port_str, sizeof(local_port_str), "%d", (dgram_port_));
+
+ dgram_sock_rcvr = -1;
+ /* Construct the server address structure */
+ memset(&addr_criteria, 0, sizeof(addr_criteria)); // Zero out structure
+ addr_criteria.ai_family = AF_UNSPEC; // Any address family
+ addr_criteria.ai_flags = AI_PASSIVE; // Accept on any address/port
+ addr_criteria.ai_socktype = SOCK_DGRAM; // Only datagram socket
+ addr_criteria.ai_protocol = IPPROTO_UDP; // Only UDP socket
+ addr_criteria.ai_flags |= AI_NUMERICHOST;
+
+ TRACE("DTM :ip_addr : %s local_port_str :%s", stream_address_.c_str(),
+ local_port_str);
+ if (address_family_ == AF_INET) {
+ if ((rv = getaddrinfo(dgram_address_.c_str(), local_port_str,
+ &addr_criteria, &addr_list)) != 0) {
+ LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
+ strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+ } else if (address_family_ == AF_INET6) {
+ if (scope_link_) {
+ memset(bcast_addr_eth, 0, (INET6_ADDRSTRLEN + IFNAMSIZ));
+ sprintf(bcast_addr_eth, "%s%%%s", dgram_address_.c_str(),
+ ifname_.c_str());
+ if ((rv = getaddrinfo(bcast_addr_eth, local_port_str, &addr_criteria,
+ &addr_list)) != 0) {
+ LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
+ strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+ } else {
+ if ((rv = getaddrinfo(dgram_address_.c_str(), local_port_str,
+ &addr_criteria, &addr_list)) != 0) {
+ LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
+ strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+ }
+ }
+
+ if (addr_list == nullptr) {
+ LOG_ER("DTM:Unable to get addr_list ");
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ /* results and bind to the first we can */
+ p = addr_list;
+ bool binded = false;
+ unsigned int ifindex;
+
+ for (; p; p = p->ai_next) {
+ TRACE("DTM :family : %d, socktype : %d, protocol :%d", p->ai_family,
+ p->ai_socktype, p->ai_protocol);
+ if (address_family_ != p->ai_family) {
+ continue;
+ }
+
+ if (p->ai_family == AF_INET) {
+ void *addr;
+ char ipstr[INET6_ADDRSTRLEN];
+ struct sockaddr_in *ipv4 =
+ reinterpret_cast<struct sockaddr_in *>(p->ai_addr);
+ addr = &(ipv4->sin_addr);
+ inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr));
+ if (strcasecmp(ipstr, dgram_address_.c_str()) != 0) {
+ continue;
+ } else
+ TRACE("DTM: DGRAM Socket binded to = %s\n", ipstr);
+ } else if (p->ai_family == AF_INET6) {
+ void *addr;
+ char ipstr[INET6_ADDRSTRLEN];
+ struct sockaddr_in6 *ipv6 =
+ reinterpret_cast<struct sockaddr_in6 *>(p->ai_addr);
+ addr = &(ipv6->sin6_addr);
+ inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr));
+ if (strcasecmp(ipstr, dgram_address_.c_str()) != 0) {
+ continue;
+ } else
+ TRACE("DTM: DGRAM Socket binded to = %s\n", ipstr);
+ }
+ if ((dgram_sock_rcvr =
+ socket(p->ai_family, p->ai_socktype | SOCK_NONBLOCK |
SOCK_CLOEXEC,
+ p->ai_protocol)) == -1) {
+ LOG_ER("DTM:Socket creation failed (socket()) err :%s", strerror(errno));
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ continue;
+ }
+
+ int smode = 1;
+ if ((setsockopt(dgram_sock_rcvr, SOL_SOCKET, SO_REUSEADDR, &smode,
+ sizeof(smode)) == -1)) {
+ LOG_ER("DTM : Error setsockpot: err :%s", strerror(errno));
+ freeaddrinfo(addr_list);
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+ if (p->ai_family == AF_INET6) {
+ struct sockaddr_in6 *ipv6 =
+ reinterpret_cast<struct sockaddr_in6 *>(p->ai_addr);
+ ifindex = if_nametoindex(ifname_.c_str());
+ ipv6->sin6_scope_id = ifindex;
+ if (setsockopt(dgram_sock_rcvr, IPPROTO_IPV6, IPV6_MULTICAST_IF,
&ifindex,
+ sizeof(ifindex)) < 0) {
+ LOG_ER("DTM :setsockopt(IPV6_MULTICAST_IF) failed err :%s",
+ strerror(errno));
+ freeaddrinfo(addr_list);
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+
+ struct ipv6_mreq maddr;
+ struct sockaddr_in6 *ipv6_mr =
+ reinterpret_cast<struct sockaddr_in6 *>(p->ai_addr);
+ memset(&maddr, 0, sizeof(maddr));
+ maddr.ipv6mr_multiaddr = ipv6_mr->sin6_addr;
+ maddr.ipv6mr_interface = if_nametoindex(ifname_.c_str());
+ if (setsockopt(dgram_sock_rcvr, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP,
&maddr,
+ sizeof(maddr)) < 0) {
+ LOG_ER("DTM :setsockopt(IPV6_ADD_MEMBERSHIP) failed err :%s",
+ strerror(errno));
+ freeaddrinfo(addr_list);
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ }
+ }
+ if (bind(dgram_sock_rcvr, p->ai_addr, p->ai_addrlen) == -1) {
+ LOG_ER("DTM:Socket bind failed err :%s", strerror(errno));
+ close(dgram_sock_rcvr);
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ perror("listener: bind");
+ freeaddrinfo(addr_list);
+ return NCSCC_RC_FAILURE;
+ } else {
+ binded = true;
+ break;
+ }
+ }
+
+ /* Free address structure(s) allocated by getaddrinfo() */
+ freeaddrinfo(addr_list);
+ if (binded != true) {
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
+ return NCSCC_RC_FAILURE;
+ } else {
+ TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
+ return NCSCC_RC_SUCCESS;
+ }
+}
diff --git a/src/dtm/dtmnd/Multicast.h b/src/dtm/dtmnd/Multicast.h
new file mode 100644
index 000000000..e3b90f1b6
--- /dev/null
+++ b/src/dtm/dtmnd/Multicast.h
@@ -0,0 +1,96 @@
+/* -*- OpenSAF -*-
+ *
+ * Copyright Ericsson AB 2017 - All Rights Reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ */
+
+#ifndef DTM_DTMND_MULTICAST_H_
+#define DTM_DTMND_MULTICAST_H_
+
+#include <netdb.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <cstddef>
+#include <cstdint>
+#include <string>
+
+// The Multicast class implements a mechanism to send the DTM node discovery
+// datagram message to all OpenSAF nodes on the network, using either
broadcast,
+// multicast or unicast.
+class Multicast {
+ public:
+ struct __attribute__((__packed__)) Message {
+ static constexpr size_t kInet6AddrStrlen = 48;
+ Message(uint16_t i_cluster_id, uint32_t i_node_id, bool i_use_multicast,
+ in_port_t i_stream_port, sa_family_t i_address_family,
+ const std::string& i_stream_address);
+ uint16_t message_size;
+ uint16_t cluster_id;
+ uint32_t node_id;
+ uint8_t use_multicast;
+ uint16_t stream_port;
+ uint8_t address_family;
+ char stream_address[kInet6AddrStrlen];
+ };
+
+ // Construct an instance of Multicast, using the supplied configuration
parameters.
+ Multicast(uint16_t cluster_id, uint32_t node_id, in_port_t stream_port,
+ in_port_t dgram_port, sa_family_t address_family,
+ const std::string& stream_address, const std::string&
dgram_address,
+ const std::string& multicast_address, const std::string& ifname,
+ bool scope_link);
+ ~Multicast();
+ // Send the DTM node discovery message to all OpenSAF nodes. Returns true if
+ // sending was successful, and false otherwise.
+ bool Send();
+ // Receive in non-blocking mode a DTM node discovery message sent by any
+ // OpenSAF node on the network (possibly sent by ourselves). Returns the size
+ // of the received message, or -1 in case of an error or if no message is
+ // available. The parameters, the return value, and the error reporting in
+ // errno are similar to the recv() libc function, except that this method
will
+ // never fail due to EINTR.
+ ssize_t Receive(void* buffer, size_t buffer_len);
+ // Returns the file descriptor used to receive messages. The intended use is
+ // to include the returned file descriptor in a call to poll() or
+ // epoll_wait(), so that you can suspend execution of the calling thread
until
+ // a new incoming message can be received by calling the Receive() method. Do
+ // not use the returned file descriptor for any other purpose!
+ int fd() { return dgram_sock_rcvr; }
+
+ private:
+ uint32_t dtm_dgram_bcast_sender();
+ uint32_t dgram_enable_bcast(int sock_desc);
+ uint32_t dtm_dgram_mcast_sender(int mcast_ttl);
+ uint32_t dgram_set_mcast_ttl(int mcast_ttl, int family);
+ uint32_t dgram_join_mcast_group(struct addrinfo* mcast_receiver_addr);
+ uint32_t dtm_dgram_mcast_listener();
+ uint32_t dtm_dgram_bcast_listener();
+
+ uint16_t cluster_id_;
+ uint32_t node_id_;
+ in_port_t stream_port_;
+ in_port_t dgram_port_;
+ sa_family_t address_family_;
+ std::string stream_address_;
+ std::string dgram_address_;
+ std::string multicast_address_;
+ std::string ifname_;
+ bool scope_link_;
+
+ socklen_t dest_addr_size_; // Holder for bcast_dest_address size ip v4 or v6
+ // address
+ int dgram_sock_sndr;
+ int dgram_sock_rcvr;
+ struct sockaddr_storage dest_addr_;
+};
+
+#endif // DTM_DTMND_MULTICAST_H_
diff --git a/src/dtm/dtmnd/dtm.h b/src/dtm/dtmnd/dtm.h
index 2faaa731b..d710f3adf 100644
--- a/src/dtm/dtmnd/dtm.h
+++ b/src/dtm/dtmnd/dtm.h
@@ -20,6 +20,7 @@
#define DTM_DTMND_DTM_H_
#include <netinet/in.h>
+#include <sys/socket.h>
#include <cstdint>
#include "dtm/dtmnd/dtm_cb.h"
#include "mds/mds_papi.h"
@@ -64,7 +65,7 @@ typedef struct dtm_rcv_msg_elem {
char node_name[255];
NODE_ID node_id;
SYSF_MBX mbx;
- DTM_IP_ADDR_TYPE i_addr_family; /* Indicates V4 or V6 */
+ sa_family_t i_addr_family; /* Indicates V4 or V6 */
char node_ip[INET6_ADDRSTRLEN];
} node;
diff --git a/src/dtm/dtmnd/dtm_cb.h b/src/dtm/dtmnd/dtm_cb.h
index 784afff66..a78249919 100644
--- a/src/dtm/dtmnd/dtm_cb.h
+++ b/src/dtm/dtmnd/dtm_cb.h
@@ -19,23 +19,21 @@
#ifndef DTM_DTMND_DTM_CB_H_
#define DTM_DTMND_DTM_CB_H_
-#include <netinet/in.h>
#include <net/if.h>
+#include <netinet/in.h>
#include <poll.h>
+#include <sys/socket.h>
#include <cstdint>
+#include <string>
#include "mds/mds_papi.h"
+#include "base/macros.h"
#include "base/ncssysf_lck.h"
#include "base/ncspatricia.h"
#include "base/ncssysf_ipc.h"
-#define MAX_PORT_LENGTH 256
+class Multicast;
-typedef enum dtm_ip_addr_type {
- DTM_IP_ADDR_TYPE_NONE,
- DTM_IP_ADDR_TYPE_IPV4 = AF_INET,
- DTM_IP_ADDR_TYPE_IPV6 = AF_INET6,
- DTM_IP_ADDR_TYPE_MAX /* Must be last. */
-} DTM_IP_ADDR_TYPE;
+#define MAX_PORT_LENGTH 256
typedef struct dtm_internode_unsent_msgs {
struct dtm_internode_unsent_msgs *next;
@@ -49,7 +47,7 @@ typedef struct node_list {
NODE_ID node_id;
char node_name[256];
char node_ip[INET6_ADDRSTRLEN];
- DTM_IP_ADDR_TYPE i_addr_family; /* Indicates V4 or V6 */
+ sa_family_t i_addr_family; /* Indicates V4 or V6 */
int comm_socket;
NCS_PATRICIA_NODE pat_nodeid;
NCS_PATRICIA_NODE pat_ip_address;
@@ -66,41 +64,45 @@ typedef struct node_list {
} DTM_NODE_DB;
/* control block */
-typedef struct dtm_internode_cb {
+class DTM_INTERNODE_CB {
+ public:
+ DTM_INTERNODE_CB();
+ ~DTM_INTERNODE_CB();
+ bool mcast_flag() { return !mcast_addr.empty(); }
+ Multicast *multicast_;
uint16_t cluster_id;
- NODE_ID node_id; /* Self Node Id */
- char node_name[_POSIX_HOST_NAME_MAX]; /* optional */
- char ip_addr[INET6_ADDRSTRLEN]; /* ipv4 ipv6 addrBuffer */
- char mcast_addr[INET6_ADDRSTRLEN]; /* ipv4 ipv6 addrBuffer */
- char bcast_addr[INET6_ADDRSTRLEN];
- char ifname[IFNAMSIZ]; /* ipv6mr_interface to */
+ NODE_ID node_id; // Self Node Id
+ char node_name[_POSIX_HOST_NAME_MAX]; // optional
+ std::string ip_addr; // ipv4 ipv6 addrBuffer
+ std::string mcast_addr; // ipv4 ipv6 addrBuffer
+ std::string bcast_addr;
+ std::string ifname; // ipv6mr_interface to
bool scope_link;
in_port_t stream_port;
in_port_t dgram_port_sndr;
in_port_t dgram_port_rcvr;
- int stream_sock; /* */
- int dgram_sock_sndr; /* */
- int dgram_sock_rcvr; /* */
- DTM_IP_ADDR_TYPE i_addr_family; /* Indicates V4 or V6 */
- bool mcast_flag; /* Indicates mcast */
+ int stream_sock;
+ sa_family_t i_addr_family; // Indicates V4 or V6
int32_t initial_dis_timeout;
int32_t cont_bcast_int;
int64_t bcast_msg_freq;
- NCS_PATRICIA_TREE nodeid_tree; /* NODE_DB information of Nodes */
- NCS_PATRICIA_TREE ip_addr_tree; /* NODE_DB information of Nodes */
+ NCS_PATRICIA_TREE nodeid_tree; // NODE_DB information of Nodes
+ NCS_PATRICIA_TREE ip_addr_tree; // NODE_DB information of Nodes
int so_keepalive;
NCS_LOCK cb_lock;
int comm_keepidle_time;
int comm_keepalive_intvl;
int comm_keepalive_probes;
unsigned int
- comm_user_timeout; // tcp socket user timeout in milliseconds [ms]
- int32_t sock_sndbuf_size; /* The value of SO_SNDBUF */
- int32_t sock_rcvbuf_size; /* The value of SO_RCVBUF */
+ comm_user_timeout; // tcp socket user timeout in milliseconds [ms]
+ int32_t sock_sndbuf_size; // The value of SO_SNDBUF
+ int32_t sock_rcvbuf_size; // The value of SO_RCVBUF
SYSF_MBX mbx;
int mbx_fd;
int epoll_fd;
-} DTM_INTERNODE_CB;
+
+ DELETE_COPY_AND_MOVE_OPERATORS(DTM_INTERNODE_CB);
+};
/*extern DTM_INTERNODE_CB *dtms_gl_cb; */
diff --git a/src/dtm/dtmnd/dtm_inter.h b/src/dtm/dtmnd/dtm_inter.h
index 1532eb5cf..8c0a4b2aa 100644
--- a/src/dtm/dtmnd/dtm_inter.h
+++ b/src/dtm/dtmnd/dtm_inter.h
@@ -19,6 +19,7 @@
#ifndef DTM_DTMND_DTM_INTER_H_
#define DTM_DTMND_DTM_INTER_H_
+#include <sys/socket.h>
#include <cstdint>
#include "base/ncssysf_ipc.h"
#include "dtm/dtmnd/dtm_cb.h"
@@ -37,7 +38,7 @@ typedef enum dtm_msg_types {
} DTM_MSG_TYPES;
extern uint32_t dtm_node_up(NODE_ID node_id, char *node_name, char *node_ip,
- DTM_IP_ADDR_TYPE i_addr_family, SYSF_MBX mbx);
+ sa_family_t i_addr_family, SYSF_MBX mbx);
extern uint32_t dtm_internode_process_rcv_up_msg(uint8_t *buffer, uint16_t len,
NODE_ID node_id);
extern uint32_t dtm_internode_process_rcv_down_msg(uint8_t *buffer,
diff --git a/src/dtm/dtmnd/dtm_inter_svc.cc b/src/dtm/dtmnd/dtm_inter_svc.cc
index 1b272b394..270c98817 100644
--- a/src/dtm/dtmnd/dtm_inter_svc.cc
+++ b/src/dtm/dtmnd/dtm_inter_svc.cc
@@ -15,6 +15,7 @@
*
*/
+#include <sys/socket.h>
#include <cstdlib>
#include "base/ncsencdec_pub.h"
#include "base/ncssysf_ipc.h"
@@ -118,7 +119,7 @@ uint32_t dtm_internode_process_rcv_down_msg(uint8_t
*buffer, uint16_t len,
*
*/
uint32_t dtm_node_up(NODE_ID node_id, char *node_name, char *node_ip,
- DTM_IP_ADDR_TYPE i_addr_family, SYSF_MBX mbx) {
+ sa_family_t i_addr_family, SYSF_MBX mbx) {
/* Function call from inter thread */
/* Post the event to the mailbox of the intra_thread */
DTM_RCV_MSG_ELEM *dtm_msg_elem = nullptr;
diff --git a/src/dtm/dtmnd/dtm_intra.cc b/src/dtm/dtmnd/dtm_intra.cc
index 9efa715ca..2b09359e8 100644
--- a/src/dtm/dtmnd/dtm_intra.cc
+++ b/src/dtm/dtmnd/dtm_intra.cc
@@ -58,8 +58,9 @@ static struct pollfd *pfd_list;
static int dtm_intranode_max_fd;
-static uint32_t dtm_intra_processing_init(char *node_name, char *node_ip,
- DTM_IP_ADDR_TYPE i_addr_family,
+static uint32_t dtm_intra_processing_init(const char *node_name,
+ const char *node_ip,
+ sa_family_t i_addr_family,
int32_t sndbuf_size,
int32_t rcvbuf_size);
static void dtm_intranode_processing(void *);
@@ -81,7 +82,7 @@ uint32_t dtm_socket_domain = AF_UNIX;
*/
uint32_t dtm_service_discovery_init(DTM_INTERNODE_CB *dtms_cb) {
return dtm_intra_processing_init(
- dtms_cb->node_name, dtms_cb->ip_addr, dtms_cb->i_addr_family,
+ dtms_cb->node_name, dtms_cb->ip_addr.c_str(), dtms_cb->i_addr_family,
dtms_cb->sock_sndbuf_size, dtms_cb->sock_rcvbuf_size);
}
@@ -93,8 +94,8 @@ uint32_t dtm_service_discovery_init(DTM_INTERNODE_CB
*dtms_cb) {
* @return NCSCC_RC_FAILURE
*
*/
-uint32_t dtm_intra_processing_init(char *node_name, char *node_ip,
- DTM_IP_ADDR_TYPE i_addr_family,
+uint32_t dtm_intra_processing_init(const char *node_name, const char *node_ip,
+ sa_family_t i_addr_family,
int32_t sndbuf_size, int32_t rcvbuf_size) {
struct sockaddr_un serv_addr; /* For Unix Sock address */
NCS_PATRICIA_PARAMS pat_tree_params;
diff --git a/src/dtm/dtmnd/dtm_intra.h b/src/dtm/dtmnd/dtm_intra.h
index 3489a19e3..9c9acda83 100644
--- a/src/dtm/dtmnd/dtm_intra.h
+++ b/src/dtm/dtmnd/dtm_intra.h
@@ -19,6 +19,7 @@
#define DTM_DTMND_DTM_INTRA_H_
#include <netinet/tcp.h>
+#include <sys/socket.h>
#include <cstdint>
#include "dtm/dtmnd/dtm_cb.h"
#include "mds/mds_papi.h"
@@ -48,8 +49,8 @@ typedef enum dtm_lib_types {
} DTM_LIB_TYPES;
extern uint32_t dtm_intranode_add_self_node_to_node_db(
- NODE_ID node_id, char *node_name, char *node_ip,
- DTM_IP_ADDR_TYPE i_addr_family);
+ NODE_ID node_id, const char *node_name, const char *node_ip,
+ sa_family_t i_addr_family);
uint32_t dtm_intranode_reset_poll_fdlist(int fd);
#endif // DTM_DTMND_DTM_INTRA_H_
diff --git a/src/dtm/dtmnd/dtm_intra_disc.h b/src/dtm/dtmnd/dtm_intra_disc.h
index 4e4de338d..748f3b22f 100644
--- a/src/dtm/dtmnd/dtm_intra_disc.h
+++ b/src/dtm/dtmnd/dtm_intra_disc.h
@@ -18,6 +18,7 @@
#define DTM_DTMND_DTM_INTRA_DISC_H_
#include <limits.h>
+#include <sys/socket.h>
#include <cstdint>
#include "base/ncspatricia.h"
#include "base/ncssysf_ipc.h"
@@ -73,7 +74,7 @@ typedef DTM_LIB_UP_MSG DTM_LIB_DOWN_MSG;
typedef struct dtm_lib_node_up_msg {
NODE_ID node_id;
uint64_t ref_val;
- DTM_IP_ADDR_TYPE i_addr_family; /* Indicates V4 or V6 */
+ sa_family_t i_addr_family; /* Indicates V4 or V6 */
char node_ip[INET6_ADDRSTRLEN];
char node_name[_POSIX_HOST_NAME_MAX];
} DTM_LIB_NODE_UP_MSG;
@@ -128,7 +129,7 @@ typedef struct dtm_intranode_node_db {
char node_name[_POSIX_HOST_NAME_MAX];
SYSF_MBX mbx;
int fd;
- DTM_IP_ADDR_TYPE i_addr_family;
+ sa_family_t i_addr_family;
char node_ip[INET6_ADDRSTRLEN];
NCS_PATRICIA_TREE dtm_rem_node_svc_tree; /* Tree of service install info */
} DTM_INTRANODE_NODE_DB;
@@ -191,8 +192,7 @@ uint32_t dtm_process_internode_service_up_msg(uint8_t
*buffer, uint16_t len,
uint32_t dtm_process_internode_service_down_msg(uint8_t *buffer, uint16_t len,
NODE_ID node_id);
uint32_t dtm_intranode_process_node_up(NODE_ID node_id, char *node_name,
- char *node_ip,
- DTM_IP_ADDR_TYPE i_addr_family,
+ char *node_ip, sa_family_t
i_addr_family,
SYSF_MBX mbx);
uint32_t dtm_intranode_process_node_down(NODE_ID node_id);
diff --git a/src/dtm/dtmnd/dtm_intra_svc.cc b/src/dtm/dtmnd/dtm_intra_svc.cc
index 2006408c0..1affd65d3 100644
--- a/src/dtm/dtmnd/dtm_intra_svc.cc
+++ b/src/dtm/dtmnd/dtm_intra_svc.cc
@@ -1484,8 +1484,7 @@ static uint32_t
dtm_lib_prepare_node_down_msg(DTM_LIB_NODE_DOWN_MSG *up_msg,
*********************************************************/
uint32_t dtm_intranode_process_node_up(NODE_ID node_id, char *node_name,
- char *node_ip,
- DTM_IP_ADDR_TYPE i_addr_family,
+ char *node_ip, sa_family_t
i_addr_family,
SYSF_MBX mbx) {
/* Add to the node db list */
DTM_INTRANODE_NODE_DB *node_db_info = nullptr;
@@ -2010,9 +2009,10 @@ uint32_t dtm_process_internode_service_down_msg(uint8_t
*buffer, uint16_t len,
2 - NCSCC_RC_FAILURE
*********************************************************/
-uint32_t dtm_intranode_add_self_node_to_node_db(
- NODE_ID node_id, char *node_name, char *node_ip,
- DTM_IP_ADDR_TYPE i_addr_family) {
+uint32_t dtm_intranode_add_self_node_to_node_db(NODE_ID node_id,
+ const char *node_name,
+ const char *node_ip,
+ sa_family_t i_addr_family) {
/* Add to the node db list */
DTM_INTRANODE_NODE_DB *node_db_info = nullptr;
TRACE_ENTER();
diff --git a/src/dtm/dtmnd/dtm_main.cc b/src/dtm/dtmnd/dtm_main.cc
index ad7c68ef5..8dd18209c 100644
--- a/src/dtm/dtmnd/dtm_main.cc
+++ b/src/dtm/dtmnd/dtm_main.cc
@@ -28,6 +28,8 @@
#include "base/ncs_main_papi.h"
#include "base/ncsencdec_pub.h"
#include "base/osaf_poll.h"
+#include "base/time.h"
+#include "dtm/dtmnd/Multicast.h"
#include "dtm/dtmnd/dtm.h"
#include "dtm/dtmnd/dtm_node.h"
#include "nid/agent/nid_api.h"
@@ -44,9 +46,6 @@
*/
#define DTM_CONFIG_FILE PKGSYSCONFDIR "/dtmd.conf"
-/* pack_size + cluster_id + node_id + mcast_flag + stream_port +
i_addr_family
- * + ip_addr */
-#define DTM_BCAST_HDR_SIZE 58
/* ========================================================================
* DATA DECLARATIONS
@@ -56,8 +55,7 @@
NCSCONTEXT gl_node_dis_task_hdl = nullptr;
NCSCONTEXT gl_serv_dis_task_hdl = nullptr;
-static DTM_INTERNODE_CB _dtms_cb;
-DTM_INTERNODE_CB *dtms_gl_cb = &_dtms_cb;
+DTM_INTERNODE_CB *dtms_gl_cb = nullptr;
bool initial_discovery_phase = true;
@@ -66,6 +64,40 @@ bool initial_discovery_phase = true;
* ========================================================================
*/
+DTM_INTERNODE_CB::DTM_INTERNODE_CB()
+ : multicast_{},
+ cluster_id{},
+ node_id{},
+ node_name{},
+ ip_addr{},
+ mcast_addr{},
+ bcast_addr{},
+ ifname{},
+ scope_link{},
+ stream_port{},
+ dgram_port_sndr{},
+ dgram_port_rcvr{},
+ stream_sock{},
+ i_addr_family{},
+ initial_dis_timeout{},
+ cont_bcast_int{},
+ bcast_msg_freq{},
+ nodeid_tree{},
+ ip_addr_tree{},
+ so_keepalive{},
+ cb_lock{},
+ comm_keepidle_time{},
+ comm_keepalive_intvl{},
+ comm_keepalive_probes{},
+ comm_user_timeout{},
+ sock_sndbuf_size{},
+ sock_rcvbuf_size{},
+ mbx{},
+ mbx_fd{},
+ epoll_fd{} {}
+
+DTM_INTERNODE_CB::~DTM_INTERNODE_CB() { delete multicast_; }
+
/**
* Function to init the dtm process
*
@@ -79,7 +111,6 @@ static uint32_t dtm_init(DTM_INTERNODE_CB *dtms_cb) {
uint32_t rc = NCSCC_RC_SUCCESS;
TRACE_ENTER();
- memset(dtms_cb, 0, sizeof(DTM_INTERNODE_CB));
if (ncs_leap_startup() != NCSCC_RC_SUCCESS) {
LOG_ER("DTM: LEAP svcs startup failed \n");
@@ -100,27 +131,6 @@ done:
return rc;
}
-static uint32_t dtm_construct_bcast_hdr(DTM_INTERNODE_CB *dtms_cb,
- uint8_t *buf_ptr, int *pack_size) {
- TRACE_ENTER();
-
- uint8_t *data = buf_ptr;
-
- *pack_size = DTM_BCAST_HDR_SIZE;
-
- ncs_encode_16bit(&data, *pack_size);
- ncs_encode_16bit(&data, dtms_cb->cluster_id);
- ncs_encode_32bit(&data, dtms_cb->node_id);
- ncs_encode_8bit(&data, dtms_cb->mcast_flag ? 1 : 0);
- ncs_encode_16bit(&data, dtms_cb->stream_port);
- ncs_encode_8bit(&data, static_cast<uint8_t>(dtms_cb->i_addr_family));
- memcpy(data, dtms_cb->ip_addr, INET6_ADDRSTRLEN);
-
- TRACE_LEAVE();
-
- return NCSCC_RC_SUCCESS;
-}
-
/**
* Function to destroy node discovery thread
*
@@ -222,29 +232,6 @@ err:
return rc;
}
-static uint32_t dtm_send_bcast_mcast(DTM_INTERNODE_CB *dtms_cb,
- void *send_bcast_buffer,
- size_t bcast_buf_len) {
- uint32_t rc;
-
- TRACE_ENTER();
-
- if (dtms_cb->mcast_flag == true) {
- rc = dtm_dgram_sendto_mcast(dtms_cb, send_bcast_buffer, bcast_buf_len);
- if (NCSCC_RC_SUCCESS != rc) {
- LOG_ER("DTM: dtm_dgram_sendto_mcast Failed rc : %d \n", rc);
- }
- } else {
- rc = dtm_dgram_sendto_bcast(dtms_cb, send_bcast_buffer, bcast_buf_len);
- if (NCSCC_RC_SUCCESS != rc) {
- LOG_ER("DTM: dtm_dgram_sendto_bcast Failed rc : %d \n", rc);
- }
- }
-
- TRACE_LEAVE();
- return rc;
-}
-
/**
* DTM process main function
*
@@ -255,23 +242,21 @@ static uint32_t dtm_send_bcast_mcast(DTM_INTERNODE_CB
*dtms_cb,
*/
int main(int argc, char *argv[]) {
int rc = -1;
- uint8_t send_bcast_buffer[255];
- int bcast_buf_len = 0;
long int dis_time_out_usec = 0;
int64_t dis_elapsed_time_usec = 0;
- DTM_INTERNODE_CB *dtms_cb = dtms_gl_cb;
TRACE_ENTER();
- memset(send_bcast_buffer, 0, 255);
-
daemonize(argc, argv);
/*************************************************************/
/* Set up CB stuff */
/*************************************************************/
- if (dtm_init(dtms_cb) != NCSCC_RC_SUCCESS) {
+ dtms_gl_cb = new DTM_INTERNODE_CB;
+ DTM_INTERNODE_CB *dtms_cb = dtms_gl_cb;
+
+ if (dtms_cb == nullptr || dtm_init(dtms_cb) != NCSCC_RC_SUCCESS) {
LOG_ER("DTM: dtm_init failed");
goto done3;
}
@@ -286,42 +271,13 @@ int main(int argc, char *argv[]) {
/*************************************************************/
/* Set up the initial bcast or mcast sender socket */
/*************************************************************/
-
- if (dtms_cb->mcast_flag != true) {
- rc = dtm_dgram_bcast_sender(dtms_cb);
- if (NCSCC_RC_SUCCESS != rc) {
- LOG_ER("DTM:Set up the initial bcast sender socket failed rc : %d ",
- rc);
- goto done3;
- }
- } else {
- /*
- 0
- restricted to the same host
- 1
- restricted to the same subnet
- 32
- restricted to the same site
- 64
- restricted to the same region
- 128
- restricted to the same continent
- 255
- unrestricted
- */
- rc = dtm_dgram_mcast_sender(dtms_cb, 64); /*TODO */
- if (NCSCC_RC_SUCCESS != rc) {
- LOG_ER("DTM:Set up the initial mcast sender socket failed rc : %d ",
rc);
- goto done3;
- }
- }
-
- /*************************************************************/
- /* construct bcast or mcast hdr */
- /*************************************************************/
- rc = dtm_construct_bcast_hdr(dtms_cb, send_bcast_buffer, &bcast_buf_len);
- if (NCSCC_RC_SUCCESS != rc) {
- LOG_ER("DTM:construct bcast or mcast hdr failed rc : %d", rc);
+ dtms_cb->multicast_ = new Multicast{
+ dtms_cb->cluster_id, dtms_cb->node_id, dtms_cb->stream_port,
+ dtms_cb->dgram_port_rcvr, dtms_cb->i_addr_family, dtms_cb->ip_addr,
+ dtms_cb->bcast_addr, dtms_cb->mcast_addr, dtms_cb->ifname,
+ dtms_cb->scope_link};
+ if (dtms_cb->multicast_ == nullptr || dtms_cb->multicast_->fd() < 0) {
+ LOG_ER("Failed to initialize Multicast instance");
goto done3;
}
@@ -353,15 +309,11 @@ int main(int argc, char *argv[]) {
do {
/* Wait up to bcast_msg_freq seconds. */
/* Check if stdin has input. */
- if (osaf_poll_one_fd(dtms_cb->dgram_sock_sndr, dtms_cb->bcast_msg_freq) <
- 0) {
- LOG_ER("DTM: poll failed");
- goto done1;
- }
+ base::Sleep(base::MillisToTimespec(dtms_cb->bcast_msg_freq));
/* Broadcast msg string in datagram to clients every 250 m
* seconds */
- dtm_send_bcast_mcast(dtms_cb, send_bcast_buffer, bcast_buf_len);
+ dtms_cb->multicast_->Send();
dis_elapsed_time_usec =
dis_elapsed_time_usec + (dtms_cb->bcast_msg_freq * 1000);
@@ -375,7 +327,7 @@ int main(int argc, char *argv[]) {
if (dtms_cb->cont_bcast_int) {
m_NCS_TASK_SLEEP(dtms_cb->cont_bcast_int);
/* periodically send a broadcast */
- dtm_send_bcast_mcast(dtms_cb, send_bcast_buffer, bcast_buf_len);
+ dtms_cb->multicast_->Send();
} else {
for (;;) pause();
}
@@ -395,6 +347,7 @@ done2:
}
done3:
+ delete dtms_cb;
TRACE_LEAVE();
(void)nid_notify("TRANSPORT", NCSCC_RC_FAILURE, nullptr);
exit(1);
diff --git a/src/dtm/dtmnd/dtm_node.cc b/src/dtm/dtmnd/dtm_node.cc
index 0188a963a..66f728c74 100644
--- a/src/dtm/dtmnd/dtm_node.cc
+++ b/src/dtm/dtmnd/dtm_node.cc
@@ -27,11 +27,11 @@
#include <cstdlib>
#include <cstring>
#include "base/ncsencdec_pub.h"
+#include "dtm/dtmnd/Multicast.h"
#include "dtm/dtmnd/dtm.h"
#include "dtm/dtmnd/dtm_inter.h"
#include "dtm/dtmnd/dtm_inter_disc.h"
#include "dtm/dtmnd/dtm_inter_trans.h"
-#include "dtm/dtmnd/dtm_socket.h"
#define DTM_INTERNODE_RECV_BUFFER_SIZE 1024
@@ -41,10 +41,10 @@
#define NODE_INFO_PKT_SIZE (NODE_INFO_HDR_SIZE + _POSIX_HOST_NAME_MAX)
-static void ReceiveBcastOrMcast(void);
+static void ReceiveBcastOrMcast();
static void AcceptTcpConnections(uint8_t *node_info_hrd,
int node_info_buffer_len);
-static void ReceiveFromMailbox(void);
+static void ReceiveFromMailbox();
static void AddNodeToEpoll(DTM_INTERNODE_CB *dtms_cb, DTM_NODE_DB *node);
static void RemoveNodeFromEpoll(DTM_INTERNODE_CB *dtms_cb, DTM_NODE_DB *node);
@@ -182,7 +182,7 @@ done:
*
*/
uint32_t dtm_process_node_up_down(NODE_ID node_id, char *node_name,
- char *node_ip, DTM_IP_ADDR_TYPE
i_addr_family,
+ char *node_ip, sa_family_t i_addr_family,
bool comm_status) {
if (comm_status == true) {
TRACE(
@@ -354,23 +354,6 @@ void node_discovery_process(void *arg) {
uint8_t node_info_hrd[NODE_INFO_PKT_SIZE];
/*************************************************************/
- /* Set up the initial bcast or mcast receiver socket */
- /*************************************************************/
-
- if (dtms_cb->mcast_flag != true) {
- if (NCSCC_RC_SUCCESS != dtm_dgram_bcast_listener(dtms_cb)) {
- LOG_ER("DTM:Set up the initial bcast receiver socket failed");
- exit(EXIT_FAILURE);
- }
-
- } else {
- if (NCSCC_RC_SUCCESS != dtm_dgram_mcast_listener(dtms_cb)) {
- LOG_ER("DTM:Set up the initial mcast receiver socket failed");
- exit(EXIT_FAILURE);
- }
- }
-
- /*************************************************************/
/* Set up the initial listening socket */
/*************************************************************/
if (NCSCC_RC_SUCCESS != dtm_stream_nonblocking_listener(dtms_cb)) {
@@ -378,7 +361,7 @@ void node_discovery_process(void *arg) {
exit(EXIT_FAILURE);
}
- dgram_sock_rcvr.comm_socket = dtms_cb->dgram_sock_rcvr;
+ dgram_sock_rcvr.comm_socket = dtms_cb->multicast_->fd();
stream_sock.comm_socket = dtms_cb->stream_sock;
mbx_fd.comm_socket = dtms_cb->mbx_fd;
AddNodeToEpoll(dtms_cb, &dgram_sock_rcvr);
@@ -485,12 +468,12 @@ done:
return;
}
-static void ReceiveBcastOrMcast(void) {
+static void ReceiveBcastOrMcast() {
DTM_INTERNODE_CB *dtms_cb = dtms_gl_cb;
uint8_t inbuf[DTM_INTERNODE_RECV_BUFFER_SIZE];
ssize_t recd_bytes;
do {
- recd_bytes = dtm_dgram_recv_bmcast(dtms_cb, inbuf, sizeof(inbuf));
+ recd_bytes = dtms_cb->multicast_->Receive(inbuf, sizeof(inbuf));
if (recd_bytes >= static_cast<ssize_t>(sizeof(uint16_t))) {
uint8_t *data1 = inbuf;
uint16_t recd_buf_len = ncs_decode_16bit(&data1);
@@ -534,7 +517,7 @@ static void AcceptTcpConnections(uint8_t *node_info_hrd,
}
}
-static void ReceiveFromMailbox(void) {
+static void ReceiveFromMailbox() {
DTM_INTERNODE_CB *dtms_cb = dtms_gl_cb;
DTM_SND_MSG_ELEM *msg_elem;
while ((msg_elem = reinterpret_cast<DTM_SND_MSG_ELEM *>(
diff --git a/src/dtm/dtmnd/dtm_node.h b/src/dtm/dtmnd/dtm_node.h
index bbac35661..82435cc11 100644
--- a/src/dtm/dtmnd/dtm_node.h
+++ b/src/dtm/dtmnd/dtm_node.h
@@ -19,6 +19,7 @@
#ifndef DTM_DTMND_DTM_NODE_H_
#define DTM_DTMND_DTM_NODE_H_
+#include <sys/socket.h>
#include <cstddef>
#include <cstdint>
#include "dtm/dtmnd/dtm_cb.h"
@@ -26,28 +27,17 @@
extern char *dtm_validate_listening_ip_addr(DTM_INTERNODE_CB *config);
extern uint32_t dtm_stream_nonblocking_listener(DTM_INTERNODE_CB *dtms_cb);
-extern uint32_t dtm_dgram_mcast_listener(DTM_INTERNODE_CB *dtms_cb);
-extern uint32_t dtm_dgram_mcast_sender(DTM_INTERNODE_CB *dtms_cb,
- int mcast_ttl);
-extern uint32_t dtm_dgram_bcast_listener(DTM_INTERNODE_CB *dtms_cb);
-extern uint32_t dtm_dgram_bcast_sender(DTM_INTERNODE_CB *dtms_cb);
-extern uint32_t dtm_dgram_sendto_bcast(DTM_INTERNODE_CB *dtms_cb,
- const void *buffer, int buffer_len);
-extern uint32_t dtm_dgram_sendto_mcast(DTM_INTERNODE_CB *dtms_cb,
- const void *buffer, int buffer_len);
extern uint32_t dtm_sockdesc_close(int sock_desc);
extern DTM_NODE_DB *dtm_process_connect(DTM_INTERNODE_CB *dtms_cb,
uint8_t *buffer, uint16_t len);
extern DTM_NODE_DB *dtm_process_accept(DTM_INTERNODE_CB *dtms_cb,
int stream_sock);
-extern ssize_t dtm_dgram_recv_bmcast(DTM_INTERNODE_CB *dtms_cb, void *buffer,
- int buffer_len);
extern uint32_t dtm_comm_socket_send(int sock_desc, const void *buffer,
int buffer_len);
extern void dtm_comm_socket_close(DTM_NODE_DB *node);
extern uint32_t dtm_process_node_up_down(NODE_ID node_id, char *node_name,
char *node_ip,
- DTM_IP_ADDR_TYPE i_addr_family,
+ sa_family_t i_addr_family,
bool comm_status);
extern void dtm_internode_set_pollout(DTM_NODE_DB *node);
extern void dtm_internode_clear_pollout(DTM_NODE_DB *node);
diff --git a/src/dtm/dtmnd/dtm_node_sockets.cc
b/src/dtm/dtmnd/dtm_node_sockets.cc
index 5bfcd2821..59cf12a0d 100644
--- a/src/dtm/dtmnd/dtm_node_sockets.cc
+++ b/src/dtm/dtmnd/dtm_node_sockets.cc
@@ -27,7 +27,6 @@
#include "base/usrbuf.h"
#include "dtm/dtmnd/dtm.h"
#include "dtm/dtmnd/dtm_node.h"
-#include "dtm/dtmnd/dtm_socket.h"
#ifndef TCP_USER_TIMEOUT
#define TCP_USER_TIMEOUT 18
@@ -36,15 +35,6 @@
#define MYPORT "6900"
#define MAXBUFLEN 100
-struct addrinfo *mcast_sender_addr; /* Holder for mcast_sender_addr address */
-
-struct sockaddr_storage bcast_dest_storage;
-struct sockaddr *bcast_dest_address =
- reinterpret_cast<struct sockaddr *>(&bcast_dest_storage);
-
-size_t bcast_sen_addr_size; /* Holder for bcast_dest_address size ip v4 or v6
- address */
-
/**
* Close the socketr descriptors
*
@@ -151,207 +141,6 @@ static uint32_t set_keepalive(DTM_INTERNODE_CB *dtms_cb,
int sock_desc) {
}
/**
- * Enable the dgram bcast
- *
- * @param sock_desc
- *
- * @return NCSCC_RC_SUCCESS
- * @return NCSCC_RC_FAILURE
- *
- */
-static uint32_t dgram_enable_bcast(int sock_desc) {
- TRACE_ENTER();
- /* If this fails, we'll hear about it when we try to send. This will
- * allow */
- /* system that cannot bcast to continue if they don't plan to bcast */
- int bcast_permission = 1;
- if (setsockopt(sock_desc, SOL_SOCKET, SO_BROADCAST, &bcast_permission,
- sizeof(bcast_permission)) < 0) {
- LOG_ER("DTM :setsockopt(SO_BROADCAST) failed err :%s ", strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
- return NCSCC_RC_SUCCESS;
-}
-
-/**
- * Join the mcast group
- *
- * @param dtms_cb mcast_receiver_addr
- *
- * @return NCSCC_RC_SUCCESS
- * @return NCSCC_RC_FAILURE
- *
- */
-static uint32_t dgram_join_mcast_group(DTM_INTERNODE_CB *dtms_cb,
- struct addrinfo *mcast_receiver_addr) {
- TRACE_ENTER();
-
- /* we need some address-family-specific pieces */
- if (mcast_receiver_addr->ai_family == AF_INET6) {
- /* Now join the mcast "group" (address) */
- struct ipv6_mreq join_request;
- memcpy(
- &join_request.ipv6mr_multiaddr,
- &(reinterpret_cast<struct sockaddr_in6
*>(mcast_receiver_addr->ai_addr))
- ->sin6_addr,
- sizeof(struct in6_addr));
- join_request.ipv6mr_interface = if_nametoindex(dtms_cb->ifname);
- TRACE("DTM :Joining IPv6 mcast group...");
- if (setsockopt(dtms_cb->dgram_sock_rcvr, IPPROTO_IPV6, IPV6_JOIN_GROUP,
- &join_request, sizeof(join_request)) < 0) {
- LOG_ER("DTM :setsockopt(IPV6_JOIN_GROUP) failed err :%s",
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
- } else if (mcast_receiver_addr->ai_family == AF_INET) {
- /* Now join the mcast "group" */
- struct ip_mreq join_request;
- memset(&join_request, 0, sizeof(join_request));
- join_request.imr_multiaddr =
- reinterpret_cast<struct sockaddr_in *>(mcast_receiver_addr->ai_addr)
- ->sin_addr;
- join_request.imr_interface.s_addr = inet_addr(dtms_cb->ip_addr);
- TRACE("DTM :Joining IPv4 mcast group...");
- if (setsockopt(dtms_cb->dgram_sock_rcvr, IPPROTO_IP, IP_ADD_MEMBERSHIP,
- &join_request, sizeof(join_request)) < 0) {
- LOG_ER("DTM :setsockopt(IP_ADD_MEMBERSHIP) failed err :%s ",
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- } else {
- LOG_ER("DTM: AF not supported :%d", mcast_receiver_addr->ai_family);
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
- return NCSCC_RC_SUCCESS;
-}
-
-/**
- * Send the dgram mcast message
- *
- * @param dtms_cb buffer buffer_len
- *
- * @return NCSCC_RC_SUCCESS
- * @return NCSCC_RC_FAILURE
- *
- */
-uint32_t dtm_dgram_sendto_mcast(DTM_INTERNODE_CB *dtms_cb, const void *buffer,
- int buffer_len) {
- TRACE_ENTER();
- /* Multicast the string to all who have joined the group */
- ssize_t num_bytes =
- sendto(dtms_cb->dgram_sock_sndr, buffer, buffer_len, 0,
- mcast_sender_addr->ai_addr, mcast_sender_addr->ai_addrlen);
- if (num_bytes < 0) {
- LOG_ER("DTM : sendto() failed err :%s ", strerror(errno));
- TRACE_LEAVE2("rc::%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- } else if (num_bytes != buffer_len) {
- LOG_ER("DTM :sendto() sent unexpected number of bytes err :%s ",
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
- return NCSCC_RC_SUCCESS;
-}
-
-/**
- * Bcast send function
- *
- * @param dtms_cb buffer buffer_len
- *
- * @return NCSCC_RC_SUCCESS
- * @return NCSCC_RC_FAILURE
- *
- */
-uint32_t dtm_dgram_sendto_bcast(DTM_INTERNODE_CB *dtms_cb, const void *buffer,
- int buffer_len) {
- TRACE_ENTER();
-
- /* Multicast the string to all who have joined the group */
- ssize_t num_bytes =
- sendto(dtms_cb->dgram_sock_sndr, buffer, buffer_len, 0,
- reinterpret_cast<struct sockaddr *>(bcast_dest_address),
- bcast_sen_addr_size);
- if (num_bytes < 0) {
- LOG_ER("DTM :sendto() failed err :%s", strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- } else if (num_bytes != buffer_len) {
- LOG_ER("DTM :sendto() sent unexpected number of bytes err :%s ",
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
- return NCSCC_RC_SUCCESS;
-}
-
-/**
- * Set the mcast ttl
- *
- * @param dtms_cb mcast_ttl
- *
- * @return NCSCC_RC_SUCCESS
- * @return NCSCC_RC_FAILURE
- *
- */
-static uint32_t dgram_set_mcast_ttl(DTM_INTERNODE_CB *dtms_cb, int mcast_ttl) {
- TRACE_ENTER();
- /* Set TTL of mcast packet. Unfortunately this requires */
- /* address-family-specific code */
- if (mcast_sender_addr->ai_family == AF_INET6) { // v6-specific
- /* The v6 mcast TTL socket option requires that the value be */
- /* passed in as an integer */
- if (setsockopt(dtms_cb->dgram_sock_sndr, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
- &mcast_ttl, sizeof(mcast_ttl)) < 0) {
- LOG_ER("DTM : setsockopt(IPV6_MULTICAST_HOPS) failed err :%s",
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
- unsigned int ifindex;
- ifindex = if_nametoindex(dtms_cb->ifname);
- if (setsockopt(dtms_cb->dgram_sock_sndr, IPPROTO_IPV6, IPV6_MULTICAST_IF,
- &ifindex, sizeof(ifindex)) < 0) {
- LOG_ER("DTM :setsockopt(IPV6_MULTICAST_IF) failed err :%s ifname :%d",
- strerror(errno), if_nametoindex(dtms_cb->ifname));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
- } else if (mcast_sender_addr->ai_family == AF_INET) { /* v4 specific */
- /* The v4 mcast TTL socket option requires that the value be */
- /* passed in an unsigned char */
- int mcTTL = mcast_ttl;
- if (setsockopt(dtms_cb->dgram_sock_sndr, IPPROTO_IP, IP_MULTICAST_TTL,
- &mcTTL, sizeof(mcTTL)) < 0) {
- LOG_ER("DTM :setsockopt(IP_MULTICAST_TTL) failed err :%s",
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
- } else {
- LOG_ER("DTM: AF not supported :%d", mcast_sender_addr->ai_family);
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
- return NCSCC_RC_SUCCESS;
-}
-
-/**
* Close the socket
*
* @param comm_socket
@@ -437,7 +226,7 @@ uint32_t dtm_comm_socket_send(int sock_desc, const void
*buffer,
*/
int comm_socket_setup_new(DTM_INTERNODE_CB *dtms_cb,
const char *foreign_address, in_port_t foreign_port,
- DTM_IP_ADDR_TYPE ip_addr_type) {
+ sa_family_t ip_addr_type) {
int sock_desc = -1, sndbuf_size = dtms_cb->sock_sndbuf_size,
rcvbuf_size = dtms_cb->sock_rcvbuf_size;
int err = 0, rv;
@@ -463,8 +252,8 @@ int comm_socket_setup_new(DTM_INTERNODE_CB *dtms_cb,
device index of the network device on it has to connecct */
if (dtms_cb->scope_link == true) {
memset(foreign_address_eth, 0, (INET6_ADDRSTRLEN + IFNAMSIZ));
- sprintf(foreign_address_eth, "%s%s%s", foreign_address, "%",
- dtms_cb->ifname);
+ sprintf(foreign_address_eth, "%s%%%s", foreign_address,
+ dtms_cb->ifname.c_str());
rv = getaddrinfo(foreign_address_eth, local_port_str, &addr_criteria,
&addr_list);
TRACE("DTM:foreign_address_eth : %s local_port_str :%s",
@@ -496,7 +285,7 @@ int comm_socket_setup_new(DTM_INTERNODE_CB *dtms_cb,
p->ai_socktype, p->ai_protocol);
/* Create socket for sending multicast datagrams */
if ((sock_desc = socket(p->ai_family, p->ai_socktype | SOCK_CLOEXEC,
- p->ai_protocol)) == SOCKET_ERROR()) {
+ p->ai_protocol)) == -1) {
LOG_ER("DTM:Socket creation failed (socket()) err :%s", strerror(errno));
goto done;
}
@@ -625,14 +414,15 @@ uint32_t dtm_stream_nonblocking_listener(DTM_INTERNODE_CB
*dtms_cb) {
if (dtms_cb->scope_link == true) {
char ip_addr_eth[INET6_ADDRSTRLEN + IFNAMSIZ];
memset(ip_addr_eth, 0, (INET6_ADDRSTRLEN + IFNAMSIZ));
- sprintf(ip_addr_eth, "%s%s%s", dtms_cb->ip_addr, "%", dtms_cb->ifname);
+ sprintf(ip_addr_eth, "%s%%%s", dtms_cb->ip_addr.c_str(),
+ dtms_cb->ifname.c_str());
rv = getaddrinfo(ip_addr_eth, local_port_str, &addr_criteria, &addr_list);
TRACE("DTM:foreign_address_eth : %s local_port_str :%s", ip_addr_eth,
local_port_str);
} else {
- rv = getaddrinfo(dtms_cb->ip_addr, local_port_str, &addr_criteria,
+ rv = getaddrinfo(dtms_cb->ip_addr.c_str(), local_port_str, &addr_criteria,
&addr_list);
- TRACE("DTM :ip_addr : %s local_port_str -%s", dtms_cb->ip_addr,
+ TRACE("DTM :ip_addr : %s local_port_str -%s", dtms_cb->ip_addr.c_str(),
local_port_str);
}
if (rv != 0) {
@@ -657,7 +447,7 @@ uint32_t dtm_stream_nonblocking_listener(DTM_INTERNODE_CB
*dtms_cb) {
/* Create socket for sending multicast datagrams */
if ((dtms_cb->stream_sock =
socket(p->ai_family, p->ai_socktype | SOCK_NONBLOCK | SOCK_CLOEXEC,
- p->ai_protocol)) == SOCKET_ERROR()) {
+ p->ai_protocol)) == -1) {
LOG_ER("DTM:Socket creation failed (socket()) err :%s", strerror(errno));
TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
return NCSCC_RC_FAILURE;
@@ -705,479 +495,6 @@ uint32_t dtm_stream_nonblocking_listener(DTM_INTERNODE_CB
*dtms_cb) {
}
/**
- * Function to listen to mcast message
- *
- * @param dtms_cb
- *
- * @return NCSCC_RC_SUCCESS
- * @return NCSCC_RC_FAILURE
- *
- */
-uint32_t dtm_dgram_mcast_listener(DTM_INTERNODE_CB *dtms_cb) {
- /* Construct the serv address structure */
- struct addrinfo addr_criteria, *p; /* Criteria for address match */
- char local_port_str[INET6_ADDRSTRLEN];
- int rv;
- struct addrinfo *addr_list; /* Holder serv address */
- TRACE_ENTER();
-
- TRACE("DTM :dgram_port_rcvr :%d", dtms_cb->dgram_port_rcvr);
- snprintf(local_port_str, sizeof(local_port_str), "%d",
- (dtms_cb->dgram_port_rcvr));
-
- dtms_cb->dgram_sock_rcvr = -1;
-
- memset(&addr_criteria, 0, sizeof(addr_criteria)); /* Zero out structure */
- addr_criteria.ai_family = AF_UNSPEC; /* v4 or v6 is OK */
- addr_criteria.ai_socktype = SOCK_DGRAM; /* Only datagram sockets */
- addr_criteria.ai_protocol = IPPROTO_UDP; /* Only UDP protocol */
- addr_criteria.ai_flags |= AI_NUMERICHOST; /* Don't try to resolve address */
-
- /* For link-local address, need to set sin6_scope_id to match the
- device index of the network device on it has to connecct */
- if (dtms_cb->scope_link == true) {
- char mcast_addr_eth[INET6_ADDRSTRLEN + IFNAMSIZ];
- memset(mcast_addr_eth, 0, (INET6_ADDRSTRLEN + IFNAMSIZ));
- sprintf(mcast_addr_eth, "%s%s%s", dtms_cb->mcast_addr, "%",
- dtms_cb->ifname);
- rv =
- getaddrinfo(mcast_addr_eth, local_port_str, &addr_criteria,
&addr_list);
- TRACE("DTM:mcast_addr_eth : %s local_port_str :%s", mcast_addr_eth,
- local_port_str);
- } else {
- rv = getaddrinfo(dtms_cb->mcast_addr, local_port_str, &addr_criteria,
- &addr_list);
- TRACE("DTM :mcast_addr : %s local_port_str :%s", dtms_cb->mcast_addr,
- local_port_str);
- }
- if (rv != 0) {
- LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- if (addr_list == nullptr) {
- LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- /* results and bind to the first we can */
- p = addr_list;
-
- TRACE("DTM :family : %d, socktype : %d, protocol :%d", p->ai_family,
- p->ai_socktype, p->ai_protocol);
- /* Create socket for sending multicast datagrams */
- if ((dtms_cb->dgram_sock_rcvr =
- socket(p->ai_family, p->ai_socktype | SOCK_NONBLOCK | SOCK_CLOEXEC,
- p->ai_protocol)) == SOCKET_ERROR()) {
- LOG_ER("DTM:Socket creation failed (socket()) err :%s", strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- if (dtms_cb->dgram_sock_rcvr == -1) {
- LOG_ER("DTM:Socket creation failed (socket())");
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- if (bind(dtms_cb->dgram_sock_rcvr, p->ai_addr, p->ai_addrlen) < 0) {
- LOG_ER("DTM : bind() failed err :%s ", strerror(errno));
- dtm_sockdesc_close(dtms_cb->dgram_sock_rcvr);
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- if (dgram_join_mcast_group(dtms_cb, p) != NCSCC_RC_SUCCESS) {
- LOG_ER("DTM : dgram_join_mcast_group() failed");
- dtm_sockdesc_close(dtms_cb->dgram_sock_rcvr);
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- /* Free address structure(s) allocated by getaddrinfo() */
- freeaddrinfo(addr_list);
- TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
- return NCSCC_RC_SUCCESS;
-}
-
-/**
- * Function to send the mcast message
- *
- * @param dtms_cb mcast_ttl
- *
- * @return NCSCC_RC_SUCCESS
- * @return NCSCC_RC_FAILURE
- *
- */
-uint32_t dtm_dgram_mcast_sender(DTM_INTERNODE_CB *dtms_cb, int mcast_ttl) {
- /* Construct the serv address structure */
- struct addrinfo addr_criteria, *p; // Criteria for address match
- char local_port_str[INET6_ADDRSTRLEN];
- int rv;
- TRACE_ENTER();
-
- dtms_cb->dgram_sock_sndr = -1;
-
- TRACE("DTM :dgram_port_rcvr :%d", dtms_cb->dgram_port_rcvr);
- snprintf(local_port_str, sizeof(local_port_str), "%d",
- (dtms_cb->dgram_port_rcvr));
-
- memset(&addr_criteria, 0, sizeof(addr_criteria)); /* Zero out structure */
- addr_criteria.ai_family = AF_UNSPEC; /* v4 or v6 is OK */
- addr_criteria.ai_socktype = SOCK_DGRAM; /* Only datagram sockets */
- addr_criteria.ai_protocol = IPPROTO_UDP; /* Only UDP please */
- addr_criteria.ai_flags |= AI_NUMERICHOST; /* Don't try to resolve address */
-
- /* For link-local address, need to set sin6_scope_id to match the
- device index of the network device on it has to connecct */
- if (dtms_cb->scope_link == true) {
- char mcast_addr_eth[INET6_ADDRSTRLEN + IFNAMSIZ];
- memset(mcast_addr_eth, 0, (INET6_ADDRSTRLEN + IFNAMSIZ));
- sprintf(mcast_addr_eth, "%s%s%s", dtms_cb->mcast_addr, "%",
- dtms_cb->ifname);
- rv = getaddrinfo(mcast_addr_eth, local_port_str, &addr_criteria,
- &mcast_sender_addr);
- TRACE("DTM :mcast_addr : %s local_port_str :%s", mcast_addr_eth,
- local_port_str);
- } else {
- rv = getaddrinfo(dtms_cb->mcast_addr, local_port_str, &addr_criteria,
- &mcast_sender_addr);
- TRACE("DTM :mcast_addr : %s local_port_str :%s", dtms_cb->mcast_addr,
- local_port_str);
- }
- if (rv != 0) {
- LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- if (mcast_sender_addr == nullptr) {
- LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- /* results and bind to the first we can */
- p = mcast_sender_addr;
-
- TRACE("DTM :family : %d, socktype : %d, protocol :%d", p->ai_family,
- p->ai_socktype, p->ai_protocol);
- /* Create socket for sending multicast datagrams */
- if ((dtms_cb->dgram_sock_sndr =
- socket(p->ai_family, p->ai_socktype | SOCK_NONBLOCK | SOCK_CLOEXEC,
- p->ai_protocol)) == SOCKET_ERROR()) {
- LOG_ER("DTM:Socket creation failed (socket()) err :%s", strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- if (dgram_set_mcast_ttl(dtms_cb, mcast_ttl) != NCSCC_RC_SUCCESS) {
- LOG_ER("DTM : dgram_set_mcast_ttl() failed");
- dtm_sockdesc_close(dtms_cb->dgram_sock_rcvr);
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- /* Free address structure(s) allocated by getaddrinfo() */
- /*freeaddrinfo(mcast_sender_addr); */
-
- TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
- return NCSCC_RC_SUCCESS;
-}
-
-/**
- * Function to listen to the bcast message
- *
- * @param dtms_cb
- *
- * @return NCSCC_RC_SUCCESS
- * @return NCSCC_RC_FAILURE
- *
- */
-uint32_t dtm_dgram_bcast_listener(DTM_INTERNODE_CB *dtms_cb) {
- struct addrinfo addr_criteria, *addr_list = nullptr,
- *p; // Criteria for address
- char local_port_str[INET6_ADDRSTRLEN];
- int rv;
- char bcast_addr_eth[INET6_ADDRSTRLEN + IFNAMSIZ];
- TRACE_ENTER();
-
- TRACE("DTM :dgram_port_rcvr :%d", dtms_cb->dgram_port_rcvr);
- snprintf(local_port_str, sizeof(local_port_str), "%d",
- (dtms_cb->dgram_port_rcvr));
-
- dtms_cb->dgram_sock_rcvr = -1;
- /* Construct the server address structure */
- memset(&addr_criteria, 0, sizeof(addr_criteria)); // Zero out structure
- addr_criteria.ai_family = AF_UNSPEC; // Any address family
- addr_criteria.ai_flags = AI_PASSIVE; // Accept on any address/port
- addr_criteria.ai_socktype = SOCK_DGRAM; // Only datagram socket
- addr_criteria.ai_protocol = IPPROTO_UDP; // Only UDP socket
- addr_criteria.ai_flags |= AI_NUMERICHOST;
-
- TRACE("DTM :ip_addr : %s local_port_str :%s", dtms_cb->ip_addr,
- local_port_str);
- if (dtms_cb->i_addr_family == DTM_IP_ADDR_TYPE_IPV4) {
- if ((rv = getaddrinfo(dtms_cb->bcast_addr, local_port_str, &addr_criteria,
- &addr_list)) != 0) {
- LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
- } else if (dtms_cb->i_addr_family == DTM_IP_ADDR_TYPE_IPV6) {
- if (dtms_cb->scope_link == true) {
- memset(bcast_addr_eth, 0, (INET6_ADDRSTRLEN + IFNAMSIZ));
- sprintf(bcast_addr_eth, "%s%s%s", dtms_cb->bcast_addr, "%",
- dtms_cb->ifname);
- if ((rv = getaddrinfo(bcast_addr_eth, local_port_str, &addr_criteria,
- &addr_list)) != 0) {
- LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
- } else {
- if ((rv = getaddrinfo(dtms_cb->bcast_addr, local_port_str,
&addr_criteria,
- &addr_list)) != 0) {
- LOG_ER("DTM:Unable to getaddrinfo() rtn_val :%d err :%s", rv,
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
- }
- }
-
- if (addr_list == nullptr) {
- LOG_ER("DTM:Unable to get addr_list ");
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- /* results and bind to the first we can */
- p = addr_list;
- bool binded = false;
- unsigned int ifindex;
-
- for (; p; p = p->ai_next) {
- TRACE("DTM :family : %d, socktype : %d, protocol :%d", p->ai_family,
- p->ai_socktype, p->ai_protocol);
- if (dtms_cb->i_addr_family != p->ai_family) {
- continue;
- }
-
- if (p->ai_family == AF_INET) {
- void *addr;
- char ipstr[INET6_ADDRSTRLEN];
- struct sockaddr_in *ipv4 =
- reinterpret_cast<struct sockaddr_in *>(p->ai_addr);
- addr = &(ipv4->sin_addr);
- inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
- if (strcasecmp(ipstr, dtms_cb->bcast_addr) != 0) {
- continue;
- } else
- TRACE("DTM: DGRAM Socket binded to = %s\n", ipstr);
- } else if (p->ai_family == AF_INET6) {
- void *addr;
- char ipstr[INET6_ADDRSTRLEN];
- struct sockaddr_in6 *ipv6 =
- reinterpret_cast<struct sockaddr_in6 *>(p->ai_addr);
- addr = &(ipv6->sin6_addr);
- inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
- if (strcasecmp(ipstr, dtms_cb->bcast_addr) != 0) {
- continue;
- } else
- TRACE("DTM: DGRAM Socket binded to = %s\n", ipstr);
- }
- if ((dtms_cb->dgram_sock_rcvr =
- socket(p->ai_family, p->ai_socktype | SOCK_NONBLOCK |
SOCK_CLOEXEC,
- p->ai_protocol)) == SOCKET_ERROR()) {
- LOG_ER("DTM:Socket creation failed (socket()) err :%s", strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- continue;
- }
-
- int smode = 1;
- if ((setsockopt(dtms_cb->dgram_sock_rcvr, SOL_SOCKET, SO_REUSEADDR, &smode,
- sizeof(smode)) == -1)) {
- LOG_ER("DTM : Error setsockpot: err :%s", strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
- if (p->ai_family == AF_INET6) {
- struct sockaddr_in6 *ipv6 =
- reinterpret_cast<struct sockaddr_in6 *>(p->ai_addr);
- ifindex = if_nametoindex(dtms_cb->ifname);
- ipv6->sin6_scope_id = ifindex;
- if (setsockopt(dtms_cb->dgram_sock_rcvr, IPPROTO_IPV6, IPV6_MULTICAST_IF,
- &ifindex, sizeof(ifindex)) < 0) {
- LOG_ER("DTM :setsockopt(IPV6_MULTICAST_IF) failed err :%s",
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- struct ipv6_mreq maddr;
- struct sockaddr_in6 *ipv6_mr =
- reinterpret_cast<struct sockaddr_in6 *>(p->ai_addr);
- memset(&maddr, 0, sizeof(maddr));
- maddr.ipv6mr_multiaddr = ipv6_mr->sin6_addr;
- maddr.ipv6mr_interface = if_nametoindex(dtms_cb->ifname);
- if (setsockopt(dtms_cb->dgram_sock_rcvr, IPPROTO_IPV6,
- IPV6_ADD_MEMBERSHIP, &maddr, sizeof(maddr)) < 0) {
- LOG_ER("DTM :setsockopt(IPV6_ADD_MEMBERSHIP) failed err :%s",
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
- }
- if (bind(dtms_cb->dgram_sock_rcvr, p->ai_addr, p->ai_addrlen) == -1) {
- LOG_ER("DTM:Socket bind failed err :%s", strerror(errno));
- close(dtms_cb->dgram_sock_rcvr);
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- perror("listener: bind");
- freeaddrinfo(addr_list);
- return NCSCC_RC_FAILURE;
- } else {
- binded = true;
- break;
- }
- }
-
- /* Free address structure(s) allocated by getaddrinfo() */
- freeaddrinfo(addr_list);
- if (binded != true) {
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- } else {
- TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
- return NCSCC_RC_SUCCESS;
- }
-}
-
-/**
- * Function for sending the bcast
- *
- * @param dtms_cb
- *
- * @return NCSCC_RC_SUCCESS
- * @return NCSCC_RC_FAILURE
- *
- */
-uint32_t dtm_dgram_bcast_sender(DTM_INTERNODE_CB *dtms_cb) {
- TRACE_ENTER();
-
- dtms_cb->dgram_sock_sndr = -1;
- bcast_sen_addr_size = 0;
- memset(&bcast_dest_storage, 0, sizeof(bcast_dest_storage));
-
- if (dtms_cb->i_addr_family == DTM_IP_ADDR_TYPE_IPV4) {
- /* Holder for bcast_dest_address address */
- uint32_t rc = 0;
- struct sockaddr_in *bcast_sender_addr_in =
- reinterpret_cast<struct sockaddr_in *>(&bcast_dest_storage);
- bcast_sender_addr_in->sin_family = AF_INET;
- bcast_sender_addr_in->sin_port = htons((dtms_cb->dgram_port_rcvr));
- TRACE("DTM: IP address : %s Bcast address : %s sa_family : %d ",
- dtms_cb->ip_addr, dtms_cb->bcast_addr, dtms_cb->i_addr_family);
- rc = inet_pton(AF_INET, dtms_cb->bcast_addr,
- &bcast_sender_addr_in->sin_addr);
- if (1 != rc) {
- LOG_ER("DTM : inet_pton failed");
- TRACE_LEAVE2("rc :%d", rc);
- return NCSCC_RC_FAILURE;
- }
-
- memset(bcast_sender_addr_in->sin_zero, '\0',
- sizeof bcast_sender_addr_in->sin_zero);
- bcast_sen_addr_size = sizeof(struct sockaddr_in);
- } else if (dtms_cb->i_addr_family == DTM_IP_ADDR_TYPE_IPV6) {
- /* Holder for bcast_dest_address address */
- struct sockaddr_in6 *bcast_sender_addr_in6 =
- reinterpret_cast<struct sockaddr_in6 *>(&bcast_dest_storage);
- bcast_sender_addr_in6->sin6_family = AF_INET6;
- bcast_sender_addr_in6->sin6_port = htons((dtms_cb->dgram_port_rcvr));
- bcast_sender_addr_in6->sin6_flowinfo = 0;
- bcast_sender_addr_in6->sin6_scope_id = if_nametoindex(dtms_cb->ifname);
- TRACE("DTM: IP address : %s Bcast address : %s sa_family : %d ",
- dtms_cb->ip_addr, dtms_cb->bcast_addr, dtms_cb->i_addr_family);
- inet_pton(AF_INET6, dtms_cb->bcast_addr,
&bcast_sender_addr_in6->sin6_addr);
- bcast_sen_addr_size = sizeof(struct sockaddr_in6);
- } else {
- LOG_ER("DTM : dgram_enable_bcast failed");
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- /* Create socket for sending/receiving datagrams */
- dtms_cb->dgram_sock_sndr =
- socket(bcast_dest_address->sa_family,
- SOCK_DGRAM | SOCK_NONBLOCK | SOCK_CLOEXEC, IPPROTO_UDP);
- if (dtms_cb->dgram_sock_sndr == SOCKET_ERROR()) {
- LOG_ER("DTM :socket create failederr :%s", strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- if (dgram_enable_bcast(dtms_cb->dgram_sock_sndr) != NCSCC_RC_SUCCESS) {
- LOG_ER("DTM : dgram_enable_bcast failed");
- dtm_sockdesc_close(dtms_cb->dgram_sock_sndr);
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- if (dtms_cb->i_addr_family == DTM_IP_ADDR_TYPE_IPV6) {
- struct sockaddr_in6 *bcast_sender_addr_in6 =
- reinterpret_cast<struct sockaddr_in6 *>(&bcast_dest_storage);
- int yes = 1;
- if (setsockopt(dtms_cb->dgram_sock_sndr, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
- &yes, sizeof yes) < 0) {
- LOG_ER("DTM :setsockopt(IPV6_MULTICAST_HOPS) failed err :%s",
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- if (setsockopt(dtms_cb->dgram_sock_sndr, SOL_SOCKET, SO_REUSEADDR, &yes,
- sizeof yes) < 0) {
- LOG_ER("DTM :setsockopt(SO_REUSEADDR) failed err :%s", strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- unsigned int ifindex;
- ifindex = if_nametoindex(dtms_cb->ifname);
- if (setsockopt(dtms_cb->dgram_sock_sndr, IPPROTO_IPV6, IPV6_MULTICAST_IF,
- &ifindex, sizeof(ifindex)) < 0) {
- LOG_ER("DTM :setsockopt(IPV6_MULTICAST_IF) failed err :%s ifname :%d",
- strerror(errno), if_nametoindex(dtms_cb->ifname));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
-
- struct ipv6_mreq maddr;
- memset(&maddr, 0, sizeof(maddr));
- maddr.ipv6mr_multiaddr = bcast_sender_addr_in6->sin6_addr;
- maddr.ipv6mr_interface = if_nametoindex(dtms_cb->ifname);
- if (setsockopt(dtms_cb->dgram_sock_sndr, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP,
- &maddr, sizeof maddr) < 0) {
- LOG_ER("DTM :setsockopt(IPV6_ADD_MEMBERSHIP) failed err :%s",
- strerror(errno));
- TRACE_LEAVE2("rc :%d", NCSCC_RC_FAILURE);
- return NCSCC_RC_FAILURE;
- }
- }
- TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
- return NCSCC_RC_SUCCESS;
-}
-
-/**
* Function for dtm connect process
*
* @param dtms_cb node_ip data len
@@ -1201,7 +518,7 @@ DTM_NODE_DB *dtm_process_connect(DTM_INTERNODE_CB
*dtms_cb, uint8_t *data,
node.cluster_id = ncs_decode_16bit(&buffer);
node.node_id = ncs_decode_32bit(&buffer);
if (dtms_cb->node_id == node.node_id) {
- if (dtms_cb->mcast_flag != true) {
+ if (dtms_cb->mcast_flag() != true) {
TRACE(
"DTM: received the self node_id bcast message, dropping message
cluster_id: %d node_id: %u",
node.cluster_id, node.node_id);
@@ -1228,7 +545,7 @@ DTM_NODE_DB *dtm_process_connect(DTM_INTERNODE_CB
*dtms_cb, uint8_t *data,
/* foreign_port = htons((in_port_t)(ncs_decode_16bit(&buffer))); */
foreign_port = ncs_decode_16bit(&buffer);
- node.i_addr_family = static_cast<DTM_IP_ADDR_TYPE>(ncs_decode_8bit(&buffer));
+ node.i_addr_family = static_cast<sa_family_t>(ncs_decode_8bit(&buffer));
memcpy(node.node_ip, buffer, INET6_ADDRSTRLEN);
if (initial_discovery_phase == true) {
@@ -1407,7 +724,7 @@ DTM_NODE_DB *dtm_process_accept(DTM_INTERNODE_CB *dtms_cb,
int stream_sock) {
continue;
} else {
memcpy(node.node_ip, addrBuffer, INET6_ADDRSTRLEN);
- node.i_addr_family =
static_cast<DTM_IP_ADDR_TYPE>(clnt_addr1->sa_family);
+ node.i_addr_family = clnt_addr1->sa_family;
}
node.cluster_id = dtms_cb->cluster_id;
@@ -1434,28 +751,3 @@ DTM_NODE_DB *dtm_process_accept(DTM_INTERNODE_CB
*dtms_cb, int stream_sock) {
TRACE_LEAVE2("DTM: new_conn_sd :%d", new_conn_sd);
return new_node;
}
-
-/**
- * Function to rcv the bcast message
- *
- * @param dtms_cb node_ip buffer buffer_len
- *
- * @return NCSCC_RC_SUCCESS
- * @return NCSCC_RC_FAILURE
- *
- */
-ssize_t dtm_dgram_recv_bmcast(DTM_INTERNODE_CB *dtms_cb, void *buffer,
- int buffer_len) {
- TRACE_ENTER();
-
- ssize_t rtn;
- do {
- rtn = recv(dtms_cb->dgram_sock_rcvr, buffer, buffer_len, MSG_DONTWAIT);
- } while (rtn < 0 && errno == EINTR);
- if (rtn < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
- LOG_ER("DTM:Receive failed (recv()) err :%s", strerror(errno));
- }
-
- TRACE_LEAVE2("rc :%zd", rtn);
- return rtn;
-}
diff --git a/src/dtm/dtmnd/dtm_read_config.cc b/src/dtm/dtmnd/dtm_read_config.cc
index 2ab8c6eb2..69f08b749 100644
--- a/src/dtm/dtmnd/dtm_read_config.cc
+++ b/src/dtm/dtmnd/dtm_read_config.cc
@@ -28,7 +28,6 @@
#include "base/ncs_main_papi.h"
#include "dtm/dtmnd/dtm.h"
#include "dtm/dtmnd/dtm_node.h"
-#include "dtm/dtmnd/dtm_socket.h"
#include "osaf/configmake.h"
char match_ip[INET6_ADDRSTRLEN];
@@ -84,7 +83,7 @@ void dtm_print_config(DTM_INTERNODE_CB *config) {
TRACE(" NODE_ID: ");
TRACE(" %d", config->node_id);
TRACE(" IP_ADDR: ");
- TRACE(" %s", config->ip_addr);
+ TRACE(" %s", config->ip_addr.c_str());
TRACE(" STREAM_PORT: ");
TRACE(" %u", config->stream_port);
TRACE(" DGRAM_PORT_SNDR: ");
@@ -92,7 +91,7 @@ void dtm_print_config(DTM_INTERNODE_CB *config) {
TRACE(" DGRAM_PORT_REV: ");
TRACE(" %u", config->dgram_port_rcvr);
TRACE(" MCAST_ADDR: ");
- TRACE(" %s", config->mcast_addr);
+ TRACE(" %s", config->mcast_addr.c_str());
TRACE(" NODE_NAME: ");
TRACE(" %s", config->node_name);
TRACE(" DTM_SKEEPALIVE: ");
@@ -121,13 +120,6 @@ void dtm_print_config(DTM_INTERNODE_CB *config) {
TRACE("DTM : ");
}
-bool in6_islinklocal(struct sockaddr_in6 *sin6) {
- if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
- return true;
- else
- return false;
-}
-
/**
* validate the ip address
*
@@ -160,10 +152,9 @@ char *dtm_validate_listening_ip_addr(DTM_INTERNODE_CB
*config) {
TRACE("IP addr : %s", inet_ntop(if_addr->ifa_addr->sa_family, tmp,
match_ip, sizeof(match_ip)));
- if (strcmp(match_ip, config->ip_addr) == 0) {
- config->i_addr_family =
- static_cast<DTM_IP_ADDR_TYPE>(if_addr->ifa_addr->sa_family);
- strncpy(config->ifname, if_addr->ifa_name, IFNAMSIZ);
+ if (strcmp(match_ip, config->ip_addr.c_str()) == 0) {
+ config->i_addr_family = if_addr->ifa_addr->sa_family;
+ config->ifname = std::string(if_addr->ifa_name);
// Bcast Address
if (if_addr->ifa_addr->sa_family == AF_INET) {
@@ -183,17 +174,18 @@ char *dtm_validate_listening_ip_addr(DTM_INTERNODE_CB
*config) {
broadaddr.s_addr == htonl(INADDR_ANY)) {
broadaddr.s_addr = addr.s_addr | ~netmask.s_addr;
}
- inet_ntop(if_addr->ifa_addr->sa_family, &broadaddr,
- config->bcast_addr, sizeof(config->bcast_addr));
+ char bcast_addr[INET6_ADDRSTRLEN];
+ inet_ntop(if_addr->ifa_addr->sa_family, &broadaddr, bcast_addr,
+ sizeof(bcast_addr));
+ config->bcast_addr = std::string(bcast_addr);
} else if (if_addr->ifa_addr->sa_family == AF_INET6) {
struct sockaddr_in6 *addr =
reinterpret_cast<struct sockaddr_in6 *>(if_addr->ifa_addr);
- memset(config->bcast_addr, 0, INET6_ADDRSTRLEN);
- if (in6_islinklocal(addr) == true) {
+ if (IN6_IS_ADDR_LINKLOCAL(&addr->sin6_addr)) {
config->scope_link = true;
- strcpy(config->bcast_addr, IN6ADDR_LINK_LOCAL);
+ config->bcast_addr = std::string(IN6ADDR_LINK_LOCAL);
} else {
- strcpy(config->bcast_addr, IN6ADDR_LINK_GLOBAL);
+ config->bcast_addr = std::string(IN6ADDR_LINK_GLOBAL);
}
TRACE("DTM: %s scope_link : %d IP address : %s sa_family : %d ",
if_addr->ifa_name, config->scope_link, match_ip,
@@ -201,7 +193,7 @@ char *dtm_validate_listening_ip_addr(DTM_INTERNODE_CB
*config) {
}
TRACE(
"DTM: %s Validate IP address : %s Bcast address : %s sa_family
: %d ",
- if_addr->ifa_name, match_ip, config->bcast_addr,
+ if_addr->ifa_name, match_ip, config->bcast_addr.c_str(),
config->i_addr_family);
freeifaddrs(if_addrs);
@@ -214,7 +206,8 @@ char *dtm_validate_listening_ip_addr(DTM_INTERNODE_CB
*config) {
} else {
TRACE("getifaddrs() failed with errno = %i %s", errno, strerror(errno));
}
- LOG_ER("DTM: Validation of IP address failed : %s ", config->ip_addr);
+ LOG_ER("DTM: Validation of IP address failed : %s ",
+ config->ip_addr.c_str());
return (nullptr);
}
@@ -249,13 +242,12 @@ int dtm_read_config(DTM_INTERNODE_CB *config, const char
*dtm_config_file) {
config->comm_keepalive_intvl = KEEPALIVE_INTVL;
config->comm_keepalive_probes = KEEPALIVE_PROBES;
config->comm_keepidle_time = USER_TIMEOUT;
- config->i_addr_family = DTM_IP_ADDR_TYPE_IPV4;
+ config->i_addr_family = AF_INET;
config->bcast_msg_freq = BCAST_FRE;
config->cont_bcast_int = CONT_BCAST_INT;
config->initial_dis_timeout = DIS_TIME_OUT;
config->sock_sndbuf_size = 0;
config->sock_rcvbuf_size = 0;
- config->mcast_flag = false;
config->scope_link = false;
config->node_id = m_NCS_GET_NODE_ID;
intranode_max_processes = 100;
@@ -327,9 +319,8 @@ int dtm_read_config(DTM_INTERNODE_CB *config, const char
*dtm_config_file) {
}
if (strncmp(line, "DTM_NODE_IP=", strlen("DTM_NODE_IP=")) == 0) {
tag_len = strlen("DTM_NODE_IP=");
- strncpy(config->ip_addr, &line[tag_len],
- INET6_ADDRSTRLEN - 1); /* ipv4 ipv6 addrBuffer */
- if (strlen(config->ip_addr) == 0) {
+ config->ip_addr = std::string(&line[tag_len]);
+ if (config->ip_addr.empty()) {
LOG_ER("DTM:ip_addr Shouldn't be empty");
fclose(dtm_conf_file);
return -1;
@@ -341,12 +332,7 @@ int dtm_read_config(DTM_INTERNODE_CB *config, const char
*dtm_config_file) {
if (strncmp(line, "DTM_MCAST_ADDR=", strlen("DTM_MCAST_ADDR=")) == 0) {
tag_len = strlen("DTM_MCAST_ADDR=");
- strncpy(config->mcast_addr, &line[tag_len],
- INET6_ADDRSTRLEN - 1); /* ipv4 ipv6 addrBuffer */
- if (strlen(config->mcast_addr) != 0) {
- config->mcast_flag = true;
- }
-
+ config->mcast_addr = std::string(&line[tag_len]);
tag = 0;
tag_len = 0;
}
@@ -574,7 +560,7 @@ int dtm_read_config(DTM_INTERNODE_CB *config, const char
*dtm_config_file) {
} else if ((config->stream_port) == 0) {
LOG_ER("DTM: dtm_read_config: stream_port is missing in conf file");
fieldmissing = 1;
- } else if (strlen(config->ip_addr) == 0) {
+ } else if (config->ip_addr.empty()) {
LOG_ER("DTM: dtm_read_config: ip_addr is missing in conf file");
fieldmissing = 1;
} else if (strlen(config->node_name) == 0) {
diff --git a/src/dtm/dtmnd/dtm_socket.h b/src/dtm/dtmnd/dtm_socket.h
deleted file mode 100644
index aa8d62b7f..000000000
--- a/src/dtm/dtmnd/dtm_socket.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* -*- OpenSAF -*-
- *
- * (C) Copyright 2010 The OpenSAF Foundation
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
- * under the GNU Lesser General Public License Version 2.1, February 1999.
- * The complete license can be accessed from the following location:
- * http://opensource.org/licenses/lgpl-license.php
- * See the Copying file included with the OpenSAF distribution for full
- * licensing terms.z
- *
- * Author(s): GoAhead Software
- *
- */
-
-#ifndef DTM_DTMND_DTM_SOCKET_H_
-#define DTM_DTMND_DTM_SOCKET_H_
-
-#include <cerrno>
-
-#define SOCKET_ERROR() -1
-#define SDDR_IN_USE (errno == EADDRINUSE)
-#define IS_CONNECTED(a) 0
-#define SOCKET_RESET(a) ((a == EPIPE) || (a == ECONNRESET))
-
-#endif // DTM_DTMND_DTM_SOCKET_H_
--
2.13.3
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel