osaf/services/infrastructure/dtms/config/dtmd.conf         |  12 ++++
 osaf/services/infrastructure/dtms/dtm/dtm_intra.c          |  23 ++++----
 osaf/services/infrastructure/dtms/dtm/dtm_node_sockets.c   |  24 ++++-----
 osaf/services/infrastructure/dtms/dtm/dtm_read_config.c    |  34 ++++++++++++++
 osaf/services/infrastructure/dtms/include/dtm.h            |   2 +
 osaf/services/infrastructure/dtms/include/dtm_cb.h         |   4 +
 osaf/services/infrastructure/dtms/include/dtm_intra_disc.h |   2 -
 7 files changed, 75 insertions(+), 26 deletions(-)


DTM to match the new fragment size  ~65479 (MDS_DIRECT_BUF_MAXSIZE),
removed hard-coded 64000 SO_RCVBUF/SO_SNDBUF socket values, now by default 
setsockopt() is not set
so that socket can use system wide tuning the standard way using sysctl 
(wmem_default/rmem_default).
In case of system wide tuning sysctl has less values than 
MDS_DIRECT_BUF_MAXSIZE size ,
the default value of 65536 (new fragment size) set using  setsockopt().

An configuration variable is  provided in dtmd.conf to set rcvbuf and sndbuf to 
higher value
where user don't want change system wide wmem_default/rmem_default ( to all 
application on that system),
and exclusively give higher  SO_RCVBUF/SO_SNDBUF  Opensaf Middleware by 
increaseing rmem_max/wmem_max
values using sysctl.

diff --git a/osaf/services/infrastructure/dtms/config/dtmd.conf 
b/osaf/services/infrastructure/dtms/config/dtmd.conf
--- a/osaf/services/infrastructure/dtms/config/dtmd.conf
+++ b/osaf/services/infrastructure/dtms/config/dtmd.conf
@@ -72,4 +72,16 @@ DTM_TCP_KEEPALIVE_INTVL=1
 # Optional
 DTM_TCP_KEEPALIVE_PROBES=2
 
+#
+#Used to Set the dtm internode & intranode  socket SO_SNDBUF/SO_RCVBUF buffer 
in bytes.
+#The kernel doubles this value (to allow space for bookkeeping over-head)
+#when it is set using setsockopt(),and this doubled value is returned  by
+#getsockopt(). The default value is set by the rmem_default/wmem_default
+#sysctl and the maximum allowed value is set by the rmem_max/wmem_max sysctl.
+#
+# IMP NOTE : If DTM_SOCK_SND_RCV_BUF_SIZE  is configured according to 
application requirements ,
+#it is also mandatory to  export `MDS_SOCK_SND_RCV_BUF_SIZE=` with  the same 
value of
+#for example if set as DTM_SOCK_SND_RCV_BUF_SIZE=126976 need to do :
+#export MDS_SOCK_SND_RCV_BUF_SIZE=126976 
+DTM_SOCK_SND_RCV_BUF_SIZE=65536
 
diff --git a/osaf/services/infrastructure/dtms/dtm/dtm_intra.c 
b/osaf/services/infrastructure/dtms/dtm/dtm_intra.c
--- a/osaf/services/infrastructure/dtms/dtm/dtm_intra.c
+++ b/osaf/services/infrastructure/dtms/dtm/dtm_intra.c
@@ -42,7 +42,6 @@ DTM_INTRANODE_CB *dtm_intranode_cb = NUL
 
 #define DTM_INTRANODE_MAX_PROCESSES   100
 #define DTM_INTRANODE_POLL_TIMEOUT 20000
-#define DTM_RECV_BUFFER_SIZE 1500
 #define DTM_INTRANODE_TASKNAME  "DTM_INTRANODE"
 #define DTM_INTRANODE_STACKSIZE  NCS_STACKSIZE_HUGE
 
