osaf/services/infrastructure/dtms/dtm/dtm_node_sockets.c |  91 +++++++++++++--
 osaf/services/infrastructure/dtms/dtm/dtm_read_config.c  |  19 +-
 2 files changed, 86 insertions(+), 24 deletions(-)


The current dtm discovery broadcast listener  is getting binded  to  ANY_ADDR  
( IPv4 0.0.0.0   & Ipv6  :: )
and the sender is sending on  IPv4 sub-net  or IPv6 link-local multicast 
address ( ff02::1 )

>From Now :

Based on the dtm.conf  IPv4  address configuration  the discovery broadcast 
messages listener
will bind to the dtmd.conf configured sub-net broadcast  address say  
192.168.56.255 and
the sender will send on that specific broadcast  address only  say  
192.168.56.255,
so the discovery broadcast messages is not visible to any other sub-net.

Based on the dtm.conf  IPv46 address Scope:Link Local or Scope:Global 
configuration  the
discovery broadcast messages listener will bind to the dtmd.conf configured 
multicast  address say  ff02::1  link-local  or
ff0e::1 for link-global  the sender will send on that specific multicast   
address only  say  ff02::1  link-local  or
ff0e::1 for link-globa , so the discovery broadcast messages is not visible to 
any other  multicast   address.

