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

Reply via email to