osaf/services/infrastructure/dtms/dtm/dtm_read_config.c |  36 +++++++++++++++-
 1 files changed, 32 insertions(+), 4 deletions(-)


The IPv4 broadcast address is sometimes not configured when running in some
container environments (e.g. docker). In these cases, derive the broadcast
address from the IPv4 address and netmask.

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
@@ -15,10 +15,15 @@
  *
  */
 
+#include <arpa/inet.h>
+#include <ifaddrs.h>
+#include <inttypes.h>
 #include <net/if.h>
-#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <sys/socket.h>
 #include <configmake.h>
-#include <ifaddrs.h>
+#include "logtrace.h"
 #include "ncs_main_papi.h"
 #include "dtm.h"
 #include "dtm_socket.h"
@@ -162,8 +167,31 @@ 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;
-                                       inet_ntop(if_addr->ifa_addr->sa_family, 
tmp, config->bcast_addr,sizeof(buf));
+                                       struct in_addr addr =
+                                               ((struct sockaddr_in*) if_addr->
+                                                ifa_addr)->sin_addr;
+                                       struct in_addr netmask =
+                                               ((struct sockaddr_in*) if_addr->
+                                                ifa_netmask)->sin_addr;
+                                       struct in_addr broadaddr =
+                                               ((struct sockaddr_in*) if_addr->
+                                                ifa_broadaddr)->sin_addr;
+                                       TRACE("DTM: addr=0x%" PRIx32,
+                                             ntohl(addr.s_addr));
+                                       TRACE("DTM: netmask=0x%" PRIx32,
+                                             ntohl(netmask.s_addr));
+                                       TRACE("DTM: broadaddr=0x%" PRIx32,
+                                             ntohl(broadaddr.s_addr));
+                                       if (broadaddr.s_addr == addr.s_addr ||
+                                           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(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);

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to