diff --git a/osaf/services/infrastructure/dtms/dtm/dtm_node_sockets.c 
b/osaf/services/infrastructure/dtms/dtm/dtm_node_sockets.c
--- a/osaf/services/infrastructure/dtms/dtm/dtm_node_sockets.c
+++ b/osaf/services/infrastructure/dtms/dtm/dtm_node_sockets.c
@@ -530,7 +530,7 @@ int comm_socket_setup_new(DTM_INTERNODE_
        /* 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) {
-               memset(foreign_address_eth, 0, INET6_ADDRSTRLEN);
+               memset(foreign_address_eth, 0, (INET6_ADDRSTRLEN + IFNAMSIZ));
                sprintf(foreign_address_eth,"%s%s%s", foreign_address, "%", 
dtms_cb->ifname);
                rv = getaddrinfo(foreign_address_eth, local_port_str, 
&addr_criteria, &addr_list);
                TRACE("DTM:foreign_address_eth : %s local_port_str :%s", 
foreign_address_eth, local_port_str);
@@ -680,7 +680,7 @@ uint32_t dtm_stream_nonblocking_listener
        /* 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) {
-               memset(ip_addr_eth, 0, INET6_ADDRSTRLEN);
+               memset(ip_addr_eth, 0, (INET6_ADDRSTRLEN + IFNAMSIZ));
                sprintf(ip_addr_eth,"%s%s%s", dtms_cb->ip_addr, "%", 
dtms_cb->ifname);
                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);
@@ -790,7 +790,7 @@ uint32_t dtm_dgram_mcast_listener(DTM_IN
        /* 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) {
-               memset(mcast_addr_eth, 0, INET6_ADDRSTRLEN);
+               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);
@@ -882,7 +882,7 @@ uint32_t dtm_dgram_mcast_sender(DTM_INTE
        /* 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) {
-               memset(mcast_addr_eth, 0, INET6_ADDRSTRLEN);
+               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);
@@ -963,6 +963,7 @@ uint32_t dtm_dgram_bcast_listener(DTM_IN
        struct addrinfo addr_criteria, *addr_list, *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);
@@ -978,14 +979,28 @@ uint32_t dtm_dgram_bcast_listener(DTM_IN
        addr_criteria.ai_flags |= AI_NUMERICHOST;
 
        TRACE("DTM :ip_addr : %s local_port_str :%s", dtms_cb->ip_addr, 
local_port_str);
-
-       /* FIX ME */
-       /*if ((rv = getaddrinfo(dtms_cb->ip_addr, local_port_str, 
&addr_criteria, &addr_list)) != 0)  */
-       if ((rv = getaddrinfo(NULL, local_port_str, &addr_criteria, 
&addr_list)) != 0) {
+       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 == NULL) {
@@ -996,6 +1011,7 @@ uint32_t dtm_dgram_bcast_listener(DTM_IN
 
        /* results and bind to the first we can */
        p = addr_list;
+       bool binded = false;
 
        for (; p; p = p->ai_next) {
 
@@ -1004,20 +1020,49 @@ uint32_t dtm_dgram_bcast_listener(DTM_IN
                        continue;
                }
 
+               if (p->ai_family == AF_INET) {
+                       void *addr;
+                       char ipstr[INET6_ADDRSTRLEN];
+                       struct sockaddr_in *ipv4 = (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 = (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, 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, (void *)&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 (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;
                }
 
@@ -1025,9 +1070,14 @@ uint32_t dtm_dgram_bcast_listener(DTM_IN
 
        /* 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;
+       }
 }
 
 /**
@@ -1042,7 +1092,6 @@ uint32_t dtm_dgram_bcast_listener(DTM_IN
 uint32_t dtm_dgram_bcast_sender(DTM_INTERNODE_CB * dtms_cb)
 {
 
-       const char *IN6ADDR_ALLNODES = "FF02::1";       /* v6 addr not built in 
*/
        TRACE_ENTER();
 
        dtms_cb->dgram_sock_sndr = -1;
@@ -1056,6 +1105,8 @@ uint32_t dtm_dgram_bcast_sender(DTM_INTE
                struct sockaddr_in *bcast_sender_addr_in = (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");
@@ -1072,7 +1123,11 @@ uint32_t dtm_dgram_bcast_sender(DTM_INTE
                struct sockaddr_in6 *bcast_sender_addr_in6 = (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));
-               inet_pton(AF_INET6, IN6ADDR_ALLNODES, 
&bcast_sender_addr_in6->sin6_addr);
+               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 {
@@ -1096,6 +1151,16 @@ uint32_t dtm_dgram_bcast_sender(DTM_INTE
                return NCSCC_RC_FAILURE;
        }
 
+       if (dtms_cb->i_addr_family == DTM_IP_ADDR_TYPE_IPV6) {
+               struct sockaddr_in6 *bcast_sender_addr_in6 = (struct 
sockaddr_in6 *)&bcast_dest_storage;
+               int yes = 1;
+               setsockopt(dtms_cb->dgram_sock_sndr, SOL_IPV6, 
IPV6_MULTICAST_HOPS, &yes, sizeof yes);
+               setsockopt(dtms_cb->dgram_sock_sndr, SOL_SOCKET, SO_REUSEADDR, 
&yes, sizeof yes);
+               struct ipv6_mreq maddr;
+               maddr.ipv6mr_multiaddr = bcast_sender_addr_in6->sin6_addr;
+               maddr.ipv6mr_interface = 0;
+               setsockopt (dtms_cb->dgram_sock_sndr, SOL_IPV6, 
IPV6_ADD_MEMBERSHIP, &maddr, sizeof maddr);
+       }
        TRACE_LEAVE2("rc :%d", NCSCC_RC_SUCCESS);
        return NCSCC_RC_SUCCESS;
 }
diff --git a/osaf/services/infrastructure/dtms/dtm/dtm_read_config.c 
b/osaf/services/infrastructure/dtms/dtm/dtm_read_config.c
--- a/osaf/services/infrastructure/dtms/dtm/dtm_read_config.c
+++ b/osaf/services/infrastructure/dtms/dtm/dtm_read_config.c
@@ -34,6 +34,8 @@ char match_ip[INET6_ADDRSTRLEN];
 #define DIS_TIME_OUT 5
 #define BCAST_FRE 250
 
+const char *IN6ADDR_LINK_LOCAL = "ff02::1";       /* IPv6, Scope:Link 
multicast address */ 
+const char *IN6ADDR_LINK_GLOBAL = "ff0e::1";      /* IPv6, Scope:Global 
multicast address */
 /* These are the numerical values of the tags found in the dtmd.conf */
 /* configuration file.                                               */
 typedef enum dtm_config_tags {
@@ -149,23 +151,18 @@ char *dtm_validate_listening_ip_addr(DTM
                                //Bcast  Address
                                if (if_addr->ifa_addr->sa_family == AF_INET) {
                                        tmp = &((struct sockaddr_in 
*)if_addr->ifa_broadaddr)->sin_addr;
-                                       TRACE("Bcast addr : %s",
-                                                       
inet_ntop(if_addr->ifa_addr->sa_family,
-                                                               tmp,
-                                                               
config->bcast_addr,
-                                                               sizeof(buf)));
+                                       inet_ntop(if_addr->ifa_addr->sa_family, 
tmp, config->bcast_addr,sizeof(buf));
                                } else if (if_addr->ifa_addr->sa_family == 
AF_INET6) {
                                        struct sockaddr_in6 *addr = (struct 
sockaddr_in6 *)if_addr->ifa_addr;
+                                       memset(config->bcast_addr, 0, 
INET6_ADDRSTRLEN);
                                        if (in6_islinklocal(addr) == true ) {
                                                config->scope_link = true;      
+                                               strcpy(config->bcast_addr, 
IN6ADDR_LINK_LOCAL);
+                                       } else {
+                                               strcpy(config->bcast_addr, 
IN6ADDR_LINK_GLOBAL);
+                                       }                       
                                                TRACE ("DTM:  %s scope_link : 
%d    IP address : %s  sa_family : %d ",
                                                                
if_addr->ifa_name, config->scope_link, match_ip, config->i_addr_family);
-                                       }                       
-                                       TRACE("Bcast addr : %s",
-                                                       
inet_ntop(if_addr->ifa_addr->sa_family,
-                                                               addr,
-                                                               
config->bcast_addr,
-                                                               sizeof(buf)));
 
                                }
                                TRACE ("DTM:  %s Validate  IP address : %s  
Bcast address : %s sa_family : %d ",

------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to