@@ -58,7 +57,7 @@ static struct pollfd pfd_list[DTM_INTRAN
 
 static int  dtm_intranode_max_fd;
 
-static uint32_t dtm_intra_processing_init(char *node_ip, DTM_IP_ADDR_TYPE 
i_addr_family);
+static uint32_t dtm_intra_processing_init(char *node_ip, DTM_IP_ADDR_TYPE 
i_addr_family, int32_t sndbuf_size, int32_t rcvbuf_size);
 static void dtm_intranode_processing(void);
 static uint32_t dtm_intranode_add_poll_fdlist(int fd, uint16_t event);
 static uint32_t dtm_intranode_create_rcv_task(int task_hdl);
@@ -79,10 +78,9 @@ 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->ip_addr, 
dtms_cb->i_addr_family);
+       return dtm_intra_processing_init(dtms_cb->ip_addr, 
dtms_cb->i_addr_family, dtms_cb->sock_sndbuf_size,dtms_cb->sock_rcvbuf_size);
 }
 
-#define DTM_INTRANODE_SOCK_SIZE 64000
 
 /**
  * Function to init the intranode processing
@@ -92,10 +90,10 @@ uint32_t dtm_service_discovery_init(DTM_
  * @return NCSCC_RC_FAILURE
  *
  */
-uint32_t dtm_intra_processing_init(char *node_ip, DTM_IP_ADDR_TYPE 
i_addr_family)
+uint32_t dtm_intra_processing_init(char *node_ip, DTM_IP_ADDR_TYPE 
i_addr_family, int32_t sndbuf_size, int32_t rcvbuf_size)
 {
 
-       int servlen, size = DTM_INTRANODE_SOCK_SIZE;    /* For socket fd and 
server len */
+       int servlen;    /* For socket fd and server len */
        struct sockaddr_un serv_addr;   /* For Unix Sock address */
        char server_ux_name[255];
        NCS_PATRICIA_PARAMS pat_tree_params;
@@ -112,6 +110,8 @@ uint32_t dtm_intra_processing_init(char 
                return NCSCC_RC_FAILURE;
        }
        dtm_intranode_cb->sock_domain = dtm_socket_domain;
+       dtm_intranode_cb->sock_sndbuf_size = sndbuf_size;
+       dtm_intranode_cb->sock_rcvbuf_size = rcvbuf_size;
 
        /* Open a socket, If socket opens to fail return Error */
        dtm_intranode_cb->server_sockfd = socket(dtm_socket_domain, 
SOCK_STREAM, 0);
@@ -137,13 +137,13 @@ uint32_t dtm_intra_processing_init(char 
        }
 
        /* Increase the socket buffer size */
-       if (setsockopt(dtm_intranode_cb->server_sockfd, SOL_SOCKET, SO_RCVBUF, 
&size, sizeof(size)) != 0) {
+       if ((rcvbuf_size > 0) && (setsockopt(dtm_intranode_cb->server_sockfd, 
SOL_SOCKET, SO_RCVBUF, &rcvbuf_size, sizeof(rcvbuf_size)) != 0)) {
                LOG_ER("DTM: Unable to set the SO_RCVBUF err :%s ", 
strerror(errno)); 
                close(dtm_intranode_cb->server_sockfd);
                free(dtm_intranode_cb);
                return NCSCC_RC_FAILURE;
        }
-       if (setsockopt(dtm_intranode_cb->server_sockfd, SOL_SOCKET, SO_SNDBUF, 
&size, sizeof(size)) != 0) {
+       if ((sndbuf_size > 0) && (setsockopt(dtm_intranode_cb->server_sockfd, 
SOL_SOCKET, SO_SNDBUF, &sndbuf_size, sizeof(sndbuf_size)) != 0)) {
                LOG_ER("DTM: Unable to set the SO_SNDBUF err :%s ", 
strerror(errno));
                close(dtm_intranode_cb->server_sockfd);
                free(dtm_intranode_cb);
@@ -894,7 +894,8 @@ static uint32_t dtm_intranode_process_in
 {
         int flags;
        /* Accept processing */
-       int accept_fd = 0,  retry_count = 0, size = DTM_INTRANODE_SOCK_SIZE;
+       int accept_fd = 0,  retry_count = 0;
+       int sndbuf_size = dtm_intranode_cb->sock_sndbuf_size, rcvbuf_size = 
dtm_intranode_cb->sock_rcvbuf_size;
        socklen_t len = sizeof(struct sockaddr_un);
        struct sockaddr_un cli_addr;
        /* Accept should be non_block */
@@ -924,12 +925,12 @@ tryagain:
                        goto tryagain;
                }
        }
-       if (setsockopt(accept_fd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size)) 
!= 0) {
+       if ((rcvbuf_size > 0) && (setsockopt(accept_fd, SOL_SOCKET, SO_RCVBUF, 
&rcvbuf_size, sizeof(rcvbuf_size)) != 0)) {
                LOG_ER("DTM: Unable to set the SO_RCVBUF ");
                close(accept_fd);
                return NCSCC_RC_FAILURE;
        }
-       if (setsockopt(accept_fd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size)) 
!= 0) {
+       if ((sndbuf_size > 0) &&  (setsockopt(accept_fd, SOL_SOCKET, SO_SNDBUF, 
&sndbuf_size, sizeof(sndbuf_size)) != 0)) {
                LOG_ER("DTM: Unable to set the SO_SNDBUF ");
                close(accept_fd);
                return NCSCC_RC_FAILURE;
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
@@ -26,7 +26,6 @@
 
 #define MYPORT "6900"
 #define MAXBUFLEN 100
-#define DTM_INTERNODE_SOCK_SIZE 64000
 
 struct addrinfo *mcast_sender_addr;    /* Holder for mcast_sender_addr address 
*/
 
@@ -431,7 +430,7 @@ uint32_t dtm_comm_socket_send(int sock_d
        int rtn = 0;
        int err = 0;
        int rc = NCSCC_RC_SUCCESS;
-       rtn = send(sock_desc, (raw_type *) buffer, buffer_len, 0);
+       rtn = send(sock_desc, (raw_type *) buffer, buffer_len, MSG_NOSIGNAL);
        err = errno;
        if (rtn < 0) {
                if (!IS_BLOCKIN_ERROR(err)) {
@@ -508,7 +507,7 @@ static char *comm_get_foreign_address(in
 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)
 {
-       int sock_desc = -1, size = DTM_INTERNODE_SOCK_SIZE;
+       int sock_desc = -1, sndbuf_size = dtms_cb->sock_sndbuf_size, 
rcvbuf_size = dtms_cb->sock_rcvbuf_size;
        int err = 0, rv;
        char local_port_str[INET6_ADDRSTRLEN];
        struct addrinfo *addr_list;
@@ -565,14 +564,14 @@ int comm_socket_setup_new(DTM_INTERNODE_
                dtm_comm_socket_close(&sock_desc);
                goto done;
        }
-
-       if (setsockopt(sock_desc, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size)) 
!= 0) {
+       
+       if ((rcvbuf_size > 0) && (setsockopt(sock_desc, SOL_SOCKET, SO_RCVBUF, 
&rcvbuf_size, sizeof(rcvbuf_size)) != 0)) {
                LOG_ER("DTM:Socket rcv buf size set failed err :%s", 
strerror(errno));
                dtm_comm_socket_close(&sock_desc);
                goto done;
        }
 
-       if (setsockopt(sock_desc, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size)) 
!= 0) {
+       if ((sndbuf_size > 0) && (setsockopt(sock_desc, SOL_SOCKET, SO_SNDBUF, 
&sndbuf_size, sizeof(sndbuf_size)) != 0)) {
                LOG_ER("DTM:Socket snd buf size set failed err :%s", 
strerror(errno));
                dtm_comm_socket_close(&sock_desc);
                goto done;
@@ -660,7 +659,7 @@ uint32_t dtm_stream_nonblocking_listener
        struct addrinfo addr_criteria;  /* Criteria for address match */
        char local_port_str[6];
        struct addrinfo *addr_list = NULL, *p;; /* List of serv addresses */
-       int size = DTM_INTERNODE_SOCK_SIZE;
+       int sndbuf_size = dtms_cb->sock_sndbuf_size, rcvbuf_size = 
dtms_cb->sock_rcvbuf_size; 
        int rv;
        char ip_addr_eth[INET6_ADDRSTRLEN + IFNAMSIZ];
        dtms_cb->stream_sock = -1;
@@ -720,11 +719,11 @@ uint32_t dtm_stream_nonblocking_listener
                return NCSCC_RC_FAILURE;
        }
 
-       if (setsockopt(dtms_cb->stream_sock, SOL_SOCKET, SO_RCVBUF, &size, 
sizeof(size)) != 0) {
+       if ((rcvbuf_size > 0) && (setsockopt(dtms_cb->stream_sock, SOL_SOCKET, 
SO_RCVBUF, &rcvbuf_size, sizeof(rcvbuf_size)) != 0)) {
                LOG_ER("DTM:Socket rcv buf size set failed err :%s", 
strerror(errno));
        }
 
-       if (setsockopt(dtms_cb->stream_sock, SOL_SOCKET, SO_SNDBUF, &size, 
sizeof(size)) != 0) {
+       if ((sndbuf_size > 0) && (setsockopt(dtms_cb->stream_sock, SOL_SOCKET, 
SO_SNDBUF, &sndbuf_size, sizeof(sndbuf_size)) != 0)) {
                LOG_ER("DTM:Socket snd buf size set failed err :%s", 
strerror(errno));
        }
 
@@ -1249,7 +1248,6 @@ int dtm_process_connect(DTM_INTERNODE_CB
 
 }
 
-#define DTM_INTERNODE_SOCK_SIZE 64000
 
 /**
  * Function for dtm accept the connection
@@ -1270,7 +1268,7 @@ int dtm_process_accept(DTM_INTERNODE_CB 
        int err = 0;
        DTM_NODE_DB node;
        DTM_NODE_DB *new_node;
-       int new_conn_sd, size = DTM_INTERNODE_SOCK_SIZE;
+       int new_conn_sd, sndbuf_size = dtms_cb->sock_sndbuf_size, rcvbuf_size = 
dtms_cb->sock_rcvbuf_size;
        const struct sockaddr *clnt_addr1 = (struct sockaddr *)&clnt_addr;
        TRACE_ENTER();
 
@@ -1287,12 +1285,12 @@ int dtm_process_accept(DTM_INTERNODE_CB 
 
        }
 
-       if (setsockopt(new_conn_sd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size)) 
!= 0) {
+       if ((rcvbuf_size > 0) && (setsockopt(new_conn_sd, SOL_SOCKET, 
SO_RCVBUF, &rcvbuf_size, sizeof(rcvbuf_size)) != 0)) {
                LOG_ER("DTM: Unable to set the SO_RCVBUF ");
                dtm_comm_socket_close(&new_conn_sd);
                goto done;
        }
-       if (setsockopt(new_conn_sd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size)) 
!= 0) {
+       if ((sndbuf_size > 0) && (setsockopt(new_conn_sd, SOL_SOCKET, 
SO_SNDBUF, &sndbuf_size, sizeof(sndbuf_size)) != 0)) {
                LOG_ER("DTM: Unable to set the SO_SNDBUF ");
                dtm_comm_socket_close(&new_conn_sd);
                goto done;
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
@@ -94,6 +94,11 @@ void dtm_print_config(DTM_INTERNODE_CB *
        TRACE("  %d", config->initial_dis_timeout);
        TRACE("  DTM_BCAST_FRE_MSECS: ");
        TRACE("  %d", config->bcast_msg_freq);
+       TRACE("  DTM_SOCK_SND_BUF_SIZE: ");
+       TRACE("  %d", config->sock_sndbuf_size);
+       TRACE("  DTM_SOCK_RCV_BUF_SIZE: ");
+       TRACE("  %d", config->sock_rcvbuf_size);
+
        TRACE("DTM : ");
 }
 
@@ -220,6 +225,8 @@ int dtm_read_config(DTM_INTERNODE_CB * c
        config->i_addr_family = DTM_IP_ADDR_TYPE_IPV4;
        config->bcast_msg_freq = BCAST_FRE;
        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;
@@ -424,6 +431,33 @@ int dtm_read_config(DTM_INTERNODE_CB * c
                                tag_len = 0;
 
                        }
+                       if (strncmp(line, "DTM_SOCK_SND_RCV_BUF_SIZE=", 
strlen("DTM_SOCK_SND_RCV_BUF_SIZE=")) == 0) {
+                               tag_len = strlen("DTM_SOCK_SND_RCV_BUF_SIZE=");
+                               uint32_t sndbuf_size = 0; /* Send buffer size */
+                               uint32_t rcvbuf_size = 0;  /* Receive buffer 
size */
+                               socklen_t optlen; /* Option length */
+                               int sockfd;
+                               sockfd = socket(AF_INET, SOCK_STREAM, 0);
+                               optlen = sizeof(rcvbuf_size);
+                               getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, 
&rcvbuf_size, &optlen);
+                               if ((rcvbuf_size < DTM_SOCK_SND_RCV_BUF_SIZE) 
&& (atoi(&line[tag_len]) < DTM_SOCK_SND_RCV_BUF_SIZE)) {
+                                       config->sock_rcvbuf_size = 
DTM_SOCK_SND_RCV_BUF_SIZE;
+                               } else if (atoi(&line[tag_len]) > rcvbuf_size) {
+                                       config->sock_rcvbuf_size = 
atoi(&line[tag_len]);
+                               }  
+
+                               optlen = sizeof(sndbuf_size);
+                               getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, 
&sndbuf_size, &optlen);
+                               if ((sndbuf_size < DTM_SOCK_SND_RCV_BUF_SIZE) 
&& (atoi(&line[tag_len]) < DTM_SOCK_SND_RCV_BUF_SIZE)){
+                                       config->sock_sndbuf_size = 
DTM_SOCK_SND_RCV_BUF_SIZE;
+                               } else if (atoi(&line[tag_len]) > sndbuf_size) {
+                                       config->sock_sndbuf_size = 
atoi(&line[tag_len]);
+                               }  
+
+                               tag = 0;
+                               tag_len = 0;
+                       }
+
                }
 
                memset(line, 0, DTM_MAX_TAG_LEN);
diff --git a/osaf/services/infrastructure/dtms/include/dtm.h 
b/osaf/services/infrastructure/dtms/include/dtm.h
--- a/osaf/services/infrastructure/dtms/include/dtm.h
+++ b/osaf/services/infrastructure/dtms/include/dtm.h
@@ -37,6 +37,8 @@ extern uint8_t initial_discovery_phase;
 #define m_NODE_DISCOVERY_TASKNAME       "NODE_DISCOVERY"
 #define m_NODE_DISCOVERY_STACKSIZE       NCS_STACKSIZE_HUGE
 
+/* The default value of SO_RCVBUF & SO_SNDBUF , it is set by the 
rmem_default/wmem_default  */
+#define DTM_SOCK_SND_RCV_BUF_SIZE 65536 
 #define DTM_MAX_TAG_LEN        256
 
 typedef enum {
diff --git a/osaf/services/infrastructure/dtms/include/dtm_cb.h 
b/osaf/services/infrastructure/dtms/include/dtm_cb.h
--- a/osaf/services/infrastructure/dtms/include/dtm_cb.h
+++ b/osaf/services/infrastructure/dtms/include/dtm_cb.h
@@ -90,6 +90,8 @@ typedef struct dtm_internode_cb {
        int comm_keepidle_time;
        int comm_keepalive_intvl;
        int comm_keepalive_probes;
+       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;
 } DTM_INTERNODE_CB;
@@ -116,6 +118,8 @@ typedef struct dtm_intranode_cb {
        SYSF_MBX mbx;
        int mbx_fd;
        int sock_domain;
+       int32_t sock_sndbuf_size; /* The value of SO_SNDBUF */
+       int32_t sock_rcvbuf_size; /* The value of SO_RCVBUF*/
 } DTM_INTRANODE_CB;
 
 extern DTM_INTRANODE_CB *dtm_intranode_cb;
diff --git a/osaf/services/infrastructure/dtms/include/dtm_intra_disc.h 
b/osaf/services/infrastructure/dtms/include/dtm_intra_disc.h
--- a/osaf/services/infrastructure/dtms/include/dtm_intra_disc.h
+++ b/osaf/services/infrastructure/dtms/include/dtm_intra_disc.h
@@ -17,8 +17,6 @@
 #ifndef DTM_INTRA_DISC_H
 #define DTM_INTRA_DISC_H
 
-#define DTM_INTRANODE_MSG_SIZE      1400
-#define DTM_INTERNODE_MSG_SIZE      DTM_INTRANODE_MSG_SIZE
 
 /* 2 -len(0), 4 - iden(2), 1- ver(6), 1-msg type(7), 4- server_type (8),
                        4 -server lower(12), 4 -server lower(16), 8 -ref(20), 4 
- nodeid(28),

------------------------------------------------------------------------------
"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